@phenx-inc/ctlsurf 0.15.1 → 0.15.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 (23) hide show
  1. package/out/headless/index.mjs +1 -1
  2. package/out/headless/index.mjs.map +1 -1
  3. package/out/renderer/assets/{cssMode-B77M9HlN.js → cssMode-CPfLk04b.js} +3 -3
  4. package/out/renderer/assets/{freemarker2-oUT2zvyQ.js → freemarker2-CDHpuFqv.js} +1 -1
  5. package/out/renderer/assets/{handlebars-jCckoi5j.js → handlebars-CgX9Jz36.js} +1 -1
  6. package/out/renderer/assets/{html-kAgrAaKW.js → html-DdgFccDG.js} +1 -1
  7. package/out/renderer/assets/{htmlMode-DIWkIawy.js → htmlMode-CRHIwtvP.js} +3 -3
  8. package/out/renderer/assets/{index-CN3UN7Tm.js → index-DVdWgw7p.js} +40 -33
  9. package/out/renderer/assets/{javascript-B9GYUE-I.js → javascript-CHhxL0s7.js} +2 -2
  10. package/out/renderer/assets/{jsonMode-BzFKTZjJ.js → jsonMode-Cy7-eWai.js} +3 -3
  11. package/out/renderer/assets/{liquid-Ccw-S_Y6.js → liquid-vMkF9pfk.js} +1 -1
  12. package/out/renderer/assets/{lspLanguageFeatures-BE0g7ubH.js → lspLanguageFeatures-nAygNzuG.js} +1 -1
  13. package/out/renderer/assets/{mdx-oXeAA0qU.js → mdx-C4UVz5dW.js} +1 -1
  14. package/out/renderer/assets/{python-DlSX3TvA.js → python-BHemzN9g.js} +1 -1
  15. package/out/renderer/assets/{razor-ButO9S7r.js → razor-DH6NPzbo.js} +1 -1
  16. package/out/renderer/assets/{tsMode-CTCpE-67.js → tsMode-DxBdlGZB.js} +1 -1
  17. package/out/renderer/assets/{typescript-9o62WOnS.js → typescript-BRCOaBQ5.js} +1 -1
  18. package/out/renderer/assets/{xml-C4nOH2_D.js → xml-DVv9gDP1.js} +1 -1
  19. package/out/renderer/assets/{yaml-mXYgKoWW.js → yaml-jB-C3CdS.js} +1 -1
  20. package/out/renderer/index.html +1 -1
  21. package/package.json +1 -1
  22. package/src/renderer/components/FloatingMic.tsx +15 -11
  23. package/src/renderer/components/TerminalPanel.tsx +11 -2
@@ -1,6 +1,6 @@
1
- import { c as createWebWorker, l as languages } from "./index-CN3UN7Tm.js";
2
- import { C as CompletionAdapter, H as HoverAdapter, D as DocumentHighlightAdapter, a as DefinitionAdapter, R as ReferenceAdapter, b as DocumentSymbolAdapter, c as RenameAdapter, d as DocumentColorAdapter, F as FoldingRangeAdapter, e as DiagnosticsAdapter, S as SelectionRangeAdapter, f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider } from "./lspLanguageFeatures-BE0g7ubH.js";
3
- import { h, i, j, t, k } from "./lspLanguageFeatures-BE0g7ubH.js";
1
+ import { c as createWebWorker, l as languages } from "./index-DVdWgw7p.js";
2
+ import { C as CompletionAdapter, H as HoverAdapter, D as DocumentHighlightAdapter, a as DefinitionAdapter, R as ReferenceAdapter, b as DocumentSymbolAdapter, c as RenameAdapter, d as DocumentColorAdapter, F as FoldingRangeAdapter, e as DiagnosticsAdapter, S as SelectionRangeAdapter, f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider } from "./lspLanguageFeatures-nAygNzuG.js";
3
+ import { h, i, j, t, k } from "./lspLanguageFeatures-nAygNzuG.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-CN3UN7Tm.js";
1
+ import { l as languages } from "./index-DVdWgw7p.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "assign",
4
4
  "flush",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-CN3UN7Tm.js";
1
+ import { l as languages } from "./index-DVdWgw7p.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "area",
4
4
  "base",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-CN3UN7Tm.js";
1
+ import { l as languages } from "./index-DVdWgw7p.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "area",
4
4
  "base",
@@ -1,6 +1,6 @@
1
- import { c as createWebWorker, l as languages } from "./index-CN3UN7Tm.js";
2
- import { H as HoverAdapter, D as DocumentHighlightAdapter, h as DocumentLinkAdapter, F as FoldingRangeAdapter, b as DocumentSymbolAdapter, S as SelectionRangeAdapter, c as RenameAdapter, f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider, C as CompletionAdapter } from "./lspLanguageFeatures-BE0g7ubH.js";
3
- import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-BE0g7ubH.js";
1
+ import { c as createWebWorker, l as languages } from "./index-DVdWgw7p.js";
2
+ import { H as HoverAdapter, D as DocumentHighlightAdapter, h as DocumentLinkAdapter, F as FoldingRangeAdapter, b as DocumentSymbolAdapter, S as SelectionRangeAdapter, c as RenameAdapter, f as DocumentFormattingEditProvider, g as DocumentRangeFormattingEditProvider, C as CompletionAdapter } from "./lspLanguageFeatures-nAygNzuG.js";
3
+ import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-nAygNzuG.js";
4
4
  const STOP_WHEN_IDLE_FOR = 2 * 60 * 1e3;
5
5
  class WorkerManager {
6
6
  constructor(defaults) {
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./cssMode-B77M9HlN.js","./lspLanguageFeatures-BE0g7ubH.js","./htmlMode-DIWkIawy.js","./jsonMode-BzFKTZjJ.js","./javascript-B9GYUE-I.js","./typescript-9o62WOnS.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./cssMode-CPfLk04b.js","./lspLanguageFeatures-nAygNzuG.js","./htmlMode-CRHIwtvP.js","./jsonMode-Cy7-eWai.js","./javascript-CHhxL0s7.js","./typescript-BRCOaBQ5.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
  }
@@ -19532,6 +19532,11 @@ function getOrCreateTerminal(tabId, onExit) {
19532
19532
  }
19533
19533
  const terminal = new xtermExports.Terminal({
19534
19534
  cursorBlink: true,
19535
+ // Codex and other modern CLIs often render links as OSC 8 hyperlinks
19536
+ // instead of plain URL text. OSC 8 links are handled by xterm core (not
19537
+ // WebLinksAddon), whose default activation calls window.open(). Route them
19538
+ // through the same embedded-panel handler as detected plain-text URLs.
19539
+ linkHandler: { activate: handleTerminalLink },
19535
19540
  // Off by default on macOS; without this a right-click would reselect the
19536
19541
  // word under the cursor and clobber a multi-line table selection.
19537
19542
  rightClickSelectsWord: false,
@@ -19736,7 +19741,7 @@ function TerminalPanel({ tabId, agent, onSpawn, onExit, isActive }) {
19736
19741
  const attached = _terminals.get(tabId);
19737
19742
  if (attached) reassert(attached);
19738
19743
  const onWheel = () => markGesture(tabId);
19739
- terminal.element?.addEventListener("wheel", onWheel, { passive: true });
19744
+ terminal.element?.addEventListener("wheel", onWheel, { capture: true, passive: true });
19740
19745
  let resizeTimeout;
19741
19746
  const handleResize = () => {
19742
19747
  clearTimeout(resizeTimeout);
@@ -19759,7 +19764,7 @@ function TerminalPanel({ tabId, agent, onSpawn, onExit, isActive }) {
19759
19764
  clearTimeout(resizeTimeout);
19760
19765
  window.removeEventListener("resize", handleResize);
19761
19766
  observer.disconnect();
19762
- terminal.element?.removeEventListener("wheel", onWheel);
19767
+ terminal.element?.removeEventListener("wheel", onWheel, true);
19763
19768
  };
19764
19769
  }, [tabId, onExit]);
19765
19770
  reactExports.useEffect(() => {
@@ -20318,7 +20323,7 @@ function VoiceInput({ onTranscript, variant = "titlebar" }) {
20318
20323
  const POS_KEY = "ctlsurf.floatingMicPos";
20319
20324
  const EDGE = 20;
20320
20325
  const TOP_MIN = 46;
20321
- const BOTTOM_GAP = 36;
20326
+ const BOTTOM_GAP = 72;
20322
20327
  function loadPos() {
20323
20328
  try {
20324
20329
  const raw = localStorage.getItem(POS_KEY);
@@ -20366,15 +20371,17 @@ function FloatingMic({ onTranscript, onHide }) {
20366
20371
  };
20367
20372
  }, []);
20368
20373
  reactExports.useEffect(() => {
20369
- if (pos) return;
20370
- const el = elRef.current;
20371
- const w = el?.offsetWidth ?? 64;
20372
- const h2 = el?.offsetHeight ?? 90;
20373
- setPos({
20374
- x: window.innerWidth - w - EDGE,
20375
- y: window.innerHeight - h2 - BOTTOM_GAP
20374
+ setPos((current) => {
20375
+ if (current) return clamp2(current.x, current.y);
20376
+ const el = elRef.current;
20377
+ const w = el?.offsetWidth ?? 64;
20378
+ const h2 = el?.offsetHeight ?? 90;
20379
+ return clamp2(
20380
+ window.innerWidth - w - EDGE,
20381
+ window.innerHeight - h2 - BOTTOM_GAP
20382
+ );
20376
20383
  });
20377
- }, [pos]);
20384
+ }, [clamp2]);
20378
20385
  reactExports.useEffect(() => {
20379
20386
  const onResize = () => setPos((p) => p ? clamp2(p.x, p.y) : p);
20380
20387
  window.addEventListener("resize", onResize);
@@ -208416,7 +208423,7 @@ const lessDefaults = new LanguageServiceDefaultsImpl$3(
208416
208423
  modeConfigurationDefault$2
208417
208424
  );
208418
208425
  function getMode$3() {
208419
- return __vitePreload(() => import("./cssMode-B77M9HlN.js"), true ? __vite__mapDeps([0,1]) : void 0, import.meta.url);
208426
+ return __vitePreload(() => import("./cssMode-CPfLk04b.js"), true ? __vite__mapDeps([0,1]) : void 0, import.meta.url);
208420
208427
  }
208421
208428
  languages.onLanguage("less", () => {
208422
208429
  getMode$3().then((mode2) => mode2.setupMode(lessDefaults));
@@ -208521,7 +208528,7 @@ const razorLanguageService = registerHTMLLanguageService(
208521
208528
  );
208522
208529
  const razorDefaults = razorLanguageService.defaults;
208523
208530
  function getMode$2() {
208524
- return __vitePreload(() => import("./htmlMode-DIWkIawy.js"), true ? __vite__mapDeps([2,1]) : void 0, import.meta.url);
208531
+ return __vitePreload(() => import("./htmlMode-CRHIwtvP.js"), true ? __vite__mapDeps([2,1]) : void 0, import.meta.url);
208525
208532
  }
208526
208533
  function registerHTMLLanguageService(languageId, options = optionsDefault, modeConfiguration = getConfigurationDefault(languageId)) {
208527
208534
  const defaults = new LanguageServiceDefaultsImpl$2(languageId, options, modeConfiguration);
@@ -208605,7 +208612,7 @@ const jsonDefaults = new LanguageServiceDefaultsImpl$1(
208605
208612
  );
208606
208613
  const getWorker$1 = () => getMode$1().then((mode2) => mode2.getWorker());
208607
208614
  function getMode$1() {
208608
- return __vitePreload(() => import("./jsonMode-BzFKTZjJ.js"), true ? __vite__mapDeps([3,1]) : void 0, import.meta.url);
208615
+ return __vitePreload(() => import("./jsonMode-Cy7-eWai.js"), true ? __vite__mapDeps([3,1]) : void 0, import.meta.url);
208609
208616
  }
208610
208617
  languages.register({
208611
208618
  id: "json",
@@ -208851,7 +208858,7 @@ const getJavaScriptWorker = () => {
208851
208858
  return getMode().then((mode) => mode.getJavaScriptWorker());
208852
208859
  };
208853
208860
  function getMode() {
208854
- return __vitePreload(() => import("./tsMode-CTCpE-67.js"), true ? [] : void 0, import.meta.url);
208861
+ return __vitePreload(() => import("./tsMode-DxBdlGZB.js"), true ? [] : void 0, import.meta.url);
208855
208862
  }
208856
208863
  languages.onLanguage("typescript", () => {
208857
208864
  return getMode().then((mode) => mode.setupTypeScript(typescriptDefaults));
@@ -209046,49 +209053,49 @@ registerLanguage({
209046
209053
  extensions: [".ftl", ".ftlh", ".ftlx"],
209047
209054
  aliases: ["FreeMarker2", "Apache FreeMarker2"],
209048
209055
  loader: () => {
209049
- return __vitePreload(() => import("./freemarker2-oUT2zvyQ.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
209056
+ return __vitePreload(() => import("./freemarker2-CDHpuFqv.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
209050
209057
  }
209051
209058
  });
209052
209059
  registerLanguage({
209053
209060
  id: "freemarker2.tag-angle.interpolation-dollar",
209054
209061
  aliases: ["FreeMarker2 (Angle/Dollar)", "Apache FreeMarker2 (Angle/Dollar)"],
209055
209062
  loader: () => {
209056
- return __vitePreload(() => import("./freemarker2-oUT2zvyQ.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationDollar);
209063
+ return __vitePreload(() => import("./freemarker2-CDHpuFqv.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationDollar);
209057
209064
  }
209058
209065
  });
209059
209066
  registerLanguage({
209060
209067
  id: "freemarker2.tag-bracket.interpolation-dollar",
209061
209068
  aliases: ["FreeMarker2 (Bracket/Dollar)", "Apache FreeMarker2 (Bracket/Dollar)"],
209062
209069
  loader: () => {
209063
- return __vitePreload(() => import("./freemarker2-oUT2zvyQ.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationDollar);
209070
+ return __vitePreload(() => import("./freemarker2-CDHpuFqv.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationDollar);
209064
209071
  }
209065
209072
  });
209066
209073
  registerLanguage({
209067
209074
  id: "freemarker2.tag-angle.interpolation-bracket",
209068
209075
  aliases: ["FreeMarker2 (Angle/Bracket)", "Apache FreeMarker2 (Angle/Bracket)"],
209069
209076
  loader: () => {
209070
- return __vitePreload(() => import("./freemarker2-oUT2zvyQ.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationBracket);
209077
+ return __vitePreload(() => import("./freemarker2-CDHpuFqv.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationBracket);
209071
209078
  }
209072
209079
  });
209073
209080
  registerLanguage({
209074
209081
  id: "freemarker2.tag-bracket.interpolation-bracket",
209075
209082
  aliases: ["FreeMarker2 (Bracket/Bracket)", "Apache FreeMarker2 (Bracket/Bracket)"],
209076
209083
  loader: () => {
209077
- return __vitePreload(() => import("./freemarker2-oUT2zvyQ.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationBracket);
209084
+ return __vitePreload(() => import("./freemarker2-CDHpuFqv.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationBracket);
209078
209085
  }
209079
209086
  });
209080
209087
  registerLanguage({
209081
209088
  id: "freemarker2.tag-auto.interpolation-dollar",
209082
209089
  aliases: ["FreeMarker2 (Auto/Dollar)", "Apache FreeMarker2 (Auto/Dollar)"],
209083
209090
  loader: () => {
209084
- return __vitePreload(() => import("./freemarker2-oUT2zvyQ.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
209091
+ return __vitePreload(() => import("./freemarker2-CDHpuFqv.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
209085
209092
  }
209086
209093
  });
209087
209094
  registerLanguage({
209088
209095
  id: "freemarker2.tag-auto.interpolation-bracket",
209089
209096
  aliases: ["FreeMarker2 (Auto/Bracket)", "Apache FreeMarker2 (Auto/Bracket)"],
209090
209097
  loader: () => {
209091
- return __vitePreload(() => import("./freemarker2-oUT2zvyQ.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationBracket);
209098
+ return __vitePreload(() => import("./freemarker2-CDHpuFqv.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationBracket);
209092
209099
  }
209093
209100
  });
209094
209101
  registerLanguage({
@@ -209109,7 +209116,7 @@ registerLanguage({
209109
209116
  extensions: [".handlebars", ".hbs"],
209110
209117
  aliases: ["Handlebars", "handlebars", "hbs"],
209111
209118
  mimetypes: ["text/x-handlebars-template"],
209112
- loader: () => __vitePreload(() => import("./handlebars-jCckoi5j.js"), true ? [] : void 0, import.meta.url)
209119
+ loader: () => __vitePreload(() => import("./handlebars-CgX9Jz36.js"), true ? [] : void 0, import.meta.url)
209113
209120
  });
209114
209121
  registerLanguage({
209115
209122
  id: "hcl",
@@ -209122,7 +209129,7 @@ registerLanguage({
209122
209129
  extensions: [".html", ".htm", ".shtml", ".xhtml", ".mdoc", ".jsp", ".asp", ".aspx", ".jshtm"],
209123
209130
  aliases: ["HTML", "htm", "html", "xhtml"],
209124
209131
  mimetypes: ["text/html", "text/x-jshtm", "text/template", "text/ng-template"],
209125
- loader: () => __vitePreload(() => import("./html-kAgrAaKW.js"), true ? [] : void 0, import.meta.url)
209132
+ loader: () => __vitePreload(() => import("./html-DdgFccDG.js"), true ? [] : void 0, import.meta.url)
209126
209133
  });
209127
209134
  registerLanguage({
209128
209135
  id: "ini",
@@ -209145,7 +209152,7 @@ registerLanguage({
209145
209152
  filenames: ["jakefile"],
209146
209153
  aliases: ["JavaScript", "javascript", "js"],
209147
209154
  mimetypes: ["text/javascript"],
209148
- loader: () => __vitePreload(() => import("./javascript-B9GYUE-I.js"), true ? __vite__mapDeps([4,5]) : void 0, import.meta.url)
209155
+ loader: () => __vitePreload(() => import("./javascript-CHhxL0s7.js"), true ? __vite__mapDeps([4,5]) : void 0, import.meta.url)
209149
209156
  });
209150
209157
  registerLanguage({
209151
209158
  id: "julia",
@@ -209184,7 +209191,7 @@ registerLanguage({
209184
209191
  extensions: [".liquid", ".html.liquid"],
209185
209192
  aliases: ["Liquid", "liquid"],
209186
209193
  mimetypes: ["application/liquid"],
209187
- loader: () => __vitePreload(() => import("./liquid-Ccw-S_Y6.js"), true ? [] : void 0, import.meta.url)
209194
+ loader: () => __vitePreload(() => import("./liquid-vMkF9pfk.js"), true ? [] : void 0, import.meta.url)
209188
209195
  });
209189
209196
  registerLanguage({
209190
209197
  id: "m3",
@@ -209202,7 +209209,7 @@ registerLanguage({
209202
209209
  id: "mdx",
209203
209210
  extensions: [".mdx"],
209204
209211
  aliases: ["MDX", "mdx"],
209205
- loader: () => __vitePreload(() => import("./mdx-oXeAA0qU.js"), true ? [] : void 0, import.meta.url)
209212
+ loader: () => __vitePreload(() => import("./mdx-C4UVz5dW.js"), true ? [] : void 0, import.meta.url)
209206
209213
  });
209207
209214
  registerLanguage({
209208
209215
  id: "mips",
@@ -209301,7 +209308,7 @@ registerLanguage({
209301
209308
  extensions: [".py", ".rpy", ".pyw", ".cpy", ".gyp", ".gypi"],
209302
209309
  aliases: ["Python", "py"],
209303
209310
  firstLine: "^#!/.*\\bpython[0-9.-]*\\b",
209304
- loader: () => __vitePreload(() => import("./python-DlSX3TvA.js"), true ? [] : void 0, import.meta.url)
209311
+ loader: () => __vitePreload(() => import("./python-BHemzN9g.js"), true ? [] : void 0, import.meta.url)
209305
209312
  });
209306
209313
  registerLanguage({
209307
209314
  id: "qsharp",
@@ -209320,7 +209327,7 @@ registerLanguage({
209320
209327
  extensions: [".cshtml"],
209321
209328
  aliases: ["Razor", "razor"],
209322
209329
  mimetypes: ["text/x-cshtml"],
209323
- loader: () => __vitePreload(() => import("./razor-ButO9S7r.js"), true ? [] : void 0, import.meta.url)
209330
+ loader: () => __vitePreload(() => import("./razor-DH6NPzbo.js"), true ? [] : void 0, import.meta.url)
209324
209331
  });
209325
209332
  registerLanguage({
209326
209333
  id: "redis",
@@ -209453,7 +209460,7 @@ registerLanguage({
209453
209460
  aliases: ["TypeScript", "ts", "typescript"],
209454
209461
  mimetypes: ["text/typescript"],
209455
209462
  loader: () => {
209456
- return __vitePreload(() => import("./typescript-9o62WOnS.js"), true ? [] : void 0, import.meta.url);
209463
+ return __vitePreload(() => import("./typescript-BRCOaBQ5.js"), true ? [] : void 0, import.meta.url);
209457
209464
  }
209458
209465
  });
209459
209466
  registerLanguage({
@@ -209498,14 +209505,14 @@ registerLanguage({
209498
209505
  firstLine: "(\\<\\?xml.*)|(\\<svg)|(\\<\\!doctype\\s+svg)",
209499
209506
  aliases: ["XML", "xml"],
209500
209507
  mimetypes: ["text/xml", "application/xml", "application/xaml+xml", "application/xml-dtd"],
209501
- loader: () => __vitePreload(() => import("./xml-C4nOH2_D.js"), true ? [] : void 0, import.meta.url)
209508
+ loader: () => __vitePreload(() => import("./xml-DVv9gDP1.js"), true ? [] : void 0, import.meta.url)
209502
209509
  });
209503
209510
  registerLanguage({
209504
209511
  id: "yaml",
209505
209512
  extensions: [".yaml", ".yml"],
209506
209513
  aliases: ["YAML", "yaml", "YML", "yml"],
209507
209514
  mimetypes: ["application/x-yaml", "text/x-yaml"],
209508
- loader: () => __vitePreload(() => import("./yaml-mXYgKoWW.js"), true ? [] : void 0, import.meta.url)
209515
+ loader: () => __vitePreload(() => import("./yaml-jB-C3CdS.js"), true ? [] : void 0, import.meta.url)
209509
209516
  });
209510
209517
  var __defProp = Object.defineProperty;
209511
209518
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -1,5 +1,5 @@
1
- import { conf as conf$1, language as language$1 } from "./typescript-9o62WOnS.js";
2
- import "./index-CN3UN7Tm.js";
1
+ import { conf as conf$1, language as language$1 } from "./typescript-BRCOaBQ5.js";
2
+ import "./index-DVdWgw7p.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-CN3UN7Tm.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-BE0g7ubH.js";
3
- import { a, D, h, R, c, i, j, t, k } from "./lspLanguageFeatures-BE0g7ubH.js";
1
+ import { c as createWebWorker, l as languages, e as editor } from "./index-DVdWgw7p.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-nAygNzuG.js";
3
+ import { a, D, h, R, c, i, j, t, k } from "./lspLanguageFeatures-nAygNzuG.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-CN3UN7Tm.js";
1
+ import { l as languages } from "./index-DVdWgw7p.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-CN3UN7Tm.js";
1
+ import { R as Range$1, l as languages, e as editor, U as Uri, M as MarkerSeverity } from "./index-DVdWgw7p.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-CN3UN7Tm.js";
1
+ import { l as languages } from "./index-DVdWgw7p.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  blockComment: ["{/*", "*/}"]
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-CN3UN7Tm.js";
1
+ import { l as languages } from "./index-DVdWgw7p.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  lineComment: "#",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-CN3UN7Tm.js";
1
+ import { l as languages } from "./index-DVdWgw7p.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "area",
4
4
  "base",
@@ -1,4 +1,4 @@
1
- import { c as createWebWorker, e as editor, U as Uri, a as MarkerTag, M as MarkerSeverity, l as languages, t as typescriptDefaults, R as Range } from "./index-CN3UN7Tm.js";
1
+ import { c as createWebWorker, e as editor, U as Uri, a as MarkerTag, M as MarkerSeverity, l as languages, t as typescriptDefaults, R as Range } from "./index-DVdWgw7p.js";
2
2
  class WorkerManager {
3
3
  constructor(_modeId, _defaults) {
4
4
  this._modeId = _modeId;
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-CN3UN7Tm.js";
1
+ import { l as languages } from "./index-DVdWgw7p.js";
2
2
  const conf = {
3
3
  wordPattern: /(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,
4
4
  comments: {
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-CN3UN7Tm.js";
1
+ import { l as languages } from "./index-DVdWgw7p.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  blockComment: ["<!--", "-->"]
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-CN3UN7Tm.js";
1
+ import { l as languages } from "./index-DVdWgw7p.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  lineComment: "#"
@@ -106,7 +106,7 @@
106
106
  :root[data-theme='catppuccin-latte'] .boot-splash-title { color: #2f3145; }
107
107
  :root[data-theme='catppuccin-latte'] .boot-splash-label { color: #7c7f93; }
108
108
  </style>
109
- <script type="module" crossorigin src="./assets/index-CN3UN7Tm.js"></script>
109
+ <script type="module" crossorigin src="./assets/index-DVdWgw7p.js"></script>
110
110
  <link rel="stylesheet" crossorigin href="./assets/index-3sFJEz7i.css">
111
111
  </head>
112
112
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phenx-inc/ctlsurf",
3
- "version": "0.15.1",
3
+ "version": "0.15.2",
4
4
  "description": "Agent-agnostic terminal and desktop app for ctlsurf — run Claude Code, Codex, or any coding agent with live session logging and remote control",
5
5
  "main": "out/main/index.js",
6
6
  "bin": {
@@ -15,10 +15,11 @@ interface FloatingMicProps {
15
15
  onHide: () => void
16
16
  }
17
17
 
18
- // Keep the button clear of the 38px titlebar and 24px status bar.
18
+ // Keep the toolbar clear of the 38px titlebar, 24px status bar, and the
19
+ // terminal's bottom input line.
19
20
  const EDGE = 20
20
21
  const TOP_MIN = 46
21
- const BOTTOM_GAP = 36
22
+ const BOTTOM_GAP = 72
22
23
 
23
24
  function loadPos(): Pos | null {
24
25
  try {
@@ -71,17 +72,20 @@ export function FloatingMic({ onTranscript, onHide }: FloatingMicProps) {
71
72
  }
72
73
  }, [])
73
74
 
74
- // First mount with no saved position: default to bottom-right.
75
+ // Default to bottom-right, and clamp saved positions on first mount too so
76
+ // increased chrome/input clearance applies to existing installations.
75
77
  useEffect(() => {
76
- if (pos) return
77
- const el = elRef.current
78
- const w = el?.offsetWidth ?? 64
79
- const h = el?.offsetHeight ?? 90
80
- setPos({
81
- x: window.innerWidth - w - EDGE,
82
- y: window.innerHeight - h - BOTTOM_GAP,
78
+ setPos((current) => {
79
+ if (current) return clamp(current.x, current.y)
80
+ const el = elRef.current
81
+ const w = el?.offsetWidth ?? 64
82
+ const h = el?.offsetHeight ?? 90
83
+ return clamp(
84
+ window.innerWidth - w - EDGE,
85
+ window.innerHeight - h - BOTTOM_GAP,
86
+ )
83
87
  })
84
- }, [pos])
88
+ }, [clamp])
85
89
 
86
90
  // Keep it reachable if the window shrinks.
87
91
  useEffect(() => {
@@ -197,6 +197,11 @@ function getOrCreateTerminal(tabId: string, onExit: (tabId: string) => void): {
197
197
 
198
198
  const terminal = new Terminal({
199
199
  cursorBlink: true,
200
+ // Codex and other modern CLIs often render links as OSC 8 hyperlinks
201
+ // instead of plain URL text. OSC 8 links are handled by xterm core (not
202
+ // WebLinksAddon), whose default activation calls window.open(). Route them
203
+ // through the same embedded-panel handler as detected plain-text URLs.
204
+ linkHandler: { activate: handleTerminalLink },
200
205
  // Off by default on macOS; without this a right-click would reselect the
201
206
  // word under the cursor and clobber a multi-line table selection.
202
207
  rightClickSelectsWord: false,
@@ -469,8 +474,12 @@ export function TerminalPanel({ tabId, agent, onSpawn, onExit, isActive }: Termi
469
474
 
470
475
  // Wheel over the terminal is an explicit user scroll — stamp it so onScroll
471
476
  // treats the resulting move as intentional (not an involuntary redraw jump).
477
+ // Capture is important: xterm handles wheel events on a descendant and
478
+ // emits onScroll synchronously. A bubbling listener runs too late, causing
479
+ // streamed Codex output to mistake the wheel scroll for a redraw and snap
480
+ // the viewport straight back to the bottom.
472
481
  const onWheel = () => markGesture(tabId)
473
- terminal.element?.addEventListener('wheel', onWheel, { passive: true })
482
+ terminal.element?.addEventListener('wheel', onWheel, { capture: true, passive: true })
474
483
 
475
484
  // Resize handling — skip when the container is hidden (display:none → 0x0),
476
485
  // otherwise fit() reports a tiny size and the PTY gets stuck at ~4 cols
@@ -499,7 +508,7 @@ export function TerminalPanel({ tabId, agent, onSpawn, onExit, isActive }: Termi
499
508
  clearTimeout(resizeTimeout)
500
509
  window.removeEventListener('resize', handleResize)
501
510
  observer.disconnect()
502
- terminal.element?.removeEventListener('wheel', onWheel)
511
+ terminal.element?.removeEventListener('wheel', onWheel, true)
503
512
  // Do NOT dispose terminal or unsub PTY listeners — they persist across remounts
504
513
  }
505
514
  }, [tabId, onExit])