@cmdctrl/claude-code 0.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.
Files changed (83) hide show
  1. package/dist/adapter/claude-cli.d.ts +41 -0
  2. package/dist/adapter/claude-cli.d.ts.map +1 -0
  3. package/dist/adapter/claude-cli.js +525 -0
  4. package/dist/adapter/claude-cli.js.map +1 -0
  5. package/dist/adapter/events.d.ts +52 -0
  6. package/dist/adapter/events.d.ts.map +1 -0
  7. package/dist/adapter/events.js +134 -0
  8. package/dist/adapter/events.js.map +1 -0
  9. package/dist/client/messages.d.ts +140 -0
  10. package/dist/client/messages.d.ts.map +1 -0
  11. package/dist/client/messages.js +6 -0
  12. package/dist/client/messages.js.map +1 -0
  13. package/dist/client/websocket.d.ts +115 -0
  14. package/dist/client/websocket.d.ts.map +1 -0
  15. package/dist/client/websocket.js +434 -0
  16. package/dist/client/websocket.js.map +1 -0
  17. package/dist/commands/register.d.ts +10 -0
  18. package/dist/commands/register.d.ts.map +1 -0
  19. package/dist/commands/register.js +175 -0
  20. package/dist/commands/register.js.map +1 -0
  21. package/dist/commands/start.d.ts +9 -0
  22. package/dist/commands/start.d.ts.map +1 -0
  23. package/dist/commands/start.js +54 -0
  24. package/dist/commands/start.js.map +1 -0
  25. package/dist/commands/status.d.ts +5 -0
  26. package/dist/commands/status.d.ts.map +1 -0
  27. package/dist/commands/status.js +38 -0
  28. package/dist/commands/status.js.map +1 -0
  29. package/dist/commands/stop.d.ts +5 -0
  30. package/dist/commands/stop.d.ts.map +1 -0
  31. package/dist/commands/stop.js +59 -0
  32. package/dist/commands/stop.js.map +1 -0
  33. package/dist/commands/unregister.d.ts +5 -0
  34. package/dist/commands/unregister.d.ts.map +1 -0
  35. package/dist/commands/unregister.js +28 -0
  36. package/dist/commands/unregister.js.map +1 -0
  37. package/dist/config/config.d.ts +68 -0
  38. package/dist/config/config.d.ts.map +1 -0
  39. package/dist/config/config.js +193 -0
  40. package/dist/config/config.js.map +1 -0
  41. package/dist/handlers/context-handler.d.ts +37 -0
  42. package/dist/handlers/context-handler.d.ts.map +1 -0
  43. package/dist/handlers/context-handler.js +303 -0
  44. package/dist/handlers/context-handler.js.map +1 -0
  45. package/dist/index.d.ts +3 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +39 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/message-reader.d.ts +25 -0
  50. package/dist/message-reader.d.ts.map +1 -0
  51. package/dist/message-reader.js +454 -0
  52. package/dist/message-reader.js.map +1 -0
  53. package/dist/session-discovery.d.ts +48 -0
  54. package/dist/session-discovery.d.ts.map +1 -0
  55. package/dist/session-discovery.js +496 -0
  56. package/dist/session-discovery.js.map +1 -0
  57. package/dist/session-watcher.d.ts +92 -0
  58. package/dist/session-watcher.d.ts.map +1 -0
  59. package/dist/session-watcher.js +494 -0
  60. package/dist/session-watcher.js.map +1 -0
  61. package/dist/session-watcher.test.d.ts +9 -0
  62. package/dist/session-watcher.test.d.ts.map +1 -0
  63. package/dist/session-watcher.test.js +149 -0
  64. package/dist/session-watcher.test.js.map +1 -0
  65. package/jest.config.js +8 -0
  66. package/package.json +42 -0
  67. package/src/adapter/claude-cli.ts +591 -0
  68. package/src/adapter/events.ts +186 -0
  69. package/src/client/messages.ts +193 -0
  70. package/src/client/websocket.ts +509 -0
  71. package/src/commands/register.ts +201 -0
  72. package/src/commands/start.ts +70 -0
  73. package/src/commands/status.ts +47 -0
  74. package/src/commands/stop.ts +58 -0
  75. package/src/commands/unregister.ts +30 -0
  76. package/src/config/config.ts +163 -0
  77. package/src/handlers/context-handler.ts +337 -0
  78. package/src/index.ts +45 -0
  79. package/src/message-reader.ts +485 -0
  80. package/src/session-discovery.ts +557 -0
  81. package/src/session-watcher.test.ts +141 -0
  82. package/src/session-watcher.ts +560 -0
  83. package/tsconfig.json +19 -0
@@ -0,0 +1,494 @@
1
+ "use strict";
2
+ /**
3
+ * Session file watcher for monitoring JSONL session files
4
+ *
5
+ * Watches JSONL files and emits typed events for each new entry:
6
+ * - AGENT_RESPONSE: assistant entries with text content
7
+ * - VERBOSE: tool_use, thinking, tool_result entries
8
+ * - USER_MESSAGE: user entries (for passive observers)
9
+ *
10
+ * This is the single source of truth for session content events.
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.SessionWatcher = void 0;
47
+ const fs = __importStar(require("fs"));
48
+ // Polling interval (500ms)
49
+ const POLL_INTERVAL_MS = 500;
50
+ // Time to wait after AGENT_RESPONSE before declaring completion
51
+ // If a tool call (VERBOSE) arrives within this window, completion is cancelled
52
+ // Must be long enough to account for Claude Code writing text and tool_use as
53
+ // SEPARATE entries. Claude often takes 2-4 seconds between writing "Let me do X"
54
+ // and actually writing the tool_use block.
55
+ const COMPLETION_DELAY_MS = 5000;
56
+ class SessionWatcher {
57
+ watchedSessions = new Map();
58
+ completionTimers = new Map();
59
+ onEvent;
60
+ onCompletion = null;
61
+ pollTimer = null;
62
+ constructor(onEvent, onCompletion) {
63
+ this.onEvent = onEvent;
64
+ this.onCompletion = onCompletion || null;
65
+ }
66
+ /**
67
+ * Start watching a session file for changes
68
+ */
69
+ watchSession(sessionId, filePath) {
70
+ if (this.watchedSessions.has(sessionId)) {
71
+ console.log(`[SessionWatcher] Already watching session ${sessionId}`);
72
+ return;
73
+ }
74
+ if (!fs.existsSync(filePath)) {
75
+ console.warn(`[SessionWatcher] File not found: ${filePath}`);
76
+ return;
77
+ }
78
+ try {
79
+ const stats = fs.statSync(filePath);
80
+ const { processedUuids, lineCount, messageCount, lastMessage } = this.initializeFromFile(filePath);
81
+ this.watchedSessions.set(sessionId, {
82
+ sessionId,
83
+ filePath,
84
+ lastSize: stats.size,
85
+ processedUuids,
86
+ lastLineCount: lineCount,
87
+ messageCount,
88
+ lastMessage,
89
+ });
90
+ console.log(`[SessionWatcher] Started watching session ${sessionId} (${processedUuids.size} entries, ${messageCount} messages)`);
91
+ // Start polling if not already running
92
+ if (!this.pollTimer) {
93
+ this.startPolling();
94
+ }
95
+ }
96
+ catch (err) {
97
+ console.error(`[SessionWatcher] Failed to watch ${filePath}:`, err);
98
+ }
99
+ }
100
+ /**
101
+ * Stop watching a session file
102
+ */
103
+ unwatchSession(sessionId) {
104
+ // Cancel any pending completion timer
105
+ this.cancelCompletionTimer(sessionId);
106
+ if (this.watchedSessions.delete(sessionId)) {
107
+ console.log(`[SessionWatcher] Stopped watching session ${sessionId}`);
108
+ }
109
+ // Stop polling if no sessions left
110
+ if (this.watchedSessions.size === 0 && this.pollTimer) {
111
+ clearInterval(this.pollTimer);
112
+ this.pollTimer = null;
113
+ }
114
+ }
115
+ /**
116
+ * Stop watching all sessions
117
+ */
118
+ unwatchAll() {
119
+ // Cancel all completion timers
120
+ for (const timer of this.completionTimers.values()) {
121
+ clearTimeout(timer);
122
+ }
123
+ this.completionTimers.clear();
124
+ this.watchedSessions.clear();
125
+ if (this.pollTimer) {
126
+ clearInterval(this.pollTimer);
127
+ this.pollTimer = null;
128
+ }
129
+ console.log('[SessionWatcher] Stopped watching all sessions');
130
+ }
131
+ /**
132
+ * Initialize processed UUIDs from existing file content
133
+ * This prevents emitting events for entries that existed before we started watching
134
+ */
135
+ initializeFromFile(filePath) {
136
+ const processedUuids = new Set();
137
+ let messageCount = 0;
138
+ let lastMessage = '';
139
+ try {
140
+ const content = fs.readFileSync(filePath, 'utf-8');
141
+ const lines = content.split('\n').filter(line => line.trim());
142
+ for (const line of lines) {
143
+ try {
144
+ const entry = JSON.parse(line);
145
+ if (entry.uuid) {
146
+ processedUuids.add(entry.uuid);
147
+ messageCount++;
148
+ // Track last message content for session_activity
149
+ const entryMessage = entry.message;
150
+ const content = entryMessage?.content;
151
+ if (typeof content === 'string') {
152
+ lastMessage = content.slice(0, 200);
153
+ }
154
+ else if (Array.isArray(content)) {
155
+ const textBlocks = content.filter((b) => b.type === 'text');
156
+ if (textBlocks.length > 0) {
157
+ lastMessage = (textBlocks[0].text || '').slice(0, 200);
158
+ }
159
+ }
160
+ }
161
+ }
162
+ catch {
163
+ // Skip invalid JSON lines
164
+ }
165
+ }
166
+ return { processedUuids, lineCount: lines.length, messageCount, lastMessage };
167
+ }
168
+ catch {
169
+ return { processedUuids, lineCount: 0, messageCount: 0, lastMessage: '' };
170
+ }
171
+ }
172
+ /**
173
+ * Start the polling loop
174
+ */
175
+ startPolling() {
176
+ this.pollTimer = setInterval(() => {
177
+ this.pollAllSessions();
178
+ }, POLL_INTERVAL_MS);
179
+ }
180
+ /**
181
+ * Poll all watched sessions for changes
182
+ */
183
+ pollAllSessions() {
184
+ for (const [, session] of this.watchedSessions) {
185
+ this.checkSession(session);
186
+ }
187
+ }
188
+ /**
189
+ * Check a single session for changes
190
+ */
191
+ checkSession(session) {
192
+ try {
193
+ if (!fs.existsSync(session.filePath)) {
194
+ console.warn(`[SessionWatcher] File no longer exists: ${session.filePath}`);
195
+ this.unwatchSession(session.sessionId);
196
+ return;
197
+ }
198
+ const stats = fs.statSync(session.filePath);
199
+ // Only check if file size changed
200
+ if (stats.size === session.lastSize) {
201
+ return;
202
+ }
203
+ // Read and process new entries
204
+ const newEntries = this.readNewEntries(session);
205
+ session.lastSize = stats.size;
206
+ // First pass: emit events and track what we saw
207
+ let sawAgentResponse = false;
208
+ let sawToolCall = false;
209
+ for (const entry of newEntries) {
210
+ const event = this.entryToEvent(session.sessionId, entry);
211
+ if (event) {
212
+ console.log(`[SessionWatcher] Emitting ${event.type} for session ${session.sessionId.slice(-8)}: ${event.content.slice(0, 50)}...`);
213
+ this.onEvent(event);
214
+ // Track message count and last message
215
+ session.messageCount++;
216
+ session.lastMessage = event.content.slice(0, 200);
217
+ // Track what event types we saw in this batch
218
+ if (event.type === 'AGENT_RESPONSE') {
219
+ sawAgentResponse = true;
220
+ }
221
+ // Check for actual tool_use blocks (not thinking, not tool_result)
222
+ // This is the authoritative check for "agent is making a tool call"
223
+ if (this.entryHasToolUse(entry)) {
224
+ sawToolCall = true;
225
+ }
226
+ }
227
+ if (entry.uuid) {
228
+ session.processedUuids.add(entry.uuid);
229
+ }
230
+ }
231
+ // Second pass: completion detection based on entire batch
232
+ if (sawToolCall) {
233
+ // Tool call in this batch - cancel any pending timer, agent is still working
234
+ this.cancelCompletionTimer(session.sessionId);
235
+ }
236
+ else if (sawAgentResponse) {
237
+ // Agent responded with no tool call in this batch - start completion timer
238
+ this.startCompletionTimer(session);
239
+ }
240
+ }
241
+ catch (err) {
242
+ console.error(`[SessionWatcher] Error checking session ${session.sessionId}:`, err);
243
+ }
244
+ }
245
+ /**
246
+ * Read only NEW entries appended since lastSize
247
+ * Reads from lastSize offset forward, avoiding full file reads
248
+ */
249
+ readNewEntries(session) {
250
+ const newEntries = [];
251
+ try {
252
+ const stats = fs.statSync(session.filePath);
253
+ const newBytes = stats.size - session.lastSize;
254
+ if (newBytes <= 0) {
255
+ return newEntries;
256
+ }
257
+ // Read only the new bytes from the end
258
+ const fd = fs.openSync(session.filePath, 'r');
259
+ const buffer = Buffer.alloc(newBytes);
260
+ fs.readSync(fd, buffer, 0, newBytes, session.lastSize);
261
+ fs.closeSync(fd);
262
+ const content = buffer.toString('utf-8');
263
+ const lines = content.split('\n').filter(line => line.trim());
264
+ for (const line of lines) {
265
+ try {
266
+ const entry = JSON.parse(line);
267
+ // Skip entries we've already processed (safety check)
268
+ if (entry.uuid && session.processedUuids.has(entry.uuid)) {
269
+ continue;
270
+ }
271
+ // Skip internal entries (no uuid)
272
+ if (!entry.uuid) {
273
+ continue;
274
+ }
275
+ newEntries.push(entry);
276
+ }
277
+ catch {
278
+ // Skip invalid JSON lines (could be partial line at boundary)
279
+ }
280
+ }
281
+ }
282
+ catch (err) {
283
+ console.error(`[SessionWatcher] Error reading file:`, err);
284
+ }
285
+ return newEntries;
286
+ }
287
+ /**
288
+ * Convert a JSONL entry to a SessionEvent
289
+ */
290
+ entryToEvent(sessionId, entry) {
291
+ const entryType = entry.type;
292
+ const uuid = entry.uuid;
293
+ const timestamp = entry.timestamp || new Date().toISOString();
294
+ const message = entry.message;
295
+ const content = message?.content;
296
+ // Handle user entries
297
+ if (entryType === 'user') {
298
+ // Check if this is a tool_result (internal, but we emit as VERBOSE)
299
+ if (Array.isArray(content)) {
300
+ const hasToolResult = content.some((block) => block.type === 'tool_result');
301
+ if (hasToolResult) {
302
+ // Extract tool result content
303
+ const toolResultBlock = content.find((block) => block.type === 'tool_result');
304
+ // Content can be a string, array (for images), or other types
305
+ const rawContent = toolResultBlock?.content;
306
+ const resultContent = typeof rawContent === 'string'
307
+ ? rawContent
308
+ : (Array.isArray(rawContent) ? JSON.stringify(rawContent) : String(rawContent || ''));
309
+ // Skip empty tool results - no value in showing "(empty output)"
310
+ if (!resultContent.trim()) {
311
+ return null;
312
+ }
313
+ return {
314
+ type: 'VERBOSE',
315
+ sessionId,
316
+ uuid,
317
+ content: resultContent.length > 200 ? resultContent.slice(0, 200) + '...' : resultContent,
318
+ timestamp,
319
+ isToolResult: true,
320
+ };
321
+ }
322
+ }
323
+ // Regular user message
324
+ const textContent = typeof content === 'string'
325
+ ? content
326
+ : Array.isArray(content)
327
+ ? content
328
+ .filter((block) => block.type === 'text')
329
+ .map((block) => block.text)
330
+ .join('\n')
331
+ : '';
332
+ if (!textContent) {
333
+ return null;
334
+ }
335
+ return {
336
+ type: 'USER_MESSAGE',
337
+ sessionId,
338
+ uuid,
339
+ content: textContent,
340
+ timestamp,
341
+ };
342
+ }
343
+ // Handle assistant entries
344
+ if (entryType === 'assistant') {
345
+ if (!Array.isArray(content)) {
346
+ console.log(`[SessionWatcher] Assistant entry ${uuid?.slice(-8)} has non-array content:`, typeof content);
347
+ return null;
348
+ }
349
+ // Log what block types are present for debugging
350
+ const blockTypes = content.map((b) => b.type);
351
+ console.log(`[SessionWatcher] Assistant entry ${uuid?.slice(-8)} has blocks:`, blockTypes);
352
+ // Check for text content (AGENT_RESPONSE)
353
+ const textBlocks = content.filter((block) => block.type === 'text');
354
+ if (textBlocks.length > 0) {
355
+ const textContent = textBlocks
356
+ .map((block) => block.text)
357
+ .join('\n')
358
+ .trim();
359
+ // Skip very short responses that are likely cursor indicators (e.g., "\", "|")
360
+ // Also skip if content is ONLY whitespace or special characters
361
+ const isLikelyCursor = textContent.length <= 2 && /^[\s\\|/_-]*$/.test(textContent);
362
+ if (textContent && !isLikelyCursor) {
363
+ console.log(`[SessionWatcher] Emitting AGENT_RESPONSE for ${uuid?.slice(-8)}: "${textContent.slice(0, 50)}..."`);
364
+ return {
365
+ type: 'AGENT_RESPONSE',
366
+ sessionId,
367
+ uuid,
368
+ content: textContent,
369
+ timestamp,
370
+ };
371
+ }
372
+ else if (isLikelyCursor) {
373
+ console.log(`[SessionWatcher] Skipping cursor-like content for ${uuid?.slice(-8)}: "${textContent}"`);
374
+ }
375
+ else {
376
+ console.log(`[SessionWatcher] Text blocks found but textContent is empty for ${uuid?.slice(-8)}`);
377
+ }
378
+ }
379
+ // Check for tool_use (VERBOSE)
380
+ const toolUseBlocks = content.filter((block) => block.type === 'tool_use');
381
+ if (toolUseBlocks.length > 0) {
382
+ const toolBlock = toolUseBlocks[0];
383
+ const toolName = toolBlock.name;
384
+ const toolInput = toolBlock.input;
385
+ const formattedTool = this.formatToolUse(toolName, toolInput);
386
+ return {
387
+ type: 'VERBOSE',
388
+ sessionId,
389
+ uuid,
390
+ content: formattedTool,
391
+ timestamp,
392
+ };
393
+ }
394
+ // Check for thinking (VERBOSE)
395
+ const thinkingBlocks = content.filter((block) => block.type === 'thinking');
396
+ if (thinkingBlocks.length > 0) {
397
+ const thinkingContent = thinkingBlocks
398
+ .map((block) => block.thinking)
399
+ .join('\n');
400
+ const truncated = thinkingContent.length > 200
401
+ ? thinkingContent.slice(0, 200) + '...'
402
+ : thinkingContent;
403
+ return {
404
+ type: 'VERBOSE',
405
+ sessionId,
406
+ uuid,
407
+ content: `🤔 ${truncated}`,
408
+ timestamp,
409
+ };
410
+ }
411
+ console.log(`[SessionWatcher] Assistant entry ${uuid?.slice(-8)} had no recognized content blocks`);
412
+ }
413
+ return null;
414
+ }
415
+ /**
416
+ * Format a tool_use block for verbose display
417
+ */
418
+ formatToolUse(name, input) {
419
+ switch (name) {
420
+ case 'Read':
421
+ return `📖 Reading ${input?.file_path || 'file'}`;
422
+ case 'Write':
423
+ return `✏️ Writing ${input?.file_path || 'file'}`;
424
+ case 'Edit':
425
+ return `🔧 Editing ${input?.file_path || 'file'}`;
426
+ case 'Bash':
427
+ const cmd = (input?.command || '').slice(0, 60);
428
+ return `⚡ Running: ${cmd}`;
429
+ case 'Glob':
430
+ return `🔍 Searching: ${input?.pattern || ''}`;
431
+ case 'Grep':
432
+ return `🔎 Grepping: ${input?.pattern || ''}`;
433
+ case 'Task':
434
+ return `📋 Spawning task`;
435
+ case 'TodoWrite':
436
+ return `📝 Updating todos`;
437
+ case 'WebSearch':
438
+ return `🌐 Searching: ${input?.query || ''}`;
439
+ case 'WebFetch':
440
+ return `🌐 Fetching: ${input?.url || ''}`;
441
+ default:
442
+ return `🔧 ${name}`;
443
+ }
444
+ }
445
+ get watchCount() {
446
+ return this.watchedSessions.size;
447
+ }
448
+ /**
449
+ * Check if an entry contains tool_use blocks (agent is making a tool call)
450
+ */
451
+ entryHasToolUse(entry) {
452
+ const message = entry.message;
453
+ const content = message?.content;
454
+ if (!Array.isArray(content)) {
455
+ return false;
456
+ }
457
+ return content.some((block) => block.type === 'tool_use');
458
+ }
459
+ /**
460
+ * Start a completion timer for a session
461
+ * If no tool call arrives within COMPLETION_DELAY_MS, fire the completion callback
462
+ */
463
+ startCompletionTimer(session) {
464
+ // Cancel any existing timer first
465
+ this.cancelCompletionTimer(session.sessionId);
466
+ if (!this.onCompletion) {
467
+ return;
468
+ }
469
+ const timer = setTimeout(() => {
470
+ this.completionTimers.delete(session.sessionId);
471
+ if (this.onCompletion) {
472
+ this.onCompletion({
473
+ sessionId: session.sessionId,
474
+ filePath: session.filePath,
475
+ lastMessage: session.lastMessage,
476
+ messageCount: session.messageCount,
477
+ });
478
+ }
479
+ }, COMPLETION_DELAY_MS);
480
+ this.completionTimers.set(session.sessionId, timer);
481
+ }
482
+ /**
483
+ * Cancel a pending completion timer for a session
484
+ */
485
+ cancelCompletionTimer(sessionId) {
486
+ const timer = this.completionTimers.get(sessionId);
487
+ if (timer) {
488
+ clearTimeout(timer);
489
+ this.completionTimers.delete(sessionId);
490
+ }
491
+ }
492
+ }
493
+ exports.SessionWatcher = SessionWatcher;
494
+ //# sourceMappingURL=session-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-watcher.js","sourceRoot":"","sources":["../src/session-watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tests for SessionWatcher file change detection
3
+ *
4
+ * This test verifies that the SessionWatcher reliably detects
5
+ * file changes when an external process appends to a JSONL file
6
+ * (simulating Claude CLI writing to session files).
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=session-watcher.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-watcher.test.d.ts","sourceRoot":"","sources":["../src/session-watcher.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}