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.
- package/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +433 -179
- package/dist/DmuxApp.js.map +1 -1
- package/dist/MergePane.d.ts.map +1 -1
- package/dist/MergePane.js +4 -6
- package/dist/MergePane.js.map +1 -1
- package/dist/PaneAnalyzer.d.ts +45 -0
- package/dist/PaneAnalyzer.d.ts.map +1 -0
- package/dist/PaneAnalyzer.js +278 -0
- package/dist/PaneAnalyzer.js.map +1 -0
- package/dist/_plugin-vue_export-helper.css +1 -0
- package/dist/actions/index.d.ts +19 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +54 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/paneActions.d.ts +45 -0
- package/dist/actions/paneActions.d.ts.map +1 -0
- package/dist/actions/paneActions.js +932 -0
- package/dist/actions/paneActions.js.map +1 -0
- package/dist/actions/types.d.ts +101 -0
- package/dist/actions/types.d.ts.map +1 -0
- package/dist/actions/types.js +129 -0
- package/dist/actions/types.js.map +1 -0
- package/dist/adapters/apiActionHandler.d.ts +64 -0
- package/dist/adapters/apiActionHandler.d.ts.map +1 -0
- package/dist/adapters/apiActionHandler.js +170 -0
- package/dist/adapters/apiActionHandler.js.map +1 -0
- package/dist/adapters/tuiActionHandler.d.ts +57 -0
- package/dist/adapters/tuiActionHandler.d.ts.map +1 -0
- package/dist/adapters/tuiActionHandler.js +152 -0
- package/dist/adapters/tuiActionHandler.js.map +1 -0
- package/dist/chunks/_plugin-vue_export-helper-Cvoq67hi.js +28 -0
- package/dist/components/ActionChoiceDialog.d.ts +16 -0
- package/dist/components/ActionChoiceDialog.d.ts.map +1 -0
- package/dist/components/ActionChoiceDialog.js +29 -0
- package/dist/components/ActionChoiceDialog.js.map +1 -0
- package/dist/components/ActionConfirmDialog.d.ts +16 -0
- package/dist/components/ActionConfirmDialog.d.ts.map +1 -0
- package/dist/components/ActionConfirmDialog.js +31 -0
- package/dist/components/ActionConfirmDialog.js.map +1 -0
- package/dist/components/ActionInputDialog.d.ts +16 -0
- package/dist/components/ActionInputDialog.d.ts.map +1 -0
- package/dist/components/ActionInputDialog.js +49 -0
- package/dist/components/ActionInputDialog.js.map +1 -0
- package/dist/components/ActionProgressDialog.d.ts +13 -0
- package/dist/components/ActionProgressDialog.d.ts.map +1 -0
- package/dist/components/ActionProgressDialog.js +20 -0
- package/dist/components/ActionProgressDialog.js.map +1 -0
- package/dist/components/FooterHelp.d.ts +2 -0
- package/dist/components/FooterHelp.d.ts.map +1 -1
- package/dist/components/FooterHelp.js +9 -2
- package/dist/components/FooterHelp.js.map +1 -1
- package/dist/components/KebabMenu.d.ts +10 -0
- package/dist/components/KebabMenu.d.ts.map +1 -0
- package/dist/components/KebabMenu.js +18 -0
- package/dist/components/KebabMenu.js.map +1 -0
- package/dist/components/LoadingIndicator.d.ts.map +1 -1
- package/dist/components/LoadingIndicator.js +5 -5
- package/dist/components/LoadingIndicator.js.map +1 -1
- package/dist/components/PaneCard.d.ts +1 -0
- package/dist/components/PaneCard.d.ts.map +1 -1
- package/dist/components/PaneCard.js +21 -20
- package/dist/components/PaneCard.js.map +1 -1
- package/dist/components/PanesGrid.d.ts +1 -0
- package/dist/components/PanesGrid.d.ts.map +1 -1
- package/dist/components/PanesGrid.js +5 -4
- package/dist/components/PanesGrid.js.map +1 -1
- package/dist/components/QRCode.d.ts +7 -0
- package/dist/components/QRCode.d.ts.map +1 -0
- package/dist/components/QRCode.js +19 -0
- package/dist/components/QRCode.js.map +1 -0
- package/dist/components/Spinner.d.ts +10 -0
- package/dist/components/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner.js +15 -0
- package/dist/components/Spinner.js.map +1 -0
- package/dist/dashboard.html +14 -0
- package/dist/dashboard.js +2 -0
- package/dist/hooks/useActionSystem.d.ts +31 -0
- package/dist/hooks/useActionSystem.d.ts.map +1 -0
- package/dist/hooks/useActionSystem.js +95 -0
- package/dist/hooks/useActionSystem.js.map +1 -0
- package/dist/hooks/useAgentStatus.d.ts +4 -3
- package/dist/hooks/useAgentStatus.d.ts.map +1 -1
- package/dist/hooks/useAgentStatus.js +45 -194
- package/dist/hooks/useAgentStatus.js.map +1 -1
- package/dist/hooks/usePaneCreation.d.ts +3 -1
- package/dist/hooks/usePaneCreation.d.ts.map +1 -1
- package/dist/hooks/usePaneCreation.js +49 -99
- package/dist/hooks/usePaneCreation.js.map +1 -1
- package/dist/hooks/usePanes.d.ts.map +1 -1
- package/dist/hooks/usePanes.js +6 -3
- package/dist/hooks/usePanes.js.map +1 -1
- package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
- package/dist/hooks/useTerminalWidth.js +18 -1
- package/dist/hooks/useTerminalWidth.js.map +1 -1
- package/dist/hooks/useWorktreeActions.d.ts +2 -1
- package/dist/hooks/useWorktreeActions.d.ts.map +1 -1
- package/dist/hooks/useWorktreeActions.js +9 -1
- package/dist/hooks/useWorktreeActions.js.map +1 -1
- package/dist/index.js +48 -3
- package/dist/index.js.map +1 -1
- package/dist/server/actionsApi.d.ts +37 -0
- package/dist/server/actionsApi.d.ts.map +1 -0
- package/dist/server/actionsApi.js +256 -0
- package/dist/server/actionsApi.js.map +1 -0
- package/dist/server/embedded-assets.d.ts +13 -0
- package/dist/server/embedded-assets.d.ts.map +1 -0
- package/dist/server/embedded-assets.js +5038 -0
- package/dist/server/embedded-assets.js.map +1 -0
- package/dist/server/index.d.ts +21 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +99 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes.d.ts +3 -0
- package/dist/server/routes.d.ts.map +1 -0
- package/dist/server/routes.js +672 -0
- package/dist/server/routes.js.map +1 -0
- package/dist/server/static.d.ts +6 -0
- package/dist/server/static.d.ts.map +1 -0
- package/dist/server/static.js +3040 -0
- package/dist/server/static.js.map +1 -0
- package/dist/services/ConfigWatcher.d.ts +20 -0
- package/dist/services/ConfigWatcher.d.ts.map +1 -0
- package/dist/services/ConfigWatcher.js +75 -0
- package/dist/services/ConfigWatcher.js.map +1 -0
- package/dist/services/PaneWorkerManager.d.ts +69 -0
- package/dist/services/PaneWorkerManager.d.ts.map +1 -0
- package/dist/services/PaneWorkerManager.js +272 -0
- package/dist/services/PaneWorkerManager.js.map +1 -0
- package/dist/services/StatusDetector.d.ts +87 -0
- package/dist/services/StatusDetector.d.ts.map +1 -0
- package/dist/services/StatusDetector.js +387 -0
- package/dist/services/StatusDetector.js.map +1 -0
- package/dist/services/TerminalDiffer.d.ts +85 -0
- package/dist/services/TerminalDiffer.d.ts.map +1 -0
- package/dist/services/TerminalDiffer.js +499 -0
- package/dist/services/TerminalDiffer.js.map +1 -0
- package/dist/services/TerminalStreamer.d.ts +80 -0
- package/dist/services/TerminalStreamer.d.ts.map +1 -0
- package/dist/services/TerminalStreamer.js +490 -0
- package/dist/services/TerminalStreamer.js.map +1 -0
- package/dist/services/TunnelService.d.ts +9 -0
- package/dist/services/TunnelService.d.ts.map +1 -0
- package/dist/services/TunnelService.js +34 -0
- package/dist/services/TunnelService.js.map +1 -0
- package/dist/services/WorkerMessageBus.d.ts +48 -0
- package/dist/services/WorkerMessageBus.d.ts.map +1 -0
- package/dist/services/WorkerMessageBus.js +120 -0
- package/dist/services/WorkerMessageBus.js.map +1 -0
- package/dist/shared/StateManager.d.ts +34 -0
- package/dist/shared/StateManager.d.ts.map +1 -0
- package/dist/shared/StateManager.js +108 -0
- package/dist/shared/StateManager.js.map +1 -0
- package/dist/shared/StreamProtocol.d.ts +75 -0
- package/dist/shared/StreamProtocol.d.ts.map +1 -0
- package/dist/shared/StreamProtocol.js +37 -0
- package/dist/shared/StreamProtocol.js.map +1 -0
- package/dist/terminal.html +17 -0
- package/dist/terminal.js +3 -0
- package/dist/types.d.ts +21 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/agentDetection.d.ts +18 -0
- package/dist/utils/agentDetection.d.ts.map +1 -0
- package/dist/utils/agentDetection.js +73 -0
- package/dist/utils/agentDetection.js.map +1 -0
- package/dist/utils/aiMerge.d.ts +35 -0
- package/dist/utils/aiMerge.d.ts.map +1 -0
- package/dist/utils/aiMerge.js +302 -0
- package/dist/utils/aiMerge.js.map +1 -0
- package/dist/utils/conflictResolutionPane.d.ts +19 -0
- package/dist/utils/conflictResolutionPane.d.ts.map +1 -0
- package/dist/utils/conflictResolutionPane.js +214 -0
- package/dist/utils/conflictResolutionPane.js.map +1 -0
- package/dist/utils/mergeExecution.d.ts +52 -0
- package/dist/utils/mergeExecution.d.ts.map +1 -0
- package/dist/utils/mergeExecution.js +192 -0
- package/dist/utils/mergeExecution.js.map +1 -0
- package/dist/utils/mergeValidation.d.ts +67 -0
- package/dist/utils/mergeValidation.d.ts.map +1 -0
- package/dist/utils/mergeValidation.js +213 -0
- package/dist/utils/mergeValidation.js.map +1 -0
- package/dist/utils/paneCreation.d.ts +17 -0
- package/dist/utils/paneCreation.d.ts.map +1 -0
- package/dist/utils/paneCreation.js +274 -0
- package/dist/utils/paneCreation.js.map +1 -0
- package/dist/utils/port.d.ts +5 -0
- package/dist/utils/port.d.ts.map +1 -0
- package/dist/utils/port.js +54 -0
- package/dist/utils/port.js.map +1 -0
- package/dist/utils/slug.d.ts.map +1 -1
- package/dist/utils/slug.js +32 -25
- package/dist/utils/slug.js.map +1 -1
- package/dist/workers/PaneWorker.d.ts +2 -0
- package/dist/workers/PaneWorker.d.ts.map +1 -0
- package/dist/workers/PaneWorker.js +362 -0
- package/dist/workers/PaneWorker.js.map +1 -0
- package/dist/workers/WorkerMessages.d.ts +36 -0
- package/dist/workers/WorkerMessages.d.ts.map +1 -0
- package/dist/workers/WorkerMessages.js +9 -0
- package/dist/workers/WorkerMessages.js.map +1 -0
- 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": "
|
|
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
|
-
"
|
|
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
|
|
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"
|