brosh 0.2.2

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 (200) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +181 -0
  3. package/brosh_brandmark.svg +3 -0
  4. package/brosh_logo.svg +27 -0
  5. package/cli_icon.svg +52 -0
  6. package/dist/client.d.ts +5 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +138 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +618 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/lib.d.ts +25 -0
  15. package/dist/lib.d.ts.map +1 -0
  16. package/dist/lib.js +28 -0
  17. package/dist/lib.js.map +1 -0
  18. package/dist/mode-selector.d.ts +7 -0
  19. package/dist/mode-selector.d.ts.map +1 -0
  20. package/dist/mode-selector.js +138 -0
  21. package/dist/mode-selector.js.map +1 -0
  22. package/dist/prompts/index.d.ts +3 -0
  23. package/dist/prompts/index.d.ts.map +1 -0
  24. package/dist/prompts/index.js +79 -0
  25. package/dist/prompts/index.js.map +1 -0
  26. package/dist/recording/index.d.ts +4 -0
  27. package/dist/recording/index.d.ts.map +1 -0
  28. package/dist/recording/index.js +3 -0
  29. package/dist/recording/index.js.map +1 -0
  30. package/dist/recording/manager.d.ts +62 -0
  31. package/dist/recording/manager.d.ts.map +1 -0
  32. package/dist/recording/manager.js +123 -0
  33. package/dist/recording/manager.js.map +1 -0
  34. package/dist/recording/recorder.d.ts +95 -0
  35. package/dist/recording/recorder.d.ts.map +1 -0
  36. package/dist/recording/recorder.js +330 -0
  37. package/dist/recording/recorder.js.map +1 -0
  38. package/dist/recording/types.d.ts +65 -0
  39. package/dist/recording/types.d.ts.map +1 -0
  40. package/dist/recording/types.js +2 -0
  41. package/dist/recording/types.js.map +1 -0
  42. package/dist/sandbox/ModeSelector.d.ts +2 -0
  43. package/dist/sandbox/ModeSelector.d.ts.map +1 -0
  44. package/dist/sandbox/ModeSelector.js +2 -0
  45. package/dist/sandbox/ModeSelector.js.map +1 -0
  46. package/dist/sandbox/config.d.ts +46 -0
  47. package/dist/sandbox/config.d.ts.map +1 -0
  48. package/dist/sandbox/config.js +144 -0
  49. package/dist/sandbox/config.js.map +1 -0
  50. package/dist/sandbox/controller.d.ts +72 -0
  51. package/dist/sandbox/controller.d.ts.map +1 -0
  52. package/dist/sandbox/controller.js +208 -0
  53. package/dist/sandbox/controller.js.map +1 -0
  54. package/dist/sandbox/index.d.ts +6 -0
  55. package/dist/sandbox/index.d.ts.map +1 -0
  56. package/dist/sandbox/index.js +4 -0
  57. package/dist/sandbox/index.js.map +1 -0
  58. package/dist/sandbox/mode-prompt.d.ts +10 -0
  59. package/dist/sandbox/mode-prompt.d.ts.map +1 -0
  60. package/dist/sandbox/mode-prompt.js +130 -0
  61. package/dist/sandbox/mode-prompt.js.map +1 -0
  62. package/dist/sandbox/prompt.d.ts +10 -0
  63. package/dist/sandbox/prompt.d.ts.map +1 -0
  64. package/dist/sandbox/prompt.js +434 -0
  65. package/dist/sandbox/prompt.js.map +1 -0
  66. package/dist/server.d.ts +28 -0
  67. package/dist/server.d.ts.map +1 -0
  68. package/dist/server.js +59 -0
  69. package/dist/server.js.map +1 -0
  70. package/dist/terminal/index.d.ts +5 -0
  71. package/dist/terminal/index.d.ts.map +1 -0
  72. package/dist/terminal/index.js +3 -0
  73. package/dist/terminal/index.js.map +1 -0
  74. package/dist/terminal/manager.d.ts +153 -0
  75. package/dist/terminal/manager.d.ts.map +1 -0
  76. package/dist/terminal/manager.js +276 -0
  77. package/dist/terminal/manager.js.map +1 -0
  78. package/dist/terminal/session.d.ts +137 -0
  79. package/dist/terminal/session.d.ts.map +1 -0
  80. package/dist/terminal/session.js +752 -0
  81. package/dist/terminal/session.js.map +1 -0
  82. package/dist/tools/definitions.d.ts +18 -0
  83. package/dist/tools/definitions.d.ts.map +1 -0
  84. package/dist/tools/definitions.js +114 -0
  85. package/dist/tools/definitions.js.map +1 -0
  86. package/dist/tools/getContent.d.ts +32 -0
  87. package/dist/tools/getContent.d.ts.map +1 -0
  88. package/dist/tools/getContent.js +38 -0
  89. package/dist/tools/getContent.js.map +1 -0
  90. package/dist/tools/index.d.ts +4 -0
  91. package/dist/tools/index.d.ts.map +1 -0
  92. package/dist/tools/index.js +49 -0
  93. package/dist/tools/index.js.map +1 -0
  94. package/dist/tools/screenshot.d.ts +20 -0
  95. package/dist/tools/screenshot.d.ts.map +1 -0
  96. package/dist/tools/screenshot.js +28 -0
  97. package/dist/tools/screenshot.js.map +1 -0
  98. package/dist/tools/sendKey.d.ts +31 -0
  99. package/dist/tools/sendKey.d.ts.map +1 -0
  100. package/dist/tools/sendKey.js +38 -0
  101. package/dist/tools/sendKey.js.map +1 -0
  102. package/dist/tools/startRecording.d.ts +68 -0
  103. package/dist/tools/startRecording.d.ts.map +1 -0
  104. package/dist/tools/startRecording.js +111 -0
  105. package/dist/tools/startRecording.js.map +1 -0
  106. package/dist/tools/stopRecording.d.ts +31 -0
  107. package/dist/tools/stopRecording.d.ts.map +1 -0
  108. package/dist/tools/stopRecording.js +76 -0
  109. package/dist/tools/stopRecording.js.map +1 -0
  110. package/dist/tools/type.d.ts +31 -0
  111. package/dist/tools/type.d.ts.map +1 -0
  112. package/dist/tools/type.js +31 -0
  113. package/dist/tools/type.js.map +1 -0
  114. package/dist/transport/gui-protocol.d.ts +163 -0
  115. package/dist/transport/gui-protocol.d.ts.map +1 -0
  116. package/dist/transport/gui-protocol.js +68 -0
  117. package/dist/transport/gui-protocol.js.map +1 -0
  118. package/dist/transport/gui-stream.d.ts +139 -0
  119. package/dist/transport/gui-stream.d.ts.map +1 -0
  120. package/dist/transport/gui-stream.js +440 -0
  121. package/dist/transport/gui-stream.js.map +1 -0
  122. package/dist/transport/index.d.ts +6 -0
  123. package/dist/transport/index.d.ts.map +1 -0
  124. package/dist/transport/index.js +6 -0
  125. package/dist/transport/index.js.map +1 -0
  126. package/dist/transport/socket.d.ts +46 -0
  127. package/dist/transport/socket.d.ts.map +1 -0
  128. package/dist/transport/socket.js +310 -0
  129. package/dist/transport/socket.js.map +1 -0
  130. package/dist/types/mcp-client-info.d.ts +226 -0
  131. package/dist/types/mcp-client-info.d.ts.map +1 -0
  132. package/dist/types/mcp-client-info.js +62 -0
  133. package/dist/types/mcp-client-info.js.map +1 -0
  134. package/dist/ui/index.d.ts +12 -0
  135. package/dist/ui/index.d.ts.map +1 -0
  136. package/dist/ui/index.js +84 -0
  137. package/dist/ui/index.js.map +1 -0
  138. package/dist/utils/env.d.ts +17 -0
  139. package/dist/utils/env.d.ts.map +1 -0
  140. package/dist/utils/env.js +35 -0
  141. package/dist/utils/env.js.map +1 -0
  142. package/dist/utils/keys.d.ts +16 -0
  143. package/dist/utils/keys.d.ts.map +1 -0
  144. package/dist/utils/keys.js +155 -0
  145. package/dist/utils/keys.js.map +1 -0
  146. package/dist/utils/platform.d.ts +16 -0
  147. package/dist/utils/platform.d.ts.map +1 -0
  148. package/dist/utils/platform.js +41 -0
  149. package/dist/utils/platform.js.map +1 -0
  150. package/dist/utils/session-logger.d.ts +31 -0
  151. package/dist/utils/session-logger.d.ts.map +1 -0
  152. package/dist/utils/session-logger.js +125 -0
  153. package/dist/utils/session-logger.js.map +1 -0
  154. package/dist/utils/stats.d.ts +46 -0
  155. package/dist/utils/stats.d.ts.map +1 -0
  156. package/dist/utils/stats.js +89 -0
  157. package/dist/utils/stats.js.map +1 -0
  158. package/dist/utils/version.d.ts +2 -0
  159. package/dist/utils/version.d.ts.map +1 -0
  160. package/dist/utils/version.js +9 -0
  161. package/dist/utils/version.js.map +1 -0
  162. package/logo.png +0 -0
  163. package/package.json +61 -0
  164. package/packages/desktop-electron/THIRD-PARTY-NOTICES +56 -0
  165. package/packages/desktop-electron/build/afterPack.cjs +147 -0
  166. package/packages/desktop-electron/package-lock.json +10071 -0
  167. package/packages/desktop-electron/package.json +170 -0
  168. package/packages/desktop-electron/resources/icons/mac/icon.icns +0 -0
  169. package/packages/desktop-electron/resources/icons/png/1024x1024.png +0 -0
  170. package/packages/desktop-electron/resources/icons/png/128x128.png +0 -0
  171. package/packages/desktop-electron/resources/icons/png/16x16.png +0 -0
  172. package/packages/desktop-electron/resources/icons/png/24x24.png +0 -0
  173. package/packages/desktop-electron/resources/icons/png/256x256.png +0 -0
  174. package/packages/desktop-electron/resources/icons/png/32x32.png +0 -0
  175. package/packages/desktop-electron/resources/icons/png/48x48.png +0 -0
  176. package/packages/desktop-electron/resources/icons/png/512x512.png +0 -0
  177. package/packages/desktop-electron/resources/icons/png/64x64.png +0 -0
  178. package/packages/desktop-electron/resources/icons/win/icon.ico +0 -0
  179. package/packages/desktop-electron/scripts/download-models.js +97 -0
  180. package/packages/desktop-electron/scripts/prepare-sandbox-bins.js +186 -0
  181. package/packages/desktop-electron/tests/main/ai-detection/additionalFunctions.test.ts +224 -0
  182. package/packages/desktop-electron/tests/main/ai-detection/checkOverridePrefix.test.ts +162 -0
  183. package/packages/desktop-electron/tests/main/ai-detection/classifyInput.test.ts +132 -0
  184. package/packages/desktop-electron/tests/main/ai-detection/detectTypos.test.ts +342 -0
  185. package/packages/desktop-electron/tests/main/ai-detection/fixtures/commands.ts +134 -0
  186. package/packages/desktop-electron/tests/main/ai-detection/fixtures/natural-language.ts +133 -0
  187. package/packages/desktop-electron/tests/main/ai-detection/fixtures/typos.ts +123 -0
  188. package/packages/desktop-electron/tests/main/ai-detection/hasValidSubcommand.test.ts +218 -0
  189. package/packages/desktop-electron/tests/main/ai-detection/isCommandNotFound.test.ts +117 -0
  190. package/packages/desktop-electron/tests/main/error-triage/buildTriagePrompt.test.ts +133 -0
  191. package/packages/desktop-electron/tests/main/error-triage/parseTriageResponse.test.ts +123 -0
  192. package/packages/desktop-electron/tests/main/terminal-bridge/battery-optimization.test.ts +243 -0
  193. package/packages/desktop-electron/tests/main/terminal-bridge/command-fast-track.test.ts +292 -0
  194. package/packages/desktop-electron/tests/main/terminal-bridge/default-cwd.test.ts +70 -0
  195. package/packages/desktop-electron/tests/setup.ts +274 -0
  196. package/packages/desktop-electron/tsconfig.json +18 -0
  197. package/packages/desktop-electron/tsconfig.main.json +20 -0
  198. package/packages/desktop-electron/vite.config.ts +19 -0
  199. package/packages/desktop-electron/vitest.config.ts +18 -0
  200. package/tsconfig.json +19 -0
@@ -0,0 +1,440 @@
1
+ /**
2
+ * GUI Output Stream
3
+ *
4
+ * Manages connections from GUI clients and broadcasts terminal events to them.
5
+ * Supports multiple concurrent GUI clients (e.g., multiple Electron windows).
6
+ *
7
+ * This module provides the bridge between brosh's core PTY handling
8
+ * and GUI frontends like Electron.
9
+ */
10
+ import { EventEmitter } from "events";
11
+ import { encodeData, decodeData, } from "./gui-protocol.js";
12
+ // Default session ID for single-session mode (current TerminalManager)
13
+ const DEFAULT_SESSION_ID = "default";
14
+ /**
15
+ * Manages GUI client connections and routes messages between
16
+ * terminal sessions and GUI frontends.
17
+ *
18
+ * Currently works with TerminalManager's single-session model.
19
+ * Multi-session support will be added when TerminalManager is extended.
20
+ */
21
+ export class GUIOutputStream extends EventEmitter {
22
+ clients = new Map();
23
+ sessionSubscriptions = new Map(); // sessionId -> Set<clientId>
24
+ manager = null;
25
+ clientCounter = 0;
26
+ sessionEventsBound = false;
27
+ constructor() {
28
+ super();
29
+ }
30
+ /**
31
+ * Attach a TerminalManager to handle session operations
32
+ */
33
+ attachManager(manager) {
34
+ this.manager = manager;
35
+ }
36
+ /**
37
+ * Add a GUI client connection
38
+ * @returns clientId for this connection
39
+ */
40
+ addClient(callback) {
41
+ const clientId = `gui-${++this.clientCounter}`;
42
+ this.clients.set(clientId, callback);
43
+ this.emit("client-connected", clientId);
44
+ return clientId;
45
+ }
46
+ /**
47
+ * Remove a GUI client connection
48
+ */
49
+ removeClient(clientId) {
50
+ this.clients.delete(clientId);
51
+ // Remove from all session subscriptions
52
+ for (const subscribers of this.sessionSubscriptions.values()) {
53
+ subscribers.delete(clientId);
54
+ }
55
+ this.emit("client-disconnected", clientId);
56
+ }
57
+ /**
58
+ * Get the number of connected clients
59
+ */
60
+ getClientCount() {
61
+ return this.clients.size;
62
+ }
63
+ /**
64
+ * Send a message to a specific client
65
+ */
66
+ sendToClient(clientId, message) {
67
+ const callback = this.clients.get(clientId);
68
+ if (callback) {
69
+ try {
70
+ callback(message);
71
+ }
72
+ catch (error) {
73
+ this.emit("error", error instanceof Error ? error : new Error(String(error)));
74
+ }
75
+ }
76
+ }
77
+ /**
78
+ * Broadcast a message to all connected clients
79
+ */
80
+ broadcast(message) {
81
+ for (const [, callback] of this.clients) {
82
+ try {
83
+ callback(message);
84
+ }
85
+ catch (error) {
86
+ this.emit("error", error instanceof Error ? error : new Error(String(error)));
87
+ }
88
+ }
89
+ }
90
+ /**
91
+ * Broadcast a message to clients subscribed to a specific session
92
+ */
93
+ broadcastToSession(sessionId, message) {
94
+ const subscribers = this.sessionSubscriptions.get(sessionId);
95
+ if (!subscribers) {
96
+ // Fall back to broadcast if no specific subscribers
97
+ this.broadcast(message);
98
+ return;
99
+ }
100
+ for (const clientId of subscribers) {
101
+ this.sendToClient(clientId, message);
102
+ }
103
+ }
104
+ /**
105
+ * Subscribe a client to a session's events
106
+ */
107
+ subscribeToSession(clientId, sessionId) {
108
+ let subscribers = this.sessionSubscriptions.get(sessionId);
109
+ if (!subscribers) {
110
+ subscribers = new Set();
111
+ this.sessionSubscriptions.set(sessionId, subscribers);
112
+ }
113
+ subscribers.add(clientId);
114
+ }
115
+ /**
116
+ * Unsubscribe a client from a session's events
117
+ */
118
+ unsubscribeFromSession(clientId, sessionId) {
119
+ const subscribers = this.sessionSubscriptions.get(sessionId);
120
+ if (subscribers) {
121
+ subscribers.delete(clientId);
122
+ }
123
+ }
124
+ /**
125
+ * Emit terminal output to subscribed GUI clients
126
+ */
127
+ emitOutput(sessionId, data) {
128
+ this.broadcastToSession(sessionId, {
129
+ type: "output",
130
+ sessionId,
131
+ data: encodeData(data),
132
+ });
133
+ }
134
+ /**
135
+ * Emit session created event
136
+ */
137
+ emitSessionCreated(sessionId, shell, cols, rows, cwd) {
138
+ this.broadcast({
139
+ type: "session-created",
140
+ sessionId,
141
+ shell,
142
+ cols,
143
+ rows,
144
+ cwd,
145
+ });
146
+ }
147
+ /**
148
+ * Emit session closed event
149
+ */
150
+ emitSessionClosed(sessionId, exitCode) {
151
+ this.broadcastToSession(sessionId, {
152
+ type: "session-closed",
153
+ sessionId,
154
+ exitCode,
155
+ });
156
+ // Clean up subscriptions for this session
157
+ this.sessionSubscriptions.delete(sessionId);
158
+ }
159
+ /**
160
+ * Emit resize event
161
+ */
162
+ emitResize(sessionId, cols, rows) {
163
+ this.broadcastToSession(sessionId, {
164
+ type: "resize",
165
+ sessionId,
166
+ cols,
167
+ rows,
168
+ });
169
+ }
170
+ /**
171
+ * Emit recording started event
172
+ */
173
+ emitRecordingStarted(sessionId, filename) {
174
+ this.broadcastToSession(sessionId, {
175
+ type: "recording-started",
176
+ sessionId,
177
+ filename,
178
+ });
179
+ }
180
+ /**
181
+ * Emit recording stopped event
182
+ */
183
+ emitRecordingStopped(sessionId, filename, saved) {
184
+ this.broadcastToSession(sessionId, {
185
+ type: "recording-stopped",
186
+ sessionId,
187
+ filename,
188
+ saved,
189
+ });
190
+ }
191
+ /**
192
+ * Handle an incoming message from a GUI client
193
+ */
194
+ async handleMessage(clientId, message) {
195
+ if (!this.manager) {
196
+ this.sendToClient(clientId, {
197
+ type: "error",
198
+ requestType: message.type,
199
+ message: "No terminal manager attached",
200
+ code: "NO_MANAGER",
201
+ });
202
+ return;
203
+ }
204
+ try {
205
+ switch (message.type) {
206
+ case "create-session":
207
+ await this.handleCreateSession(clientId, message);
208
+ break;
209
+ case "close-session":
210
+ this.handleCloseSession(clientId, message.sessionId);
211
+ break;
212
+ case "input":
213
+ this.handleInput(message.sessionId, decodeData(message.data));
214
+ break;
215
+ case "resize":
216
+ this.handleResize(message);
217
+ break;
218
+ case "get-content":
219
+ this.handleGetContent(clientId, message.sessionId);
220
+ break;
221
+ case "list-sessions":
222
+ this.handleListSessions(clientId);
223
+ break;
224
+ case "start-recording":
225
+ // Recording is handled via CLI flags currently
226
+ this.sendToClient(clientId, {
227
+ type: "error",
228
+ requestType: "start-recording",
229
+ sessionId: message.sessionId,
230
+ message: "Recording control via GUI not yet implemented",
231
+ code: "NOT_IMPLEMENTED",
232
+ });
233
+ break;
234
+ case "stop-recording":
235
+ // Recording is handled via CLI flags currently
236
+ this.sendToClient(clientId, {
237
+ type: "error",
238
+ requestType: "stop-recording",
239
+ sessionId: message.sessionId,
240
+ message: "Recording control via GUI not yet implemented",
241
+ code: "NOT_IMPLEMENTED",
242
+ });
243
+ break;
244
+ default:
245
+ this.sendToClient(clientId, {
246
+ type: "error",
247
+ requestType: message.type,
248
+ message: `Unknown message type: ${message.type}`,
249
+ code: "UNKNOWN_MESSAGE",
250
+ });
251
+ }
252
+ }
253
+ catch (error) {
254
+ this.sendToClient(clientId, {
255
+ type: "error",
256
+ requestType: message.type,
257
+ message: error instanceof Error ? error.message : String(error),
258
+ code: "HANDLER_ERROR",
259
+ });
260
+ }
261
+ }
262
+ /**
263
+ * Handle create-session request
264
+ * Currently uses TerminalManager's single-session model
265
+ */
266
+ async handleCreateSession(clientId, message) {
267
+ if (!this.manager)
268
+ return;
269
+ // Check if session already exists
270
+ if (this.manager.hasActiveSession()) {
271
+ // Return existing session info
272
+ const session = this.manager.getCurrentSession();
273
+ const dims = session.getDimensions();
274
+ // Subscribe client to the session
275
+ this.subscribeToSession(clientId, DEFAULT_SESSION_ID);
276
+ this.sendToClient(clientId, {
277
+ type: "session-created",
278
+ sessionId: DEFAULT_SESSION_ID,
279
+ shell: process.env.SHELL || "/bin/sh",
280
+ cols: dims.cols,
281
+ rows: dims.rows,
282
+ cwd: process.cwd(),
283
+ });
284
+ return;
285
+ }
286
+ // Initialize new session via manager
287
+ const session = await this.manager.initSession();
288
+ // Subscribe client to the session
289
+ this.subscribeToSession(clientId, DEFAULT_SESSION_ID);
290
+ // Set up event forwarding (only once)
291
+ if (!this.sessionEventsBound) {
292
+ this.setupSessionEventForwarding(session);
293
+ this.sessionEventsBound = true;
294
+ }
295
+ // Resize if different from defaults
296
+ if (message.cols || message.rows) {
297
+ const cols = message.cols || 120;
298
+ const rows = message.rows || 40;
299
+ session.resize(cols, rows);
300
+ }
301
+ const dims = session.getDimensions();
302
+ // Notify client
303
+ this.sendToClient(clientId, {
304
+ type: "session-created",
305
+ sessionId: DEFAULT_SESSION_ID,
306
+ shell: message.shell || process.env.SHELL || "/bin/sh",
307
+ cols: dims.cols,
308
+ rows: dims.rows,
309
+ cwd: message.cwd || process.cwd(),
310
+ });
311
+ }
312
+ /**
313
+ * Handle close-session request
314
+ */
315
+ handleCloseSession(clientId, sessionId) {
316
+ if (!this.manager)
317
+ return;
318
+ if (!this.manager.hasActiveSession()) {
319
+ this.sendToClient(clientId, {
320
+ type: "error",
321
+ requestType: "close-session",
322
+ sessionId,
323
+ message: "No active session",
324
+ code: "SESSION_NOT_FOUND",
325
+ });
326
+ return;
327
+ }
328
+ this.manager.dispose();
329
+ this.sessionEventsBound = false;
330
+ }
331
+ /**
332
+ * Handle input message
333
+ */
334
+ handleInput(sessionId, data) {
335
+ if (!this.manager)
336
+ return;
337
+ const session = this.manager.getCurrentSession();
338
+ if (session && session.isActive()) {
339
+ session.write(data);
340
+ }
341
+ }
342
+ /**
343
+ * Handle resize message
344
+ */
345
+ handleResize(message) {
346
+ if (!this.manager)
347
+ return;
348
+ const session = this.manager.getCurrentSession();
349
+ if (session && session.isActive()) {
350
+ session.resize(message.cols, message.rows);
351
+ }
352
+ }
353
+ /**
354
+ * Handle get-content request
355
+ */
356
+ handleGetContent(clientId, sessionId) {
357
+ if (!this.manager)
358
+ return;
359
+ const session = this.manager.getCurrentSession();
360
+ if (!session) {
361
+ this.sendToClient(clientId, {
362
+ type: "error",
363
+ requestType: "get-content",
364
+ sessionId,
365
+ message: "No active session",
366
+ code: "SESSION_NOT_FOUND",
367
+ });
368
+ return;
369
+ }
370
+ const screenshot = session.takeScreenshot();
371
+ this.sendToClient(clientId, {
372
+ type: "content",
373
+ sessionId,
374
+ content: screenshot.content,
375
+ cursor: screenshot.cursor,
376
+ dimensions: screenshot.dimensions,
377
+ });
378
+ }
379
+ /**
380
+ * Handle list-sessions request
381
+ */
382
+ handleListSessions(clientId) {
383
+ if (!this.manager)
384
+ return;
385
+ const session = this.manager.getCurrentSession();
386
+ const sessions = session
387
+ ? [
388
+ {
389
+ sessionId: DEFAULT_SESSION_ID,
390
+ shell: process.env.SHELL || "/bin/sh",
391
+ cols: session.getDimensions().cols,
392
+ rows: session.getDimensions().rows,
393
+ cwd: process.cwd(),
394
+ isRecording: false, // TODO: Check recording status
395
+ },
396
+ ]
397
+ : [];
398
+ this.sendToClient(clientId, {
399
+ type: "session-list",
400
+ sessions,
401
+ });
402
+ }
403
+ /**
404
+ * Set up event forwarding from a session to GUI clients
405
+ */
406
+ setupSessionEventForwarding(session) {
407
+ const sessionId = DEFAULT_SESSION_ID;
408
+ // Forward PTY output
409
+ session.onData((data) => {
410
+ this.emitOutput(sessionId, data);
411
+ });
412
+ // Forward exit
413
+ session.onExit((code) => {
414
+ this.emitSessionClosed(sessionId, code);
415
+ });
416
+ // Forward resize
417
+ session.onResize((cols, rows) => {
418
+ this.emitResize(sessionId, cols, rows);
419
+ });
420
+ }
421
+ /**
422
+ * Dispose of all connections
423
+ */
424
+ dispose() {
425
+ this.clients.clear();
426
+ this.sessionSubscriptions.clear();
427
+ this.manager = null;
428
+ this.sessionEventsBound = false;
429
+ this.removeAllListeners();
430
+ }
431
+ }
432
+ /**
433
+ * Create a GUIOutputStream instance attached to a manager
434
+ */
435
+ export function createGUIOutputStream(manager) {
436
+ const stream = new GUIOutputStream();
437
+ stream.attachManager(manager);
438
+ return stream;
439
+ }
440
+ //# sourceMappingURL=gui-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gui-stream.js","sourceRoot":"","sources":["../../src/transport/gui-stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { SocketTransport, createSocketServer, createToolProxyServer, isSocketInUse, checkSocketAndWarn, getMcpStatusFile } from "./socket.js";
2
+ export { GUIOutputStream, createGUIOutputStream } from "./gui-stream.js";
3
+ export type { GuiClientCallback, GUIOutputStreamEvents } from "./gui-stream.js";
4
+ export { encodeData, decodeData, isGuiMessageToBackend, isGuiMessageToFrontend, } from "./gui-protocol.js";
5
+ export type { GuiMessageToBackend, GuiMessageToFrontend, GuiInputMessage, GuiCreateSessionMessage, GuiCloseSessionMessage, GuiResizeMessage, GuiStartRecordingMessage, GuiStopRecordingMessage, GuiGetContentMessage, GuiListSessionsMessage, BackendOutputMessage, BackendSessionCreatedMessage, BackendSessionClosedMessage, BackendResizeMessage, BackendRecordingStartedMessage, BackendRecordingStoppedMessage, BackendContentMessage, BackendSessionListMessage, BackendErrorMessage, } from "./gui-protocol.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG9I,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACzE,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAGhF,OAAO,EACL,UAAU,EACV,UAAU,EACV,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,uBAAuB,EACvB,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,4BAA4B,EAC5B,2BAA2B,EAC3B,oBAAoB,EACpB,8BAA8B,EAC9B,8BAA8B,EAC9B,qBAAqB,EACrB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { SocketTransport, createSocketServer, createToolProxyServer, isSocketInUse, checkSocketAndWarn, getMcpStatusFile } from "./socket.js";
2
+ // GUI streaming support
3
+ export { GUIOutputStream, createGUIOutputStream } from "./gui-stream.js";
4
+ // GUI protocol types
5
+ export { encodeData, decodeData, isGuiMessageToBackend, isGuiMessageToFrontend, } from "./gui-protocol.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE9I,wBAAwB;AACxB,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAGzE,qBAAqB;AACrB,OAAO,EACL,UAAU,EACV,UAAU,EACV,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { Server as NetServer, Socket } from "net";
2
+ import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
3
+ import { JSONRPCMessage } from "@modelcontextprotocol/sdk/types.js";
4
+ import { TerminalManager } from "../terminal/index.js";
5
+ /**
6
+ * Get the MCP status file path (for shell prompt integration)
7
+ */
8
+ export declare function getMcpStatusFile(): string;
9
+ /**
10
+ * Check if a socket path is already in use by another server.
11
+ * Attempts to connect - if successful, another instance is running.
12
+ * Returns a promise that resolves to true if in use, false otherwise.
13
+ */
14
+ export declare function isSocketInUse(socketPath: string): Promise<boolean>;
15
+ /**
16
+ * Check if socket is in use and log a warning if taking over from another instance.
17
+ * Call this before createToolProxyServer to notify users of the takeover.
18
+ * Returns the owner type if detected ("cli" or "gui"), or null if not in use.
19
+ */
20
+ export declare function checkSocketAndWarn(socketPath: string): Promise<"cli" | "gui" | null>;
21
+ /**
22
+ * Transport that communicates over a Unix socket connection
23
+ * (Used for full MCP protocol when needed)
24
+ */
25
+ export declare class SocketTransport implements Transport {
26
+ private socket;
27
+ private buffer;
28
+ onmessage?: (message: JSONRPCMessage) => void;
29
+ onerror?: (error: Error) => void;
30
+ onclose?: () => void;
31
+ constructor(socket: Socket);
32
+ private processBuffer;
33
+ start(): Promise<void>;
34
+ close(): Promise<void>;
35
+ send(message: JSONRPCMessage): Promise<void>;
36
+ }
37
+ /**
38
+ * Create a Unix socket server that accepts MCP connections
39
+ */
40
+ export declare function createSocketServer(socketPath: string, onConnection: (transport: SocketTransport) => void): NetServer;
41
+ /**
42
+ * Create a simple request/response socket server for tool proxying
43
+ * This is the protocol used between interactive mode and MCP client mode
44
+ */
45
+ export declare function createToolProxyServer(socketPath: string, manager: TerminalManager): NetServer;
46
+ //# sourceMappingURL=socket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/transport/socket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,EAAyB,MAAM,KAAK,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAiBvD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAsBD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4BlE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,CAY1F;AAED;;;GAGG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAC/C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAM;IAEpB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC9C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;gBAET,MAAM,EAAE,MAAM;IAiB1B,OAAO,CAAC,aAAa;IAgBf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAYnD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,GACjD,SAAS,CAgBX;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,eAAe,GACvB,SAAS,CAwHX"}