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,387 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { WorkerMessageBus } from './WorkerMessageBus.js';
|
|
3
|
+
import { PaneWorkerManager } from './PaneWorkerManager.js';
|
|
4
|
+
import { PaneAnalyzer } from '../PaneAnalyzer.js';
|
|
5
|
+
import { StateManager } from '../shared/StateManager.js';
|
|
6
|
+
/**
|
|
7
|
+
* High-level service coordinating status detection via workers and LLM
|
|
8
|
+
*/
|
|
9
|
+
export class StatusDetector extends EventEmitter {
|
|
10
|
+
workerManager;
|
|
11
|
+
messageBus;
|
|
12
|
+
paneAnalyzer;
|
|
13
|
+
paneStatuses = new Map();
|
|
14
|
+
llmRequests = new Map();
|
|
15
|
+
paneIdMap = new Map(); // dmux pane ID -> tmux pane ID
|
|
16
|
+
isShuttingDown = false;
|
|
17
|
+
constructor() {
|
|
18
|
+
super();
|
|
19
|
+
this.messageBus = new WorkerMessageBus();
|
|
20
|
+
this.workerManager = new PaneWorkerManager(this.messageBus);
|
|
21
|
+
this.paneAnalyzer = new PaneAnalyzer();
|
|
22
|
+
this.setupMessageHandlers();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Set up handlers for worker messages
|
|
26
|
+
*/
|
|
27
|
+
setupMessageHandlers() {
|
|
28
|
+
// Handle status changes from workers
|
|
29
|
+
this.messageBus.subscribe('status-change', async (paneId, message) => {
|
|
30
|
+
await this.handleStatusChange(paneId, message);
|
|
31
|
+
});
|
|
32
|
+
// Handle analysis requests from workers
|
|
33
|
+
this.messageBus.subscribe('analysis-needed', async (paneId, message) => {
|
|
34
|
+
await this.handleAnalysisRequest(paneId, message);
|
|
35
|
+
});
|
|
36
|
+
// Handle worker errors (silently - don't log to console)
|
|
37
|
+
this.messageBus.subscribe('error', (paneId, message) => {
|
|
38
|
+
// Errors are internal - emit as events but don't log to console
|
|
39
|
+
this.emit('worker-error', { paneId, error: message.payload });
|
|
40
|
+
});
|
|
41
|
+
// Handle pane removal (when pane no longer exists in tmux)
|
|
42
|
+
this.messageBus.subscribe('pane-removed', (paneId, message) => {
|
|
43
|
+
this.emit('pane-removed', { paneId, reason: message.payload?.reason });
|
|
44
|
+
});
|
|
45
|
+
// Handle worker ready events
|
|
46
|
+
this.messageBus.subscribe('ready', (paneId) => {
|
|
47
|
+
// Worker ready, no action needed
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Start monitoring a set of panes
|
|
52
|
+
*/
|
|
53
|
+
async monitorPanes(panes) {
|
|
54
|
+
if (this.isShuttingDown)
|
|
55
|
+
return;
|
|
56
|
+
// Update pane ID mappings
|
|
57
|
+
panes.forEach(pane => {
|
|
58
|
+
if (pane.id && pane.paneId) {
|
|
59
|
+
this.paneIdMap.set(pane.id, pane.paneId);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
// Update workers based on current panes
|
|
63
|
+
await this.workerManager.updateWorkers(panes);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Handle status change from worker
|
|
67
|
+
*/
|
|
68
|
+
async handleStatusChange(paneId, message) {
|
|
69
|
+
const { status, previousStatus } = message.payload || {};
|
|
70
|
+
if (!status)
|
|
71
|
+
return;
|
|
72
|
+
// Update local cache
|
|
73
|
+
const oldStatus = this.paneStatuses.get(paneId);
|
|
74
|
+
this.paneStatuses.set(paneId, status);
|
|
75
|
+
// ONLY cancel LLM request if transitioning from analyzing to working
|
|
76
|
+
// This is the specific case where the agent started working again
|
|
77
|
+
// before the LLM analysis completed
|
|
78
|
+
if (oldStatus === 'analyzing' && status === 'working') {
|
|
79
|
+
this.cancelLLMRequest(paneId);
|
|
80
|
+
}
|
|
81
|
+
// Emit event for UI updates
|
|
82
|
+
const updateEvent = {
|
|
83
|
+
paneId,
|
|
84
|
+
status,
|
|
85
|
+
previousStatus: oldStatus
|
|
86
|
+
};
|
|
87
|
+
// Clear analyzerError when transitioning to working status
|
|
88
|
+
if (status === 'working') {
|
|
89
|
+
updateEvent.analyzerError = '';
|
|
90
|
+
}
|
|
91
|
+
this.emit('status-updated', updateEvent);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Handle analysis request from worker
|
|
95
|
+
*/
|
|
96
|
+
async handleAnalysisRequest(paneId, message) {
|
|
97
|
+
const { captureSnapshot, reason } = message.payload || {};
|
|
98
|
+
if (!captureSnapshot)
|
|
99
|
+
return;
|
|
100
|
+
// Cancel any existing request for this pane
|
|
101
|
+
this.cancelLLMRequest(paneId);
|
|
102
|
+
// Set status to analyzing
|
|
103
|
+
this.paneStatuses.set(paneId, 'analyzing');
|
|
104
|
+
this.emit('status-updated', {
|
|
105
|
+
paneId,
|
|
106
|
+
status: 'analyzing'
|
|
107
|
+
});
|
|
108
|
+
try {
|
|
109
|
+
// Create abort controller for this request with 10 second timeout
|
|
110
|
+
const controller = new AbortController();
|
|
111
|
+
this.llmRequests.set(paneId, controller);
|
|
112
|
+
// Set a timeout to abort if LLM takes too long
|
|
113
|
+
const timeoutId = setTimeout(() => {
|
|
114
|
+
controller.abort();
|
|
115
|
+
}, 10000); // 10 second timeout
|
|
116
|
+
try {
|
|
117
|
+
// Get the tmux pane ID (we need to track this better)
|
|
118
|
+
const tmuxPaneId = await this.getTmuxPaneId(paneId);
|
|
119
|
+
if (!tmuxPaneId) {
|
|
120
|
+
throw new Error(`No tmux pane ID found for ${paneId}`);
|
|
121
|
+
}
|
|
122
|
+
// Run LLM analysis with abort signal
|
|
123
|
+
const analysis = await this.paneAnalyzer.analyzePane(tmuxPaneId, controller.signal);
|
|
124
|
+
// Clear the timeout since analysis completed
|
|
125
|
+
clearTimeout(timeoutId);
|
|
126
|
+
// Check if request was cancelled
|
|
127
|
+
if (controller.signal.aborted) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
// Determine final status based on analysis
|
|
131
|
+
const finalStatus = analysis.state === 'option_dialog' ? 'waiting' : 'idle';
|
|
132
|
+
// If we detected an option dialog, add a 2-second delay before allowing
|
|
133
|
+
// the next state detection. This prevents detecting an incomplete state
|
|
134
|
+
// after the user selects an option.
|
|
135
|
+
const delayBeforeNextCheck = analysis.state === 'option_dialog' ? 2000 : 0;
|
|
136
|
+
// Update status
|
|
137
|
+
this.paneStatuses.set(paneId, finalStatus);
|
|
138
|
+
// Check if autopilot should handle this automatically
|
|
139
|
+
await this.handleAutopilot(paneId, analysis, finalStatus);
|
|
140
|
+
// Notify worker of analysis result (fire and forget)
|
|
141
|
+
this.workerManager.notifyWorker(paneId, {
|
|
142
|
+
type: 'analyze-complete',
|
|
143
|
+
timestamp: Date.now(),
|
|
144
|
+
payload: {
|
|
145
|
+
status: finalStatus,
|
|
146
|
+
analysis,
|
|
147
|
+
delayBeforeNextCheck
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
// Emit event for UI with analysis data
|
|
151
|
+
this.emit('status-updated', {
|
|
152
|
+
paneId,
|
|
153
|
+
status: finalStatus,
|
|
154
|
+
previousStatus: 'analyzing',
|
|
155
|
+
optionsQuestion: analysis.question,
|
|
156
|
+
options: analysis.options,
|
|
157
|
+
potentialHarm: analysis.potentialHarm,
|
|
158
|
+
summary: analysis.summary
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
// Clear the timeout on error
|
|
163
|
+
clearTimeout(timeoutId);
|
|
164
|
+
if (error.name === 'AbortError') {
|
|
165
|
+
// Request was aborted due to timeout
|
|
166
|
+
console.error(`LLM analysis timeout for pane ${paneId} after 10 seconds`);
|
|
167
|
+
this.paneStatuses.set(paneId, 'idle');
|
|
168
|
+
// Notify worker that analysis is complete (defaulting to idle)
|
|
169
|
+
this.workerManager.notifyWorker(paneId, {
|
|
170
|
+
type: 'analyze-complete',
|
|
171
|
+
timestamp: Date.now(),
|
|
172
|
+
payload: {
|
|
173
|
+
status: 'idle',
|
|
174
|
+
analysis: { state: 'open_prompt' },
|
|
175
|
+
delayBeforeNextCheck: 0
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
this.emit('status-updated', {
|
|
179
|
+
paneId,
|
|
180
|
+
status: 'idle',
|
|
181
|
+
previousStatus: 'analyzing',
|
|
182
|
+
analyzerError: 'Analysis timeout (10s limit)'
|
|
183
|
+
});
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
throw error; // Re-throw other errors to outer catch
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
console.error(`LLM analysis error for pane ${paneId}:`, error);
|
|
191
|
+
// Extract detailed error message
|
|
192
|
+
let errorMessage = 'Analysis failed';
|
|
193
|
+
if (error.message) {
|
|
194
|
+
// Clean up common API error patterns
|
|
195
|
+
if (error.message.includes('API error')) {
|
|
196
|
+
// Extract model name and status from API errors
|
|
197
|
+
const match = error.message.match(/API error \(([^)]+)\): (\d+)/);
|
|
198
|
+
if (match) {
|
|
199
|
+
const [, model, status] = match;
|
|
200
|
+
// Provide helpful messages for common status codes
|
|
201
|
+
if (status === '401') {
|
|
202
|
+
errorMessage = `API auth failed - check OPENROUTER_API_KEY`;
|
|
203
|
+
}
|
|
204
|
+
else if (status === '402') {
|
|
205
|
+
errorMessage = `Insufficient credits - add credits to OpenRouter account`;
|
|
206
|
+
}
|
|
207
|
+
else if (status === '429') {
|
|
208
|
+
errorMessage = `Rate limited - wait before retrying`;
|
|
209
|
+
}
|
|
210
|
+
else if (status === '503') {
|
|
211
|
+
errorMessage = `API unavailable (${model})`;
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
errorMessage = `API error: ${status} (${model})`;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
errorMessage = error.message;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
else if (error.message.includes('API key')) {
|
|
222
|
+
errorMessage = 'Set OPENROUTER_API_KEY env var';
|
|
223
|
+
}
|
|
224
|
+
else if (error.message.includes('All models')) {
|
|
225
|
+
errorMessage = 'All models failed - check API key & credits';
|
|
226
|
+
}
|
|
227
|
+
else if (error.message.includes('fetch')) {
|
|
228
|
+
errorMessage = 'Network error - check connection';
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
errorMessage = error.message;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Default to idle on error
|
|
235
|
+
this.paneStatuses.set(paneId, 'idle');
|
|
236
|
+
this.emit('status-updated', {
|
|
237
|
+
paneId,
|
|
238
|
+
status: 'idle',
|
|
239
|
+
previousStatus: 'analyzing',
|
|
240
|
+
analyzerError: errorMessage
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
finally {
|
|
244
|
+
this.llmRequests.delete(paneId);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Cancel LLM request for a pane
|
|
249
|
+
*/
|
|
250
|
+
cancelLLMRequest(paneId) {
|
|
251
|
+
const controller = this.llmRequests.get(paneId);
|
|
252
|
+
if (controller) {
|
|
253
|
+
controller.abort();
|
|
254
|
+
this.llmRequests.delete(paneId);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Handle autopilot: automatically accept options when enabled and no risk
|
|
259
|
+
*/
|
|
260
|
+
async handleAutopilot(paneId, analysis, finalStatus) {
|
|
261
|
+
// Only proceed if status is 'waiting' (option dialog detected)
|
|
262
|
+
if (finalStatus !== 'waiting')
|
|
263
|
+
return;
|
|
264
|
+
// Get pane data to check autopilot setting
|
|
265
|
+
const stateManager = StateManager.getInstance();
|
|
266
|
+
const pane = stateManager.getPaneById(paneId);
|
|
267
|
+
if (!pane || !pane.autopilot)
|
|
268
|
+
return;
|
|
269
|
+
// Check if there's a risk - don't auto-accept risky options
|
|
270
|
+
if (analysis.potentialHarm?.hasRisk) {
|
|
271
|
+
console.error(`[Autopilot] Skipping auto-accept for pane ${paneId}: potential harm detected`);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
// Check if we have options
|
|
275
|
+
if (!analysis.options || analysis.options.length === 0) {
|
|
276
|
+
console.error(`[Autopilot] Skipping auto-accept for pane ${paneId}: no options found`);
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
// Get the first option (typically the "accept" or "continue" option)
|
|
280
|
+
const firstOption = analysis.options[0];
|
|
281
|
+
if (!firstOption.keys || firstOption.keys.length === 0) {
|
|
282
|
+
console.error(`[Autopilot] Skipping auto-accept for pane ${paneId}: no keys for first option`);
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
// Send the first key of the first option
|
|
286
|
+
const keyToSend = firstOption.keys[0];
|
|
287
|
+
console.error(`[Autopilot] Auto-accepting option for pane ${paneId}: ${firstOption.action} (key: ${keyToSend})`);
|
|
288
|
+
try {
|
|
289
|
+
// Send the key through the worker manager
|
|
290
|
+
await this.sendKeysToPane(paneId, keyToSend);
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
console.error(`[Autopilot] Failed to send keys for pane ${paneId}:`, error);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Get tmux pane ID for a dmux pane
|
|
298
|
+
*/
|
|
299
|
+
async getTmuxPaneId(paneId) {
|
|
300
|
+
return this.paneIdMap.get(paneId) || null;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Get current status for a pane
|
|
304
|
+
*/
|
|
305
|
+
getStatus(paneId) {
|
|
306
|
+
return this.paneStatuses.get(paneId);
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Get all statuses
|
|
310
|
+
*/
|
|
311
|
+
getAllStatuses() {
|
|
312
|
+
return new Map(this.paneStatuses);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Send keys to a pane (future feature)
|
|
316
|
+
*/
|
|
317
|
+
async sendKeysToPane(paneId, keys) {
|
|
318
|
+
return this.workerManager.sendToWorker(paneId, {
|
|
319
|
+
type: 'send-keys',
|
|
320
|
+
timestamp: Date.now(),
|
|
321
|
+
payload: { keys }
|
|
322
|
+
}).then(() => { });
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Resize a pane (future feature)
|
|
326
|
+
*/
|
|
327
|
+
async resizePane(paneId, width, height) {
|
|
328
|
+
return this.workerManager.sendToWorker(paneId, {
|
|
329
|
+
type: 'resize',
|
|
330
|
+
timestamp: Date.now(),
|
|
331
|
+
payload: { width, height }
|
|
332
|
+
}).then(() => { });
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Get statistics
|
|
336
|
+
*/
|
|
337
|
+
getStats() {
|
|
338
|
+
const statusCounts = {
|
|
339
|
+
idle: 0,
|
|
340
|
+
analyzing: 0,
|
|
341
|
+
waiting: 0,
|
|
342
|
+
working: 0
|
|
343
|
+
};
|
|
344
|
+
this.paneStatuses.forEach(status => {
|
|
345
|
+
statusCounts[status]++;
|
|
346
|
+
});
|
|
347
|
+
return {
|
|
348
|
+
workerStats: this.workerManager.getStats(),
|
|
349
|
+
messageBusStats: this.messageBus.getStats(),
|
|
350
|
+
statusCounts,
|
|
351
|
+
llmRequestsInFlight: this.llmRequests.size
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Shutdown the service
|
|
356
|
+
*/
|
|
357
|
+
async shutdown() {
|
|
358
|
+
this.isShuttingDown = true;
|
|
359
|
+
// Cancel all LLM requests
|
|
360
|
+
this.llmRequests.forEach(controller => controller.abort());
|
|
361
|
+
this.llmRequests.clear();
|
|
362
|
+
// Shutdown workers
|
|
363
|
+
await this.workerManager.shutdown();
|
|
364
|
+
// Clean up message bus
|
|
365
|
+
this.messageBus.destroy();
|
|
366
|
+
// Clear state
|
|
367
|
+
this.paneStatuses.clear();
|
|
368
|
+
this.paneIdMap.clear();
|
|
369
|
+
// Remove all listeners
|
|
370
|
+
this.removeAllListeners();
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
// Export singleton instance
|
|
374
|
+
let instance = null;
|
|
375
|
+
export function getStatusDetector() {
|
|
376
|
+
if (!instance) {
|
|
377
|
+
instance = new StatusDetector();
|
|
378
|
+
}
|
|
379
|
+
return instance;
|
|
380
|
+
}
|
|
381
|
+
export function resetStatusDetector() {
|
|
382
|
+
if (instance) {
|
|
383
|
+
instance.shutdown();
|
|
384
|
+
instance = null;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
//# sourceMappingURL=StatusDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusDetector.js","sourceRoot":"","sources":["../../src/services/StatusDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal state diffing and patch generation
|
|
3
|
+
* Tracks virtual terminal state and generates minimal change sets
|
|
4
|
+
*/
|
|
5
|
+
import type { PatchMessage } from '../shared/StreamProtocol.js';
|
|
6
|
+
interface Cell {
|
|
7
|
+
char: string;
|
|
8
|
+
fg?: string;
|
|
9
|
+
bg?: string;
|
|
10
|
+
bold?: boolean;
|
|
11
|
+
dim?: boolean;
|
|
12
|
+
italic?: boolean;
|
|
13
|
+
underline?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Virtual terminal buffer that tracks state
|
|
17
|
+
*/
|
|
18
|
+
export declare class TerminalBuffer {
|
|
19
|
+
private width;
|
|
20
|
+
private height;
|
|
21
|
+
private buffer;
|
|
22
|
+
private cursor;
|
|
23
|
+
private savedCursor?;
|
|
24
|
+
private scrollTop;
|
|
25
|
+
private scrollBottom;
|
|
26
|
+
private currentAttrs;
|
|
27
|
+
constructor(width: number, height: number);
|
|
28
|
+
private createEmptyBuffer;
|
|
29
|
+
/**
|
|
30
|
+
* Apply raw terminal output to buffer
|
|
31
|
+
*/
|
|
32
|
+
applyOutput(output: string): void;
|
|
33
|
+
private writeChar;
|
|
34
|
+
private newLine;
|
|
35
|
+
private carriageReturn;
|
|
36
|
+
private backspace;
|
|
37
|
+
private tab;
|
|
38
|
+
private createEmptyRow;
|
|
39
|
+
private handleEscapeChar;
|
|
40
|
+
private handleCSI;
|
|
41
|
+
private handleOSC;
|
|
42
|
+
private handleEraseDisplay;
|
|
43
|
+
private handleEraseLine;
|
|
44
|
+
private handleSGR;
|
|
45
|
+
private getColorName;
|
|
46
|
+
/**
|
|
47
|
+
* Get current buffer as text
|
|
48
|
+
*/
|
|
49
|
+
getText(): string;
|
|
50
|
+
/**
|
|
51
|
+
* Get buffer for comparison
|
|
52
|
+
*/
|
|
53
|
+
getBuffer(): Cell[][];
|
|
54
|
+
/**
|
|
55
|
+
* Resize buffer
|
|
56
|
+
*/
|
|
57
|
+
resize(width: number, height: number): void;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Generates diffs between terminal states
|
|
61
|
+
*/
|
|
62
|
+
export declare class TerminalDiffer {
|
|
63
|
+
private buffer;
|
|
64
|
+
private lastSentBuffer;
|
|
65
|
+
constructor(width: number, height: number);
|
|
66
|
+
/**
|
|
67
|
+
* Apply output and generate patches
|
|
68
|
+
*/
|
|
69
|
+
applyAndDiff(output: string): PatchMessage['changes'];
|
|
70
|
+
private cellsEqual;
|
|
71
|
+
/**
|
|
72
|
+
* Get full buffer state
|
|
73
|
+
*/
|
|
74
|
+
getFullState(): string;
|
|
75
|
+
/**
|
|
76
|
+
* Reset differ state
|
|
77
|
+
*/
|
|
78
|
+
reset(): void;
|
|
79
|
+
/**
|
|
80
|
+
* Handle terminal resize
|
|
81
|
+
*/
|
|
82
|
+
resize(width: number, height: number): void;
|
|
83
|
+
}
|
|
84
|
+
export {};
|
|
85
|
+
//# sourceMappingURL=TerminalDiffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TerminalDiffer.d.ts","sourceRoot":"","sources":["../../src/services/TerminalDiffer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,UAAU,IAAI;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAkBD;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,WAAW,CAAC,CAAiB;IACrC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,YAAY,CAAS;IAG7B,OAAO,CAAC,YAAY,CAAqB;gBAE7B,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAQzC,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAyEjC,OAAO,CAAC,SAAS;IAcjB,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,GAAG;IAMX,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,SAAS;IAwCjB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,kBAAkB;IAmC1B,OAAO,CAAC,eAAe;IAsBvB,OAAO,CAAC,SAAS;IAmEjB,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACH,OAAO,IAAI,MAAM;IAMjB;;OAEG;IACH,SAAS,IAAI,IAAI,EAAE,EAAE;IAIrB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAsB5C;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,cAAc,CAAyB;gBAEnC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAIzC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC;IAmErD,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAI5C"}
|