@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.
- package/dist/__tests__/task-parser.test.d.ts +2 -0
- package/dist/__tests__/task-parser.test.d.ts.map +1 -0
- package/dist/__tests__/task-parser.test.js +79 -0
- package/dist/__tests__/task-parser.test.js.map +1 -0
- package/dist/anthropic-usage.d.ts +5 -0
- package/dist/anthropic-usage.d.ts.map +1 -0
- package/dist/anthropic-usage.js +112 -0
- package/dist/anthropic-usage.js.map +1 -0
- package/dist/cert-generator.d.ts +15 -0
- package/dist/cert-generator.d.ts.map +1 -0
- package/dist/cert-generator.js +298 -0
- package/dist/cert-generator.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +122 -0
- package/dist/config.js.map +1 -0
- package/dist/encryption.d.ts +28 -0
- package/dist/encryption.d.ts.map +1 -0
- package/dist/encryption.js +95 -0
- package/dist/encryption.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +211 -0
- package/dist/index.js.map +1 -0
- package/dist/input-injector.d.ts +21 -0
- package/dist/input-injector.d.ts.map +1 -0
- package/dist/input-injector.js +126 -0
- package/dist/input-injector.js.map +1 -0
- package/dist/mdns.d.ts +11 -0
- package/dist/mdns.d.ts.map +1 -0
- package/dist/mdns.js +93 -0
- package/dist/mdns.js.map +1 -0
- package/dist/parser.d.ts +43 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +800 -0
- package/dist/parser.js.map +1 -0
- package/dist/push.d.ts +38 -0
- package/dist/push.d.ts.map +1 -0
- package/dist/push.js +359 -0
- package/dist/push.js.map +1 -0
- package/dist/qr-server.d.ts +13 -0
- package/dist/qr-server.d.ts.map +1 -0
- package/dist/qr-server.js +421 -0
- package/dist/qr-server.js.map +1 -0
- package/dist/scaffold/generator.d.ts +11 -0
- package/dist/scaffold/generator.d.ts.map +1 -0
- package/dist/scaffold/generator.js +206 -0
- package/dist/scaffold/generator.js.map +1 -0
- package/dist/scaffold/templates/index.d.ts +5 -0
- package/dist/scaffold/templates/index.d.ts.map +1 -0
- package/dist/scaffold/templates/index.js +22 -0
- package/dist/scaffold/templates/index.js.map +1 -0
- package/dist/scaffold/templates/node-express.d.ts +3 -0
- package/dist/scaffold/templates/node-express.d.ts.map +1 -0
- package/dist/scaffold/templates/node-express.js +218 -0
- package/dist/scaffold/templates/node-express.js.map +1 -0
- package/dist/scaffold/templates/python-fastapi.d.ts +3 -0
- package/dist/scaffold/templates/python-fastapi.d.ts.map +1 -0
- package/dist/scaffold/templates/python-fastapi.js +302 -0
- package/dist/scaffold/templates/python-fastapi.js.map +1 -0
- package/dist/scaffold/templates/react-mui-website.d.ts +3 -0
- package/dist/scaffold/templates/react-mui-website.d.ts.map +1 -0
- package/dist/scaffold/templates/react-mui-website.js +405 -0
- package/dist/scaffold/templates/react-mui-website.js.map +1 -0
- package/dist/scaffold/templates/react-typescript.d.ts +3 -0
- package/dist/scaffold/templates/react-typescript.d.ts.map +1 -0
- package/dist/scaffold/templates/react-typescript.js +275 -0
- package/dist/scaffold/templates/react-typescript.js.map +1 -0
- package/dist/scaffold/types.d.ts +55 -0
- package/dist/scaffold/types.d.ts.map +1 -0
- package/dist/scaffold/types.js +3 -0
- package/dist/scaffold/types.js.map +1 -0
- package/dist/subagent-watcher.d.ts +24 -0
- package/dist/subagent-watcher.d.ts.map +1 -0
- package/dist/subagent-watcher.js +307 -0
- package/dist/subagent-watcher.js.map +1 -0
- package/dist/tls.d.ts +10 -0
- package/dist/tls.d.ts.map +1 -0
- package/dist/tls.js +77 -0
- package/dist/tls.js.map +1 -0
- package/dist/tmux-manager.d.ts +71 -0
- package/dist/tmux-manager.d.ts.map +1 -0
- package/dist/tmux-manager.js +243 -0
- package/dist/tmux-manager.js.map +1 -0
- package/dist/tool-config.d.ts +33 -0
- package/dist/tool-config.d.ts.map +1 -0
- package/dist/tool-config.js +211 -0
- package/dist/tool-config.js.map +1 -0
- package/dist/types.d.ts +218 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/watcher.d.ts +63 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +596 -0
- package/dist/watcher.js.map +1 -0
- package/dist/watcher.test.d.ts +2 -0
- package/dist/watcher.test.d.ts.map +1 -0
- package/dist/watcher.test.js +110 -0
- package/dist/watcher.test.js.map +1 -0
- package/dist/websocket.d.ts +62 -0
- package/dist/websocket.d.ts.map +1 -0
- package/dist/websocket.js +1695 -0
- package/dist/websocket.js.map +1 -0
- package/package.json +71 -0
- package/scripts/build.sh +23 -0
- package/scripts/install-remote.sh +18 -0
- package/scripts/install.sh +558 -0
- package/scripts/uninstall.sh +113 -0
package/dist/watcher.js
ADDED
|
@@ -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":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.test.d.ts","sourceRoot":"","sources":["../src/watcher.test.ts"],"names":[],"mappings":""}
|