forkoff 1.0.11 → 1.0.13
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/README.md +7 -4
- package/dist/__tests__/cli-commands.test.d.ts +6 -0
- package/dist/__tests__/cli-commands.test.d.ts.map +1 -0
- package/dist/__tests__/cli-commands.test.js +213 -0
- package/dist/__tests__/cli-commands.test.js.map +1 -0
- package/dist/__tests__/startup.test.d.ts +11 -0
- package/dist/__tests__/startup.test.d.ts.map +1 -0
- package/dist/__tests__/startup.test.js +234 -0
- package/dist/__tests__/startup.test.js.map +1 -0
- package/dist/__tests__/tools/claude-process.test.js +221 -15
- package/dist/__tests__/tools/claude-process.test.js.map +1 -1
- package/dist/__tests__/tools/permission-hook.test.d.ts +17 -0
- package/dist/__tests__/tools/permission-hook.test.d.ts.map +1 -0
- package/dist/__tests__/tools/permission-hook.test.js +616 -0
- package/dist/__tests__/tools/permission-hook.test.js.map +1 -0
- package/dist/__tests__/tools/permission-ipc.test.d.ts +11 -0
- package/dist/__tests__/tools/permission-ipc.test.d.ts.map +1 -0
- package/dist/__tests__/tools/permission-ipc.test.js +612 -0
- package/dist/__tests__/tools/permission-ipc.test.js.map +1 -0
- package/dist/config.js +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1010 -898
- package/dist/index.js.map +1 -1
- package/dist/startup.d.ts.map +1 -1
- package/dist/startup.js +45 -15
- package/dist/startup.js.map +1 -1
- package/dist/tools/__tests__/claude-sessions.test.d.ts +2 -0
- package/dist/tools/__tests__/claude-sessions.test.d.ts.map +1 -0
- package/dist/tools/__tests__/claude-sessions.test.js +306 -0
- package/dist/tools/__tests__/claude-sessions.test.js.map +1 -0
- package/dist/tools/claude-process.d.ts +81 -4
- package/dist/tools/claude-process.d.ts.map +1 -1
- package/dist/tools/claude-process.js +332 -20
- package/dist/tools/claude-process.js.map +1 -1
- package/dist/tools/claude-sessions.d.ts +5 -0
- package/dist/tools/claude-sessions.d.ts.map +1 -1
- package/dist/tools/claude-sessions.js +16 -2
- package/dist/tools/claude-sessions.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/permission-hook.d.ts +41 -0
- package/dist/tools/permission-hook.d.ts.map +1 -0
- package/dist/tools/permission-hook.js +312 -0
- package/dist/tools/permission-hook.js.map +1 -0
- package/dist/tools/permission-ipc.d.ts +109 -0
- package/dist/tools/permission-ipc.d.ts.map +1 -0
- package/dist/tools/permission-ipc.js +295 -0
- package/dist/tools/permission-ipc.js.map +1 -0
- package/dist/websocket.d.ts +14 -0
- package/dist/websocket.d.ts.map +1 -1
- package/dist/websocket.js +34 -4
- package/dist/websocket.js.map +1 -1
- package/jest.config.js +3 -0
- package/package.json +1 -1
|
@@ -0,0 +1,306 @@
|
|
|
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
|
+
const fs = __importStar(require("fs"));
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const os = __importStar(require("os"));
|
|
39
|
+
// We need to mock fs before importing the module
|
|
40
|
+
jest.mock('fs');
|
|
41
|
+
jest.mock('child_process');
|
|
42
|
+
const mockFs = fs;
|
|
43
|
+
// Import after mocking
|
|
44
|
+
const claude_sessions_1 = require("../claude-sessions");
|
|
45
|
+
describe('ClaudeSessionDetector', () => {
|
|
46
|
+
const homeDir = os.homedir();
|
|
47
|
+
const projectsDir = path.join(homeDir, '.claude', 'projects');
|
|
48
|
+
beforeEach(() => {
|
|
49
|
+
jest.clearAllMocks();
|
|
50
|
+
// Reset internal state
|
|
51
|
+
claude_sessions_1.claudeSessionDetector.lastKnownSessions = new Map();
|
|
52
|
+
claude_sessions_1.claudeSessionDetector.lastClaudeRunning = false;
|
|
53
|
+
});
|
|
54
|
+
describe('scanSessions', () => {
|
|
55
|
+
it('should return empty array when projects dir does not exist', () => {
|
|
56
|
+
mockFs.existsSync.mockReturnValue(false);
|
|
57
|
+
const sessions = claude_sessions_1.claudeSessionDetector.scanSessions();
|
|
58
|
+
expect(sessions).toEqual([]);
|
|
59
|
+
});
|
|
60
|
+
it('should return sessions with state inactive by default', () => {
|
|
61
|
+
const oldMtime = new Date(Date.now() - 120000); // 2 minutes ago
|
|
62
|
+
mockFs.existsSync.mockImplementation((p) => {
|
|
63
|
+
const pathStr = p.toString();
|
|
64
|
+
return pathStr === projectsDir || pathStr.includes('test-project');
|
|
65
|
+
});
|
|
66
|
+
mockFs.readdirSync.mockImplementation((p) => {
|
|
67
|
+
const pathStr = p.toString();
|
|
68
|
+
if (pathStr === projectsDir)
|
|
69
|
+
return ['test-project'];
|
|
70
|
+
if (pathStr.includes('test-project'))
|
|
71
|
+
return ['session-abc.jsonl'];
|
|
72
|
+
return [];
|
|
73
|
+
});
|
|
74
|
+
mockFs.statSync.mockImplementation((p) => {
|
|
75
|
+
const pathStr = p.toString();
|
|
76
|
+
if (pathStr.includes('.jsonl')) {
|
|
77
|
+
return { mtime: oldMtime, isDirectory: () => false };
|
|
78
|
+
}
|
|
79
|
+
return { isDirectory: () => true };
|
|
80
|
+
});
|
|
81
|
+
mockFs.readFileSync.mockReturnValue('{"sessionId":"session-abc"}\n');
|
|
82
|
+
const sessions = claude_sessions_1.claudeSessionDetector.scanSessions();
|
|
83
|
+
expect(sessions.length).toBe(1);
|
|
84
|
+
expect(sessions[0].state).toBe('inactive');
|
|
85
|
+
expect(sessions[0].sessionKey).toBe('session-abc');
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('checkAndEmitChanges', () => {
|
|
89
|
+
function setupMockSessions(mtimeAgeMs) {
|
|
90
|
+
const mtime = new Date(Date.now() - mtimeAgeMs);
|
|
91
|
+
mockFs.existsSync.mockImplementation((p) => {
|
|
92
|
+
const pathStr = p.toString();
|
|
93
|
+
return pathStr === projectsDir || pathStr.includes('test-project');
|
|
94
|
+
});
|
|
95
|
+
mockFs.readdirSync.mockImplementation((p) => {
|
|
96
|
+
const pathStr = p.toString();
|
|
97
|
+
if (pathStr === projectsDir)
|
|
98
|
+
return ['test-project'];
|
|
99
|
+
if (pathStr.includes('test-project'))
|
|
100
|
+
return ['session-1.jsonl'];
|
|
101
|
+
return [];
|
|
102
|
+
});
|
|
103
|
+
mockFs.statSync.mockImplementation((p) => {
|
|
104
|
+
const pathStr = p.toString();
|
|
105
|
+
if (pathStr.includes('.jsonl')) {
|
|
106
|
+
return { mtime, isDirectory: () => false };
|
|
107
|
+
}
|
|
108
|
+
return { isDirectory: () => true };
|
|
109
|
+
});
|
|
110
|
+
mockFs.readFileSync.mockReturnValue('{"sessionId":"session-1"}\n');
|
|
111
|
+
}
|
|
112
|
+
it('should classify session as active when mtime < 60s ago', () => {
|
|
113
|
+
setupMockSessions(30000); // 30 seconds ago
|
|
114
|
+
const sessionChanges = [];
|
|
115
|
+
claude_sessions_1.claudeSessionDetector.on('session_detected', (s) => sessionChanges.push(s));
|
|
116
|
+
claude_sessions_1.claudeSessionDetector.checkAndEmitChanges();
|
|
117
|
+
expect(sessionChanges.length).toBe(1);
|
|
118
|
+
expect(sessionChanges[0].state).toBe('active');
|
|
119
|
+
});
|
|
120
|
+
it('should classify session as inactive when mtime > 60s ago', () => {
|
|
121
|
+
setupMockSessions(120000); // 2 minutes ago
|
|
122
|
+
const sessionChanges = [];
|
|
123
|
+
claude_sessions_1.claudeSessionDetector.on('session_detected', (s) => sessionChanges.push(s));
|
|
124
|
+
claude_sessions_1.claudeSessionDetector.checkAndEmitChanges();
|
|
125
|
+
expect(sessionChanges.length).toBe(1);
|
|
126
|
+
expect(sessionChanges[0].state).toBe('inactive');
|
|
127
|
+
});
|
|
128
|
+
it('should emit session_changed when session transitions from active to inactive', () => {
|
|
129
|
+
// First scan: active (30s ago)
|
|
130
|
+
setupMockSessions(30000);
|
|
131
|
+
claude_sessions_1.claudeSessionDetector.checkAndEmitChanges();
|
|
132
|
+
// Second scan: inactive (2 min ago)
|
|
133
|
+
setupMockSessions(120000);
|
|
134
|
+
const changedSessions = [];
|
|
135
|
+
claude_sessions_1.claudeSessionDetector.on('session_changed', (s) => changedSessions.push(s));
|
|
136
|
+
claude_sessions_1.claudeSessionDetector.checkAndEmitChanges();
|
|
137
|
+
expect(changedSessions.length).toBe(1);
|
|
138
|
+
expect(changedSessions[0].state).toBe('inactive');
|
|
139
|
+
expect(changedSessions[0].sessionKey).toBe('session-1');
|
|
140
|
+
});
|
|
141
|
+
it('should emit claude_running_changed when active state changes', () => {
|
|
142
|
+
setupMockSessions(30000); // active
|
|
143
|
+
const runningChanges = [];
|
|
144
|
+
claude_sessions_1.claudeSessionDetector.on('claude_running_changed', (running) => runningChanges.push(running));
|
|
145
|
+
claude_sessions_1.claudeSessionDetector.checkAndEmitChanges();
|
|
146
|
+
expect(runningChanges).toEqual([true]);
|
|
147
|
+
// Now go inactive
|
|
148
|
+
setupMockSessions(120000);
|
|
149
|
+
claude_sessions_1.claudeSessionDetector.checkAndEmitChanges();
|
|
150
|
+
expect(runningChanges).toEqual([true, false]);
|
|
151
|
+
});
|
|
152
|
+
it('should emit session_removed when a session disappears', () => {
|
|
153
|
+
// First scan: one session
|
|
154
|
+
setupMockSessions(30000);
|
|
155
|
+
claude_sessions_1.claudeSessionDetector.checkAndEmitChanges();
|
|
156
|
+
// Second scan: no sessions
|
|
157
|
+
mockFs.existsSync.mockReturnValue(false);
|
|
158
|
+
const removedSessions = [];
|
|
159
|
+
claude_sessions_1.claudeSessionDetector.on('session_removed', (s) => removedSessions.push(s));
|
|
160
|
+
claude_sessions_1.claudeSessionDetector.checkAndEmitChanges();
|
|
161
|
+
expect(removedSessions.length).toBe(1);
|
|
162
|
+
expect(removedSessions[0].sessionKey).toBe('session-1');
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
describe('seedKnownSessions', () => {
|
|
166
|
+
function setupMockSessions(sessionIds, mtimeAgeMs) {
|
|
167
|
+
const mtime = new Date(Date.now() - mtimeAgeMs);
|
|
168
|
+
mockFs.existsSync.mockImplementation((p) => {
|
|
169
|
+
const pathStr = p.toString();
|
|
170
|
+
return pathStr === projectsDir || pathStr.includes('test-project');
|
|
171
|
+
});
|
|
172
|
+
mockFs.readdirSync.mockImplementation((p) => {
|
|
173
|
+
const pathStr = p.toString();
|
|
174
|
+
if (pathStr === projectsDir)
|
|
175
|
+
return ['test-project'];
|
|
176
|
+
if (pathStr.includes('test-project'))
|
|
177
|
+
return sessionIds.map((id) => `${id}.jsonl`);
|
|
178
|
+
return [];
|
|
179
|
+
});
|
|
180
|
+
mockFs.statSync.mockImplementation((p) => {
|
|
181
|
+
const pathStr = p.toString();
|
|
182
|
+
if (pathStr.includes('.jsonl')) {
|
|
183
|
+
return { mtime, isDirectory: () => false };
|
|
184
|
+
}
|
|
185
|
+
return { isDirectory: () => true };
|
|
186
|
+
});
|
|
187
|
+
mockFs.readFileSync.mockImplementation((p) => {
|
|
188
|
+
const pathStr = p.toString();
|
|
189
|
+
const match = pathStr.match(/([^/\\]+)\.jsonl$/);
|
|
190
|
+
const id = match ? match[1] : 'unknown';
|
|
191
|
+
return `{"sessionId":"${id}"}\n`;
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
it('should populate lastKnownSessions cache', () => {
|
|
195
|
+
const sessions = [
|
|
196
|
+
{ sessionKey: 'session-a', directory: '/test', state: 'active', lastUsedAt: new Date().toISOString() },
|
|
197
|
+
{ sessionKey: 'session-b', directory: '/test', state: 'inactive', lastUsedAt: new Date().toISOString() },
|
|
198
|
+
];
|
|
199
|
+
claude_sessions_1.claudeSessionDetector.seedKnownSessions(sessions);
|
|
200
|
+
const known = claude_sessions_1.claudeSessionDetector.lastKnownSessions;
|
|
201
|
+
expect(known.size).toBe(2);
|
|
202
|
+
expect(known.has('session-a')).toBe(true);
|
|
203
|
+
expect(known.has('session-b')).toBe(true);
|
|
204
|
+
});
|
|
205
|
+
it('should prevent re-emission of seeded sessions on checkAndEmitChanges', () => {
|
|
206
|
+
setupMockSessions(['session-1'], 30000);
|
|
207
|
+
// Seed the cache with the same session that scanSessions will find
|
|
208
|
+
claude_sessions_1.claudeSessionDetector.seedKnownSessions([
|
|
209
|
+
{ sessionKey: 'session-1', directory: '/test', state: 'active', lastUsedAt: new Date().toISOString() },
|
|
210
|
+
]);
|
|
211
|
+
const detected = [];
|
|
212
|
+
claude_sessions_1.claudeSessionDetector.on('session_detected', (s) => detected.push(s));
|
|
213
|
+
// checkAndEmitChanges should NOT emit session_detected since session-1 is already known
|
|
214
|
+
claude_sessions_1.claudeSessionDetector.checkAndEmitChanges();
|
|
215
|
+
expect(detected.length).toBe(0);
|
|
216
|
+
});
|
|
217
|
+
it('should still detect genuinely new sessions after seeding', () => {
|
|
218
|
+
// Seed with session-1
|
|
219
|
+
claude_sessions_1.claudeSessionDetector.seedKnownSessions([
|
|
220
|
+
{ sessionKey: 'session-1', directory: '/test', state: 'active', lastUsedAt: new Date().toISOString() },
|
|
221
|
+
]);
|
|
222
|
+
// Now scan finds session-1 AND session-2
|
|
223
|
+
setupMockSessions(['session-1', 'session-2'], 30000);
|
|
224
|
+
const detected = [];
|
|
225
|
+
claude_sessions_1.claudeSessionDetector.on('session_detected', (s) => detected.push(s));
|
|
226
|
+
claude_sessions_1.claudeSessionDetector.checkAndEmitChanges();
|
|
227
|
+
// Only session-2 should be emitted as new
|
|
228
|
+
expect(detected.length).toBe(1);
|
|
229
|
+
expect(detected[0].sessionKey).toBe('session-2');
|
|
230
|
+
});
|
|
231
|
+
it('should clear previous cache when re-seeded', () => {
|
|
232
|
+
claude_sessions_1.claudeSessionDetector.seedKnownSessions([
|
|
233
|
+
{ sessionKey: 'old-session', directory: '/test', state: 'inactive', lastUsedAt: new Date().toISOString() },
|
|
234
|
+
]);
|
|
235
|
+
claude_sessions_1.claudeSessionDetector.seedKnownSessions([
|
|
236
|
+
{ sessionKey: 'new-session', directory: '/test', state: 'active', lastUsedAt: new Date().toISOString() },
|
|
237
|
+
]);
|
|
238
|
+
const known = claude_sessions_1.claudeSessionDetector.lastKnownSessions;
|
|
239
|
+
expect(known.size).toBe(1);
|
|
240
|
+
expect(known.has('new-session')).toBe(true);
|
|
241
|
+
expect(known.has('old-session')).toBe(false);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
describe('startWatching with seeded sessions', () => {
|
|
245
|
+
it('should skip initial checkAndEmitChanges when sessions are seeded', () => {
|
|
246
|
+
// Seed sessions first
|
|
247
|
+
claude_sessions_1.claudeSessionDetector.seedKnownSessions([
|
|
248
|
+
{ sessionKey: 'session-1', directory: '/test', state: 'active', lastUsedAt: new Date().toISOString() },
|
|
249
|
+
]);
|
|
250
|
+
const detected = [];
|
|
251
|
+
claude_sessions_1.claudeSessionDetector.on('session_detected', (s) => detected.push(s));
|
|
252
|
+
// Mock scanSessions to return the same session
|
|
253
|
+
mockFs.existsSync.mockReturnValue(true);
|
|
254
|
+
mockFs.readdirSync.mockImplementation((p) => {
|
|
255
|
+
const pathStr = p.toString();
|
|
256
|
+
if (pathStr === projectsDir)
|
|
257
|
+
return ['test-project'];
|
|
258
|
+
if (pathStr.includes('test-project'))
|
|
259
|
+
return ['session-1.jsonl'];
|
|
260
|
+
return [];
|
|
261
|
+
});
|
|
262
|
+
mockFs.statSync.mockImplementation((p) => {
|
|
263
|
+
const pathStr = p.toString();
|
|
264
|
+
if (pathStr.includes('.jsonl')) {
|
|
265
|
+
return { mtime: new Date(), isDirectory: () => false };
|
|
266
|
+
}
|
|
267
|
+
return { isDirectory: () => true };
|
|
268
|
+
});
|
|
269
|
+
mockFs.readFileSync.mockReturnValue('{"sessionId":"session-1"}\n');
|
|
270
|
+
// startWatching should NOT re-emit seeded sessions
|
|
271
|
+
claude_sessions_1.claudeSessionDetector.startWatching(60000); // long interval to avoid timer issues
|
|
272
|
+
expect(detected.length).toBe(0);
|
|
273
|
+
// Cleanup
|
|
274
|
+
claude_sessions_1.claudeSessionDetector.stopWatching();
|
|
275
|
+
});
|
|
276
|
+
it('should do initial scan when not seeded', () => {
|
|
277
|
+
// Don't seed - lastKnownSessions is empty
|
|
278
|
+
mockFs.existsSync.mockReturnValue(true);
|
|
279
|
+
mockFs.readdirSync.mockImplementation((p) => {
|
|
280
|
+
const pathStr = p.toString();
|
|
281
|
+
if (pathStr === projectsDir)
|
|
282
|
+
return ['test-project'];
|
|
283
|
+
if (pathStr.includes('test-project'))
|
|
284
|
+
return ['session-1.jsonl'];
|
|
285
|
+
return [];
|
|
286
|
+
});
|
|
287
|
+
mockFs.statSync.mockImplementation((p) => {
|
|
288
|
+
const pathStr = p.toString();
|
|
289
|
+
if (pathStr.includes('.jsonl')) {
|
|
290
|
+
return { mtime: new Date(), isDirectory: () => false };
|
|
291
|
+
}
|
|
292
|
+
return { isDirectory: () => true };
|
|
293
|
+
});
|
|
294
|
+
mockFs.readFileSync.mockReturnValue('{"sessionId":"session-1"}\n');
|
|
295
|
+
const detected = [];
|
|
296
|
+
claude_sessions_1.claudeSessionDetector.on('session_detected', (s) => detected.push(s));
|
|
297
|
+
claude_sessions_1.claudeSessionDetector.startWatching(60000);
|
|
298
|
+
// Should detect session-1 since cache was empty
|
|
299
|
+
expect(detected.length).toBe(1);
|
|
300
|
+
expect(detected[0].sessionKey).toBe('session-1');
|
|
301
|
+
// Cleanup
|
|
302
|
+
claude_sessions_1.claudeSessionDetector.stopWatching();
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
//# sourceMappingURL=claude-sessions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-sessions.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/claude-sessions.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Spawns and manages Claude CLI processes for terminal sessions
|
|
4
4
|
*/
|
|
5
5
|
import { EventEmitter } from 'events';
|
|
6
|
+
import { PermissionPromptEvent } from './permission-ipc';
|
|
6
7
|
/**
|
|
7
8
|
* Represents a pending approval request that is waiting for user response.
|
|
8
9
|
* Used internally to track active approval requests and manage their timeouts.
|
|
@@ -102,9 +103,15 @@ interface ClaudeProcessManagerEvents {
|
|
|
102
103
|
sdk_message: [event: SdkMessageEvent];
|
|
103
104
|
claude_approval_request: [request: ClaudeApprovalRequest];
|
|
104
105
|
tool_activity: [event: ToolActivityEvent];
|
|
106
|
+
permission_prompt: [event: PermissionPromptEvent];
|
|
105
107
|
thinking_content: [event: ThinkingContentEvent];
|
|
106
108
|
token_usage: [event: TokenUsageEvent];
|
|
107
109
|
task_progress: [event: TaskProgressEvent];
|
|
110
|
+
session_id_captured: [data: {
|
|
111
|
+
terminalSessionId: string;
|
|
112
|
+
sessionId: string;
|
|
113
|
+
directory: string;
|
|
114
|
+
}];
|
|
108
115
|
}
|
|
109
116
|
/** Tool activity event — non-blocking notification of tool execution */
|
|
110
117
|
interface ToolActivityEvent {
|
|
@@ -123,6 +130,14 @@ declare class ClaudeProcessManager extends EventEmitter {
|
|
|
123
130
|
private closedSessions;
|
|
124
131
|
/** Maximum number of auto-restarts per session to prevent chaos */
|
|
125
132
|
private readonly MAX_AUTO_RESTARTS;
|
|
133
|
+
/** Permission IPC managers per session */
|
|
134
|
+
private permissionIpcManagers;
|
|
135
|
+
/** Track which process started each IPC manager (to avoid race conditions on close) */
|
|
136
|
+
private ipcOwnerProcess;
|
|
137
|
+
/** Track directories where we've configured hooks */
|
|
138
|
+
private hookConfiguredDirs;
|
|
139
|
+
/** Track sessions that mobile has explicitly taken over (via claude_resume_session) */
|
|
140
|
+
private takenOverSessions;
|
|
126
141
|
/** Type-safe emit for known events */
|
|
127
142
|
emit<K extends keyof ClaudeProcessManagerEvents>(event: K, ...args: ClaudeProcessManagerEvents[K]): boolean;
|
|
128
143
|
/** Type-safe on for known events */
|
|
@@ -130,13 +145,13 @@ declare class ClaudeProcessManager extends EventEmitter {
|
|
|
130
145
|
/**
|
|
131
146
|
* Start a new Claude session in the specified directory
|
|
132
147
|
*/
|
|
133
|
-
startSession(directory: string, terminalSessionId: string, dangerouslySkipPermissions?: boolean): Promise<{
|
|
148
|
+
startSession(directory: string, terminalSessionId: string, dangerouslySkipPermissions?: boolean, interactivePermissions?: boolean): Promise<{
|
|
134
149
|
cwd: string;
|
|
135
150
|
}>;
|
|
136
151
|
/**
|
|
137
152
|
* Resume an existing Claude session
|
|
138
153
|
*/
|
|
139
|
-
resumeSession(sessionKey: string, directory: string, terminalSessionId: string, dangerouslySkipPermissions?: boolean): Promise<{
|
|
154
|
+
resumeSession(sessionKey: string, directory: string, terminalSessionId: string, dangerouslySkipPermissions?: boolean, interactivePermissions?: boolean): Promise<{
|
|
140
155
|
cwd: string;
|
|
141
156
|
}>;
|
|
142
157
|
/**
|
|
@@ -153,16 +168,20 @@ declare class ClaudeProcessManager extends EventEmitter {
|
|
|
153
168
|
* Used by auto-prompt quick actions where no prior session exists.
|
|
154
169
|
* Spawns claude with stream-json flags, writes the JSONL user message to stdin right away.
|
|
155
170
|
*/
|
|
156
|
-
startAndSendMessage(directory: string, terminalSessionId: string, message: string): Promise<boolean>;
|
|
171
|
+
startAndSendMessage(directory: string, terminalSessionId: string, message: string, dangerouslySkipPermissions?: boolean, interactivePermissions?: boolean): Promise<boolean>;
|
|
157
172
|
/**
|
|
158
173
|
* Check if a session is a Claude session (active or restartable)
|
|
159
174
|
*/
|
|
160
175
|
isClaudeSession(terminalSessionId: string): boolean;
|
|
176
|
+
/**
|
|
177
|
+
* Check if CLI has a running process for this session (not just registered)
|
|
178
|
+
*/
|
|
179
|
+
hasRunningProcess(terminalSessionId: string): boolean;
|
|
161
180
|
/**
|
|
162
181
|
* Register session info without spawning a process.
|
|
163
182
|
* Used when mobile opens a session view - we store the info so we can spawn later on first message.
|
|
164
183
|
*/
|
|
165
|
-
registerSession(sessionKey: string, directory: string, terminalSessionId: string, dangerouslySkipPermissions?: boolean): void;
|
|
184
|
+
registerSession(sessionKey: string, directory: string, terminalSessionId: string, dangerouslySkipPermissions?: boolean, interactivePermissions?: boolean, isRealSession?: boolean): void;
|
|
166
185
|
/**
|
|
167
186
|
* Set up event handlers for the spawned process
|
|
168
187
|
*/
|
|
@@ -198,6 +217,64 @@ declare class ClaudeProcessManager extends EventEmitter {
|
|
|
198
217
|
* Useful when user explicitly wants to reset.
|
|
199
218
|
*/
|
|
200
219
|
clearRestartCounter(terminalSessionId: string): void;
|
|
220
|
+
/**
|
|
221
|
+
* Mark a session as taken over by the mobile user.
|
|
222
|
+
*/
|
|
223
|
+
markTakenOver(terminalSessionId: string): void;
|
|
224
|
+
/**
|
|
225
|
+
* Check if a session has been taken over by the mobile user.
|
|
226
|
+
*/
|
|
227
|
+
isTakenOver(terminalSessionId: string): boolean;
|
|
228
|
+
/**
|
|
229
|
+
* Clear taken-over state for a single session.
|
|
230
|
+
*/
|
|
231
|
+
clearTakenOver(terminalSessionId: string): void;
|
|
232
|
+
/**
|
|
233
|
+
* Clear all taken-over sessions (e.g., when mobile disconnects).
|
|
234
|
+
*/
|
|
235
|
+
clearAllTakenOver(): void;
|
|
236
|
+
/**
|
|
237
|
+
* Get all pending permission prompts across all IPC managers.
|
|
238
|
+
* Used to sync pending permissions to mobile on take-over.
|
|
239
|
+
*/
|
|
240
|
+
getAllPendingPrompts(): PermissionPromptEvent[];
|
|
241
|
+
/**
|
|
242
|
+
* Auto-allow all pending permission prompts across all IPC managers.
|
|
243
|
+
* Called when mobile disconnects so Claude doesn't hang waiting for approval.
|
|
244
|
+
*/
|
|
245
|
+
autoAllowAllPendingPrompts(): void;
|
|
246
|
+
/**
|
|
247
|
+
* Tear down all permission hooks and IPC managers.
|
|
248
|
+
* Called when mobile disconnects — hooks get re-configured on next Take Over + message.
|
|
249
|
+
*/
|
|
250
|
+
cleanupAllPermissionState(): void;
|
|
251
|
+
/**
|
|
252
|
+
* Write permission rules to disk so the hook script can read them.
|
|
253
|
+
* Rules are written to a well-known temp file that the hook reads on each invocation.
|
|
254
|
+
*/
|
|
255
|
+
updatePermissionRules(rules: any[]): void;
|
|
256
|
+
/**
|
|
257
|
+
* Configure the PreToolUse hook in the project's .claude/settings.local.json.
|
|
258
|
+
* This tells Claude Code to run our hook script before each tool use.
|
|
259
|
+
*/
|
|
260
|
+
private configureHook;
|
|
261
|
+
/**
|
|
262
|
+
* Remove our hook from the project's .claude/settings.local.json.
|
|
263
|
+
*/
|
|
264
|
+
private removeHook;
|
|
265
|
+
/**
|
|
266
|
+
* Start the permission IPC manager for a session.
|
|
267
|
+
* Listens for hook permission requests and forwards them as events.
|
|
268
|
+
*/
|
|
269
|
+
private startPermissionIpc;
|
|
270
|
+
/**
|
|
271
|
+
* Stop the permission IPC manager for a session.
|
|
272
|
+
*/
|
|
273
|
+
private stopPermissionIpc;
|
|
274
|
+
/**
|
|
275
|
+
* Handle a permission response from mobile for a specific prompt.
|
|
276
|
+
*/
|
|
277
|
+
handlePermissionResponse(promptId: string, decision: 'allow' | 'deny', reason?: string): void;
|
|
201
278
|
/**
|
|
202
279
|
* Checks Claude CLI output for approval patterns and emits approval request events.
|
|
203
280
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-process.d.ts","sourceRoot":"","sources":["../../src/tools/claude-process.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-process.d.ts","sourceRoot":"","sources":["../../src/tools/claude-process.ts"],"names":[],"mappings":"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"}
|