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,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"}