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
package/dist/index.js
ADDED
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import { createRequire } from "module";
|
|
4
|
+
import { startMcpClientMode } from "./client.js";
|
|
5
|
+
import { TerminalManager } from "./terminal/index.js";
|
|
6
|
+
import { createToolProxyServer, checkSocketAndWarn, GUIOutputStream, isGuiMessageToBackend } from "./transport/index.js";
|
|
7
|
+
import { getBanner } from "./ui/index.js";
|
|
8
|
+
import { getDefaultSocketPath, getDefaultShell } from "./utils/platform.js";
|
|
9
|
+
import { getEnv } from "./utils/env.js";
|
|
10
|
+
import { SandboxController, loadConfigFromFile, promptForPermissions, } from "./sandbox/index.js";
|
|
11
|
+
import { promptForMode } from "./sandbox/mode-prompt.js";
|
|
12
|
+
const require = createRequire(import.meta.url);
|
|
13
|
+
const { version } = require("../package.json");
|
|
14
|
+
// Default socket path
|
|
15
|
+
const DEFAULT_SOCKET_PATH = getDefaultSocketPath();
|
|
16
|
+
// Parse command line arguments
|
|
17
|
+
const args = process.argv.slice(2);
|
|
18
|
+
const options = {};
|
|
19
|
+
for (let i = 0; i < args.length; i++) {
|
|
20
|
+
const arg = args[i];
|
|
21
|
+
const next = args[i + 1];
|
|
22
|
+
switch (arg) {
|
|
23
|
+
case "--cols":
|
|
24
|
+
if (next) {
|
|
25
|
+
options.cols = parseInt(next, 10);
|
|
26
|
+
i++;
|
|
27
|
+
}
|
|
28
|
+
break;
|
|
29
|
+
case "--rows":
|
|
30
|
+
if (next) {
|
|
31
|
+
options.rows = parseInt(next, 10);
|
|
32
|
+
i++;
|
|
33
|
+
}
|
|
34
|
+
break;
|
|
35
|
+
case "--shell":
|
|
36
|
+
if (next) {
|
|
37
|
+
options.shell = next;
|
|
38
|
+
i++;
|
|
39
|
+
}
|
|
40
|
+
break;
|
|
41
|
+
case "--socket":
|
|
42
|
+
if (next) {
|
|
43
|
+
options.socket = next;
|
|
44
|
+
i++;
|
|
45
|
+
}
|
|
46
|
+
break;
|
|
47
|
+
case "--sandbox":
|
|
48
|
+
options.sandbox = true;
|
|
49
|
+
break;
|
|
50
|
+
case "--sandbox-config":
|
|
51
|
+
if (next) {
|
|
52
|
+
options.sandboxConfig = next;
|
|
53
|
+
options.sandbox = true; // Implicitly enable sandbox
|
|
54
|
+
i++;
|
|
55
|
+
}
|
|
56
|
+
break;
|
|
57
|
+
case "--record":
|
|
58
|
+
// Support bare --record (defaults to 'always')
|
|
59
|
+
if (!next || next.startsWith('-')) {
|
|
60
|
+
options.record = 'always';
|
|
61
|
+
}
|
|
62
|
+
else if (['always', 'on-failure', 'off'].includes(next)) {
|
|
63
|
+
options.record = next;
|
|
64
|
+
i++;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// Unknown value, treat as bare --record
|
|
68
|
+
options.record = 'always';
|
|
69
|
+
}
|
|
70
|
+
break;
|
|
71
|
+
case "--record-dir":
|
|
72
|
+
if (next) {
|
|
73
|
+
options.recordDir = next;
|
|
74
|
+
i++;
|
|
75
|
+
}
|
|
76
|
+
break;
|
|
77
|
+
case "--record-format":
|
|
78
|
+
if (next) {
|
|
79
|
+
options.recordFormat = next;
|
|
80
|
+
i++;
|
|
81
|
+
}
|
|
82
|
+
break;
|
|
83
|
+
case "--idle-time-limit":
|
|
84
|
+
if (next) {
|
|
85
|
+
options.idleTimeLimit = parseFloat(next);
|
|
86
|
+
i++;
|
|
87
|
+
}
|
|
88
|
+
break;
|
|
89
|
+
case "--max-duration":
|
|
90
|
+
if (next) {
|
|
91
|
+
options.maxDuration = parseFloat(next);
|
|
92
|
+
i++;
|
|
93
|
+
}
|
|
94
|
+
break;
|
|
95
|
+
case "--inactivity-timeout":
|
|
96
|
+
if (next) {
|
|
97
|
+
options.inactivityTimeout = parseFloat(next);
|
|
98
|
+
i++;
|
|
99
|
+
}
|
|
100
|
+
break;
|
|
101
|
+
case "--gui-mode":
|
|
102
|
+
options.guiMode = true;
|
|
103
|
+
break;
|
|
104
|
+
case "--prompt-mode-only":
|
|
105
|
+
options.promptModeOnly = true;
|
|
106
|
+
break;
|
|
107
|
+
case "--version":
|
|
108
|
+
case "-v":
|
|
109
|
+
console.log(`brosh v${version}`);
|
|
110
|
+
process.exit(0);
|
|
111
|
+
case "--help":
|
|
112
|
+
case "-h":
|
|
113
|
+
console.log(`
|
|
114
|
+
brosh v${version} — AI-native terminal emulator
|
|
115
|
+
|
|
116
|
+
A modern terminal with built-in AI integration via the Model Context
|
|
117
|
+
Protocol (MCP), session recording, and sandboxed execution.
|
|
118
|
+
|
|
119
|
+
Usage: brosh [options]
|
|
120
|
+
|
|
121
|
+
Options:
|
|
122
|
+
--cols <number> Terminal width (default: auto or 120)
|
|
123
|
+
--rows <number> Terminal height (default: auto or 40)
|
|
124
|
+
--shell <path> Shell to use (default: $SHELL or bash)
|
|
125
|
+
--socket <path> MCP socket path (default: ${DEFAULT_SOCKET_PATH})
|
|
126
|
+
--sandbox Enable sandbox mode
|
|
127
|
+
--sandbox-config <path> Load sandbox config from JSON file
|
|
128
|
+
--gui-mode Enable GUI protocol mode (for desktop app)
|
|
129
|
+
--version, -v Show version
|
|
130
|
+
--help, -h Show this help
|
|
131
|
+
|
|
132
|
+
Recording:
|
|
133
|
+
--record [mode] Record session (modes: always, on-failure, off)
|
|
134
|
+
--record-dir <dir> Output directory (default: ~/.local/state/brosh/recordings)
|
|
135
|
+
--record-format <f> Format (default: v2, asciicast v2)
|
|
136
|
+
--idle-time-limit <sec> Max idle time in recordings (default: 2s)
|
|
137
|
+
--max-duration <sec> Max recording length (default: 3600s)
|
|
138
|
+
--inactivity-timeout <sec> Auto-stop after silence (default: 600s)
|
|
139
|
+
|
|
140
|
+
Environment Variables:
|
|
141
|
+
BROSH_RECORD_DIR Default recording output directory
|
|
142
|
+
|
|
143
|
+
How It Works:
|
|
144
|
+
brosh runs as an interactive terminal that exposes a Unix socket for
|
|
145
|
+
AI tools. Any MCP-compatible client (Claude Code, Claude Desktop, etc.)
|
|
146
|
+
can connect and observe, type, take screenshots, and run commands in
|
|
147
|
+
your terminal — with your full environment, tools, and context.
|
|
148
|
+
|
|
149
|
+
TTY detected → Interactive mode (shell + MCP socket)
|
|
150
|
+
No TTY → MCP client mode (proxies to running session)
|
|
151
|
+
|
|
152
|
+
Getting Started:
|
|
153
|
+
brosh Start a terminal session
|
|
154
|
+
brosh --sandbox Start with filesystem/network restrictions
|
|
155
|
+
brosh --record Start with session recording
|
|
156
|
+
|
|
157
|
+
Then add to your MCP client config (e.g. Claude Code):
|
|
158
|
+
{
|
|
159
|
+
"mcpServers": {
|
|
160
|
+
"terminal": { "command": "brosh" }
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
Sandbox Mode:
|
|
165
|
+
Restricts filesystem and network access. Without --sandbox-config,
|
|
166
|
+
an interactive prompt lets you choose permissions.
|
|
167
|
+
|
|
168
|
+
Example config (~/.brosh-sandbox.json):
|
|
169
|
+
{
|
|
170
|
+
"filesystem": {
|
|
171
|
+
"readWrite": [".", "/tmp"],
|
|
172
|
+
"readOnly": ["~"],
|
|
173
|
+
"blocked": ["~/.ssh", "~/.aws"]
|
|
174
|
+
},
|
|
175
|
+
"network": { "mode": "all" }
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
Recording:
|
|
179
|
+
Sessions are saved as asciicast v2 files, playable with asciinema.
|
|
180
|
+
|
|
181
|
+
brosh --record
|
|
182
|
+
brosh --record=on-failure --idle-time-limit=5
|
|
183
|
+
brosh --record --record-dir=./recordings
|
|
184
|
+
`);
|
|
185
|
+
process.exit(0);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
async function main() {
|
|
189
|
+
const socketPath = options.socket || DEFAULT_SOCKET_PATH;
|
|
190
|
+
const isInteractive = process.stdin.isTTY;
|
|
191
|
+
// Prevent recursive invocation - only for interactive mode
|
|
192
|
+
// MCP client mode (non-TTY) is allowed from within a brosh session
|
|
193
|
+
// because it connects to a different socket as a proxy
|
|
194
|
+
if (getEnv('BROSH', 'TERMINAL_MCP') === '1' && isInteractive) {
|
|
195
|
+
console.error('Error: brosh cannot be run from within itself.\n' +
|
|
196
|
+
'You are already inside a brosh session.\n\n' +
|
|
197
|
+
'To use MCP tools, configure your MCP client to connect to this session.');
|
|
198
|
+
process.exit(1);
|
|
199
|
+
}
|
|
200
|
+
// Prompt-only mode: Just show mode selector and output result
|
|
201
|
+
// Used by GUI wrappers to get user's mode choice before creating terminal
|
|
202
|
+
if (options.promptModeOnly) {
|
|
203
|
+
try {
|
|
204
|
+
const mode = await promptForMode();
|
|
205
|
+
// Output result as JSON for parent process to read
|
|
206
|
+
console.log(JSON.stringify({ mode }));
|
|
207
|
+
process.exit(0);
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
if (error instanceof Error && error.message === 'Cancelled by user') {
|
|
211
|
+
console.log(JSON.stringify({ mode: null, cancelled: true }));
|
|
212
|
+
process.exit(0);
|
|
213
|
+
}
|
|
214
|
+
throw error;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// GUI mode takes priority - used by Electron/desktop wrappers
|
|
218
|
+
if (options.guiMode) {
|
|
219
|
+
await startGuiMode();
|
|
220
|
+
}
|
|
221
|
+
else if (isInteractive) {
|
|
222
|
+
// Interactive mode: Shell on stdin/stdout, tool proxy on Unix socket
|
|
223
|
+
await startInteractiveMode(socketPath);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
// MCP client mode: Connect to socket, serve MCP over stdio
|
|
227
|
+
await startMcpClientMode(socketPath);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
async function startInteractiveMode(socketPath) {
|
|
231
|
+
// Get terminal size from environment or use defaults
|
|
232
|
+
const cols = options.cols ?? (process.stdout.columns || 120);
|
|
233
|
+
const rows = options.rows ?? (process.stdout.rows || 40);
|
|
234
|
+
const shell = options.shell || getDefaultShell();
|
|
235
|
+
// 1. Show mode selection prompt (unless --sandbox flag overrides)
|
|
236
|
+
let mode;
|
|
237
|
+
if (options.sandbox) {
|
|
238
|
+
mode = 'sandbox';
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
try {
|
|
242
|
+
mode = await promptForMode();
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
if (error instanceof Error && error.message === 'Cancelled by user') {
|
|
246
|
+
console.log("[brosh] Cancelled.");
|
|
247
|
+
process.exit(0);
|
|
248
|
+
}
|
|
249
|
+
throw error;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// Initialize sandbox if enabled
|
|
253
|
+
let sandboxController;
|
|
254
|
+
let sandboxEnabled = false;
|
|
255
|
+
if (mode === 'sandbox') {
|
|
256
|
+
sandboxController = new SandboxController();
|
|
257
|
+
// Check platform support and dependencies BEFORE showing the modal
|
|
258
|
+
if (!sandboxController.isSupported()) {
|
|
259
|
+
const platform = sandboxController.getPlatform();
|
|
260
|
+
if (platform === "win32") {
|
|
261
|
+
console.error("[brosh] Error: Sandbox mode is not supported on Windows.");
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
console.error(`[brosh] Error: Sandbox mode is not supported on platform '${platform}'.`);
|
|
265
|
+
}
|
|
266
|
+
console.error("[brosh] Please run without the --sandbox flag.");
|
|
267
|
+
process.exit(1);
|
|
268
|
+
}
|
|
269
|
+
// Check Linux-specific dependencies
|
|
270
|
+
const depCheck = sandboxController.checkLinuxDependencies();
|
|
271
|
+
if (!depCheck.supported) {
|
|
272
|
+
console.error(`[brosh] Error: Sandbox dependencies not available.`);
|
|
273
|
+
console.error(`[brosh] Missing: ${depCheck.message}`);
|
|
274
|
+
console.error("");
|
|
275
|
+
console.error("To install on Arch Linux:");
|
|
276
|
+
console.error(" sudo pacman -S bubblewrap socat");
|
|
277
|
+
console.error("");
|
|
278
|
+
console.error("To install on Debian/Ubuntu:");
|
|
279
|
+
console.error(" sudo apt install bubblewrap socat");
|
|
280
|
+
console.error("");
|
|
281
|
+
console.error("Or run without the --sandbox flag.");
|
|
282
|
+
process.exit(1);
|
|
283
|
+
}
|
|
284
|
+
// Determine permissions
|
|
285
|
+
let permissions;
|
|
286
|
+
if (options.sandboxConfig) {
|
|
287
|
+
try {
|
|
288
|
+
permissions = loadConfigFromFile(options.sandboxConfig);
|
|
289
|
+
console.log(`[brosh] Loaded sandbox config from ${options.sandboxConfig}`);
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
console.error(`[brosh] Failed to load sandbox config: ${error}`);
|
|
293
|
+
process.exit(1);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
// Interactive permission prompt
|
|
298
|
+
try {
|
|
299
|
+
permissions = await promptForPermissions();
|
|
300
|
+
}
|
|
301
|
+
catch (error) {
|
|
302
|
+
if (error instanceof Error && error.message === "cancelled") {
|
|
303
|
+
console.log("[brosh] Cancelled.");
|
|
304
|
+
process.exit(0);
|
|
305
|
+
}
|
|
306
|
+
throw error;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// Initialize sandbox
|
|
310
|
+
const status = await sandboxController.initialize(permissions);
|
|
311
|
+
sandboxEnabled = status.enabled;
|
|
312
|
+
if (status.enabled) {
|
|
313
|
+
console.log(`[brosh] Sandbox enabled (${status.platform})`);
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
// If we get here, something unexpected failed during initialization
|
|
317
|
+
console.error(`[brosh] Error: Failed to initialize sandbox: ${status.reason}`);
|
|
318
|
+
console.error("[brosh] Please run without the --sandbox flag or fix the issue above.");
|
|
319
|
+
process.exit(1);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// Generate startup banner
|
|
323
|
+
const startupBanner = getBanner({
|
|
324
|
+
socketPath,
|
|
325
|
+
cols,
|
|
326
|
+
rows,
|
|
327
|
+
shell,
|
|
328
|
+
sandboxEnabled,
|
|
329
|
+
});
|
|
330
|
+
// Create terminal manager (prompt customization handled in session.ts)
|
|
331
|
+
const manager = new TerminalManager({
|
|
332
|
+
cols,
|
|
333
|
+
rows,
|
|
334
|
+
shell: options.shell,
|
|
335
|
+
startupBanner,
|
|
336
|
+
sandboxController,
|
|
337
|
+
record: options.record,
|
|
338
|
+
recordDir: options.recordDir,
|
|
339
|
+
recordFormat: options.recordFormat,
|
|
340
|
+
idleTimeLimit: options.idleTimeLimit,
|
|
341
|
+
maxDuration: options.maxDuration,
|
|
342
|
+
inactivityTimeout: options.inactivityTimeout,
|
|
343
|
+
});
|
|
344
|
+
// Get the session and set up interactive I/O
|
|
345
|
+
const session = await manager.initSession();
|
|
346
|
+
// Track if we've shown the banner (for Windows, show after shell init)
|
|
347
|
+
let bannerShown = false;
|
|
348
|
+
const isWindows = process.platform === "win32";
|
|
349
|
+
// Pipe PTY output to stdout
|
|
350
|
+
session.onData((data) => {
|
|
351
|
+
process.stdout.write(data);
|
|
352
|
+
// On Windows, show banner after first prompt appears
|
|
353
|
+
if (isWindows && !bannerShown && data.includes("\uDB84\uDC55")) {
|
|
354
|
+
bannerShown = true;
|
|
355
|
+
process.stdout.write("\n" + startupBanner + "\n");
|
|
356
|
+
// Send Enter to get a fresh prompt
|
|
357
|
+
session.write("\r");
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
// On non-Windows, banner is shown via shell rc file
|
|
361
|
+
if (!isWindows) {
|
|
362
|
+
bannerShown = true;
|
|
363
|
+
}
|
|
364
|
+
// Handle PTY exit
|
|
365
|
+
session.onExit(async (code) => {
|
|
366
|
+
// Finalize recordings and get results
|
|
367
|
+
const recordings = await manager.finalizeRecordings(code);
|
|
368
|
+
console.log(`\n[brosh] Shell exited with code ${code}`);
|
|
369
|
+
// Show recording info if any were saved
|
|
370
|
+
const savedRecordings = recordings.filter(r => r.saved);
|
|
371
|
+
if (savedRecordings.length > 0) {
|
|
372
|
+
console.log('\nRecordings saved:');
|
|
373
|
+
for (const rec of savedRecordings) {
|
|
374
|
+
console.log(` ${rec.path}`);
|
|
375
|
+
}
|
|
376
|
+
console.log('\nPlay with: asciinema play <file>');
|
|
377
|
+
console.log('Install: pip install asciinema or brew install asciinema');
|
|
378
|
+
}
|
|
379
|
+
cleanup();
|
|
380
|
+
process.exit(code);
|
|
381
|
+
});
|
|
382
|
+
// Set up raw mode for stdin if it's a TTY
|
|
383
|
+
if (process.stdin.isTTY) {
|
|
384
|
+
process.stdin.setRawMode(true);
|
|
385
|
+
}
|
|
386
|
+
process.stdin.resume();
|
|
387
|
+
// Pipe stdin directly to PTY
|
|
388
|
+
process.stdin.on("data", (data) => {
|
|
389
|
+
session.write(data.toString());
|
|
390
|
+
});
|
|
391
|
+
// Handle terminal resize
|
|
392
|
+
process.stdout.on("resize", () => {
|
|
393
|
+
const newCols = process.stdout.columns || cols;
|
|
394
|
+
const newRows = process.stdout.rows || rows;
|
|
395
|
+
session.resize(newCols, newRows);
|
|
396
|
+
});
|
|
397
|
+
// Check if another brosh instance is using the socket and warn
|
|
398
|
+
await checkSocketAndWarn(socketPath);
|
|
399
|
+
// Start tool proxy socket server
|
|
400
|
+
const socketServer = createToolProxyServer(socketPath, manager);
|
|
401
|
+
// Cleanup function (sync version for exit handler)
|
|
402
|
+
function cleanup() {
|
|
403
|
+
manager.dispose();
|
|
404
|
+
socketServer.close();
|
|
405
|
+
try {
|
|
406
|
+
fs.unlinkSync(socketPath);
|
|
407
|
+
}
|
|
408
|
+
catch {
|
|
409
|
+
// Ignore
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// Async cleanup that also cleans up sandbox resources
|
|
413
|
+
async function cleanupAsync() {
|
|
414
|
+
await manager.disposeAsync();
|
|
415
|
+
socketServer.close();
|
|
416
|
+
try {
|
|
417
|
+
fs.unlinkSync(socketPath);
|
|
418
|
+
}
|
|
419
|
+
catch {
|
|
420
|
+
// Ignore
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
// Handle signals
|
|
424
|
+
process.on("SIGINT", () => {
|
|
425
|
+
// Pass Ctrl+C to the shell instead of exiting
|
|
426
|
+
session.write("\x03");
|
|
427
|
+
});
|
|
428
|
+
process.on("SIGTERM", () => {
|
|
429
|
+
cleanupAsync().then(() => process.exit(0));
|
|
430
|
+
});
|
|
431
|
+
process.on("exit", () => {
|
|
432
|
+
cleanup();
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* GUI Mode: Streams JSON protocol over stdin/stdout for GUI applications.
|
|
437
|
+
* Used by Electron/Tauri wrappers that embed brosh.
|
|
438
|
+
*
|
|
439
|
+
* Protocol:
|
|
440
|
+
* - Input (stdin): Newline-delimited JSON messages (GuiMessageToBackend)
|
|
441
|
+
* - Output (stdout): Newline-delimited JSON messages (GuiMessageToFrontend)
|
|
442
|
+
* - Stderr: Error/debug logging
|
|
443
|
+
*/
|
|
444
|
+
async function startGuiMode() {
|
|
445
|
+
const cols = options.cols ?? 120;
|
|
446
|
+
const rows = options.rows ?? 40;
|
|
447
|
+
const shell = options.shell || getDefaultShell();
|
|
448
|
+
// 1. Show mode selection prompt FIRST (outputs ANSI codes to stdout)
|
|
449
|
+
let mode;
|
|
450
|
+
if (options.sandbox) {
|
|
451
|
+
mode = 'sandbox';
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
try {
|
|
455
|
+
mode = await promptForMode();
|
|
456
|
+
}
|
|
457
|
+
catch (error) {
|
|
458
|
+
if (error instanceof Error && error.message === 'Cancelled by user') {
|
|
459
|
+
console.log("[brosh] Cancelled.");
|
|
460
|
+
process.exit(0);
|
|
461
|
+
}
|
|
462
|
+
throw error;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
// 2. If sandbox mode, get permissions and initialize
|
|
466
|
+
let sandboxController;
|
|
467
|
+
if (mode === 'sandbox') {
|
|
468
|
+
sandboxController = new SandboxController();
|
|
469
|
+
// Check platform support
|
|
470
|
+
if (!sandboxController.isSupported()) {
|
|
471
|
+
const platform = sandboxController.getPlatform();
|
|
472
|
+
if (platform === "win32") {
|
|
473
|
+
console.error("[brosh] Error: Sandbox mode is not supported on Windows.");
|
|
474
|
+
}
|
|
475
|
+
else {
|
|
476
|
+
console.error(`[brosh] Error: Sandbox mode is not supported on platform '${platform}'.`);
|
|
477
|
+
}
|
|
478
|
+
console.error("[brosh] Please run without the --sandbox flag.");
|
|
479
|
+
process.exit(1);
|
|
480
|
+
}
|
|
481
|
+
// Check Linux-specific dependencies
|
|
482
|
+
const depCheck = sandboxController.checkLinuxDependencies();
|
|
483
|
+
if (!depCheck.supported) {
|
|
484
|
+
console.error(`[brosh] Error: Sandbox dependencies not available.`);
|
|
485
|
+
console.error(`[brosh] Missing: ${depCheck.message}`);
|
|
486
|
+
console.error("");
|
|
487
|
+
console.error("To install on Arch Linux:");
|
|
488
|
+
console.error(" sudo pacman -S bubblewrap socat");
|
|
489
|
+
console.error("");
|
|
490
|
+
console.error("To install on Debian/Ubuntu:");
|
|
491
|
+
console.error(" sudo apt install bubblewrap socat");
|
|
492
|
+
console.error("");
|
|
493
|
+
console.error("Or run without the --sandbox flag.");
|
|
494
|
+
process.exit(1);
|
|
495
|
+
}
|
|
496
|
+
// Determine permissions
|
|
497
|
+
let permissions;
|
|
498
|
+
if (options.sandboxConfig) {
|
|
499
|
+
try {
|
|
500
|
+
permissions = loadConfigFromFile(options.sandboxConfig);
|
|
501
|
+
console.log(`[brosh] Loaded sandbox config from ${options.sandboxConfig}`);
|
|
502
|
+
}
|
|
503
|
+
catch (error) {
|
|
504
|
+
console.error(`[brosh] Failed to load sandbox config: ${error}`);
|
|
505
|
+
process.exit(1);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
else {
|
|
509
|
+
// Interactive permission prompt (will also render in xterm.js)
|
|
510
|
+
try {
|
|
511
|
+
permissions = await promptForPermissions();
|
|
512
|
+
}
|
|
513
|
+
catch (error) {
|
|
514
|
+
if (error instanceof Error && error.message === "cancelled") {
|
|
515
|
+
console.log("[brosh] Cancelled.");
|
|
516
|
+
process.exit(0);
|
|
517
|
+
}
|
|
518
|
+
throw error;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
// Initialize sandbox
|
|
522
|
+
const status = await sandboxController.initialize(permissions);
|
|
523
|
+
if (status.enabled) {
|
|
524
|
+
console.log(`[brosh] Sandbox enabled (${status.platform})`);
|
|
525
|
+
}
|
|
526
|
+
else {
|
|
527
|
+
console.error(`[brosh] Error: Failed to initialize sandbox: ${status.reason}`);
|
|
528
|
+
console.error("[brosh] Please run without the --sandbox flag or fix the issue above.");
|
|
529
|
+
process.exit(1);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
// 3. NOW start GUI protocol
|
|
533
|
+
// Create terminal manager
|
|
534
|
+
const manager = new TerminalManager({
|
|
535
|
+
cols,
|
|
536
|
+
rows,
|
|
537
|
+
shell: options.shell,
|
|
538
|
+
sandboxController,
|
|
539
|
+
record: options.record,
|
|
540
|
+
recordDir: options.recordDir,
|
|
541
|
+
recordFormat: options.recordFormat,
|
|
542
|
+
idleTimeLimit: options.idleTimeLimit,
|
|
543
|
+
maxDuration: options.maxDuration,
|
|
544
|
+
inactivityTimeout: options.inactivityTimeout,
|
|
545
|
+
});
|
|
546
|
+
// Create GUI output stream
|
|
547
|
+
const guiStream = new GUIOutputStream();
|
|
548
|
+
guiStream.attachManager(manager);
|
|
549
|
+
// Add a client for stdout communication
|
|
550
|
+
const clientId = guiStream.addClient((message) => {
|
|
551
|
+
// Write JSON message to stdout (newline-delimited)
|
|
552
|
+
process.stdout.write(JSON.stringify(message) + "\n");
|
|
553
|
+
});
|
|
554
|
+
// Handle error events
|
|
555
|
+
guiStream.on("error", (error) => {
|
|
556
|
+
console.error("[gui-mode] Stream error:", error.message);
|
|
557
|
+
});
|
|
558
|
+
// Parse incoming JSON messages from stdin
|
|
559
|
+
let buffer = "";
|
|
560
|
+
process.stdin.setEncoding("utf8");
|
|
561
|
+
process.stdin.on("data", async (chunk) => {
|
|
562
|
+
buffer += chunk;
|
|
563
|
+
// Process complete lines
|
|
564
|
+
let newlineIndex;
|
|
565
|
+
while ((newlineIndex = buffer.indexOf("\n")) !== -1) {
|
|
566
|
+
const line = buffer.slice(0, newlineIndex).trim();
|
|
567
|
+
buffer = buffer.slice(newlineIndex + 1);
|
|
568
|
+
if (line.length === 0)
|
|
569
|
+
continue;
|
|
570
|
+
try {
|
|
571
|
+
const message = JSON.parse(line);
|
|
572
|
+
if (isGuiMessageToBackend(message)) {
|
|
573
|
+
await guiStream.handleMessage(clientId, message);
|
|
574
|
+
}
|
|
575
|
+
else {
|
|
576
|
+
console.error("[gui-mode] Invalid message format:", line);
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
catch (error) {
|
|
580
|
+
console.error("[gui-mode] Failed to parse message:", line);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
});
|
|
584
|
+
process.stdin.on("end", () => {
|
|
585
|
+
console.error("[gui-mode] stdin closed, shutting down");
|
|
586
|
+
cleanup();
|
|
587
|
+
process.exit(0);
|
|
588
|
+
});
|
|
589
|
+
// Cleanup function
|
|
590
|
+
function cleanup() {
|
|
591
|
+
guiStream.dispose();
|
|
592
|
+
manager.dispose();
|
|
593
|
+
}
|
|
594
|
+
// Handle signals
|
|
595
|
+
process.on("SIGINT", () => {
|
|
596
|
+
cleanup();
|
|
597
|
+
process.exit(0);
|
|
598
|
+
});
|
|
599
|
+
process.on("SIGTERM", () => {
|
|
600
|
+
cleanup();
|
|
601
|
+
process.exit(0);
|
|
602
|
+
});
|
|
603
|
+
process.on("exit", () => {
|
|
604
|
+
cleanup();
|
|
605
|
+
});
|
|
606
|
+
// Send ready message
|
|
607
|
+
const readyMessage = {
|
|
608
|
+
type: "session-list",
|
|
609
|
+
sessions: [],
|
|
610
|
+
};
|
|
611
|
+
process.stdout.write(JSON.stringify(readyMessage) + "\n");
|
|
612
|
+
console.error(`[gui-mode] Ready. Shell: ${shell}, Size: ${cols}x${rows}`);
|
|
613
|
+
}
|
|
614
|
+
main().catch((error) => {
|
|
615
|
+
console.error("Failed to start:", error);
|
|
616
|
+
process.exit(1);
|
|
617
|
+
});
|
|
618
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library Exports
|
|
3
|
+
*
|
|
4
|
+
* This file exports all public APIs for use as a library.
|
|
5
|
+
* The main index.ts is the CLI entry point; this file is for programmatic usage.
|
|
6
|
+
*/
|
|
7
|
+
export { TerminalSession, TerminalManager } from "./terminal/index.js";
|
|
8
|
+
export type { TerminalSessionOptions, ScreenshotResult, TerminalManagerOptions, CreateSessionOptions, ManagedSession, } from "./terminal/index.js";
|
|
9
|
+
export { GUIOutputStream, createGUIOutputStream, } from "./transport/index.js";
|
|
10
|
+
export type { GuiClientCallback, GUIOutputStreamEvents, } from "./transport/index.js";
|
|
11
|
+
export { encodeData, decodeData, isGuiMessageToBackend, isGuiMessageToFrontend, } from "./transport/index.js";
|
|
12
|
+
export type { GuiMessageToBackend, GuiMessageToFrontend, GuiInputMessage, GuiCreateSessionMessage, GuiCloseSessionMessage, GuiResizeMessage, GuiStartRecordingMessage, GuiStopRecordingMessage, GuiGetContentMessage, GuiListSessionsMessage, BackendOutputMessage, BackendSessionCreatedMessage, BackendSessionClosedMessage, BackendResizeMessage, BackendRecordingStartedMessage, BackendRecordingStoppedMessage, BackendContentMessage, BackendSessionListMessage, BackendErrorMessage, } from "./transport/index.js";
|
|
13
|
+
export { SocketTransport, createSocketServer, createToolProxyServer, isSocketInUse, checkSocketAndWarn, } from "./transport/index.js";
|
|
14
|
+
export { RecordingManager } from "./recording/index.js";
|
|
15
|
+
export type { RecordingMode, RecordingFormat, RecordingOptions, RecordingMetadata, } from "./recording/index.js";
|
|
16
|
+
export { getDefaultShell, getDefaultSocketPath, getDefaultRecordDir } from "./utils/platform.js";
|
|
17
|
+
export { getKeySequence, KEY_SEQUENCES, getAvailableKeys } from "./utils/keys.js";
|
|
18
|
+
export { promptForMode } from "./sandbox/mode-prompt.js";
|
|
19
|
+
export { promptForPermissions } from "./sandbox/prompt.js";
|
|
20
|
+
export { SandboxController, loadConfigFromFile, DEFAULT_PERMISSIONS } from "./sandbox/index.js";
|
|
21
|
+
export type { SandboxPermissions } from "./sandbox/index.js";
|
|
22
|
+
export { ClientInfoSchema, RuntimeInfoSchema, CapabilitiesSchema, SessionMetadataSchema, ObservabilitySchema, ExtendedClientInfoSchema, generateClientId, } from "./types/mcp-client-info.js";
|
|
23
|
+
export type { ClientInfo, RuntimeInfo, Capabilities, SessionMetadata, Observability, ExtendedClientInfo, TrackedClient, SessionLogEntry, SessionConnectEntry, SessionDisconnectEntry, SessionToolCallEntry, } from "./types/mcp-client-info.js";
|
|
24
|
+
export { SessionLogger } from "./utils/session-logger.js";
|
|
25
|
+
//# sourceMappingURL=lib.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACvE,YAAY,EACV,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,GACf,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,eAAe,EACf,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,UAAU,EACV,UAAU,EACV,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,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,sBAAsB,CAAC;AAG9B,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACb,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,YAAY,EACV,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGlF,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAChG,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC"}
|