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 @@
1
+ {"version":3,"file":"startRecording.js","sourceRoot":"","sources":["../../src/tools/startRecording.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ import { TerminalManager } from "../terminal/index.js";
3
+ export declare const stopRecordingSchema: z.ZodObject<{
4
+ recordingId: z.ZodString;
5
+ }, "strip", z.ZodTypeAny, {
6
+ recordingId: string;
7
+ }, {
8
+ recordingId: string;
9
+ }>;
10
+ export declare const stopRecordingTool: {
11
+ name: string;
12
+ description: string;
13
+ inputSchema: {
14
+ type: "object";
15
+ properties: {
16
+ recordingId: {
17
+ type: string;
18
+ description: string;
19
+ };
20
+ };
21
+ required: string[];
22
+ };
23
+ };
24
+ export declare function handleStopRecording(manager: TerminalManager, args: unknown): Promise<{
25
+ content: Array<{
26
+ type: "text";
27
+ text: string;
28
+ }>;
29
+ isError?: boolean;
30
+ }>;
31
+ //# sourceMappingURL=stopRecording.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stopRecording.d.ts","sourceRoot":"","sources":["../../src/tools/stopRecording.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,eAAO,MAAM,mBAAmB;;;;;;EAE9B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;CAa7B,CAAC;AAEF,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CA+DhF"}
@@ -0,0 +1,76 @@
1
+ import { z } from "zod";
2
+ export const stopRecordingSchema = z.object({
3
+ recordingId: z.string(),
4
+ });
5
+ export const stopRecordingTool = {
6
+ name: "stopRecording",
7
+ description: "Stop a recording and finalize the asciicast file. Returns metadata about the saved recording including the file path and duration.",
8
+ inputSchema: {
9
+ type: "object",
10
+ properties: {
11
+ recordingId: {
12
+ type: "string",
13
+ description: "The recording ID returned by startRecording",
14
+ },
15
+ },
16
+ required: ["recordingId"],
17
+ },
18
+ };
19
+ export async function handleStopRecording(manager, args) {
20
+ const parsed = stopRecordingSchema.parse(args);
21
+ const recordingManager = manager.getRecordingManager();
22
+ const recorder = recordingManager.getRecording(parsed.recordingId);
23
+ if (!recorder) {
24
+ return {
25
+ content: [
26
+ {
27
+ type: "text",
28
+ text: `Error: Recording not found: ${parsed.recordingId}`,
29
+ },
30
+ ],
31
+ isError: true,
32
+ };
33
+ }
34
+ if (!recorder.isActive()) {
35
+ return {
36
+ content: [
37
+ {
38
+ type: "text",
39
+ text: `Error: Recording already finalized: ${parsed.recordingId}`,
40
+ },
41
+ ],
42
+ isError: true,
43
+ };
44
+ }
45
+ // Finalize with exit code 0 (explicit stop means success)
46
+ const metadata = await recordingManager.finalizeRecording(parsed.recordingId, 0, 'explicit');
47
+ if (!metadata) {
48
+ return {
49
+ content: [
50
+ {
51
+ type: "text",
52
+ text: `Error: Failed to finalize recording: ${parsed.recordingId}`,
53
+ },
54
+ ],
55
+ isError: true,
56
+ };
57
+ }
58
+ const result = {
59
+ recordingId: metadata.id,
60
+ path: metadata.path,
61
+ durationMs: metadata.durationMs,
62
+ bytesWritten: metadata.bytesWritten,
63
+ saved: metadata.saved,
64
+ mode: metadata.mode,
65
+ stopReason: metadata.stopReason,
66
+ };
67
+ return {
68
+ content: [
69
+ {
70
+ type: "text",
71
+ text: JSON.stringify(result, null, 2),
72
+ },
73
+ ],
74
+ };
75
+ }
76
+ //# sourceMappingURL=stopRecording.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stopRecording.js","sourceRoot":"","sources":["../../src/tools/stopRecording.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;CACxB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,oIAAoI;IACjJ,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,6CAA6C;aAC3D;SACF;QACD,QAAQ,EAAE,CAAC,aAAa,CAAC;KAC1B;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAwB,EACxB,IAAa;IAEb,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/C,MAAM,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IACvD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAEnE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,+BAA+B,MAAM,CAAC,WAAW,EAAE;iBAC1D;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;QACzB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,uCAAuC,MAAM,CAAC,WAAW,EAAE;iBAClE;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;IAE7F,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,wCAAwC,MAAM,CAAC,WAAW,EAAE;iBACnE;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG;QACb,WAAW,EAAE,QAAQ,CAAC,EAAE;QACxB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,CAAC;IAEF,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;aACtC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ import { TerminalManager } from "../terminal/index.js";
3
+ export declare const typeSchema: z.ZodObject<{
4
+ text: z.ZodString;
5
+ }, "strip", z.ZodTypeAny, {
6
+ text: string;
7
+ }, {
8
+ text: string;
9
+ }>;
10
+ export type TypeArgs = z.infer<typeof typeSchema>;
11
+ export declare const typeTool: {
12
+ name: string;
13
+ description: string;
14
+ inputSchema: {
15
+ type: "object";
16
+ properties: {
17
+ text: {
18
+ type: string;
19
+ description: string;
20
+ };
21
+ };
22
+ required: string[];
23
+ };
24
+ };
25
+ export declare function handleType(manager: TerminalManager, args: unknown): {
26
+ content: Array<{
27
+ type: "text";
28
+ text: string;
29
+ }>;
30
+ };
31
+ //# sourceMappingURL=type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/tools/type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,eAAO,MAAM,UAAU;;;;;;EAErB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAElD,eAAO,MAAM,QAAQ;;;;;;;;;;;;;CAapB,CAAC;AAEF,wBAAgB,UAAU,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAYtH"}
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ export const typeSchema = z.object({
3
+ text: z.string().describe("The text to type into the terminal"),
4
+ });
5
+ export const typeTool = {
6
+ name: "type",
7
+ description: "Send text input to the terminal. Text is written exactly as provided - no Enter key is sent automatically. To execute a command, use type() followed by sendKey('Enter'). Example workflow: type('ls -la') → sendKey('Enter') → getContent(). IMPORTANT: In zsh, avoid '!' inside double quotes as it triggers history expansion - use single quotes instead (e.g., echo 'Hello!' not echo \"Hello!\").",
8
+ inputSchema: {
9
+ type: "object",
10
+ properties: {
11
+ text: {
12
+ type: "string",
13
+ description: "The text to type into the terminal",
14
+ },
15
+ },
16
+ required: ["text"],
17
+ },
18
+ };
19
+ export function handleType(manager, args) {
20
+ const parsed = typeSchema.parse(args);
21
+ manager.write(parsed.text);
22
+ return {
23
+ content: [
24
+ {
25
+ type: "text",
26
+ text: `Typed ${parsed.text.length} character(s) to terminal`,
27
+ },
28
+ ],
29
+ };
30
+ }
31
+ //# sourceMappingURL=type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/tools/type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;CAChE,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,yYAAyY;IACtZ,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oCAAoC;aAClD;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;CACF,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,OAAwB,EAAE,IAAa;IAChE,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAE3B,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,MAAM,2BAA2B;aAC7D;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * GUI Communication Protocol
3
+ *
4
+ * Defines the message types for communication between the brosh backend
5
+ * and GUI frontends (Electron, web, etc.)
6
+ *
7
+ * Messages are JSON-encoded and sent over IPC (Electron) or Unix socket/WebSocket.
8
+ * Binary data (terminal output/input) is base64 encoded for JSON transport.
9
+ */
10
+ /** Send user input (keystrokes) to a terminal session */
11
+ export interface GuiInputMessage {
12
+ type: "input";
13
+ sessionId: string;
14
+ /** Base64-encoded input bytes */
15
+ data: string;
16
+ }
17
+ /** Request creation of a new terminal session */
18
+ export interface GuiCreateSessionMessage {
19
+ type: "create-session";
20
+ /** Shell to use (e.g., "/bin/zsh"). If omitted, uses system default */
21
+ shell?: string;
22
+ /** Terminal width in columns */
23
+ cols: number;
24
+ /** Terminal height in rows */
25
+ rows: number;
26
+ /** Working directory. If omitted, uses current directory */
27
+ cwd?: string;
28
+ /** Additional environment variables */
29
+ env?: Record<string, string>;
30
+ }
31
+ /** Request to close a terminal session */
32
+ export interface GuiCloseSessionMessage {
33
+ type: "close-session";
34
+ sessionId: string;
35
+ }
36
+ /** Request to resize a terminal session */
37
+ export interface GuiResizeMessage {
38
+ type: "resize";
39
+ sessionId: string;
40
+ cols: number;
41
+ rows: number;
42
+ }
43
+ /** Request to start recording a session */
44
+ export interface GuiStartRecordingMessage {
45
+ type: "start-recording";
46
+ sessionId: string;
47
+ /** Optional filename override */
48
+ filename?: string;
49
+ }
50
+ /** Request to stop recording a session */
51
+ export interface GuiStopRecordingMessage {
52
+ type: "stop-recording";
53
+ sessionId: string;
54
+ }
55
+ /** Request current terminal content (for initial sync) */
56
+ export interface GuiGetContentMessage {
57
+ type: "get-content";
58
+ sessionId: string;
59
+ }
60
+ /** Request list of active sessions */
61
+ export interface GuiListSessionsMessage {
62
+ type: "list-sessions";
63
+ }
64
+ /** Union type of all messages from GUI to backend */
65
+ export type GuiMessageToBackend = GuiInputMessage | GuiCreateSessionMessage | GuiCloseSessionMessage | GuiResizeMessage | GuiStartRecordingMessage | GuiStopRecordingMessage | GuiGetContentMessage | GuiListSessionsMessage;
66
+ /** Raw terminal output data */
67
+ export interface BackendOutputMessage {
68
+ type: "output";
69
+ sessionId: string;
70
+ /** Base64-encoded output bytes */
71
+ data: string;
72
+ }
73
+ /** Notification that a new session was created */
74
+ export interface BackendSessionCreatedMessage {
75
+ type: "session-created";
76
+ sessionId: string;
77
+ shell: string;
78
+ cols: number;
79
+ rows: number;
80
+ cwd: string;
81
+ }
82
+ /** Notification that a session was closed */
83
+ export interface BackendSessionClosedMessage {
84
+ type: "session-closed";
85
+ sessionId: string;
86
+ exitCode: number;
87
+ }
88
+ /** Notification that a session was resized */
89
+ export interface BackendResizeMessage {
90
+ type: "resize";
91
+ sessionId: string;
92
+ cols: number;
93
+ rows: number;
94
+ }
95
+ /** Notification that recording started */
96
+ export interface BackendRecordingStartedMessage {
97
+ type: "recording-started";
98
+ sessionId: string;
99
+ filename: string;
100
+ }
101
+ /** Notification that recording stopped */
102
+ export interface BackendRecordingStoppedMessage {
103
+ type: "recording-stopped";
104
+ sessionId: string;
105
+ filename: string;
106
+ /** Whether the recording was saved (vs discarded due to mode) */
107
+ saved: boolean;
108
+ }
109
+ /** Response to get-content request */
110
+ export interface BackendContentMessage {
111
+ type: "content";
112
+ sessionId: string;
113
+ /** Full terminal buffer content */
114
+ content: string;
115
+ cursor: {
116
+ x: number;
117
+ y: number;
118
+ };
119
+ dimensions: {
120
+ cols: number;
121
+ rows: number;
122
+ };
123
+ }
124
+ /** Response to list-sessions request */
125
+ export interface BackendSessionListMessage {
126
+ type: "session-list";
127
+ sessions: Array<{
128
+ sessionId: string;
129
+ shell: string;
130
+ cols: number;
131
+ rows: number;
132
+ cwd: string;
133
+ isRecording: boolean;
134
+ }>;
135
+ }
136
+ /** Error response */
137
+ export interface BackendErrorMessage {
138
+ type: "error";
139
+ /** Original request type that caused the error */
140
+ requestType: string;
141
+ sessionId?: string;
142
+ message: string;
143
+ code?: string;
144
+ }
145
+ /** Union type of all messages from backend to GUI */
146
+ export type GuiMessageToFrontend = BackendOutputMessage | BackendSessionCreatedMessage | BackendSessionClosedMessage | BackendResizeMessage | BackendRecordingStartedMessage | BackendRecordingStoppedMessage | BackendContentMessage | BackendSessionListMessage | BackendErrorMessage;
147
+ /**
148
+ * Encode a string to base64 for transport
149
+ */
150
+ export declare function encodeData(data: string): string;
151
+ /**
152
+ * Decode base64 data back to string
153
+ */
154
+ export declare function decodeData(base64: string): string;
155
+ /**
156
+ * Type guard for GUI messages to backend
157
+ */
158
+ export declare function isGuiMessageToBackend(msg: unknown): msg is GuiMessageToBackend;
159
+ /**
160
+ * Type guard for backend messages to GUI
161
+ */
162
+ export declare function isGuiMessageToFrontend(msg: unknown): msg is GuiMessageToFrontend;
163
+ //# sourceMappingURL=gui-protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gui-protocol.d.ts","sourceRoot":"","sources":["../../src/transport/gui-protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * GUI Communication Protocol
3
+ *
4
+ * Defines the message types for communication between the brosh backend
5
+ * and GUI frontends (Electron, web, etc.)
6
+ *
7
+ * Messages are JSON-encoded and sent over IPC (Electron) or Unix socket/WebSocket.
8
+ * Binary data (terminal output/input) is base64 encoded for JSON transport.
9
+ */
10
+ // ============================================================================
11
+ // Utility Functions
12
+ // ============================================================================
13
+ /**
14
+ * Encode a string to base64 for transport
15
+ */
16
+ export function encodeData(data) {
17
+ return Buffer.from(data, "utf-8").toString("base64");
18
+ }
19
+ /**
20
+ * Decode base64 data back to string
21
+ */
22
+ export function decodeData(base64) {
23
+ return Buffer.from(base64, "base64").toString("utf-8");
24
+ }
25
+ /**
26
+ * Type guard for GUI messages to backend
27
+ */
28
+ export function isGuiMessageToBackend(msg) {
29
+ if (typeof msg !== "object" || msg === null)
30
+ return false;
31
+ const m = msg;
32
+ if (typeof m.type !== "string")
33
+ return false;
34
+ const validTypes = [
35
+ "input",
36
+ "create-session",
37
+ "close-session",
38
+ "resize",
39
+ "start-recording",
40
+ "stop-recording",
41
+ "get-content",
42
+ "list-sessions",
43
+ ];
44
+ return validTypes.includes(m.type);
45
+ }
46
+ /**
47
+ * Type guard for backend messages to GUI
48
+ */
49
+ export function isGuiMessageToFrontend(msg) {
50
+ if (typeof msg !== "object" || msg === null)
51
+ return false;
52
+ const m = msg;
53
+ if (typeof m.type !== "string")
54
+ return false;
55
+ const validTypes = [
56
+ "output",
57
+ "session-created",
58
+ "session-closed",
59
+ "resize",
60
+ "recording-started",
61
+ "recording-stopped",
62
+ "content",
63
+ "session-list",
64
+ "error",
65
+ ];
66
+ return validTypes.includes(m.type);
67
+ }
68
+ //# sourceMappingURL=gui-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gui-protocol.js","sourceRoot":"","sources":["../../src/transport/gui-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAuLH,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAY;IAChD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,CAAC,GAAG,GAA8B,CAAC;IACzC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE7C,MAAM,UAAU,GAAG;QACjB,OAAO;QACP,gBAAgB;QAChB,eAAe;QACf,QAAQ;QACR,iBAAiB;QACjB,gBAAgB;QAChB,aAAa;QACb,eAAe;KAChB,CAAC;IAEF,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,CAAC,GAAG,GAA8B,CAAC;IACzC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE7C,MAAM,UAAU,GAAG;QACjB,QAAQ;QACR,iBAAiB;QACjB,gBAAgB;QAChB,QAAQ;QACR,mBAAmB;QACnB,mBAAmB;QACnB,SAAS;QACT,cAAc;QACd,OAAO;KACR,CAAC;IAEF,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * GUI Output Stream
3
+ *
4
+ * Manages connections from GUI clients and broadcasts terminal events to them.
5
+ * Supports multiple concurrent GUI clients (e.g., multiple Electron windows).
6
+ *
7
+ * This module provides the bridge between brosh's core PTY handling
8
+ * and GUI frontends like Electron.
9
+ */
10
+ import { EventEmitter } from "events";
11
+ import type { GuiMessageToFrontend, GuiMessageToBackend } from "./gui-protocol.js";
12
+ import type { TerminalManager } from "../terminal/index.js";
13
+ import type { TerminalSession } from "../terminal/session.js";
14
+ /** Callback type for sending messages to a GUI client */
15
+ export type GuiClientCallback = (message: GuiMessageToFrontend) => void;
16
+ /** Events emitted by GUIOutputStream */
17
+ export interface GUIOutputStreamEvents {
18
+ "client-connected": (clientId: string) => void;
19
+ "client-disconnected": (clientId: string) => void;
20
+ error: (error: Error) => void;
21
+ }
22
+ /**
23
+ * Manages GUI client connections and routes messages between
24
+ * terminal sessions and GUI frontends.
25
+ *
26
+ * Currently works with TerminalManager's single-session model.
27
+ * Multi-session support will be added when TerminalManager is extended.
28
+ */
29
+ export declare class GUIOutputStream extends EventEmitter {
30
+ private clients;
31
+ private sessionSubscriptions;
32
+ private manager;
33
+ private clientCounter;
34
+ private sessionEventsBound;
35
+ constructor();
36
+ /**
37
+ * Attach a TerminalManager to handle session operations
38
+ */
39
+ attachManager(manager: TerminalManager): void;
40
+ /**
41
+ * Add a GUI client connection
42
+ * @returns clientId for this connection
43
+ */
44
+ addClient(callback: GuiClientCallback): string;
45
+ /**
46
+ * Remove a GUI client connection
47
+ */
48
+ removeClient(clientId: string): void;
49
+ /**
50
+ * Get the number of connected clients
51
+ */
52
+ getClientCount(): number;
53
+ /**
54
+ * Send a message to a specific client
55
+ */
56
+ sendToClient(clientId: string, message: GuiMessageToFrontend): void;
57
+ /**
58
+ * Broadcast a message to all connected clients
59
+ */
60
+ broadcast(message: GuiMessageToFrontend): void;
61
+ /**
62
+ * Broadcast a message to clients subscribed to a specific session
63
+ */
64
+ broadcastToSession(sessionId: string, message: GuiMessageToFrontend): void;
65
+ /**
66
+ * Subscribe a client to a session's events
67
+ */
68
+ subscribeToSession(clientId: string, sessionId: string): void;
69
+ /**
70
+ * Unsubscribe a client from a session's events
71
+ */
72
+ unsubscribeFromSession(clientId: string, sessionId: string): void;
73
+ /**
74
+ * Emit terminal output to subscribed GUI clients
75
+ */
76
+ emitOutput(sessionId: string, data: string): void;
77
+ /**
78
+ * Emit session created event
79
+ */
80
+ emitSessionCreated(sessionId: string, shell: string, cols: number, rows: number, cwd: string): void;
81
+ /**
82
+ * Emit session closed event
83
+ */
84
+ emitSessionClosed(sessionId: string, exitCode: number): void;
85
+ /**
86
+ * Emit resize event
87
+ */
88
+ emitResize(sessionId: string, cols: number, rows: number): void;
89
+ /**
90
+ * Emit recording started event
91
+ */
92
+ emitRecordingStarted(sessionId: string, filename: string): void;
93
+ /**
94
+ * Emit recording stopped event
95
+ */
96
+ emitRecordingStopped(sessionId: string, filename: string, saved: boolean): void;
97
+ /**
98
+ * Handle an incoming message from a GUI client
99
+ */
100
+ handleMessage(clientId: string, message: GuiMessageToBackend): Promise<void>;
101
+ /**
102
+ * Handle create-session request
103
+ * Currently uses TerminalManager's single-session model
104
+ */
105
+ private handleCreateSession;
106
+ /**
107
+ * Handle close-session request
108
+ */
109
+ private handleCloseSession;
110
+ /**
111
+ * Handle input message
112
+ */
113
+ private handleInput;
114
+ /**
115
+ * Handle resize message
116
+ */
117
+ private handleResize;
118
+ /**
119
+ * Handle get-content request
120
+ */
121
+ private handleGetContent;
122
+ /**
123
+ * Handle list-sessions request
124
+ */
125
+ private handleListSessions;
126
+ /**
127
+ * Set up event forwarding from a session to GUI clients
128
+ */
129
+ setupSessionEventForwarding(session: TerminalSession): void;
130
+ /**
131
+ * Dispose of all connections
132
+ */
133
+ dispose(): void;
134
+ }
135
+ /**
136
+ * Create a GUIOutputStream instance attached to a manager
137
+ */
138
+ export declare function createGUIOutputStream(manager: TerminalManager): GUIOutputStream;
139
+ //# sourceMappingURL=gui-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gui-stream.d.ts","sourceRoot":"","sources":["../../src/transport/gui-stream.ts"],"names":[],"mappings":"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"}