@hexidecibel/companion 0.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 (109) hide show
  1. package/dist/__tests__/task-parser.test.d.ts +2 -0
  2. package/dist/__tests__/task-parser.test.d.ts.map +1 -0
  3. package/dist/__tests__/task-parser.test.js +79 -0
  4. package/dist/__tests__/task-parser.test.js.map +1 -0
  5. package/dist/anthropic-usage.d.ts +5 -0
  6. package/dist/anthropic-usage.d.ts.map +1 -0
  7. package/dist/anthropic-usage.js +112 -0
  8. package/dist/anthropic-usage.js.map +1 -0
  9. package/dist/cert-generator.d.ts +15 -0
  10. package/dist/cert-generator.d.ts.map +1 -0
  11. package/dist/cert-generator.js +298 -0
  12. package/dist/cert-generator.js.map +1 -0
  13. package/dist/config.d.ts +4 -0
  14. package/dist/config.d.ts.map +1 -0
  15. package/dist/config.js +122 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/encryption.d.ts +28 -0
  18. package/dist/encryption.d.ts.map +1 -0
  19. package/dist/encryption.js +95 -0
  20. package/dist/encryption.js.map +1 -0
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +211 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/input-injector.d.ts +21 -0
  26. package/dist/input-injector.d.ts.map +1 -0
  27. package/dist/input-injector.js +126 -0
  28. package/dist/input-injector.js.map +1 -0
  29. package/dist/mdns.d.ts +11 -0
  30. package/dist/mdns.d.ts.map +1 -0
  31. package/dist/mdns.js +93 -0
  32. package/dist/mdns.js.map +1 -0
  33. package/dist/parser.d.ts +43 -0
  34. package/dist/parser.d.ts.map +1 -0
  35. package/dist/parser.js +800 -0
  36. package/dist/parser.js.map +1 -0
  37. package/dist/push.d.ts +38 -0
  38. package/dist/push.d.ts.map +1 -0
  39. package/dist/push.js +359 -0
  40. package/dist/push.js.map +1 -0
  41. package/dist/qr-server.d.ts +13 -0
  42. package/dist/qr-server.d.ts.map +1 -0
  43. package/dist/qr-server.js +421 -0
  44. package/dist/qr-server.js.map +1 -0
  45. package/dist/scaffold/generator.d.ts +11 -0
  46. package/dist/scaffold/generator.d.ts.map +1 -0
  47. package/dist/scaffold/generator.js +206 -0
  48. package/dist/scaffold/generator.js.map +1 -0
  49. package/dist/scaffold/templates/index.d.ts +5 -0
  50. package/dist/scaffold/templates/index.d.ts.map +1 -0
  51. package/dist/scaffold/templates/index.js +22 -0
  52. package/dist/scaffold/templates/index.js.map +1 -0
  53. package/dist/scaffold/templates/node-express.d.ts +3 -0
  54. package/dist/scaffold/templates/node-express.d.ts.map +1 -0
  55. package/dist/scaffold/templates/node-express.js +218 -0
  56. package/dist/scaffold/templates/node-express.js.map +1 -0
  57. package/dist/scaffold/templates/python-fastapi.d.ts +3 -0
  58. package/dist/scaffold/templates/python-fastapi.d.ts.map +1 -0
  59. package/dist/scaffold/templates/python-fastapi.js +302 -0
  60. package/dist/scaffold/templates/python-fastapi.js.map +1 -0
  61. package/dist/scaffold/templates/react-mui-website.d.ts +3 -0
  62. package/dist/scaffold/templates/react-mui-website.d.ts.map +1 -0
  63. package/dist/scaffold/templates/react-mui-website.js +405 -0
  64. package/dist/scaffold/templates/react-mui-website.js.map +1 -0
  65. package/dist/scaffold/templates/react-typescript.d.ts +3 -0
  66. package/dist/scaffold/templates/react-typescript.d.ts.map +1 -0
  67. package/dist/scaffold/templates/react-typescript.js +275 -0
  68. package/dist/scaffold/templates/react-typescript.js.map +1 -0
  69. package/dist/scaffold/types.d.ts +55 -0
  70. package/dist/scaffold/types.d.ts.map +1 -0
  71. package/dist/scaffold/types.js +3 -0
  72. package/dist/scaffold/types.js.map +1 -0
  73. package/dist/subagent-watcher.d.ts +24 -0
  74. package/dist/subagent-watcher.d.ts.map +1 -0
  75. package/dist/subagent-watcher.js +307 -0
  76. package/dist/subagent-watcher.js.map +1 -0
  77. package/dist/tls.d.ts +10 -0
  78. package/dist/tls.d.ts.map +1 -0
  79. package/dist/tls.js +77 -0
  80. package/dist/tls.js.map +1 -0
  81. package/dist/tmux-manager.d.ts +71 -0
  82. package/dist/tmux-manager.d.ts.map +1 -0
  83. package/dist/tmux-manager.js +243 -0
  84. package/dist/tmux-manager.js.map +1 -0
  85. package/dist/tool-config.d.ts +33 -0
  86. package/dist/tool-config.d.ts.map +1 -0
  87. package/dist/tool-config.js +211 -0
  88. package/dist/tool-config.js.map +1 -0
  89. package/dist/types.d.ts +218 -0
  90. package/dist/types.d.ts.map +1 -0
  91. package/dist/types.js +3 -0
  92. package/dist/types.js.map +1 -0
  93. package/dist/watcher.d.ts +63 -0
  94. package/dist/watcher.d.ts.map +1 -0
  95. package/dist/watcher.js +596 -0
  96. package/dist/watcher.js.map +1 -0
  97. package/dist/watcher.test.d.ts +2 -0
  98. package/dist/watcher.test.d.ts.map +1 -0
  99. package/dist/watcher.test.js +110 -0
  100. package/dist/watcher.test.js.map +1 -0
  101. package/dist/websocket.d.ts +62 -0
  102. package/dist/websocket.d.ts.map +1 -0
  103. package/dist/websocket.js +1695 -0
  104. package/dist/websocket.js.map +1 -0
  105. package/package.json +71 -0
  106. package/scripts/build.sh +23 -0
  107. package/scripts/install-remote.sh +18 -0
  108. package/scripts/install.sh +558 -0
  109. package/scripts/uninstall.sh +113 -0
@@ -0,0 +1,596 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SessionWatcher = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const chokidar = __importStar(require("chokidar"));
40
+ const events_1 = require("events");
41
+ const child_process_1 = require("child_process");
42
+ const util_1 = require("util");
43
+ const parser_1 = require("./parser");
44
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
45
+ class SessionWatcher extends events_1.EventEmitter {
46
+ codeHome;
47
+ watcher = null;
48
+ conversations = new Map();
49
+ activeSessionId = null;
50
+ lastMessageCount = 0;
51
+ isWaitingForInput = false;
52
+ initialLoadComplete = false;
53
+ startTime = Date.now();
54
+ tmuxProjectPaths = new Set();
55
+ tmuxFilterEnabled = true;
56
+ debounceTimers = new Map();
57
+ static DEBOUNCE_MS = 150; // Debounce file changes per session
58
+ constructor(codeHome) {
59
+ super();
60
+ this.codeHome = codeHome;
61
+ // Refresh tmux paths periodically
62
+ this.refreshTmuxPaths();
63
+ setInterval(() => this.refreshTmuxPaths(), 5000);
64
+ }
65
+ async refreshTmuxPaths() {
66
+ try {
67
+ // Get list of tmux sessions - only those tagged with COMPANION_APP=1
68
+ // First get all session names, then filter to tagged ones
69
+ const { stdout: sessionList } = await execAsync('tmux list-sessions -F "#{session_name}" 2>/dev/null');
70
+ const sessionNames = sessionList.trim().split('\n').filter(s => s);
71
+ // Check which sessions are tagged as managed by Companion
72
+ const taggedSessions = [];
73
+ for (const name of sessionNames) {
74
+ try {
75
+ const { stdout: envOut } = await execAsync(`tmux show-environment -t "${name}" COMPANION_APP 2>/dev/null`);
76
+ if (envOut.trim().includes('COMPANION_APP=1')) {
77
+ taggedSessions.push(name);
78
+ }
79
+ }
80
+ catch {
81
+ // Not tagged - skip
82
+ }
83
+ }
84
+ // Get pane paths only for tagged sessions
85
+ this.tmuxProjectPaths.clear();
86
+ for (const name of taggedSessions) {
87
+ try {
88
+ const { stdout: paneOut } = await execAsync(`tmux list-panes -t "${name}" -F "#{pane_current_path}" 2>/dev/null`);
89
+ const paths = paneOut.trim().split('\n').filter(p => p);
90
+ for (const p of paths) {
91
+ const projectPath = p.replace(/\//g, '-').replace(/^-/, '-');
92
+ this.tmuxProjectPaths.add(projectPath);
93
+ }
94
+ }
95
+ catch {
96
+ // Session may have been killed between list and pane check
97
+ }
98
+ }
99
+ if (this.tmuxProjectPaths.size > 0) {
100
+ console.log(`Watcher: Tracking ${this.tmuxProjectPaths.size} paths from ${taggedSessions.length} managed session(s)`);
101
+ }
102
+ }
103
+ catch {
104
+ // tmux not running or no sessions
105
+ this.tmuxProjectPaths.clear();
106
+ }
107
+ }
108
+ isFromTmuxSession(filePath) {
109
+ if (!this.tmuxFilterEnabled || this.tmuxProjectPaths.size === 0) {
110
+ return true; // No filtering if disabled or no tmux sessions
111
+ }
112
+ // Extract project path from file path
113
+ // e.g., ~/.claude/projects/-Users-foo-bar/uuid.jsonl -> -Users-foo-bar
114
+ const projectsDir = path.join(this.codeHome, 'projects');
115
+ const relativePath = path.relative(projectsDir, filePath);
116
+ const projectDir = relativePath.split(path.sep)[0];
117
+ return this.tmuxProjectPaths.has(projectDir);
118
+ }
119
+ start() {
120
+ const projectsDir = path.join(this.codeHome, 'projects');
121
+ // Watch for .jsonl files in the projects directory
122
+ const pattern = path.join(projectsDir, '**', '*.jsonl');
123
+ console.log(`Watching for conversations in: ${projectsDir}`);
124
+ this.watcher = chokidar.watch(pattern, {
125
+ persistent: true,
126
+ ignoreInitial: false,
127
+ awaitWriteFinish: {
128
+ stabilityThreshold: 100,
129
+ pollInterval: 50,
130
+ },
131
+ depth: 2,
132
+ usePolling: true,
133
+ interval: 100,
134
+ });
135
+ this.watcher.on('add', (filePath) => this.handleFileChange(filePath));
136
+ this.watcher.on('change', (filePath) => this.handleFileChange(filePath));
137
+ this.watcher.on('error', (error) => {
138
+ console.error('Watcher error:', error);
139
+ this.emit('error', error);
140
+ });
141
+ // Also watch the main directory for any root-level conversation files
142
+ const rootPattern = path.join(this.codeHome, '*.jsonl');
143
+ this.watcher.add(rootPattern);
144
+ }
145
+ stop() {
146
+ if (this.watcher) {
147
+ this.watcher.close();
148
+ this.watcher = null;
149
+ }
150
+ // Clear all debounce timers
151
+ for (const timer of this.debounceTimers.values()) {
152
+ clearTimeout(timer);
153
+ }
154
+ this.debounceTimers.clear();
155
+ }
156
+ handleFileChange(filePath) {
157
+ // Skip subagent files - they're not main conversation sessions
158
+ if (filePath.includes('/subagents/') || filePath.includes('\\subagents\\')) {
159
+ return;
160
+ }
161
+ // Skip conversations not from tmux sessions
162
+ if (!this.isFromTmuxSession(filePath)) {
163
+ return;
164
+ }
165
+ const sessionId = this.generateSessionId(filePath);
166
+ // Skip files outside projects directory (like root history.jsonl)
167
+ if (!sessionId) {
168
+ return;
169
+ }
170
+ // Debounce per session - avoid blocking the event loop with rapid
171
+ // successive file parses when the CLI is actively writing
172
+ const existingTimer = this.debounceTimers.get(sessionId);
173
+ if (existingTimer) {
174
+ clearTimeout(existingTimer);
175
+ }
176
+ this.debounceTimers.set(sessionId, setTimeout(() => {
177
+ this.debounceTimers.delete(sessionId);
178
+ this.processFileChange(filePath, sessionId);
179
+ }, SessionWatcher.DEBOUNCE_MS));
180
+ }
181
+ processFileChange(filePath, sessionId) {
182
+ const stats = fs.statSync(filePath);
183
+ const projectPath = this.extractProjectPath(filePath);
184
+ // Read the file ONCE and share the content
185
+ const content = fs.readFileSync(filePath, 'utf-8');
186
+ // Parse the conversation from content
187
+ const t0 = Date.now();
188
+ const messages = (0, parser_1.parseConversationFile)(filePath, undefined, content);
189
+ const t1 = Date.now();
190
+ const highlights = (0, parser_1.extractHighlights)(messages);
191
+ const t2 = Date.now();
192
+ if (t2 - t0 > 50) {
193
+ console.log(`Watcher: processFileChange parse took ${t1 - t0}ms + highlights ${t2 - t1}ms = ${t2 - t0}ms (${messages.length} msgs) for ${sessionId}`);
194
+ }
195
+ const wasWaiting = this.isWaitingForInput;
196
+ const conversationWaiting = (0, parser_1.detectWaitingForInput)(messages);
197
+ // Get previous tracking state for compaction detection
198
+ const prevTracked = this.conversations.get(sessionId);
199
+ const lastCompactionLine = prevTracked?.lastCompactionLine || 0;
200
+ // Check for compaction events using already-read content
201
+ const sessionName = projectPath.split('/').pop() || sessionId;
202
+ const { event: compactionEvent, lastLine: newCompactionLine } = (0, parser_1.detectCompaction)(filePath, sessionId, sessionName, projectPath, lastCompactionLine, content);
203
+ if (compactionEvent) {
204
+ console.log(`Watcher: Detected compaction in session ${sessionId}`);
205
+ this.emit('compaction', compactionEvent);
206
+ }
207
+ // Extract and cache task summary from already-read content
208
+ let cachedTaskSummary;
209
+ try {
210
+ const tasks = (0, parser_1.extractTasks)(content);
211
+ if (tasks.length > 0) {
212
+ const pending = tasks.filter(t => t.status === 'pending').length;
213
+ const inProgressTasks = tasks.filter(t => t.status === 'in_progress');
214
+ const completed = tasks.filter(t => t.status === 'completed').length;
215
+ cachedTaskSummary = {
216
+ total: tasks.length,
217
+ pending,
218
+ inProgress: inProgressTasks.length,
219
+ completed,
220
+ activeTask: inProgressTasks[0]?.activeForm || inProgressTasks[0]?.subject,
221
+ };
222
+ }
223
+ }
224
+ catch {
225
+ // Silent fail - tasks are optional
226
+ }
227
+ // Track this conversation with cached parse result
228
+ const tracked = {
229
+ path: filePath,
230
+ projectPath,
231
+ lastModified: stats.mtimeMs,
232
+ messageCount: messages.length,
233
+ isWaitingForInput: conversationWaiting,
234
+ lastCompactionLine: newCompactionLine,
235
+ cachedMessages: messages,
236
+ cachedTaskSummary,
237
+ lastEmittedPendingTools: prevTracked?.lastEmittedPendingTools || '',
238
+ };
239
+ this.conversations.set(sessionId, tracked);
240
+ // During initial load (first 3 seconds), always pick the most recent session
241
+ // After that, only auto-select if no active session exists
242
+ const isInitialLoad = Date.now() - this.startTime < 3000;
243
+ if (isInitialLoad || !this.activeSessionId || !this.conversations.has(this.activeSessionId)) {
244
+ // Find most recently active conversation
245
+ let mostRecent = null;
246
+ for (const [id, conv] of this.conversations) {
247
+ if (!mostRecent || conv.lastModified > mostRecent.time) {
248
+ mostRecent = { id, time: conv.lastModified };
249
+ }
250
+ }
251
+ if (mostRecent) {
252
+ this.activeSessionId = mostRecent.id;
253
+ }
254
+ }
255
+ // Update waiting status for the active session
256
+ if (this.activeSessionId) {
257
+ const activeConv = this.conversations.get(this.activeSessionId);
258
+ if (activeConv && sessionId === this.activeSessionId) {
259
+ this.isWaitingForInput = activeConv.isWaitingForInput;
260
+ }
261
+ }
262
+ // Emit for the active session
263
+ if (sessionId === this.activeSessionId) {
264
+ // Emit events
265
+ const hasNewMessages = messages.length !== this.lastMessageCount;
266
+ if (hasNewMessages) {
267
+ this.lastMessageCount = messages.length;
268
+ this.emit('conversation-update', {
269
+ path: filePath,
270
+ sessionId,
271
+ messages,
272
+ highlights,
273
+ });
274
+ }
275
+ // Emit status-change if waiting status changed OR if there's a new message
276
+ const lastMessage = messages[messages.length - 1];
277
+ const currentActivity = (0, parser_1.detectCurrentActivity)(messages);
278
+ if (this.isWaitingForInput !== wasWaiting || hasNewMessages) {
279
+ this.emit('status-change', {
280
+ sessionId,
281
+ isWaitingForInput: this.isWaitingForInput,
282
+ currentActivity,
283
+ lastMessage,
284
+ });
285
+ }
286
+ // Check for pending tools - only emit when the set of pending tools CHANGES
287
+ // to avoid spamming auto-approve on every 100ms file poll.
288
+ const pendingTools = (0, parser_1.getPendingApprovalTools)(messages);
289
+ const pendingKey = pendingTools.length > 0 ? pendingTools.sort().join(',') : '';
290
+ if (pendingKey && pendingKey !== tracked.lastEmittedPendingTools) {
291
+ tracked.lastEmittedPendingTools = pendingKey;
292
+ this.emit('pending-approval', {
293
+ sessionId,
294
+ projectPath,
295
+ tools: pendingTools,
296
+ });
297
+ }
298
+ else if (!pendingKey) {
299
+ // Clear when no more pending tools (so next approval triggers fresh)
300
+ tracked.lastEmittedPendingTools = '';
301
+ }
302
+ }
303
+ else {
304
+ // Emit activity notification for non-active sessions
305
+ const hadMessages = prevTracked?.messageCount || 0;
306
+ const wasWaitingOther = prevTracked?.isWaitingForInput || false;
307
+ const hasNewMessages = messages.length > hadMessages;
308
+ const waitingStatusChanged = conversationWaiting !== wasWaitingOther;
309
+ // Notify on new messages OR when waiting-for-input status changes
310
+ if (hasNewMessages || waitingStatusChanged) {
311
+ const lastMessage = messages[messages.length - 1];
312
+ this.emit('other-session-activity', {
313
+ sessionId,
314
+ projectPath,
315
+ sessionName: projectPath.split('/').pop() || sessionId,
316
+ isWaitingForInput: conversationWaiting,
317
+ lastMessage,
318
+ newMessageCount: hasNewMessages ? messages.length - hadMessages : 0,
319
+ });
320
+ // Check for pending tools in non-active sessions too (only on change)
321
+ const pendingTools = (0, parser_1.getPendingApprovalTools)(messages);
322
+ const pendingKey = pendingTools.length > 0 ? pendingTools.sort().join(',') : '';
323
+ if (pendingKey && pendingKey !== tracked.lastEmittedPendingTools) {
324
+ tracked.lastEmittedPendingTools = pendingKey;
325
+ this.emit('pending-approval', {
326
+ sessionId,
327
+ projectPath,
328
+ tools: pendingTools,
329
+ });
330
+ }
331
+ else if (!pendingKey) {
332
+ tracked.lastEmittedPendingTools = '';
333
+ }
334
+ }
335
+ }
336
+ }
337
+ extractProjectPath(filePath) {
338
+ // Extract project path from conversation file path
339
+ // e.g., ~/.claude/projects/-Users-foo-bar/abc123.jsonl -> /Users/foo/bar
340
+ const projectsDir = path.join(this.codeHome, 'projects');
341
+ const relative = path.relative(projectsDir, filePath);
342
+ const parts = relative.split(path.sep);
343
+ if (parts.length >= 1) {
344
+ const encoded = parts[0];
345
+ // Smart decode: try to find which interpretation of dashes is correct
346
+ // by checking if the path exists on the filesystem
347
+ const decoded = this.smartDecodePath(encoded);
348
+ return decoded;
349
+ }
350
+ return '';
351
+ }
352
+ smartDecodePath(encoded) {
353
+ // Remove leading dash
354
+ const withoutLeading = encoded.replace(/^-/, '');
355
+ const parts = withoutLeading.split('-');
356
+ // Try to find the real path by progressively building it
357
+ // and checking which segments should be joined with / vs -
358
+ let currentPath = '';
359
+ let i = 0;
360
+ while (i < parts.length) {
361
+ const part = parts[i];
362
+ const testWithSlash = currentPath ? `${currentPath}/${part}` : `/${part}`;
363
+ // Look ahead to see if joining with dash creates a valid path
364
+ let foundWithDash = false;
365
+ if (currentPath && i < parts.length) {
366
+ // Check if path with dash exists
367
+ for (let j = i; j < parts.length; j++) {
368
+ const dashJoined = currentPath + '-' + parts.slice(i, j + 1).join('-');
369
+ if (fs.existsSync(dashJoined) && fs.statSync(dashJoined).isDirectory()) {
370
+ // Found a valid path with dashes
371
+ currentPath = dashJoined;
372
+ i = j + 1;
373
+ foundWithDash = true;
374
+ break;
375
+ }
376
+ }
377
+ }
378
+ if (!foundWithDash) {
379
+ // Use slash separator
380
+ currentPath = testWithSlash;
381
+ i++;
382
+ }
383
+ }
384
+ // If the smart decode didn't find a valid path, fall back to simple decode
385
+ if (!fs.existsSync(currentPath)) {
386
+ // Simple fallback: replace all dashes with slashes
387
+ return '/' + withoutLeading.replace(/-/g, '/');
388
+ }
389
+ return currentPath;
390
+ }
391
+ generateSessionId(filePath) {
392
+ // Use the directory name as session ID
393
+ const projectsDir = path.join(this.codeHome, 'projects');
394
+ const relative = path.relative(projectsDir, filePath);
395
+ const parts = relative.split(path.sep);
396
+ const sessionId = parts[0] || 'default';
397
+ // Skip files outside the projects directory (like history.jsonl in root)
398
+ if (sessionId === '..' || sessionId.startsWith('..')) {
399
+ return '';
400
+ }
401
+ return sessionId;
402
+ }
403
+ getActiveConversation() {
404
+ if (!this.activeSessionId)
405
+ return null;
406
+ const tracked = this.conversations.get(this.activeSessionId);
407
+ if (!tracked)
408
+ return null;
409
+ return {
410
+ path: tracked.path,
411
+ projectPath: tracked.projectPath,
412
+ lastModified: tracked.lastModified,
413
+ };
414
+ }
415
+ getMessages(sessionId) {
416
+ const targetId = sessionId || this.activeSessionId;
417
+ if (!targetId)
418
+ return [];
419
+ const tracked = this.conversations.get(targetId);
420
+ if (!tracked)
421
+ return [];
422
+ // Use cached messages from last file change instead of re-parsing
423
+ if (tracked.cachedMessages)
424
+ return tracked.cachedMessages;
425
+ return (0, parser_1.parseConversationFile)(tracked.path);
426
+ }
427
+ getStatus(sessionId) {
428
+ const targetId = sessionId || this.activeSessionId;
429
+ if (!targetId) {
430
+ return {
431
+ isRunning: false,
432
+ isWaitingForInput: false,
433
+ lastActivity: 0,
434
+ };
435
+ }
436
+ const tracked = this.conversations.get(targetId);
437
+ if (!tracked) {
438
+ return {
439
+ isRunning: false,
440
+ isWaitingForInput: false,
441
+ lastActivity: 0,
442
+ };
443
+ }
444
+ // Use cached messages instead of re-parsing
445
+ const messages = tracked.cachedMessages || (0, parser_1.parseConversationFile)(tracked.path);
446
+ const lastMessage = messages[messages.length - 1];
447
+ return {
448
+ isRunning: true,
449
+ isWaitingForInput: tracked.isWaitingForInput,
450
+ lastActivity: lastMessage?.timestamp || 0,
451
+ conversationId: tracked.path,
452
+ projectPath: tracked.projectPath,
453
+ currentActivity: (0, parser_1.detectCurrentActivity)(messages),
454
+ recentActivity: (0, parser_1.getRecentActivity)(messages, 10),
455
+ };
456
+ }
457
+ getSessions() {
458
+ const sessions = [];
459
+ for (const [id, conv] of this.conversations) {
460
+ sessions.push({
461
+ id,
462
+ name: conv.projectPath.split('/').pop() || id,
463
+ projectPath: conv.projectPath,
464
+ conversationPath: conv.path,
465
+ lastActivity: conv.lastModified,
466
+ isWaitingForInput: conv.isWaitingForInput,
467
+ messageCount: conv.messageCount,
468
+ });
469
+ }
470
+ // Sort by last activity (most recent first)
471
+ sessions.sort((a, b) => b.lastActivity - a.lastActivity);
472
+ return sessions;
473
+ }
474
+ getActiveSessionId() {
475
+ return this.activeSessionId;
476
+ }
477
+ setActiveSession(sessionId) {
478
+ if (this.conversations.has(sessionId)) {
479
+ this.activeSessionId = sessionId;
480
+ const tracked = this.conversations.get(sessionId);
481
+ if (tracked) {
482
+ this.isWaitingForInput = tracked.isWaitingForInput;
483
+ this.lastMessageCount = tracked.messageCount;
484
+ // Use cached messages instead of re-parsing
485
+ const messages = tracked.cachedMessages || (0, parser_1.parseConversationFile)(tracked.path);
486
+ const highlights = (0, parser_1.extractHighlights)(messages);
487
+ this.emit('conversation-update', {
488
+ path: tracked.path,
489
+ sessionId,
490
+ messages,
491
+ highlights,
492
+ });
493
+ this.emit('status-change', {
494
+ sessionId,
495
+ isWaitingForInput: this.isWaitingForInput,
496
+ currentActivity: (0, parser_1.detectCurrentActivity)(messages),
497
+ lastMessage: messages[messages.length - 1],
498
+ });
499
+ }
500
+ return true;
501
+ }
502
+ return false;
503
+ }
504
+ clearActiveSession() {
505
+ this.activeSessionId = null;
506
+ this.isWaitingForInput = false;
507
+ this.lastMessageCount = 0;
508
+ // Emit empty update so clients clear their UI
509
+ this.emit('conversation-update', {
510
+ path: '',
511
+ sessionId: null,
512
+ messages: [],
513
+ highlights: [],
514
+ });
515
+ this.emit('status-change', {
516
+ sessionId: null,
517
+ isWaitingForInput: false,
518
+ currentActivity: undefined,
519
+ lastMessage: undefined,
520
+ });
521
+ }
522
+ isWaiting() {
523
+ return this.isWaitingForInput;
524
+ }
525
+ /**
526
+ * Check the active session for pending approval tools and emit if found.
527
+ * Called externally when auto-approve is toggled on to retroactively approve.
528
+ */
529
+ checkAndEmitPendingApproval() {
530
+ const sessionId = this.activeSessionId;
531
+ if (!sessionId)
532
+ return;
533
+ const tracked = this.conversations.get(sessionId);
534
+ if (!tracked)
535
+ return;
536
+ const messages = tracked.cachedMessages || (0, parser_1.parseConversationFile)(tracked.path);
537
+ const pendingTools = (0, parser_1.getPendingApprovalTools)(messages);
538
+ if (pendingTools.length > 0) {
539
+ this.emit('pending-approval', {
540
+ sessionId,
541
+ projectPath: tracked.projectPath,
542
+ tools: pendingTools,
543
+ });
544
+ }
545
+ }
546
+ async getServerSummary(tmuxSessions) {
547
+ // Get tmux sessions to filter - only show conversations with active tmux sessions
548
+ // Encode the tmux paths the same way the CLI does: /a/b/c -> -a-b-c
549
+ const activeTmuxEncodedPaths = new Set(tmuxSessions?.map(s => s.workingDir?.replace(/\//g, '-')).filter((p) => !!p) || []);
550
+ const sessions = [];
551
+ let waitingCount = 0;
552
+ let workingCount = 0;
553
+ for (const [id, conv] of this.conversations) {
554
+ // Skip if no matching tmux session (unless tmuxSessions wasn't provided)
555
+ // Compare using the session ID which is the encoded path (e.g., -Users-foo-bar)
556
+ if (tmuxSessions && !activeTmuxEncodedPaths.has(id)) {
557
+ continue;
558
+ }
559
+ // Use cached messages for activity detection instead of re-reading large files
560
+ const messages = conv.cachedMessages;
561
+ const currentActivity = messages ? (0, parser_1.detectCurrentActivity)(messages) : (0, parser_1.detectCurrentActivityFast)(conv.path);
562
+ // Determine status
563
+ let status = 'idle';
564
+ if (conv.isWaitingForInput) {
565
+ status = 'waiting';
566
+ waitingCount++;
567
+ }
568
+ else if (currentActivity) {
569
+ status = 'working';
570
+ workingCount++;
571
+ }
572
+ // Use cached task summary instead of re-reading multi-MB files on every poll.
573
+ // Task summaries are computed during processFileChange and cached.
574
+ const taskSummary = conv.cachedTaskSummary;
575
+ sessions.push({
576
+ id,
577
+ name: conv.projectPath.split('/').pop() || id,
578
+ projectPath: conv.projectPath,
579
+ status,
580
+ lastActivity: conv.lastModified,
581
+ currentActivity,
582
+ taskSummary,
583
+ });
584
+ }
585
+ // Sort by last activity (most recent first)
586
+ sessions.sort((a, b) => b.lastActivity - a.lastActivity);
587
+ return {
588
+ sessions,
589
+ totalSessions: sessions.length,
590
+ waitingCount,
591
+ workingCount,
592
+ };
593
+ }
594
+ }
595
+ exports.SessionWatcher = SessionWatcher;
596
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,mDAAqC;AACrC,mCAAsC;AACtC,iDAAqC;AACrC,+BAAiC;AAEjC,qCAAyN;AAEzN,MAAM,SAAS,GAAG,IAAA,gBAAS,EAAC,oBAAI,CAAC,CAAC;AAsBlC,MAAa,cAAe,SAAQ,qBAAY;IACtC,QAAQ,CAAS;IACjB,OAAO,GAA8B,IAAI,CAAC;IAC1C,aAAa,GAAqC,IAAI,GAAG,EAAE,CAAC;IAC5D,eAAe,GAAkB,IAAI,CAAC;IACtC,gBAAgB,GAAW,CAAC,CAAC;IAC7B,iBAAiB,GAAY,KAAK,CAAC;IACnC,mBAAmB,GAAY,KAAK,CAAC;IACrC,SAAS,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/B,gBAAgB,GAAgB,IAAI,GAAG,EAAE,CAAC;IAC1C,iBAAiB,GAAY,IAAI,CAAC;IAClC,cAAc,GAAgC,IAAI,GAAG,EAAE,CAAC;IACxD,MAAM,CAAU,WAAW,GAAG,GAAG,CAAC,CAAC,oCAAoC;IAE/E,YAAY,QAAgB;QAC1B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,kCAAkC;QAClC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,IAAI,CAAC;YACH,qEAAqE;YACrE,0DAA0D;YAC1D,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,SAAS,CAC7C,qDAAqD,CACtD,CAAC;YACF,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAEnE,0DAA0D;YAC1D,MAAM,cAAc,GAAa,EAAE,CAAC;YACpC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;gBAChC,IAAI,CAAC;oBACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CACxC,6BAA6B,IAAI,6BAA6B,CAC/D,CAAC;oBACF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;wBAC9C,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC5B,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,oBAAoB;gBACtB,CAAC;YACH,CAAC;YAED,0CAA0C;YAC1C,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;YAC9B,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;gBAClC,IAAI,CAAC;oBACH,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CACzC,uBAAuB,IAAI,yCAAyC,CACrE,CAAC;oBACF,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBACxD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;wBACtB,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;wBAC7D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBACzC,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,2DAA2D;gBAC7D,CAAC;YACH,CAAC;YAED,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,gBAAgB,CAAC,IAAI,eAAe,cAAc,CAAC,MAAM,qBAAqB,CAAC,CAAC;YACxH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;YAClC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,QAAgB;QACxC,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC,CAAC,+CAA+C;QAC9D,CAAC;QAED,sCAAsC;QACtC,uEAAuE;QACvE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACzD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnD,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAEzD,mDAAmD;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAExD,OAAO,CAAC,GAAG,CAAC,kCAAkC,WAAW,EAAE,CAAC,CAAC;QAE7D,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE;YACrC,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,KAAK;YACpB,gBAAgB,EAAE;gBAChB,kBAAkB,EAAE,GAAG;gBACvB,YAAY,EAAE,EAAE;aACjB;YACD,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,GAAG;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,sEAAsE;QACtE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,4BAA4B;QAC5B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC;YACjD,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAEO,gBAAgB,CAAC,QAAgB;QACvC,+DAA+D;QAC/D,IAAI,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,4CAA4C;QAC5C,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACnD,kEAAkE;QAClE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QAED,kEAAkE;QAClE,0DAA0D;QAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzD,IAAI,aAAa,EAAE,CAAC;YAClB,YAAY,CAAC,aAAa,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,EAAE;YACjD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACtC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC9C,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;IAClC,CAAC;IAEO,iBAAiB,CAAC,QAAgB,EAAE,SAAiB;QAC3D,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAEtD,2CAA2C;QAC3C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEnD,sCAAsC;QACtC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,IAAA,8BAAqB,EAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACrE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG,IAAA,0BAAiB,EAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE,GAAC,EAAE,mBAAmB,EAAE,GAAC,EAAE,QAAQ,EAAE,GAAC,EAAE,OAAO,QAAQ,CAAC,MAAM,cAAc,SAAS,EAAE,CAAC,CAAC;QAClJ,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAC1C,MAAM,mBAAmB,GAAG,IAAA,8BAAqB,EAAC,QAAQ,CAAC,CAAC;QAE5D,uDAAuD;QACvD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,kBAAkB,GAAG,WAAW,EAAE,kBAAkB,IAAI,CAAC,CAAC;QAEhE,yDAAyD;QACzD,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC;QAC9D,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,IAAA,yBAAgB,EAC9E,QAAQ,EACR,SAAS,EACT,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,OAAO,CACR,CAAC;QAEF,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,2CAA2C,SAAS,EAAE,CAAC,CAAC;YACpE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QAC3C,CAAC;QAED,2DAA2D;QAC3D,IAAI,iBAA0C,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAA,qBAAY,EAAC,OAAO,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;gBACjE,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;gBACtE,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;gBACrE,iBAAiB,GAAG;oBAClB,KAAK,EAAE,KAAK,CAAC,MAAM;oBACnB,OAAO;oBACP,UAAU,EAAE,eAAe,CAAC,MAAM;oBAClC,SAAS;oBACT,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO;iBAC1E,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;QAED,mDAAmD;QACnD,MAAM,OAAO,GAAwB;YACnC,IAAI,EAAE,QAAQ;YACd,WAAW;YACX,YAAY,EAAE,KAAK,CAAC,OAAO;YAC3B,YAAY,EAAE,QAAQ,CAAC,MAAM;YAC7B,iBAAiB,EAAE,mBAAmB;YACtC,kBAAkB,EAAE,iBAAiB;YACrC,cAAc,EAAE,QAAQ;YACxB,iBAAiB;YACjB,uBAAuB,EAAE,WAAW,EAAE,uBAAuB,IAAI,EAAE;SACpE,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAE3C,6EAA6E;QAC7E,2DAA2D;QAC3D,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACzD,IAAI,aAAa,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YAC5F,yCAAyC;YACzC,IAAI,UAAU,GAAwC,IAAI,CAAC;YAC3D,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC5C,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;oBACvD,UAAU,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC/C,CAAC;YACH,CAAC;YAED,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC,EAAE,CAAC;YACvC,CAAC;QACH,CAAC;QAED,+CAA+C;QAC/C,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAChE,IAAI,UAAU,IAAI,SAAS,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrD,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,CAAC;YACxD,CAAC;QACH,CAAC;QAED,8BAA8B;QAC9B,IAAI,SAAS,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;YACvC,cAAc;YACd,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,gBAAgB,CAAC;YACjE,IAAI,cAAc,EAAE,CAAC;gBACnB,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC;gBACxC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;oBAC/B,IAAI,EAAE,QAAQ;oBACd,SAAS;oBACT,QAAQ;oBACR,UAAU;iBACX,CAAC,CAAC;YACL,CAAC;YAED,2EAA2E;YAC3E,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAClD,MAAM,eAAe,GAAG,IAAA,8BAAqB,EAAC,QAAQ,CAAC,CAAC;YAExD,IAAI,IAAI,CAAC,iBAAiB,KAAK,UAAU,IAAI,cAAc,EAAE,CAAC;gBAC5D,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;oBACzB,SAAS;oBACT,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;oBACzC,eAAe;oBACf,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;YAED,4EAA4E;YAC5E,2DAA2D;YAC3D,MAAM,YAAY,GAAG,IAAA,gCAAuB,EAAC,QAAQ,CAAC,CAAC;YACvD,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,IAAI,UAAU,IAAI,UAAU,KAAK,OAAO,CAAC,uBAAuB,EAAE,CAAC;gBACjE,OAAO,CAAC,uBAAuB,GAAG,UAAU,CAAC;gBAC7C,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;oBAC5B,SAAS;oBACT,WAAW;oBACX,KAAK,EAAE,YAAY;iBACpB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBACvB,qEAAqE;gBACrE,OAAO,CAAC,uBAAuB,GAAG,EAAE,CAAC;YACvC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,qDAAqD;YACrD,MAAM,WAAW,GAAG,WAAW,EAAE,YAAY,IAAI,CAAC,CAAC;YACnD,MAAM,eAAe,GAAG,WAAW,EAAE,iBAAiB,IAAI,KAAK,CAAC;YAChE,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC;YACrD,MAAM,oBAAoB,GAAG,mBAAmB,KAAK,eAAe,CAAC;YAErE,kEAAkE;YAClE,IAAI,cAAc,IAAI,oBAAoB,EAAE,CAAC;gBAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;oBAClC,SAAS;oBACT,WAAW;oBACX,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS;oBACtD,iBAAiB,EAAE,mBAAmB;oBACtC,WAAW;oBACX,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;iBACpE,CAAC,CAAC;gBAEH,sEAAsE;gBACtE,MAAM,YAAY,GAAG,IAAA,gCAAuB,EAAC,QAAQ,CAAC,CAAC;gBACvD,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChF,IAAI,UAAU,IAAI,UAAU,KAAK,OAAO,CAAC,uBAAuB,EAAE,CAAC;oBACjE,OAAO,CAAC,uBAAuB,GAAG,UAAU,CAAC;oBAC7C,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;wBAC5B,SAAS;wBACT,WAAW;wBACX,KAAK,EAAE,YAAY;qBACpB,CAAC,CAAC;gBACL,CAAC;qBAAM,IAAI,CAAC,UAAU,EAAE,CAAC;oBACvB,OAAO,CAAC,uBAAuB,GAAG,EAAE,CAAC;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,QAAgB;QACzC,mDAAmD;QACnD,yEAAyE;QACzE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,sEAAsE;YACtE,mDAAmD;YACnD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,eAAe,CAAC,OAAe;QACrC,sBAAsB;QACtB,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAExC,yDAAyD;QACzD,2DAA2D;QAC3D,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;YAE1E,8DAA8D;YAC9D,IAAI,aAAa,GAAG,KAAK,CAAC;YAC1B,IAAI,WAAW,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBACpC,iCAAiC;gBACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACtC,MAAM,UAAU,GAAG,WAAW,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACvE,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;wBACvE,iCAAiC;wBACjC,WAAW,GAAG,UAAU,CAAC;wBACzB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBACV,aAAa,GAAG,IAAI,CAAC;wBACrB,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,sBAAsB;gBACtB,WAAW,GAAG,aAAa,CAAC;gBAC5B,CAAC,EAAE,CAAC;YACN,CAAC;QACH,CAAC;QAED,2EAA2E;QAC3E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,mDAAmD;YACnD,OAAO,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,iBAAiB,CAAC,QAAgB;QACxC,uCAAuC;QACvC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;QACxC,yEAAyE;QACzE,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO,IAAI,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE1B,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,SAAkB;QAC5B,MAAM,QAAQ,GAAG,SAAS,IAAI,IAAI,CAAC,eAAe,CAAC;QACnD,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAExB,kEAAkE;QAClE,IAAI,OAAO,CAAC,cAAc;YAAE,OAAO,OAAO,CAAC,cAAc,CAAC;QAC1D,OAAO,IAAA,8BAAqB,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,SAAS,CAAC,SAAkB;QAC1B,MAAM,QAAQ,GAAG,SAAS,IAAI,IAAI,CAAC,eAAe,CAAC;QACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,iBAAiB,EAAE,KAAK;gBACxB,YAAY,EAAE,CAAC;aAChB,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,iBAAiB,EAAE,KAAK;gBACxB,YAAY,EAAE,CAAC;aAChB,CAAC;QACJ,CAAC;QAED,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,IAAI,IAAA,8BAAqB,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/E,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAElD,OAAO;YACL,SAAS,EAAE,IAAI;YACf,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;YAC5C,YAAY,EAAE,WAAW,EAAE,SAAS,IAAI,CAAC;YACzC,cAAc,EAAE,OAAO,CAAC,IAAI;YAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,eAAe,EAAE,IAAA,8BAAqB,EAAC,QAAQ,CAAC;YAChD,cAAc,EAAE,IAAA,0BAAiB,EAAC,QAAQ,EAAE,EAAE,CAAC;SAChD,CAAC;IACJ,CAAC;IAED,WAAW;QACT,MAAM,QAAQ,GAAkB,EAAE,CAAC;QAEnC,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE;gBACF,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE;gBAC7C,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,gBAAgB,EAAE,IAAI,CAAC,IAAI;gBAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;gBACzC,YAAY,EAAE,IAAI,CAAC,YAAY;aAChC,CAAC,CAAC;QACL,CAAC;QAED,4CAA4C;QAC5C,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;QAEzD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,gBAAgB,CAAC,SAAiB;QAChC,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;YACjC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;gBACnD,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;gBAE7C,4CAA4C;gBAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,IAAI,IAAA,8BAAqB,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC/E,MAAM,UAAU,GAAG,IAAA,0BAAiB,EAAC,QAAQ,CAAC,CAAC;gBAE/C,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;oBAC/B,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,SAAS;oBACT,QAAQ;oBACR,UAAU;iBACX,CAAC,CAAC;gBAEH,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;oBACzB,SAAS;oBACT,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;oBACzC,eAAe,EAAE,IAAA,8BAAqB,EAAC,QAAQ,CAAC;oBAChD,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;iBAC3C,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAE1B,8CAA8C;QAC9C,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;YAC/B,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,EAAE;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,SAAS,EAAE,IAAI;YACf,iBAAiB,EAAE,KAAK;YACxB,eAAe,EAAE,SAAS;YAC1B,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,2BAA2B;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC;QACvC,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,IAAI,IAAA,8BAAqB,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/E,MAAM,YAAY,GAAG,IAAA,gCAAuB,EAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC5B,SAAS;gBACT,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,KAAK,EAAE,YAAY;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,YAA2D;QAoBhF,kFAAkF;QAClF,oEAAoE;QACpE,MAAM,sBAAsB,GAAG,IAAI,GAAG,CACpC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAChG,CAAC;QAEF,MAAM,QAAQ,GAcT,EAAE,CAAC;QAER,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC5C,yEAAyE;YACzE,gFAAgF;YAChF,IAAI,YAAY,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACpD,SAAS;YACX,CAAC;YAED,+EAA+E;YAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC;YACrC,MAAM,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAA,8BAAqB,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAA,kCAAyB,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE1G,mBAAmB;YACnB,IAAI,MAAM,GAA6C,MAAM,CAAC;YAC9D,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,MAAM,GAAG,SAAS,CAAC;gBACnB,YAAY,EAAE,CAAC;YACjB,CAAC;iBAAM,IAAI,eAAe,EAAE,CAAC;gBAC3B,MAAM,GAAG,SAAS,CAAC;gBACnB,YAAY,EAAE,CAAC;YACjB,CAAC;YAED,8EAA8E;YAC9E,mEAAmE;YACnE,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC;YAE3C,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE;gBACF,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE;gBAC7C,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,MAAM;gBACN,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,eAAe;gBACf,WAAW;aACZ,CAAC,CAAC;QACL,CAAC;QAED,4CAA4C;QAC5C,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;QAEzD,OAAO;YACL,QAAQ;YACR,aAAa,EAAE,QAAQ,CAAC,MAAM;YAC9B,YAAY;YACZ,YAAY;SACb,CAAC;IACJ,CAAC;;AAvpBH,wCAwpBC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=watcher.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.test.d.ts","sourceRoot":"","sources":["../src/watcher.test.ts"],"names":[],"mappings":""}