dmux 2.2.1 → 3.0.1

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 (201) hide show
  1. package/dist/DmuxApp.d.ts.map +1 -1
  2. package/dist/DmuxApp.js +433 -179
  3. package/dist/DmuxApp.js.map +1 -1
  4. package/dist/MergePane.d.ts.map +1 -1
  5. package/dist/MergePane.js +4 -6
  6. package/dist/MergePane.js.map +1 -1
  7. package/dist/PaneAnalyzer.d.ts +45 -0
  8. package/dist/PaneAnalyzer.d.ts.map +1 -0
  9. package/dist/PaneAnalyzer.js +278 -0
  10. package/dist/PaneAnalyzer.js.map +1 -0
  11. package/dist/_plugin-vue_export-helper.css +1 -0
  12. package/dist/actions/index.d.ts +19 -0
  13. package/dist/actions/index.d.ts.map +1 -0
  14. package/dist/actions/index.js +54 -0
  15. package/dist/actions/index.js.map +1 -0
  16. package/dist/actions/paneActions.d.ts +45 -0
  17. package/dist/actions/paneActions.d.ts.map +1 -0
  18. package/dist/actions/paneActions.js +932 -0
  19. package/dist/actions/paneActions.js.map +1 -0
  20. package/dist/actions/types.d.ts +101 -0
  21. package/dist/actions/types.d.ts.map +1 -0
  22. package/dist/actions/types.js +129 -0
  23. package/dist/actions/types.js.map +1 -0
  24. package/dist/adapters/apiActionHandler.d.ts +64 -0
  25. package/dist/adapters/apiActionHandler.d.ts.map +1 -0
  26. package/dist/adapters/apiActionHandler.js +170 -0
  27. package/dist/adapters/apiActionHandler.js.map +1 -0
  28. package/dist/adapters/tuiActionHandler.d.ts +57 -0
  29. package/dist/adapters/tuiActionHandler.d.ts.map +1 -0
  30. package/dist/adapters/tuiActionHandler.js +152 -0
  31. package/dist/adapters/tuiActionHandler.js.map +1 -0
  32. package/dist/chunks/_plugin-vue_export-helper-Cvoq67hi.js +28 -0
  33. package/dist/components/ActionChoiceDialog.d.ts +16 -0
  34. package/dist/components/ActionChoiceDialog.d.ts.map +1 -0
  35. package/dist/components/ActionChoiceDialog.js +29 -0
  36. package/dist/components/ActionChoiceDialog.js.map +1 -0
  37. package/dist/components/ActionConfirmDialog.d.ts +16 -0
  38. package/dist/components/ActionConfirmDialog.d.ts.map +1 -0
  39. package/dist/components/ActionConfirmDialog.js +31 -0
  40. package/dist/components/ActionConfirmDialog.js.map +1 -0
  41. package/dist/components/ActionInputDialog.d.ts +16 -0
  42. package/dist/components/ActionInputDialog.d.ts.map +1 -0
  43. package/dist/components/ActionInputDialog.js +49 -0
  44. package/dist/components/ActionInputDialog.js.map +1 -0
  45. package/dist/components/ActionProgressDialog.d.ts +13 -0
  46. package/dist/components/ActionProgressDialog.d.ts.map +1 -0
  47. package/dist/components/ActionProgressDialog.js +20 -0
  48. package/dist/components/ActionProgressDialog.js.map +1 -0
  49. package/dist/components/FooterHelp.d.ts +2 -0
  50. package/dist/components/FooterHelp.d.ts.map +1 -1
  51. package/dist/components/FooterHelp.js +9 -2
  52. package/dist/components/FooterHelp.js.map +1 -1
  53. package/dist/components/KebabMenu.d.ts +10 -0
  54. package/dist/components/KebabMenu.d.ts.map +1 -0
  55. package/dist/components/KebabMenu.js +18 -0
  56. package/dist/components/KebabMenu.js.map +1 -0
  57. package/dist/components/LoadingIndicator.d.ts.map +1 -1
  58. package/dist/components/LoadingIndicator.js +5 -5
  59. package/dist/components/LoadingIndicator.js.map +1 -1
  60. package/dist/components/PaneCard.d.ts +1 -0
  61. package/dist/components/PaneCard.d.ts.map +1 -1
  62. package/dist/components/PaneCard.js +21 -20
  63. package/dist/components/PaneCard.js.map +1 -1
  64. package/dist/components/PanesGrid.d.ts +1 -0
  65. package/dist/components/PanesGrid.d.ts.map +1 -1
  66. package/dist/components/PanesGrid.js +5 -4
  67. package/dist/components/PanesGrid.js.map +1 -1
  68. package/dist/components/QRCode.d.ts +7 -0
  69. package/dist/components/QRCode.d.ts.map +1 -0
  70. package/dist/components/QRCode.js +19 -0
  71. package/dist/components/QRCode.js.map +1 -0
  72. package/dist/components/Spinner.d.ts +10 -0
  73. package/dist/components/Spinner.d.ts.map +1 -0
  74. package/dist/components/Spinner.js +15 -0
  75. package/dist/components/Spinner.js.map +1 -0
  76. package/dist/dashboard.html +14 -0
  77. package/dist/dashboard.js +2 -0
  78. package/dist/hooks/useActionSystem.d.ts +31 -0
  79. package/dist/hooks/useActionSystem.d.ts.map +1 -0
  80. package/dist/hooks/useActionSystem.js +95 -0
  81. package/dist/hooks/useActionSystem.js.map +1 -0
  82. package/dist/hooks/useAgentStatus.d.ts +4 -3
  83. package/dist/hooks/useAgentStatus.d.ts.map +1 -1
  84. package/dist/hooks/useAgentStatus.js +45 -194
  85. package/dist/hooks/useAgentStatus.js.map +1 -1
  86. package/dist/hooks/usePaneCreation.d.ts +3 -1
  87. package/dist/hooks/usePaneCreation.d.ts.map +1 -1
  88. package/dist/hooks/usePaneCreation.js +49 -99
  89. package/dist/hooks/usePaneCreation.js.map +1 -1
  90. package/dist/hooks/usePanes.d.ts.map +1 -1
  91. package/dist/hooks/usePanes.js +6 -3
  92. package/dist/hooks/usePanes.js.map +1 -1
  93. package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
  94. package/dist/hooks/useTerminalWidth.js +18 -1
  95. package/dist/hooks/useTerminalWidth.js.map +1 -1
  96. package/dist/hooks/useWorktreeActions.d.ts +2 -1
  97. package/dist/hooks/useWorktreeActions.d.ts.map +1 -1
  98. package/dist/hooks/useWorktreeActions.js +9 -1
  99. package/dist/hooks/useWorktreeActions.js.map +1 -1
  100. package/dist/index.js +48 -3
  101. package/dist/index.js.map +1 -1
  102. package/dist/server/actionsApi.d.ts +37 -0
  103. package/dist/server/actionsApi.d.ts.map +1 -0
  104. package/dist/server/actionsApi.js +256 -0
  105. package/dist/server/actionsApi.js.map +1 -0
  106. package/dist/server/embedded-assets.d.ts +13 -0
  107. package/dist/server/embedded-assets.d.ts.map +1 -0
  108. package/dist/server/embedded-assets.js +5038 -0
  109. package/dist/server/embedded-assets.js.map +1 -0
  110. package/dist/server/index.d.ts +21 -0
  111. package/dist/server/index.d.ts.map +1 -0
  112. package/dist/server/index.js +99 -0
  113. package/dist/server/index.js.map +1 -0
  114. package/dist/server/routes.d.ts +3 -0
  115. package/dist/server/routes.d.ts.map +1 -0
  116. package/dist/server/routes.js +672 -0
  117. package/dist/server/routes.js.map +1 -0
  118. package/dist/server/static.d.ts +6 -0
  119. package/dist/server/static.d.ts.map +1 -0
  120. package/dist/server/static.js +3040 -0
  121. package/dist/server/static.js.map +1 -0
  122. package/dist/services/ConfigWatcher.d.ts +20 -0
  123. package/dist/services/ConfigWatcher.d.ts.map +1 -0
  124. package/dist/services/ConfigWatcher.js +75 -0
  125. package/dist/services/ConfigWatcher.js.map +1 -0
  126. package/dist/services/PaneWorkerManager.d.ts +69 -0
  127. package/dist/services/PaneWorkerManager.d.ts.map +1 -0
  128. package/dist/services/PaneWorkerManager.js +272 -0
  129. package/dist/services/PaneWorkerManager.js.map +1 -0
  130. package/dist/services/StatusDetector.d.ts +87 -0
  131. package/dist/services/StatusDetector.d.ts.map +1 -0
  132. package/dist/services/StatusDetector.js +387 -0
  133. package/dist/services/StatusDetector.js.map +1 -0
  134. package/dist/services/TerminalDiffer.d.ts +85 -0
  135. package/dist/services/TerminalDiffer.d.ts.map +1 -0
  136. package/dist/services/TerminalDiffer.js +499 -0
  137. package/dist/services/TerminalDiffer.js.map +1 -0
  138. package/dist/services/TerminalStreamer.d.ts +80 -0
  139. package/dist/services/TerminalStreamer.d.ts.map +1 -0
  140. package/dist/services/TerminalStreamer.js +490 -0
  141. package/dist/services/TerminalStreamer.js.map +1 -0
  142. package/dist/services/TunnelService.d.ts +9 -0
  143. package/dist/services/TunnelService.d.ts.map +1 -0
  144. package/dist/services/TunnelService.js +34 -0
  145. package/dist/services/TunnelService.js.map +1 -0
  146. package/dist/services/WorkerMessageBus.d.ts +48 -0
  147. package/dist/services/WorkerMessageBus.d.ts.map +1 -0
  148. package/dist/services/WorkerMessageBus.js +120 -0
  149. package/dist/services/WorkerMessageBus.js.map +1 -0
  150. package/dist/shared/StateManager.d.ts +34 -0
  151. package/dist/shared/StateManager.d.ts.map +1 -0
  152. package/dist/shared/StateManager.js +108 -0
  153. package/dist/shared/StateManager.js.map +1 -0
  154. package/dist/shared/StreamProtocol.d.ts +75 -0
  155. package/dist/shared/StreamProtocol.d.ts.map +1 -0
  156. package/dist/shared/StreamProtocol.js +37 -0
  157. package/dist/shared/StreamProtocol.js.map +1 -0
  158. package/dist/terminal.html +17 -0
  159. package/dist/terminal.js +3 -0
  160. package/dist/types.d.ts +21 -1
  161. package/dist/types.d.ts.map +1 -1
  162. package/dist/utils/agentDetection.d.ts +18 -0
  163. package/dist/utils/agentDetection.d.ts.map +1 -0
  164. package/dist/utils/agentDetection.js +73 -0
  165. package/dist/utils/agentDetection.js.map +1 -0
  166. package/dist/utils/aiMerge.d.ts +35 -0
  167. package/dist/utils/aiMerge.d.ts.map +1 -0
  168. package/dist/utils/aiMerge.js +302 -0
  169. package/dist/utils/aiMerge.js.map +1 -0
  170. package/dist/utils/conflictResolutionPane.d.ts +19 -0
  171. package/dist/utils/conflictResolutionPane.d.ts.map +1 -0
  172. package/dist/utils/conflictResolutionPane.js +214 -0
  173. package/dist/utils/conflictResolutionPane.js.map +1 -0
  174. package/dist/utils/mergeExecution.d.ts +52 -0
  175. package/dist/utils/mergeExecution.d.ts.map +1 -0
  176. package/dist/utils/mergeExecution.js +192 -0
  177. package/dist/utils/mergeExecution.js.map +1 -0
  178. package/dist/utils/mergeValidation.d.ts +67 -0
  179. package/dist/utils/mergeValidation.d.ts.map +1 -0
  180. package/dist/utils/mergeValidation.js +213 -0
  181. package/dist/utils/mergeValidation.js.map +1 -0
  182. package/dist/utils/paneCreation.d.ts +17 -0
  183. package/dist/utils/paneCreation.d.ts.map +1 -0
  184. package/dist/utils/paneCreation.js +274 -0
  185. package/dist/utils/paneCreation.js.map +1 -0
  186. package/dist/utils/port.d.ts +5 -0
  187. package/dist/utils/port.d.ts.map +1 -0
  188. package/dist/utils/port.js +54 -0
  189. package/dist/utils/port.js.map +1 -0
  190. package/dist/utils/slug.d.ts.map +1 -1
  191. package/dist/utils/slug.js +32 -25
  192. package/dist/utils/slug.js.map +1 -1
  193. package/dist/workers/PaneWorker.d.ts +2 -0
  194. package/dist/workers/PaneWorker.d.ts.map +1 -0
  195. package/dist/workers/PaneWorker.js +362 -0
  196. package/dist/workers/PaneWorker.js.map +1 -0
  197. package/dist/workers/WorkerMessages.d.ts +36 -0
  198. package/dist/workers/WorkerMessages.d.ts.map +1 -0
  199. package/dist/workers/WorkerMessages.js +9 -0
  200. package/dist/workers/WorkerMessages.js.map +1 -0
  201. package/package.json +19 -5
@@ -0,0 +1,362 @@
1
+ import { parentPort, workerData } from 'worker_threads';
2
+ import { execSync } from 'child_process';
3
+ import { randomUUID } from 'crypto';
4
+ class PaneWorker {
5
+ paneId;
6
+ tmuxPaneId;
7
+ agent;
8
+ captureHistory = [];
9
+ pollInterval = null;
10
+ pollIntervalMs;
11
+ currentStatus = 'idle';
12
+ lastStaticContent = '';
13
+ lastAnalysisTime = 0;
14
+ isShuttingDown = false;
15
+ idleConfirmed = false; // Block LLM requests when idle is confirmed
16
+ constructor(config) {
17
+ this.paneId = config.paneId;
18
+ this.tmuxPaneId = config.tmuxPaneId;
19
+ this.agent = config.agent;
20
+ this.pollIntervalMs = config.pollInterval || 1000;
21
+ this.setupMessageHandler();
22
+ this.startPolling();
23
+ this.emit('ready', {});
24
+ }
25
+ setupMessageHandler() {
26
+ if (!parentPort)
27
+ return;
28
+ parentPort.on('message', async (msg) => {
29
+ if (this.isShuttingDown)
30
+ return;
31
+ try {
32
+ switch (msg.type) {
33
+ case 'send-keys':
34
+ await this.sendKeys(msg.payload?.keys);
35
+ this.reply(msg, { success: true });
36
+ break;
37
+ case 'resize':
38
+ await this.resizePane(msg.payload?.width, msg.payload?.height);
39
+ this.reply(msg, { success: true });
40
+ break;
41
+ case 'analyze-complete':
42
+ this.handleAnalysisComplete(msg.payload);
43
+ this.reply(msg, { success: true });
44
+ break;
45
+ case 'get-status':
46
+ this.reply(msg, { status: this.currentStatus });
47
+ break;
48
+ case 'shutdown':
49
+ this.shutdown();
50
+ break;
51
+ default:
52
+ this.reply(msg, { error: `Unknown message type: ${msg.type}` });
53
+ }
54
+ }
55
+ catch (error) {
56
+ this.emitError(`Handler error: ${error.message}`, true);
57
+ }
58
+ });
59
+ }
60
+ startPolling() {
61
+ if (this.pollInterval)
62
+ return;
63
+ this.pollInterval = setInterval(() => {
64
+ if (!this.isShuttingDown) {
65
+ this.captureAndAnalyze();
66
+ }
67
+ }, this.pollIntervalMs);
68
+ }
69
+ captureAndAnalyze() {
70
+ try {
71
+ // Capture last 30 lines from tmux pane
72
+ const output = execSync(`tmux capture-pane -t '${this.tmuxPaneId}' -p -S -30`, {
73
+ encoding: 'utf-8',
74
+ stdio: 'pipe',
75
+ timeout: 500
76
+ });
77
+ // First check for deterministic agent working indicators
78
+ // Check the last 20 lines - enough to catch working state but avoid old output
79
+ const lines = output.split('\n');
80
+ const recentLines = lines.slice(-20).join('\n');
81
+ const hasWorkingIndicators = this.hasAgentWorkingIndicators(recentLines);
82
+ if (hasWorkingIndicators) {
83
+ // Reset idle confirmation - working state always breaks out of idle
84
+ this.idleConfirmed = false;
85
+ if (this.currentStatus !== 'working') {
86
+ this.updateStatus('working');
87
+ }
88
+ // Clear history when agent starts working
89
+ this.captureHistory = [output];
90
+ this.lastStaticContent = '';
91
+ return;
92
+ }
93
+ else if (this.currentStatus === 'working') {
94
+ // Was working but no longer has indicators - agent stopped
95
+ // Request analysis to determine new state
96
+ this.updateStatus('analyzing');
97
+ this.requestAnalysis(output, 'new-static-content');
98
+ // Reset history for fresh tracking
99
+ this.captureHistory = [output];
100
+ this.lastStaticContent = '';
101
+ return;
102
+ }
103
+ // Add to rolling history
104
+ this.captureHistory.push(output);
105
+ if (this.captureHistory.length > 5) {
106
+ this.captureHistory.shift();
107
+ }
108
+ // Need at least 3 captures to determine activity
109
+ if (this.captureHistory.length < 3) {
110
+ return;
111
+ }
112
+ // Check for activity (any changes in captures)
113
+ const hasActivity = !this.captureHistory.every(capture => capture === this.captureHistory[0]);
114
+ if (hasActivity) {
115
+ // Check if this is user typing vs agent output
116
+ if (this.isUserTyping()) {
117
+ // User is typing - maintain current status
118
+ // Don't change status or request analysis
119
+ return;
120
+ }
121
+ // If we're in confirmed idle state, don't request more LLM analysis
122
+ // until we see working indicators (which reset the block)
123
+ if (this.idleConfirmed) {
124
+ return;
125
+ }
126
+ // Significant changes that aren't user typing
127
+ // Could be agent output or major state change
128
+ // Request LLM analysis to determine state
129
+ if (this.currentStatus !== 'analyzing') {
130
+ this.updateStatus('analyzing');
131
+ this.requestAnalysis(output, 'new-static-content');
132
+ }
133
+ }
134
+ else {
135
+ // Terminal is static - determine what kind
136
+ const staticContent = this.captureHistory[this.captureHistory.length - 1];
137
+ // Check if this is new static content
138
+ if (staticContent !== this.lastStaticContent) {
139
+ this.lastStaticContent = staticContent;
140
+ // If we're in confirmed idle state, don't request more LLM analysis
141
+ if (this.idleConfirmed) {
142
+ return;
143
+ }
144
+ // Don't request analysis if we're too soon after last one
145
+ const timeSinceLastAnalysis = Date.now() - this.lastAnalysisTime;
146
+ if (timeSinceLastAnalysis < 5000) {
147
+ // Too soon, keep current status
148
+ return;
149
+ }
150
+ // Request LLM analysis for new static content
151
+ if (this.currentStatus !== 'analyzing') {
152
+ this.updateStatus('analyzing');
153
+ this.requestAnalysis(staticContent, 'new-static-content');
154
+ }
155
+ }
156
+ // If same static content, keep current status
157
+ }
158
+ }
159
+ catch (error) {
160
+ // Handle tmux errors gracefully
161
+ if (error.message?.includes("can't find pane") || error.message?.includes('no pane')) {
162
+ // Pane no longer exists - emit pane-removed event and shutdown
163
+ this.emit('pane-removed', { reason: 'Pane no longer exists' });
164
+ this.shutdown();
165
+ }
166
+ else {
167
+ this.emitError(`Capture error: ${error.message}`, true);
168
+ }
169
+ }
170
+ }
171
+ updateStatus(newStatus) {
172
+ const previousStatus = this.currentStatus;
173
+ this.currentStatus = newStatus;
174
+ const payload = {
175
+ status: newStatus,
176
+ previousStatus,
177
+ captureSnapshot: this.captureHistory[this.captureHistory.length - 1]
178
+ };
179
+ this.emit('status-change', payload);
180
+ }
181
+ requestAnalysis(content, reason) {
182
+ this.lastAnalysisTime = Date.now();
183
+ const payload = {
184
+ captureSnapshot: content,
185
+ reason
186
+ };
187
+ this.emit('analysis-needed', payload);
188
+ }
189
+ handleAnalysisComplete(payload) {
190
+ if (payload?.status) {
191
+ this.updateStatus(payload.status);
192
+ // If LLM determined it's idle, confirm it to block future requests
193
+ if (payload.status === 'idle') {
194
+ this.idleConfirmed = true;
195
+ }
196
+ // If a delay was requested (e.g., after option dialog), pause polling temporarily
197
+ if (payload.delayBeforeNextCheck && payload.delayBeforeNextCheck > 0) {
198
+ this.pausePolling(payload.delayBeforeNextCheck);
199
+ }
200
+ }
201
+ }
202
+ pausePolling(delayMs) {
203
+ // Stop the current interval
204
+ if (this.pollInterval) {
205
+ clearInterval(this.pollInterval);
206
+ this.pollInterval = null;
207
+ }
208
+ // Restart polling after the delay
209
+ setTimeout(() => {
210
+ if (!this.isShuttingDown) {
211
+ this.startPolling();
212
+ }
213
+ }, delayMs);
214
+ }
215
+ async sendKeys(keys) {
216
+ if (!keys)
217
+ return;
218
+ execSync(`tmux send-keys -t '${this.tmuxPaneId}' '${keys.replace(/'/g, "'\\''")}'`, { stdio: 'pipe', timeout: 1000 });
219
+ // Clear history after sending keys as state will change
220
+ this.captureHistory = [];
221
+ }
222
+ async resizePane(width, height) {
223
+ if (!width && !height)
224
+ return;
225
+ const args = [];
226
+ if (width)
227
+ args.push(`-x ${width}`);
228
+ if (height)
229
+ args.push(`-y ${height}`);
230
+ execSync(`tmux resize-pane -t '${this.tmuxPaneId}' ${args.join(' ')}`, { stdio: 'pipe', timeout: 1000 });
231
+ }
232
+ shutdown() {
233
+ if (this.isShuttingDown)
234
+ return;
235
+ this.isShuttingDown = true;
236
+ if (this.pollInterval) {
237
+ clearInterval(this.pollInterval);
238
+ this.pollInterval = null;
239
+ }
240
+ this.emit('shutdown-complete', {});
241
+ // Give time for message to send
242
+ setTimeout(() => {
243
+ process.exit(0);
244
+ }, 100);
245
+ }
246
+ reply(originalMsg, payload) {
247
+ this.emitMessage({
248
+ id: originalMsg.id,
249
+ type: `${originalMsg.type}-response`,
250
+ timestamp: Date.now(),
251
+ paneId: this.paneId,
252
+ payload
253
+ });
254
+ }
255
+ emit(type, payload) {
256
+ this.emitMessage({
257
+ id: randomUUID(),
258
+ type,
259
+ timestamp: Date.now(),
260
+ paneId: this.paneId,
261
+ payload
262
+ });
263
+ }
264
+ emitMessage(message) {
265
+ if (parentPort && !this.isShuttingDown) {
266
+ parentPort.postMessage(message);
267
+ }
268
+ }
269
+ emitError(error, recoverable) {
270
+ const payload = {
271
+ error,
272
+ recoverable
273
+ };
274
+ this.emit('error', payload);
275
+ }
276
+ /**
277
+ * Check for deterministic indicators that agent is working
278
+ */
279
+ hasAgentWorkingIndicators(content) {
280
+ // The most reliable indicator for both agents is "esc to interrupt"
281
+ // This ONLY appears when the agent is actively processing
282
+ // Match "(esc to interrupt" at the beginning, but allow additional text after like timing info
283
+ const universalWorkingPattern = /\(esc\s+to\s+interrupt/i;
284
+ if (universalWorkingPattern.test(content)) {
285
+ return true;
286
+ }
287
+ // Additional agent-specific patterns that are very specific
288
+ if (this.agent === 'claude') {
289
+ // Claude shows specific animations when working
290
+ // Look for the germinating/thinking messages WITH esc to interrupt nearby
291
+ // Allow for additional text after "interrupt" like timing info
292
+ const claudeActivePatterns = [
293
+ /·\s+(Germinating|Thinking|Planning|Writing|Reading|Analyzing|Building|Testing|Running|Searching|Reviewing|Understanding)[.…]+\s*\(esc\s+to\s+interrupt/i,
294
+ /⏸\s*Claude\s+is\s+working.*\(esc\s+to\s+interrupt/i
295
+ ];
296
+ return claudeActivePatterns.some(pattern => pattern.test(content));
297
+ }
298
+ else if (this.agent === 'opencode') {
299
+ // OpenCode specific working indicators
300
+ const opencodeWorkingPatterns = [
301
+ /working\.\.\./i,
302
+ /⏳.*processing/i
303
+ ];
304
+ return opencodeWorkingPatterns.some(pattern => pattern.test(content));
305
+ }
306
+ return false;
307
+ }
308
+ /**
309
+ * Detect if changes are likely user typing at a prompt
310
+ */
311
+ isUserTyping() {
312
+ if (this.captureHistory.length < 2)
313
+ return false;
314
+ const prev = this.captureHistory[this.captureHistory.length - 2];
315
+ const curr = this.captureHistory[this.captureHistory.length - 1];
316
+ // Split into lines
317
+ const prevLines = prev.split('\n');
318
+ const currLines = curr.split('\n');
319
+ // If line count changed significantly, probably not typing
320
+ if (Math.abs(currLines.length - prevLines.length) > 2) {
321
+ return false;
322
+ }
323
+ // Check if only the last few lines changed (typical of user input)
324
+ let changedLines = 0;
325
+ let lastChangedIndex = -1;
326
+ for (let i = 0; i < Math.min(prevLines.length, currLines.length); i++) {
327
+ if (prevLines[i] !== currLines[i]) {
328
+ changedLines++;
329
+ lastChangedIndex = i;
330
+ }
331
+ }
332
+ // User typing typically only changes the last 1-2 lines
333
+ // and the change is at the bottom of the terminal
334
+ if (changedLines <= 2 && lastChangedIndex >= prevLines.length - 3) {
335
+ // Additional check: is the change small (adding characters)?
336
+ if (lastChangedIndex >= 0) {
337
+ const prevLine = prevLines[lastChangedIndex] || '';
338
+ const currLine = currLines[lastChangedIndex] || '';
339
+ // Check if current line starts with previous line (user adding to it)
340
+ if (currLine.startsWith(prevLine) && currLine.length - prevLine.length < 20) {
341
+ return true;
342
+ }
343
+ // Check for common prompt patterns with user input
344
+ const promptPatterns = [
345
+ />\s*\S+/, // > command
346
+ /\$\s*\S+/, // $ command
347
+ /❯\s*\S+/, // ❯ command
348
+ /│\s*>\s*\S+/, // │ > input (Claude prompt)
349
+ ];
350
+ if (promptPatterns.some(p => p.test(currLine))) {
351
+ return true;
352
+ }
353
+ }
354
+ }
355
+ return false;
356
+ }
357
+ }
358
+ // Initialize worker with config from main thread
359
+ if (workerData) {
360
+ new PaneWorker(workerData);
361
+ }
362
+ //# sourceMappingURL=PaneWorker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaneWorker.js","sourceRoot":"","sources":["../../src/workers/PaneWorker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export interface WorkerMessage {
2
+ id: string;
3
+ type: string;
4
+ timestamp: number;
5
+ payload?: any;
6
+ }
7
+ export interface InboundMessage extends WorkerMessage {
8
+ type: 'init' | 'capture' | 'send-keys' | 'analyze-complete' | 'shutdown' | 'resize' | 'get-status';
9
+ }
10
+ export interface OutboundMessage extends WorkerMessage {
11
+ type: 'ready' | 'status-change' | 'capture-result' | 'analysis-needed' | 'error' | 'shutdown-complete' | 'pane-removed';
12
+ paneId: string;
13
+ }
14
+ export interface WorkerConfig {
15
+ paneId: string;
16
+ tmuxPaneId: string;
17
+ agent?: 'claude' | 'opencode';
18
+ pollInterval?: number;
19
+ }
20
+ export interface StatusChangePayload {
21
+ status: 'idle' | 'analyzing' | 'waiting' | 'working';
22
+ previousStatus?: string;
23
+ captureSnapshot?: string;
24
+ }
25
+ export interface AnalysisNeededPayload {
26
+ captureSnapshot: string;
27
+ reason: 'new-static-content' | 'revalidation';
28
+ }
29
+ export interface ErrorPayload {
30
+ error: string;
31
+ code?: string;
32
+ recoverable: boolean;
33
+ }
34
+ export declare function isInboundMessage(msg: any): msg is InboundMessage;
35
+ export declare function isOutboundMessage(msg: any): msg is OutboundMessage;
36
+ //# sourceMappingURL=WorkerMessages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerMessages.d.ts","sourceRoot":"","sources":["../../src/workers/WorkerMessages.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,GAAG,CAAC;CACf;AAGD,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,kBAAkB,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAC;CACpG;AAGD,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,IAAI,EAAE,OAAO,GAAG,eAAe,GAAG,gBAAgB,GAAG,iBAAiB,GAAG,OAAO,GAAG,mBAAmB,GAAG,cAAc,CAAC;IACxH,MAAM,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAGD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAGD,MAAM,WAAW,qBAAqB;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAAC;CAC/C;AAGD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;CACtB;AAGD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,cAAc,CAEhE;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,eAAe,CAElE"}
@@ -0,0 +1,9 @@
1
+ // Message protocol for worker communication
2
+ // Type guards
3
+ export function isInboundMessage(msg) {
4
+ return msg && typeof msg.type === 'string' && typeof msg.id === 'string';
5
+ }
6
+ export function isOutboundMessage(msg) {
7
+ return msg && typeof msg.type === 'string' && typeof msg.paneId === 'string';
8
+ }
9
+ //# sourceMappingURL=WorkerMessages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerMessages.js","sourceRoot":"","sources":["../../src/workers/WorkerMessages.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAgD5C,cAAc;AACd,MAAM,UAAU,gBAAgB,CAAC,GAAQ;IACvC,OAAO,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAQ;IACxC,OAAO,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC;AAC/E,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dmux",
3
- "version": "2.2.1",
3
+ "version": "3.0.1",
4
4
  "description": "Tmux pane manager with AI agent integration for parallel development workflows",
5
5
  "type": "module",
6
6
  "author": "Justin Schroeder",
@@ -45,30 +45,44 @@
45
45
  },
46
46
  "dependencies": {
47
47
  "chalk": "^5.3.0",
48
+ "chokidar": "^4.0.3",
49
+ "h3": "^1.15.4",
48
50
  "ink": "^5.0.1",
49
51
  "ink-text-input": "^6.0.0",
52
+ "qrcode-terminal": "^0.12.0",
50
53
  "react": "^18.2.0",
51
- "string-width": "^7.2.0"
54
+ "string-width": "^7.2.0",
55
+ "untun": "^0.1.3",
56
+ "vue": "^3.5.22"
52
57
  },
53
58
  "devDependencies": {
59
+ "@playwright/test": "^1.55.1",
54
60
  "@types/node": "^20.10.5",
55
61
  "@types/react": "^18.2.45",
62
+ "@vitejs/plugin-vue": "^5.2.1",
56
63
  "bumpp": "^10.2.3",
57
64
  "ink-testing-library": "^4.0.0",
58
65
  "npm-run-all2": "^8.0.4",
66
+ "playwright": "^1.55.1",
59
67
  "strip-ansi": "^7.1.2",
60
68
  "tsx": "^4.7.0",
61
69
  "typescript": "^5.9.2",
70
+ "vite": "^6.0.7",
62
71
  "vitest": "^1.6.1"
63
72
  },
64
73
  "scripts": {
65
- "build": "tsc",
66
- "clean": "rm -rf dist",
74
+ "build": "pnpm run build:frontend && pnpm run embed:assets && tsc",
75
+ "build:frontend": "pnpm --filter dmux-frontend run build",
76
+ "build:docs": "pnpm --filter dmux-docs run build",
77
+ "embed:assets": "node scripts/embed-assets.js",
78
+ "clean": "rm -rf dist src/server/embedded-assets.ts",
67
79
  "dev": "tsx src/index.ts",
80
+ "dev:frontend": "pnpm --filter dmux-frontend run dev",
81
+ "dev:docs": "pnpm --filter dmux-docs run dev",
68
82
  "start": "node dist/index.js",
69
83
  "typecheck": "tsc --noEmit",
70
84
  "test": "vitest --run",
71
- "prerelease": "run-s clean typecheck build",
85
+ "prerelease": "run-s clean build typecheck",
72
86
  "release": "bumpp --commit --push --tag && pnpm publish",
73
87
  "release:minor": "bumpp minor --commit --push --tag && pnpm publish",
74
88
  "release:major": "bumpp major --commit --push --tag && pnpm publish"