@phenx-inc/ctlsurf 0.16.0 → 0.17.0

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 (37) hide show
  1. package/out/headless/index.mjs +549 -116
  2. package/out/headless/index.mjs.map +4 -4
  3. package/out/main/index.js +416 -38
  4. package/out/preload/index.js +3 -0
  5. package/out/renderer/assets/{cssMode-Xx1-SozN.js → cssMode-BtQxI2Eb.js} +3 -3
  6. package/out/renderer/assets/{freemarker2-DM49yPw1.js → freemarker2-DRW5dmY5.js} +1 -1
  7. package/out/renderer/assets/{handlebars-DJJBblpV.js → handlebars-CFLF3cP7.js} +1 -1
  8. package/out/renderer/assets/{html-DnMnJOxw.js → html-DtnBOkwp.js} +1 -1
  9. package/out/renderer/assets/{htmlMode-BG5u2CSH.js → htmlMode-DMVysDCg.js} +3 -3
  10. package/out/renderer/assets/{index-DID1LlMU.css → index-CEjwKjtd.css} +45 -0
  11. package/out/renderer/assets/{index-D65QIRev.js → index-Dm70hk5s.js} +292 -38
  12. package/out/renderer/assets/{javascript-Dci_phmN.js → javascript-ChlyA1sf.js} +2 -2
  13. package/out/renderer/assets/{jsonMode-Dmp3JJSm.js → jsonMode-D1_oHzeN.js} +3 -3
  14. package/out/renderer/assets/{liquid-C9KVysk1.js → liquid-D4ftdy1G.js} +1 -1
  15. package/out/renderer/assets/{lspLanguageFeatures-IDD0-KWa.js → lspLanguageFeatures-Ckqu5ubG.js} +1 -1
  16. package/out/renderer/assets/{mdx-ascmBFXX.js → mdx-B9wsVYSC.js} +1 -1
  17. package/out/renderer/assets/{python-DcbM4Hy5.js → python-e23tD6IS.js} +1 -1
  18. package/out/renderer/assets/{razor-XJROxpYK.js → razor-CrDyXj3d.js} +1 -1
  19. package/out/renderer/assets/{tsMode-EXbzul3n.js → tsMode-BwGC5o4O.js} +1 -1
  20. package/out/renderer/assets/{typescript-DhTtFBLt.js → typescript-Do-98d_O.js} +1 -1
  21. package/out/renderer/assets/{xml-BLfEkVl1.js → xml-Dpdu5R3m.js} +1 -1
  22. package/out/renderer/assets/{yaml-DpzsqvWa.js → yaml-B0Zt7LCJ.js} +1 -1
  23. package/out/renderer/index.html +2 -2
  24. package/package.json +1 -1
  25. package/scripts/test-terminal-scroll.cjs +64 -0
  26. package/src/main/headless.ts +12 -0
  27. package/src/main/index.ts +8 -0
  28. package/src/main/monitor.ts +540 -0
  29. package/src/main/orchestrator.ts +10 -0
  30. package/src/main/pty.ts +5 -0
  31. package/src/main/tui.ts +37 -3
  32. package/src/preload/index.ts +4 -0
  33. package/src/renderer/App.tsx +9 -1
  34. package/src/renderer/components/Resources.tsx +217 -0
  35. package/src/renderer/components/StatusBar.tsx +6 -1
  36. package/src/renderer/components/TerminalPanel.tsx +54 -20
  37. package/src/renderer/styles.css +45 -0
@@ -8346,6 +8346,51 @@ html, body, #root {
8346
8346
  font-weight: 500;
8347
8347
  }
8348
8348
 
8349
+ /* Resources + plan quota (status bar gauges and details panel) */
8350
+ .res-bar { display: flex; align-items: center; gap: 12px; cursor: pointer; padding: 1px 6px; margin-right: 8px; border-radius: 4px; }
8351
+ .res-bar:hover { background: var(--bg-surface); }
8352
+ .res-group { display: inline-flex; align-items: center; gap: 7px; }
8353
+ .res-group + .res-group { padding-left: 10px; border-left: 1px solid var(--border-subtle); }
8354
+ .res-name { color: var(--text-soft); }
8355
+ .res-off { color: var(--text-muted); font-style: italic; }
8356
+ .res-gauge { display: inline-flex; align-items: center; gap: 3px; }
8357
+ .res-gauge-bar { width: 5px; height: 13px; background: var(--bg-surface-hi); border-radius: 2px; display: flex; align-items: flex-end; overflow: hidden; }
8358
+ .res-gauge-bar > span { width: 100%; border-radius: 2px; transition: height .6s ease; }
8359
+ .res-gauge-k { color: var(--text-muted); }
8360
+ .res-gauge-v { color: var(--text-bright); font-family: 'JetBrains Mono', 'Fira Code', monospace; min-width: 26px; }
8361
+
8362
+ .res-panel { position: fixed; right: 0; bottom: 25px; width: 440px; max-height: 75vh; z-index: 50; cursor: default;
8363
+ background: var(--bg-raised); border: 1px solid var(--border); border-right: none; border-radius: 8px 0 0 0;
8364
+ box-shadow: -12px -12px 40px var(--shadow-color); display: flex; flex-direction: column; animation: res-rise .18s ease-out; }
8365
+ @keyframes res-rise { from { transform: translateY(20px); opacity: 0; } to { transform: none; opacity: 1; } }
8366
+ .res-panel-head { display: flex; align-items: baseline; gap: 10px; padding: 12px 14px 6px; }
8367
+ .res-panel-head h2 { margin: 0; font-size: 14px; color: var(--text-bright); }
8368
+ .res-close { background: none; border: none; color: var(--text-muted); cursor: pointer; font-size: 12px; }
8369
+ .res-close:hover { color: var(--text-bright); }
8370
+ .res-panel-body { overflow: auto; padding: 4px 14px 14px; display: flex; flex-direction: column; gap: 10px; font-size: 12px; color: var(--text); }
8371
+ .res-card { background: var(--bg-surface); border-radius: 6px; padding: 8px 10px; display: flex; flex-direction: column; gap: 5px; }
8372
+ .res-head { display: flex; align-items: center; gap: 8px; color: var(--text-bright); }
8373
+ .res-spacer { flex: 1; }
8374
+ .res-muted { color: var(--text-muted); font-size: 11.5px; }
8375
+ .res-note { margin-top: 2px; }
8376
+ .res-err { color: var(--danger); }
8377
+ .res-tag { font-size: 10.5px; color: var(--accent); border: 1px solid var(--border); border-radius: 3px; padding: 0 4px; }
8378
+ .res-dot { width: 7px; height: 7px; border-radius: 50%; }
8379
+ .res-dot.ok { background: var(--success); }
8380
+ .res-dot.bad { background: var(--danger); }
8381
+ .res-row { display: flex; align-items: center; gap: 8px; }
8382
+ .res-k { width: 40px; color: var(--text-soft); flex: none; }
8383
+ .res-k.wide { width: 112px; }
8384
+ .res-v { font-family: 'JetBrains Mono', 'Fira Code', monospace; font-size: 11.5px; min-width: 104px; }
8385
+ .res-v.narrow { min-width: 36px; }
8386
+ .res-resets { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
8387
+ .res-rbar { flex: 1; height: 6px; background: var(--bg-surface-hi); border-radius: 3px; overflow: hidden; min-width: 50px; }
8388
+ .res-rbar > span { display: block; height: 100%; border-radius: 3px; transition: width .6s ease; }
8389
+ .res-spark { flex: none; }
8390
+ .res-agent { padding: 2px 0; }
8391
+ .res-agent-name { color: var(--text); }
8392
+ .res-agent-name.active { color: var(--text-bright); }
8393
+
8349
8394
  .tracking-dot {
8350
8395
  width: 6px;
8351
8396
  height: 6px;
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./cssMode-Xx1-SozN.js","./lspLanguageFeatures-IDD0-KWa.js","./htmlMode-BG5u2CSH.js","./jsonMode-Dmp3JJSm.js","./javascript-Dci_phmN.js","./typescript-DhTtFBLt.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./cssMode-BtQxI2Eb.js","./lspLanguageFeatures-Ckqu5ubG.js","./htmlMode-DMVysDCg.js","./jsonMode-D1_oHzeN.js","./javascript-ChlyA1sf.js","./typescript-Do-98d_O.js"])))=>i.map(i=>d[i]);
2
2
  function getDefaultExportFromCjs(x) {
3
3
  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
4
4
  }
@@ -19525,6 +19525,20 @@ function markGesture(tabId) {
19525
19525
  const s = _terminals.get(tabId);
19526
19526
  if (s) s.userScrollPending = true;
19527
19527
  }
19528
+ function followLatest(state) {
19529
+ state.userScrollPending = false;
19530
+ setPinned(state, true);
19531
+ reassert(state);
19532
+ }
19533
+ function rememberScrollPosition(state) {
19534
+ state.userScrollPending = false;
19535
+ if (isAtBottom(state.terminal)) {
19536
+ setPinned(state, true);
19537
+ } else {
19538
+ state.anchorLine = state.terminal.buffer.active.viewportY;
19539
+ setPinned(state, false);
19540
+ }
19541
+ }
19528
19542
  function getOrCreateTerminal(tabId, onExit) {
19529
19543
  const existing = _terminals.get(tabId);
19530
19544
  if (existing) {
@@ -19550,7 +19564,9 @@ function getOrCreateTerminal(tabId, onExit) {
19550
19564
  fontFamily: "'JetBrains Mono', 'Fira Code', 'Cascadia Code', 'SF Mono', monospace",
19551
19565
  theme: currentTheme().terminal,
19552
19566
  scrollback: 1e4,
19553
- scrollOnUserInput: true,
19567
+ // Follow explicit keyboard/paste input below. xterm also counts mouse
19568
+ // reports as user input, which must not pull someone out of scrollback.
19569
+ scrollOnUserInput: false,
19554
19570
  allowTransparency: false
19555
19571
  });
19556
19572
  const fitAddon = new addonFitExports.FitAddon();
@@ -19612,17 +19628,10 @@ function getOrCreateTerminal(tabId, onExit) {
19612
19628
  reassert(state);
19613
19629
  return;
19614
19630
  }
19615
- state.userScrollPending = false;
19616
- if (isAtBottom(terminal)) {
19617
- setPinned(state, true);
19618
- } else {
19619
- state.anchorLine = terminal.buffer.active.viewportY;
19620
- setPinned(state, false);
19621
- }
19631
+ rememberScrollPosition(state);
19622
19632
  });
19633
+ terminal.onKey(() => followLatest(state));
19623
19634
  terminal.onData((data) => {
19624
- setPinned(state, true);
19625
- terminal.scrollToBottom();
19626
19635
  window.worker.writePty(tabId, data);
19627
19636
  });
19628
19637
  state.unsubData = window.worker.onPtyData((eventTabId, data) => {
@@ -19680,8 +19689,7 @@ function TerminalPanel({ tabId, agent, sessionVersion, onSpawn, onExit, isActive
19680
19689
  const jumpToLatest = () => {
19681
19690
  const s = _terminals.get(tabId);
19682
19691
  if (!s) return;
19683
- setPinned(s, true);
19684
- s.terminal.scrollToBottom();
19692
+ followLatest(s);
19685
19693
  s.terminal.focus();
19686
19694
  };
19687
19695
  const handleContextMenu = (e) => {
@@ -19761,6 +19769,22 @@ function TerminalPanel({ tabId, agent, sessionVersion, onSpawn, onExit, isActive
19761
19769
  if (attached) reassert(attached);
19762
19770
  const onWheel = () => markGesture(tabId);
19763
19771
  terminal.element?.addEventListener("wheel", onWheel, { capture: true, passive: true });
19772
+ const viewport = terminal.element?.querySelector(".xterm-viewport");
19773
+ const onViewportScroll = () => {
19774
+ const state = _terminals.get(tabId);
19775
+ if (state && !state.holding && state.userScrollPending) rememberScrollPosition(state);
19776
+ };
19777
+ viewport?.addEventListener("scroll", onViewportScroll);
19778
+ const onTextInput = () => {
19779
+ const state = _terminals.get(tabId);
19780
+ if (state) followLatest(state);
19781
+ };
19782
+ const onPaste = (event) => {
19783
+ if (event.clipboardData?.getData("text/plain")) onTextInput();
19784
+ };
19785
+ terminal.textarea?.addEventListener("paste", onPaste, true);
19786
+ terminal.textarea?.addEventListener("input", onTextInput, true);
19787
+ terminal.textarea?.addEventListener("compositionend", onTextInput, true);
19764
19788
  let resizeTimeout;
19765
19789
  const handleResize = () => {
19766
19790
  clearTimeout(resizeTimeout);
@@ -19784,6 +19808,10 @@ function TerminalPanel({ tabId, agent, sessionVersion, onSpawn, onExit, isActive
19784
19808
  window.removeEventListener("resize", handleResize);
19785
19809
  observer.disconnect();
19786
19810
  terminal.element?.removeEventListener("wheel", onWheel, true);
19811
+ viewport?.removeEventListener("scroll", onViewportScroll);
19812
+ terminal.textarea?.removeEventListener("paste", onPaste, true);
19813
+ terminal.textarea?.removeEventListener("input", onTextInput, true);
19814
+ terminal.textarea?.removeEventListener("compositionend", onTextInput, true);
19787
19815
  };
19788
19816
  }, [tabId, onExit]);
19789
19817
  reactExports.useEffect(() => {
@@ -208443,7 +208471,7 @@ const lessDefaults = new LanguageServiceDefaultsImpl$3(
208443
208471
  modeConfigurationDefault$2
208444
208472
  );
208445
208473
  function getMode$3() {
208446
- return __vitePreload(() => import("./cssMode-Xx1-SozN.js"), true ? __vite__mapDeps([0,1]) : void 0, import.meta.url);
208474
+ return __vitePreload(() => import("./cssMode-BtQxI2Eb.js"), true ? __vite__mapDeps([0,1]) : void 0, import.meta.url);
208447
208475
  }
208448
208476
  languages.onLanguage("less", () => {
208449
208477
  getMode$3().then((mode2) => mode2.setupMode(lessDefaults));
@@ -208548,7 +208576,7 @@ const razorLanguageService = registerHTMLLanguageService(
208548
208576
  );
208549
208577
  const razorDefaults = razorLanguageService.defaults;
208550
208578
  function getMode$2() {
208551
- return __vitePreload(() => import("./htmlMode-BG5u2CSH.js"), true ? __vite__mapDeps([2,1]) : void 0, import.meta.url);
208579
+ return __vitePreload(() => import("./htmlMode-DMVysDCg.js"), true ? __vite__mapDeps([2,1]) : void 0, import.meta.url);
208552
208580
  }
208553
208581
  function registerHTMLLanguageService(languageId, options = optionsDefault, modeConfiguration = getConfigurationDefault(languageId)) {
208554
208582
  const defaults = new LanguageServiceDefaultsImpl$2(languageId, options, modeConfiguration);
@@ -208632,7 +208660,7 @@ const jsonDefaults = new LanguageServiceDefaultsImpl$1(
208632
208660
  );
208633
208661
  const getWorker$1 = () => getMode$1().then((mode2) => mode2.getWorker());
208634
208662
  function getMode$1() {
208635
- return __vitePreload(() => import("./jsonMode-Dmp3JJSm.js"), true ? __vite__mapDeps([3,1]) : void 0, import.meta.url);
208663
+ return __vitePreload(() => import("./jsonMode-D1_oHzeN.js"), true ? __vite__mapDeps([3,1]) : void 0, import.meta.url);
208636
208664
  }
208637
208665
  languages.register({
208638
208666
  id: "json",
@@ -208878,7 +208906,7 @@ const getJavaScriptWorker = () => {
208878
208906
  return getMode().then((mode) => mode.getJavaScriptWorker());
208879
208907
  };
208880
208908
  function getMode() {
208881
- return __vitePreload(() => import("./tsMode-EXbzul3n.js"), true ? [] : void 0, import.meta.url);
208909
+ return __vitePreload(() => import("./tsMode-BwGC5o4O.js"), true ? [] : void 0, import.meta.url);
208882
208910
  }
208883
208911
  languages.onLanguage("typescript", () => {
208884
208912
  return getMode().then((mode) => mode.setupTypeScript(typescriptDefaults));
@@ -209073,49 +209101,49 @@ registerLanguage({
209073
209101
  extensions: [".ftl", ".ftlh", ".ftlx"],
209074
209102
  aliases: ["FreeMarker2", "Apache FreeMarker2"],
209075
209103
  loader: () => {
209076
- return __vitePreload(() => import("./freemarker2-DM49yPw1.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
209104
+ return __vitePreload(() => import("./freemarker2-DRW5dmY5.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
209077
209105
  }
209078
209106
  });
209079
209107
  registerLanguage({
209080
209108
  id: "freemarker2.tag-angle.interpolation-dollar",
209081
209109
  aliases: ["FreeMarker2 (Angle/Dollar)", "Apache FreeMarker2 (Angle/Dollar)"],
209082
209110
  loader: () => {
209083
- return __vitePreload(() => import("./freemarker2-DM49yPw1.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationDollar);
209111
+ return __vitePreload(() => import("./freemarker2-DRW5dmY5.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationDollar);
209084
209112
  }
209085
209113
  });
209086
209114
  registerLanguage({
209087
209115
  id: "freemarker2.tag-bracket.interpolation-dollar",
209088
209116
  aliases: ["FreeMarker2 (Bracket/Dollar)", "Apache FreeMarker2 (Bracket/Dollar)"],
209089
209117
  loader: () => {
209090
- return __vitePreload(() => import("./freemarker2-DM49yPw1.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationDollar);
209118
+ return __vitePreload(() => import("./freemarker2-DRW5dmY5.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationDollar);
209091
209119
  }
209092
209120
  });
209093
209121
  registerLanguage({
209094
209122
  id: "freemarker2.tag-angle.interpolation-bracket",
209095
209123
  aliases: ["FreeMarker2 (Angle/Bracket)", "Apache FreeMarker2 (Angle/Bracket)"],
209096
209124
  loader: () => {
209097
- return __vitePreload(() => import("./freemarker2-DM49yPw1.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationBracket);
209125
+ return __vitePreload(() => import("./freemarker2-DRW5dmY5.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationBracket);
209098
209126
  }
209099
209127
  });
209100
209128
  registerLanguage({
209101
209129
  id: "freemarker2.tag-bracket.interpolation-bracket",
209102
209130
  aliases: ["FreeMarker2 (Bracket/Bracket)", "Apache FreeMarker2 (Bracket/Bracket)"],
209103
209131
  loader: () => {
209104
- return __vitePreload(() => import("./freemarker2-DM49yPw1.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationBracket);
209132
+ return __vitePreload(() => import("./freemarker2-DRW5dmY5.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationBracket);
209105
209133
  }
209106
209134
  });
209107
209135
  registerLanguage({
209108
209136
  id: "freemarker2.tag-auto.interpolation-dollar",
209109
209137
  aliases: ["FreeMarker2 (Auto/Dollar)", "Apache FreeMarker2 (Auto/Dollar)"],
209110
209138
  loader: () => {
209111
- return __vitePreload(() => import("./freemarker2-DM49yPw1.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
209139
+ return __vitePreload(() => import("./freemarker2-DRW5dmY5.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
209112
209140
  }
209113
209141
  });
209114
209142
  registerLanguage({
209115
209143
  id: "freemarker2.tag-auto.interpolation-bracket",
209116
209144
  aliases: ["FreeMarker2 (Auto/Bracket)", "Apache FreeMarker2 (Auto/Bracket)"],
209117
209145
  loader: () => {
209118
- return __vitePreload(() => import("./freemarker2-DM49yPw1.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationBracket);
209146
+ return __vitePreload(() => import("./freemarker2-DRW5dmY5.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationBracket);
209119
209147
  }
209120
209148
  });
209121
209149
  registerLanguage({
@@ -209136,7 +209164,7 @@ registerLanguage({
209136
209164
  extensions: [".handlebars", ".hbs"],
209137
209165
  aliases: ["Handlebars", "handlebars", "hbs"],
209138
209166
  mimetypes: ["text/x-handlebars-template"],
209139
- loader: () => __vitePreload(() => import("./handlebars-DJJBblpV.js"), true ? [] : void 0, import.meta.url)
209167
+ loader: () => __vitePreload(() => import("./handlebars-CFLF3cP7.js"), true ? [] : void 0, import.meta.url)
209140
209168
  });
209141
209169
  registerLanguage({
209142
209170
  id: "hcl",
@@ -209149,7 +209177,7 @@ registerLanguage({
209149
209177
  extensions: [".html", ".htm", ".shtml", ".xhtml", ".mdoc", ".jsp", ".asp", ".aspx", ".jshtm"],
209150
209178
  aliases: ["HTML", "htm", "html", "xhtml"],
209151
209179
  mimetypes: ["text/html", "text/x-jshtm", "text/template", "text/ng-template"],
209152
- loader: () => __vitePreload(() => import("./html-DnMnJOxw.js"), true ? [] : void 0, import.meta.url)
209180
+ loader: () => __vitePreload(() => import("./html-DtnBOkwp.js"), true ? [] : void 0, import.meta.url)
209153
209181
  });
209154
209182
  registerLanguage({
209155
209183
  id: "ini",
@@ -209172,7 +209200,7 @@ registerLanguage({
209172
209200
  filenames: ["jakefile"],
209173
209201
  aliases: ["JavaScript", "javascript", "js"],
209174
209202
  mimetypes: ["text/javascript"],
209175
- loader: () => __vitePreload(() => import("./javascript-Dci_phmN.js"), true ? __vite__mapDeps([4,5]) : void 0, import.meta.url)
209203
+ loader: () => __vitePreload(() => import("./javascript-ChlyA1sf.js"), true ? __vite__mapDeps([4,5]) : void 0, import.meta.url)
209176
209204
  });
209177
209205
  registerLanguage({
209178
209206
  id: "julia",
@@ -209211,7 +209239,7 @@ registerLanguage({
209211
209239
  extensions: [".liquid", ".html.liquid"],
209212
209240
  aliases: ["Liquid", "liquid"],
209213
209241
  mimetypes: ["application/liquid"],
209214
- loader: () => __vitePreload(() => import("./liquid-C9KVysk1.js"), true ? [] : void 0, import.meta.url)
209242
+ loader: () => __vitePreload(() => import("./liquid-D4ftdy1G.js"), true ? [] : void 0, import.meta.url)
209215
209243
  });
209216
209244
  registerLanguage({
209217
209245
  id: "m3",
@@ -209229,7 +209257,7 @@ registerLanguage({
209229
209257
  id: "mdx",
209230
209258
  extensions: [".mdx"],
209231
209259
  aliases: ["MDX", "mdx"],
209232
- loader: () => __vitePreload(() => import("./mdx-ascmBFXX.js"), true ? [] : void 0, import.meta.url)
209260
+ loader: () => __vitePreload(() => import("./mdx-B9wsVYSC.js"), true ? [] : void 0, import.meta.url)
209233
209261
  });
209234
209262
  registerLanguage({
209235
209263
  id: "mips",
@@ -209328,7 +209356,7 @@ registerLanguage({
209328
209356
  extensions: [".py", ".rpy", ".pyw", ".cpy", ".gyp", ".gypi"],
209329
209357
  aliases: ["Python", "py"],
209330
209358
  firstLine: "^#!/.*\\bpython[0-9.-]*\\b",
209331
- loader: () => __vitePreload(() => import("./python-DcbM4Hy5.js"), true ? [] : void 0, import.meta.url)
209359
+ loader: () => __vitePreload(() => import("./python-e23tD6IS.js"), true ? [] : void 0, import.meta.url)
209332
209360
  });
209333
209361
  registerLanguage({
209334
209362
  id: "qsharp",
@@ -209347,7 +209375,7 @@ registerLanguage({
209347
209375
  extensions: [".cshtml"],
209348
209376
  aliases: ["Razor", "razor"],
209349
209377
  mimetypes: ["text/x-cshtml"],
209350
- loader: () => __vitePreload(() => import("./razor-XJROxpYK.js"), true ? [] : void 0, import.meta.url)
209378
+ loader: () => __vitePreload(() => import("./razor-CrDyXj3d.js"), true ? [] : void 0, import.meta.url)
209351
209379
  });
209352
209380
  registerLanguage({
209353
209381
  id: "redis",
@@ -209480,7 +209508,7 @@ registerLanguage({
209480
209508
  aliases: ["TypeScript", "ts", "typescript"],
209481
209509
  mimetypes: ["text/typescript"],
209482
209510
  loader: () => {
209483
- return __vitePreload(() => import("./typescript-DhTtFBLt.js"), true ? [] : void 0, import.meta.url);
209511
+ return __vitePreload(() => import("./typescript-Do-98d_O.js"), true ? [] : void 0, import.meta.url);
209484
209512
  }
209485
209513
  });
209486
209514
  registerLanguage({
@@ -209525,14 +209553,14 @@ registerLanguage({
209525
209553
  firstLine: "(\\<\\?xml.*)|(\\<svg)|(\\<\\!doctype\\s+svg)",
209526
209554
  aliases: ["XML", "xml"],
209527
209555
  mimetypes: ["text/xml", "application/xml", "application/xaml+xml", "application/xml-dtd"],
209528
- loader: () => __vitePreload(() => import("./xml-BLfEkVl1.js"), true ? [] : void 0, import.meta.url)
209556
+ loader: () => __vitePreload(() => import("./xml-Dpdu5R3m.js"), true ? [] : void 0, import.meta.url)
209529
209557
  });
209530
209558
  registerLanguage({
209531
209559
  id: "yaml",
209532
209560
  extensions: [".yaml", ".yml"],
209533
209561
  aliases: ["YAML", "yaml", "YML", "yml"],
209534
209562
  mimetypes: ["application/x-yaml", "text/x-yaml"],
209535
- loader: () => __vitePreload(() => import("./yaml-DpzsqvWa.js"), true ? [] : void 0, import.meta.url)
209563
+ loader: () => __vitePreload(() => import("./yaml-B0Zt7LCJ.js"), true ? [] : void 0, import.meta.url)
209536
209564
  });
209537
209565
  var __defProp = Object.defineProperty;
209538
209566
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -213850,7 +213878,223 @@ function LeafPane({ pane, onDrop, onToggle }) {
213850
213878
  }
213851
213879
  );
213852
213880
  }
213853
- function StatusBar({ wsStatus, cwd: cwd2, onChangeCwd, updateInfo }) {
213881
+ const SERVICE_NAME = { claude: "Claude", codex: "Codex" };
213882
+ const gb = (bytes) => bytes == null ? "—" : `${(bytes / 2 ** 30).toFixed(bytes < 10 * 2 ** 30 ? 1 : 0)} GB`;
213883
+ const pct = (x) => x == null ? "—" : `${Math.round(x)}%`;
213884
+ const fillTone = (x) => x == null ? "var(--text-dim)" : x < 70 ? "var(--success)" : x < 90 ? "var(--warning)" : "var(--danger)";
213885
+ function ago(iso) {
213886
+ const s = Math.max(0, Math.round((Date.now() - new Date(iso).getTime()) / 1e3));
213887
+ if (s < 60) return `${s}s ago`;
213888
+ if (s < 3600) return `${Math.round(s / 60)}m ago`;
213889
+ if (s < 86400) return `${Math.round(s / 3600)}h ago`;
213890
+ return `${Math.round(s / 86400)}d ago`;
213891
+ }
213892
+ function useResourceSnapshot(open, refreshKey) {
213893
+ const [data, setData] = reactExports.useState(null);
213894
+ reactExports.useEffect(() => {
213895
+ let cancelled = false;
213896
+ let timer;
213897
+ const poll = async () => {
213898
+ try {
213899
+ const snap = await window.worker.getResourceSnapshot(open);
213900
+ if (!cancelled) setData(snap);
213901
+ } catch {
213902
+ }
213903
+ if (!cancelled) timer = setTimeout(poll, open ? 3e3 : 1e4);
213904
+ };
213905
+ void poll();
213906
+ return () => {
213907
+ cancelled = true;
213908
+ clearTimeout(timer);
213909
+ };
213910
+ }, [open, refreshKey]);
213911
+ return data;
213912
+ }
213913
+ function Gauge({ label, value, tone, title }) {
213914
+ const v2 = Math.max(0, Math.min(100, value ?? 0));
213915
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "res-gauge", title, children: [
213916
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-gauge-bar", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { height: `${v2}%`, background: value == null ? "transparent" : tone } }) }),
213917
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-gauge-k", children: label }),
213918
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-gauge-v", children: pct(value) })
213919
+ ] });
213920
+ }
213921
+ function ResourceBar({ refreshKey }) {
213922
+ const [open, setOpen] = reactExports.useState(false);
213923
+ const data = useResourceSnapshot(open, refreshKey);
213924
+ const m = data?.machine;
213925
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-bar", onClick: () => setOpen(!open), title: "Resources and plan quota: click for details", children: [
213926
+ m?.ok && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "res-group", children: [
213927
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Gauge, { label: "CPU", value: m.cpu?.pct, tone: "var(--accent)", title: `CPU ${pct(m.cpu?.pct)} of ${m.cpu?.cores} cores` }),
213928
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Gauge, { label: "RAM", value: m.mem?.pct, tone: fillTone(m.mem?.pct), title: `RAM ${gb(m.mem?.used)} of ${gb(m.mem?.total)}` })
213929
+ ] }),
213930
+ data?.activeService && /* @__PURE__ */ jsxRuntimeExports.jsx(QuotaGauges, { service: data.activeService, u: data.usage[data.activeService] }),
213931
+ open && /* @__PURE__ */ jsxRuntimeExports.jsx(ResourcePanel, { data, close: () => setOpen(false) })
213932
+ ] });
213933
+ }
213934
+ function QuotaGauges({ service, u }) {
213935
+ const name = SERVICE_NAME[service];
213936
+ if (!u) return null;
213937
+ const wins = u.windows.filter((w) => w.short);
213938
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "res-group", children: [
213939
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-name", children: name }),
213940
+ u.ok && wins.length ? wins.map((w) => /* @__PURE__ */ jsxRuntimeExports.jsx(
213941
+ Gauge,
213942
+ {
213943
+ label: w.short,
213944
+ value: w.pct,
213945
+ tone: fillTone(w.pct),
213946
+ title: `${name} ${w.label}: ${pct(w.pct)} used${w.resets ? ` · resets ${w.resets}` : ""}`
213947
+ },
213948
+ w.label
213949
+ )) : /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-off", title: u.error ?? "no usage reported", children: "quota unavailable" })
213950
+ ] });
213951
+ }
213952
+ function Bar({ value, tone }) {
213953
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-rbar", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { width: `${Math.max(0, Math.min(100, value ?? 0))}%`, background: tone } }) });
213954
+ }
213955
+ function Spark({ values, tone, width: width2 = 120, height = 22 }) {
213956
+ const pts = values.map((v2, i2) => [values.length < 2 ? width2 : i2 / (values.length - 1) * width2, height - (v2 ?? 0) / 100 * (height - 2) - 1]);
213957
+ if (pts.length < 2) return /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { width: width2, height, className: "res-spark" });
213958
+ const line = pts.map(([x, y]) => `${x.toFixed(1)},${y.toFixed(1)}`).join(" ");
213959
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("svg", { width: width2, height, className: "res-spark", children: [
213960
+ /* @__PURE__ */ jsxRuntimeExports.jsx("polygon", { points: `0,${height} ${line} ${width2},${height}`, fill: tone, opacity: 0.15 }),
213961
+ /* @__PURE__ */ jsxRuntimeExports.jsx("polyline", { points: line, fill: "none", stroke: tone, strokeWidth: 1.4 })
213962
+ ] });
213963
+ }
213964
+ function UsageView({ service, u, active }) {
213965
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-card", children: [
213966
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-head", children: [
213967
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("b", { children: [
213968
+ SERVICE_NAME[service],
213969
+ " plan"
213970
+ ] }),
213971
+ active && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-tag", children: "active tab" }),
213972
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-spacer" }),
213973
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "res-muted", children: [
213974
+ "as of ",
213975
+ ago(u.ts)
213976
+ ] })
213977
+ ] }),
213978
+ u.ok ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
213979
+ u.windows.map((w) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-row", children: [
213980
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-k wide", children: w.label }),
213981
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Bar, { value: w.pct, tone: fillTone(w.pct) }),
213982
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-v narrow", children: pct(w.pct) }),
213983
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-muted res-resets", children: w.resets ? `resets ${w.resets}` : "" })
213984
+ ] }, w.label)),
213985
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-muted res-note", children: [
213986
+ "from ",
213987
+ u.source,
213988
+ u.plan ? ` · plan ${u.plan}` : ""
213989
+ ] })
213990
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "res-muted", children: u.error ?? "no usage reported" })
213991
+ ] });
213992
+ }
213993
+ function MachineView({ m }) {
213994
+ const h2 = m.history;
213995
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-card", children: [
213996
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-head", children: [
213997
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: `res-dot ${m.ok ? "ok" : "bad"}` }),
213998
+ /* @__PURE__ */ jsxRuntimeExports.jsx("b", { children: m.label }),
213999
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-spacer" }),
214000
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "res-muted", children: [
214001
+ "updated ",
214002
+ ago(m.ts)
214003
+ ] })
214004
+ ] }),
214005
+ !m.ok ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "res-err", children: m.error ?? "unavailable" }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
214006
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-row", children: [
214007
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-k", children: "CPU" }),
214008
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Bar, { value: m.cpu?.pct, tone: "var(--accent)" }),
214009
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-v", children: pct(m.cpu?.pct) }),
214010
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Spark, { values: h2.map((p) => p.cpu), tone: "var(--accent)" })
214011
+ ] }),
214012
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-row", children: [
214013
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-k" }),
214014
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "res-muted", children: [
214015
+ m.cpu?.cores,
214016
+ " cores · load ",
214017
+ m.cpu?.load.map((x) => x.toFixed(2)).join(" ")
214018
+ ] })
214019
+ ] }),
214020
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-row", children: [
214021
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-k", children: "RAM" }),
214022
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Bar, { value: m.mem?.pct, tone: fillTone(m.mem?.pct) }),
214023
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "res-v", children: [
214024
+ gb(m.mem?.used),
214025
+ " / ",
214026
+ gb(m.mem?.total)
214027
+ ] }),
214028
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Spark, { values: h2.map((p) => p.mem), tone: fillTone(m.mem?.pct) })
214029
+ ] }),
214030
+ m.gpu != null && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-row", children: [
214031
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-k", children: "GPU" }),
214032
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Bar, { value: m.gpu, tone: "var(--sev-digest)" }),
214033
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-v", children: pct(m.gpu) }),
214034
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Spark, { values: h2.map((p) => p.gpu), tone: "var(--sev-digest)" })
214035
+ ] }),
214036
+ m.disk && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-row", children: [
214037
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-k", children: "Disk" }),
214038
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Bar, { value: 100 * (1 - m.disk.free / m.disk.total), tone: fillTone(100 * (1 - m.disk.free / m.disk.total)) }),
214039
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "res-v", children: [
214040
+ gb(m.disk.free),
214041
+ " free"
214042
+ ] })
214043
+ ] })
214044
+ ] })
214045
+ ] });
214046
+ }
214047
+ function AgentsView({ agents }) {
214048
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-card", children: [
214049
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "res-head", children: /* @__PURE__ */ jsxRuntimeExports.jsx("b", { children: "Agents in tabs" }) }),
214050
+ agents.length ? agents.map((a) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-agent", children: [
214051
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: a.active ? "res-agent-name active" : "res-agent-name", children: a.name }),
214052
+ a.active && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-tag", children: "active" }),
214053
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-muted", children: [
214054
+ a.pid == null ? "exited" : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
214055
+ "pid ",
214056
+ a.pid,
214057
+ " · ",
214058
+ a.procs,
214059
+ " process",
214060
+ a.procs === 1 ? "" : "es",
214061
+ a.cpu != null ? ` · CPU ${a.cpu.toFixed(0)}%` : "",
214062
+ a.mem != null ? ` · ${gb(a.mem)}` : ""
214063
+ ] }),
214064
+ a.remote ? " · local ssh client (agent runs remotely)" : ""
214065
+ ] })
214066
+ ] }, a.tabId)) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "res-muted", children: "no agents running" })
214067
+ ] });
214068
+ }
214069
+ function ResourcePanel({ data, close }) {
214070
+ reactExports.useEffect(() => {
214071
+ const onKey = (e) => {
214072
+ if (e.key === "Escape") close();
214073
+ };
214074
+ window.addEventListener("keydown", onKey);
214075
+ return () => window.removeEventListener("keydown", onKey);
214076
+ }, [close]);
214077
+ const services = Object.keys(data?.usage ?? {}).sort((a, b) => Number(b === data?.activeService) - Number(a === data?.activeService));
214078
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-panel", onClick: (e) => e.stopPropagation(), children: [
214079
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-panel-head", children: [
214080
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { children: "Resources" }),
214081
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-muted", children: "plan quota and this machine · every 3 s" }),
214082
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "res-spacer" }),
214083
+ /* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: "res-close", onClick: close, "aria-label": "Close", children: "✕" })
214084
+ ] }),
214085
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "res-panel-body", children: !data ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "res-muted", children: "sampling…" }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
214086
+ services.map((s) => /* @__PURE__ */ jsxRuntimeExports.jsx(UsageView, { service: s, u: data.usage[s], active: s === data.activeService }, s)),
214087
+ data.activeService && !data.usage[data.activeService] && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "res-muted", children: [
214088
+ "checking ",
214089
+ SERVICE_NAME[data.activeService],
214090
+ " quota…"
214091
+ ] }),
214092
+ /* @__PURE__ */ jsxRuntimeExports.jsx(MachineView, { m: data.machine }),
214093
+ /* @__PURE__ */ jsxRuntimeExports.jsx(AgentsView, { agents: data.agents })
214094
+ ] }) })
214095
+ ] });
214096
+ }
214097
+ function StatusBar({ wsStatus, cwd: cwd2, onChangeCwd, updateInfo, resourceKey }) {
213854
214098
  const [creating, setCreating] = reactExports.useState(false);
213855
214099
  const wsLabel = {
213856
214100
  disconnected: "Disconnected",
@@ -213886,6 +214130,7 @@ function StatusBar({ wsStatus, cwd: cwd2, onChangeCwd, updateInfo }) {
213886
214130
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "statusbar", children: [
213887
214131
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "statusbar-section", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "statusbar-path", onClick: onChangeCwd, title: "Click to change directory", children: displayPath || "No directory" }) }),
213888
214132
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "statusbar-section", children: [
214133
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ResourceBar, { refreshKey: resourceKey }),
213889
214134
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: `status-dot ${wsDotClass}` }),
213890
214135
  isNoProject ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
213891
214136
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Not linked to a ctlsurf project" }),
@@ -214283,7 +214528,7 @@ const PRIORITY_OPTIONS = [
214283
214528
  { value: "High", color: "var(--danger)" }
214284
214529
  ];
214285
214530
  const colorOf = (opts, value) => opts.find((o) => o.value === value)?.color ?? "var(--text-muted)";
214286
- const tint$1 = (color, pct) => `color-mix(in srgb, ${color} ${pct}%, transparent)`;
214531
+ const tint$1 = (color, pct2) => `color-mix(in srgb, ${color} ${pct2}%, transparent)`;
214287
214532
  function formatDate(iso) {
214288
214533
  if (!iso) return "";
214289
214534
  const d = new Date(iso);
@@ -214657,7 +214902,7 @@ function formatTime(iso) {
214657
214902
  if (Number.isNaN(d.getTime())) return "";
214658
214903
  return d.toLocaleTimeString("en-US", { hour: "numeric", minute: "2-digit" });
214659
214904
  }
214660
- const tint = (color, pct) => `color-mix(in srgb, ${color} ${pct}%, transparent)`;
214905
+ const tint = (color, pct2) => `color-mix(in srgb, ${color} ${pct2}%, transparent)`;
214661
214906
  function Chip({ color, label }) {
214662
214907
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "obs-chip", style: { color, borderColor: tint(color, 33), background: tint(color, 8) }, children: [
214663
214908
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "obs-chip-dot", style: { background: color } }),
@@ -215469,7 +215714,16 @@ ${transcript.slice(-REMOTE_HANDOFF_CHARS)}` : transcript;
215469
215714
  onToggle: togglePane
215470
215715
  }
215471
215716
  ) }),
215472
- /* @__PURE__ */ jsxRuntimeExports.jsx(StatusBar, { wsStatus, cwd: cwd2, onChangeCwd: handleChangeCwd, updateInfo }),
215717
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
215718
+ StatusBar,
215719
+ {
215720
+ wsStatus,
215721
+ cwd: cwd2,
215722
+ onChangeCwd: handleChangeCwd,
215723
+ updateInfo,
215724
+ resourceKey: `${activeTabId}:${tabs.find((t) => t.id === activeTabId)?.agent?.id ?? ""}`
215725
+ }
215726
+ ),
215473
215727
  /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsDialog, { open: showSettings, onClose: () => setShowSettings(false) }),
215474
215728
  showAgentPicker && agents.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(
215475
215729
  AgentPicker,
@@ -1,5 +1,5 @@
1
- import { conf as conf$1, language as language$1 } from "./typescript-DhTtFBLt.js";
2
- import "./index-D65QIRev.js";
1
+ import { conf as conf$1, language as language$1 } from "./typescript-Do-98d_O.js";
2
+ import "./index-Dm70hk5s.js";
3
3
  const conf = conf$1;
4
4
  const language = {
5
5
  // Set defaultToken to invalid to see what you do not tokenize yet
@@ -1,6 +1,6 @@
1
- import { c as createWebWorker, l as languages, e as editor } from "./index-D65QIRev.js";
2
- import { f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider, C as CompletionAdapter, H as HoverAdapter, b as DocumentSymbolAdapter, d as DocumentColorAdapter, F as FoldingRangeAdapter, S as SelectionRangeAdapter, e as DiagnosticsAdapter } from "./lspLanguageFeatures-IDD0-KWa.js";
3
- import { a, D, h, R, c, i, j, t, k } from "./lspLanguageFeatures-IDD0-KWa.js";
1
+ import { c as createWebWorker, l as languages, e as editor } from "./index-Dm70hk5s.js";
2
+ import { f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider, C as CompletionAdapter, H as HoverAdapter, b as DocumentSymbolAdapter, d as DocumentColorAdapter, F as FoldingRangeAdapter, S as SelectionRangeAdapter, e as DiagnosticsAdapter } from "./lspLanguageFeatures-Ckqu5ubG.js";
3
+ import { a, D, h, R, c, i, j, t, k } from "./lspLanguageFeatures-Ckqu5ubG.js";
4
4
  const STOP_WHEN_IDLE_FOR = 2 * 60 * 1e3;
5
5
  class WorkerManager {
6
6
  constructor(defaults) {
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-D65QIRev.js";
1
+ import { l as languages } from "./index-Dm70hk5s.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "area",
4
4
  "base",
@@ -1,4 +1,4 @@
1
- import { R as Range$1, l as languages, e as editor, U as Uri, M as MarkerSeverity } from "./index-D65QIRev.js";
1
+ import { R as Range$1, l as languages, e as editor, U as Uri, M as MarkerSeverity } from "./index-Dm70hk5s.js";
2
2
  var DocumentUri;
3
3
  (function(DocumentUri2) {
4
4
  function is(value) {
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-D65QIRev.js";
1
+ import { l as languages } from "./index-Dm70hk5s.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  blockComment: ["{/*", "*/}"]