mstro-app 0.1.47

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 (213) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +177 -0
  3. package/bin/commands/config.js +145 -0
  4. package/bin/commands/login.js +313 -0
  5. package/bin/commands/logout.js +75 -0
  6. package/bin/commands/status.js +197 -0
  7. package/bin/commands/whoami.js +161 -0
  8. package/bin/configure-claude.js +298 -0
  9. package/bin/mstro.js +581 -0
  10. package/bin/postinstall.js +45 -0
  11. package/bin/release.sh +110 -0
  12. package/dist/server/cli/headless/claude-invoker.d.ts +17 -0
  13. package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -0
  14. package/dist/server/cli/headless/claude-invoker.js +311 -0
  15. package/dist/server/cli/headless/claude-invoker.js.map +1 -0
  16. package/dist/server/cli/headless/index.d.ts +13 -0
  17. package/dist/server/cli/headless/index.d.ts.map +1 -0
  18. package/dist/server/cli/headless/index.js +10 -0
  19. package/dist/server/cli/headless/index.js.map +1 -0
  20. package/dist/server/cli/headless/mcp-config.d.ts +11 -0
  21. package/dist/server/cli/headless/mcp-config.d.ts.map +1 -0
  22. package/dist/server/cli/headless/mcp-config.js +76 -0
  23. package/dist/server/cli/headless/mcp-config.js.map +1 -0
  24. package/dist/server/cli/headless/output-utils.d.ts +33 -0
  25. package/dist/server/cli/headless/output-utils.d.ts.map +1 -0
  26. package/dist/server/cli/headless/output-utils.js +101 -0
  27. package/dist/server/cli/headless/output-utils.js.map +1 -0
  28. package/dist/server/cli/headless/prompt-utils.d.ts +21 -0
  29. package/dist/server/cli/headless/prompt-utils.d.ts.map +1 -0
  30. package/dist/server/cli/headless/prompt-utils.js +84 -0
  31. package/dist/server/cli/headless/prompt-utils.js.map +1 -0
  32. package/dist/server/cli/headless/runner.d.ts +24 -0
  33. package/dist/server/cli/headless/runner.d.ts.map +1 -0
  34. package/dist/server/cli/headless/runner.js +99 -0
  35. package/dist/server/cli/headless/runner.js.map +1 -0
  36. package/dist/server/cli/headless/types.d.ts +106 -0
  37. package/dist/server/cli/headless/types.d.ts.map +1 -0
  38. package/dist/server/cli/headless/types.js +4 -0
  39. package/dist/server/cli/headless/types.js.map +1 -0
  40. package/dist/server/cli/improvisation-session-manager.d.ts +155 -0
  41. package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -0
  42. package/dist/server/cli/improvisation-session-manager.js +415 -0
  43. package/dist/server/cli/improvisation-session-manager.js.map +1 -0
  44. package/dist/server/index.d.ts +2 -0
  45. package/dist/server/index.d.ts.map +1 -0
  46. package/dist/server/index.js +386 -0
  47. package/dist/server/index.js.map +1 -0
  48. package/dist/server/mcp/bouncer-cli.d.ts +3 -0
  49. package/dist/server/mcp/bouncer-cli.d.ts.map +1 -0
  50. package/dist/server/mcp/bouncer-cli.js +99 -0
  51. package/dist/server/mcp/bouncer-cli.js.map +1 -0
  52. package/dist/server/mcp/bouncer-integration.d.ts +36 -0
  53. package/dist/server/mcp/bouncer-integration.d.ts.map +1 -0
  54. package/dist/server/mcp/bouncer-integration.js +301 -0
  55. package/dist/server/mcp/bouncer-integration.js.map +1 -0
  56. package/dist/server/mcp/security-audit.d.ts +52 -0
  57. package/dist/server/mcp/security-audit.d.ts.map +1 -0
  58. package/dist/server/mcp/security-audit.js +118 -0
  59. package/dist/server/mcp/security-audit.js.map +1 -0
  60. package/dist/server/mcp/security-patterns.d.ts +73 -0
  61. package/dist/server/mcp/security-patterns.d.ts.map +1 -0
  62. package/dist/server/mcp/security-patterns.js +247 -0
  63. package/dist/server/mcp/security-patterns.js.map +1 -0
  64. package/dist/server/mcp/server.d.ts +3 -0
  65. package/dist/server/mcp/server.d.ts.map +1 -0
  66. package/dist/server/mcp/server.js +146 -0
  67. package/dist/server/mcp/server.js.map +1 -0
  68. package/dist/server/routes/files.d.ts +9 -0
  69. package/dist/server/routes/files.d.ts.map +1 -0
  70. package/dist/server/routes/files.js +24 -0
  71. package/dist/server/routes/files.js.map +1 -0
  72. package/dist/server/routes/improvise.d.ts +3 -0
  73. package/dist/server/routes/improvise.d.ts.map +1 -0
  74. package/dist/server/routes/improvise.js +72 -0
  75. package/dist/server/routes/improvise.js.map +1 -0
  76. package/dist/server/routes/index.d.ts +10 -0
  77. package/dist/server/routes/index.d.ts.map +1 -0
  78. package/dist/server/routes/index.js +12 -0
  79. package/dist/server/routes/index.js.map +1 -0
  80. package/dist/server/routes/instances.d.ts +10 -0
  81. package/dist/server/routes/instances.d.ts.map +1 -0
  82. package/dist/server/routes/instances.js +47 -0
  83. package/dist/server/routes/instances.js.map +1 -0
  84. package/dist/server/routes/notifications.d.ts +3 -0
  85. package/dist/server/routes/notifications.d.ts.map +1 -0
  86. package/dist/server/routes/notifications.js +136 -0
  87. package/dist/server/routes/notifications.js.map +1 -0
  88. package/dist/server/services/analytics.d.ts +56 -0
  89. package/dist/server/services/analytics.d.ts.map +1 -0
  90. package/dist/server/services/analytics.js +240 -0
  91. package/dist/server/services/analytics.js.map +1 -0
  92. package/dist/server/services/auth.d.ts +26 -0
  93. package/dist/server/services/auth.d.ts.map +1 -0
  94. package/dist/server/services/auth.js +71 -0
  95. package/dist/server/services/auth.js.map +1 -0
  96. package/dist/server/services/client-id.d.ts +10 -0
  97. package/dist/server/services/client-id.d.ts.map +1 -0
  98. package/dist/server/services/client-id.js +61 -0
  99. package/dist/server/services/client-id.js.map +1 -0
  100. package/dist/server/services/credentials.d.ts +39 -0
  101. package/dist/server/services/credentials.d.ts.map +1 -0
  102. package/dist/server/services/credentials.js +110 -0
  103. package/dist/server/services/credentials.js.map +1 -0
  104. package/dist/server/services/files.d.ts +119 -0
  105. package/dist/server/services/files.d.ts.map +1 -0
  106. package/dist/server/services/files.js +560 -0
  107. package/dist/server/services/files.js.map +1 -0
  108. package/dist/server/services/instances.d.ts +52 -0
  109. package/dist/server/services/instances.d.ts.map +1 -0
  110. package/dist/server/services/instances.js +241 -0
  111. package/dist/server/services/instances.js.map +1 -0
  112. package/dist/server/services/pathUtils.d.ts +47 -0
  113. package/dist/server/services/pathUtils.d.ts.map +1 -0
  114. package/dist/server/services/pathUtils.js +124 -0
  115. package/dist/server/services/pathUtils.js.map +1 -0
  116. package/dist/server/services/platform.d.ts +72 -0
  117. package/dist/server/services/platform.d.ts.map +1 -0
  118. package/dist/server/services/platform.js +368 -0
  119. package/dist/server/services/platform.js.map +1 -0
  120. package/dist/server/services/sentry.d.ts +5 -0
  121. package/dist/server/services/sentry.d.ts.map +1 -0
  122. package/dist/server/services/sentry.js +71 -0
  123. package/dist/server/services/sentry.js.map +1 -0
  124. package/dist/server/services/terminal/pty-manager.d.ts +149 -0
  125. package/dist/server/services/terminal/pty-manager.d.ts.map +1 -0
  126. package/dist/server/services/terminal/pty-manager.js +377 -0
  127. package/dist/server/services/terminal/pty-manager.js.map +1 -0
  128. package/dist/server/services/terminal/tmux-manager.d.ts +82 -0
  129. package/dist/server/services/terminal/tmux-manager.d.ts.map +1 -0
  130. package/dist/server/services/terminal/tmux-manager.js +352 -0
  131. package/dist/server/services/terminal/tmux-manager.js.map +1 -0
  132. package/dist/server/services/websocket/autocomplete.d.ts +50 -0
  133. package/dist/server/services/websocket/autocomplete.d.ts.map +1 -0
  134. package/dist/server/services/websocket/autocomplete.js +361 -0
  135. package/dist/server/services/websocket/autocomplete.js.map +1 -0
  136. package/dist/server/services/websocket/file-utils.d.ts +44 -0
  137. package/dist/server/services/websocket/file-utils.d.ts.map +1 -0
  138. package/dist/server/services/websocket/file-utils.js +272 -0
  139. package/dist/server/services/websocket/file-utils.js.map +1 -0
  140. package/dist/server/services/websocket/handler.d.ts +246 -0
  141. package/dist/server/services/websocket/handler.d.ts.map +1 -0
  142. package/dist/server/services/websocket/handler.js +1771 -0
  143. package/dist/server/services/websocket/handler.js.map +1 -0
  144. package/dist/server/services/websocket/index.d.ts +11 -0
  145. package/dist/server/services/websocket/index.d.ts.map +1 -0
  146. package/dist/server/services/websocket/index.js +14 -0
  147. package/dist/server/services/websocket/index.js.map +1 -0
  148. package/dist/server/services/websocket/types.d.ts +214 -0
  149. package/dist/server/services/websocket/types.d.ts.map +1 -0
  150. package/dist/server/services/websocket/types.js +4 -0
  151. package/dist/server/services/websocket/types.js.map +1 -0
  152. package/dist/server/utils/agent-manager.d.ts +69 -0
  153. package/dist/server/utils/agent-manager.d.ts.map +1 -0
  154. package/dist/server/utils/agent-manager.js +269 -0
  155. package/dist/server/utils/agent-manager.js.map +1 -0
  156. package/dist/server/utils/paths.d.ts +25 -0
  157. package/dist/server/utils/paths.d.ts.map +1 -0
  158. package/dist/server/utils/paths.js +38 -0
  159. package/dist/server/utils/paths.js.map +1 -0
  160. package/dist/server/utils/port-manager.d.ts +10 -0
  161. package/dist/server/utils/port-manager.d.ts.map +1 -0
  162. package/dist/server/utils/port-manager.js +60 -0
  163. package/dist/server/utils/port-manager.js.map +1 -0
  164. package/dist/server/utils/port.d.ts +26 -0
  165. package/dist/server/utils/port.d.ts.map +1 -0
  166. package/dist/server/utils/port.js +83 -0
  167. package/dist/server/utils/port.js.map +1 -0
  168. package/hooks/bouncer.sh +138 -0
  169. package/package.json +74 -0
  170. package/server/README.md +191 -0
  171. package/server/cli/headless/claude-invoker.ts +415 -0
  172. package/server/cli/headless/index.ts +39 -0
  173. package/server/cli/headless/mcp-config.ts +87 -0
  174. package/server/cli/headless/output-utils.ts +109 -0
  175. package/server/cli/headless/prompt-utils.ts +108 -0
  176. package/server/cli/headless/runner.ts +133 -0
  177. package/server/cli/headless/types.ts +118 -0
  178. package/server/cli/improvisation-session-manager.ts +531 -0
  179. package/server/index.ts +456 -0
  180. package/server/mcp/README.md +122 -0
  181. package/server/mcp/bouncer-cli.ts +127 -0
  182. package/server/mcp/bouncer-integration.ts +430 -0
  183. package/server/mcp/security-audit.ts +180 -0
  184. package/server/mcp/security-patterns.ts +290 -0
  185. package/server/mcp/server.ts +174 -0
  186. package/server/routes/files.ts +29 -0
  187. package/server/routes/improvise.ts +82 -0
  188. package/server/routes/index.ts +13 -0
  189. package/server/routes/instances.ts +54 -0
  190. package/server/routes/notifications.ts +158 -0
  191. package/server/services/analytics.ts +277 -0
  192. package/server/services/auth.ts +80 -0
  193. package/server/services/client-id.ts +68 -0
  194. package/server/services/credentials.ts +134 -0
  195. package/server/services/files.ts +710 -0
  196. package/server/services/instances.ts +275 -0
  197. package/server/services/pathUtils.ts +158 -0
  198. package/server/services/platform.test.ts +1314 -0
  199. package/server/services/platform.ts +435 -0
  200. package/server/services/sentry.ts +81 -0
  201. package/server/services/terminal/pty-manager.ts +464 -0
  202. package/server/services/terminal/tmux-manager.ts +426 -0
  203. package/server/services/websocket/autocomplete.ts +438 -0
  204. package/server/services/websocket/file-utils.ts +305 -0
  205. package/server/services/websocket/handler.test.ts +20 -0
  206. package/server/services/websocket/handler.ts +2047 -0
  207. package/server/services/websocket/index.ts +40 -0
  208. package/server/services/websocket/types.ts +339 -0
  209. package/server/tsconfig.json +19 -0
  210. package/server/utils/agent-manager.ts +323 -0
  211. package/server/utils/paths.ts +45 -0
  212. package/server/utils/port-manager.ts +70 -0
  213. package/server/utils/port.ts +102 -0
@@ -0,0 +1,377 @@
1
+ // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file for details.
3
+ /**
4
+ * PTY Manager - Manages pseudo-terminal sessions for shell access
5
+ *
6
+ * Provides terminal emulation for running shell commands on the local machine.
7
+ * Each terminal session is managed independently with its own PTY process.
8
+ *
9
+ * Supports session persistence:
10
+ * - Sessions survive WebSocket disconnections
11
+ * - Scrollback buffer is maintained for replay on reconnect
12
+ * - Sessions can be reattached without losing running processes
13
+ *
14
+ * Also supports tmux-backed persistence for sessions that survive server restarts.
15
+ *
16
+ * NOTE: node-pty is an optional dependency requiring native compilation.
17
+ * Terminal features gracefully degrade when node-pty is not available.
18
+ */
19
+ import { EventEmitter } from 'node:events';
20
+ import { homedir, platform } from 'node:os';
21
+ import { getTmuxManager, isTmuxAvailable } from './tmux-manager.js';
22
+ // Try to load node-pty (optional native dependency)
23
+ let pty = null;
24
+ let _ptyLoadError = null;
25
+ try {
26
+ pty = await import('node-pty');
27
+ }
28
+ catch (error) {
29
+ _ptyLoadError = error.message || 'Failed to load node-pty';
30
+ console.warn('[PTYManager] node-pty not available - terminal features disabled');
31
+ console.warn('[PTYManager] To enable terminals, run: mstro setup-terminal');
32
+ }
33
+ /**
34
+ * Check if node-pty is available
35
+ */
36
+ export function isPtyAvailable() {
37
+ return pty !== null;
38
+ }
39
+ /**
40
+ * Get installation instructions for node-pty based on platform
41
+ */
42
+ export function getPtyInstallInstructions() {
43
+ const os = platform();
44
+ let instructions = `Terminal feature requires native compilation of node-pty.\n\n`;
45
+ instructions += `To enable this feature:\n\n`;
46
+ if (os === 'darwin') {
47
+ instructions += `1. Install Xcode Command Line Tools:\n`;
48
+ instructions += ` xcode-select --install\n\n`;
49
+ }
50
+ else if (os === 'win32') {
51
+ instructions += `1. Install Windows Build Tools:\n`;
52
+ instructions += ` npm install -g windows-build-tools\n\n`;
53
+ }
54
+ else {
55
+ // Linux
56
+ instructions += `1. Install build tools:\n`;
57
+ instructions += ` # Debian/Ubuntu:\n`;
58
+ instructions += ` sudo apt install build-essential python3\n\n`;
59
+ instructions += ` # Fedora/RHEL:\n`;
60
+ instructions += ` sudo dnf install gcc-c++ make python3\n\n`;
61
+ instructions += ` # Arch:\n`;
62
+ instructions += ` sudo pacman -S base-devel python\n\n`;
63
+ }
64
+ instructions += `2. Rebuild native modules:\n`;
65
+ instructions += ` npm rebuild node-pty\n\n`;
66
+ instructions += `3. Restart mstro\n`;
67
+ return instructions;
68
+ }
69
+ // Maximum lines to store in scrollback buffer per terminal
70
+ const MAX_SCROLLBACK_LINES = 5000;
71
+ // Maximum characters per line to prevent memory bloat
72
+ const MAX_LINE_LENGTH = 2000;
73
+ /**
74
+ * Detect the user's default shell
75
+ */
76
+ function detectShell() {
77
+ const shell = process.env.SHELL;
78
+ if (shell) {
79
+ return shell;
80
+ }
81
+ // Platform-specific defaults
82
+ if (platform() === 'win32') {
83
+ return process.env.COMSPEC || 'powershell.exe';
84
+ }
85
+ return '/bin/bash';
86
+ }
87
+ /**
88
+ * Get shell name from path
89
+ */
90
+ function getShellName(shellPath) {
91
+ const parts = shellPath.split(/[/\\]/);
92
+ return parts[parts.length - 1] || 'shell';
93
+ }
94
+ export class PTYManager extends EventEmitter {
95
+ terminals = new Map();
96
+ constructor() {
97
+ super();
98
+ // Each terminal adds 3 listeners (output, exit, error) to this singleton.
99
+ // With multiple terminals, the default limit of 10 is easily exceeded.
100
+ this.setMaxListeners(50);
101
+ }
102
+ /**
103
+ * Check if a terminal session exists and is still running
104
+ */
105
+ exists(terminalId) {
106
+ return this.terminals.has(terminalId);
107
+ }
108
+ /**
109
+ * Get session info for reconnection
110
+ * Returns null if session doesn't exist
111
+ */
112
+ getSessionInfo(terminalId) {
113
+ const session = this.terminals.get(terminalId);
114
+ if (!session)
115
+ return null;
116
+ return {
117
+ shell: session.shell,
118
+ cwd: session.cwd,
119
+ cols: session.cols,
120
+ rows: session.rows,
121
+ };
122
+ }
123
+ /**
124
+ * Get scrollback buffer for replay on reconnect
125
+ * Returns the stored output history
126
+ */
127
+ getScrollback(terminalId) {
128
+ const session = this.terminals.get(terminalId);
129
+ if (!session)
130
+ return [];
131
+ return [...session.scrollback];
132
+ }
133
+ /**
134
+ * Add data to scrollback buffer
135
+ * Maintains a rolling buffer of recent terminal output
136
+ */
137
+ addToScrollback(session, data) {
138
+ // Split data into lines
139
+ const lines = data.split(/\r?\n/);
140
+ for (const line of lines) {
141
+ // Truncate very long lines to prevent memory issues
142
+ const truncatedLine = line.length > MAX_LINE_LENGTH
143
+ ? `${line.slice(0, MAX_LINE_LENGTH)}...`
144
+ : line;
145
+ session.scrollback.push(truncatedLine);
146
+ }
147
+ // Trim buffer if it exceeds max size
148
+ if (session.scrollback.length > MAX_SCROLLBACK_LINES) {
149
+ session.scrollback = session.scrollback.slice(-MAX_SCROLLBACK_LINES);
150
+ }
151
+ session.lastActivityAt = Date.now();
152
+ }
153
+ /**
154
+ * Check if PTY functionality is available
155
+ */
156
+ isPtyAvailable() {
157
+ return isPtyAvailable();
158
+ }
159
+ /**
160
+ * Get installation instructions if PTY is not available
161
+ */
162
+ getPtyInstallInstructions() {
163
+ return getPtyInstallInstructions();
164
+ }
165
+ /**
166
+ * Create a new terminal session
167
+ */
168
+ create(terminalId, workingDir, cols = 80, rows = 24, requestedShell) {
169
+ // Check if node-pty is available
170
+ if (!pty) {
171
+ throw new Error(`PTY_NOT_AVAILABLE:${getPtyInstallInstructions()}`);
172
+ }
173
+ // Check if session already exists - if so, this is a reconnection
174
+ if (this.terminals.has(terminalId)) {
175
+ const existingSession = this.terminals.get(terminalId);
176
+ // Always resize on reconnect to trigger SIGWINCH, which causes the
177
+ // shell to redraw its prompt line for the reconnected client
178
+ existingSession.pty.resize(cols, rows);
179
+ existingSession.cols = cols;
180
+ existingSession.rows = rows;
181
+ return {
182
+ shell: existingSession.shell,
183
+ cwd: existingSession.cwd,
184
+ isReconnect: true,
185
+ };
186
+ }
187
+ const shell = requestedShell || detectShell();
188
+ const cwd = workingDir || homedir();
189
+ try {
190
+ // Spawn the PTY process
191
+ const ptyProcess = pty.spawn(shell, [], {
192
+ name: 'xterm-256color',
193
+ cols,
194
+ rows,
195
+ cwd,
196
+ env: {
197
+ ...process.env,
198
+ TERM: 'xterm-256color',
199
+ COLORTERM: 'truecolor',
200
+ // Ensure home directory is set
201
+ HOME: homedir(),
202
+ },
203
+ });
204
+ // Store the session with scrollback buffer
205
+ const session = {
206
+ id: terminalId,
207
+ pty: ptyProcess,
208
+ shell: getShellName(shell),
209
+ cwd,
210
+ scrollback: [],
211
+ createdAt: Date.now(),
212
+ lastActivityAt: Date.now(),
213
+ cols,
214
+ rows,
215
+ };
216
+ this.terminals.set(terminalId, session);
217
+ // Handle data output - store in scrollback and emit
218
+ ptyProcess.onData((data) => {
219
+ this.addToScrollback(session, data);
220
+ this.emit('output', terminalId, data);
221
+ });
222
+ // Handle exit
223
+ ptyProcess.onExit(({ exitCode }) => {
224
+ this.emit('exit', terminalId, exitCode);
225
+ this.terminals.delete(terminalId);
226
+ });
227
+ return { shell: session.shell, cwd, isReconnect: false };
228
+ }
229
+ catch (error) {
230
+ console.error(`[PTYManager] Failed to create terminal ${terminalId}:`, error);
231
+ this.emit('error', terminalId, error.message || 'Failed to create terminal');
232
+ throw error;
233
+ }
234
+ }
235
+ /**
236
+ * Write input data to terminal
237
+ */
238
+ write(terminalId, data) {
239
+ const session = this.terminals.get(terminalId);
240
+ if (!session) {
241
+ console.warn(`[PTYManager] Terminal ${terminalId} not found for write`);
242
+ return false;
243
+ }
244
+ try {
245
+ session.pty.write(data);
246
+ return true;
247
+ }
248
+ catch (error) {
249
+ console.error(`[PTYManager] Error writing to terminal ${terminalId}:`, error);
250
+ this.emit('error', terminalId, error.message || 'Write failed');
251
+ return false;
252
+ }
253
+ }
254
+ /**
255
+ * Resize terminal
256
+ */
257
+ resize(terminalId, cols, rows) {
258
+ const session = this.terminals.get(terminalId);
259
+ if (!session) {
260
+ console.warn(`[PTYManager] Terminal ${terminalId} not found for resize`);
261
+ return false;
262
+ }
263
+ try {
264
+ session.pty.resize(cols, rows);
265
+ return true;
266
+ }
267
+ catch (error) {
268
+ console.error(`[PTYManager] Error resizing terminal ${terminalId}:`, error);
269
+ return false;
270
+ }
271
+ }
272
+ /**
273
+ * Close terminal session
274
+ */
275
+ close(terminalId) {
276
+ const session = this.terminals.get(terminalId);
277
+ if (!session) {
278
+ return false;
279
+ }
280
+ try {
281
+ session.pty.kill();
282
+ this.terminals.delete(terminalId);
283
+ return true;
284
+ }
285
+ catch (error) {
286
+ console.error(`[PTYManager] Error closing terminal ${terminalId}:`, error);
287
+ this.terminals.delete(terminalId);
288
+ return false;
289
+ }
290
+ }
291
+ /**
292
+ * Get terminal session info
293
+ */
294
+ getSession(terminalId) {
295
+ return this.terminals.get(terminalId);
296
+ }
297
+ /**
298
+ * Check if terminal exists
299
+ */
300
+ has(terminalId) {
301
+ return this.terminals.has(terminalId);
302
+ }
303
+ /**
304
+ * Get all active terminal IDs
305
+ */
306
+ getActiveTerminals() {
307
+ return Array.from(this.terminals.keys());
308
+ }
309
+ /**
310
+ * Close all terminals
311
+ */
312
+ closeAll() {
313
+ for (const terminalId of this.terminals.keys()) {
314
+ this.close(terminalId);
315
+ }
316
+ }
317
+ /**
318
+ * Check if tmux persistence is available
319
+ */
320
+ isTmuxAvailable() {
321
+ return isTmuxAvailable();
322
+ }
323
+ /**
324
+ * Get list of persistent tmux sessions that can be restored
325
+ * These are sessions that survived a server restart
326
+ */
327
+ getPersistentSessions() {
328
+ const tmux = getTmuxManager();
329
+ return tmux.getActiveSessions();
330
+ }
331
+ /**
332
+ * Create a persistent (tmux-backed) terminal session
333
+ * These sessions survive server restarts
334
+ */
335
+ createPersistent(terminalId, workingDir, cols = 80, rows = 24, requestedShell) {
336
+ const tmux = getTmuxManager();
337
+ if (!tmux.isAvailable()) {
338
+ throw new Error('tmux is not available for persistent sessions');
339
+ }
340
+ const result = tmux.create(terminalId, workingDir, cols, rows, requestedShell);
341
+ return { ...result, persistent: true };
342
+ }
343
+ /**
344
+ * Attach to a persistent (tmux) session
345
+ * Returns handlers for write, resize, and detach
346
+ */
347
+ attachPersistent(terminalId, onOutput, onExit) {
348
+ const tmux = getTmuxManager();
349
+ if (!tmux.exists(terminalId)) {
350
+ return null;
351
+ }
352
+ return tmux.attach(terminalId, onOutput, onExit);
353
+ }
354
+ /**
355
+ * Get scrollback from a persistent (tmux) session
356
+ */
357
+ getPersistentScrollback(terminalId) {
358
+ const tmux = getTmuxManager();
359
+ return tmux.getScrollback(terminalId);
360
+ }
361
+ /**
362
+ * Close a persistent (tmux) session
363
+ */
364
+ closePersistent(terminalId) {
365
+ const tmux = getTmuxManager();
366
+ return tmux.close(terminalId);
367
+ }
368
+ }
369
+ // Singleton instance
370
+ let ptyManagerInstance = null;
371
+ export function getPTYManager() {
372
+ if (!ptyManagerInstance) {
373
+ ptyManagerInstance = new PTYManager();
374
+ }
375
+ return ptyManagerInstance;
376
+ }
377
+ //# sourceMappingURL=pty-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty-manager.js","sourceRoot":"","sources":["../../../../server/services/terminal/pty-manager.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,gEAAgE;AAEhE;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,eAAe,EAAoB,MAAM,mBAAmB,CAAC;AAEtF,oDAAoD;AACpD,IAAI,GAAG,GAAqC,IAAI,CAAC;AACjD,IAAI,aAAa,GAAkB,IAAI,CAAC;AAExC,IAAI,CAAC;IACH,GAAG,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC;AAAC,OAAO,KAAU,EAAE,CAAC;IACpB,aAAa,GAAG,KAAK,CAAC,OAAO,IAAI,yBAAyB,CAAC;IAC3D,OAAO,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IACjF,OAAO,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,GAAG,KAAK,IAAI,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;IAEtB,IAAI,YAAY,GAAG,+DAA+D,CAAC;IACnF,YAAY,IAAI,6BAA6B,CAAC;IAE9C,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;QACpB,YAAY,IAAI,wCAAwC,CAAC;QACzD,YAAY,IAAI,+BAA+B,CAAC;IAClD,CAAC;SAAM,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QAC1B,YAAY,IAAI,mCAAmC,CAAC;QACpD,YAAY,IAAI,2CAA2C,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,QAAQ;QACR,YAAY,IAAI,2BAA2B,CAAC;QAC5C,YAAY,IAAI,uBAAuB,CAAC;QACxC,YAAY,IAAI,iDAAiD,CAAC;QAClE,YAAY,IAAI,qBAAqB,CAAC;QACtC,YAAY,IAAI,8CAA8C,CAAC;QAC/D,YAAY,IAAI,cAAc,CAAC;QAC/B,YAAY,IAAI,yCAAyC,CAAC;IAC5D,CAAC;IAED,YAAY,IAAI,8BAA8B,CAAC;IAC/C,YAAY,IAAI,6BAA6B,CAAC;IAC9C,YAAY,IAAI,oBAAoB,CAAC;IAErC,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,2DAA2D;AAC3D,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,sDAAsD;AACtD,MAAM,eAAe,GAAG,IAAI,CAAC;AAqB7B;;GAEG;AACH,SAAS,WAAW;IAClB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IAEhC,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IAED,6BAA6B;IAC7B,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,gBAAgB,CAAC;IACjD,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,SAAiB;IACrC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC;AAC5C,CAAC;AAED,MAAM,OAAO,UAAW,SAAQ,YAAY;IAClC,SAAS,GAA4B,IAAI,GAAG,EAAE,CAAC;IAEvD;QACE,KAAK,EAAE,CAAC;QACR,0EAA0E;QAC1E,uEAAuE;QACvE,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAkB;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,UAAkB;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,OAAO;YACL,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,UAAkB;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,OAAmB,EAAE,IAAY;QACvD,wBAAwB;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,oDAAoD;YACpD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,GAAG,eAAe;gBACjD,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,KAAK;gBACxC,CAAC,CAAC,IAAI,CAAC;YAET,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzC,CAAC;QAED,qCAAqC;QACrC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;YACrD,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,cAAc,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,yBAAyB;QACvB,OAAO,yBAAyB,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,MAAM,CACJ,UAAkB,EAClB,UAAkB,EAClB,OAAe,EAAE,EACjB,OAAe,EAAE,EACjB,cAAuB;QAEvB,iCAAiC;QACjC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,qBAAqB,yBAAyB,EAAE,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,kEAAkE;QAClE,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;YAExD,mEAAmE;YACnE,6DAA6D;YAC7D,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACvC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC;YAC5B,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC;YAE5B,OAAO;gBACL,KAAK,EAAE,eAAe,CAAC,KAAK;gBAC5B,GAAG,EAAE,eAAe,CAAC,GAAG;gBACxB,WAAW,EAAE,IAAI;aAClB,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,cAAc,IAAI,WAAW,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,UAAU,IAAI,OAAO,EAAE,CAAC;QAGpC,IAAI,CAAC;YACH,wBAAwB;YACxB,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE;gBACtC,IAAI,EAAE,gBAAgB;gBACtB,IAAI;gBACJ,IAAI;gBACJ,GAAG;gBACH,GAAG,EAAE;oBACH,GAAG,OAAO,CAAC,GAAG;oBACd,IAAI,EAAE,gBAAgB;oBACtB,SAAS,EAAE,WAAW;oBACtB,+BAA+B;oBAC/B,IAAI,EAAE,OAAO,EAAE;iBAChB;aACF,CAAC,CAAC;YAEH,2CAA2C;YAC3C,MAAM,OAAO,GAAe;gBAC1B,EAAE,EAAE,UAAU;gBACd,GAAG,EAAE,UAAU;gBACf,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;gBAC1B,GAAG;gBACH,UAAU,EAAE,EAAE;gBACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE;gBAC1B,IAAI;gBACJ,IAAI;aACL,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAExC,oDAAoD;YACpD,UAAU,CAAC,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;gBACjC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;YAEH,cAAc;YACd,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;gBACjC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;gBACxC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,0CAA0C,UAAU,GAAG,EAAE,KAAK,CAAC,CAAC;YAC9E,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO,IAAI,2BAA2B,CAAC,CAAC;YAC7E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAkB,EAAE,IAAY;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,yBAAyB,UAAU,sBAAsB,CAAC,CAAC;YACxE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,0CAA0C,UAAU,GAAG,EAAE,KAAK,CAAC,CAAC;YAC9E,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO,IAAI,cAAc,CAAC,CAAC;YAChE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAkB,EAAE,IAAY,EAAE,IAAY;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,yBAAyB,UAAU,uBAAuB,CAAC,CAAC;YACzE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,wCAAwC,UAAU,GAAG,EAAE,KAAK,CAAC,CAAC;YAC5E,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAkB;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,KAAK,CAAC;QACf,CAAC;QAGD,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,uCAAuC,UAAU,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3E,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAClC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,UAAkB;QAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,UAAkB;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,qBAAqB;QACnB,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,gBAAgB,CACd,UAAkB,EAClB,UAAkB,EAClB,OAAe,EAAE,EACjB,OAAe,EAAE,EACjB,cAAuB;QAEvB,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;QAE9B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAC/E,OAAO,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,gBAAgB,CACd,UAAkB,EAClB,QAAgC,EAChC,MAA8B;QAE9B,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;QAE9B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,uBAAuB,CAAC,UAAkB;QACxC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,UAAkB;QAChC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;CACF;AAED,qBAAqB;AACrB,IAAI,kBAAkB,GAAsB,IAAI,CAAC;AAEjD,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,kBAAkB,GAAG,IAAI,UAAU,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,kBAAkB,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,82 @@
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
@@ -0,0 +1 @@
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"}