@yu_robotics/remote-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +94 -0
- package/bin/remote-cli.js +2 -0
- package/dist/client/MessageHandler.d.ts +92 -0
- package/dist/client/MessageHandler.d.ts.map +1 -0
- package/dist/client/MessageHandler.js +496 -0
- package/dist/client/MessageHandler.js.map +1 -0
- package/dist/client/WebSocketClient.d.ts +109 -0
- package/dist/client/WebSocketClient.d.ts.map +1 -0
- package/dist/client/WebSocketClient.js +234 -0
- package/dist/client/WebSocketClient.js.map +1 -0
- package/dist/commands/config.d.ts +35 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +195 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/init.d.ts +25 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +112 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/start.d.ts +20 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +108 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +37 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +71 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +23 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +52 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/config/ConfigManager.d.ts +109 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +262 -0
- package/dist/config/ConfigManager.js.map +1 -0
- package/dist/executor/ClaudeExecutor.d.ts +89 -0
- package/dist/executor/ClaudeExecutor.d.ts.map +1 -0
- package/dist/executor/ClaudeExecutor.js +365 -0
- package/dist/executor/ClaudeExecutor.js.map +1 -0
- package/dist/executor/ClaudePersistentExecutor.d.ts +175 -0
- package/dist/executor/ClaudePersistentExecutor.d.ts.map +1 -0
- package/dist/executor/ClaudePersistentExecutor.js +958 -0
- package/dist/executor/ClaudePersistentExecutor.js.map +1 -0
- package/dist/executor/index.d.ts +20 -0
- package/dist/executor/index.d.ts.map +1 -0
- package/dist/executor/index.js +48 -0
- package/dist/executor/index.js.map +1 -0
- package/dist/hooks/ClaudeCodeHooks.d.ts +281 -0
- package/dist/hooks/ClaudeCodeHooks.d.ts.map +1 -0
- package/dist/hooks/ClaudeCodeHooks.js +350 -0
- package/dist/hooks/ClaudeCodeHooks.js.map +1 -0
- package/dist/hooks/FeishuNotificationAdapter.d.ts +87 -0
- package/dist/hooks/FeishuNotificationAdapter.d.ts.map +1 -0
- package/dist/hooks/FeishuNotificationAdapter.js +280 -0
- package/dist/hooks/FeishuNotificationAdapter.js.map +1 -0
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +10 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +333 -0
- package/dist/index.js.map +1 -0
- package/dist/security/DirectoryGuard.d.ts +54 -0
- package/dist/security/DirectoryGuard.d.ts.map +1 -0
- package/dist/security/DirectoryGuard.js +143 -0
- package/dist/security/DirectoryGuard.js.map +1 -0
- package/dist/types/config.d.ts +46 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +22 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +110 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/FeishuMessageFormatter.d.ts +84 -0
- package/dist/utils/FeishuMessageFormatter.d.ts.map +1 -0
- package/dist/utils/FeishuMessageFormatter.js +395 -0
- package/dist/utils/FeishuMessageFormatter.js.map +1 -0
- package/dist/utils/stripAnsi.d.ts +21 -0
- package/dist/utils/stripAnsi.d.ts.map +1 -0
- package/dist/utils/stripAnsi.js +30 -0
- package/dist/utils/stripAnsi.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ClaudeExecutor = void 0;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const os_1 = __importDefault(require("os"));
|
|
11
|
+
/**
|
|
12
|
+
* Get Claude's global sessions directory
|
|
13
|
+
*/
|
|
14
|
+
function getClaudeSessionsDir() {
|
|
15
|
+
const homeDir = os_1.default.homedir();
|
|
16
|
+
const possiblePaths = [
|
|
17
|
+
path_1.default.join(homeDir, '.claude', 'sessions'),
|
|
18
|
+
path_1.default.join(homeDir, '.config', 'claude', 'sessions'),
|
|
19
|
+
path_1.default.join(homeDir, 'Library', 'Application Support', 'Claude', 'sessions'),
|
|
20
|
+
];
|
|
21
|
+
for (const dir of possiblePaths) {
|
|
22
|
+
if (fs_1.default.existsSync(dir)) {
|
|
23
|
+
return dir;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Claude Executor
|
|
30
|
+
* Manages session ID for continuity using --resume
|
|
31
|
+
*/
|
|
32
|
+
class ClaudeExecutor {
|
|
33
|
+
directoryGuard;
|
|
34
|
+
currentWorkingDirectory;
|
|
35
|
+
isExecuting = false;
|
|
36
|
+
isDestroyed = false;
|
|
37
|
+
defaultTimeout = 300000; // 5 minutes
|
|
38
|
+
sessionId = null;
|
|
39
|
+
sessionFilePath;
|
|
40
|
+
constructor(directoryGuard) {
|
|
41
|
+
this.directoryGuard = directoryGuard;
|
|
42
|
+
this.currentWorkingDirectory = process.cwd();
|
|
43
|
+
// Store session ID in a file in the working directory
|
|
44
|
+
this.sessionFilePath = path_1.default.join(this.currentWorkingDirectory, '.claude-session');
|
|
45
|
+
this.loadSessionId();
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Load session ID from file if exists
|
|
49
|
+
*/
|
|
50
|
+
loadSessionId() {
|
|
51
|
+
try {
|
|
52
|
+
if (fs_1.default.existsSync(this.sessionFilePath)) {
|
|
53
|
+
const data = fs_1.default.readFileSync(this.sessionFilePath, 'utf-8');
|
|
54
|
+
const session = JSON.parse(data);
|
|
55
|
+
if (session.id) {
|
|
56
|
+
this.sessionId = session.id;
|
|
57
|
+
console.log(`[Claude] Loaded session ID: ${this.sessionId}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.error('[Claude] Failed to load session ID:', error);
|
|
63
|
+
this.sessionId = null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Save session ID to file
|
|
68
|
+
*/
|
|
69
|
+
saveSessionId(sessionId) {
|
|
70
|
+
try {
|
|
71
|
+
const data = JSON.stringify({
|
|
72
|
+
id: sessionId,
|
|
73
|
+
savedAt: new Date().toISOString(),
|
|
74
|
+
});
|
|
75
|
+
fs_1.default.writeFileSync(this.sessionFilePath, data, 'utf-8');
|
|
76
|
+
console.log(`[Claude] Saved session ID: ${sessionId}`);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.error('[Claude] Failed to save session ID:', error);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get recent session ID from Claude's sessions directory
|
|
84
|
+
* Finds the most recently modified session file
|
|
85
|
+
*/
|
|
86
|
+
async getRecentSessionId() {
|
|
87
|
+
try {
|
|
88
|
+
const sessionsDir = getClaudeSessionsDir();
|
|
89
|
+
if (!sessionsDir) {
|
|
90
|
+
console.log('[Claude] No sessions directory found');
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
// List all session directories
|
|
94
|
+
const entries = fs_1.default.readdirSync(sessionsDir, { withFileTypes: true });
|
|
95
|
+
const sessionDirs = entries
|
|
96
|
+
.filter(entry => entry.isDirectory())
|
|
97
|
+
.map(entry => {
|
|
98
|
+
const sessionPath = path_1.default.join(sessionsDir, entry.name);
|
|
99
|
+
const stats = fs_1.default.statSync(sessionPath);
|
|
100
|
+
return {
|
|
101
|
+
id: entry.name,
|
|
102
|
+
mtime: stats.mtime,
|
|
103
|
+
};
|
|
104
|
+
})
|
|
105
|
+
.filter(session => {
|
|
106
|
+
// Validate UUID format
|
|
107
|
+
const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
108
|
+
return uuidPattern.test(session.id);
|
|
109
|
+
})
|
|
110
|
+
.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
|
|
111
|
+
if (sessionDirs.length === 0) {
|
|
112
|
+
console.log('[Claude] No sessions found in directory');
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
// Return the most recent session ID
|
|
116
|
+
const recentSession = sessionDirs[0];
|
|
117
|
+
console.log(`[Claude] Found recent session: ${recentSession.id} (last modified: ${recentSession.mtime.toISOString()})`);
|
|
118
|
+
return recentSession.id;
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error('[Claude] Failed to get recent session ID:', error);
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get current working directory
|
|
127
|
+
*/
|
|
128
|
+
getCurrentWorkingDirectory() {
|
|
129
|
+
return this.currentWorkingDirectory;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Set working directory
|
|
133
|
+
* @param targetPath Target path
|
|
134
|
+
* @throws If path is not safe
|
|
135
|
+
*/
|
|
136
|
+
setWorkingDirectory(targetPath) {
|
|
137
|
+
const resolvedPath = this.directoryGuard.resolveWorkingDirectory(targetPath, this.currentWorkingDirectory);
|
|
138
|
+
this.currentWorkingDirectory = resolvedPath;
|
|
139
|
+
// Update session file path
|
|
140
|
+
this.sessionFilePath = path_1.default.join(this.currentWorkingDirectory, '.claude-session');
|
|
141
|
+
this.loadSessionId();
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Execute Claude command
|
|
145
|
+
* @param prompt Command prompt
|
|
146
|
+
* @param options Execution options
|
|
147
|
+
* @returns Execution result
|
|
148
|
+
*/
|
|
149
|
+
async execute(prompt, options = {}) {
|
|
150
|
+
if (this.isDestroyed) {
|
|
151
|
+
return {
|
|
152
|
+
success: false,
|
|
153
|
+
error: 'Executor has been destroyed',
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
if (this.isExecuting) {
|
|
157
|
+
return {
|
|
158
|
+
success: false,
|
|
159
|
+
error: 'Executor is busy, please wait for current task to complete',
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
this.isExecuting = true;
|
|
163
|
+
try {
|
|
164
|
+
// Only use timeout if explicitly provided in options
|
|
165
|
+
// Default timeout is disabled to prevent premature termination of long-running tasks
|
|
166
|
+
// Users can cancel with /abort if needed
|
|
167
|
+
const timeout = options.timeout; // undefined means no timeout
|
|
168
|
+
// If we don't have a session ID, try to get recent one from Claude's sessions directory
|
|
169
|
+
if (!this.sessionId) {
|
|
170
|
+
console.log('[Claude] No session ID, checking for recent sessions...');
|
|
171
|
+
this.sessionId = await this.getRecentSessionId();
|
|
172
|
+
if (this.sessionId) {
|
|
173
|
+
this.saveSessionId(this.sessionId);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const result = await this.executeWithClaudeCLI(prompt, options, timeout);
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
return {
|
|
181
|
+
success: false,
|
|
182
|
+
error: this.formatError(error),
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
this.isExecuting = false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Execute using local Claude Code CLI
|
|
191
|
+
*/
|
|
192
|
+
async executeWithClaudeCLI(prompt, options, timeout) {
|
|
193
|
+
return new Promise((resolve, reject) => {
|
|
194
|
+
const outputChunks = [];
|
|
195
|
+
let timeoutTimer;
|
|
196
|
+
// Build claude command arguments
|
|
197
|
+
const args = ['--print'];
|
|
198
|
+
if (this.sessionId) {
|
|
199
|
+
args.push('--resume', this.sessionId);
|
|
200
|
+
console.log(`[Claude] Resuming session: ${this.sessionId}`);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
console.log('[Claude] Starting new session');
|
|
204
|
+
}
|
|
205
|
+
args.push(prompt);
|
|
206
|
+
console.log(`[Claude] Starting: claude ${args.map(a => a.includes(' ') ? `"${a}"` : a).join(' ')}`);
|
|
207
|
+
console.log(`[Claude] Working directory: ${this.currentWorkingDirectory}`);
|
|
208
|
+
const child = (0, child_process_1.spawn)('claude', args, {
|
|
209
|
+
cwd: this.currentWorkingDirectory,
|
|
210
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
211
|
+
env: {
|
|
212
|
+
...process.env,
|
|
213
|
+
CI: 'true',
|
|
214
|
+
FORCE_COLOR: '0',
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
console.log(`[Claude] Process started with PID: ${child.pid}`);
|
|
218
|
+
// Handle stdout
|
|
219
|
+
child.stdout.on('data', (data) => {
|
|
220
|
+
const chunk = data.toString();
|
|
221
|
+
console.log('[Claude stdout]', chunk);
|
|
222
|
+
outputChunks.push(chunk);
|
|
223
|
+
if (options.onStream) {
|
|
224
|
+
try {
|
|
225
|
+
options.onStream(chunk);
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
console.error('[Claude] onStream callback error:', error);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
// Handle stderr
|
|
233
|
+
child.stderr.on('data', (data) => {
|
|
234
|
+
const chunk = data.toString();
|
|
235
|
+
console.error('[Claude stderr]', chunk);
|
|
236
|
+
outputChunks.push(chunk);
|
|
237
|
+
if (options.onStream) {
|
|
238
|
+
try {
|
|
239
|
+
options.onStream(chunk);
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
console.error('[Claude] onStream callback error:', error);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
// Handle timeout (only if explicitly provided)
|
|
247
|
+
// Default timeout is disabled to prevent premature termination
|
|
248
|
+
if (timeout !== undefined) {
|
|
249
|
+
timeoutTimer = setTimeout(() => {
|
|
250
|
+
console.error('[Claude] Command timeout');
|
|
251
|
+
child.kill('SIGTERM');
|
|
252
|
+
reject(new Error('Execution timeout exceeded'));
|
|
253
|
+
}, timeout);
|
|
254
|
+
}
|
|
255
|
+
// Handle process completion
|
|
256
|
+
child.on('close', (code) => {
|
|
257
|
+
if (timeoutTimer) {
|
|
258
|
+
clearTimeout(timeoutTimer);
|
|
259
|
+
}
|
|
260
|
+
console.log(`[Claude] Process exited with code: ${code}`);
|
|
261
|
+
const output = outputChunks.join('');
|
|
262
|
+
// Check if session ID is in output (for new sessions)
|
|
263
|
+
if (!this.sessionId) {
|
|
264
|
+
const uuidPattern = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi;
|
|
265
|
+
const matches = output.match(uuidPattern);
|
|
266
|
+
if (matches && matches.length > 0) {
|
|
267
|
+
this.sessionId = matches[0];
|
|
268
|
+
this.saveSessionId(this.sessionId);
|
|
269
|
+
console.log(`[Claude] New session ID: ${this.sessionId}`);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
if (code === 0) {
|
|
273
|
+
console.log('[Claude] Execution completed successfully');
|
|
274
|
+
resolve({
|
|
275
|
+
success: true,
|
|
276
|
+
output: output.trim(),
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
console.error(`[Claude] Execution failed with code ${code}`);
|
|
281
|
+
resolve({
|
|
282
|
+
success: false,
|
|
283
|
+
error: `Claude Code process exited with code ${code}${output ? '\n' + output : ''}`,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
// Handle process errors
|
|
288
|
+
child.on('error', (error) => {
|
|
289
|
+
if (timeoutTimer) {
|
|
290
|
+
clearTimeout(timeoutTimer);
|
|
291
|
+
}
|
|
292
|
+
console.error('[Claude] Process error:', error);
|
|
293
|
+
if (error.message.includes('ENOENT')) {
|
|
294
|
+
reject(new Error('Claude Code CLI not found. Please ensure Claude Code is installed and available in PATH.\n' +
|
|
295
|
+
'Installation: https://docs.anthropic.com/en/docs/claude-code/installation'));
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
reject(error);
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Format error message
|
|
305
|
+
*/
|
|
306
|
+
formatError(error) {
|
|
307
|
+
if (error instanceof Error) {
|
|
308
|
+
if (error.message.includes('timeout')) {
|
|
309
|
+
return `Execution timeout exceeded. The task took too long to complete.`;
|
|
310
|
+
}
|
|
311
|
+
if (error.message.includes('ENOENT')) {
|
|
312
|
+
return `Claude Code CLI not found. Please ensure it's installed and available in PATH.`;
|
|
313
|
+
}
|
|
314
|
+
if (error.message.includes('EACCES') || error.message.includes('Permission denied')) {
|
|
315
|
+
return `Permission denied. You may not have access to this resource.`;
|
|
316
|
+
}
|
|
317
|
+
return `Execution error: ${error.message}`;
|
|
318
|
+
}
|
|
319
|
+
return 'Unknown execution error';
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Reset execution context
|
|
323
|
+
* Clears the session ID so next command starts a new session
|
|
324
|
+
*/
|
|
325
|
+
resetContext() {
|
|
326
|
+
console.log('[Claude] Resetting session context');
|
|
327
|
+
this.sessionId = null;
|
|
328
|
+
// Remove session file
|
|
329
|
+
try {
|
|
330
|
+
if (fs_1.default.existsSync(this.sessionFilePath)) {
|
|
331
|
+
fs_1.default.unlinkSync(this.sessionFilePath);
|
|
332
|
+
console.log('[Claude] Session file removed');
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
console.error('[Claude] Failed to remove session file:', error);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Abort current command execution
|
|
341
|
+
* For ClaudeExecutor, this just resets the executing flag since
|
|
342
|
+
* each command spawns a new process and cannot be easily aborted mid-execution
|
|
343
|
+
*/
|
|
344
|
+
async abort() {
|
|
345
|
+
if (!this.isExecuting) {
|
|
346
|
+
console.log('[Claude] No command is currently executing');
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
349
|
+
console.log('[Claude] Abort requested, but spawn-mode executor cannot abort running command');
|
|
350
|
+
// Note: Since this executor spawns a new process for each command,
|
|
351
|
+
// we cannot easily abort it. We just reset the flag so the next
|
|
352
|
+
// command can be processed (the current one will complete in background).
|
|
353
|
+
this.isExecuting = false;
|
|
354
|
+
return true;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Destroy executor
|
|
358
|
+
*/
|
|
359
|
+
destroy() {
|
|
360
|
+
this.isDestroyed = true;
|
|
361
|
+
this.isExecuting = false;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
exports.ClaudeExecutor = ClaudeExecutor;
|
|
365
|
+
//# sourceMappingURL=ClaudeExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaudeExecutor.js","sourceRoot":"","sources":["../../src/executor/ClaudeExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { DirectoryGuard } from '../security/DirectoryGuard';
|
|
2
|
+
import { StructuredContent, ToolUseInfo, ToolResultInfo } from '../types';
|
|
3
|
+
import { EventEmitter } from 'events';
|
|
4
|
+
/**
|
|
5
|
+
* Persistent Claude Executor options
|
|
6
|
+
*/
|
|
7
|
+
export interface PersistentClaudeOptions {
|
|
8
|
+
/** Stream output callback (for backward compatibility) */
|
|
9
|
+
onStream?: (chunk: string) => void;
|
|
10
|
+
/** Structured content callback (for rich formatting) */
|
|
11
|
+
onStructuredContent?: (content: StructuredContent) => void;
|
|
12
|
+
/** Tool use callback (for rich formatting) */
|
|
13
|
+
onToolUse?: (toolUse: ToolUseInfo) => void;
|
|
14
|
+
/** Tool result callback (for rich formatting) */
|
|
15
|
+
onToolResult?: (toolResult: ToolResultInfo) => void;
|
|
16
|
+
/** Execution timeout (milliseconds), default 300000 (5 minutes) */
|
|
17
|
+
timeout?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Persistent Claude execution result
|
|
21
|
+
*/
|
|
22
|
+
export interface PersistentClaudeResult {
|
|
23
|
+
/** Whether execution was successful */
|
|
24
|
+
success: boolean;
|
|
25
|
+
/** Complete output content */
|
|
26
|
+
output?: string;
|
|
27
|
+
/** Error message */
|
|
28
|
+
error?: string;
|
|
29
|
+
/** Session ID abbreviation (last 8 chars) */
|
|
30
|
+
sessionAbbr?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Claude Persistent Executor
|
|
34
|
+
*
|
|
35
|
+
* Maintains a long-running Claude process and communicates via stdin/stdout
|
|
36
|
+
* using stream-json format for real-time bidirectional communication.
|
|
37
|
+
*/
|
|
38
|
+
export declare class ClaudePersistentExecutor extends EventEmitter {
|
|
39
|
+
private directoryGuard;
|
|
40
|
+
private currentWorkingDirectory;
|
|
41
|
+
private isDestroyed;
|
|
42
|
+
private defaultTimeout;
|
|
43
|
+
private sessionId;
|
|
44
|
+
private sessionFilePath;
|
|
45
|
+
private claudeProcess;
|
|
46
|
+
private isStarting;
|
|
47
|
+
private isStopping;
|
|
48
|
+
private commandQueue;
|
|
49
|
+
private isProcessing;
|
|
50
|
+
private currentOutputBuffer;
|
|
51
|
+
private currentStreamCallback?;
|
|
52
|
+
private currentToolUseCallback?;
|
|
53
|
+
private currentToolResultCallback?;
|
|
54
|
+
private currentCommandResolve?;
|
|
55
|
+
private currentCommandReject?;
|
|
56
|
+
private currentTimeoutTimer?;
|
|
57
|
+
private structuredContentBlocks;
|
|
58
|
+
private currentStructuredCallback?;
|
|
59
|
+
private currentTaskId;
|
|
60
|
+
private currentTaskStartTime;
|
|
61
|
+
private isWaitingForInput;
|
|
62
|
+
private inputRequestCallbacks;
|
|
63
|
+
private inputDetectionTimer?;
|
|
64
|
+
private lastOutputTime;
|
|
65
|
+
private activityTrackingEnabled;
|
|
66
|
+
constructor(directoryGuard: DirectoryGuard);
|
|
67
|
+
/**
|
|
68
|
+
* Load session ID from file if exists
|
|
69
|
+
*/
|
|
70
|
+
private loadSessionId;
|
|
71
|
+
/**
|
|
72
|
+
* Save session ID to file
|
|
73
|
+
*/
|
|
74
|
+
private saveSessionId;
|
|
75
|
+
/**
|
|
76
|
+
* Get recent session ID from Claude's sessions directory
|
|
77
|
+
*/
|
|
78
|
+
private getRecentSessionId;
|
|
79
|
+
/**
|
|
80
|
+
* Get current working directory
|
|
81
|
+
*/
|
|
82
|
+
getCurrentWorkingDirectory(): string;
|
|
83
|
+
/**
|
|
84
|
+
* Set working directory
|
|
85
|
+
*/
|
|
86
|
+
setWorkingDirectory(targetPath: string): void;
|
|
87
|
+
/**
|
|
88
|
+
* Start the persistent Claude process
|
|
89
|
+
*/
|
|
90
|
+
private startProcess;
|
|
91
|
+
/**
|
|
92
|
+
* Stop the persistent Claude process
|
|
93
|
+
*/
|
|
94
|
+
private stopProcess;
|
|
95
|
+
/**
|
|
96
|
+
* Reset the command timeout timer when activity is detected
|
|
97
|
+
* This prevents timeout during long-running tasks with continuous output
|
|
98
|
+
*
|
|
99
|
+
* NOTE: This method is currently disabled because inactivity timeout can cause
|
|
100
|
+
* state inconsistency - the executor may timeout while Claude process is still
|
|
101
|
+
* running, leading to confusing behavior where user sees timeout error but
|
|
102
|
+
* Claude is still working. Users can use /abort to cancel long-running tasks.
|
|
103
|
+
*/
|
|
104
|
+
private resetActivityTimeout;
|
|
105
|
+
/**
|
|
106
|
+
* Handle a line of JSON output from Claude
|
|
107
|
+
*/
|
|
108
|
+
private handleOutputLine;
|
|
109
|
+
/**
|
|
110
|
+
* Start a timer to detect if user input is requested
|
|
111
|
+
* If no new output arrives within the timeout, check if the last output contains input request patterns
|
|
112
|
+
*/
|
|
113
|
+
private startInputDetectionTimer;
|
|
114
|
+
/**
|
|
115
|
+
* Handle input request by notifying user and waiting for response
|
|
116
|
+
*/
|
|
117
|
+
private handleInputRequest;
|
|
118
|
+
/**
|
|
119
|
+
* Check if the output indicates a request for user input
|
|
120
|
+
* This detects patterns like "Press Enter to continue", "(y/n)", etc.
|
|
121
|
+
*/
|
|
122
|
+
private isInputRequest;
|
|
123
|
+
/**
|
|
124
|
+
* Request user input through hooks
|
|
125
|
+
* Returns a promise that resolves when user provides input via sendInput()
|
|
126
|
+
*/
|
|
127
|
+
private requestInteractiveInput;
|
|
128
|
+
/**
|
|
129
|
+
* Send user input to the Claude process
|
|
130
|
+
* This is called by MessageHandler when user sends a message while waiting for input
|
|
131
|
+
*/
|
|
132
|
+
sendInput(input: string): boolean;
|
|
133
|
+
/**
|
|
134
|
+
* Check if currently waiting for user input
|
|
135
|
+
*/
|
|
136
|
+
isWaitingInput(): boolean;
|
|
137
|
+
/**
|
|
138
|
+
* Complete the current command
|
|
139
|
+
*/
|
|
140
|
+
private completeCurrentCommand;
|
|
141
|
+
/**
|
|
142
|
+
* Reset current command state
|
|
143
|
+
*/
|
|
144
|
+
private resetCurrentCommand;
|
|
145
|
+
/**
|
|
146
|
+
* Process the command queue
|
|
147
|
+
*/
|
|
148
|
+
private processQueue;
|
|
149
|
+
/**
|
|
150
|
+
* Execute a command through the persistent Claude process
|
|
151
|
+
*/
|
|
152
|
+
execute(prompt: string, options?: PersistentClaudeOptions): Promise<PersistentClaudeResult>;
|
|
153
|
+
/**
|
|
154
|
+
* Abort current command execution
|
|
155
|
+
* Stops the current process and rejects the pending command
|
|
156
|
+
*/
|
|
157
|
+
abort(): Promise<boolean>;
|
|
158
|
+
/**
|
|
159
|
+
* Reset execution context
|
|
160
|
+
*/
|
|
161
|
+
resetContext(): void;
|
|
162
|
+
/**
|
|
163
|
+
* Destroy executor and cleanup
|
|
164
|
+
*/
|
|
165
|
+
destroy(): Promise<void>;
|
|
166
|
+
/**
|
|
167
|
+
* Check if process is running
|
|
168
|
+
*/
|
|
169
|
+
isProcessRunning(): boolean;
|
|
170
|
+
/**
|
|
171
|
+
* Get current session ID
|
|
172
|
+
*/
|
|
173
|
+
getSessionId(): string | null;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=ClaudePersistentExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaudePersistentExecutor.d.ts","sourceRoot":"","sources":["../../src/executor/ClaudePersistentExecutor.ts"],"names":[],"mappings":"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"}
|