closeli-mcp-gateway 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/.env.example +30 -0
- package/LICENSE +21 -0
- package/README.md +298 -0
- package/dist/config/environment.d.ts +29 -0
- package/dist/config/environment.d.ts.map +1 -0
- package/dist/config/environment.js +48 -0
- package/dist/config/environment.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +14 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +201 -0
- package/dist/server.js.map +1 -0
- package/dist/session/ProcessExecutor.d.ts +20 -0
- package/dist/session/ProcessExecutor.d.ts.map +1 -0
- package/dist/session/ProcessExecutor.js +286 -0
- package/dist/session/ProcessExecutor.js.map +1 -0
- package/dist/session/Session.d.ts +60 -0
- package/dist/session/Session.d.ts.map +1 -0
- package/dist/session/Session.js +5 -0
- package/dist/session/Session.js.map +1 -0
- package/dist/session/SessionManager.d.ts +53 -0
- package/dist/session/SessionManager.d.ts.map +1 -0
- package/dist/session/SessionManager.js +228 -0
- package/dist/session/SessionManager.js.map +1 -0
- package/dist/tools/claude-code.d.ts +17 -0
- package/dist/tools/claude-code.d.ts.map +1 -0
- package/dist/tools/claude-code.js +79 -0
- package/dist/tools/claude-code.js.map +1 -0
- package/dist/tools/codex.d.ts +17 -0
- package/dist/tools/codex.d.ts.map +1 -0
- package/dist/tools/codex.js +79 -0
- package/dist/tools/codex.js.map +1 -0
- package/dist/tools/get-session-status.d.ts +16 -0
- package/dist/tools/get-session-status.d.ts.map +1 -0
- package/dist/tools/get-session-status.js +88 -0
- package/dist/tools/get-session-status.js.map +1 -0
- package/dist/tools/resume.d.ts +16 -0
- package/dist/tools/resume.d.ts.map +1 -0
- package/dist/tools/resume.js +68 -0
- package/dist/tools/resume.js.map +1 -0
- package/dist/tools/types.d.ts +28 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +74 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/utils/errors.d.ts +54 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +66 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +80 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Manager
|
|
3
|
+
* Responsible for creating, managing, and cleaning up sessions
|
|
4
|
+
*/
|
|
5
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
import { config } from '../config/environment.js';
|
|
8
|
+
import { SessionNotFoundError } from '../utils/errors.js';
|
|
9
|
+
import { spawnProcess, setupOutputCapture, killProcessGracefully } from './ProcessExecutor.js';
|
|
10
|
+
/**
|
|
11
|
+
* SessionManager singleton class
|
|
12
|
+
*/
|
|
13
|
+
export class SessionManager {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.sessions = new Map();
|
|
16
|
+
this.cleanupTimer = null;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create new session and start process
|
|
20
|
+
*/
|
|
21
|
+
async createSession(tool, workspace, prompt) {
|
|
22
|
+
const sessionId = uuidv4();
|
|
23
|
+
logger.info('Creating new session', {
|
|
24
|
+
sessionId,
|
|
25
|
+
tool,
|
|
26
|
+
workspace,
|
|
27
|
+
promptLength: prompt.length,
|
|
28
|
+
});
|
|
29
|
+
try {
|
|
30
|
+
// Start process
|
|
31
|
+
const childProcess = spawnProcess(tool, workspace, prompt);
|
|
32
|
+
if (!childProcess.pid) {
|
|
33
|
+
throw new Error('Process started but no PID assigned');
|
|
34
|
+
}
|
|
35
|
+
// Create session object
|
|
36
|
+
const now = new Date();
|
|
37
|
+
const session = {
|
|
38
|
+
id: sessionId,
|
|
39
|
+
tool,
|
|
40
|
+
workspace,
|
|
41
|
+
prompt,
|
|
42
|
+
process: childProcess,
|
|
43
|
+
pid: childProcess.pid,
|
|
44
|
+
stdout: [],
|
|
45
|
+
stderr: [],
|
|
46
|
+
exitCode: null,
|
|
47
|
+
createdAt: now,
|
|
48
|
+
lastClientCheckTime: now,
|
|
49
|
+
completedAt: null,
|
|
50
|
+
status: 'running',
|
|
51
|
+
};
|
|
52
|
+
// Set up output capture
|
|
53
|
+
setupOutputCapture(childProcess, session);
|
|
54
|
+
// Store session
|
|
55
|
+
this.sessions.set(sessionId, session);
|
|
56
|
+
logger.info('Session created successfully', {
|
|
57
|
+
sessionId,
|
|
58
|
+
pid: childProcess.pid,
|
|
59
|
+
});
|
|
60
|
+
return sessionId;
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
logger.error('Failed to create session', {
|
|
64
|
+
sessionId,
|
|
65
|
+
error: error instanceof Error ? error.message : String(error),
|
|
66
|
+
});
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get session and update last check time
|
|
72
|
+
*/
|
|
73
|
+
getSession(sessionId) {
|
|
74
|
+
const session = this.sessions.get(sessionId);
|
|
75
|
+
if (!session) {
|
|
76
|
+
logger.warn('Session not found', { sessionId });
|
|
77
|
+
throw new SessionNotFoundError(sessionId);
|
|
78
|
+
}
|
|
79
|
+
// Update last check time
|
|
80
|
+
session.lastClientCheckTime = new Date();
|
|
81
|
+
return session;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Wait for session result, throw error if timeout
|
|
85
|
+
*/
|
|
86
|
+
async waitForResult(sessionId, maxWaitMs) {
|
|
87
|
+
const session = this.getSession(sessionId);
|
|
88
|
+
const startTime = Date.now();
|
|
89
|
+
logger.debug('Waiting for session result', {
|
|
90
|
+
sessionId,
|
|
91
|
+
maxWaitMs,
|
|
92
|
+
currentStatus: session.status,
|
|
93
|
+
});
|
|
94
|
+
// Poll and wait
|
|
95
|
+
while (Date.now() - startTime < maxWaitMs) {
|
|
96
|
+
// Update check time
|
|
97
|
+
session.lastClientCheckTime = new Date();
|
|
98
|
+
// Check if completed
|
|
99
|
+
if (session.status !== 'running') {
|
|
100
|
+
logger.info('Session completed', {
|
|
101
|
+
sessionId,
|
|
102
|
+
status: session.status,
|
|
103
|
+
exitCode: session.exitCode,
|
|
104
|
+
duration: Date.now() - startTime,
|
|
105
|
+
});
|
|
106
|
+
return {
|
|
107
|
+
complete: true,
|
|
108
|
+
stdout: session.stdout,
|
|
109
|
+
stderr: session.stderr,
|
|
110
|
+
exitCode: session.exitCode,
|
|
111
|
+
status: session.status,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
// Wait a short time before checking again
|
|
115
|
+
await sleep(500);
|
|
116
|
+
}
|
|
117
|
+
// Timed out but not completed
|
|
118
|
+
logger.debug('Session wait timed out', {
|
|
119
|
+
sessionId,
|
|
120
|
+
waited: maxWaitMs,
|
|
121
|
+
});
|
|
122
|
+
return {
|
|
123
|
+
complete: false,
|
|
124
|
+
status: session.status,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Clean up session (terminate process and remove from Map)
|
|
129
|
+
*/
|
|
130
|
+
async cleanupSession(sessionId) {
|
|
131
|
+
const session = this.sessions.get(sessionId);
|
|
132
|
+
if (!session) {
|
|
133
|
+
logger.debug('Session already cleaned up', { sessionId });
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
logger.info('Cleaning up session', {
|
|
137
|
+
sessionId,
|
|
138
|
+
status: session.status,
|
|
139
|
+
pid: session.pid,
|
|
140
|
+
});
|
|
141
|
+
// Terminate process (if still running)
|
|
142
|
+
// PTY doesn't have killed property, handled by killProcessGracefully
|
|
143
|
+
if (session.status === 'running') {
|
|
144
|
+
await killProcessGracefully(session.process);
|
|
145
|
+
}
|
|
146
|
+
// Remove from Map
|
|
147
|
+
this.sessions.delete(sessionId);
|
|
148
|
+
logger.info('Session cleaned up', { sessionId });
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Start orphan session cleanup
|
|
152
|
+
*/
|
|
153
|
+
startOrphanCleanup() {
|
|
154
|
+
if (this.cleanupTimer) {
|
|
155
|
+
logger.warn('Orphan cleanup already running');
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
logger.info('Starting orphan cleanup', {
|
|
159
|
+
interval: config.CLEANUP_INTERVAL_MS,
|
|
160
|
+
threshold: config.ORPHAN_CLEANUP_MS,
|
|
161
|
+
});
|
|
162
|
+
this.cleanupTimer = setInterval(() => {
|
|
163
|
+
this.checkOrphanedSessions();
|
|
164
|
+
}, config.CLEANUP_INTERVAL_MS);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Stop orphan session cleanup
|
|
168
|
+
*/
|
|
169
|
+
stopOrphanCleanup() {
|
|
170
|
+
if (this.cleanupTimer) {
|
|
171
|
+
clearInterval(this.cleanupTimer);
|
|
172
|
+
this.cleanupTimer = null;
|
|
173
|
+
logger.info('Orphan cleanup stopped');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Check and clean up orphaned sessions
|
|
178
|
+
*/
|
|
179
|
+
async checkOrphanedSessions() {
|
|
180
|
+
const now = Date.now();
|
|
181
|
+
const orphaned = [];
|
|
182
|
+
for (const [sessionId, session] of this.sessions.entries()) {
|
|
183
|
+
const timeSinceLastCheck = now - session.lastClientCheckTime.getTime();
|
|
184
|
+
if (timeSinceLastCheck > config.ORPHAN_CLEANUP_MS) {
|
|
185
|
+
orphaned.push(sessionId);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (orphaned.length > 0) {
|
|
189
|
+
logger.warn('Found orphaned sessions', {
|
|
190
|
+
count: orphaned.length,
|
|
191
|
+
sessions: orphaned,
|
|
192
|
+
});
|
|
193
|
+
for (const sessionId of orphaned) {
|
|
194
|
+
await this.cleanupSession(sessionId);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Clean up all sessions (used when shutting down server)
|
|
200
|
+
*/
|
|
201
|
+
async cleanupAllSessions() {
|
|
202
|
+
logger.info('Cleaning up all sessions', {
|
|
203
|
+
count: this.sessions.size,
|
|
204
|
+
});
|
|
205
|
+
const sessionIds = Array.from(this.sessions.keys());
|
|
206
|
+
for (const sessionId of sessionIds) {
|
|
207
|
+
await this.cleanupSession(sessionId);
|
|
208
|
+
}
|
|
209
|
+
logger.info('All sessions cleaned up');
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Get current active session count
|
|
213
|
+
*/
|
|
214
|
+
getActiveSessionCount() {
|
|
215
|
+
return this.sessions.size;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Global singleton instance
|
|
220
|
+
*/
|
|
221
|
+
export const sessionManager = new SessionManager();
|
|
222
|
+
/**
|
|
223
|
+
* Helper function: async sleep
|
|
224
|
+
*/
|
|
225
|
+
function sleep(ms) {
|
|
226
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=SessionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../src/session/SessionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code tool implementation
|
|
3
|
+
* Used to start new claude-code tasks
|
|
4
|
+
*/
|
|
5
|
+
import { ToolResponse } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Claude Code tool parameters
|
|
8
|
+
*/
|
|
9
|
+
export interface ClaudeCodeParams {
|
|
10
|
+
workspace: string;
|
|
11
|
+
prompt: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Claude Code tool handler
|
|
15
|
+
*/
|
|
16
|
+
export declare function handleClaudeCodeTool(params: ClaudeCodeParams): Promise<ToolResponse>;
|
|
17
|
+
//# sourceMappingURL=claude-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/tools/claude-code.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAIL,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AA+BD;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CA6C1F"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code tool implementation
|
|
3
|
+
* Used to start new claude-code tasks
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
import { config } from '../config/environment.js';
|
|
7
|
+
import { ValidationError } from '../utils/errors.js';
|
|
8
|
+
import { sessionManager } from '../session/SessionManager.js';
|
|
9
|
+
import { formatSuccessResponse, formatContinuationResponse, formatErrorResponse, } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Validate workspace path
|
|
12
|
+
*/
|
|
13
|
+
function validateWorkspace(workspace) {
|
|
14
|
+
if (!workspace || typeof workspace !== 'string') {
|
|
15
|
+
throw new ValidationError('workspace is required and must be a string');
|
|
16
|
+
}
|
|
17
|
+
// Prevent path traversal attacks
|
|
18
|
+
if (workspace.includes('..')) {
|
|
19
|
+
throw new ValidationError('workspace path cannot contain ".."');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Validate prompt
|
|
24
|
+
*/
|
|
25
|
+
function validatePrompt(prompt) {
|
|
26
|
+
if (!prompt || typeof prompt !== 'string') {
|
|
27
|
+
throw new ValidationError('prompt is required and must be a string');
|
|
28
|
+
}
|
|
29
|
+
// Can add prompt length limit
|
|
30
|
+
const maxLength = 10000; // 10KB
|
|
31
|
+
if (prompt.length > maxLength) {
|
|
32
|
+
throw new ValidationError(`prompt is too long (max ${maxLength} characters)`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Claude Code tool handler
|
|
37
|
+
*/
|
|
38
|
+
export async function handleClaudeCodeTool(params) {
|
|
39
|
+
logger.info('Claude Code tool called', {
|
|
40
|
+
workspace: params.workspace,
|
|
41
|
+
promptLength: params.prompt?.length || 0,
|
|
42
|
+
});
|
|
43
|
+
try {
|
|
44
|
+
// Validate parameters
|
|
45
|
+
validateWorkspace(params.workspace);
|
|
46
|
+
validatePrompt(params.prompt);
|
|
47
|
+
// Create new session and start process
|
|
48
|
+
const sessionId = await sessionManager.createSession('claude-code', params.workspace, params.prompt);
|
|
49
|
+
try {
|
|
50
|
+
// Wait for initial response timeout
|
|
51
|
+
const result = await sessionManager.waitForResult(sessionId, config.RESPONSE_TIMEOUT_MS);
|
|
52
|
+
if (result.complete) {
|
|
53
|
+
// Completed within timeout - return result and cleanup
|
|
54
|
+
await sessionManager.cleanupSession(sessionId);
|
|
55
|
+
logger.info('Claude Code task completed within timeout', { sessionId });
|
|
56
|
+
return formatSuccessResponse(result);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Timeout not completed - return sessionId, prompt client to use resume
|
|
60
|
+
logger.info('Claude Code task running beyond timeout, returning sessionId', { sessionId });
|
|
61
|
+
return formatContinuationResponse(sessionId, 'claude-code');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
logger.error('Error waiting for claude-code result', {
|
|
66
|
+
sessionId,
|
|
67
|
+
error: error instanceof Error ? error.message : String(error),
|
|
68
|
+
});
|
|
69
|
+
return formatErrorResponse(error, sessionId);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
logger.error('Error in claude-code tool', {
|
|
74
|
+
error: error instanceof Error ? error.message : String(error),
|
|
75
|
+
});
|
|
76
|
+
return formatErrorResponse(error);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/tools/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex tool implementation
|
|
3
|
+
* Used to start new codex tasks
|
|
4
|
+
*/
|
|
5
|
+
import { ToolResponse } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Codex tool parameters
|
|
8
|
+
*/
|
|
9
|
+
export interface CodexParams {
|
|
10
|
+
workspace: string;
|
|
11
|
+
prompt: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Codex tool handler
|
|
15
|
+
*/
|
|
16
|
+
export declare function handleCodexTool(params: CodexParams): Promise<ToolResponse>;
|
|
17
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/tools/codex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAIL,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AA+BD;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAyChF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex tool implementation
|
|
3
|
+
* Used to start new codex tasks
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
import { config } from '../config/environment.js';
|
|
7
|
+
import { ValidationError } from '../utils/errors.js';
|
|
8
|
+
import { sessionManager } from '../session/SessionManager.js';
|
|
9
|
+
import { formatSuccessResponse, formatContinuationResponse, formatErrorResponse, } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Validate workspace path
|
|
12
|
+
*/
|
|
13
|
+
function validateWorkspace(workspace) {
|
|
14
|
+
if (!workspace || typeof workspace !== 'string') {
|
|
15
|
+
throw new ValidationError('workspace is required and must be a string');
|
|
16
|
+
}
|
|
17
|
+
// Prevent path traversal attacks
|
|
18
|
+
if (workspace.includes('..')) {
|
|
19
|
+
throw new ValidationError('workspace path cannot contain ".."');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Validate prompt
|
|
24
|
+
*/
|
|
25
|
+
function validatePrompt(prompt) {
|
|
26
|
+
if (!prompt || typeof prompt !== 'string') {
|
|
27
|
+
throw new ValidationError('prompt is required and must be a string');
|
|
28
|
+
}
|
|
29
|
+
// Can add prompt length limit
|
|
30
|
+
const maxLength = 10000; // 10KB
|
|
31
|
+
if (prompt.length > maxLength) {
|
|
32
|
+
throw new ValidationError(`prompt is too long (max ${maxLength} characters)`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Codex tool handler
|
|
37
|
+
*/
|
|
38
|
+
export async function handleCodexTool(params) {
|
|
39
|
+
logger.info('Codex tool called', {
|
|
40
|
+
workspace: params.workspace,
|
|
41
|
+
promptLength: params.prompt?.length || 0,
|
|
42
|
+
});
|
|
43
|
+
try {
|
|
44
|
+
// Validate parameters
|
|
45
|
+
validateWorkspace(params.workspace);
|
|
46
|
+
validatePrompt(params.prompt);
|
|
47
|
+
// Create new session and start process
|
|
48
|
+
const sessionId = await sessionManager.createSession('codex', params.workspace, params.prompt);
|
|
49
|
+
try {
|
|
50
|
+
// Wait for initial response timeout
|
|
51
|
+
const result = await sessionManager.waitForResult(sessionId, config.RESPONSE_TIMEOUT_MS);
|
|
52
|
+
if (result.complete) {
|
|
53
|
+
// Completed within timeout - return result and cleanup
|
|
54
|
+
await sessionManager.cleanupSession(sessionId);
|
|
55
|
+
logger.info('Codex task completed within timeout', { sessionId });
|
|
56
|
+
return formatSuccessResponse(result);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Timeout not completed - return sessionId, prompt client to use resume
|
|
60
|
+
logger.info('Codex task running beyond timeout, returning sessionId', { sessionId });
|
|
61
|
+
return formatContinuationResponse(sessionId, 'codex');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
logger.error('Error waiting for codex result', {
|
|
66
|
+
sessionId,
|
|
67
|
+
error: error instanceof Error ? error.message : String(error),
|
|
68
|
+
});
|
|
69
|
+
return formatErrorResponse(error, sessionId);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
logger.error('Error in codex tool', {
|
|
74
|
+
error: error instanceof Error ? error.message : String(error),
|
|
75
|
+
});
|
|
76
|
+
return formatErrorResponse(error);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/tools/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get session status tool
|
|
3
|
+
* Used to query current running status of a task
|
|
4
|
+
*/
|
|
5
|
+
import { ToolResponse } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Session status query parameters
|
|
8
|
+
*/
|
|
9
|
+
export interface GetSessionStatusParams {
|
|
10
|
+
sessionId: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Get session status tool handler
|
|
14
|
+
*/
|
|
15
|
+
export declare function handleGetSessionStatusTool(params: GetSessionStatusParams): Promise<ToolResponse>;
|
|
16
|
+
//# sourceMappingURL=get-session-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-session-status.d.ts","sourceRoot":"","sources":["../../src/tools/get-session-status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAuB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;CACnB;AAgBD;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,YAAY,CAAC,CAmEvB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get session status tool
|
|
3
|
+
* Used to query current running status of a task
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
import { ValidationError } from '../utils/errors.js';
|
|
7
|
+
import { sessionManager } from '../session/SessionManager.js';
|
|
8
|
+
import { formatErrorResponse } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Validate sessionId
|
|
11
|
+
*/
|
|
12
|
+
function validateSessionId(sessionId) {
|
|
13
|
+
if (!sessionId || typeof sessionId !== 'string') {
|
|
14
|
+
throw new ValidationError('sessionId is required and must be a string');
|
|
15
|
+
}
|
|
16
|
+
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
17
|
+
if (!uuidRegex.test(sessionId)) {
|
|
18
|
+
throw new ValidationError('sessionId must be a valid UUID');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get session status tool handler
|
|
23
|
+
*/
|
|
24
|
+
export async function handleGetSessionStatusTool(params) {
|
|
25
|
+
logger.info('Get session status tool called', {
|
|
26
|
+
sessionId: params.sessionId,
|
|
27
|
+
});
|
|
28
|
+
try {
|
|
29
|
+
validateSessionId(params.sessionId);
|
|
30
|
+
const session = sessionManager.getSession(params.sessionId);
|
|
31
|
+
// Calculate running time
|
|
32
|
+
const now = Date.now();
|
|
33
|
+
const runningTime = Math.floor((now - session.createdAt.getTime()) / 1000); // seconds
|
|
34
|
+
const lastCheckTime = Math.floor((now - session.lastClientCheckTime.getTime()) / 1000); // seconds
|
|
35
|
+
// Format status information
|
|
36
|
+
const statusText = `
|
|
37
|
+
Session Status Information
|
|
38
|
+
==========================
|
|
39
|
+
|
|
40
|
+
Session ID: ${session.id}
|
|
41
|
+
Tool Type: ${session.tool}
|
|
42
|
+
Process PID: ${session.pid}
|
|
43
|
+
Current Status: ${session.status}
|
|
44
|
+
|
|
45
|
+
Time Information:
|
|
46
|
+
- Created At: ${session.createdAt.toISOString()}
|
|
47
|
+
- Running Duration: ${runningTime} seconds
|
|
48
|
+
- Time Since Last Check: ${lastCheckTime} seconds
|
|
49
|
+
|
|
50
|
+
Workspace: ${session.workspace}
|
|
51
|
+
Prompt Length: ${session.prompt.length} characters
|
|
52
|
+
|
|
53
|
+
Output Buffers:
|
|
54
|
+
- Standard Output Lines: ${session.stdout.length}
|
|
55
|
+
- Standard Error Lines: ${session.stderr.length}
|
|
56
|
+
${session.exitCode !== null ? `- Exit Code: ${session.exitCode}` : ''}
|
|
57
|
+
${session.completedAt ? `- Completed At: ${session.completedAt.toISOString()}` : ''}
|
|
58
|
+
|
|
59
|
+
Recent Output Preview:
|
|
60
|
+
${session.stdout.slice(-5).join('\n') || '(No standard output yet)'}
|
|
61
|
+
`.trim();
|
|
62
|
+
return {
|
|
63
|
+
content: [
|
|
64
|
+
{
|
|
65
|
+
type: 'text',
|
|
66
|
+
text: statusText,
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
_meta: {
|
|
70
|
+
sessionId: session.id,
|
|
71
|
+
status: session.status,
|
|
72
|
+
pid: session.pid,
|
|
73
|
+
runningTimeSeconds: runningTime,
|
|
74
|
+
stdoutLines: session.stdout.length,
|
|
75
|
+
stderrLines: session.stderr.length,
|
|
76
|
+
exitCode: session.exitCode,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
logger.error('Error in get-session-status tool', {
|
|
82
|
+
sessionId: params.sessionId,
|
|
83
|
+
error: error instanceof Error ? error.message : String(error),
|
|
84
|
+
});
|
|
85
|
+
return formatErrorResponse(error, params.sessionId);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=get-session-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-session-status.js","sourceRoot":"","sources":["../../src/tools/get-session-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resume tool implementation
|
|
3
|
+
* Used to continue waiting for any task type result (universal)
|
|
4
|
+
*/
|
|
5
|
+
import { ToolResponse } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Resume tool parameters
|
|
8
|
+
*/
|
|
9
|
+
export interface ResumeParams {
|
|
10
|
+
sessionId: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Resume tool handler
|
|
14
|
+
*/
|
|
15
|
+
export declare function handleResumeTool(params: ResumeParams): Promise<ToolResponse>;
|
|
16
|
+
//# sourceMappingURL=resume.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../src/tools/resume.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAIL,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAiBD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CA4ClF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resume tool implementation
|
|
3
|
+
* Used to continue waiting for any task type result (universal)
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
import { config } from '../config/environment.js';
|
|
7
|
+
import { ValidationError } from '../utils/errors.js';
|
|
8
|
+
import { sessionManager } from '../session/SessionManager.js';
|
|
9
|
+
import { formatSuccessResponse, formatContinuationResponse, formatErrorResponse, } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Validate sessionId (simple UUID format validation)
|
|
12
|
+
*/
|
|
13
|
+
function validateSessionId(sessionId) {
|
|
14
|
+
if (!sessionId || typeof sessionId !== 'string') {
|
|
15
|
+
throw new ValidationError('sessionId is required and must be a string');
|
|
16
|
+
}
|
|
17
|
+
// Simple UUID format validation
|
|
18
|
+
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
19
|
+
if (!uuidRegex.test(sessionId)) {
|
|
20
|
+
throw new ValidationError('sessionId must be a valid UUID');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Resume tool handler
|
|
25
|
+
*/
|
|
26
|
+
export async function handleResumeTool(params) {
|
|
27
|
+
logger.info('Resume tool called', {
|
|
28
|
+
sessionId: params.sessionId,
|
|
29
|
+
});
|
|
30
|
+
try {
|
|
31
|
+
// Validate sessionId
|
|
32
|
+
validateSessionId(params.sessionId);
|
|
33
|
+
// Get session (automatically updates lastClientCheckTime)
|
|
34
|
+
const session = sessionManager.getSession(params.sessionId);
|
|
35
|
+
logger.debug('Resuming session', {
|
|
36
|
+
sessionId: params.sessionId,
|
|
37
|
+
tool: session.tool,
|
|
38
|
+
status: session.status,
|
|
39
|
+
});
|
|
40
|
+
// Wait for result (using buffer time)
|
|
41
|
+
const remaining = config.RESPONSE_TIMEOUT_MS - 5000; // 5 second buffer
|
|
42
|
+
const result = await sessionManager.waitForResult(params.sessionId, remaining);
|
|
43
|
+
if (result.complete) {
|
|
44
|
+
// Completed - return result and cleanup
|
|
45
|
+
await sessionManager.cleanupSession(params.sessionId);
|
|
46
|
+
logger.info('Session completed via resume', {
|
|
47
|
+
sessionId: params.sessionId,
|
|
48
|
+
tool: session.tool,
|
|
49
|
+
});
|
|
50
|
+
return formatSuccessResponse(result);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Still not completed - return sessionId for client to continue calling resume
|
|
54
|
+
logger.info('Session still running, returning sessionId again', {
|
|
55
|
+
sessionId: params.sessionId,
|
|
56
|
+
});
|
|
57
|
+
return formatContinuationResponse(params.sessionId);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
logger.error('Error in resume tool', {
|
|
62
|
+
sessionId: params.sessionId,
|
|
63
|
+
error: error instanceof Error ? error.message : String(error),
|
|
64
|
+
});
|
|
65
|
+
return formatErrorResponse(error, params.sessionId);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/tools/resume.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,GAEpB,MAAM,YAAY,CAAC;AASpB;;GAEG;AACH,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,IAAI,eAAe,CAAC,4CAA4C,CAAC,CAAC;IAC1E,CAAC;IAED,gCAAgC;IAChC,MAAM,SAAS,GAAG,iEAAiE,CAAC;IACpF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,eAAe,CAAC,gCAAgC,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAoB;IACzD,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;QAChC,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,qBAAqB;QACrB,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEpC,0DAA0D;QAC1D,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE5D,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE;YAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,sCAAsC;QACtC,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC,kBAAkB;QACvE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAE/E,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,wCAAwC;YACxC,MAAM,cAAc,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;gBAC1C,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB,CAAC,CAAC;YACH,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,+EAA+E;YAC/E,MAAM,CAAC,IAAI,CAAC,kDAAkD,EAAE;gBAC9D,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CAAC,CAAC;YACH,OAAO,0BAA0B,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;YACnC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;QACH,OAAO,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
|