mstro-app 0.1.57 → 0.2.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 (100) hide show
  1. package/bin/commands/login.js +27 -14
  2. package/bin/commands/logout.js +35 -1
  3. package/bin/commands/status.js +1 -1
  4. package/bin/mstro.js +5 -108
  5. package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
  6. package/dist/server/cli/headless/claude-invoker.js +432 -103
  7. package/dist/server/cli/headless/claude-invoker.js.map +1 -1
  8. package/dist/server/cli/headless/index.d.ts +2 -1
  9. package/dist/server/cli/headless/index.d.ts.map +1 -1
  10. package/dist/server/cli/headless/index.js +2 -0
  11. package/dist/server/cli/headless/index.js.map +1 -1
  12. package/dist/server/cli/headless/prompt-utils.d.ts +5 -8
  13. package/dist/server/cli/headless/prompt-utils.d.ts.map +1 -1
  14. package/dist/server/cli/headless/prompt-utils.js +40 -5
  15. package/dist/server/cli/headless/prompt-utils.js.map +1 -1
  16. package/dist/server/cli/headless/runner.d.ts +1 -1
  17. package/dist/server/cli/headless/runner.d.ts.map +1 -1
  18. package/dist/server/cli/headless/runner.js +29 -7
  19. package/dist/server/cli/headless/runner.js.map +1 -1
  20. package/dist/server/cli/headless/stall-assessor.d.ts +77 -1
  21. package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
  22. package/dist/server/cli/headless/stall-assessor.js +336 -20
  23. package/dist/server/cli/headless/stall-assessor.js.map +1 -1
  24. package/dist/server/cli/headless/tool-watchdog.d.ts +67 -0
  25. package/dist/server/cli/headless/tool-watchdog.d.ts.map +1 -0
  26. package/dist/server/cli/headless/tool-watchdog.js +296 -0
  27. package/dist/server/cli/headless/tool-watchdog.js.map +1 -0
  28. package/dist/server/cli/headless/types.d.ts +80 -1
  29. package/dist/server/cli/headless/types.d.ts.map +1 -1
  30. package/dist/server/cli/improvisation-session-manager.d.ts +109 -2
  31. package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
  32. package/dist/server/cli/improvisation-session-manager.js +737 -132
  33. package/dist/server/cli/improvisation-session-manager.js.map +1 -1
  34. package/dist/server/index.js +5 -10
  35. package/dist/server/index.js.map +1 -1
  36. package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
  37. package/dist/server/mcp/bouncer-integration.js +18 -0
  38. package/dist/server/mcp/bouncer-integration.js.map +1 -1
  39. package/dist/server/mcp/security-audit.d.ts +2 -2
  40. package/dist/server/mcp/security-audit.d.ts.map +1 -1
  41. package/dist/server/mcp/security-audit.js +12 -8
  42. package/dist/server/mcp/security-audit.js.map +1 -1
  43. package/dist/server/mcp/security-patterns.d.ts.map +1 -1
  44. package/dist/server/mcp/security-patterns.js +9 -4
  45. package/dist/server/mcp/security-patterns.js.map +1 -1
  46. package/dist/server/routes/improvise.js +6 -6
  47. package/dist/server/routes/improvise.js.map +1 -1
  48. package/dist/server/services/analytics.d.ts +2 -0
  49. package/dist/server/services/analytics.d.ts.map +1 -1
  50. package/dist/server/services/analytics.js +13 -3
  51. package/dist/server/services/analytics.js.map +1 -1
  52. package/dist/server/services/platform.d.ts.map +1 -1
  53. package/dist/server/services/platform.js +4 -9
  54. package/dist/server/services/platform.js.map +1 -1
  55. package/dist/server/services/sandbox-utils.d.ts +6 -0
  56. package/dist/server/services/sandbox-utils.d.ts.map +1 -0
  57. package/dist/server/services/sandbox-utils.js +72 -0
  58. package/dist/server/services/sandbox-utils.js.map +1 -0
  59. package/dist/server/services/settings.d.ts +6 -0
  60. package/dist/server/services/settings.d.ts.map +1 -1
  61. package/dist/server/services/settings.js +21 -0
  62. package/dist/server/services/settings.js.map +1 -1
  63. package/dist/server/services/terminal/pty-manager.d.ts +3 -51
  64. package/dist/server/services/terminal/pty-manager.d.ts.map +1 -1
  65. package/dist/server/services/terminal/pty-manager.js +14 -100
  66. package/dist/server/services/terminal/pty-manager.js.map +1 -1
  67. package/dist/server/services/websocket/handler.d.ts +36 -15
  68. package/dist/server/services/websocket/handler.d.ts.map +1 -1
  69. package/dist/server/services/websocket/handler.js +452 -223
  70. package/dist/server/services/websocket/handler.js.map +1 -1
  71. package/dist/server/services/websocket/types.d.ts +6 -2
  72. package/dist/server/services/websocket/types.d.ts.map +1 -1
  73. package/hooks/bouncer.sh +11 -4
  74. package/package.json +4 -1
  75. package/server/cli/headless/claude-invoker.ts +602 -119
  76. package/server/cli/headless/index.ts +7 -1
  77. package/server/cli/headless/prompt-utils.ts +37 -5
  78. package/server/cli/headless/runner.ts +30 -8
  79. package/server/cli/headless/stall-assessor.ts +453 -22
  80. package/server/cli/headless/tool-watchdog.ts +390 -0
  81. package/server/cli/headless/types.ts +84 -1
  82. package/server/cli/improvisation-session-manager.ts +884 -143
  83. package/server/index.ts +5 -10
  84. package/server/mcp/bouncer-integration.ts +28 -0
  85. package/server/mcp/security-audit.ts +12 -8
  86. package/server/mcp/security-patterns.ts +8 -2
  87. package/server/routes/improvise.ts +6 -6
  88. package/server/services/analytics.ts +13 -3
  89. package/server/services/platform.test.ts +0 -10
  90. package/server/services/platform.ts +4 -10
  91. package/server/services/sandbox-utils.ts +78 -0
  92. package/server/services/settings.ts +25 -0
  93. package/server/services/terminal/pty-manager.ts +16 -127
  94. package/server/services/websocket/handler.ts +515 -251
  95. package/server/services/websocket/types.ts +10 -4
  96. package/dist/server/services/terminal/tmux-manager.d.ts +0 -82
  97. package/dist/server/services/terminal/tmux-manager.d.ts.map +0 -1
  98. package/dist/server/services/terminal/tmux-manager.js +0 -352
  99. package/dist/server/services/terminal/tmux-manager.js.map +0 -1
  100. package/server/services/terminal/tmux-manager.ts +0 -426
@@ -44,8 +44,6 @@ export interface WebSocketMessage {
44
44
  | 'terminalInit'
45
45
  | 'terminalReconnect'
46
46
  | 'terminalList'
47
- | 'terminalInitPersistent'
48
- | 'terminalListPersistent'
49
47
  | 'terminalInput'
50
48
  | 'terminalResize'
51
49
  | 'terminalClose'
@@ -67,6 +65,9 @@ export interface WebSocketMessage {
67
65
  | 'gitLog'
68
66
  | 'gitDiscoverRepos'
69
67
  | 'gitSetDirectory'
68
+ | 'gitGetRemoteInfo'
69
+ | 'gitCreatePR'
70
+ | 'gitGeneratePRDescription'
70
71
  // Session sync message types
71
72
  | 'getActiveTabs'
72
73
  | 'createTab'
@@ -81,6 +82,8 @@ export interface WebSocketMessage {
81
82
  tabId?: string;
82
83
  terminalId?: string;
83
84
  data?: any;
85
+ /** Injected by server relay for sandboxed shared users (control + view) */
86
+ _permission?: 'control' | 'view';
84
87
  }
85
88
 
86
89
  export interface WebSocketResponse {
@@ -111,9 +114,7 @@ export interface WebSocketResponse {
111
114
  | 'terminalReady'
112
115
  | 'terminalExit'
113
116
  | 'terminalError'
114
- | 'terminalScrollback'
115
117
  | 'terminalList'
116
- | 'terminalListPersistent'
117
118
  // File explorer response types
118
119
  | 'directoryListing'
119
120
  | 'fileWritten'
@@ -137,6 +138,9 @@ export interface WebSocketResponse {
137
138
  | 'gitError'
138
139
  | 'gitReposDiscovered'
139
140
  | 'gitDirectorySet'
141
+ | 'gitRemoteInfo'
142
+ | 'gitPRCreated'
143
+ | 'gitPRDescription'
140
144
  // Session sync response types
141
145
  | 'activeTabs'
142
146
  | 'tabCreated'
@@ -315,6 +319,8 @@ export interface GitStatusResponse {
315
319
  ahead: number;
316
320
  /** Number of commits behind remote */
317
321
  behind: number;
322
+ /** Whether the branch has an upstream tracking branch */
323
+ hasUpstream: boolean;
318
324
  }
319
325
 
320
326
  /**
@@ -1,82 +0,0 @@
1
- import { EventEmitter } from 'node:events';
2
- export interface TmuxSession {
3
- terminalId: string;
4
- tmuxSessionName: string;
5
- shell: string;
6
- cwd: string;
7
- createdAt: number;
8
- lastAttachedAt: number;
9
- }
10
- /**
11
- * Check if tmux is available on the system
12
- */
13
- export declare function isTmuxAvailable(): boolean;
14
- /**
15
- * TmuxManager - Manages tmux-backed terminal sessions
16
- */
17
- export declare class TmuxManager extends EventEmitter {
18
- private sessions;
19
- private outputHandlers;
20
- private tmuxAvailable;
21
- constructor();
22
- /**
23
- * Check if tmux persistence is available
24
- */
25
- isAvailable(): boolean;
26
- /**
27
- * Load session registry from disk
28
- */
29
- private loadRegistry;
30
- /**
31
- * Save session registry to disk
32
- */
33
- private saveRegistry;
34
- /**
35
- * Sync our registry with actual tmux sessions
36
- * Remove sessions that no longer exist in tmux
37
- */
38
- private syncWithTmux;
39
- /**
40
- * Check if a session exists
41
- */
42
- exists(terminalId: string): boolean;
43
- /**
44
- * Get session info
45
- */
46
- getSessionInfo(terminalId: string): TmuxSession | null;
47
- /**
48
- * Get all active sessions
49
- */
50
- getActiveSessions(): TmuxSession[];
51
- /**
52
- * Create a new tmux-backed terminal session
53
- */
54
- create(terminalId: string, workingDir: string, cols?: number, rows?: number, shell?: string): {
55
- shell: string;
56
- cwd: string;
57
- isReconnect: boolean;
58
- };
59
- /**
60
- * Attach to a tmux session and stream output
61
- * Returns a function to detach
62
- */
63
- attach(terminalId: string, onOutput: (data: string) => void, onExit: (code: number) => void): {
64
- write: (data: string) => void;
65
- resize: (cols: number, rows: number) => void;
66
- detach: () => void;
67
- };
68
- /**
69
- * Get scrollback/history from tmux session
70
- */
71
- getScrollback(terminalId: string, lines?: number): string[];
72
- /**
73
- * Close/kill a tmux session
74
- */
75
- close(terminalId: string): boolean;
76
- /**
77
- * Close all mstro-managed tmux sessions
78
- */
79
- closeAll(): void;
80
- }
81
- export declare function getTmuxManager(): TmuxManager;
82
- //# sourceMappingURL=tmux-manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tmux-manager.d.ts","sourceRoot":"","sources":["../../../../server/services/terminal/tmux-manager.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAMD;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAOzC;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,aAAa,CAAU;;IAY/B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAoCpB;;OAEG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAenC;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAItD;;OAEG;IACH,iBAAiB,IAAI,WAAW,EAAE;IAKlC;;OAEG;IACH,MAAM,CACJ,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,MAAW,EACjB,IAAI,GAAE,MAAW,EACjB,KAAK,CAAC,EAAE,MAAM,GACb;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE;IAiEvD;;;OAGG;IACH,MAAM,CACJ,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAChC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC7B;QAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,IAAI,CAAA;KAAE;IA4FtG;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAa,GAAG,MAAM,EAAE;IAqBjE;;OAEG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAwBlC;;OAEG;IACH,QAAQ,IAAI,IAAI;CAKjB;AAKD,wBAAgB,cAAc,IAAI,WAAW,CAK5C"}
@@ -1,352 +0,0 @@
1
- // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
- // Licensed under the MIT License. See LICENSE file for details.
3
- /**
4
- * Tmux Session Manager - Provides persistent terminal sessions via tmux
5
- *
6
- * When enabled, terminals are run inside tmux sessions, which allows:
7
- * - Sessions to survive client restarts
8
- * - True process persistence across browser disconnections
9
- * - Session restoration even after server restart
10
- *
11
- * Tmux sessions are named with a prefix to identify them as mstro-managed.
12
- */
13
- import { spawnSync } from 'node:child_process';
14
- import { EventEmitter } from 'node:events';
15
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
16
- import { homedir } from 'node:os';
17
- import { join } from 'node:path';
18
- const MSTRO_TMUX_PREFIX = 'mstro-terminal-';
19
- const SESSION_REGISTRY_PATH = join(homedir(), '.mstro', 'terminal-sessions.json');
20
- /**
21
- * Check if tmux is available on the system
22
- */
23
- export function isTmuxAvailable() {
24
- try {
25
- const result = spawnSync('which', ['tmux'], { encoding: 'utf-8' });
26
- return result.status === 0 && result.stdout.trim().length > 0;
27
- }
28
- catch {
29
- return false;
30
- }
31
- }
32
- /**
33
- * TmuxManager - Manages tmux-backed terminal sessions
34
- */
35
- export class TmuxManager extends EventEmitter {
36
- sessions = new Map();
37
- outputHandlers = new Map();
38
- tmuxAvailable;
39
- constructor() {
40
- super();
41
- this.tmuxAvailable = isTmuxAvailable();
42
- if (this.tmuxAvailable) {
43
- this.loadRegistry();
44
- this.syncWithTmux();
45
- }
46
- }
47
- /**
48
- * Check if tmux persistence is available
49
- */
50
- isAvailable() {
51
- return this.tmuxAvailable;
52
- }
53
- /**
54
- * Load session registry from disk
55
- */
56
- loadRegistry() {
57
- try {
58
- if (existsSync(SESSION_REGISTRY_PATH)) {
59
- const data = readFileSync(SESSION_REGISTRY_PATH, 'utf-8');
60
- const registry = JSON.parse(data);
61
- for (const session of registry.sessions) {
62
- this.sessions.set(session.terminalId, session);
63
- }
64
- }
65
- }
66
- catch (error) {
67
- console.error('[TmuxManager] Failed to load registry:', error);
68
- }
69
- }
70
- /**
71
- * Save session registry to disk
72
- */
73
- saveRegistry() {
74
- try {
75
- const dir = join(homedir(), '.mstro');
76
- if (!existsSync(dir)) {
77
- mkdirSync(dir, { recursive: true });
78
- }
79
- const registry = {
80
- sessions: Array.from(this.sessions.values()),
81
- };
82
- writeFileSync(SESSION_REGISTRY_PATH, JSON.stringify(registry, null, 2));
83
- }
84
- catch (error) {
85
- console.error('[TmuxManager] Failed to save registry:', error);
86
- }
87
- }
88
- /**
89
- * Sync our registry with actual tmux sessions
90
- * Remove sessions that no longer exist in tmux
91
- */
92
- syncWithTmux() {
93
- if (!this.tmuxAvailable)
94
- return;
95
- try {
96
- // List all tmux sessions
97
- const result = spawnSync('tmux', ['list-sessions', '-F', '#{session_name}'], {
98
- encoding: 'utf-8',
99
- });
100
- if (result.status !== 0) {
101
- // No tmux server running - clear all sessions
102
- this.sessions.clear();
103
- this.saveRegistry();
104
- return;
105
- }
106
- const existingSessions = new Set(result.stdout
107
- .trim()
108
- .split('\n')
109
- .filter((name) => name.startsWith(MSTRO_TMUX_PREFIX)));
110
- // Remove sessions that no longer exist
111
- for (const [terminalId, session] of this.sessions) {
112
- if (!existingSessions.has(session.tmuxSessionName)) {
113
- this.sessions.delete(terminalId);
114
- }
115
- }
116
- this.saveRegistry();
117
- }
118
- catch (error) {
119
- console.error('[TmuxManager] Failed to sync with tmux:', error);
120
- }
121
- }
122
- /**
123
- * Check if a session exists
124
- */
125
- exists(terminalId) {
126
- const session = this.sessions.get(terminalId);
127
- if (!session)
128
- return false;
129
- // Verify it still exists in tmux
130
- try {
131
- const result = spawnSync('tmux', ['has-session', '-t', session.tmuxSessionName], {
132
- encoding: 'utf-8',
133
- });
134
- return result.status === 0;
135
- }
136
- catch {
137
- return false;
138
- }
139
- }
140
- /**
141
- * Get session info
142
- */
143
- getSessionInfo(terminalId) {
144
- return this.sessions.get(terminalId) || null;
145
- }
146
- /**
147
- * Get all active sessions
148
- */
149
- getActiveSessions() {
150
- this.syncWithTmux();
151
- return Array.from(this.sessions.values());
152
- }
153
- /**
154
- * Create a new tmux-backed terminal session
155
- */
156
- create(terminalId, workingDir, cols = 80, rows = 24, shell) {
157
- if (!this.tmuxAvailable) {
158
- throw new Error('tmux is not available');
159
- }
160
- // Check if session already exists
161
- if (this.exists(terminalId)) {
162
- const session = this.sessions.get(terminalId);
163
- session.lastAttachedAt = Date.now();
164
- this.saveRegistry();
165
- return {
166
- shell: session.shell,
167
- cwd: session.cwd,
168
- isReconnect: true,
169
- };
170
- }
171
- const tmuxSessionName = `${MSTRO_TMUX_PREFIX}${terminalId}`;
172
- const cwd = workingDir || homedir();
173
- const shellPath = shell || process.env.SHELL || '/bin/bash';
174
- const shellName = shellPath.split('/').pop() || 'shell';
175
- try {
176
- // Create new tmux session
177
- const result = spawnSync('tmux', [
178
- 'new-session',
179
- '-d', // Detached
180
- '-s', tmuxSessionName,
181
- '-x', cols.toString(),
182
- '-y', rows.toString(),
183
- '-c', cwd,
184
- shellPath,
185
- ], {
186
- encoding: 'utf-8',
187
- cwd,
188
- });
189
- if (result.status !== 0) {
190
- throw new Error(`Failed to create tmux session: ${result.stderr}`);
191
- }
192
- // Store session info
193
- const session = {
194
- terminalId,
195
- tmuxSessionName,
196
- shell: shellName,
197
- cwd,
198
- createdAt: Date.now(),
199
- lastAttachedAt: Date.now(),
200
- };
201
- this.sessions.set(terminalId, session);
202
- this.saveRegistry();
203
- return { shell: shellName, cwd, isReconnect: false };
204
- }
205
- catch (error) {
206
- console.error(`[TmuxManager] Failed to create session:`, error);
207
- throw error;
208
- }
209
- }
210
- /**
211
- * Attach to a tmux session and stream output
212
- * Returns a function to detach
213
- */
214
- attach(terminalId, onOutput, onExit) {
215
- const session = this.sessions.get(terminalId);
216
- if (!session) {
217
- throw new Error(`Session not found: ${terminalId}`);
218
- }
219
- // Update last attached time
220
- session.lastAttachedAt = Date.now();
221
- this.saveRegistry();
222
- // Create a pipe process to capture tmux output
223
- // We use 'tmux pipe-pane' to capture output and 'tmux send-keys' for input
224
- const _pipePath = `/tmp/mstro-tmux-pipe-${terminalId}`;
225
- // Start capturing output using tmux's capture-pane in a loop
226
- let capturing = true;
227
- let lastCaptureLength = 0;
228
- const captureLoop = setInterval(() => {
229
- if (!capturing) {
230
- clearInterval(captureLoop);
231
- return;
232
- }
233
- try {
234
- // Capture the current pane content
235
- const result = spawnSync('tmux', ['capture-pane', '-t', session.tmuxSessionName, '-p', '-S', '-100'], { encoding: 'utf-8' });
236
- if (result.status === 0) {
237
- const output = result.stdout;
238
- // Only emit new content
239
- if (output.length > lastCaptureLength) {
240
- const newContent = output.slice(lastCaptureLength);
241
- if (newContent.trim()) {
242
- onOutput(newContent);
243
- }
244
- lastCaptureLength = output.length;
245
- }
246
- }
247
- else if (result.stderr?.includes('no server running')) {
248
- // Session ended
249
- capturing = false;
250
- clearInterval(captureLoop);
251
- onExit(0);
252
- this.sessions.delete(terminalId);
253
- this.saveRegistry();
254
- }
255
- }
256
- catch (error) {
257
- console.error('[TmuxManager] Capture error:', error);
258
- }
259
- }, 100); // Poll every 100ms
260
- this.outputHandlers.set(terminalId, captureLoop);
261
- return {
262
- write: (data) => {
263
- try {
264
- // Send keys to tmux session
265
- spawnSync('tmux', ['send-keys', '-t', session.tmuxSessionName, '-l', data], {
266
- encoding: 'utf-8',
267
- });
268
- }
269
- catch (error) {
270
- console.error('[TmuxManager] Write error:', error);
271
- }
272
- },
273
- resize: (cols, rows) => {
274
- try {
275
- spawnSync('tmux', ['resize-window', '-t', session.tmuxSessionName, '-x', cols.toString(), '-y', rows.toString()], { encoding: 'utf-8' });
276
- }
277
- catch (_error) {
278
- // Resize errors are not critical
279
- }
280
- },
281
- detach: () => {
282
- capturing = false;
283
- const handler = this.outputHandlers.get(terminalId);
284
- if (handler) {
285
- clearInterval(handler);
286
- this.outputHandlers.delete(terminalId);
287
- }
288
- },
289
- };
290
- }
291
- /**
292
- * Get scrollback/history from tmux session
293
- */
294
- getScrollback(terminalId, lines = 5000) {
295
- const session = this.sessions.get(terminalId);
296
- if (!session)
297
- return [];
298
- try {
299
- const result = spawnSync('tmux', ['capture-pane', '-t', session.tmuxSessionName, '-p', '-S', `-${lines}`], { encoding: 'utf-8' });
300
- if (result.status === 0) {
301
- return result.stdout.split('\n');
302
- }
303
- }
304
- catch (error) {
305
- console.error('[TmuxManager] Failed to get scrollback:', error);
306
- }
307
- return [];
308
- }
309
- /**
310
- * Close/kill a tmux session
311
- */
312
- close(terminalId) {
313
- const session = this.sessions.get(terminalId);
314
- if (!session)
315
- return false;
316
- // Stop output capture if running
317
- const handler = this.outputHandlers.get(terminalId);
318
- if (handler) {
319
- clearInterval(handler);
320
- this.outputHandlers.delete(terminalId);
321
- }
322
- try {
323
- spawnSync('tmux', ['kill-session', '-t', session.tmuxSessionName], {
324
- encoding: 'utf-8',
325
- });
326
- this.sessions.delete(terminalId);
327
- this.saveRegistry();
328
- return true;
329
- }
330
- catch (error) {
331
- console.error('[TmuxManager] Failed to close session:', error);
332
- return false;
333
- }
334
- }
335
- /**
336
- * Close all mstro-managed tmux sessions
337
- */
338
- closeAll() {
339
- for (const terminalId of this.sessions.keys()) {
340
- this.close(terminalId);
341
- }
342
- }
343
- }
344
- // Singleton instance
345
- let tmuxManagerInstance = null;
346
- export function getTmuxManager() {
347
- if (!tmuxManagerInstance) {
348
- tmuxManagerInstance = new TmuxManager();
349
- }
350
- return tmuxManagerInstance;
351
- }
352
- //# sourceMappingURL=tmux-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tmux-manager.js","sourceRoot":"","sources":["../../../../server/services/terminal/tmux-manager.ts"],"names":[],"mappings":"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"}