@phenx-inc/ctlsurf 0.1.2 → 0.1.3

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 (27) hide show
  1. package/out/headless/index.mjs +4 -2
  2. package/out/headless/index.mjs.map +2 -2
  3. package/out/main/index.js +3678 -4
  4. package/out/renderer/assets/{cssMode-DL0XItGB.js → cssMode-CY6x0qXW.js} +3 -3
  5. package/out/renderer/assets/{freemarker2-CrOEuDcF.js → freemarker2-BXSW9BAX.js} +1 -1
  6. package/out/renderer/assets/{handlebars-D4QYaBof.js → handlebars-BYUZ1IOs.js} +1 -1
  7. package/out/renderer/assets/{html-B2Dqk2ai.js → html-DPocQM4t.js} +1 -1
  8. package/out/renderer/assets/{htmlMode-CdZ0Prhd.js → htmlMode-CsPinKYA.js} +3 -3
  9. package/out/renderer/assets/{index-pZmE1QXB.js → index-Bml7oDn9.js} +84 -36
  10. package/out/renderer/assets/{index-CJ6RsQWP.css → index-DK9wLFFm.css} +146 -0
  11. package/out/renderer/assets/{javascript-CK8zNQXj.js → javascript-_HVGB-lj.js} +2 -2
  12. package/out/renderer/assets/{jsonMode-Cewaellc.js → jsonMode-JbrRQBOU.js} +3 -3
  13. package/out/renderer/assets/{liquid-Bd3GPNs2.js → liquid-B7izKdqo.js} +1 -1
  14. package/out/renderer/assets/{lspLanguageFeatures-DSDH7BnA.js → lspLanguageFeatures-DzxH499X.js} +1 -1
  15. package/out/renderer/assets/{mdx-CCPVCrXC.js → mdx-CmvUeYLw.js} +1 -1
  16. package/out/renderer/assets/{python-34jOtlcC.js → python-DJqYTFoi.js} +1 -1
  17. package/out/renderer/assets/{razor-DXRw694z.js → razor-CGEA5nUK.js} +1 -1
  18. package/out/renderer/assets/{tsMode-CmND5_wB.js → tsMode-CN0FOHMy.js} +1 -1
  19. package/out/renderer/assets/{typescript-BNNI0Euv.js → typescript-CIn-DSfY.js} +1 -1
  20. package/out/renderer/assets/{xml-CgdndrNB.js → xml-C5t3U2jS.js} +1 -1
  21. package/out/renderer/assets/{yaml-DNWPIf1s.js → yaml-n-Jb6xf1.js} +1 -1
  22. package/out/renderer/index.html +2 -2
  23. package/package.json +6 -4
  24. package/src/main/workerWs.ts +6 -2
  25. package/src/renderer/App.tsx +38 -12
  26. package/src/renderer/components/AgentPicker.tsx +49 -0
  27. package/src/renderer/styles.css +146 -0
@@ -1,6 +1,6 @@
1
- import { c as createWebWorker, l as languages } from "./index-pZmE1QXB.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-DSDH7BnA.js";
3
- import { h, i, j, t, k } from "./lspLanguageFeatures-DSDH7BnA.js";
1
+ import { c as createWebWorker, l as languages } from "./index-Bml7oDn9.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-DzxH499X.js";
3
+ import { h, i, j, t, k } from "./lspLanguageFeatures-DzxH499X.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-pZmE1QXB.js";
1
+ import { l as languages } from "./index-Bml7oDn9.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "assign",
4
4
  "flush",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-pZmE1QXB.js";
1
+ import { l as languages } from "./index-Bml7oDn9.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "area",
4
4
  "base",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-pZmE1QXB.js";
1
+ import { l as languages } from "./index-Bml7oDn9.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-pZmE1QXB.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-DSDH7BnA.js";
3
- import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-DSDH7BnA.js";
1
+ import { c as createWebWorker, l as languages } from "./index-Bml7oDn9.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-DzxH499X.js";
3
+ import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-DzxH499X.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-DL0XItGB.js","./lspLanguageFeatures-DSDH7BnA.js","./htmlMode-CdZ0Prhd.js","./jsonMode-Cewaellc.js","./javascript-CK8zNQXj.js","./typescript-BNNI0Euv.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./cssMode-CY6x0qXW.js","./lspLanguageFeatures-DzxH499X.js","./htmlMode-CsPinKYA.js","./jsonMode-JbrRQBOU.js","./javascript-_HVGB-lj.js","./typescript-CIn-DSfY.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
  }
@@ -206489,7 +206489,7 @@ const lessDefaults = new LanguageServiceDefaultsImpl$3(
206489
206489
  modeConfigurationDefault$2
206490
206490
  );
206491
206491
  function getMode$3() {
206492
- return __vitePreload(() => import("./cssMode-DL0XItGB.js"), true ? __vite__mapDeps([0,1]) : void 0, import.meta.url);
206492
+ return __vitePreload(() => import("./cssMode-CY6x0qXW.js"), true ? __vite__mapDeps([0,1]) : void 0, import.meta.url);
206493
206493
  }
206494
206494
  languages.onLanguage("less", () => {
206495
206495
  getMode$3().then((mode2) => mode2.setupMode(lessDefaults));
@@ -206594,7 +206594,7 @@ const razorLanguageService = registerHTMLLanguageService(
206594
206594
  );
206595
206595
  const razorDefaults = razorLanguageService.defaults;
206596
206596
  function getMode$2() {
206597
- return __vitePreload(() => import("./htmlMode-CdZ0Prhd.js"), true ? __vite__mapDeps([2,1]) : void 0, import.meta.url);
206597
+ return __vitePreload(() => import("./htmlMode-CsPinKYA.js"), true ? __vite__mapDeps([2,1]) : void 0, import.meta.url);
206598
206598
  }
206599
206599
  function registerHTMLLanguageService(languageId, options = optionsDefault, modeConfiguration = getConfigurationDefault(languageId)) {
206600
206600
  const defaults = new LanguageServiceDefaultsImpl$2(languageId, options, modeConfiguration);
@@ -206678,7 +206678,7 @@ const jsonDefaults = new LanguageServiceDefaultsImpl$1(
206678
206678
  );
206679
206679
  const getWorker$1 = () => getMode$1().then((mode2) => mode2.getWorker());
206680
206680
  function getMode$1() {
206681
- return __vitePreload(() => import("./jsonMode-Cewaellc.js"), true ? __vite__mapDeps([3,1]) : void 0, import.meta.url);
206681
+ return __vitePreload(() => import("./jsonMode-JbrRQBOU.js"), true ? __vite__mapDeps([3,1]) : void 0, import.meta.url);
206682
206682
  }
206683
206683
  languages.register({
206684
206684
  id: "json",
@@ -206924,7 +206924,7 @@ const getJavaScriptWorker = () => {
206924
206924
  return getMode().then((mode) => mode.getJavaScriptWorker());
206925
206925
  };
206926
206926
  function getMode() {
206927
- return __vitePreload(() => import("./tsMode-CmND5_wB.js"), true ? [] : void 0, import.meta.url);
206927
+ return __vitePreload(() => import("./tsMode-CN0FOHMy.js"), true ? [] : void 0, import.meta.url);
206928
206928
  }
206929
206929
  languages.onLanguage("typescript", () => {
206930
206930
  return getMode().then((mode) => mode.setupTypeScript(typescriptDefaults));
@@ -207119,49 +207119,49 @@ registerLanguage({
207119
207119
  extensions: [".ftl", ".ftlh", ".ftlx"],
207120
207120
  aliases: ["FreeMarker2", "Apache FreeMarker2"],
207121
207121
  loader: () => {
207122
- return __vitePreload(() => import("./freemarker2-CrOEuDcF.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
207122
+ return __vitePreload(() => import("./freemarker2-BXSW9BAX.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
207123
207123
  }
207124
207124
  });
207125
207125
  registerLanguage({
207126
207126
  id: "freemarker2.tag-angle.interpolation-dollar",
207127
207127
  aliases: ["FreeMarker2 (Angle/Dollar)", "Apache FreeMarker2 (Angle/Dollar)"],
207128
207128
  loader: () => {
207129
- return __vitePreload(() => import("./freemarker2-CrOEuDcF.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationDollar);
207129
+ return __vitePreload(() => import("./freemarker2-BXSW9BAX.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationDollar);
207130
207130
  }
207131
207131
  });
207132
207132
  registerLanguage({
207133
207133
  id: "freemarker2.tag-bracket.interpolation-dollar",
207134
207134
  aliases: ["FreeMarker2 (Bracket/Dollar)", "Apache FreeMarker2 (Bracket/Dollar)"],
207135
207135
  loader: () => {
207136
- return __vitePreload(() => import("./freemarker2-CrOEuDcF.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationDollar);
207136
+ return __vitePreload(() => import("./freemarker2-BXSW9BAX.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationDollar);
207137
207137
  }
207138
207138
  });
207139
207139
  registerLanguage({
207140
207140
  id: "freemarker2.tag-angle.interpolation-bracket",
207141
207141
  aliases: ["FreeMarker2 (Angle/Bracket)", "Apache FreeMarker2 (Angle/Bracket)"],
207142
207142
  loader: () => {
207143
- return __vitePreload(() => import("./freemarker2-CrOEuDcF.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationBracket);
207143
+ return __vitePreload(() => import("./freemarker2-BXSW9BAX.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationBracket);
207144
207144
  }
207145
207145
  });
207146
207146
  registerLanguage({
207147
207147
  id: "freemarker2.tag-bracket.interpolation-bracket",
207148
207148
  aliases: ["FreeMarker2 (Bracket/Bracket)", "Apache FreeMarker2 (Bracket/Bracket)"],
207149
207149
  loader: () => {
207150
- return __vitePreload(() => import("./freemarker2-CrOEuDcF.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationBracket);
207150
+ return __vitePreload(() => import("./freemarker2-BXSW9BAX.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationBracket);
207151
207151
  }
207152
207152
  });
207153
207153
  registerLanguage({
207154
207154
  id: "freemarker2.tag-auto.interpolation-dollar",
207155
207155
  aliases: ["FreeMarker2 (Auto/Dollar)", "Apache FreeMarker2 (Auto/Dollar)"],
207156
207156
  loader: () => {
207157
- return __vitePreload(() => import("./freemarker2-CrOEuDcF.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
207157
+ return __vitePreload(() => import("./freemarker2-BXSW9BAX.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
207158
207158
  }
207159
207159
  });
207160
207160
  registerLanguage({
207161
207161
  id: "freemarker2.tag-auto.interpolation-bracket",
207162
207162
  aliases: ["FreeMarker2 (Auto/Bracket)", "Apache FreeMarker2 (Auto/Bracket)"],
207163
207163
  loader: () => {
207164
- return __vitePreload(() => import("./freemarker2-CrOEuDcF.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationBracket);
207164
+ return __vitePreload(() => import("./freemarker2-BXSW9BAX.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationBracket);
207165
207165
  }
207166
207166
  });
207167
207167
  registerLanguage({
@@ -207182,7 +207182,7 @@ registerLanguage({
207182
207182
  extensions: [".handlebars", ".hbs"],
207183
207183
  aliases: ["Handlebars", "handlebars", "hbs"],
207184
207184
  mimetypes: ["text/x-handlebars-template"],
207185
- loader: () => __vitePreload(() => import("./handlebars-D4QYaBof.js"), true ? [] : void 0, import.meta.url)
207185
+ loader: () => __vitePreload(() => import("./handlebars-BYUZ1IOs.js"), true ? [] : void 0, import.meta.url)
207186
207186
  });
207187
207187
  registerLanguage({
207188
207188
  id: "hcl",
@@ -207195,7 +207195,7 @@ registerLanguage({
207195
207195
  extensions: [".html", ".htm", ".shtml", ".xhtml", ".mdoc", ".jsp", ".asp", ".aspx", ".jshtm"],
207196
207196
  aliases: ["HTML", "htm", "html", "xhtml"],
207197
207197
  mimetypes: ["text/html", "text/x-jshtm", "text/template", "text/ng-template"],
207198
- loader: () => __vitePreload(() => import("./html-B2Dqk2ai.js"), true ? [] : void 0, import.meta.url)
207198
+ loader: () => __vitePreload(() => import("./html-DPocQM4t.js"), true ? [] : void 0, import.meta.url)
207199
207199
  });
207200
207200
  registerLanguage({
207201
207201
  id: "ini",
@@ -207218,7 +207218,7 @@ registerLanguage({
207218
207218
  filenames: ["jakefile"],
207219
207219
  aliases: ["JavaScript", "javascript", "js"],
207220
207220
  mimetypes: ["text/javascript"],
207221
- loader: () => __vitePreload(() => import("./javascript-CK8zNQXj.js"), true ? __vite__mapDeps([4,5]) : void 0, import.meta.url)
207221
+ loader: () => __vitePreload(() => import("./javascript-_HVGB-lj.js"), true ? __vite__mapDeps([4,5]) : void 0, import.meta.url)
207222
207222
  });
207223
207223
  registerLanguage({
207224
207224
  id: "julia",
@@ -207257,7 +207257,7 @@ registerLanguage({
207257
207257
  extensions: [".liquid", ".html.liquid"],
207258
207258
  aliases: ["Liquid", "liquid"],
207259
207259
  mimetypes: ["application/liquid"],
207260
- loader: () => __vitePreload(() => import("./liquid-Bd3GPNs2.js"), true ? [] : void 0, import.meta.url)
207260
+ loader: () => __vitePreload(() => import("./liquid-B7izKdqo.js"), true ? [] : void 0, import.meta.url)
207261
207261
  });
207262
207262
  registerLanguage({
207263
207263
  id: "m3",
@@ -207275,7 +207275,7 @@ registerLanguage({
207275
207275
  id: "mdx",
207276
207276
  extensions: [".mdx"],
207277
207277
  aliases: ["MDX", "mdx"],
207278
- loader: () => __vitePreload(() => import("./mdx-CCPVCrXC.js"), true ? [] : void 0, import.meta.url)
207278
+ loader: () => __vitePreload(() => import("./mdx-CmvUeYLw.js"), true ? [] : void 0, import.meta.url)
207279
207279
  });
207280
207280
  registerLanguage({
207281
207281
  id: "mips",
@@ -207374,7 +207374,7 @@ registerLanguage({
207374
207374
  extensions: [".py", ".rpy", ".pyw", ".cpy", ".gyp", ".gypi"],
207375
207375
  aliases: ["Python", "py"],
207376
207376
  firstLine: "^#!/.*\\bpython[0-9.-]*\\b",
207377
- loader: () => __vitePreload(() => import("./python-34jOtlcC.js"), true ? [] : void 0, import.meta.url)
207377
+ loader: () => __vitePreload(() => import("./python-DJqYTFoi.js"), true ? [] : void 0, import.meta.url)
207378
207378
  });
207379
207379
  registerLanguage({
207380
207380
  id: "qsharp",
@@ -207393,7 +207393,7 @@ registerLanguage({
207393
207393
  extensions: [".cshtml"],
207394
207394
  aliases: ["Razor", "razor"],
207395
207395
  mimetypes: ["text/x-cshtml"],
207396
- loader: () => __vitePreload(() => import("./razor-DXRw694z.js"), true ? [] : void 0, import.meta.url)
207396
+ loader: () => __vitePreload(() => import("./razor-CGEA5nUK.js"), true ? [] : void 0, import.meta.url)
207397
207397
  });
207398
207398
  registerLanguage({
207399
207399
  id: "redis",
@@ -207526,7 +207526,7 @@ registerLanguage({
207526
207526
  aliases: ["TypeScript", "ts", "typescript"],
207527
207527
  mimetypes: ["text/typescript"],
207528
207528
  loader: () => {
207529
- return __vitePreload(() => import("./typescript-BNNI0Euv.js"), true ? [] : void 0, import.meta.url);
207529
+ return __vitePreload(() => import("./typescript-CIn-DSfY.js"), true ? [] : void 0, import.meta.url);
207530
207530
  }
207531
207531
  });
207532
207532
  registerLanguage({
@@ -207571,14 +207571,14 @@ registerLanguage({
207571
207571
  firstLine: "(\\<\\?xml.*)|(\\<svg)|(\\<\\!doctype\\s+svg)",
207572
207572
  aliases: ["XML", "xml"],
207573
207573
  mimetypes: ["text/xml", "application/xml", "application/xaml+xml", "application/xml-dtd"],
207574
- loader: () => __vitePreload(() => import("./xml-CgdndrNB.js"), true ? [] : void 0, import.meta.url)
207574
+ loader: () => __vitePreload(() => import("./xml-C5t3U2jS.js"), true ? [] : void 0, import.meta.url)
207575
207575
  });
207576
207576
  registerLanguage({
207577
207577
  id: "yaml",
207578
207578
  extensions: [".yaml", ".yml"],
207579
207579
  aliases: ["YAML", "yaml", "YML", "yml"],
207580
207580
  mimetypes: ["application/x-yaml", "text/x-yaml"],
207581
- loader: () => __vitePreload(() => import("./yaml-DNWPIf1s.js"), true ? [] : void 0, import.meta.url)
207581
+ loader: () => __vitePreload(() => import("./yaml-n-Jb6xf1.js"), true ? [] : void 0, import.meta.url)
207582
207582
  });
207583
207583
  var __defProp = Object.defineProperty;
207584
207584
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -211067,6 +211067,31 @@ function EditorPanel({ cwd: cwd2 }) {
211067
211067
  ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "editor-placeholder", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Select a file to edit" }) }) })
211068
211068
  ] });
211069
211069
  }
211070
+ function AgentPicker({ agents, cwd: cwd2, onSelect, onChangeCwd }) {
211071
+ const displayPath = cwd2.replace(/^\/Users\/[^/]+/, "~");
211072
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "agent-picker-overlay", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "agent-picker-modal", children: [
211073
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "agent-picker-brand", children: "ctlsurf" }),
211074
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "agent-picker-cwd", onClick: onChangeCwd, title: "Click to change directory", children: [
211075
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "agent-picker-cwd-icon", children: "📂" }),
211076
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "agent-picker-cwd-path", children: displayPath }),
211077
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "agent-picker-cwd-change", children: "change" })
211078
+ ] }),
211079
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "agent-picker-title", children: "SELECT AGENT" }),
211080
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "agent-picker-list", children: agents.map((a) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
211081
+ "button",
211082
+ {
211083
+ className: "agent-picker-item",
211084
+ onClick: () => onSelect(a),
211085
+ children: [
211086
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "agent-picker-name", children: a.name }),
211087
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "agent-picker-desc", children: a.description })
211088
+ ]
211089
+ },
211090
+ a.id
211091
+ )) }),
211092
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "agent-picker-hint", children: "Select an agent to start" })
211093
+ ] }) });
211094
+ }
211070
211095
  function removePane(node, paneId) {
211071
211096
  if (node.type === "leaf") {
211072
211097
  return node.paneId === paneId ? null : node;
@@ -211579,11 +211604,10 @@ const DEFAULT_LAYOUT = {
211579
211604
  type: "split",
211580
211605
  direction: "horizontal",
211581
211606
  children: [
211582
- { type: "leaf", paneId: "editor" },
211583
211607
  { type: "leaf", paneId: "terminal" },
211584
211608
  { type: "leaf", paneId: "ctlsurf" }
211585
211609
  ],
211586
- sizes: [33.33, 33.33, 33.34]
211610
+ sizes: [50, 50]
211587
211611
  };
211588
211612
  const ALL_PANE_IDS = ["editor", "terminal", "ctlsurf"];
211589
211613
  function App() {
@@ -211597,14 +211621,16 @@ function App() {
211597
211621
  const [wsStatus, setWsStatus] = reactExports.useState("disconnected");
211598
211622
  const [cwd2, setCwd] = reactExports.useState(null);
211599
211623
  const visiblePaneIds = findPaneIds(layout2);
211624
+ const [showAgentPicker, setShowAgentPicker] = reactExports.useState(true);
211600
211625
  reactExports.useEffect(() => {
211601
211626
  async function init2() {
211602
211627
  const list2 = await window.worker.listAgents();
211603
- const defaultAgent = await window.worker.getDefaultAgent();
211604
211628
  setAgents(list2);
211605
- setSelectedAgent(defaultAgent);
211606
211629
  const status2 = await window.worker.getWorkerStatus();
211607
211630
  setWsStatus(status2);
211631
+ const initialCwd = await window.worker.getCwd().catch(() => window.worker.getHomePath());
211632
+ setCwd(initialCwd);
211633
+ cwdRef.current = initialCwd;
211608
211634
  }
211609
211635
  init2();
211610
211636
  }, []);
@@ -211729,6 +211755,18 @@ function App() {
211729
211755
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "titlebar-title", children: "ctlsurf-worker" }),
211730
211756
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "titlebar-controls", children: [
211731
211757
  /* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: "titlebar-btn", onClick: () => setShowSettings(true), title: "Settings", children: "Settings" }),
211758
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "titlebar-separator" }),
211759
+ agents.map((a) => /* @__PURE__ */ jsxRuntimeExports.jsx(
211760
+ "button",
211761
+ {
211762
+ className: `titlebar-agent-btn ${selectedAgent?.id === a.id ? "active" : ""}`,
211763
+ onClick: () => handleAgentChange(a.id),
211764
+ title: a.description,
211765
+ children: a.name
211766
+ },
211767
+ a.id
211768
+ )),
211769
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "titlebar-separator" }),
211732
211770
  ALL_PANE_IDS.map((id) => /* @__PURE__ */ jsxRuntimeExports.jsx(
211733
211771
  "button",
211734
211772
  {
@@ -211738,15 +211776,7 @@ function App() {
211738
211776
  children: id === "editor" ? "Editor" : id === "terminal" ? "Terminal" : "ctlsurf"
211739
211777
  },
211740
211778
  id
211741
- )),
211742
- /* @__PURE__ */ jsxRuntimeExports.jsx(
211743
- "select",
211744
- {
211745
- value: selectedAgent?.id || "",
211746
- onChange: (e) => handleAgentChange(e.target.value),
211747
- children: agents.map((a) => /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: a.id, children: a.name }, a.id))
211748
- }
211749
- )
211779
+ ))
211750
211780
  ] })
211751
211781
  ] }),
211752
211782
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "main-content", children: visiblePaneIds.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "multi-split-empty", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "All panes hidden. Use the titlebar buttons to show a pane." }) }) : /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -211759,7 +211789,25 @@ function App() {
211759
211789
  }
211760
211790
  ) }),
211761
211791
  /* @__PURE__ */ jsxRuntimeExports.jsx(StatusBar, { wsStatus, cwd: cwd2, onChangeCwd: handleChangeCwd }),
211762
- /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsDialog, { open: showSettings, onClose: () => setShowSettings(false) })
211792
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsDialog, { open: showSettings, onClose: () => setShowSettings(false) }),
211793
+ showAgentPicker && agents.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(
211794
+ AgentPicker,
211795
+ {
211796
+ agents,
211797
+ cwd: cwd2 || "",
211798
+ onSelect: (agent) => {
211799
+ setSelectedAgent(agent);
211800
+ setShowAgentPicker(false);
211801
+ },
211802
+ onChangeCwd: async () => {
211803
+ const newCwd = await window.worker.browseCwd();
211804
+ if (newCwd) {
211805
+ setCwd(newCwd);
211806
+ cwdRef.current = newCwd;
211807
+ }
211808
+ }
211809
+ }
211810
+ )
211763
211811
  ] });
211764
211812
  }
211765
211813
  ReactDOM.createRoot(document.getElementById("root")).render(
@@ -7468,6 +7468,36 @@ html, body, #root {
7468
7468
  background: #1f2335;
7469
7469
  }
7470
7470
 
7471
+ .titlebar-separator {
7472
+ width: 1px;
7473
+ height: 16px;
7474
+ background: #3b3d57;
7475
+ margin: 0 4px;
7476
+ }
7477
+
7478
+ .titlebar-agent-btn {
7479
+ background: #2a2b3d;
7480
+ color: #565f89;
7481
+ border: 1px solid #3b3d57;
7482
+ border-radius: 4px;
7483
+ padding: 2px 12px;
7484
+ font-size: 11px;
7485
+ cursor: pointer;
7486
+ transition: all 0.15s;
7487
+ }
7488
+
7489
+ .titlebar-agent-btn:hover {
7490
+ color: #a9b1d6;
7491
+ border-color: #565f89;
7492
+ }
7493
+
7494
+ .titlebar-agent-btn.active {
7495
+ color: #1a1b26;
7496
+ background: #7aa2f7;
7497
+ border-color: #7aa2f7;
7498
+ font-weight: 600;
7499
+ }
7500
+
7471
7501
  /* Main content area */
7472
7502
  .main-content {
7473
7503
  flex: 1;
@@ -7916,6 +7946,122 @@ html, body, #root {
7916
7946
  font-size: 13px;
7917
7947
  }
7918
7948
 
7949
+ /* Agent picker modal */
7950
+ .agent-picker-overlay {
7951
+ position: fixed;
7952
+ inset: 0;
7953
+ background: rgba(0, 0, 0, 0.7);
7954
+ display: flex;
7955
+ align-items: center;
7956
+ justify-content: center;
7957
+ z-index: 200;
7958
+ }
7959
+
7960
+ .agent-picker-modal {
7961
+ background: #1f2335;
7962
+ border: 1px solid #3b3d57;
7963
+ border-radius: 12px;
7964
+ padding: 32px 40px;
7965
+ min-width: 360px;
7966
+ text-align: center;
7967
+ }
7968
+
7969
+ .agent-picker-brand {
7970
+ font-size: 22px;
7971
+ font-weight: 700;
7972
+ color: #7aa2f7;
7973
+ margin-bottom: 20px;
7974
+ letter-spacing: 0.5px;
7975
+ }
7976
+
7977
+ .agent-picker-cwd {
7978
+ display: flex;
7979
+ align-items: center;
7980
+ justify-content: center;
7981
+ gap: 8px;
7982
+ padding: 10px 16px;
7983
+ margin-bottom: 20px;
7984
+ background: #16161e;
7985
+ border: 1px solid #2a2b3d;
7986
+ border-radius: 8px;
7987
+ cursor: pointer;
7988
+ transition: border-color 0.15s;
7989
+ }
7990
+
7991
+ .agent-picker-cwd:hover {
7992
+ border-color: #7aa2f7;
7993
+ }
7994
+
7995
+ .agent-picker-cwd-icon {
7996
+ font-size: 14px;
7997
+ }
7998
+
7999
+ .agent-picker-cwd-path {
8000
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
8001
+ font-size: 12px;
8002
+ color: #a9b1d6;
8003
+ flex: 1;
8004
+ text-align: left;
8005
+ overflow: hidden;
8006
+ text-overflow: ellipsis;
8007
+ white-space: nowrap;
8008
+ }
8009
+
8010
+ .agent-picker-cwd-change {
8011
+ font-size: 11px;
8012
+ color: #7aa2f7;
8013
+ flex-shrink: 0;
8014
+ }
8015
+
8016
+ .agent-picker-title {
8017
+ font-size: 11px;
8018
+ color: #565f89;
8019
+ margin-bottom: 12px;
8020
+ text-transform: uppercase;
8021
+ letter-spacing: 1px;
8022
+ }
8023
+
8024
+ .agent-picker-list {
8025
+ display: flex;
8026
+ flex-direction: column;
8027
+ gap: 8px;
8028
+ }
8029
+
8030
+ .agent-picker-item {
8031
+ display: flex;
8032
+ align-items: center;
8033
+ justify-content: space-between;
8034
+ padding: 14px 18px;
8035
+ background: #16161e;
8036
+ border: 1px solid #2a2b3d;
8037
+ border-radius: 8px;
8038
+ cursor: pointer;
8039
+ transition: all 0.15s;
8040
+ text-align: left;
8041
+ }
8042
+
8043
+ .agent-picker-item:hover {
8044
+ border-color: #7aa2f7;
8045
+ background: #1a1b2e;
8046
+ }
8047
+
8048
+ .agent-picker-name {
8049
+ font-size: 14px;
8050
+ font-weight: 600;
8051
+ color: #c0caf5;
8052
+ }
8053
+
8054
+ .agent-picker-desc {
8055
+ font-size: 11px;
8056
+ color: #565f89;
8057
+ }
8058
+
8059
+ .agent-picker-hint {
8060
+ margin-top: 20px;
8061
+ font-size: 11px;
8062
+ color: #414868;
8063
+ }
8064
+
7919
8065
  /* Settings dialog */
7920
8066
  .settings-overlay {
7921
8067
  position: fixed;
@@ -1,5 +1,5 @@
1
- import { conf as conf$1, language as language$1 } from "./typescript-BNNI0Euv.js";
2
- import "./index-pZmE1QXB.js";
1
+ import { conf as conf$1, language as language$1 } from "./typescript-CIn-DSfY.js";
2
+ import "./index-Bml7oDn9.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-pZmE1QXB.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-DSDH7BnA.js";
3
- import { a, D, h, R, c, i, j, t, k } from "./lspLanguageFeatures-DSDH7BnA.js";
1
+ import { c as createWebWorker, l as languages, e as editor } from "./index-Bml7oDn9.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-DzxH499X.js";
3
+ import { a, D, h, R, c, i, j, t, k } from "./lspLanguageFeatures-DzxH499X.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-pZmE1QXB.js";
1
+ import { l as languages } from "./index-Bml7oDn9.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-pZmE1QXB.js";
1
+ import { R as Range$1, l as languages, e as editor, U as Uri, M as MarkerSeverity } from "./index-Bml7oDn9.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-pZmE1QXB.js";
1
+ import { l as languages } from "./index-Bml7oDn9.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  blockComment: ["{/*", "*/}"]
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-pZmE1QXB.js";
1
+ import { l as languages } from "./index-Bml7oDn9.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  lineComment: "#",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-pZmE1QXB.js";
1
+ import { l as languages } from "./index-Bml7oDn9.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-pZmE1QXB.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-Bml7oDn9.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-pZmE1QXB.js";
1
+ import { l as languages } from "./index-Bml7oDn9.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-pZmE1QXB.js";
1
+ import { l as languages } from "./index-Bml7oDn9.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  blockComment: ["<!--", "-->"]
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-pZmE1QXB.js";
1
+ import { l as languages } from "./index-Bml7oDn9.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  lineComment: "#"
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>ctlsurf-worker</title>
7
- <script type="module" crossorigin src="./assets/index-pZmE1QXB.js"></script>
8
- <link rel="stylesheet" crossorigin href="./assets/index-CJ6RsQWP.css">
7
+ <script type="module" crossorigin src="./assets/index-Bml7oDn9.js"></script>
8
+ <link rel="stylesheet" crossorigin href="./assets/index-DK9wLFFm.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phenx-inc/ctlsurf",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
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": {
@@ -19,9 +19,9 @@
19
19
  ],
20
20
  "scripts": {
21
21
  "dev": "electron-vite dev",
22
- "dev:terminal": "esbuild src/main/headless.ts --bundle --platform=node --target=node18 --format=esm --outfile=out/headless/index.mjs --external:node-pty --sourcemap && node out/headless/index.mjs",
22
+ "dev:terminal": "esbuild src/main/headless.ts --bundle --platform=node --target=node18 --format=esm --outfile=out/headless/index.mjs --external:node-pty --external:ws --sourcemap && node out/headless/index.mjs",
23
23
  "build": "electron-vite build && npm run build:headless",
24
- "build:headless": "esbuild src/main/headless.ts --bundle --platform=node --target=node18 --format=esm --outfile=out/headless/index.mjs --external:node-pty --sourcemap",
24
+ "build:headless": "esbuild src/main/headless.ts --bundle --platform=node --target=node18 --format=esm --outfile=out/headless/index.mjs --external:node-pty --external:ws --sourcemap",
25
25
  "prepublishOnly": "npm run build",
26
26
  "preview": "electron-vite preview",
27
27
  "package": "electron-builder",
@@ -50,13 +50,15 @@
50
50
  "electron-store": "^10.0.0",
51
51
  "esbuild": "^0.27.4",
52
52
  "monaco-editor": "^0.55.1",
53
- "node-pty": "^1.0.0"
53
+ "node-pty": "^1.0.0",
54
+ "ws": "^8.20.0"
54
55
  },
55
56
  "devDependencies": {
56
57
  "@electron/rebuild": "^4.0.3",
57
58
  "@types/node": "^22.15.0",
58
59
  "@types/react": "^19.1.0",
59
60
  "@types/react-dom": "^19.1.0",
61
+ "@types/ws": "^8.18.1",
60
62
  "@vitejs/plugin-react": "^4.5.2",
61
63
  "electron": "^35.0.0",
62
64
  "electron-builder": "^25.1.8",