dmux 3.5.4 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +69 -4
- package/dist/DmuxApp.js.map +1 -1
- package/dist/actions/implementations/closeAction.js +81 -31
- package/dist/actions/implementations/closeAction.js.map +1 -1
- package/dist/actions/merge/conflictResolution.d.ts.map +1 -1
- package/dist/actions/merge/conflictResolution.js +6 -4
- package/dist/actions/merge/conflictResolution.js.map +1 -1
- package/dist/actions/merge/multiMergeOrchestrator.js +6 -4
- package/dist/actions/merge/multiMergeOrchestrator.js.map +1 -1
- package/dist/components/dialogs/AgentChoiceDialog.d.ts +1 -1
- package/dist/components/dialogs/AgentChoiceDialog.d.ts.map +1 -1
- package/dist/components/dialogs/AgentChoiceDialog.js +3 -2
- package/dist/components/dialogs/AgentChoiceDialog.js.map +1 -1
- package/dist/components/dialogs/TmuxHooksPromptDialog.d.ts +13 -0
- package/dist/components/dialogs/TmuxHooksPromptDialog.d.ts.map +1 -0
- package/dist/components/dialogs/TmuxHooksPromptDialog.js +36 -0
- package/dist/components/dialogs/TmuxHooksPromptDialog.js.map +1 -0
- package/dist/components/panes/MergePane.js +1 -1
- package/dist/components/panes/MergePane.js.map +1 -1
- package/dist/components/panes/PaneCard.d.ts.map +1 -1
- package/dist/components/panes/PaneCard.js +18 -3
- package/dist/components/panes/PaneCard.js.map +1 -1
- package/dist/components/panes/PanesGrid.d.ts.map +1 -1
- package/dist/components/panes/PanesGrid.js +3 -3
- package/dist/components/panes/PanesGrid.js.map +1 -1
- package/dist/components/popups/agentChoicePopup.js +7 -1
- package/dist/components/popups/agentChoicePopup.js.map +1 -1
- package/dist/components/ui/FooterHelp.d.ts.map +1 -1
- package/dist/components/ui/FooterHelp.js +3 -3
- package/dist/components/ui/FooterHelp.js.map +1 -1
- package/dist/hooks/useAgentDetection.d.ts +1 -1
- package/dist/hooks/useAgentDetection.d.ts.map +1 -1
- package/dist/hooks/useAgentDetection.js +27 -0
- package/dist/hooks/useAgentDetection.js.map +1 -1
- package/dist/hooks/usePaneCreation.d.ts +2 -2
- package/dist/hooks/usePaneCreation.d.ts.map +1 -1
- package/dist/hooks/usePaneCreation.js.map +1 -1
- package/dist/hooks/usePaneLoading.d.ts +4 -0
- package/dist/hooks/usePaneLoading.d.ts.map +1 -1
- package/dist/hooks/usePaneLoading.js +33 -9
- package/dist/hooks/usePaneLoading.js.map +1 -1
- package/dist/hooks/usePaneSync.d.ts +4 -0
- package/dist/hooks/usePaneSync.d.ts.map +1 -1
- package/dist/hooks/usePaneSync.js +13 -3
- package/dist/hooks/usePaneSync.js.map +1 -1
- package/dist/hooks/usePanes.d.ts +10 -1
- package/dist/hooks/usePanes.d.ts.map +1 -1
- package/dist/hooks/usePanes.js +65 -13
- package/dist/hooks/usePanes.js.map +1 -1
- package/dist/hooks/useServices.d.ts +2 -2
- package/dist/hooks/useServices.d.ts.map +1 -1
- package/dist/index.js +22 -19
- package/dist/index.js.map +1 -1
- package/dist/layout/SpacerManager.d.ts +3 -0
- package/dist/layout/SpacerManager.d.ts.map +1 -1
- package/dist/layout/SpacerManager.js +27 -3
- package/dist/layout/SpacerManager.js.map +1 -1
- package/dist/server/embedded-assets.d.ts.map +1 -1
- package/dist/server/embedded-assets.js +93 -25
- package/dist/server/embedded-assets.js.map +1 -1
- package/dist/server/routes/panesRoutes.d.ts.map +1 -1
- package/dist/server/routes/panesRoutes.js +32 -5
- package/dist/server/routes/panesRoutes.js.map +1 -1
- package/dist/services/LogService.d.ts +7 -2
- package/dist/services/LogService.d.ts.map +1 -1
- package/dist/services/LogService.js +96 -17
- package/dist/services/LogService.js.map +1 -1
- package/dist/services/PaneAnalyzer.d.ts +35 -1
- package/dist/services/PaneAnalyzer.d.ts.map +1 -1
- package/dist/services/PaneAnalyzer.js +167 -65
- package/dist/services/PaneAnalyzer.js.map +1 -1
- package/dist/services/PaneEventService.d.ts +101 -0
- package/dist/services/PaneEventService.d.ts.map +1 -0
- package/dist/services/PaneEventService.js +246 -0
- package/dist/services/PaneEventService.js.map +1 -0
- package/dist/services/PopupManager.d.ts +3 -3
- package/dist/services/PopupManager.d.ts.map +1 -1
- package/dist/services/PopupManager.js +8 -6
- package/dist/services/PopupManager.js.map +1 -1
- package/dist/services/TmuxHookManager.d.ts +76 -0
- package/dist/services/TmuxHookManager.d.ts.map +1 -0
- package/dist/services/TmuxHookManager.js +229 -0
- package/dist/services/TmuxHookManager.js.map +1 -0
- package/dist/services/TmuxService.d.ts +34 -1
- package/dist/services/TmuxService.d.ts.map +1 -1
- package/dist/services/TmuxService.js +69 -1
- package/dist/services/TmuxService.js.map +1 -1
- package/dist/types.d.ts +3 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/agentDetection.d.ts +5 -1
- package/dist/utils/agentDetection.d.ts.map +1 -1
- package/dist/utils/agentDetection.js +29 -0
- package/dist/utils/agentDetection.js.map +1 -1
- package/dist/utils/conflictResolutionPane.d.ts +1 -1
- package/dist/utils/conflictResolutionPane.d.ts.map +1 -1
- package/dist/utils/conflictResolutionPane.js +12 -2
- package/dist/utils/conflictResolutionPane.js.map +1 -1
- package/dist/utils/execAsync.d.ts +78 -0
- package/dist/utils/execAsync.d.ts.map +1 -0
- package/dist/utils/execAsync.js +141 -0
- package/dist/utils/execAsync.js.map +1 -0
- package/dist/utils/generated-agents-doc.d.ts +1 -1
- package/dist/utils/generated-agents-doc.js +1 -1
- package/dist/utils/git.d.ts +27 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +150 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/hooksDocs.d.ts +1 -1
- package/dist/utils/layoutManager.d.ts.map +1 -1
- package/dist/utils/layoutManager.js +51 -3
- package/dist/utils/layoutManager.js.map +1 -1
- package/dist/utils/paneCapture.d.ts +11 -0
- package/dist/utils/paneCapture.d.ts.map +1 -1
- package/dist/utils/paneCapture.js +69 -0
- package/dist/utils/paneCapture.js.map +1 -1
- package/dist/utils/paneCreation.d.ts +2 -2
- package/dist/utils/paneCreation.d.ts.map +1 -1
- package/dist/utils/paneCreation.js +18 -3
- package/dist/utils/paneCreation.js.map +1 -1
- package/dist/utils/reopenWorktree.d.ts.map +1 -1
- package/dist/utils/reopenWorktree.js +28 -5
- package/dist/utils/reopenWorktree.js.map +1 -1
- package/dist/utils/settingsManager.d.ts.map +1 -1
- package/dist/utils/settingsManager.js +7 -0
- package/dist/utils/settingsManager.js.map +1 -1
- package/dist/utils/systemCheck.d.ts.map +1 -1
- package/dist/utils/systemCheck.js +7 -5
- package/dist/utils/systemCheck.js.map +1 -1
- package/dist/workers/PaneWorker.js.map +1 -1
- package/dist/workers/WorkerMessages.d.ts +1 -1
- package/dist/workers/WorkerMessages.d.ts.map +1 -1
- package/dist/workers/panePollingWorker.d.ts +13 -0
- package/dist/workers/panePollingWorker.d.ts.map +1 -0
- package/dist/workers/panePollingWorker.js +129 -0
- package/dist/workers/panePollingWorker.js.map +1 -0
- package/package.json +1 -1
|
@@ -5,16 +5,98 @@
|
|
|
5
5
|
* that can be viewed in a dedicated UI without messing up pane formatting.
|
|
6
6
|
*/
|
|
7
7
|
import { EventEmitter } from 'events';
|
|
8
|
+
/**
|
|
9
|
+
* Efficient circular buffer for log entries
|
|
10
|
+
* Provides O(1) insertion and bounded memory usage
|
|
11
|
+
*/
|
|
12
|
+
class CircularBuffer {
|
|
13
|
+
capacity;
|
|
14
|
+
buffer;
|
|
15
|
+
head = 0; // Next write position
|
|
16
|
+
size = 0; // Current number of items
|
|
17
|
+
constructor(capacity) {
|
|
18
|
+
this.capacity = capacity;
|
|
19
|
+
this.buffer = new Array(capacity);
|
|
20
|
+
}
|
|
21
|
+
push(item) {
|
|
22
|
+
this.buffer[this.head] = item;
|
|
23
|
+
this.head = (this.head + 1) % this.capacity;
|
|
24
|
+
if (this.size < this.capacity) {
|
|
25
|
+
this.size++;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get all items in order (oldest to newest)
|
|
30
|
+
*/
|
|
31
|
+
toArray() {
|
|
32
|
+
if (this.size === 0)
|
|
33
|
+
return [];
|
|
34
|
+
const result = [];
|
|
35
|
+
const start = this.size < this.capacity ? 0 : this.head;
|
|
36
|
+
for (let i = 0; i < this.size; i++) {
|
|
37
|
+
const idx = (start + i) % this.capacity;
|
|
38
|
+
const item = this.buffer[idx];
|
|
39
|
+
if (item !== undefined) {
|
|
40
|
+
result.push(item);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Filter items matching a predicate
|
|
47
|
+
*/
|
|
48
|
+
filter(predicate) {
|
|
49
|
+
return this.toArray().filter(predicate);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Find and modify items in place
|
|
53
|
+
*/
|
|
54
|
+
forEach(fn) {
|
|
55
|
+
for (let i = 0; i < this.capacity; i++) {
|
|
56
|
+
const item = this.buffer[i];
|
|
57
|
+
if (item !== undefined) {
|
|
58
|
+
fn(item);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
getSize() {
|
|
63
|
+
return this.size;
|
|
64
|
+
}
|
|
65
|
+
clear() {
|
|
66
|
+
this.buffer = new Array(this.capacity);
|
|
67
|
+
this.head = 0;
|
|
68
|
+
this.size = 0;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Remove items matching predicate (creates new buffer - O(n))
|
|
72
|
+
* Used for clearForPane which is rare
|
|
73
|
+
*/
|
|
74
|
+
removeMatching(predicate) {
|
|
75
|
+
const kept = this.filter(item => !predicate(item));
|
|
76
|
+
const removed = this.size - kept.length;
|
|
77
|
+
if (removed > 0) {
|
|
78
|
+
this.clear();
|
|
79
|
+
kept.forEach(item => this.push(item));
|
|
80
|
+
}
|
|
81
|
+
return removed;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
8
84
|
/**
|
|
9
85
|
* LogService singleton - central logging hub for dmux
|
|
86
|
+
*
|
|
87
|
+
* Performance optimizations:
|
|
88
|
+
* - Uses circular buffer for O(1) log insertion
|
|
89
|
+
* - Bounded memory usage (1000 entries max)
|
|
90
|
+
* - No array shifting on overflow
|
|
10
91
|
*/
|
|
11
92
|
export class LogService extends EventEmitter {
|
|
12
93
|
static instance;
|
|
13
|
-
logs
|
|
94
|
+
logs;
|
|
14
95
|
maxLogs = 1000; // Circular buffer size
|
|
15
96
|
logCounter = 0;
|
|
16
97
|
constructor() {
|
|
17
98
|
super();
|
|
99
|
+
this.logs = new CircularBuffer(this.maxLogs);
|
|
18
100
|
}
|
|
19
101
|
static getInstance() {
|
|
20
102
|
if (!LogService.instance) {
|
|
@@ -30,7 +112,7 @@ export class LogService extends EventEmitter {
|
|
|
30
112
|
this.suppressConsole = suppress;
|
|
31
113
|
}
|
|
32
114
|
/**
|
|
33
|
-
* Add a log entry
|
|
115
|
+
* Add a log entry (O(1) operation with circular buffer)
|
|
34
116
|
*/
|
|
35
117
|
addLog(level, message, source, paneId, stack) {
|
|
36
118
|
const entry = {
|
|
@@ -43,11 +125,8 @@ export class LogService extends EventEmitter {
|
|
|
43
125
|
read: false,
|
|
44
126
|
stack,
|
|
45
127
|
};
|
|
128
|
+
// O(1) insertion - circular buffer handles overflow automatically
|
|
46
129
|
this.logs.push(entry);
|
|
47
|
-
// Maintain circular buffer - remove oldest logs when limit exceeded
|
|
48
|
-
if (this.logs.length > this.maxLogs) {
|
|
49
|
-
this.logs.shift();
|
|
50
|
-
}
|
|
51
130
|
// Emit event for listeners (StateManager will pick this up)
|
|
52
131
|
this.emit('log-added', entry);
|
|
53
132
|
// Also log to console for development (can be disabled in production)
|
|
@@ -99,7 +178,7 @@ export class LogService extends EventEmitter {
|
|
|
99
178
|
* Get all logs with optional filtering
|
|
100
179
|
*/
|
|
101
180
|
getLogs(filter) {
|
|
102
|
-
let filtered =
|
|
181
|
+
let filtered = this.logs.toArray();
|
|
103
182
|
if (filter) {
|
|
104
183
|
if (filter.level) {
|
|
105
184
|
const levels = Array.isArray(filter.level) ? filter.level : [filter.level];
|
|
@@ -170,28 +249,28 @@ export class LogService extends EventEmitter {
|
|
|
170
249
|
* Clear all logs
|
|
171
250
|
*/
|
|
172
251
|
clearAll() {
|
|
173
|
-
this.logs
|
|
252
|
+
this.logs.clear();
|
|
174
253
|
this.emit('logs-cleared');
|
|
175
254
|
}
|
|
176
255
|
/**
|
|
177
256
|
* Clear logs for a specific pane
|
|
178
257
|
*/
|
|
179
258
|
clearForPane(paneId) {
|
|
180
|
-
const before = this.logs.
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
this.emit('logs-cleared', { paneId, count: before - after });
|
|
259
|
+
const before = this.logs.getSize();
|
|
260
|
+
const removed = this.logs.removeMatching(log => log.paneId === paneId);
|
|
261
|
+
if (removed > 0) {
|
|
262
|
+
this.emit('logs-cleared', { paneId, count: removed });
|
|
185
263
|
}
|
|
186
264
|
}
|
|
187
265
|
/**
|
|
188
266
|
* Get summary stats
|
|
189
267
|
*/
|
|
190
268
|
getStats() {
|
|
269
|
+
const allLogs = this.logs.toArray();
|
|
191
270
|
return {
|
|
192
|
-
total:
|
|
193
|
-
errors:
|
|
194
|
-
warnings:
|
|
271
|
+
total: allLogs.length,
|
|
272
|
+
errors: allLogs.filter(l => l.level === 'error').length,
|
|
273
|
+
warnings: allLogs.filter(l => l.level === 'warn').length,
|
|
195
274
|
unreadErrors: this.getUnreadErrorCount(),
|
|
196
275
|
unreadWarnings: this.getUnreadWarningCount(),
|
|
197
276
|
};
|
|
@@ -200,7 +279,7 @@ export class LogService extends EventEmitter {
|
|
|
200
279
|
* Reset the service (for testing)
|
|
201
280
|
*/
|
|
202
281
|
reset() {
|
|
203
|
-
this.logs
|
|
282
|
+
this.logs.clear();
|
|
204
283
|
this.logCounter = 0;
|
|
205
284
|
this.removeAllListeners();
|
|
206
285
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogService.js","sourceRoot":"","sources":["../../src/services/LogService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAetC;;
|
|
1
|
+
{"version":3,"file":"LogService.js","sourceRoot":"","sources":["../../src/services/LogService.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,9 +16,37 @@ export interface PaneAnalysis {
|
|
|
16
16
|
export declare class PaneAnalyzer {
|
|
17
17
|
private apiKey;
|
|
18
18
|
private modelStack;
|
|
19
|
+
private cache;
|
|
20
|
+
private readonly CACHE_TTL;
|
|
21
|
+
private readonly MAX_CACHE_SIZE;
|
|
22
|
+
private pendingRequests;
|
|
19
23
|
constructor();
|
|
20
24
|
/**
|
|
21
|
-
*
|
|
25
|
+
* Hash content for cache key
|
|
26
|
+
*/
|
|
27
|
+
private hashContent;
|
|
28
|
+
/**
|
|
29
|
+
* Get cached result if still valid
|
|
30
|
+
*/
|
|
31
|
+
private getCached;
|
|
32
|
+
/**
|
|
33
|
+
* Store result in cache with LRU eviction
|
|
34
|
+
*/
|
|
35
|
+
private setCache;
|
|
36
|
+
/**
|
|
37
|
+
* Clear all cache entries (useful for testing)
|
|
38
|
+
*/
|
|
39
|
+
clearCache(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Make a single API request to a specific model
|
|
42
|
+
*/
|
|
43
|
+
private tryModel;
|
|
44
|
+
/**
|
|
45
|
+
* Makes a request to OpenRouter API with PARALLEL model fallback
|
|
46
|
+
* Uses Promise.any to race all models - first success wins
|
|
47
|
+
*
|
|
48
|
+
* Performance improvement: Previously could take 6+ seconds if models failed sequentially.
|
|
49
|
+
* Now returns as soon as ANY model responds successfully (typically <1s).
|
|
22
50
|
*/
|
|
23
51
|
private makeRequestWithFallback;
|
|
24
52
|
/**
|
|
@@ -39,8 +67,14 @@ export declare class PaneAnalyzer {
|
|
|
39
67
|
* Stage 3: Extract summary when state is open_prompt (idle)
|
|
40
68
|
*/
|
|
41
69
|
extractSummary(content: string, signal?: AbortSignal): Promise<string | undefined>;
|
|
70
|
+
/**
|
|
71
|
+
* Internal analysis implementation (no caching/deduplication)
|
|
72
|
+
*/
|
|
73
|
+
private doAnalyzePane;
|
|
42
74
|
/**
|
|
43
75
|
* Main analysis function that captures and analyzes a pane
|
|
76
|
+
* Includes caching and request deduplication for performance.
|
|
77
|
+
*
|
|
44
78
|
* @param tmuxPaneId - The tmux pane ID (e.g., "%38")
|
|
45
79
|
* @param signal - Optional abort signal
|
|
46
80
|
* @param dmuxPaneId - Optional dmux pane ID for friendly logging (e.g., "dmux-123")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaneAnalyzer.d.ts","sourceRoot":"","sources":["../../src/services/PaneAnalyzer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PaneAnalyzer.d.ts","sourceRoot":"","sources":["../../src/services/PaneAnalyzer.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,SAAS,GAAG,eAAe,GAAG,aAAa,GAAG,aAAa,CAAC;AAGxE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;IACH,aAAa,CAAC,EAAE;QACd,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAOD,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAIhB;IAGF,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAO;IAGtC,OAAO,CAAC,eAAe,CAA4C;;IAMnE;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,SAAS;IAYjB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAShB;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;YACW,QAAQ;IAoCtB;;;;;;OAMG;YACW,uBAAuB;IA6CrC;;;;;OAKG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IA0ElG;;;;;OAKG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IA4FpH;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IA2CxF;;OAEG;YACW,aAAa;IAyC3B;;;;;;;OAOG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAgExG"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
1
2
|
import { capturePaneContent } from '../utils/paneCapture.js';
|
|
2
3
|
import { LogService } from './LogService.js';
|
|
3
4
|
export class PaneAnalyzer {
|
|
@@ -7,55 +8,121 @@ export class PaneAnalyzer {
|
|
|
7
8
|
'x-ai/grok-4-fast:free',
|
|
8
9
|
'openai/gpt-4o-mini'
|
|
9
10
|
];
|
|
11
|
+
// Content-hash based cache to avoid repeated API calls for identical content
|
|
12
|
+
cache = new Map();
|
|
13
|
+
CACHE_TTL = 5000; // 5 seconds TTL
|
|
14
|
+
MAX_CACHE_SIZE = 100; // Prevent unbounded growth
|
|
15
|
+
// Request deduplication - prevent multiple concurrent requests for same pane
|
|
16
|
+
pendingRequests = new Map();
|
|
10
17
|
constructor() {
|
|
11
18
|
this.apiKey = process.env.OPENROUTER_API_KEY || '';
|
|
12
19
|
}
|
|
13
20
|
/**
|
|
14
|
-
*
|
|
21
|
+
* Hash content for cache key
|
|
22
|
+
*/
|
|
23
|
+
hashContent(content) {
|
|
24
|
+
return createHash('md5').update(content).digest('hex');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get cached result if still valid
|
|
28
|
+
*/
|
|
29
|
+
getCached(hash) {
|
|
30
|
+
const entry = this.cache.get(hash);
|
|
31
|
+
if (entry && Date.now() - entry.timestamp < this.CACHE_TTL) {
|
|
32
|
+
return entry.result;
|
|
33
|
+
}
|
|
34
|
+
// Clean up expired entry
|
|
35
|
+
if (entry) {
|
|
36
|
+
this.cache.delete(hash);
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Store result in cache with LRU eviction
|
|
42
|
+
*/
|
|
43
|
+
setCache(hash, result) {
|
|
44
|
+
// Evict oldest entries if cache is full
|
|
45
|
+
if (this.cache.size >= this.MAX_CACHE_SIZE) {
|
|
46
|
+
const oldest = this.cache.keys().next().value;
|
|
47
|
+
if (oldest)
|
|
48
|
+
this.cache.delete(oldest);
|
|
49
|
+
}
|
|
50
|
+
this.cache.set(hash, { result, timestamp: Date.now() });
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Clear all cache entries (useful for testing)
|
|
54
|
+
*/
|
|
55
|
+
clearCache() {
|
|
56
|
+
this.cache.clear();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Make a single API request to a specific model
|
|
60
|
+
*/
|
|
61
|
+
async tryModel(model, systemPrompt, userPrompt, maxTokens, signal) {
|
|
62
|
+
const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
|
|
63
|
+
method: 'POST',
|
|
64
|
+
headers: {
|
|
65
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
66
|
+
'Content-Type': 'application/json',
|
|
67
|
+
'HTTP-Referer': 'https://github.com/dmux/dmux',
|
|
68
|
+
'X-Title': 'dmux',
|
|
69
|
+
},
|
|
70
|
+
body: JSON.stringify({
|
|
71
|
+
model,
|
|
72
|
+
messages: [
|
|
73
|
+
{ role: 'system', content: systemPrompt },
|
|
74
|
+
{ role: 'user', content: userPrompt }
|
|
75
|
+
],
|
|
76
|
+
temperature: 0.1,
|
|
77
|
+
max_tokens: maxTokens,
|
|
78
|
+
response_format: { type: 'json_object' },
|
|
79
|
+
}),
|
|
80
|
+
signal
|
|
81
|
+
});
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
const errorText = await response.text();
|
|
84
|
+
throw new Error(`API error (${model}): ${response.status} ${errorText}`);
|
|
85
|
+
}
|
|
86
|
+
return response.json();
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Makes a request to OpenRouter API with PARALLEL model fallback
|
|
90
|
+
* Uses Promise.any to race all models - first success wins
|
|
91
|
+
*
|
|
92
|
+
* Performance improvement: Previously could take 6+ seconds if models failed sequentially.
|
|
93
|
+
* Now returns as soon as ANY model responds successfully (typically <1s).
|
|
15
94
|
*/
|
|
16
95
|
async makeRequestWithFallback(systemPrompt, userPrompt, maxTokens, signal) {
|
|
17
96
|
if (!this.apiKey) {
|
|
18
97
|
throw new Error('API key not available');
|
|
19
98
|
}
|
|
20
|
-
|
|
21
|
-
//
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
model,
|
|
34
|
-
messages: [
|
|
35
|
-
{ role: 'system', content: systemPrompt },
|
|
36
|
-
{ role: 'user', content: userPrompt }
|
|
37
|
-
],
|
|
38
|
-
temperature: 0.1,
|
|
39
|
-
max_tokens: maxTokens,
|
|
40
|
-
response_format: { type: 'json_object' },
|
|
41
|
-
}),
|
|
42
|
-
signal
|
|
43
|
-
});
|
|
44
|
-
if (!response.ok) {
|
|
45
|
-
const errorText = await response.text();
|
|
46
|
-
throw new Error(`API error (${model}): ${response.status} ${errorText}`);
|
|
47
|
-
}
|
|
48
|
-
const data = await response.json();
|
|
99
|
+
const logService = LogService.getInstance();
|
|
100
|
+
// Create an AbortController with timeout
|
|
101
|
+
const controller = new AbortController();
|
|
102
|
+
const timeoutId = setTimeout(() => controller.abort(), 10000); // 10s total timeout
|
|
103
|
+
// Combine external signal with our timeout
|
|
104
|
+
const combinedSignal = signal
|
|
105
|
+
? AbortSignal.any([signal, controller.signal])
|
|
106
|
+
: controller.signal;
|
|
107
|
+
try {
|
|
108
|
+
// Race all models in parallel - first success wins
|
|
109
|
+
const result = await Promise.any(this.modelStack.map(model => this.tryModel(model, systemPrompt, userPrompt, maxTokens, combinedSignal)
|
|
110
|
+
.then(data => {
|
|
111
|
+
logService.debug(`PaneAnalyzer: Model ${model} succeeded`, 'paneAnalyzer');
|
|
49
112
|
return data;
|
|
113
|
+
})));
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
if (error instanceof AggregateError) {
|
|
118
|
+
// All models failed - throw the first error for context
|
|
119
|
+
throw error.errors[0] || new Error('All models in fallback stack failed');
|
|
50
120
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
clearTimeout(timeoutId);
|
|
56
125
|
}
|
|
57
|
-
// All models failed
|
|
58
|
-
throw lastError || new Error('All models in fallback stack failed');
|
|
59
126
|
}
|
|
60
127
|
/**
|
|
61
128
|
* Stage 1: Determines the state of the pane
|
|
@@ -244,8 +311,44 @@ If there's no meaningful content or the output is unclear, return an empty summa
|
|
|
244
311
|
return undefined;
|
|
245
312
|
}
|
|
246
313
|
}
|
|
314
|
+
/**
|
|
315
|
+
* Internal analysis implementation (no caching/deduplication)
|
|
316
|
+
*/
|
|
317
|
+
async doAnalyzePane(tmuxPaneId, content, paneName, dmuxPaneId, signal) {
|
|
318
|
+
const logService = LogService.getInstance();
|
|
319
|
+
try {
|
|
320
|
+
// Stage 1: Determine the state
|
|
321
|
+
const state = await this.determineState(content, signal, paneName);
|
|
322
|
+
// If it's an option dialog, extract option details
|
|
323
|
+
if (state === 'option_dialog') {
|
|
324
|
+
logService.debug(`PaneAnalyzer: Detected option_dialog for "${paneName}", extracting options...`, 'paneAnalyzer', dmuxPaneId);
|
|
325
|
+
const optionDetails = await this.extractOptions(content, signal, paneName);
|
|
326
|
+
return {
|
|
327
|
+
state,
|
|
328
|
+
...optionDetails
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
// If it's open_prompt (idle), extract summary
|
|
332
|
+
if (state === 'open_prompt') {
|
|
333
|
+
logService.debug(`PaneAnalyzer: Detected open_prompt for "${paneName}", extracting summary...`, 'paneAnalyzer', dmuxPaneId);
|
|
334
|
+
const summary = await this.extractSummary(content, signal);
|
|
335
|
+
return {
|
|
336
|
+
state,
|
|
337
|
+
summary
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
// Otherwise just return the state (in_progress)
|
|
341
|
+
return { state };
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
logService.error(`PaneAnalyzer: Analysis failed for "${paneName}": ${error}`, 'paneAnalyzer', dmuxPaneId, error instanceof Error ? error : undefined);
|
|
345
|
+
throw error;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
247
348
|
/**
|
|
248
349
|
* Main analysis function that captures and analyzes a pane
|
|
350
|
+
* Includes caching and request deduplication for performance.
|
|
351
|
+
*
|
|
249
352
|
* @param tmuxPaneId - The tmux pane ID (e.g., "%38")
|
|
250
353
|
* @param signal - Optional abort signal
|
|
251
354
|
* @param dmuxPaneId - Optional dmux pane ID for friendly logging (e.g., "dmux-123")
|
|
@@ -272,37 +375,36 @@ If there's no meaningful content or the output is unclear, return an empty summa
|
|
|
272
375
|
logService.debug(`PaneAnalyzer: No content captured for "${paneName}", defaulting to in_progress`, 'paneAnalyzer', dmuxPaneId);
|
|
273
376
|
return { state: 'in_progress' };
|
|
274
377
|
}
|
|
378
|
+
// Check cache first
|
|
379
|
+
const contentHash = this.hashContent(content);
|
|
380
|
+
const cached = this.getCached(contentHash);
|
|
381
|
+
if (cached) {
|
|
382
|
+
logService.debug(`PaneAnalyzer: Cache hit for "${paneName}"`, 'paneAnalyzer', dmuxPaneId);
|
|
383
|
+
return cached;
|
|
384
|
+
}
|
|
385
|
+
// Check for pending request (deduplication)
|
|
386
|
+
const pendingKey = `${tmuxPaneId}:${contentHash}`;
|
|
387
|
+
if (this.pendingRequests.has(pendingKey)) {
|
|
388
|
+
logService.debug(`PaneAnalyzer: Deduplicating request for "${paneName}"`, 'paneAnalyzer', dmuxPaneId);
|
|
389
|
+
return this.pendingRequests.get(pendingKey);
|
|
390
|
+
}
|
|
391
|
+
// Start new analysis
|
|
392
|
+
const analysisPromise = this.doAnalyzePane(tmuxPaneId, content, paneName, dmuxPaneId, signal)
|
|
393
|
+
.then(result => {
|
|
394
|
+
// Cache successful result
|
|
395
|
+
this.setCache(contentHash, result);
|
|
396
|
+
logService.debug(`PaneAnalyzer: Analysis complete for "${paneName}": ${result.state}`, 'paneAnalyzer', dmuxPaneId);
|
|
397
|
+
return result;
|
|
398
|
+
})
|
|
399
|
+
.finally(() => {
|
|
400
|
+
// Clean up pending request
|
|
401
|
+
this.pendingRequests.delete(pendingKey);
|
|
402
|
+
});
|
|
403
|
+
this.pendingRequests.set(pendingKey, analysisPromise);
|
|
275
404
|
try {
|
|
276
|
-
|
|
277
|
-
const state = await this.determineState(content, signal, paneName);
|
|
278
|
-
// If it's an option dialog, extract option details
|
|
279
|
-
if (state === 'option_dialog') {
|
|
280
|
-
logService.debug(`PaneAnalyzer: Detected option_dialog for "${paneName}", extracting options...`, 'paneAnalyzer', dmuxPaneId);
|
|
281
|
-
const optionDetails = await this.extractOptions(content, signal, paneName);
|
|
282
|
-
const analysis = {
|
|
283
|
-
state,
|
|
284
|
-
...optionDetails
|
|
285
|
-
};
|
|
286
|
-
logService.info(`PaneAnalyzer: Analysis complete for "${paneName}": option_dialog with ${analysis.options?.length || 0} options` +
|
|
287
|
-
(analysis.potentialHarm?.hasRisk ? ' (RISK DETECTED)' : ''), 'paneAnalyzer', dmuxPaneId);
|
|
288
|
-
return analysis;
|
|
289
|
-
}
|
|
290
|
-
// If it's open_prompt (idle), extract summary
|
|
291
|
-
if (state === 'open_prompt') {
|
|
292
|
-
logService.debug(`PaneAnalyzer: Detected open_prompt for "${paneName}", extracting summary...`, 'paneAnalyzer', dmuxPaneId);
|
|
293
|
-
const summary = await this.extractSummary(content, signal);
|
|
294
|
-
logService.debug(`PaneAnalyzer: Analysis complete for "${paneName}": open_prompt${summary ? ` (summary: ${summary.substring(0, 50)}...)` : ''}`, 'paneAnalyzer', dmuxPaneId);
|
|
295
|
-
return {
|
|
296
|
-
state,
|
|
297
|
-
summary
|
|
298
|
-
};
|
|
299
|
-
}
|
|
300
|
-
// Otherwise just return the state (in_progress)
|
|
301
|
-
logService.debug(`PaneAnalyzer: Analysis complete for "${paneName}": in_progress`, 'paneAnalyzer', dmuxPaneId);
|
|
302
|
-
return { state };
|
|
405
|
+
return await analysisPromise;
|
|
303
406
|
}
|
|
304
407
|
catch (error) {
|
|
305
|
-
logService.error(`PaneAnalyzer: Analysis failed for "${paneName}": ${error}`, 'paneAnalyzer', dmuxPaneId, error instanceof Error ? error : undefined);
|
|
306
408
|
// All models failed or other error occurred
|
|
307
409
|
// Return open_prompt as fallback (idle state) and let error be handled by caller
|
|
308
410
|
throw error;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaneAnalyzer.js","sourceRoot":"","sources":["../../src/services/PaneAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAqB7C,MAAM,OAAO,YAAY;IACf,MAAM,CAAS;IACf,UAAU,GAAa;QAC7B,yBAAyB;QACzB,uBAAuB;QACvB,oBAAoB;KACrB,CAAC;IAEF;QACE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;IACrD,CAAC;IAGD;;OAEG;IACK,KAAK,CAAC,uBAAuB,CACnC,YAAoB,EACpB,UAAkB,EAClB,SAAiB,EACjB,MAAoB;QAEpB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,SAAS,GAAiB,IAAI,CAAC;QAEnC,8BAA8B;QAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,+CAA+C,EAAE;oBAC5E,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;wBACxC,cAAc,EAAE,kBAAkB;wBAClC,cAAc,EAAE,8BAA8B;wBAC9C,SAAS,EAAE,MAAM;qBAClB;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,KAAK;wBACL,QAAQ,EAAE;4BACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;4BACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE;yBACtC;wBACD,WAAW,EAAE,GAAG;wBAChB,UAAU,EAAE,SAAS;wBACrB,eAAe,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;qBACzC,CAAC;oBACF,MAAM;iBACP,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACxC,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,MAAM,QAAQ,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;gBAC3E,CAAC;gBAED,MAAM,IAAI,GAAQ,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAc,CAAC;gBAC3B,kCAAkC;gBAClC,SAAS;YACX,CAAC;QACH,CAAC;QAED,oBAAoB;QACpB,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACtE,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,MAAoB,EAAE,QAAiB;QAC3E,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QAE5C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,kBAAkB;YAClB,UAAU,CAAC,KAAK,CAAC,gEAAgE,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;YACzI,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CAkCmB,CAAC;QAEzC,IAAI,CAAC;YACH,UAAU,CAAC,KAAK,CAAC,+CAA+C,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;YAExH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAC7C,YAAY,EACZ,4EAA4E,OAAO,EAAE,EACrF,EAAE,EACF,MAAM,CACP,CAAC;YAEF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC;YACvE,UAAU,CAAC,KAAK,CAAC,qDAAqD,QAAQ,CAAC,CAAC,CAAC,MAAM,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;YAEvJ,qBAAqB;YACrB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,IAAI,KAAK,KAAK,eAAe,IAAI,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;gBACpF,UAAU,CAAC,KAAK,CAAC,iCAAiC,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,EAAE,EAAE,cAAc,CAAC,CAAC;gBACpH,OAAO,KAAK,CAAC;YACf,CAAC;YAED,UAAU,CAAC,KAAK,CAAC,uCAAuC,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,8BAA8B,EAAE,cAAc,CAAC,CAAC;YACtJ,OAAO,aAAa,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,KAAK,CAAC,0CAA0C,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACpL,kEAAkE;YAClE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,MAAoB,EAAE,QAAiB;QAC3E,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QAE5C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,UAAU,CAAC,KAAK,CAAC,uDAAuD,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;YAChI,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CvB,CAAC;QAEC,IAAI,CAAC;YACH,UAAU,CAAC,KAAK,CAAC,8CAA8C,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;YAEvH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAC7C,YAAY,EACZ,sEAAsE,OAAO,EAAE,EAC/E,GAAG,EACH,MAAM,CACP,CAAC;YAEF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC;YACvE,UAAU,CAAC,KAAK,CAAC,oDAAoD,QAAQ,CAAC,CAAC,CAAC,MAAM,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;YAEtJ,MAAM,aAAa,GAAG;gBACpB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;oBAC1C,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;oBACrD,WAAW,EAAE,GAAG,CAAC,WAAW;iBAC7B,CAAC,CAAC;gBACH,aAAa,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;oBACrC,OAAO,EAAE,MAAM,CAAC,cAAc,CAAC,QAAQ;oBACvC,WAAW,EAAE,MAAM,CAAC,cAAc,CAAC,WAAW;iBAC/C,CAAC,CAAC,CAAC,SAAS;aACd,CAAC;YAEF,UAAU,CAAC,KAAK,CACd,2BAA2B,aAAa,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,WAAW,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC9G,CAAC,aAAa,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,aAAa,CAAC,aAAa,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EACnG,cAAc,CACf,CAAC;YAEF,OAAO,aAAa,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,KAAK,CAAC,0CAA0C,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACpL,kEAAkE;YAClE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,MAAoB;QACxD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;oFAmB2D,CAAC;QAEjF,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAC7C,YAAY,EACZ,qDAAqD,OAAO,EAAE,EAC9D,GAAG,EACH,MAAM,CACP,CAAC;YAEF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC;YAEvE,OAAO,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,+CAA+C;YAC/C,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CAAC,UAAkB,EAAE,MAAoB,EAAE,UAAmB;QAC7E,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QAE5C,0DAA0D;QAC1D,IAAI,QAAQ,GAAG,UAAU,CAAC;QAC1B,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,kDAAkD;gBAClD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;gBACnE,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;gBAChE,QAAQ,GAAG,IAAI,EAAE,IAAI,IAAI,UAAU,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ,GAAG,UAAU,CAAC;YACxB,CAAC;QACH,CAAC;QAED,UAAU,CAAC,KAAK,CAAC,wCAAwC,QAAQ,GAAG,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;QAElG,0DAA0D;QAC1D,MAAM,OAAO,GAAG,kBAAkB,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAEnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,UAAU,CAAC,KAAK,CAAC,0CAA0C,QAAQ,8BAA8B,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;YAC/H,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;QAClC,CAAC;QAED,IAAI,CAAC;YACH,+BAA+B;YAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAEnE,mDAAmD;YACnD,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;gBAC9B,UAAU,CAAC,KAAK,CAAC,6CAA6C,QAAQ,0BAA0B,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;gBAC9H,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAC3E,MAAM,QAAQ,GAAG;oBACf,KAAK;oBACL,GAAG,aAAa;iBACjB,CAAC;gBACF,UAAU,CAAC,IAAI,CACb,wCAAwC,QAAQ,yBAAyB,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,UAAU;oBAChH,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,EAC3D,cAAc,EACd,UAAU,CACX,CAAC;gBACF,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,8CAA8C;YAC9C,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;gBAC5B,UAAU,CAAC,KAAK,CAAC,2CAA2C,QAAQ,0BAA0B,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;gBAC5H,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC3D,UAAU,CAAC,KAAK,CAAC,wCAAwC,QAAQ,iBAAiB,OAAO,CAAC,CAAC,CAAC,cAAc,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;gBAC7K,OAAO;oBACL,KAAK;oBACL,OAAO;iBACR,CAAC;YACJ,CAAC;YAED,gDAAgD;YAChD,UAAU,CAAC,KAAK,CAAC,wCAAwC,QAAQ,gBAAgB,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;YAC/G,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,KAAK,CAAC,sCAAsC,QAAQ,MAAM,KAAK,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACtJ,4CAA4C;YAC5C,iFAAiF;YACjF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"PaneAnalyzer.js","sourceRoot":"","sources":["../../src/services/PaneAnalyzer.ts"],"names":[],"mappings":"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"}
|