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,310 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import { Server as NetServer, connect as netConnect } from "net";
|
|
3
|
+
import { getStats } from "../utils/stats.js";
|
|
4
|
+
// Status file for shell prompt to read MCP connection status
|
|
5
|
+
const MCP_STATUS_FILE = "/tmp/brosh-mcp-status";
|
|
6
|
+
/**
|
|
7
|
+
* Write MCP status to file for shell prompt to read
|
|
8
|
+
*/
|
|
9
|
+
function writeMcpStatus(enabled) {
|
|
10
|
+
try {
|
|
11
|
+
fs.writeFileSync(MCP_STATUS_FILE, enabled ? "enabled" : "disabled");
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// Ignore errors - status file is optional
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get the MCP status file path (for shell prompt integration)
|
|
19
|
+
*/
|
|
20
|
+
export function getMcpStatusFile() {
|
|
21
|
+
return MCP_STATUS_FILE;
|
|
22
|
+
}
|
|
23
|
+
// Tool handlers
|
|
24
|
+
import { handleType } from "../tools/type.js";
|
|
25
|
+
import { handleSendKey } from "../tools/sendKey.js";
|
|
26
|
+
import { handleGetContent } from "../tools/getContent.js";
|
|
27
|
+
import { handleScreenshot } from "../tools/screenshot.js";
|
|
28
|
+
import { handleStartRecording } from "../tools/startRecording.js";
|
|
29
|
+
import { handleStopRecording } from "../tools/stopRecording.js";
|
|
30
|
+
/**
|
|
31
|
+
* Check if a socket path is already in use by another server.
|
|
32
|
+
* Attempts to connect - if successful, another instance is running.
|
|
33
|
+
* Returns a promise that resolves to true if in use, false otherwise.
|
|
34
|
+
*/
|
|
35
|
+
export function isSocketInUse(socketPath) {
|
|
36
|
+
return new Promise((resolve) => {
|
|
37
|
+
// Check if socket file exists first
|
|
38
|
+
if (!fs.existsSync(socketPath)) {
|
|
39
|
+
resolve(false);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const client = netConnect(socketPath);
|
|
43
|
+
// Set a short timeout for the connection attempt
|
|
44
|
+
const timeout = setTimeout(() => {
|
|
45
|
+
client.destroy();
|
|
46
|
+
resolve(false);
|
|
47
|
+
}, 1000);
|
|
48
|
+
client.on("connect", () => {
|
|
49
|
+
clearTimeout(timeout);
|
|
50
|
+
client.destroy();
|
|
51
|
+
resolve(true);
|
|
52
|
+
});
|
|
53
|
+
client.on("error", () => {
|
|
54
|
+
clearTimeout(timeout);
|
|
55
|
+
client.destroy();
|
|
56
|
+
resolve(false);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if socket is in use and log a warning if taking over from another instance.
|
|
62
|
+
* Call this before createToolProxyServer to notify users of the takeover.
|
|
63
|
+
* Returns the owner type if detected ("cli" or "gui"), or null if not in use.
|
|
64
|
+
*/
|
|
65
|
+
export async function checkSocketAndWarn(socketPath) {
|
|
66
|
+
const inUse = await isSocketInUse(socketPath);
|
|
67
|
+
if (inUse) {
|
|
68
|
+
console.error(`[brosh] Warning: Taking over socket from another brosh instance at ${socketPath}`);
|
|
69
|
+
console.error("[brosh] The other instance's MCP connections will be disconnected.");
|
|
70
|
+
return "cli"; // Can't distinguish, assume generic
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Transport that communicates over a Unix socket connection
|
|
76
|
+
* (Used for full MCP protocol when needed)
|
|
77
|
+
*/
|
|
78
|
+
export class SocketTransport {
|
|
79
|
+
socket;
|
|
80
|
+
buffer = "";
|
|
81
|
+
onmessage;
|
|
82
|
+
onerror;
|
|
83
|
+
onclose;
|
|
84
|
+
constructor(socket) {
|
|
85
|
+
this.socket = socket;
|
|
86
|
+
this.socket.on("data", (data) => {
|
|
87
|
+
this.buffer += data.toString();
|
|
88
|
+
this.processBuffer();
|
|
89
|
+
});
|
|
90
|
+
this.socket.on("error", (error) => {
|
|
91
|
+
this.onerror?.(error);
|
|
92
|
+
});
|
|
93
|
+
this.socket.on("close", () => {
|
|
94
|
+
this.onclose?.();
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
processBuffer() {
|
|
98
|
+
const lines = this.buffer.split("\n");
|
|
99
|
+
this.buffer = lines.pop() || "";
|
|
100
|
+
for (const line of lines) {
|
|
101
|
+
if (line.trim()) {
|
|
102
|
+
try {
|
|
103
|
+
const message = JSON.parse(line);
|
|
104
|
+
this.onmessage?.(message);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
this.onerror?.(new Error(`Failed to parse message: ${line}`));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async start() {
|
|
113
|
+
// Socket is already connected
|
|
114
|
+
}
|
|
115
|
+
async close() {
|
|
116
|
+
this.socket.end();
|
|
117
|
+
}
|
|
118
|
+
async send(message) {
|
|
119
|
+
return new Promise((resolve, reject) => {
|
|
120
|
+
const data = JSON.stringify(message) + "\n";
|
|
121
|
+
this.socket.write(data, (error) => {
|
|
122
|
+
if (error) {
|
|
123
|
+
reject(error);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
resolve();
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Create a Unix socket server that accepts MCP connections
|
|
134
|
+
*/
|
|
135
|
+
export function createSocketServer(socketPath, onConnection) {
|
|
136
|
+
// Remove existing socket file if it exists
|
|
137
|
+
try {
|
|
138
|
+
fs.unlinkSync(socketPath);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Ignore if doesn't exist
|
|
142
|
+
}
|
|
143
|
+
const server = new NetServer((socket) => {
|
|
144
|
+
const transport = new SocketTransport(socket);
|
|
145
|
+
onConnection(transport);
|
|
146
|
+
});
|
|
147
|
+
server.listen(socketPath);
|
|
148
|
+
return server;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Create a simple request/response socket server for tool proxying
|
|
152
|
+
* This is the protocol used between interactive mode and MCP client mode
|
|
153
|
+
*/
|
|
154
|
+
export function createToolProxyServer(socketPath, manager) {
|
|
155
|
+
// Remove existing socket file if it exists
|
|
156
|
+
try {
|
|
157
|
+
fs.unlinkSync(socketPath);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// Ignore if doesn't exist
|
|
161
|
+
}
|
|
162
|
+
// Track active client - only one MCP connection allowed at a time
|
|
163
|
+
let activeClient = null;
|
|
164
|
+
const server = new NetServer((socket) => {
|
|
165
|
+
// Disconnect existing client — only one MCP connection at a time
|
|
166
|
+
if (activeClient) {
|
|
167
|
+
console.error("[brosh] New MCP client connected, disconnecting previous client");
|
|
168
|
+
activeClient.destroy();
|
|
169
|
+
activeClient = null;
|
|
170
|
+
}
|
|
171
|
+
activeClient = socket;
|
|
172
|
+
let buffer = "";
|
|
173
|
+
socket.on("data", async (data) => {
|
|
174
|
+
buffer += data.toString();
|
|
175
|
+
const lines = buffer.split("\n");
|
|
176
|
+
buffer = lines.pop() || "";
|
|
177
|
+
for (const line of lines) {
|
|
178
|
+
if (line.trim()) {
|
|
179
|
+
try {
|
|
180
|
+
const request = JSON.parse(line);
|
|
181
|
+
const response = await handleToolRequest(manager, request);
|
|
182
|
+
socket.write(JSON.stringify(response) + "\n");
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
186
|
+
socket.write(JSON.stringify({
|
|
187
|
+
id: 0,
|
|
188
|
+
error: { message: `Parse error: ${errorMessage}` },
|
|
189
|
+
}) + "\n");
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
socket.on("close", () => {
|
|
195
|
+
if (activeClient === socket) {
|
|
196
|
+
activeClient = null;
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
socket.on("error", () => {
|
|
200
|
+
if (activeClient === socket) {
|
|
201
|
+
activeClient = null;
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
server.listen(socketPath);
|
|
206
|
+
// Watch for socket file being replaced (another instance taking over)
|
|
207
|
+
// Track the inode of our socket - if it changes, someone replaced it
|
|
208
|
+
let socketStolen = false;
|
|
209
|
+
let originalInode = null;
|
|
210
|
+
// Get the inode of our socket file after server starts listening
|
|
211
|
+
server.once("listening", () => {
|
|
212
|
+
try {
|
|
213
|
+
const stats = fs.statSync(socketPath, { bigint: true });
|
|
214
|
+
originalInode = stats.ino;
|
|
215
|
+
// Write "enabled" status for shell prompt
|
|
216
|
+
writeMcpStatus(true);
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
// Couldn't get inode, watcher won't work
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
const watchInterval = setInterval(() => {
|
|
223
|
+
if (socketStolen || originalInode === null)
|
|
224
|
+
return;
|
|
225
|
+
try {
|
|
226
|
+
// Check if socket file still exists and has the same inode
|
|
227
|
+
const stats = fs.statSync(socketPath, { bigint: true });
|
|
228
|
+
if (!stats.isSocket() || stats.ino !== originalInode) {
|
|
229
|
+
// File was replaced by another instance
|
|
230
|
+
socketStolen = true;
|
|
231
|
+
writeMcpStatus(false);
|
|
232
|
+
console.error("\n[brosh] Socket was taken over by another brosh instance (GUI or CLI)");
|
|
233
|
+
console.error("[brosh] MCP clients can no longer connect to this session\n");
|
|
234
|
+
// Disconnect any active client since they're now orphaned
|
|
235
|
+
if (activeClient) {
|
|
236
|
+
activeClient.destroy();
|
|
237
|
+
activeClient = null;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// Socket file was deleted - another instance took over
|
|
243
|
+
socketStolen = true;
|
|
244
|
+
writeMcpStatus(false);
|
|
245
|
+
console.error("\n[brosh] Socket was taken over by another brosh instance (GUI or CLI)");
|
|
246
|
+
console.error("[brosh] MCP clients can no longer connect to this session\n");
|
|
247
|
+
// Disconnect any active client since they're now orphaned
|
|
248
|
+
if (activeClient) {
|
|
249
|
+
activeClient.destroy();
|
|
250
|
+
activeClient = null;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}, 2000); // Check every 2 seconds
|
|
254
|
+
// Clean up watcher when server closes
|
|
255
|
+
server.on("close", () => {
|
|
256
|
+
clearInterval(watchInterval);
|
|
257
|
+
writeMcpStatus(false);
|
|
258
|
+
});
|
|
259
|
+
return server;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Handle a tool request from the MCP client
|
|
263
|
+
*/
|
|
264
|
+
async function handleToolRequest(manager, request) {
|
|
265
|
+
const { id, method, params } = request;
|
|
266
|
+
const stats = getStats();
|
|
267
|
+
try {
|
|
268
|
+
let result;
|
|
269
|
+
switch (method) {
|
|
270
|
+
case "type":
|
|
271
|
+
stats.recordToolCall("type");
|
|
272
|
+
result = handleType(manager, params);
|
|
273
|
+
break;
|
|
274
|
+
case "sendKey":
|
|
275
|
+
stats.recordToolCall("sendKey");
|
|
276
|
+
result = handleSendKey(manager, params);
|
|
277
|
+
break;
|
|
278
|
+
case "getContent":
|
|
279
|
+
stats.recordToolCall("getContent");
|
|
280
|
+
result = handleGetContent(manager, params);
|
|
281
|
+
break;
|
|
282
|
+
case "takeScreenshot":
|
|
283
|
+
stats.recordToolCall("takeScreenshot");
|
|
284
|
+
result = handleScreenshot(manager, params);
|
|
285
|
+
break;
|
|
286
|
+
case "startRecording":
|
|
287
|
+
stats.recordToolCall("startRecording");
|
|
288
|
+
result = handleStartRecording(manager, params);
|
|
289
|
+
break;
|
|
290
|
+
case "stopRecording":
|
|
291
|
+
stats.recordToolCall("stopRecording");
|
|
292
|
+
result = await handleStopRecording(manager, params);
|
|
293
|
+
break;
|
|
294
|
+
default:
|
|
295
|
+
return {
|
|
296
|
+
id,
|
|
297
|
+
error: { message: `Unknown method: ${method}` },
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
return { id, result };
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
304
|
+
return {
|
|
305
|
+
id,
|
|
306
|
+
error: { message },
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=socket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/transport/socket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extended ClientInfo Types for MCP Observability
|
|
3
|
+
*
|
|
4
|
+
* Defines the schema for extended client metadata passed during MCP initialization.
|
|
5
|
+
* Includes runtime info, capabilities, session metadata, and observability options.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
export declare const ClientInfoSchema: z.ZodObject<{
|
|
9
|
+
name: z.ZodString;
|
|
10
|
+
version: z.ZodString;
|
|
11
|
+
instanceId: z.ZodOptional<z.ZodString>;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
name: string;
|
|
14
|
+
version: string;
|
|
15
|
+
instanceId?: string | undefined;
|
|
16
|
+
}, {
|
|
17
|
+
name: string;
|
|
18
|
+
version: string;
|
|
19
|
+
instanceId?: string | undefined;
|
|
20
|
+
}>;
|
|
21
|
+
export declare const RuntimeInfoSchema: z.ZodObject<{
|
|
22
|
+
hostApp: z.ZodOptional<z.ZodString>;
|
|
23
|
+
platform: z.ZodOptional<z.ZodString>;
|
|
24
|
+
arch: z.ZodOptional<z.ZodString>;
|
|
25
|
+
}, "strip", z.ZodTypeAny, {
|
|
26
|
+
platform?: string | undefined;
|
|
27
|
+
hostApp?: string | undefined;
|
|
28
|
+
arch?: string | undefined;
|
|
29
|
+
}, {
|
|
30
|
+
platform?: string | undefined;
|
|
31
|
+
hostApp?: string | undefined;
|
|
32
|
+
arch?: string | undefined;
|
|
33
|
+
}>;
|
|
34
|
+
export declare const CapabilitiesSchema: z.ZodObject<{
|
|
35
|
+
streaming: z.ZodOptional<z.ZodBoolean>;
|
|
36
|
+
notifications: z.ZodOptional<z.ZodBoolean>;
|
|
37
|
+
maxConcurrency: z.ZodOptional<z.ZodNumber>;
|
|
38
|
+
}, "strip", z.ZodTypeAny, {
|
|
39
|
+
streaming?: boolean | undefined;
|
|
40
|
+
notifications?: boolean | undefined;
|
|
41
|
+
maxConcurrency?: number | undefined;
|
|
42
|
+
}, {
|
|
43
|
+
streaming?: boolean | undefined;
|
|
44
|
+
notifications?: boolean | undefined;
|
|
45
|
+
maxConcurrency?: number | undefined;
|
|
46
|
+
}>;
|
|
47
|
+
export declare const SessionMetadataSchema: z.ZodObject<{
|
|
48
|
+
label: z.ZodOptional<z.ZodString>;
|
|
49
|
+
workspaceId: z.ZodOptional<z.ZodString>;
|
|
50
|
+
}, "strip", z.ZodTypeAny, {
|
|
51
|
+
label?: string | undefined;
|
|
52
|
+
workspaceId?: string | undefined;
|
|
53
|
+
}, {
|
|
54
|
+
label?: string | undefined;
|
|
55
|
+
workspaceId?: string | undefined;
|
|
56
|
+
}>;
|
|
57
|
+
export declare const ObservabilitySchema: z.ZodObject<{
|
|
58
|
+
traceId: z.ZodOptional<z.ZodString>;
|
|
59
|
+
logLevel: z.ZodOptional<z.ZodEnum<["info", "debug"]>>;
|
|
60
|
+
}, "strip", z.ZodTypeAny, {
|
|
61
|
+
traceId?: string | undefined;
|
|
62
|
+
logLevel?: "info" | "debug" | undefined;
|
|
63
|
+
}, {
|
|
64
|
+
traceId?: string | undefined;
|
|
65
|
+
logLevel?: "info" | "debug" | undefined;
|
|
66
|
+
}>;
|
|
67
|
+
export declare const ExtendedClientInfoSchema: z.ZodObject<{
|
|
68
|
+
clientInfo: z.ZodOptional<z.ZodObject<{
|
|
69
|
+
name: z.ZodString;
|
|
70
|
+
version: z.ZodString;
|
|
71
|
+
instanceId: z.ZodOptional<z.ZodString>;
|
|
72
|
+
}, "strip", z.ZodTypeAny, {
|
|
73
|
+
name: string;
|
|
74
|
+
version: string;
|
|
75
|
+
instanceId?: string | undefined;
|
|
76
|
+
}, {
|
|
77
|
+
name: string;
|
|
78
|
+
version: string;
|
|
79
|
+
instanceId?: string | undefined;
|
|
80
|
+
}>>;
|
|
81
|
+
runtime: z.ZodOptional<z.ZodObject<{
|
|
82
|
+
hostApp: z.ZodOptional<z.ZodString>;
|
|
83
|
+
platform: z.ZodOptional<z.ZodString>;
|
|
84
|
+
arch: z.ZodOptional<z.ZodString>;
|
|
85
|
+
}, "strip", z.ZodTypeAny, {
|
|
86
|
+
platform?: string | undefined;
|
|
87
|
+
hostApp?: string | undefined;
|
|
88
|
+
arch?: string | undefined;
|
|
89
|
+
}, {
|
|
90
|
+
platform?: string | undefined;
|
|
91
|
+
hostApp?: string | undefined;
|
|
92
|
+
arch?: string | undefined;
|
|
93
|
+
}>>;
|
|
94
|
+
capabilities: z.ZodOptional<z.ZodObject<{
|
|
95
|
+
streaming: z.ZodOptional<z.ZodBoolean>;
|
|
96
|
+
notifications: z.ZodOptional<z.ZodBoolean>;
|
|
97
|
+
maxConcurrency: z.ZodOptional<z.ZodNumber>;
|
|
98
|
+
}, "strip", z.ZodTypeAny, {
|
|
99
|
+
streaming?: boolean | undefined;
|
|
100
|
+
notifications?: boolean | undefined;
|
|
101
|
+
maxConcurrency?: number | undefined;
|
|
102
|
+
}, {
|
|
103
|
+
streaming?: boolean | undefined;
|
|
104
|
+
notifications?: boolean | undefined;
|
|
105
|
+
maxConcurrency?: number | undefined;
|
|
106
|
+
}>>;
|
|
107
|
+
session: z.ZodOptional<z.ZodObject<{
|
|
108
|
+
label: z.ZodOptional<z.ZodString>;
|
|
109
|
+
workspaceId: z.ZodOptional<z.ZodString>;
|
|
110
|
+
}, "strip", z.ZodTypeAny, {
|
|
111
|
+
label?: string | undefined;
|
|
112
|
+
workspaceId?: string | undefined;
|
|
113
|
+
}, {
|
|
114
|
+
label?: string | undefined;
|
|
115
|
+
workspaceId?: string | undefined;
|
|
116
|
+
}>>;
|
|
117
|
+
observability: z.ZodOptional<z.ZodObject<{
|
|
118
|
+
traceId: z.ZodOptional<z.ZodString>;
|
|
119
|
+
logLevel: z.ZodOptional<z.ZodEnum<["info", "debug"]>>;
|
|
120
|
+
}, "strip", z.ZodTypeAny, {
|
|
121
|
+
traceId?: string | undefined;
|
|
122
|
+
logLevel?: "info" | "debug" | undefined;
|
|
123
|
+
}, {
|
|
124
|
+
traceId?: string | undefined;
|
|
125
|
+
logLevel?: "info" | "debug" | undefined;
|
|
126
|
+
}>>;
|
|
127
|
+
}, "strip", z.ZodTypeAny, {
|
|
128
|
+
capabilities?: {
|
|
129
|
+
streaming?: boolean | undefined;
|
|
130
|
+
notifications?: boolean | undefined;
|
|
131
|
+
maxConcurrency?: number | undefined;
|
|
132
|
+
} | undefined;
|
|
133
|
+
clientInfo?: {
|
|
134
|
+
name: string;
|
|
135
|
+
version: string;
|
|
136
|
+
instanceId?: string | undefined;
|
|
137
|
+
} | undefined;
|
|
138
|
+
runtime?: {
|
|
139
|
+
platform?: string | undefined;
|
|
140
|
+
hostApp?: string | undefined;
|
|
141
|
+
arch?: string | undefined;
|
|
142
|
+
} | undefined;
|
|
143
|
+
session?: {
|
|
144
|
+
label?: string | undefined;
|
|
145
|
+
workspaceId?: string | undefined;
|
|
146
|
+
} | undefined;
|
|
147
|
+
observability?: {
|
|
148
|
+
traceId?: string | undefined;
|
|
149
|
+
logLevel?: "info" | "debug" | undefined;
|
|
150
|
+
} | undefined;
|
|
151
|
+
}, {
|
|
152
|
+
capabilities?: {
|
|
153
|
+
streaming?: boolean | undefined;
|
|
154
|
+
notifications?: boolean | undefined;
|
|
155
|
+
maxConcurrency?: number | undefined;
|
|
156
|
+
} | undefined;
|
|
157
|
+
clientInfo?: {
|
|
158
|
+
name: string;
|
|
159
|
+
version: string;
|
|
160
|
+
instanceId?: string | undefined;
|
|
161
|
+
} | undefined;
|
|
162
|
+
runtime?: {
|
|
163
|
+
platform?: string | undefined;
|
|
164
|
+
hostApp?: string | undefined;
|
|
165
|
+
arch?: string | undefined;
|
|
166
|
+
} | undefined;
|
|
167
|
+
session?: {
|
|
168
|
+
label?: string | undefined;
|
|
169
|
+
workspaceId?: string | undefined;
|
|
170
|
+
} | undefined;
|
|
171
|
+
observability?: {
|
|
172
|
+
traceId?: string | undefined;
|
|
173
|
+
logLevel?: "info" | "debug" | undefined;
|
|
174
|
+
} | undefined;
|
|
175
|
+
}>;
|
|
176
|
+
export type ClientInfo = z.infer<typeof ClientInfoSchema>;
|
|
177
|
+
export type RuntimeInfo = z.infer<typeof RuntimeInfoSchema>;
|
|
178
|
+
export type Capabilities = z.infer<typeof CapabilitiesSchema>;
|
|
179
|
+
export type SessionMetadata = z.infer<typeof SessionMetadataSchema>;
|
|
180
|
+
export type Observability = z.infer<typeof ObservabilitySchema>;
|
|
181
|
+
export type ExtendedClientInfo = z.infer<typeof ExtendedClientInfoSchema>;
|
|
182
|
+
/**
|
|
183
|
+
* Tracked client state stored per-connection
|
|
184
|
+
*/
|
|
185
|
+
export interface TrackedClient {
|
|
186
|
+
clientId: string;
|
|
187
|
+
clientInfo?: ClientInfo;
|
|
188
|
+
runtime?: RuntimeInfo;
|
|
189
|
+
capabilities?: Capabilities;
|
|
190
|
+
session?: SessionMetadata;
|
|
191
|
+
observability?: Observability;
|
|
192
|
+
connectedAt: number;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Session log entry types for JSONL logging
|
|
196
|
+
*/
|
|
197
|
+
export type SessionLogEntry = SessionConnectEntry | SessionDisconnectEntry | SessionToolCallEntry;
|
|
198
|
+
export interface SessionConnectEntry {
|
|
199
|
+
type: "connect";
|
|
200
|
+
timestamp: number;
|
|
201
|
+
clientId: string;
|
|
202
|
+
clientName?: string;
|
|
203
|
+
version?: string;
|
|
204
|
+
runtime?: RuntimeInfo;
|
|
205
|
+
}
|
|
206
|
+
export interface SessionDisconnectEntry {
|
|
207
|
+
type: "disconnect";
|
|
208
|
+
timestamp: number;
|
|
209
|
+
clientId: string;
|
|
210
|
+
}
|
|
211
|
+
export interface SessionToolCallEntry {
|
|
212
|
+
type: "tool_call";
|
|
213
|
+
timestamp: number;
|
|
214
|
+
clientId: string;
|
|
215
|
+
method: string;
|
|
216
|
+
params?: Record<string, unknown>;
|
|
217
|
+
durationMs: number;
|
|
218
|
+
result: "success" | "error";
|
|
219
|
+
error?: string;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Generate a client ID from client info
|
|
223
|
+
* Uses instanceId if provided, otherwise generates from name+version+timestamp+random
|
|
224
|
+
*/
|
|
225
|
+
export declare function generateClientId(clientInfo?: Partial<ClientInfo>): string;
|
|
226
|
+
//# sourceMappingURL=mcp-client-info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-client-info.d.ts","sourceRoot":"","sources":["../../src/types/mcp-client-info.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;EAI3B,CAAC;AAGH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EAI5B,CAAC;AAGH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AAGH,eAAO,MAAM,qBAAqB;;;;;;;;;EAGhC,CAAC;AAGH,eAAO,MAAM,mBAAmB;;;;;;;;;EAG9B,CAAC;AAGH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMnC,CAAC;AAGH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,mBAAmB,GACnB,sBAAsB,GACtB,oBAAoB,CAAC;AAEzB,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,CAczE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extended ClientInfo Types for MCP Observability
|
|
3
|
+
*
|
|
4
|
+
* Defines the schema for extended client metadata passed during MCP initialization.
|
|
5
|
+
* Includes runtime info, capabilities, session metadata, and observability options.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
// Base client info (standard MCP)
|
|
9
|
+
export const ClientInfoSchema = z.object({
|
|
10
|
+
name: z.string(),
|
|
11
|
+
version: z.string(),
|
|
12
|
+
instanceId: z.string().optional(), // UUID per launch
|
|
13
|
+
});
|
|
14
|
+
// Runtime environment info
|
|
15
|
+
export const RuntimeInfoSchema = z.object({
|
|
16
|
+
hostApp: z.string().optional(), // "VSCode", "Cursor", "Terminal"
|
|
17
|
+
platform: z.string().optional(), // "macOS", "Linux", "Windows"
|
|
18
|
+
arch: z.string().optional(), // "arm64", "x64"
|
|
19
|
+
});
|
|
20
|
+
// Client capabilities
|
|
21
|
+
export const CapabilitiesSchema = z.object({
|
|
22
|
+
streaming: z.boolean().optional(),
|
|
23
|
+
notifications: z.boolean().optional(),
|
|
24
|
+
maxConcurrency: z.number().optional(),
|
|
25
|
+
});
|
|
26
|
+
// Session metadata
|
|
27
|
+
export const SessionMetadataSchema = z.object({
|
|
28
|
+
label: z.string().optional(), // "dev", "ci", "demo"
|
|
29
|
+
workspaceId: z.string().optional(),
|
|
30
|
+
});
|
|
31
|
+
// Observability options
|
|
32
|
+
export const ObservabilitySchema = z.object({
|
|
33
|
+
traceId: z.string().optional(),
|
|
34
|
+
logLevel: z.enum(["info", "debug"]).optional(),
|
|
35
|
+
});
|
|
36
|
+
// Extended client info schema
|
|
37
|
+
export const ExtendedClientInfoSchema = z.object({
|
|
38
|
+
clientInfo: ClientInfoSchema.optional(),
|
|
39
|
+
runtime: RuntimeInfoSchema.optional(),
|
|
40
|
+
capabilities: CapabilitiesSchema.optional(),
|
|
41
|
+
session: SessionMetadataSchema.optional(),
|
|
42
|
+
observability: ObservabilitySchema.optional(),
|
|
43
|
+
});
|
|
44
|
+
/**
|
|
45
|
+
* Generate a client ID from client info
|
|
46
|
+
* Uses instanceId if provided, otherwise generates from name+version+timestamp+random
|
|
47
|
+
*/
|
|
48
|
+
export function generateClientId(clientInfo) {
|
|
49
|
+
// Use instanceId if provided
|
|
50
|
+
if (clientInfo?.instanceId) {
|
|
51
|
+
return clientInfo.instanceId;
|
|
52
|
+
}
|
|
53
|
+
// Generate fallback: name-version-timestamp-random
|
|
54
|
+
const parts = [
|
|
55
|
+
clientInfo?.name || "unknown",
|
|
56
|
+
clientInfo?.version || "0.0.0",
|
|
57
|
+
Date.now().toString(36),
|
|
58
|
+
Math.random().toString(36).substring(2, 8),
|
|
59
|
+
];
|
|
60
|
+
return parts.join("-");
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=mcp-client-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-client-info.js","sourceRoot":"","sources":["../../src/types/mcp-client-info.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,kCAAkC;AAClC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,kBAAkB;CACtD,CAAC,CAAC;AAEH,2BAA2B;AAC3B,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,iCAAiC;IACjE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,8BAA8B;IAC/D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,iBAAiB;CAC/C,CAAC,CAAC;AAEH,sBAAsB;AACtB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACjC,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACrC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAEH,mBAAmB;AACnB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,sBAAsB;IACpD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAEH,wBAAwB;AACxB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC/C,CAAC,CAAC;AAEH,8BAA8B;AAC9B,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,UAAU,EAAE,gBAAgB,CAAC,QAAQ,EAAE;IACvC,OAAO,EAAE,iBAAiB,CAAC,QAAQ,EAAE;IACrC,YAAY,EAAE,kBAAkB,CAAC,QAAQ,EAAE;IAC3C,OAAO,EAAE,qBAAqB,CAAC,QAAQ,EAAE;IACzC,aAAa,EAAE,mBAAmB,CAAC,QAAQ,EAAE;CAC9C,CAAC,CAAC;AAyDH;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAgC;IAC/D,6BAA6B;IAC7B,IAAI,UAAU,EAAE,UAAU,EAAE,CAAC;QAC3B,OAAO,UAAU,CAAC,UAAU,CAAC;IAC/B,CAAC;IAED,mDAAmD;IACnD,MAAM,KAAK,GAAG;QACZ,UAAU,EAAE,IAAI,IAAI,SAAS;QAC7B,UAAU,EAAE,OAAO,IAAI,OAAO;QAC9B,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;KAC3C,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface BannerOptions {
|
|
2
|
+
socketPath: string;
|
|
3
|
+
cols: number;
|
|
4
|
+
rows: number;
|
|
5
|
+
shell: string;
|
|
6
|
+
sandboxEnabled?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Generate the startup banner string
|
|
10
|
+
*/
|
|
11
|
+
export declare function getBanner(options: BannerOptions): string;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAyDxD"}
|