@troykelly/openclaw-projects 0.0.29 → 0.0.30

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.
@@ -0,0 +1,586 @@
1
+ /**
2
+ * Terminal session management and command execution tools.
3
+ * Provides tools for starting/listing/terminating sessions, sending commands,
4
+ * sending keystrokes, and capturing pane content.
5
+ */
6
+ import { z } from 'zod';
7
+ import { sanitizeErrorMessage } from '../utils/sanitize.js';
8
+ /** UUID validation regex */
9
+ const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
10
+ /**
11
+ * Validate UUID format.
12
+ */
13
+ function isValidUuid(id) {
14
+ return UUID_REGEX.test(id);
15
+ }
16
+ /**
17
+ * Strip HTML tags from a string.
18
+ */
19
+ function stripHtml(text) {
20
+ return text
21
+ .replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '')
22
+ .replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi, '')
23
+ .replace(/<[^>]*>/g, '')
24
+ .trim();
25
+ }
26
+ // ==================== terminal_session_start ====================
27
+ /** Parameters for terminal_session_start */
28
+ export const TerminalSessionStartParamsSchema = z.object({
29
+ connection_id: z.string().min(1, 'Connection ID is required'),
30
+ session_name: z.string().max(100, 'Session name must be 100 characters or less').optional(),
31
+ initial_command: z.string().max(2000, 'Initial command must be 2000 characters or less').optional(),
32
+ tags: z.string().max(500, 'Tags must be 500 characters or less').optional(),
33
+ notes: z.string().max(2000, 'Notes must be 2000 characters or less').optional(),
34
+ });
35
+ /**
36
+ * Creates the terminal_session_start tool.
37
+ */
38
+ export function createTerminalSessionStartTool(options) {
39
+ const { client, logger, user_id } = options;
40
+ return {
41
+ name: 'terminal_session_start',
42
+ description: 'Start a new tmux session on a connection. Returns session ID for use with send_command and other tools.',
43
+ parameters: TerminalSessionStartParamsSchema,
44
+ async execute(params) {
45
+ const parseResult = TerminalSessionStartParamsSchema.safeParse(params);
46
+ if (!parseResult.success) {
47
+ const errorMessage = parseResult.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ');
48
+ return { success: false, error: errorMessage };
49
+ }
50
+ const { connection_id, session_name, initial_command, tags, notes } = parseResult.data;
51
+ if (!isValidUuid(connection_id)) {
52
+ return { success: false, error: 'Invalid connection_id format. Expected UUID.' };
53
+ }
54
+ logger.info('terminal_session_start invoked', {
55
+ user_id,
56
+ connectionId: connection_id,
57
+ hasInitialCommand: !!initial_command,
58
+ });
59
+ try {
60
+ const body = { connection_id };
61
+ if (session_name)
62
+ body.tmux_session_name = session_name;
63
+ if (initial_command)
64
+ body.initial_command = initial_command;
65
+ if (tags)
66
+ body.tags = tags.split(',').map((t) => t.trim()).filter(Boolean);
67
+ if (notes)
68
+ body.notes = stripHtml(notes);
69
+ const response = await client.post('/api/terminal/sessions', body, { user_id });
70
+ if (!response.success) {
71
+ logger.error('terminal_session_start API error', {
72
+ user_id,
73
+ connectionId: connection_id,
74
+ status: response.error.status,
75
+ code: response.error.code,
76
+ });
77
+ return { success: false, error: response.error.message || 'Failed to start session' };
78
+ }
79
+ const session = response.data;
80
+ logger.debug('terminal_session_start completed', {
81
+ user_id,
82
+ sessionId: session.id,
83
+ tmuxName: session.tmux_session_name,
84
+ });
85
+ return {
86
+ success: true,
87
+ data: {
88
+ content: `Started session "${session.tmux_session_name}" (ID: ${session.id}) — status: ${session.status}`,
89
+ details: {
90
+ session_id: session.id,
91
+ tmux_session_name: session.tmux_session_name,
92
+ status: session.status,
93
+ user_id,
94
+ },
95
+ },
96
+ };
97
+ }
98
+ catch (error) {
99
+ logger.error('terminal_session_start failed', {
100
+ user_id,
101
+ connectionId: connection_id,
102
+ error: error instanceof Error ? error.message : String(error),
103
+ });
104
+ return { success: false, error: sanitizeErrorMessage(error) };
105
+ }
106
+ },
107
+ };
108
+ }
109
+ // ==================== terminal_session_list ====================
110
+ /** Parameters for terminal_session_list */
111
+ export const TerminalSessionListParamsSchema = z.object({
112
+ connection_id: z.string().optional(),
113
+ status: z.string().max(50).optional(),
114
+ limit: z.number().int().min(1).max(200).optional(),
115
+ offset: z.number().int().min(0).optional(),
116
+ });
117
+ /**
118
+ * Creates the terminal_session_list tool.
119
+ */
120
+ export function createTerminalSessionListTool(options) {
121
+ const { client, logger, user_id } = options;
122
+ return {
123
+ name: 'terminal_session_list',
124
+ description: 'List terminal sessions. Optionally filter by connection or status (active, terminated, etc.).',
125
+ parameters: TerminalSessionListParamsSchema,
126
+ async execute(params) {
127
+ const parseResult = TerminalSessionListParamsSchema.safeParse(params);
128
+ if (!parseResult.success) {
129
+ const errorMessage = parseResult.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ');
130
+ return { success: false, error: errorMessage };
131
+ }
132
+ const { connection_id, status, limit = 50, offset = 0 } = parseResult.data;
133
+ if (connection_id && !isValidUuid(connection_id)) {
134
+ return { success: false, error: 'Invalid connection_id format. Expected UUID.' };
135
+ }
136
+ logger.info('terminal_session_list invoked', { user_id, connection_id, status, limit, offset });
137
+ try {
138
+ const queryParams = new URLSearchParams({
139
+ limit: String(limit),
140
+ offset: String(offset),
141
+ });
142
+ if (connection_id)
143
+ queryParams.set('connection_id', connection_id);
144
+ if (status)
145
+ queryParams.set('status', status);
146
+ const response = await client.get(`/api/terminal/sessions?${queryParams.toString()}`, { user_id });
147
+ if (!response.success) {
148
+ logger.error('terminal_session_list API error', {
149
+ user_id,
150
+ status: response.error.status,
151
+ code: response.error.code,
152
+ });
153
+ return { success: false, error: response.error.message || 'Failed to list sessions' };
154
+ }
155
+ const sessions = response.data.sessions ?? response.data.items ?? [];
156
+ const total = response.data.total ?? sessions.length;
157
+ if (sessions.length === 0) {
158
+ return {
159
+ success: true,
160
+ data: {
161
+ content: 'No terminal sessions found.',
162
+ details: { sessions: [], total: 0, user_id },
163
+ },
164
+ };
165
+ }
166
+ const content = sessions
167
+ .map((s) => {
168
+ const parts = [s.tmux_session_name, `[${s.status}]`];
169
+ if (s.tags && s.tags.length > 0)
170
+ parts.push(`{${s.tags.join(', ')}}`);
171
+ return `- ${parts.join(' ')} (ID: ${s.id})`;
172
+ })
173
+ .join('\n');
174
+ logger.debug('terminal_session_list completed', { user_id, count: sessions.length });
175
+ return {
176
+ success: true,
177
+ data: {
178
+ content,
179
+ details: { sessions, total, user_id },
180
+ },
181
+ };
182
+ }
183
+ catch (error) {
184
+ logger.error('terminal_session_list failed', {
185
+ user_id,
186
+ error: error instanceof Error ? error.message : String(error),
187
+ });
188
+ return { success: false, error: sanitizeErrorMessage(error) };
189
+ }
190
+ },
191
+ };
192
+ }
193
+ // ==================== terminal_session_terminate ====================
194
+ /** Parameters for terminal_session_terminate */
195
+ export const TerminalSessionTerminateParamsSchema = z.object({
196
+ session_id: z.string().min(1, 'Session ID is required'),
197
+ });
198
+ /**
199
+ * Creates the terminal_session_terminate tool.
200
+ */
201
+ export function createTerminalSessionTerminateTool(options) {
202
+ const { client, logger, user_id } = options;
203
+ return {
204
+ name: 'terminal_session_terminate',
205
+ description: 'Terminate a running terminal session. The session history is preserved.',
206
+ parameters: TerminalSessionTerminateParamsSchema,
207
+ async execute(params) {
208
+ const parseResult = TerminalSessionTerminateParamsSchema.safeParse(params);
209
+ if (!parseResult.success) {
210
+ const errorMessage = parseResult.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ');
211
+ return { success: false, error: errorMessage };
212
+ }
213
+ const { session_id } = parseResult.data;
214
+ if (!isValidUuid(session_id)) {
215
+ return { success: false, error: 'Invalid session ID format. Expected UUID.' };
216
+ }
217
+ logger.info('terminal_session_terminate invoked', { user_id, sessionId: session_id });
218
+ try {
219
+ const response = await client.delete(`/api/terminal/sessions/${session_id}`, { user_id });
220
+ if (!response.success) {
221
+ if (response.error.code === 'NOT_FOUND') {
222
+ return { success: false, error: 'Session not found.' };
223
+ }
224
+ logger.error('terminal_session_terminate API error', {
225
+ user_id,
226
+ sessionId: session_id,
227
+ status: response.error.status,
228
+ });
229
+ return { success: false, error: response.error.message || 'Failed to terminate session' };
230
+ }
231
+ logger.debug('terminal_session_terminate completed', { user_id, sessionId: session_id });
232
+ return {
233
+ success: true,
234
+ data: {
235
+ content: `Session ${session_id} terminated.`,
236
+ details: { session_id, user_id },
237
+ },
238
+ };
239
+ }
240
+ catch (error) {
241
+ logger.error('terminal_session_terminate failed', {
242
+ user_id,
243
+ sessionId: session_id,
244
+ error: error instanceof Error ? error.message : String(error),
245
+ });
246
+ return { success: false, error: sanitizeErrorMessage(error) };
247
+ }
248
+ },
249
+ };
250
+ }
251
+ // ==================== terminal_session_info ====================
252
+ /** Parameters for terminal_session_info */
253
+ export const TerminalSessionInfoParamsSchema = z.object({
254
+ session_id: z.string().min(1, 'Session ID is required'),
255
+ });
256
+ /**
257
+ * Creates the terminal_session_info tool.
258
+ */
259
+ export function createTerminalSessionInfoTool(options) {
260
+ const { client, logger, user_id } = options;
261
+ return {
262
+ name: 'terminal_session_info',
263
+ description: 'Get detailed information about a terminal session including windows, panes, and connection details.',
264
+ parameters: TerminalSessionInfoParamsSchema,
265
+ async execute(params) {
266
+ const parseResult = TerminalSessionInfoParamsSchema.safeParse(params);
267
+ if (!parseResult.success) {
268
+ const errorMessage = parseResult.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ');
269
+ return { success: false, error: errorMessage };
270
+ }
271
+ const { session_id } = parseResult.data;
272
+ if (!isValidUuid(session_id)) {
273
+ return { success: false, error: 'Invalid session ID format. Expected UUID.' };
274
+ }
275
+ logger.info('terminal_session_info invoked', { user_id, sessionId: session_id });
276
+ try {
277
+ const response = await client.get(`/api/terminal/sessions/${session_id}`, { user_id });
278
+ if (!response.success) {
279
+ if (response.error.code === 'NOT_FOUND') {
280
+ return { success: false, error: 'Session not found.' };
281
+ }
282
+ logger.error('terminal_session_info API error', {
283
+ user_id,
284
+ sessionId: session_id,
285
+ status: response.error.status,
286
+ });
287
+ return { success: false, error: response.error.message || 'Failed to get session info' };
288
+ }
289
+ const session = response.data;
290
+ const lines = [
291
+ `**${session.tmux_session_name}** [${session.status}]`,
292
+ ];
293
+ if (session.connection) {
294
+ lines.push(`Connection: ${session.connection.name}${session.connection.host ? ` (${session.connection.host})` : ''}`);
295
+ }
296
+ if (session.started_at)
297
+ lines.push(`Started: ${session.started_at}`);
298
+ if (session.last_activity_at)
299
+ lines.push(`Last activity: ${session.last_activity_at}`);
300
+ if (session.windows && session.windows.length > 0) {
301
+ lines.push(`\nWindows (${session.windows.length}):`);
302
+ for (const win of session.windows) {
303
+ const winLabel = win.window_name ? `${win.window_index}: ${win.window_name}` : `${win.window_index}`;
304
+ const active = win.is_active ? ' *' : '';
305
+ const paneCount = win.panes ? ` (${win.panes.length} panes)` : '';
306
+ lines.push(` - ${winLabel}${active}${paneCount}`);
307
+ }
308
+ }
309
+ logger.debug('terminal_session_info completed', { user_id, sessionId: session_id });
310
+ return {
311
+ success: true,
312
+ data: {
313
+ content: lines.join('\n'),
314
+ details: { session, user_id },
315
+ },
316
+ };
317
+ }
318
+ catch (error) {
319
+ logger.error('terminal_session_info failed', {
320
+ user_id,
321
+ sessionId: session_id,
322
+ error: error instanceof Error ? error.message : String(error),
323
+ });
324
+ return { success: false, error: sanitizeErrorMessage(error) };
325
+ }
326
+ },
327
+ };
328
+ }
329
+ // ==================== terminal_send_command ====================
330
+ /** Parameters for terminal_send_command */
331
+ export const TerminalSendCommandParamsSchema = z.object({
332
+ session_id: z.string().min(1, 'Session ID is required'),
333
+ command: z.string().min(1, 'Command is required').max(5000, 'Command must be 5000 characters or less'),
334
+ timeout_s: z.number().int().min(1).max(600).optional(),
335
+ pane_id: z.string().optional(),
336
+ });
337
+ /**
338
+ * Creates the terminal_send_command tool.
339
+ */
340
+ export function createTerminalSendCommandTool(options) {
341
+ const { client, logger, user_id } = options;
342
+ return {
343
+ name: 'terminal_send_command',
344
+ description: 'Send a shell command to a terminal session and wait for output. Returns the command output, exit code, and execution duration.',
345
+ parameters: TerminalSendCommandParamsSchema,
346
+ async execute(params) {
347
+ const parseResult = TerminalSendCommandParamsSchema.safeParse(params);
348
+ if (!parseResult.success) {
349
+ const errorMessage = parseResult.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ');
350
+ return { success: false, error: errorMessage };
351
+ }
352
+ const { session_id, command, timeout_s = 30, pane_id } = parseResult.data;
353
+ if (!isValidUuid(session_id)) {
354
+ return { success: false, error: 'Invalid session ID format. Expected UUID.' };
355
+ }
356
+ if (pane_id && !isValidUuid(pane_id)) {
357
+ return { success: false, error: 'Invalid pane_id format. Expected UUID.' };
358
+ }
359
+ logger.info('terminal_send_command invoked', {
360
+ user_id,
361
+ sessionId: session_id,
362
+ commandLength: command.length,
363
+ timeout_s,
364
+ hasPaneId: !!pane_id,
365
+ });
366
+ try {
367
+ const body = { command, timeout_s };
368
+ if (pane_id)
369
+ body.pane_id = pane_id;
370
+ const response = await client.post(`/api/terminal/sessions/${session_id}/send-command`, body, { user_id });
371
+ if (!response.success) {
372
+ if (response.error.code === 'NOT_FOUND') {
373
+ return { success: false, error: 'Session not found.' };
374
+ }
375
+ logger.error('terminal_send_command API error', {
376
+ user_id,
377
+ sessionId: session_id,
378
+ status: response.error.status,
379
+ });
380
+ return { success: false, error: response.error.message || 'Failed to send command' };
381
+ }
382
+ const result = response.data;
383
+ const timedOut = result.timed_out ?? false;
384
+ const lines = [];
385
+ if (timedOut) {
386
+ lines.push(`[TIMED OUT after ${timeout_s}s]`);
387
+ }
388
+ if (result.exit_code !== undefined) {
389
+ lines.push(`Exit code: ${result.exit_code}`);
390
+ }
391
+ if (result.duration_ms !== undefined) {
392
+ lines.push(`Duration: ${result.duration_ms}ms`);
393
+ }
394
+ lines.push('');
395
+ lines.push(result.output);
396
+ logger.debug('terminal_send_command completed', {
397
+ user_id,
398
+ sessionId: session_id,
399
+ exitCode: result.exit_code,
400
+ timedOut,
401
+ outputLength: result.output.length,
402
+ });
403
+ return {
404
+ success: true,
405
+ data: {
406
+ content: lines.join('\n'),
407
+ details: {
408
+ session_id,
409
+ output: result.output,
410
+ exit_code: result.exit_code,
411
+ timed_out: timedOut,
412
+ duration_ms: result.duration_ms,
413
+ user_id,
414
+ },
415
+ },
416
+ };
417
+ }
418
+ catch (error) {
419
+ logger.error('terminal_send_command failed', {
420
+ user_id,
421
+ sessionId: session_id,
422
+ error: error instanceof Error ? error.message : String(error),
423
+ });
424
+ return { success: false, error: sanitizeErrorMessage(error) };
425
+ }
426
+ },
427
+ };
428
+ }
429
+ // ==================== terminal_send_keys ====================
430
+ /** Parameters for terminal_send_keys */
431
+ export const TerminalSendKeysParamsSchema = z.object({
432
+ session_id: z.string().min(1, 'Session ID is required'),
433
+ keys: z.string().min(1, 'Keys are required').max(1000, 'Keys must be 1000 characters or less'),
434
+ pane_id: z.string().optional(),
435
+ });
436
+ /**
437
+ * Creates the terminal_send_keys tool.
438
+ */
439
+ export function createTerminalSendKeysTool(options) {
440
+ const { client, logger, user_id } = options;
441
+ return {
442
+ name: 'terminal_send_keys',
443
+ description: 'Send raw keystrokes to a terminal session. Supports special keys: Enter, Tab, Escape, C-c, C-d, C-z, Up, Down, Left, Right.',
444
+ parameters: TerminalSendKeysParamsSchema,
445
+ async execute(params) {
446
+ const parseResult = TerminalSendKeysParamsSchema.safeParse(params);
447
+ if (!parseResult.success) {
448
+ const errorMessage = parseResult.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ');
449
+ return { success: false, error: errorMessage };
450
+ }
451
+ const { session_id, keys, pane_id } = parseResult.data;
452
+ if (!isValidUuid(session_id)) {
453
+ return { success: false, error: 'Invalid session ID format. Expected UUID.' };
454
+ }
455
+ if (pane_id && !isValidUuid(pane_id)) {
456
+ return { success: false, error: 'Invalid pane_id format. Expected UUID.' };
457
+ }
458
+ logger.info('terminal_send_keys invoked', {
459
+ user_id,
460
+ sessionId: session_id,
461
+ keysLength: keys.length,
462
+ hasPaneId: !!pane_id,
463
+ });
464
+ try {
465
+ const body = { keys };
466
+ if (pane_id)
467
+ body.pane_id = pane_id;
468
+ const response = await client.post(`/api/terminal/sessions/${session_id}/send-keys`, body, { user_id });
469
+ if (!response.success) {
470
+ if (response.error.code === 'NOT_FOUND') {
471
+ return { success: false, error: 'Session not found.' };
472
+ }
473
+ logger.error('terminal_send_keys API error', {
474
+ user_id,
475
+ sessionId: session_id,
476
+ status: response.error.status,
477
+ });
478
+ return { success: false, error: response.error.message || 'Failed to send keys' };
479
+ }
480
+ logger.debug('terminal_send_keys completed', { user_id, sessionId: session_id });
481
+ return {
482
+ success: true,
483
+ data: {
484
+ content: `Keys sent to session ${session_id}.`,
485
+ details: { session_id, user_id },
486
+ },
487
+ };
488
+ }
489
+ catch (error) {
490
+ logger.error('terminal_send_keys failed', {
491
+ user_id,
492
+ sessionId: session_id,
493
+ error: error instanceof Error ? error.message : String(error),
494
+ });
495
+ return { success: false, error: sanitizeErrorMessage(error) };
496
+ }
497
+ },
498
+ };
499
+ }
500
+ // ==================== terminal_capture_pane ====================
501
+ /** Parameters for terminal_capture_pane */
502
+ export const TerminalCapturePaneParamsSchema = z.object({
503
+ session_id: z.string().min(1, 'Session ID is required'),
504
+ pane_id: z.string().optional(),
505
+ lines: z.number().int().min(1).max(10000).optional(),
506
+ });
507
+ /**
508
+ * Creates the terminal_capture_pane tool.
509
+ */
510
+ export function createTerminalCapturePaneTool(options) {
511
+ const { client, logger, user_id } = options;
512
+ return {
513
+ name: 'terminal_capture_pane',
514
+ description: 'Capture and read the current visible content of a terminal pane. Optionally specify number of scrollback lines.',
515
+ parameters: TerminalCapturePaneParamsSchema,
516
+ async execute(params) {
517
+ const parseResult = TerminalCapturePaneParamsSchema.safeParse(params);
518
+ if (!parseResult.success) {
519
+ const errorMessage = parseResult.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ');
520
+ return { success: false, error: errorMessage };
521
+ }
522
+ const { session_id, pane_id, lines } = parseResult.data;
523
+ if (!isValidUuid(session_id)) {
524
+ return { success: false, error: 'Invalid session ID format. Expected UUID.' };
525
+ }
526
+ if (pane_id && !isValidUuid(pane_id)) {
527
+ return { success: false, error: 'Invalid pane_id format. Expected UUID.' };
528
+ }
529
+ logger.info('terminal_capture_pane invoked', {
530
+ user_id,
531
+ sessionId: session_id,
532
+ hasPaneId: !!pane_id,
533
+ lines,
534
+ });
535
+ try {
536
+ const queryParams = new URLSearchParams();
537
+ if (pane_id)
538
+ queryParams.set('pane_id', pane_id);
539
+ if (lines !== undefined)
540
+ queryParams.set('lines', String(lines));
541
+ const queryString = queryParams.toString();
542
+ const path = `/api/terminal/sessions/${session_id}/capture${queryString ? `?${queryString}` : ''}`;
543
+ const response = await client.get(path, { user_id });
544
+ if (!response.success) {
545
+ if (response.error.code === 'NOT_FOUND') {
546
+ return { success: false, error: 'Session not found.' };
547
+ }
548
+ logger.error('terminal_capture_pane API error', {
549
+ user_id,
550
+ sessionId: session_id,
551
+ status: response.error.status,
552
+ });
553
+ return { success: false, error: response.error.message || 'Failed to capture pane' };
554
+ }
555
+ const capture = response.data;
556
+ logger.debug('terminal_capture_pane completed', {
557
+ user_id,
558
+ sessionId: session_id,
559
+ contentLength: capture.content.length,
560
+ });
561
+ return {
562
+ success: true,
563
+ data: {
564
+ content: capture.content,
565
+ details: {
566
+ session_id,
567
+ pane_content: capture.content,
568
+ rows: capture.rows,
569
+ cols: capture.cols,
570
+ user_id,
571
+ },
572
+ },
573
+ };
574
+ }
575
+ catch (error) {
576
+ logger.error('terminal_capture_pane failed', {
577
+ user_id,
578
+ sessionId: session_id,
579
+ error: error instanceof Error ? error.message : String(error),
580
+ });
581
+ return { success: false, error: sanitizeErrorMessage(error) };
582
+ }
583
+ },
584
+ };
585
+ }
586
+ //# sourceMappingURL=terminal-sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-sessions.js","sourceRoot":"","sources":["../../src/tools/terminal-sessions.ts"],"names":[],"mappings":"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"}