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.
Files changed (56) hide show
  1. package/.env.example +30 -0
  2. package/LICENSE +21 -0
  3. package/README.md +298 -0
  4. package/dist/config/environment.d.ts +29 -0
  5. package/dist/config/environment.d.ts.map +1 -0
  6. package/dist/config/environment.js +48 -0
  7. package/dist/config/environment.js.map +1 -0
  8. package/dist/index.d.ts +5 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +61 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/server.d.ts +14 -0
  13. package/dist/server.d.ts.map +1 -0
  14. package/dist/server.js +201 -0
  15. package/dist/server.js.map +1 -0
  16. package/dist/session/ProcessExecutor.d.ts +20 -0
  17. package/dist/session/ProcessExecutor.d.ts.map +1 -0
  18. package/dist/session/ProcessExecutor.js +286 -0
  19. package/dist/session/ProcessExecutor.js.map +1 -0
  20. package/dist/session/Session.d.ts +60 -0
  21. package/dist/session/Session.d.ts.map +1 -0
  22. package/dist/session/Session.js +5 -0
  23. package/dist/session/Session.js.map +1 -0
  24. package/dist/session/SessionManager.d.ts +53 -0
  25. package/dist/session/SessionManager.d.ts.map +1 -0
  26. package/dist/session/SessionManager.js +228 -0
  27. package/dist/session/SessionManager.js.map +1 -0
  28. package/dist/tools/claude-code.d.ts +17 -0
  29. package/dist/tools/claude-code.d.ts.map +1 -0
  30. package/dist/tools/claude-code.js +79 -0
  31. package/dist/tools/claude-code.js.map +1 -0
  32. package/dist/tools/codex.d.ts +17 -0
  33. package/dist/tools/codex.d.ts.map +1 -0
  34. package/dist/tools/codex.js +79 -0
  35. package/dist/tools/codex.js.map +1 -0
  36. package/dist/tools/get-session-status.d.ts +16 -0
  37. package/dist/tools/get-session-status.d.ts.map +1 -0
  38. package/dist/tools/get-session-status.js +88 -0
  39. package/dist/tools/get-session-status.js.map +1 -0
  40. package/dist/tools/resume.d.ts +16 -0
  41. package/dist/tools/resume.d.ts.map +1 -0
  42. package/dist/tools/resume.js +68 -0
  43. package/dist/tools/resume.js.map +1 -0
  44. package/dist/tools/types.d.ts +28 -0
  45. package/dist/tools/types.d.ts.map +1 -0
  46. package/dist/tools/types.js +74 -0
  47. package/dist/tools/types.js.map +1 -0
  48. package/dist/utils/errors.d.ts +54 -0
  49. package/dist/utils/errors.d.ts.map +1 -0
  50. package/dist/utils/errors.js +66 -0
  51. package/dist/utils/errors.js.map +1 -0
  52. package/dist/utils/logger.d.ts +14 -0
  53. package/dist/utils/logger.d.ts.map +1 -0
  54. package/dist/utils/logger.js +80 -0
  55. package/dist/utils/logger.js.map +1 -0
  56. 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"}