groove-dev 0.16.1 → 0.16.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 (203) hide show
  1. package/node_modules/@groove-dev/daemon/src/index.js +25 -7
  2. package/node_modules/@groove-dev/daemon/src/terminal-pty.js +129 -0
  3. package/node_modules/@groove-dev/gui/dist/assets/{index-Gfb8Zxy9.css → index-BhjOFLBc.css} +32 -1
  4. package/node_modules/@groove-dev/gui/dist/assets/index-DeXW9EFU.js +153 -0
  5. package/node_modules/@groove-dev/gui/dist/index.html +2 -2
  6. package/node_modules/@groove-dev/gui/package.json +3 -0
  7. package/node_modules/@groove-dev/gui/src/components/EditorTabs.jsx +1 -1
  8. package/node_modules/@groove-dev/gui/src/components/FileTree.jsx +0 -14
  9. package/node_modules/@groove-dev/gui/src/components/Terminal.jsx +154 -0
  10. package/node_modules/@groove-dev/gui/src/views/FileEditor.jsx +100 -39
  11. package/node_modules/@xterm/addon-fit/LICENSE +19 -0
  12. package/node_modules/@xterm/addon-fit/README.md +24 -0
  13. package/node_modules/@xterm/addon-fit/lib/addon-fit.js +2 -0
  14. package/node_modules/@xterm/addon-fit/lib/addon-fit.js.map +1 -0
  15. package/node_modules/@xterm/addon-fit/lib/addon-fit.mjs +18 -0
  16. package/node_modules/@xterm/addon-fit/lib/addon-fit.mjs.map +7 -0
  17. package/node_modules/@xterm/addon-fit/package.json +26 -0
  18. package/node_modules/@xterm/addon-fit/src/FitAddon.ts +92 -0
  19. package/node_modules/@xterm/addon-fit/typings/addon-fit.d.ts +55 -0
  20. package/node_modules/@xterm/addon-web-links/LICENSE +19 -0
  21. package/node_modules/@xterm/addon-web-links/README.md +21 -0
  22. package/node_modules/@xterm/addon-web-links/lib/addon-web-links.js +2 -0
  23. package/node_modules/@xterm/addon-web-links/lib/addon-web-links.js.map +1 -0
  24. package/node_modules/@xterm/addon-web-links/lib/addon-web-links.mjs +18 -0
  25. package/node_modules/@xterm/addon-web-links/lib/addon-web-links.mjs.map +7 -0
  26. package/node_modules/@xterm/addon-web-links/package.json +26 -0
  27. package/node_modules/@xterm/addon-web-links/src/WebLinkProvider.ts +199 -0
  28. package/node_modules/@xterm/addon-web-links/src/WebLinksAddon.ts +58 -0
  29. package/node_modules/@xterm/addon-web-links/typings/addon-web-links.d.ts +57 -0
  30. package/node_modules/@xterm/xterm/LICENSE +21 -0
  31. package/node_modules/@xterm/xterm/README.md +243 -0
  32. package/node_modules/@xterm/xterm/css/xterm.css +285 -0
  33. package/node_modules/@xterm/xterm/lib/xterm.js +2 -0
  34. package/node_modules/@xterm/xterm/lib/xterm.js.map +1 -0
  35. package/node_modules/@xterm/xterm/lib/xterm.mjs +53 -0
  36. package/node_modules/@xterm/xterm/lib/xterm.mjs.map +7 -0
  37. package/node_modules/@xterm/xterm/package.json +111 -0
  38. package/node_modules/@xterm/xterm/src/browser/AccessibilityManager.ts +435 -0
  39. package/node_modules/@xterm/xterm/src/browser/Clipboard.ts +93 -0
  40. package/node_modules/@xterm/xterm/src/browser/ColorContrastCache.ts +34 -0
  41. package/node_modules/@xterm/xterm/src/browser/CoreBrowserTerminal.ts +1339 -0
  42. package/node_modules/@xterm/xterm/src/browser/Linkifier.ts +403 -0
  43. package/node_modules/@xterm/xterm/src/browser/LocalizableStrings.ts +23 -0
  44. package/node_modules/@xterm/xterm/src/browser/OscLinkProvider.ts +129 -0
  45. package/node_modules/@xterm/xterm/src/browser/RenderDebouncer.ts +84 -0
  46. package/node_modules/@xterm/xterm/src/browser/TimeBasedDebouncer.ts +86 -0
  47. package/node_modules/@xterm/xterm/src/browser/Types.ts +226 -0
  48. package/node_modules/@xterm/xterm/src/browser/Viewport.ts +192 -0
  49. package/node_modules/@xterm/xterm/src/browser/decorations/BufferDecorationRenderer.ts +139 -0
  50. package/node_modules/@xterm/xterm/src/browser/decorations/ColorZoneStore.ts +117 -0
  51. package/node_modules/@xterm/xterm/src/browser/decorations/OverviewRulerRenderer.ts +214 -0
  52. package/node_modules/@xterm/xterm/src/browser/input/CompositionHelper.ts +248 -0
  53. package/node_modules/@xterm/xterm/src/browser/input/Mouse.ts +54 -0
  54. package/node_modules/@xterm/xterm/src/browser/input/MoveToCell.ts +251 -0
  55. package/node_modules/@xterm/xterm/src/browser/public/Terminal.ts +275 -0
  56. package/node_modules/@xterm/xterm/src/browser/renderer/dom/DomRenderer.ts +542 -0
  57. package/node_modules/@xterm/xterm/src/browser/renderer/dom/DomRendererRowFactory.ts +546 -0
  58. package/node_modules/@xterm/xterm/src/browser/renderer/dom/WidthCache.ts +167 -0
  59. package/node_modules/@xterm/xterm/src/browser/renderer/shared/Constants.ts +6 -0
  60. package/node_modules/@xterm/xterm/src/browser/renderer/shared/RendererUtils.ts +95 -0
  61. package/node_modules/@xterm/xterm/src/browser/renderer/shared/SelectionRenderModel.ts +93 -0
  62. package/node_modules/@xterm/xterm/src/browser/renderer/shared/Types.ts +84 -0
  63. package/node_modules/@xterm/xterm/src/browser/selection/SelectionModel.ts +144 -0
  64. package/node_modules/@xterm/xterm/src/browser/selection/Types.ts +15 -0
  65. package/node_modules/@xterm/xterm/src/browser/services/CharSizeService.ts +127 -0
  66. package/node_modules/@xterm/xterm/src/browser/services/CharacterJoinerService.ts +339 -0
  67. package/node_modules/@xterm/xterm/src/browser/services/CoreBrowserService.ts +137 -0
  68. package/node_modules/@xterm/xterm/src/browser/services/LinkProviderService.ts +28 -0
  69. package/node_modules/@xterm/xterm/src/browser/services/MouseService.ts +46 -0
  70. package/node_modules/@xterm/xterm/src/browser/services/RenderService.ts +376 -0
  71. package/node_modules/@xterm/xterm/src/browser/services/SelectionService.ts +1039 -0
  72. package/node_modules/@xterm/xterm/src/browser/services/Services.ts +158 -0
  73. package/node_modules/@xterm/xterm/src/browser/services/ThemeService.ts +198 -0
  74. package/node_modules/@xterm/xterm/src/browser/shared/Constants.ts +8 -0
  75. package/node_modules/@xterm/xterm/src/common/CircularList.ts +241 -0
  76. package/node_modules/@xterm/xterm/src/common/Clone.ts +23 -0
  77. package/node_modules/@xterm/xterm/src/common/Color.ts +376 -0
  78. package/node_modules/@xterm/xterm/src/common/CoreTerminal.ts +283 -0
  79. package/node_modules/@xterm/xterm/src/common/InputHandler.ts +3495 -0
  80. package/node_modules/@xterm/xterm/src/common/MultiKeyMap.ts +42 -0
  81. package/node_modules/@xterm/xterm/src/common/Platform.ts +44 -0
  82. package/node_modules/@xterm/xterm/src/common/SortedList.ts +194 -0
  83. package/node_modules/@xterm/xterm/src/common/TaskQueue.ts +166 -0
  84. package/node_modules/@xterm/xterm/src/common/TypedArrayUtils.ts +17 -0
  85. package/node_modules/@xterm/xterm/src/common/Types.ts +552 -0
  86. package/node_modules/@xterm/xterm/src/common/WindowsMode.ts +27 -0
  87. package/node_modules/@xterm/xterm/src/common/buffer/AttributeData.ts +211 -0
  88. package/node_modules/@xterm/xterm/src/common/buffer/Buffer.ts +662 -0
  89. package/node_modules/@xterm/xterm/src/common/buffer/BufferLine.ts +551 -0
  90. package/node_modules/@xterm/xterm/src/common/buffer/BufferRange.ts +13 -0
  91. package/node_modules/@xterm/xterm/src/common/buffer/BufferReflow.ts +226 -0
  92. package/node_modules/@xterm/xterm/src/common/buffer/BufferSet.ts +134 -0
  93. package/node_modules/@xterm/xterm/src/common/buffer/CellData.ts +94 -0
  94. package/node_modules/@xterm/xterm/src/common/buffer/Constants.ts +157 -0
  95. package/node_modules/@xterm/xterm/src/common/buffer/Marker.ts +43 -0
  96. package/node_modules/@xterm/xterm/src/common/buffer/Types.ts +52 -0
  97. package/node_modules/@xterm/xterm/src/common/data/Charsets.ts +256 -0
  98. package/node_modules/@xterm/xterm/src/common/data/EscapeSequences.ts +153 -0
  99. package/node_modules/@xterm/xterm/src/common/input/Keyboard.ts +373 -0
  100. package/node_modules/@xterm/xterm/src/common/input/TextDecoder.ts +346 -0
  101. package/node_modules/@xterm/xterm/src/common/input/UnicodeV6.ts +145 -0
  102. package/node_modules/@xterm/xterm/src/common/input/WriteBuffer.ts +247 -0
  103. package/node_modules/@xterm/xterm/src/common/input/XParseColor.ts +80 -0
  104. package/node_modules/@xterm/xterm/src/common/parser/Constants.ts +58 -0
  105. package/node_modules/@xterm/xterm/src/common/parser/DcsParser.ts +192 -0
  106. package/node_modules/@xterm/xterm/src/common/parser/EscapeSequenceParser.ts +792 -0
  107. package/node_modules/@xterm/xterm/src/common/parser/OscParser.ts +238 -0
  108. package/node_modules/@xterm/xterm/src/common/parser/Params.ts +229 -0
  109. package/node_modules/@xterm/xterm/src/common/parser/Types.ts +275 -0
  110. package/node_modules/@xterm/xterm/src/common/public/AddonManager.ts +53 -0
  111. package/node_modules/@xterm/xterm/src/common/public/BufferApiView.ts +35 -0
  112. package/node_modules/@xterm/xterm/src/common/public/BufferLineApiView.ts +29 -0
  113. package/node_modules/@xterm/xterm/src/common/public/BufferNamespaceApi.ts +36 -0
  114. package/node_modules/@xterm/xterm/src/common/public/ParserApi.ts +37 -0
  115. package/node_modules/@xterm/xterm/src/common/public/UnicodeApi.ts +27 -0
  116. package/node_modules/@xterm/xterm/src/common/services/BufferService.ts +154 -0
  117. package/node_modules/@xterm/xterm/src/common/services/CharsetService.ts +34 -0
  118. package/node_modules/@xterm/xterm/src/common/services/CoreMouseService.ts +365 -0
  119. package/node_modules/@xterm/xterm/src/common/services/CoreService.ts +92 -0
  120. package/node_modules/@xterm/xterm/src/common/services/DecorationService.ts +140 -0
  121. package/node_modules/@xterm/xterm/src/common/services/InstantiationService.ts +85 -0
  122. package/node_modules/@xterm/xterm/src/common/services/LogService.ts +124 -0
  123. package/node_modules/@xterm/xterm/src/common/services/OptionsService.ts +212 -0
  124. package/node_modules/@xterm/xterm/src/common/services/OscLinkService.ts +115 -0
  125. package/node_modules/@xterm/xterm/src/common/services/ServiceRegistry.ts +49 -0
  126. package/node_modules/@xterm/xterm/src/common/services/Services.ts +396 -0
  127. package/node_modules/@xterm/xterm/src/common/services/UnicodeService.ts +111 -0
  128. package/node_modules/@xterm/xterm/src/vs/base/browser/browser.ts +141 -0
  129. package/node_modules/@xterm/xterm/src/vs/base/browser/canIUse.ts +49 -0
  130. package/node_modules/@xterm/xterm/src/vs/base/browser/dom.ts +2369 -0
  131. package/node_modules/@xterm/xterm/src/vs/base/browser/fastDomNode.ts +316 -0
  132. package/node_modules/@xterm/xterm/src/vs/base/browser/globalPointerMoveMonitor.ts +112 -0
  133. package/node_modules/@xterm/xterm/src/vs/base/browser/iframe.ts +135 -0
  134. package/node_modules/@xterm/xterm/src/vs/base/browser/keyboardEvent.ts +213 -0
  135. package/node_modules/@xterm/xterm/src/vs/base/browser/mouseEvent.ts +229 -0
  136. package/node_modules/@xterm/xterm/src/vs/base/browser/touch.ts +372 -0
  137. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +303 -0
  138. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts +114 -0
  139. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +720 -0
  140. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollableElementOptions.ts +165 -0
  141. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts +114 -0
  142. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarState.ts +243 -0
  143. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts +118 -0
  144. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts +116 -0
  145. package/node_modules/@xterm/xterm/src/vs/base/browser/ui/widget.ts +57 -0
  146. package/node_modules/@xterm/xterm/src/vs/base/browser/window.ts +14 -0
  147. package/node_modules/@xterm/xterm/src/vs/base/common/arrays.ts +887 -0
  148. package/node_modules/@xterm/xterm/src/vs/base/common/arraysFind.ts +202 -0
  149. package/node_modules/@xterm/xterm/src/vs/base/common/assert.ts +71 -0
  150. package/node_modules/@xterm/xterm/src/vs/base/common/async.ts +1992 -0
  151. package/node_modules/@xterm/xterm/src/vs/base/common/cancellation.ts +148 -0
  152. package/node_modules/@xterm/xterm/src/vs/base/common/charCode.ts +450 -0
  153. package/node_modules/@xterm/xterm/src/vs/base/common/collections.ts +140 -0
  154. package/node_modules/@xterm/xterm/src/vs/base/common/decorators.ts +130 -0
  155. package/node_modules/@xterm/xterm/src/vs/base/common/equals.ts +146 -0
  156. package/node_modules/@xterm/xterm/src/vs/base/common/errors.ts +303 -0
  157. package/node_modules/@xterm/xterm/src/vs/base/common/event.ts +1778 -0
  158. package/node_modules/@xterm/xterm/src/vs/base/common/functional.ts +32 -0
  159. package/node_modules/@xterm/xterm/src/vs/base/common/hash.ts +316 -0
  160. package/node_modules/@xterm/xterm/src/vs/base/common/iterator.ts +159 -0
  161. package/node_modules/@xterm/xterm/src/vs/base/common/keyCodes.ts +526 -0
  162. package/node_modules/@xterm/xterm/src/vs/base/common/keybindings.ts +284 -0
  163. package/node_modules/@xterm/xterm/src/vs/base/common/lazy.ts +47 -0
  164. package/node_modules/@xterm/xterm/src/vs/base/common/lifecycle.ts +801 -0
  165. package/node_modules/@xterm/xterm/src/vs/base/common/linkedList.ts +142 -0
  166. package/node_modules/@xterm/xterm/src/vs/base/common/map.ts +202 -0
  167. package/node_modules/@xterm/xterm/src/vs/base/common/numbers.ts +98 -0
  168. package/node_modules/@xterm/xterm/src/vs/base/common/observable.ts +76 -0
  169. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/api.ts +31 -0
  170. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/autorun.ts +281 -0
  171. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/base.ts +489 -0
  172. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/debugName.ts +145 -0
  173. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/derived.ts +428 -0
  174. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/lazyObservableValue.ts +146 -0
  175. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/logging.ts +328 -0
  176. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/promise.ts +209 -0
  177. package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/utils.ts +610 -0
  178. package/node_modules/@xterm/xterm/src/vs/base/common/platform.ts +281 -0
  179. package/node_modules/@xterm/xterm/src/vs/base/common/scrollable.ts +522 -0
  180. package/node_modules/@xterm/xterm/src/vs/base/common/sequence.ts +34 -0
  181. package/node_modules/@xterm/xterm/src/vs/base/common/stopwatch.ts +43 -0
  182. package/node_modules/@xterm/xterm/src/vs/base/common/strings.ts +557 -0
  183. package/node_modules/@xterm/xterm/src/vs/base/common/symbols.ts +9 -0
  184. package/node_modules/@xterm/xterm/src/vs/base/common/uint.ts +59 -0
  185. package/node_modules/@xterm/xterm/src/vs/patches/nls.ts +90 -0
  186. package/node_modules/@xterm/xterm/src/vs/typings/base-common.d.ts +20 -0
  187. package/node_modules/@xterm/xterm/src/vs/typings/require.d.ts +42 -0
  188. package/node_modules/@xterm/xterm/src/vs/typings/vscode-globals-nls.d.ts +36 -0
  189. package/node_modules/@xterm/xterm/src/vs/typings/vscode-globals-product.d.ts +33 -0
  190. package/node_modules/@xterm/xterm/typings/xterm.d.ts +1957 -0
  191. package/package.json +1 -1
  192. package/packages/daemon/src/index.js +25 -7
  193. package/packages/daemon/src/terminal-pty.js +129 -0
  194. package/packages/gui/dist/assets/{index-Gfb8Zxy9.css → index-BhjOFLBc.css} +32 -1
  195. package/packages/gui/dist/assets/index-DeXW9EFU.js +153 -0
  196. package/packages/gui/dist/index.html +2 -2
  197. package/packages/gui/package.json +3 -0
  198. package/packages/gui/src/components/EditorTabs.jsx +1 -1
  199. package/packages/gui/src/components/FileTree.jsx +0 -14
  200. package/packages/gui/src/components/Terminal.jsx +154 -0
  201. package/packages/gui/src/views/FileEditor.jsx +100 -39
  202. package/node_modules/@groove-dev/gui/dist/assets/index-BQSznoq0.js +0 -103
  203. package/packages/gui/dist/assets/index-BQSznoq0.js +0 -103
@@ -29,6 +29,7 @@ import { AuditLogger } from './audit.js';
29
29
  import { Federation } from './federation.js';
30
30
  import { SkillStore } from './skills.js';
31
31
  import { FileWatcher } from './filewatcher.js';
32
+ import { TerminalManager } from './terminal-pty.js';
32
33
  import { isFirstRun, runFirstTimeSetup, loadConfig, saveConfig, printWelcome } from './firstrun.js';
33
34
 
34
35
  const DEFAULT_PORT = 31415;
@@ -119,6 +120,7 @@ export class Daemon {
119
120
  this.federation = new Federation(this);
120
121
  this.skills = new SkillStore(this);
121
122
  this.fileWatcher = new FileWatcher(this);
123
+ this.terminalManager = new TerminalManager(this);
122
124
 
123
125
  // HTTP + WebSocket server
124
126
  this.app = express();
@@ -162,12 +164,26 @@ export class Daemon {
162
164
  ws.on('message', (raw) => {
163
165
  try {
164
166
  const msg = JSON.parse(raw);
165
- if (msg.type === 'editor:watch' && msg.path) {
166
- this.fileWatcher.watch(msg.path);
167
- watchedFiles.add(msg.path);
168
- } else if (msg.type === 'editor:unwatch' && msg.path) {
169
- this.fileWatcher.unwatch(msg.path);
170
- watchedFiles.delete(msg.path);
167
+ switch (msg.type) {
168
+ // File editor
169
+ case 'editor:watch':
170
+ if (msg.path) { this.fileWatcher.watch(msg.path); watchedFiles.add(msg.path); }
171
+ break;
172
+ case 'editor:unwatch':
173
+ if (msg.path) { this.fileWatcher.unwatch(msg.path); watchedFiles.delete(msg.path); }
174
+ break;
175
+ // Terminal
176
+ case 'terminal:spawn': {
177
+ const id = this.terminalManager.spawn(ws, { cwd: msg.cwd });
178
+ ws.send(JSON.stringify({ type: 'terminal:spawned', id }));
179
+ break;
180
+ }
181
+ case 'terminal:input':
182
+ if (msg.id && msg.data) this.terminalManager.write(msg.id, msg.data);
183
+ break;
184
+ case 'terminal:kill':
185
+ if (msg.id) this.terminalManager.kill(msg.id);
186
+ break;
171
187
  }
172
188
  } catch { /* ignore malformed messages */ }
173
189
  });
@@ -176,6 +192,7 @@ export class Daemon {
176
192
  for (const path of watchedFiles) {
177
193
  this.fileWatcher.unwatch(path);
178
194
  }
195
+ this.terminalManager.cleanupClient(ws);
179
196
  });
180
197
  });
181
198
 
@@ -274,8 +291,9 @@ export class Daemon {
274
291
  this.journalist.stop();
275
292
  this.rotator.stop();
276
293
 
277
- // Clean up file watchers
294
+ // Clean up file watchers and terminal sessions
278
295
  this.fileWatcher.unwatchAll();
296
+ this.terminalManager.killAll();
279
297
 
280
298
  // Kill all agent processes
281
299
  await this.processes.killAll();
@@ -0,0 +1,129 @@
1
+ // GROOVE — Terminal PTY Manager (shell sessions over WebSocket)
2
+ // FSL-1.1-Apache-2.0 — see LICENSE
3
+
4
+ import { spawn } from 'child_process';
5
+ import { existsSync } from 'fs';
6
+
7
+ /**
8
+ * Manages interactive shell sessions for the GUI terminal.
9
+ * Uses child_process.spawn with pipe stdio + TERM=xterm-256color
10
+ * so most CLI tools produce colored output.
11
+ */
12
+ export class TerminalManager {
13
+ constructor(daemon) {
14
+ this.daemon = daemon;
15
+ this.sessions = new Map(); // sessionId → { proc, ws }
16
+ this.counter = 0;
17
+ }
18
+
19
+ /**
20
+ * Spawn a new shell session connected to a specific WebSocket client.
21
+ */
22
+ spawn(ws, options = {}) {
23
+ const id = `term-${++this.counter}`;
24
+ const shell = this._detectShell();
25
+ const cwd = options.cwd || this.daemon.projectDir;
26
+
27
+ const proc = spawn(shell, ['-l'], {
28
+ cwd,
29
+ env: {
30
+ ...process.env,
31
+ TERM: 'xterm-256color',
32
+ COLORTERM: 'truecolor',
33
+ LANG: process.env.LANG || 'en_US.UTF-8',
34
+ // Remove NODE_CHANNEL_FD to prevent child confusion
35
+ NODE_CHANNEL_FD: undefined,
36
+ },
37
+ stdio: ['pipe', 'pipe', 'pipe'],
38
+ });
39
+
40
+ const session = { proc, ws, id };
41
+ this.sessions.set(id, session);
42
+
43
+ // Relay stdout → WS
44
+ proc.stdout.on('data', (data) => {
45
+ if (ws.readyState === 1) {
46
+ ws.send(JSON.stringify({ type: 'terminal:output', id, data: data.toString('utf8') }));
47
+ }
48
+ });
49
+
50
+ // Relay stderr → WS (merge with stdout)
51
+ proc.stderr.on('data', (data) => {
52
+ if (ws.readyState === 1) {
53
+ ws.send(JSON.stringify({ type: 'terminal:output', id, data: data.toString('utf8') }));
54
+ }
55
+ });
56
+
57
+ proc.on('exit', (code) => {
58
+ if (ws.readyState === 1) {
59
+ ws.send(JSON.stringify({ type: 'terminal:exit', id, code }));
60
+ }
61
+ this.sessions.delete(id);
62
+ });
63
+
64
+ proc.on('error', (err) => {
65
+ if (ws.readyState === 1) {
66
+ ws.send(JSON.stringify({ type: 'terminal:output', id, data: `\r\nShell error: ${err.message}\r\n` }));
67
+ }
68
+ this.sessions.delete(id);
69
+ });
70
+
71
+ return id;
72
+ }
73
+
74
+ /**
75
+ * Write input to a terminal session.
76
+ */
77
+ write(id, data) {
78
+ const session = this.sessions.get(id);
79
+ if (!session || !session.proc.stdin.writable) return;
80
+ session.proc.stdin.write(data);
81
+ }
82
+
83
+ /**
84
+ * Kill a terminal session.
85
+ */
86
+ kill(id) {
87
+ const session = this.sessions.get(id);
88
+ if (!session) return;
89
+ try {
90
+ session.proc.kill('SIGTERM');
91
+ setTimeout(() => {
92
+ try { session.proc.kill('SIGKILL'); } catch { /* already dead */ }
93
+ }, 1000);
94
+ } catch { /* already dead */ }
95
+ this.sessions.delete(id);
96
+ }
97
+
98
+ /**
99
+ * Kill all sessions (daemon shutdown).
100
+ */
101
+ killAll() {
102
+ for (const [id] of this.sessions) {
103
+ this.kill(id);
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Clean up sessions for a disconnected WS client.
109
+ */
110
+ cleanupClient(ws) {
111
+ for (const [id, session] of this.sessions) {
112
+ if (session.ws === ws) {
113
+ this.kill(id);
114
+ }
115
+ }
116
+ }
117
+
118
+ _detectShell() {
119
+ // Prefer user's shell, fall back to common ones
120
+ if (process.env.SHELL && existsSync(process.env.SHELL)) {
121
+ return process.env.SHELL;
122
+ }
123
+ const candidates = ['/bin/zsh', '/bin/bash', '/bin/sh'];
124
+ for (const sh of candidates) {
125
+ if (existsSync(sh)) return sh;
126
+ }
127
+ return 'sh';
128
+ }
129
+ }
@@ -1 +1,32 @@
1
- @import"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700;800&display=swap";:root{--bg-base: #24282f;--bg-chrome: #282c34;--bg-surface: #2c313a;--bg-hover: #333842;--bg-active: #3a3f4b;--text-primary: #abb2bf;--text-bright: #e6e6e6;--text-dim: #7a8394;--text-muted: #5c6370;--border: #4b5263;--accent: #33afbc;--green: #4ae168;--amber: #e5c07b;--red: #e06c75;--purple: #c678dd;--blue: #61afef;--font: "JetBrains Mono", "SF Mono", "Fira Code", "Cascadia Code", Consolas, monospace}*{margin:0;padding:0;box-sizing:border-box}body{font-family:var(--font);background:var(--bg-base);color:var(--text-primary);font-size:12px;-webkit-font-smoothing:antialiased}#root{width:100vw;height:100vh}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--bg-hover);border-radius:2px}::selection{background:#33afbc40}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes neuralFlow{0%{transform:translate(-50%)}to{transform:translate(0)}}.react-flow__edge-path{stroke-width:1!important}.react-flow__edge.animated path{stroke-dasharray:6 4!important;stroke-width:1!important}.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #777;--xy-background-pattern-lines-color-default: #777;--xy-background-pattern-cross-color-default: #777;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}
1
+ @import"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700;800&display=swap";:root{--bg-base: #24282f;--bg-chrome: #282c34;--bg-surface: #2c313a;--bg-hover: #333842;--bg-active: #3a3f4b;--text-primary: #abb2bf;--text-bright: #e6e6e6;--text-dim: #7a8394;--text-muted: #5c6370;--border: #4b5263;--accent: #33afbc;--green: #4ae168;--amber: #e5c07b;--red: #e06c75;--purple: #c678dd;--blue: #61afef;--font: "JetBrains Mono", "SF Mono", "Fira Code", "Cascadia Code", Consolas, monospace}*{margin:0;padding:0;box-sizing:border-box}body{font-family:var(--font);background:var(--bg-base);color:var(--text-primary);font-size:12px;-webkit-font-smoothing:antialiased}#root{width:100vw;height:100vh}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--bg-hover);border-radius:2px}::selection{background:#33afbc40}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes neuralFlow{0%{transform:translate(-50%)}to{transform:translate(0)}}.react-flow__edge-path{stroke-width:1!important}.react-flow__edge.animated path{stroke-dasharray:6 4!important;stroke-width:1!important}.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #777;--xy-background-pattern-lines-color-default: #777;--xy-background-pattern-cross-color-default: #777;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}/**
2
+ * Copyright (c) 2014 The xterm.js authors. All rights reserved.
3
+ * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
4
+ * https://github.com/chjj/term.js
5
+ * @license MIT
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
24
+ *
25
+ * Originally forked from (with the author's permission):
26
+ * Fabrice Bellard's javascript vt100 for jslinux:
27
+ * http://bellard.org/jslinux/
28
+ * Copyright (c) 2011 Fabrice Bellard
29
+ * The original design remains. The terminal itself
30
+ * has been extended to include xterm CSI codes, among
31
+ * other features.
32
+ */.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{font-family:monospace;-webkit-user-select:text;user-select:text;white-space:pre}.xterm .xterm-accessibility-tree>div{transform-origin:left;width:fit-content}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;background:#0000;transition:opacity .1s linear;z-index:11}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{position:absolute;display:none}.xterm .xterm-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow, #000) 0 6px 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px;box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}