brosh 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +181 -0
  3. package/brosh_brandmark.svg +3 -0
  4. package/brosh_logo.svg +27 -0
  5. package/cli_icon.svg +52 -0
  6. package/dist/client.d.ts +5 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +138 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +618 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/lib.d.ts +25 -0
  15. package/dist/lib.d.ts.map +1 -0
  16. package/dist/lib.js +28 -0
  17. package/dist/lib.js.map +1 -0
  18. package/dist/mode-selector.d.ts +7 -0
  19. package/dist/mode-selector.d.ts.map +1 -0
  20. package/dist/mode-selector.js +138 -0
  21. package/dist/mode-selector.js.map +1 -0
  22. package/dist/prompts/index.d.ts +3 -0
  23. package/dist/prompts/index.d.ts.map +1 -0
  24. package/dist/prompts/index.js +79 -0
  25. package/dist/prompts/index.js.map +1 -0
  26. package/dist/recording/index.d.ts +4 -0
  27. package/dist/recording/index.d.ts.map +1 -0
  28. package/dist/recording/index.js +3 -0
  29. package/dist/recording/index.js.map +1 -0
  30. package/dist/recording/manager.d.ts +62 -0
  31. package/dist/recording/manager.d.ts.map +1 -0
  32. package/dist/recording/manager.js +123 -0
  33. package/dist/recording/manager.js.map +1 -0
  34. package/dist/recording/recorder.d.ts +95 -0
  35. package/dist/recording/recorder.d.ts.map +1 -0
  36. package/dist/recording/recorder.js +330 -0
  37. package/dist/recording/recorder.js.map +1 -0
  38. package/dist/recording/types.d.ts +65 -0
  39. package/dist/recording/types.d.ts.map +1 -0
  40. package/dist/recording/types.js +2 -0
  41. package/dist/recording/types.js.map +1 -0
  42. package/dist/sandbox/ModeSelector.d.ts +2 -0
  43. package/dist/sandbox/ModeSelector.d.ts.map +1 -0
  44. package/dist/sandbox/ModeSelector.js +2 -0
  45. package/dist/sandbox/ModeSelector.js.map +1 -0
  46. package/dist/sandbox/config.d.ts +46 -0
  47. package/dist/sandbox/config.d.ts.map +1 -0
  48. package/dist/sandbox/config.js +144 -0
  49. package/dist/sandbox/config.js.map +1 -0
  50. package/dist/sandbox/controller.d.ts +72 -0
  51. package/dist/sandbox/controller.d.ts.map +1 -0
  52. package/dist/sandbox/controller.js +208 -0
  53. package/dist/sandbox/controller.js.map +1 -0
  54. package/dist/sandbox/index.d.ts +6 -0
  55. package/dist/sandbox/index.d.ts.map +1 -0
  56. package/dist/sandbox/index.js +4 -0
  57. package/dist/sandbox/index.js.map +1 -0
  58. package/dist/sandbox/mode-prompt.d.ts +10 -0
  59. package/dist/sandbox/mode-prompt.d.ts.map +1 -0
  60. package/dist/sandbox/mode-prompt.js +130 -0
  61. package/dist/sandbox/mode-prompt.js.map +1 -0
  62. package/dist/sandbox/prompt.d.ts +10 -0
  63. package/dist/sandbox/prompt.d.ts.map +1 -0
  64. package/dist/sandbox/prompt.js +434 -0
  65. package/dist/sandbox/prompt.js.map +1 -0
  66. package/dist/server.d.ts +28 -0
  67. package/dist/server.d.ts.map +1 -0
  68. package/dist/server.js +59 -0
  69. package/dist/server.js.map +1 -0
  70. package/dist/terminal/index.d.ts +5 -0
  71. package/dist/terminal/index.d.ts.map +1 -0
  72. package/dist/terminal/index.js +3 -0
  73. package/dist/terminal/index.js.map +1 -0
  74. package/dist/terminal/manager.d.ts +153 -0
  75. package/dist/terminal/manager.d.ts.map +1 -0
  76. package/dist/terminal/manager.js +276 -0
  77. package/dist/terminal/manager.js.map +1 -0
  78. package/dist/terminal/session.d.ts +137 -0
  79. package/dist/terminal/session.d.ts.map +1 -0
  80. package/dist/terminal/session.js +752 -0
  81. package/dist/terminal/session.js.map +1 -0
  82. package/dist/tools/definitions.d.ts +18 -0
  83. package/dist/tools/definitions.d.ts.map +1 -0
  84. package/dist/tools/definitions.js +114 -0
  85. package/dist/tools/definitions.js.map +1 -0
  86. package/dist/tools/getContent.d.ts +32 -0
  87. package/dist/tools/getContent.d.ts.map +1 -0
  88. package/dist/tools/getContent.js +38 -0
  89. package/dist/tools/getContent.js.map +1 -0
  90. package/dist/tools/index.d.ts +4 -0
  91. package/dist/tools/index.d.ts.map +1 -0
  92. package/dist/tools/index.js +49 -0
  93. package/dist/tools/index.js.map +1 -0
  94. package/dist/tools/screenshot.d.ts +20 -0
  95. package/dist/tools/screenshot.d.ts.map +1 -0
  96. package/dist/tools/screenshot.js +28 -0
  97. package/dist/tools/screenshot.js.map +1 -0
  98. package/dist/tools/sendKey.d.ts +31 -0
  99. package/dist/tools/sendKey.d.ts.map +1 -0
  100. package/dist/tools/sendKey.js +38 -0
  101. package/dist/tools/sendKey.js.map +1 -0
  102. package/dist/tools/startRecording.d.ts +68 -0
  103. package/dist/tools/startRecording.d.ts.map +1 -0
  104. package/dist/tools/startRecording.js +111 -0
  105. package/dist/tools/startRecording.js.map +1 -0
  106. package/dist/tools/stopRecording.d.ts +31 -0
  107. package/dist/tools/stopRecording.d.ts.map +1 -0
  108. package/dist/tools/stopRecording.js +76 -0
  109. package/dist/tools/stopRecording.js.map +1 -0
  110. package/dist/tools/type.d.ts +31 -0
  111. package/dist/tools/type.d.ts.map +1 -0
  112. package/dist/tools/type.js +31 -0
  113. package/dist/tools/type.js.map +1 -0
  114. package/dist/transport/gui-protocol.d.ts +163 -0
  115. package/dist/transport/gui-protocol.d.ts.map +1 -0
  116. package/dist/transport/gui-protocol.js +68 -0
  117. package/dist/transport/gui-protocol.js.map +1 -0
  118. package/dist/transport/gui-stream.d.ts +139 -0
  119. package/dist/transport/gui-stream.d.ts.map +1 -0
  120. package/dist/transport/gui-stream.js +440 -0
  121. package/dist/transport/gui-stream.js.map +1 -0
  122. package/dist/transport/index.d.ts +6 -0
  123. package/dist/transport/index.d.ts.map +1 -0
  124. package/dist/transport/index.js +6 -0
  125. package/dist/transport/index.js.map +1 -0
  126. package/dist/transport/socket.d.ts +46 -0
  127. package/dist/transport/socket.d.ts.map +1 -0
  128. package/dist/transport/socket.js +310 -0
  129. package/dist/transport/socket.js.map +1 -0
  130. package/dist/types/mcp-client-info.d.ts +226 -0
  131. package/dist/types/mcp-client-info.d.ts.map +1 -0
  132. package/dist/types/mcp-client-info.js +62 -0
  133. package/dist/types/mcp-client-info.js.map +1 -0
  134. package/dist/ui/index.d.ts +12 -0
  135. package/dist/ui/index.d.ts.map +1 -0
  136. package/dist/ui/index.js +84 -0
  137. package/dist/ui/index.js.map +1 -0
  138. package/dist/utils/env.d.ts +17 -0
  139. package/dist/utils/env.d.ts.map +1 -0
  140. package/dist/utils/env.js +35 -0
  141. package/dist/utils/env.js.map +1 -0
  142. package/dist/utils/keys.d.ts +16 -0
  143. package/dist/utils/keys.d.ts.map +1 -0
  144. package/dist/utils/keys.js +155 -0
  145. package/dist/utils/keys.js.map +1 -0
  146. package/dist/utils/platform.d.ts +16 -0
  147. package/dist/utils/platform.d.ts.map +1 -0
  148. package/dist/utils/platform.js +41 -0
  149. package/dist/utils/platform.js.map +1 -0
  150. package/dist/utils/session-logger.d.ts +31 -0
  151. package/dist/utils/session-logger.d.ts.map +1 -0
  152. package/dist/utils/session-logger.js +125 -0
  153. package/dist/utils/session-logger.js.map +1 -0
  154. package/dist/utils/stats.d.ts +46 -0
  155. package/dist/utils/stats.d.ts.map +1 -0
  156. package/dist/utils/stats.js +89 -0
  157. package/dist/utils/stats.js.map +1 -0
  158. package/dist/utils/version.d.ts +2 -0
  159. package/dist/utils/version.d.ts.map +1 -0
  160. package/dist/utils/version.js +9 -0
  161. package/dist/utils/version.js.map +1 -0
  162. package/logo.png +0 -0
  163. package/package.json +61 -0
  164. package/packages/desktop-electron/THIRD-PARTY-NOTICES +56 -0
  165. package/packages/desktop-electron/build/afterPack.cjs +147 -0
  166. package/packages/desktop-electron/package-lock.json +10071 -0
  167. package/packages/desktop-electron/package.json +170 -0
  168. package/packages/desktop-electron/resources/icons/mac/icon.icns +0 -0
  169. package/packages/desktop-electron/resources/icons/png/1024x1024.png +0 -0
  170. package/packages/desktop-electron/resources/icons/png/128x128.png +0 -0
  171. package/packages/desktop-electron/resources/icons/png/16x16.png +0 -0
  172. package/packages/desktop-electron/resources/icons/png/24x24.png +0 -0
  173. package/packages/desktop-electron/resources/icons/png/256x256.png +0 -0
  174. package/packages/desktop-electron/resources/icons/png/32x32.png +0 -0
  175. package/packages/desktop-electron/resources/icons/png/48x48.png +0 -0
  176. package/packages/desktop-electron/resources/icons/png/512x512.png +0 -0
  177. package/packages/desktop-electron/resources/icons/png/64x64.png +0 -0
  178. package/packages/desktop-electron/resources/icons/win/icon.ico +0 -0
  179. package/packages/desktop-electron/scripts/download-models.js +97 -0
  180. package/packages/desktop-electron/scripts/prepare-sandbox-bins.js +186 -0
  181. package/packages/desktop-electron/tests/main/ai-detection/additionalFunctions.test.ts +224 -0
  182. package/packages/desktop-electron/tests/main/ai-detection/checkOverridePrefix.test.ts +162 -0
  183. package/packages/desktop-electron/tests/main/ai-detection/classifyInput.test.ts +132 -0
  184. package/packages/desktop-electron/tests/main/ai-detection/detectTypos.test.ts +342 -0
  185. package/packages/desktop-electron/tests/main/ai-detection/fixtures/commands.ts +134 -0
  186. package/packages/desktop-electron/tests/main/ai-detection/fixtures/natural-language.ts +133 -0
  187. package/packages/desktop-electron/tests/main/ai-detection/fixtures/typos.ts +123 -0
  188. package/packages/desktop-electron/tests/main/ai-detection/hasValidSubcommand.test.ts +218 -0
  189. package/packages/desktop-electron/tests/main/ai-detection/isCommandNotFound.test.ts +117 -0
  190. package/packages/desktop-electron/tests/main/error-triage/buildTriagePrompt.test.ts +133 -0
  191. package/packages/desktop-electron/tests/main/error-triage/parseTriageResponse.test.ts +123 -0
  192. package/packages/desktop-electron/tests/main/terminal-bridge/battery-optimization.test.ts +243 -0
  193. package/packages/desktop-electron/tests/main/terminal-bridge/command-fast-track.test.ts +292 -0
  194. package/packages/desktop-electron/tests/main/terminal-bridge/default-cwd.test.ts +70 -0
  195. package/packages/desktop-electron/tests/setup.ts +274 -0
  196. package/packages/desktop-electron/tsconfig.json +18 -0
  197. package/packages/desktop-electron/tsconfig.main.json +20 -0
  198. package/packages/desktop-electron/vite.config.ts +19 -0
  199. package/packages/desktop-electron/vitest.config.ts +18 -0
  200. package/tsconfig.json +19 -0
@@ -0,0 +1,434 @@
1
+ // ANSI escape codes
2
+ const ESC = "\x1b";
3
+ const CURSOR_HIDE = `${ESC}[?25l`;
4
+ const CURSOR_SHOW = `${ESC}[?25h`;
5
+ const CLEAR_TO_END = `${ESC}[J`;
6
+ const CURSOR_UP = (n) => `${ESC}[${n}A`;
7
+ const CURSOR_TO_COL_1 = `${ESC}[1G`;
8
+ // Colors
9
+ const BOLD = `${ESC}[1m`;
10
+ const DIM = `${ESC}[2m`;
11
+ const RESET = `${ESC}[0m`;
12
+ const CYAN = `${ESC}[36m`;
13
+ const GREEN = `${ESC}[32m`;
14
+ const RED = `${ESC}[31m`;
15
+ const YELLOW = `${ESC}[38;2;255;255;0m`;
16
+ const BG_BLUE = `${ESC}[44m`;
17
+ const WHITE = `${ESC}[97m`;
18
+ const MAGENTA = `${ESC}[35m`;
19
+ // Box drawing characters
20
+ const BOX = {
21
+ topLeft: "╭",
22
+ topRight: "╮",
23
+ bottomLeft: "╰",
24
+ bottomRight: "╯",
25
+ horizontal: "─",
26
+ vertical: "│",
27
+ };
28
+ function isSelectable(item) {
29
+ return item.type === "path" || item.type === "network" || item.type === "add";
30
+ }
31
+ /**
32
+ * Interactive permission selection prompt
33
+ */
34
+ export async function promptForPermissions() {
35
+ // If not a TTY, return defaults
36
+ if (!process.stdin.isTTY) {
37
+ console.log("[brosh] Non-interactive mode, using default sandbox permissions");
38
+ return getDefaultFromItems(createDefaultItems());
39
+ }
40
+ const items = createDefaultItems();
41
+ let selectedPos = 0;
42
+ let scrollOffset = 0;
43
+ const maxVisible = 18;
44
+ const boxWidth = 58;
45
+ // Input mode state
46
+ let inputMode = false;
47
+ let inputBuffer = "";
48
+ let inputAccessLevel = "blocked";
49
+ const getSelectableIndices = () => items.map((item, i) => (isSelectable(item) ? i : -1)).filter((i) => i >= 0);
50
+ return new Promise((resolve, reject) => {
51
+ process.stdin.setRawMode(true);
52
+ process.stdin.resume();
53
+ process.stdin.setEncoding("utf8");
54
+ process.stdout.write(CURSOR_HIDE);
55
+ // Track lines written for proper redraw
56
+ let lastOutputLineCount = 0;
57
+ const getSelectedIndex = () => {
58
+ const indices = getSelectableIndices();
59
+ return indices[Math.min(selectedPos, indices.length - 1)];
60
+ };
61
+ const cycleAccess = (item, direction) => {
62
+ if (item.type === "path") {
63
+ const levels = ["read-write", "read-only", "blocked"];
64
+ const current = levels.indexOf(item.access);
65
+ const next = (current + direction + levels.length) % levels.length;
66
+ item.access = levels[next];
67
+ }
68
+ else {
69
+ item.access = item.access === "allowed" ? "blocked" : "allowed";
70
+ }
71
+ };
72
+ const formatAccess = (item) => {
73
+ if (item.type === "path") {
74
+ switch (item.access) {
75
+ case "read-write":
76
+ return `${GREEN}Read/Write${RESET}`;
77
+ case "read-only":
78
+ return `${CYAN}Read-Only ${RESET}`;
79
+ case "blocked":
80
+ return `${RED}Blocked ${RESET}`;
81
+ }
82
+ }
83
+ else {
84
+ return item.access === "allowed"
85
+ ? `${GREEN}Allowed${RESET}`
86
+ : `${RED}Blocked${RESET}`;
87
+ }
88
+ };
89
+ const formatInputAccess = (access) => {
90
+ switch (access) {
91
+ case "read-write":
92
+ return `${GREEN}Read/Write${RESET}`;
93
+ case "read-only":
94
+ return `${CYAN}Read-Only${RESET}`;
95
+ case "blocked":
96
+ return `${RED}Blocked${RESET}`;
97
+ }
98
+ };
99
+ const render = () => {
100
+ // Move cursor up to overwrite previous output
101
+ if (lastOutputLineCount > 0) {
102
+ process.stdout.write(CURSOR_UP(lastOutputLineCount) + CURSOR_TO_COL_1);
103
+ }
104
+ process.stdout.write(CLEAR_TO_END);
105
+ const lines = [];
106
+ lines.push("");
107
+ if (inputMode) {
108
+ // Input mode UI
109
+ lines.push(`${BOLD}Add Custom Path${RESET}`);
110
+ lines.push("");
111
+ lines.push(`${DIM}Enter path (e.g., ~/myproject, /var/data):${RESET}`);
112
+ lines.push("");
113
+ lines.push(` ${WHITE}▸ ${inputBuffer}${BOLD}_${RESET}`);
114
+ lines.push("");
115
+ lines.push(` Access: [${formatInputAccess(inputAccessLevel)}] ${DIM}(←→ to change)${RESET}`);
116
+ lines.push("");
117
+ lines.push(`${DIM}ENTER to add | ESC to cancel${RESET}`);
118
+ lines.push("");
119
+ }
120
+ else {
121
+ // Normal mode UI
122
+ lines.push(`${DIM} ↑↓ move ←→ cycle ENTER confirm q quit${RESET}`);
123
+ lines.push("");
124
+ const selectedIndex = getSelectedIndex();
125
+ // Adjust scroll
126
+ let selectedLinePos = 0;
127
+ for (let i = 0; i < selectedIndex; i++) {
128
+ selectedLinePos++;
129
+ }
130
+ if (selectedLinePos < scrollOffset) {
131
+ scrollOffset = Math.max(0, selectedLinePos - 1);
132
+ }
133
+ else if (selectedLinePos >= scrollOffset + maxVisible) {
134
+ scrollOffset = selectedLinePos - maxVisible + 2;
135
+ }
136
+ if (scrollOffset > 0) {
137
+ lines.push(`${DIM} ↑ scroll up for more${RESET}`);
138
+ }
139
+ let lineCount = 0;
140
+ for (let i = 0; i < items.length; i++) {
141
+ if (lineCount < scrollOffset) {
142
+ lineCount++;
143
+ continue;
144
+ }
145
+ if (lineCount >= scrollOffset + maxVisible) {
146
+ break;
147
+ }
148
+ lineCount++;
149
+ const item = items[i];
150
+ const isSelected = i === selectedIndex;
151
+ if (item.type === "header") {
152
+ lines.push(`${CYAN} ${item.label}${RESET}`);
153
+ }
154
+ else if (item.type === "add") {
155
+ if (isSelected) {
156
+ lines.push(` ${BG_BLUE}${WHITE}▸${RESET} ${MAGENTA}${BOLD}+ ${item.label}${RESET}`);
157
+ }
158
+ else {
159
+ lines.push(` ${MAGENTA}+ ${item.label}${RESET}`);
160
+ }
161
+ }
162
+ else {
163
+ const accessStr = formatAccess(item);
164
+ const isCustom = item.type === "path" && item.custom;
165
+ const labelBase = isCustom ? `${item.label} ${DIM}*${RESET}` : item.label;
166
+ const label = item.label.padEnd(28);
167
+ if (isSelected) {
168
+ lines.push(` ${BG_BLUE}${WHITE}▸${RESET} ${BOLD}${label}${RESET} [${accessStr}]${isCustom ? ` ${DIM}*${RESET}` : ""}`);
169
+ }
170
+ else {
171
+ lines.push(` ${label} [${accessStr}]${isCustom ? ` ${DIM}*${RESET}` : ""}`);
172
+ }
173
+ }
174
+ }
175
+ if (scrollOffset + maxVisible < items.length) {
176
+ lines.push(`${DIM} ↓ scroll down for more${RESET}`);
177
+ }
178
+ lines.push("");
179
+ }
180
+ const output = drawBox(lines, inputMode ? "Add Custom Path" : "Sandbox Permissions", boxWidth);
181
+ const outputWithNewlines = "\n" + output + "\n";
182
+ lastOutputLineCount = outputWithNewlines.split("\n").length - 1;
183
+ process.stdout.write(outputWithNewlines);
184
+ };
185
+ const drawBox = (lines, title, width) => {
186
+ const output = [];
187
+ const titleText = ` ${title} `;
188
+ const leftPad = Math.floor((width - 2 - titleText.length) / 2);
189
+ const rightPad = width - 2 - leftPad - titleText.length;
190
+ output.push(`${YELLOW}${BOX.topLeft}${BOX.horizontal.repeat(leftPad)}${WHITE}${BOLD}${titleText}${RESET}${YELLOW}${BOX.horizontal.repeat(rightPad)}${BOX.topRight}${RESET}`);
191
+ for (const line of lines) {
192
+ const plainText = line.replace(/\x1b\[[0-9;]*m/g, "");
193
+ const padding = width - 2 - plainText.length;
194
+ output.push(`${YELLOW}${BOX.vertical}${RESET}${line}${" ".repeat(Math.max(0, padding))}${YELLOW}${BOX.vertical}${RESET}`);
195
+ }
196
+ output.push(`${YELLOW}${BOX.bottomLeft}${BOX.horizontal.repeat(width - 2)}${BOX.bottomRight}${RESET}`);
197
+ return output.join("\n");
198
+ };
199
+ const cleanup = () => {
200
+ process.stdin.setRawMode(false);
201
+ process.stdin.pause();
202
+ process.stdin.removeAllListeners("data");
203
+ // Clear the modal output
204
+ if (lastOutputLineCount > 0) {
205
+ process.stdout.write(CURSOR_UP(lastOutputLineCount) + CURSOR_TO_COL_1 + CLEAR_TO_END);
206
+ }
207
+ process.stdout.write(CURSOR_SHOW);
208
+ };
209
+ const addCustomPath = () => {
210
+ if (inputBuffer.trim()) {
211
+ const path = inputBuffer.trim();
212
+ // Find the "Add custom path" item and insert before it
213
+ const addIndex = items.findIndex((i) => i.type === "add");
214
+ // Check if custom header exists, if not add it
215
+ const customHeaderIndex = items.findIndex((i) => i.type === "header" && i.label === "Custom Paths:");
216
+ if (customHeaderIndex === -1) {
217
+ // Insert custom header and path before "Add custom path"
218
+ items.splice(addIndex, 0, { type: "header", label: "Custom Paths:" });
219
+ items.splice(addIndex + 1, 0, {
220
+ type: "path",
221
+ label: path,
222
+ paths: [path],
223
+ access: inputAccessLevel,
224
+ custom: true,
225
+ });
226
+ }
227
+ else {
228
+ // Insert before "Add custom path"
229
+ items.splice(addIndex, 0, {
230
+ type: "path",
231
+ label: path,
232
+ paths: [path],
233
+ access: inputAccessLevel,
234
+ custom: true,
235
+ });
236
+ }
237
+ }
238
+ inputMode = false;
239
+ inputBuffer = "";
240
+ inputAccessLevel = "blocked";
241
+ };
242
+ const handleKey = (key) => {
243
+ if (inputMode) {
244
+ // Input mode key handling
245
+ if (key === "\x1b" || key === "\x03") {
246
+ // ESC or Ctrl+C - cancel input
247
+ inputMode = false;
248
+ inputBuffer = "";
249
+ inputAccessLevel = "blocked";
250
+ }
251
+ else if (key === "\r" || key === "\n") {
252
+ // Enter - add the path
253
+ addCustomPath();
254
+ }
255
+ else if (key === "\x7f" || key === "\b") {
256
+ // Backspace
257
+ inputBuffer = inputBuffer.slice(0, -1);
258
+ }
259
+ else if (key === "\x1b[C") {
260
+ // Right arrow - cycle access forward
261
+ const levels = ["read-write", "read-only", "blocked"];
262
+ const current = levels.indexOf(inputAccessLevel);
263
+ inputAccessLevel = levels[(current + 1) % levels.length];
264
+ }
265
+ else if (key === "\x1b[D") {
266
+ // Left arrow - cycle access backward
267
+ const levels = ["read-write", "read-only", "blocked"];
268
+ const current = levels.indexOf(inputAccessLevel);
269
+ inputAccessLevel = levels[(current - 1 + levels.length) % levels.length];
270
+ }
271
+ else if (key.length === 1 && key >= " " && key <= "~") {
272
+ // Printable character
273
+ inputBuffer += key;
274
+ }
275
+ else {
276
+ return;
277
+ }
278
+ render();
279
+ return;
280
+ }
281
+ // Normal mode key handling
282
+ const selectableIndices = getSelectableIndices();
283
+ const selectedIndex = getSelectedIndex();
284
+ const item = items[selectedIndex];
285
+ if (key === "\x1b[A" || key === "k") {
286
+ // Up
287
+ selectedPos = Math.max(0, selectedPos - 1);
288
+ }
289
+ else if (key === "\x1b[B" || key === "j") {
290
+ // Down
291
+ selectedPos = Math.min(selectableIndices.length - 1, selectedPos + 1);
292
+ }
293
+ else if (key === " " || key === "\x1b[C" || key === "l") {
294
+ // Space or Right - cycle forward or activate add
295
+ if (item.type === "add") {
296
+ inputMode = true;
297
+ inputBuffer = "";
298
+ inputAccessLevel = "blocked";
299
+ }
300
+ else if (item.type === "path" || item.type === "network") {
301
+ cycleAccess(item, 1);
302
+ }
303
+ }
304
+ else if (key === "\x1b[D" || key === "h") {
305
+ // Left - cycle backward
306
+ if (item.type === "path" || item.type === "network") {
307
+ cycleAccess(item, -1);
308
+ }
309
+ }
310
+ else if (key === "\r" || key === "\n") {
311
+ // Enter - confirm or activate add
312
+ if (item.type === "add") {
313
+ inputMode = true;
314
+ inputBuffer = "";
315
+ inputAccessLevel = "blocked";
316
+ }
317
+ else {
318
+ cleanup();
319
+ const permissions = getDefaultFromItems(items);
320
+ console.log(`${GREEN}Sandbox configured.${RESET}\n`);
321
+ resolve(permissions);
322
+ return;
323
+ }
324
+ }
325
+ else if (key === "q" || key === "\x03") {
326
+ // q or Ctrl+C - quit
327
+ cleanup();
328
+ reject(new Error("cancelled"));
329
+ return;
330
+ }
331
+ else if (key === "d" || key === "\x1b[3~") {
332
+ // d or Delete - remove custom item
333
+ if (item.type === "path" && item.custom) {
334
+ const idx = items.indexOf(item);
335
+ items.splice(idx, 1);
336
+ // Remove "Custom Paths:" header if no more custom items
337
+ const hasCustomItems = items.some((i) => i.type === "path" && i.custom);
338
+ if (!hasCustomItems) {
339
+ const headerIdx = items.findIndex((i) => i.type === "header" && i.label === "Custom Paths:");
340
+ if (headerIdx !== -1) {
341
+ items.splice(headerIdx, 1);
342
+ }
343
+ }
344
+ // Adjust selected position
345
+ const newSelectableIndices = getSelectableIndices();
346
+ selectedPos = Math.min(selectedPos, newSelectableIndices.length - 1);
347
+ }
348
+ }
349
+ else {
350
+ return;
351
+ }
352
+ render();
353
+ };
354
+ render();
355
+ process.stdin.on("data", handleKey);
356
+ });
357
+ }
358
+ function createDefaultItems() {
359
+ return [
360
+ { type: "header", label: "Core Paths:" },
361
+ { type: "path", label: "Current directory", paths: ["."], access: "read-write" },
362
+ { type: "path", label: "/tmp", paths: ["/tmp"], access: "read-write" },
363
+ { type: "header", label: "Shell & Caches:" },
364
+ { type: "path", label: "~/.cache, ~/.local", paths: ["~/.cache", "~/.local"], access: "read-write" },
365
+ { type: "path", label: "Shell history files", paths: ["~/.zsh_history", "~/.bash_history", "~/.node_repl_history", "~/.python_history"], access: "read-write" },
366
+ { type: "header", label: "Package Managers:" },
367
+ { type: "path", label: "~/.npm, ~/.yarn, ~/.pnpm", paths: ["~/.npm", "~/.yarn", "~/.pnpm", "~/.bun"], access: "read-write" },
368
+ { type: "path", label: "~/.cargo, ~/.rustup", paths: ["~/.cargo", "~/.rustup"], access: "blocked" },
369
+ { type: "path", label: "~/.nvm, ~/.pyenv, ~/.rbenv", paths: ["~/.nvm", "~/.pyenv", "~/.rbenv"], access: "blocked" },
370
+ { type: "header", label: "Home Directory:" },
371
+ { type: "path", label: "~ (general access)", paths: ["~"], access: "read-only" },
372
+ { type: "header", label: "Credentials (sensitive):" },
373
+ { type: "path", label: "~/.ssh", paths: ["~/.ssh"], access: "blocked" },
374
+ { type: "path", label: "~/.gnupg", paths: ["~/.gnupg"], access: "blocked" },
375
+ { type: "path", label: "~/.aws", paths: ["~/.aws"], access: "blocked" },
376
+ { type: "path", label: "~/.config/gcloud, ~/.azure", paths: ["~/.config/gcloud", "~/.azure", "~/.kube"], access: "blocked" },
377
+ { type: "path", label: "~/.config/gh", paths: ["~/.config/gh"], access: "blocked" },
378
+ { type: "path", label: "~/.npmrc, ~/.netrc", paths: ["~/.npmrc", "~/.netrc", "~/.docker/config.json"], access: "blocked" },
379
+ { type: "header", label: "Network:" },
380
+ { type: "network", label: "Network access", access: "allowed" },
381
+ { type: "add", label: "Add custom path..." },
382
+ ];
383
+ }
384
+ function getDefaultFromItems(items) {
385
+ const permissions = {
386
+ filesystem: {
387
+ readWrite: [],
388
+ readOnly: [],
389
+ blocked: [],
390
+ },
391
+ network: {
392
+ mode: "all",
393
+ },
394
+ };
395
+ for (const item of items) {
396
+ if (item.type === "path") {
397
+ switch (item.access) {
398
+ case "read-write":
399
+ permissions.filesystem.readWrite.push(...item.paths);
400
+ break;
401
+ case "read-only":
402
+ permissions.filesystem.readOnly.push(...item.paths);
403
+ break;
404
+ case "blocked":
405
+ permissions.filesystem.blocked.push(...item.paths);
406
+ break;
407
+ }
408
+ }
409
+ else if (item.type === "network") {
410
+ permissions.network.mode = item.access === "allowed" ? "all" : "none";
411
+ }
412
+ }
413
+ return permissions;
414
+ }
415
+ /**
416
+ * Display a summary of the sandbox permissions
417
+ */
418
+ export function displayPermissionsSummary(permissions) {
419
+ console.log(`${CYAN}Sandbox Permissions:${RESET}`);
420
+ if (permissions.filesystem.readWrite.length > 0) {
421
+ console.log(` ${GREEN}Read/Write:${RESET} ${permissions.filesystem.readWrite.join(", ")}`);
422
+ }
423
+ if (permissions.filesystem.readOnly.length > 0) {
424
+ console.log(` ${CYAN}Read-Only:${RESET} ${permissions.filesystem.readOnly.join(", ")}`);
425
+ }
426
+ if (permissions.filesystem.blocked.length > 0) {
427
+ console.log(` ${RED}Blocked:${RESET} ${permissions.filesystem.blocked.join(", ")}`);
428
+ }
429
+ console.log(` ${CYAN}Network:${RESET} ${permissions.network.mode}`);
430
+ if (permissions.network.mode === "allowlist" && permissions.network.allowedDomains) {
431
+ console.log(` Allowed: ${permissions.network.allowedDomains.join(", ")}`);
432
+ }
433
+ }
434
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/sandbox/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
3
+ import { TerminalManager } from "./terminal/index.js";
4
+ export interface ServerOptions {
5
+ cols?: number;
6
+ rows?: number;
7
+ shell?: string;
8
+ }
9
+ /**
10
+ * Create and configure the MCP server with an existing terminal manager
11
+ */
12
+ export declare function createServerWithManager(manager: TerminalManager): Server;
13
+ /**
14
+ * Create and configure the MCP server with a new terminal manager
15
+ */
16
+ export declare function createServer(options?: ServerOptions): {
17
+ server: Server;
18
+ manager: TerminalManager;
19
+ };
20
+ /**
21
+ * Connect an MCP server to a transport
22
+ */
23
+ export declare function connectServer(server: Server, transport: Transport): Promise<void>;
24
+ /**
25
+ * Start the MCP server with stdio transport (legacy mode)
26
+ */
27
+ export declare function startServer(options?: ServerOptions): Promise<void>;
28
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAEnE,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAKtD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAkBxE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,eAAe,CAAC;CAC1B,CAUA;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB5E"}
package/dist/server.js ADDED
@@ -0,0 +1,59 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { TerminalManager } from "./terminal/index.js";
4
+ import { VERSION } from "./utils/version.js";
5
+ import { registerTools } from "./tools/index.js";
6
+ import { registerPrompts } from "./prompts/index.js";
7
+ /**
8
+ * Create and configure the MCP server with an existing terminal manager
9
+ */
10
+ export function createServerWithManager(manager) {
11
+ const server = new Server({
12
+ name: "brosh",
13
+ version: VERSION,
14
+ }, {
15
+ capabilities: {
16
+ tools: {},
17
+ prompts: {},
18
+ },
19
+ });
20
+ registerTools(server, manager);
21
+ registerPrompts(server);
22
+ return server;
23
+ }
24
+ /**
25
+ * Create and configure the MCP server with a new terminal manager
26
+ */
27
+ export function createServer(options = {}) {
28
+ const manager = new TerminalManager({
29
+ cols: options.cols,
30
+ rows: options.rows,
31
+ shell: options.shell,
32
+ });
33
+ const server = createServerWithManager(manager);
34
+ return { server, manager };
35
+ }
36
+ /**
37
+ * Connect an MCP server to a transport
38
+ */
39
+ export async function connectServer(server, transport) {
40
+ await server.connect(transport);
41
+ }
42
+ /**
43
+ * Start the MCP server with stdio transport (legacy mode)
44
+ */
45
+ export async function startServer(options = {}) {
46
+ const { server, manager } = createServer(options);
47
+ const transport = new StdioServerTransport();
48
+ // Handle graceful shutdown
49
+ process.on("SIGINT", () => {
50
+ manager.dispose();
51
+ process.exit(0);
52
+ });
53
+ process.on("SIGTERM", () => {
54
+ manager.dispose();
55
+ process.exit(0);
56
+ });
57
+ await server.connect(transport);
58
+ }
59
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAQrD;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAwB;IAC9D,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;QACE,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,EAAE;SACZ;KACF,CACF,CAAC;IAEF,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,eAAe,CAAC,MAAM,CAAC,CAAC;IAExB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,UAAyB,EAAE;IAItD,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC;QAClC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAEhD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,SAAoB;IACtE,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAyB,EAAE;IAC3D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { TerminalSession } from "./session.js";
2
+ export type { TerminalSessionOptions, ScreenshotResult } from "./session.js";
3
+ export { TerminalManager } from "./manager.js";
4
+ export type { TerminalManagerOptions, CreateSessionOptions, ManagedSession } from "./manager.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/terminal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { TerminalSession } from "./session.js";
2
+ export { TerminalManager } from "./manager.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/terminal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}