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.
- package/LICENSE +21 -0
- package/README.md +181 -0
- package/brosh_brandmark.svg +3 -0
- package/brosh_logo.svg +27 -0
- package/cli_icon.svg +52 -0
- package/dist/client.d.ts +5 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +138 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +618 -0
- package/dist/index.js.map +1 -0
- package/dist/lib.d.ts +25 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +28 -0
- package/dist/lib.js.map +1 -0
- package/dist/mode-selector.d.ts +7 -0
- package/dist/mode-selector.d.ts.map +1 -0
- package/dist/mode-selector.js +138 -0
- package/dist/mode-selector.js.map +1 -0
- package/dist/prompts/index.d.ts +3 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +79 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/recording/index.d.ts +4 -0
- package/dist/recording/index.d.ts.map +1 -0
- package/dist/recording/index.js +3 -0
- package/dist/recording/index.js.map +1 -0
- package/dist/recording/manager.d.ts +62 -0
- package/dist/recording/manager.d.ts.map +1 -0
- package/dist/recording/manager.js +123 -0
- package/dist/recording/manager.js.map +1 -0
- package/dist/recording/recorder.d.ts +95 -0
- package/dist/recording/recorder.d.ts.map +1 -0
- package/dist/recording/recorder.js +330 -0
- package/dist/recording/recorder.js.map +1 -0
- package/dist/recording/types.d.ts +65 -0
- package/dist/recording/types.d.ts.map +1 -0
- package/dist/recording/types.js +2 -0
- package/dist/recording/types.js.map +1 -0
- package/dist/sandbox/ModeSelector.d.ts +2 -0
- package/dist/sandbox/ModeSelector.d.ts.map +1 -0
- package/dist/sandbox/ModeSelector.js +2 -0
- package/dist/sandbox/ModeSelector.js.map +1 -0
- package/dist/sandbox/config.d.ts +46 -0
- package/dist/sandbox/config.d.ts.map +1 -0
- package/dist/sandbox/config.js +144 -0
- package/dist/sandbox/config.js.map +1 -0
- package/dist/sandbox/controller.d.ts +72 -0
- package/dist/sandbox/controller.d.ts.map +1 -0
- package/dist/sandbox/controller.js +208 -0
- package/dist/sandbox/controller.js.map +1 -0
- package/dist/sandbox/index.d.ts +6 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +4 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/mode-prompt.d.ts +10 -0
- package/dist/sandbox/mode-prompt.d.ts.map +1 -0
- package/dist/sandbox/mode-prompt.js +130 -0
- package/dist/sandbox/mode-prompt.js.map +1 -0
- package/dist/sandbox/prompt.d.ts +10 -0
- package/dist/sandbox/prompt.d.ts.map +1 -0
- package/dist/sandbox/prompt.js +434 -0
- package/dist/sandbox/prompt.js.map +1 -0
- package/dist/server.d.ts +28 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +59 -0
- package/dist/server.js.map +1 -0
- package/dist/terminal/index.d.ts +5 -0
- package/dist/terminal/index.d.ts.map +1 -0
- package/dist/terminal/index.js +3 -0
- package/dist/terminal/index.js.map +1 -0
- package/dist/terminal/manager.d.ts +153 -0
- package/dist/terminal/manager.d.ts.map +1 -0
- package/dist/terminal/manager.js +276 -0
- package/dist/terminal/manager.js.map +1 -0
- package/dist/terminal/session.d.ts +137 -0
- package/dist/terminal/session.d.ts.map +1 -0
- package/dist/terminal/session.js +752 -0
- package/dist/terminal/session.js.map +1 -0
- package/dist/tools/definitions.d.ts +18 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +114 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/getContent.d.ts +32 -0
- package/dist/tools/getContent.d.ts.map +1 -0
- package/dist/tools/getContent.js +38 -0
- package/dist/tools/getContent.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +49 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/screenshot.d.ts +20 -0
- package/dist/tools/screenshot.d.ts.map +1 -0
- package/dist/tools/screenshot.js +28 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/sendKey.d.ts +31 -0
- package/dist/tools/sendKey.d.ts.map +1 -0
- package/dist/tools/sendKey.js +38 -0
- package/dist/tools/sendKey.js.map +1 -0
- package/dist/tools/startRecording.d.ts +68 -0
- package/dist/tools/startRecording.d.ts.map +1 -0
- package/dist/tools/startRecording.js +111 -0
- package/dist/tools/startRecording.js.map +1 -0
- package/dist/tools/stopRecording.d.ts +31 -0
- package/dist/tools/stopRecording.d.ts.map +1 -0
- package/dist/tools/stopRecording.js +76 -0
- package/dist/tools/stopRecording.js.map +1 -0
- package/dist/tools/type.d.ts +31 -0
- package/dist/tools/type.d.ts.map +1 -0
- package/dist/tools/type.js +31 -0
- package/dist/tools/type.js.map +1 -0
- package/dist/transport/gui-protocol.d.ts +163 -0
- package/dist/transport/gui-protocol.d.ts.map +1 -0
- package/dist/transport/gui-protocol.js +68 -0
- package/dist/transport/gui-protocol.js.map +1 -0
- package/dist/transport/gui-stream.d.ts +139 -0
- package/dist/transport/gui-stream.d.ts.map +1 -0
- package/dist/transport/gui-stream.js +440 -0
- package/dist/transport/gui-stream.js.map +1 -0
- package/dist/transport/index.d.ts +6 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +6 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/socket.d.ts +46 -0
- package/dist/transport/socket.d.ts.map +1 -0
- package/dist/transport/socket.js +310 -0
- package/dist/transport/socket.js.map +1 -0
- package/dist/types/mcp-client-info.d.ts +226 -0
- package/dist/types/mcp-client-info.d.ts.map +1 -0
- package/dist/types/mcp-client-info.js +62 -0
- package/dist/types/mcp-client-info.js.map +1 -0
- package/dist/ui/index.d.ts +12 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +84 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/utils/env.d.ts +17 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +35 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/keys.d.ts +16 -0
- package/dist/utils/keys.d.ts.map +1 -0
- package/dist/utils/keys.js +155 -0
- package/dist/utils/keys.js.map +1 -0
- package/dist/utils/platform.d.ts +16 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +41 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/session-logger.d.ts +31 -0
- package/dist/utils/session-logger.d.ts.map +1 -0
- package/dist/utils/session-logger.js +125 -0
- package/dist/utils/session-logger.js.map +1 -0
- package/dist/utils/stats.d.ts +46 -0
- package/dist/utils/stats.d.ts.map +1 -0
- package/dist/utils/stats.js +89 -0
- package/dist/utils/stats.js.map +1 -0
- package/dist/utils/version.d.ts +2 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +9 -0
- package/dist/utils/version.js.map +1 -0
- package/logo.png +0 -0
- package/package.json +61 -0
- package/packages/desktop-electron/THIRD-PARTY-NOTICES +56 -0
- package/packages/desktop-electron/build/afterPack.cjs +147 -0
- package/packages/desktop-electron/package-lock.json +10071 -0
- package/packages/desktop-electron/package.json +170 -0
- package/packages/desktop-electron/resources/icons/mac/icon.icns +0 -0
- package/packages/desktop-electron/resources/icons/png/1024x1024.png +0 -0
- package/packages/desktop-electron/resources/icons/png/128x128.png +0 -0
- package/packages/desktop-electron/resources/icons/png/16x16.png +0 -0
- package/packages/desktop-electron/resources/icons/png/24x24.png +0 -0
- package/packages/desktop-electron/resources/icons/png/256x256.png +0 -0
- package/packages/desktop-electron/resources/icons/png/32x32.png +0 -0
- package/packages/desktop-electron/resources/icons/png/48x48.png +0 -0
- package/packages/desktop-electron/resources/icons/png/512x512.png +0 -0
- package/packages/desktop-electron/resources/icons/png/64x64.png +0 -0
- package/packages/desktop-electron/resources/icons/win/icon.ico +0 -0
- package/packages/desktop-electron/scripts/download-models.js +97 -0
- package/packages/desktop-electron/scripts/prepare-sandbox-bins.js +186 -0
- package/packages/desktop-electron/tests/main/ai-detection/additionalFunctions.test.ts +224 -0
- package/packages/desktop-electron/tests/main/ai-detection/checkOverridePrefix.test.ts +162 -0
- package/packages/desktop-electron/tests/main/ai-detection/classifyInput.test.ts +132 -0
- package/packages/desktop-electron/tests/main/ai-detection/detectTypos.test.ts +342 -0
- package/packages/desktop-electron/tests/main/ai-detection/fixtures/commands.ts +134 -0
- package/packages/desktop-electron/tests/main/ai-detection/fixtures/natural-language.ts +133 -0
- package/packages/desktop-electron/tests/main/ai-detection/fixtures/typos.ts +123 -0
- package/packages/desktop-electron/tests/main/ai-detection/hasValidSubcommand.test.ts +218 -0
- package/packages/desktop-electron/tests/main/ai-detection/isCommandNotFound.test.ts +117 -0
- package/packages/desktop-electron/tests/main/error-triage/buildTriagePrompt.test.ts +133 -0
- package/packages/desktop-electron/tests/main/error-triage/parseTriageResponse.test.ts +123 -0
- package/packages/desktop-electron/tests/main/terminal-bridge/battery-optimization.test.ts +243 -0
- package/packages/desktop-electron/tests/main/terminal-bridge/command-fast-track.test.ts +292 -0
- package/packages/desktop-electron/tests/main/terminal-bridge/default-cwd.test.ts +70 -0
- package/packages/desktop-electron/tests/setup.ts +274 -0
- package/packages/desktop-electron/tsconfig.json +18 -0
- package/packages/desktop-electron/tsconfig.main.json +20 -0
- package/packages/desktop-electron/vite.config.ts +19 -0
- package/packages/desktop-electron/vitest.config.ts +18 -0
- 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"}
|