@phenx-inc/ctlsurf 0.17.6 → 0.17.7

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 (26) hide show
  1. package/README.md +3 -1
  2. package/out/headless/index.mjs +1 -1
  3. package/out/headless/index.mjs.map +1 -1
  4. package/out/renderer/assets/{cssMode-LC2bCRa_.js → cssMode-DOrZXO36.js} +3 -3
  5. package/out/renderer/assets/{freemarker2-Di7O120K.js → freemarker2-5u4104Xl.js} +1 -1
  6. package/out/renderer/assets/{handlebars-Dt8Fn4oY.js → handlebars-C_laShLt.js} +1 -1
  7. package/out/renderer/assets/{html-wsYLMz8Z.js → html-DO3EoflS.js} +1 -1
  8. package/out/renderer/assets/{htmlMode-DAHN3Rfc.js → htmlMode-Cwu8rsx-.js} +3 -3
  9. package/out/renderer/assets/{index-BSPboVCX.js → index-CHdMn4av.js} +71 -53
  10. package/out/renderer/assets/{javascript-Ch481vNL.js → javascript-BPewzTWL.js} +2 -2
  11. package/out/renderer/assets/{jsonMode-BmUlJiUR.js → jsonMode-BjgG963U.js} +3 -3
  12. package/out/renderer/assets/{liquid-DAvcjBM1.js → liquid-K0EVwJ4n.js} +1 -1
  13. package/out/renderer/assets/{lspLanguageFeatures-fZZkw0qY.js → lspLanguageFeatures-m4j5zxQl.js} +1 -1
  14. package/out/renderer/assets/{mdx-su1pUNh_.js → mdx-DG0llsx7.js} +1 -1
  15. package/out/renderer/assets/{python-U5jDm-Cc.js → python-CwfkGHje.js} +1 -1
  16. package/out/renderer/assets/{razor-CE13v8rw.js → razor-DxTakA2q.js} +1 -1
  17. package/out/renderer/assets/{tsMode-Dtr-mLSh.js → tsMode-BANGjk9B.js} +1 -1
  18. package/out/renderer/assets/{typescript-MRx8M-TQ.js → typescript-DiF0ejYV.js} +1 -1
  19. package/out/renderer/assets/{xml-DYFD_EMc.js → xml-BLsIDJrq.js} +1 -1
  20. package/out/renderer/assets/{yaml-B_Zhj_tf.js → yaml-BWqzZSkF.js} +1 -1
  21. package/out/renderer/index.html +1 -1
  22. package/package.json +1 -1
  23. package/scripts/test-work-map-ui.cjs +34 -12
  24. package/src/renderer/App.tsx +10 -1
  25. package/src/renderer/components/TicketPanel.tsx +24 -7
  26. package/src/renderer/components/WorkMapPanel.tsx +23 -25
@@ -1,6 +1,6 @@
1
- import { c as createWebWorker, l as languages } from "./index-BSPboVCX.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-fZZkw0qY.js";
3
- import { h, i, j, t, k } from "./lspLanguageFeatures-fZZkw0qY.js";
1
+ import { c as createWebWorker, l as languages } from "./index-CHdMn4av.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-m4j5zxQl.js";
3
+ import { h, i, j, t, k } from "./lspLanguageFeatures-m4j5zxQl.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-BSPboVCX.js";
1
+ import { l as languages } from "./index-CHdMn4av.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "assign",
4
4
  "flush",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-BSPboVCX.js";
1
+ import { l as languages } from "./index-CHdMn4av.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "area",
4
4
  "base",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-BSPboVCX.js";
1
+ import { l as languages } from "./index-CHdMn4av.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-BSPboVCX.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-fZZkw0qY.js";
3
- import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-fZZkw0qY.js";
1
+ import { c as createWebWorker, l as languages } from "./index-CHdMn4av.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-m4j5zxQl.js";
3
+ import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-m4j5zxQl.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-LC2bCRa_.js","./lspLanguageFeatures-fZZkw0qY.js","./htmlMode-DAHN3Rfc.js","./jsonMode-BmUlJiUR.js","./javascript-Ch481vNL.js","./typescript-MRx8M-TQ.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./cssMode-DOrZXO36.js","./lspLanguageFeatures-m4j5zxQl.js","./htmlMode-Cwu8rsx-.js","./jsonMode-BjgG963U.js","./javascript-BPewzTWL.js","./typescript-DiF0ejYV.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
  }
@@ -208471,7 +208471,7 @@ const lessDefaults = new LanguageServiceDefaultsImpl$3(
208471
208471
  modeConfigurationDefault$2
208472
208472
  );
208473
208473
  function getMode$3() {
208474
- return __vitePreload(() => import("./cssMode-LC2bCRa_.js"), true ? __vite__mapDeps([0,1]) : void 0, import.meta.url);
208474
+ return __vitePreload(() => import("./cssMode-DOrZXO36.js"), true ? __vite__mapDeps([0,1]) : void 0, import.meta.url);
208475
208475
  }
208476
208476
  languages.onLanguage("less", () => {
208477
208477
  getMode$3().then((mode2) => mode2.setupMode(lessDefaults));
@@ -208576,7 +208576,7 @@ const razorLanguageService = registerHTMLLanguageService(
208576
208576
  );
208577
208577
  const razorDefaults = razorLanguageService.defaults;
208578
208578
  function getMode$2() {
208579
- return __vitePreload(() => import("./htmlMode-DAHN3Rfc.js"), true ? __vite__mapDeps([2,1]) : void 0, import.meta.url);
208579
+ return __vitePreload(() => import("./htmlMode-Cwu8rsx-.js"), true ? __vite__mapDeps([2,1]) : void 0, import.meta.url);
208580
208580
  }
208581
208581
  function registerHTMLLanguageService(languageId, options = optionsDefault, modeConfiguration = getConfigurationDefault(languageId)) {
208582
208582
  const defaults = new LanguageServiceDefaultsImpl$2(languageId, options, modeConfiguration);
@@ -208660,7 +208660,7 @@ const jsonDefaults = new LanguageServiceDefaultsImpl$1(
208660
208660
  );
208661
208661
  const getWorker$1 = () => getMode$1().then((mode2) => mode2.getWorker());
208662
208662
  function getMode$1() {
208663
- return __vitePreload(() => import("./jsonMode-BmUlJiUR.js"), true ? __vite__mapDeps([3,1]) : void 0, import.meta.url);
208663
+ return __vitePreload(() => import("./jsonMode-BjgG963U.js"), true ? __vite__mapDeps([3,1]) : void 0, import.meta.url);
208664
208664
  }
208665
208665
  languages.register({
208666
208666
  id: "json",
@@ -208906,7 +208906,7 @@ const getJavaScriptWorker = () => {
208906
208906
  return getMode().then((mode) => mode.getJavaScriptWorker());
208907
208907
  };
208908
208908
  function getMode() {
208909
- return __vitePreload(() => import("./tsMode-Dtr-mLSh.js"), true ? [] : void 0, import.meta.url);
208909
+ return __vitePreload(() => import("./tsMode-BANGjk9B.js"), true ? [] : void 0, import.meta.url);
208910
208910
  }
208911
208911
  languages.onLanguage("typescript", () => {
208912
208912
  return getMode().then((mode) => mode.setupTypeScript(typescriptDefaults));
@@ -209101,49 +209101,49 @@ registerLanguage({
209101
209101
  extensions: [".ftl", ".ftlh", ".ftlx"],
209102
209102
  aliases: ["FreeMarker2", "Apache FreeMarker2"],
209103
209103
  loader: () => {
209104
- return __vitePreload(() => import("./freemarker2-Di7O120K.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
209104
+ return __vitePreload(() => import("./freemarker2-5u4104Xl.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
209105
209105
  }
209106
209106
  });
209107
209107
  registerLanguage({
209108
209108
  id: "freemarker2.tag-angle.interpolation-dollar",
209109
209109
  aliases: ["FreeMarker2 (Angle/Dollar)", "Apache FreeMarker2 (Angle/Dollar)"],
209110
209110
  loader: () => {
209111
- return __vitePreload(() => import("./freemarker2-Di7O120K.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationDollar);
209111
+ return __vitePreload(() => import("./freemarker2-5u4104Xl.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationDollar);
209112
209112
  }
209113
209113
  });
209114
209114
  registerLanguage({
209115
209115
  id: "freemarker2.tag-bracket.interpolation-dollar",
209116
209116
  aliases: ["FreeMarker2 (Bracket/Dollar)", "Apache FreeMarker2 (Bracket/Dollar)"],
209117
209117
  loader: () => {
209118
- return __vitePreload(() => import("./freemarker2-Di7O120K.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationDollar);
209118
+ return __vitePreload(() => import("./freemarker2-5u4104Xl.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationDollar);
209119
209119
  }
209120
209120
  });
209121
209121
  registerLanguage({
209122
209122
  id: "freemarker2.tag-angle.interpolation-bracket",
209123
209123
  aliases: ["FreeMarker2 (Angle/Bracket)", "Apache FreeMarker2 (Angle/Bracket)"],
209124
209124
  loader: () => {
209125
- return __vitePreload(() => import("./freemarker2-Di7O120K.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationBracket);
209125
+ return __vitePreload(() => import("./freemarker2-5u4104Xl.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationBracket);
209126
209126
  }
209127
209127
  });
209128
209128
  registerLanguage({
209129
209129
  id: "freemarker2.tag-bracket.interpolation-bracket",
209130
209130
  aliases: ["FreeMarker2 (Bracket/Bracket)", "Apache FreeMarker2 (Bracket/Bracket)"],
209131
209131
  loader: () => {
209132
- return __vitePreload(() => import("./freemarker2-Di7O120K.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationBracket);
209132
+ return __vitePreload(() => import("./freemarker2-5u4104Xl.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationBracket);
209133
209133
  }
209134
209134
  });
209135
209135
  registerLanguage({
209136
209136
  id: "freemarker2.tag-auto.interpolation-dollar",
209137
209137
  aliases: ["FreeMarker2 (Auto/Dollar)", "Apache FreeMarker2 (Auto/Dollar)"],
209138
209138
  loader: () => {
209139
- return __vitePreload(() => import("./freemarker2-Di7O120K.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
209139
+ return __vitePreload(() => import("./freemarker2-5u4104Xl.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
209140
209140
  }
209141
209141
  });
209142
209142
  registerLanguage({
209143
209143
  id: "freemarker2.tag-auto.interpolation-bracket",
209144
209144
  aliases: ["FreeMarker2 (Auto/Bracket)", "Apache FreeMarker2 (Auto/Bracket)"],
209145
209145
  loader: () => {
209146
- return __vitePreload(() => import("./freemarker2-Di7O120K.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationBracket);
209146
+ return __vitePreload(() => import("./freemarker2-5u4104Xl.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationBracket);
209147
209147
  }
209148
209148
  });
209149
209149
  registerLanguage({
@@ -209164,7 +209164,7 @@ registerLanguage({
209164
209164
  extensions: [".handlebars", ".hbs"],
209165
209165
  aliases: ["Handlebars", "handlebars", "hbs"],
209166
209166
  mimetypes: ["text/x-handlebars-template"],
209167
- loader: () => __vitePreload(() => import("./handlebars-Dt8Fn4oY.js"), true ? [] : void 0, import.meta.url)
209167
+ loader: () => __vitePreload(() => import("./handlebars-C_laShLt.js"), true ? [] : void 0, import.meta.url)
209168
209168
  });
209169
209169
  registerLanguage({
209170
209170
  id: "hcl",
@@ -209177,7 +209177,7 @@ registerLanguage({
209177
209177
  extensions: [".html", ".htm", ".shtml", ".xhtml", ".mdoc", ".jsp", ".asp", ".aspx", ".jshtm"],
209178
209178
  aliases: ["HTML", "htm", "html", "xhtml"],
209179
209179
  mimetypes: ["text/html", "text/x-jshtm", "text/template", "text/ng-template"],
209180
- loader: () => __vitePreload(() => import("./html-wsYLMz8Z.js"), true ? [] : void 0, import.meta.url)
209180
+ loader: () => __vitePreload(() => import("./html-DO3EoflS.js"), true ? [] : void 0, import.meta.url)
209181
209181
  });
209182
209182
  registerLanguage({
209183
209183
  id: "ini",
@@ -209200,7 +209200,7 @@ registerLanguage({
209200
209200
  filenames: ["jakefile"],
209201
209201
  aliases: ["JavaScript", "javascript", "js"],
209202
209202
  mimetypes: ["text/javascript"],
209203
- loader: () => __vitePreload(() => import("./javascript-Ch481vNL.js"), true ? __vite__mapDeps([4,5]) : void 0, import.meta.url)
209203
+ loader: () => __vitePreload(() => import("./javascript-BPewzTWL.js"), true ? __vite__mapDeps([4,5]) : void 0, import.meta.url)
209204
209204
  });
209205
209205
  registerLanguage({
209206
209206
  id: "julia",
@@ -209239,7 +209239,7 @@ registerLanguage({
209239
209239
  extensions: [".liquid", ".html.liquid"],
209240
209240
  aliases: ["Liquid", "liquid"],
209241
209241
  mimetypes: ["application/liquid"],
209242
- loader: () => __vitePreload(() => import("./liquid-DAvcjBM1.js"), true ? [] : void 0, import.meta.url)
209242
+ loader: () => __vitePreload(() => import("./liquid-K0EVwJ4n.js"), true ? [] : void 0, import.meta.url)
209243
209243
  });
209244
209244
  registerLanguage({
209245
209245
  id: "m3",
@@ -209257,7 +209257,7 @@ registerLanguage({
209257
209257
  id: "mdx",
209258
209258
  extensions: [".mdx"],
209259
209259
  aliases: ["MDX", "mdx"],
209260
- loader: () => __vitePreload(() => import("./mdx-su1pUNh_.js"), true ? [] : void 0, import.meta.url)
209260
+ loader: () => __vitePreload(() => import("./mdx-DG0llsx7.js"), true ? [] : void 0, import.meta.url)
209261
209261
  });
209262
209262
  registerLanguage({
209263
209263
  id: "mips",
@@ -209356,7 +209356,7 @@ registerLanguage({
209356
209356
  extensions: [".py", ".rpy", ".pyw", ".cpy", ".gyp", ".gypi"],
209357
209357
  aliases: ["Python", "py"],
209358
209358
  firstLine: "^#!/.*\\bpython[0-9.-]*\\b",
209359
- loader: () => __vitePreload(() => import("./python-U5jDm-Cc.js"), true ? [] : void 0, import.meta.url)
209359
+ loader: () => __vitePreload(() => import("./python-CwfkGHje.js"), true ? [] : void 0, import.meta.url)
209360
209360
  });
209361
209361
  registerLanguage({
209362
209362
  id: "qsharp",
@@ -209375,7 +209375,7 @@ registerLanguage({
209375
209375
  extensions: [".cshtml"],
209376
209376
  aliases: ["Razor", "razor"],
209377
209377
  mimetypes: ["text/x-cshtml"],
209378
- loader: () => __vitePreload(() => import("./razor-CE13v8rw.js"), true ? [] : void 0, import.meta.url)
209378
+ loader: () => __vitePreload(() => import("./razor-DxTakA2q.js"), true ? [] : void 0, import.meta.url)
209379
209379
  });
209380
209380
  registerLanguage({
209381
209381
  id: "redis",
@@ -209508,7 +209508,7 @@ registerLanguage({
209508
209508
  aliases: ["TypeScript", "ts", "typescript"],
209509
209509
  mimetypes: ["text/typescript"],
209510
209510
  loader: () => {
209511
- return __vitePreload(() => import("./typescript-MRx8M-TQ.js"), true ? [] : void 0, import.meta.url);
209511
+ return __vitePreload(() => import("./typescript-DiF0ejYV.js"), true ? [] : void 0, import.meta.url);
209512
209512
  }
209513
209513
  });
209514
209514
  registerLanguage({
@@ -209553,14 +209553,14 @@ registerLanguage({
209553
209553
  firstLine: "(\\<\\?xml.*)|(\\<svg)|(\\<\\!doctype\\s+svg)",
209554
209554
  aliases: ["XML", "xml"],
209555
209555
  mimetypes: ["text/xml", "application/xml", "application/xaml+xml", "application/xml-dtd"],
209556
- loader: () => __vitePreload(() => import("./xml-DYFD_EMc.js"), true ? [] : void 0, import.meta.url)
209556
+ loader: () => __vitePreload(() => import("./xml-BLsIDJrq.js"), true ? [] : void 0, import.meta.url)
209557
209557
  });
209558
209558
  registerLanguage({
209559
209559
  id: "yaml",
209560
209560
  extensions: [".yaml", ".yml"],
209561
209561
  aliases: ["YAML", "yaml", "YML", "yml"],
209562
209562
  mimetypes: ["application/x-yaml", "text/x-yaml"],
209563
- loader: () => __vitePreload(() => import("./yaml-B_Zhj_tf.js"), true ? [] : void 0, import.meta.url)
209563
+ loader: () => __vitePreload(() => import("./yaml-BWqzZSkF.js"), true ? [] : void 0, import.meta.url)
209564
209564
  });
209565
209565
  var __defProp = Object.defineProperty;
209566
209566
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -214574,7 +214574,9 @@ function TicketCard({ ticket, onClick, onSend }) {
214574
214574
  )
214575
214575
  ] });
214576
214576
  }
214577
- function TicketPane({ onSendToTerminal }) {
214577
+ function TicketPane({ onSendToTerminal, onInitialLoad }) {
214578
+ const initialLoadHandled = reactExports.useRef(false);
214579
+ const listRevision = reactExports.useRef(0);
214578
214580
  const [project, setProject] = reactExports.useState(null);
214579
214581
  const [view, setView] = reactExports.useState("list");
214580
214582
  const [tickets, setTickets] = reactExports.useState([]);
@@ -214590,10 +214592,12 @@ function TicketPane({ onSendToTerminal }) {
214590
214592
  const [priority, setPriority] = reactExports.useState("Med");
214591
214593
  const [save, setSave] = reactExports.useState({ kind: "idle" });
214592
214594
  const refreshList = reactExports.useCallback(async () => {
214595
+ const revision = ++listRevision.current;
214593
214596
  setListLoading(true);
214594
214597
  setListError(null);
214595
214598
  try {
214596
214599
  const r = await window.worker.listTickets();
214600
+ if (revision !== listRevision.current) return null;
214597
214601
  if (r?.ok) {
214598
214602
  setTickets(r.tickets || []);
214599
214603
  setRefs(r.blockId && r.pageId ? { blockId: r.blockId, pageId: r.pageId } : null);
@@ -214602,12 +214606,15 @@ function TicketPane({ onSendToTerminal }) {
214602
214606
  setRefs(null);
214603
214607
  setListError(r?.error || "Failed to load tickets");
214604
214608
  }
214609
+ return r?.ok ? (r.tickets || []).length === 0 : null;
214605
214610
  } catch (err) {
214611
+ if (revision !== listRevision.current) return null;
214606
214612
  setTickets([]);
214607
214613
  setRefs(null);
214608
214614
  setListError(err?.message || "Failed to load tickets");
214615
+ return null;
214609
214616
  } finally {
214610
- setListLoading(false);
214617
+ if (revision === listRevision.current) setListLoading(false);
214611
214618
  }
214612
214619
  }, []);
214613
214620
  reactExports.useEffect(() => {
@@ -214618,17 +214625,24 @@ function TicketPane({ onSendToTerminal }) {
214618
214625
  if (!cancelled) setProject(null);
214619
214626
  });
214620
214627
  loadProject();
214621
- void refreshList();
214628
+ const loadTickets = () => void refreshList().then((empty2) => {
214629
+ if (cancelled || empty2 === null || initialLoadHandled.current) return;
214630
+ initialLoadHandled.current = true;
214631
+ onInitialLoad?.(empty2);
214632
+ });
214633
+ loadTickets();
214622
214634
  const unsub = window.worker.onCwdChanged(() => {
214623
214635
  loadProject();
214624
- void refreshList();
214636
+ loadTickets();
214625
214637
  });
214626
214638
  return () => {
214627
214639
  cancelled = true;
214640
+ listRevision.current++;
214628
214641
  unsub();
214629
214642
  };
214630
- }, [refreshList]);
214643
+ }, [refreshList, onInitialLoad]);
214631
214644
  const openNewForm = reactExports.useCallback(() => {
214645
+ initialLoadHandled.current = true;
214632
214646
  setEditingId(null);
214633
214647
  setEditingBlockId(null);
214634
214648
  setTitle("");
@@ -214880,7 +214894,6 @@ function WorkMapPanel({ tabId }) {
214880
214894
  const [snapshot, setSnapshot] = reactExports.useState(null);
214881
214895
  const [error, setError] = reactExports.useState(null);
214882
214896
  const [saving, setSaving] = reactExports.useState(false);
214883
- const [collapsedGoals, setCollapsedGoals] = reactExports.useState(/* @__PURE__ */ new Set());
214884
214897
  const [expandedThreads, setExpandedThreads] = reactExports.useState(/* @__PURE__ */ new Set());
214885
214898
  const [selected, setSelected] = reactExports.useState(null);
214886
214899
  const [following, setFollowing] = reactExports.useState(true);
@@ -214943,12 +214956,6 @@ function WorkMapPanel({ tabId }) {
214943
214956
  if (alive.current) setSaving(false);
214944
214957
  }
214945
214958
  }
214946
- const toggleGoal = (id) => setCollapsedGoals((prev) => {
214947
- const next = new Set(prev);
214948
- if (next.has(id)) next.delete(id);
214949
- else next.add(id);
214950
- return next;
214951
- });
214952
214959
  const toggleThread = (id) => setExpandedThreads((prev) => {
214953
214960
  const next = new Set(prev);
214954
214961
  if (next.has(id)) next.delete(id);
@@ -214967,9 +214974,10 @@ function WorkMapPanel({ tabId }) {
214967
214974
  const textSource = node.evidence[0]?.kind === "thinking" || node.evidence[0]?.kind === "message";
214968
214975
  const anchor = textSource ? node : nodeById.get(node.contextId || "");
214969
214976
  const key = anchor?.id || node.parentId;
214977
+ const technical = !node.intent && ["investigating", "editing", "testing"].includes(node.activity) && node.evidence.length > 0 && node.evidence.every((e) => e.kind === "tool" || e.kind === "result");
214970
214978
  const previous = runs.at(-1);
214971
- if (previous?.key === key) previous.nodes.push(node);
214972
- else runs.push({ id: `thread-${node.id}`, key, label: nodeById.get(anchor?.parentId || node.parentId || "")?.title || "Activity", nodes: [node] });
214979
+ if (previous?.key === key && previous.technical === technical) previous.nodes.push(node);
214980
+ else runs.push({ id: `thread-${node.id}`, key, technical, label: nodeById.get(anchor?.parentId || node.parentId || "")?.title || "Activity", nodes: [node] });
214973
214981
  }
214974
214982
  return runs;
214975
214983
  }
@@ -215113,7 +215121,7 @@ function WorkMapPanel({ tabId }) {
215113
215121
  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: !enabled ? "Turn on the map to follow goals, investigations, edits, and checks as your agent works." : !snapshot?.supported ? "Start a local Claude Code or Codex session to see its work here. Remote sessions are not supported yet." : "Stated decisions, readable thinking, actions, and results appear in one continuous thread. Open any card to inspect its source." })
215114
215122
  ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "work-map-forest", children: [
215115
215123
  goals.map((goal, i2) => /* @__PURE__ */ jsxRuntimeExports.jsxs("article", { className: "work-map-goal", children: [
215116
- /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { className: "work-map-goal-heading", onClick: () => toggleGoal(goal.id), "aria-expanded": !collapsedGoals.has(goal.id), title: goal.evidence[0]?.text, children: [
215124
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "work-map-goal-heading", title: goal.evidence[0]?.text, children: [
215117
215125
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "work-map-goal-icon", "aria-hidden": "true", children: "◎" }),
215118
215126
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
215119
215127
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "work-map-kicker", children: [
@@ -215121,24 +215129,26 @@ function WorkMapPanel({ tabId }) {
215121
215129
  String(i2 + 1).padStart(2, "0")
215122
215130
  ] }),
215123
215131
  /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: goal.title })
215124
- ] }),
215125
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "work-map-caret", children: collapsedGoals.has(goal.id) ? "▸" : "▾" })
215132
+ ] })
215126
215133
  ] }),
215127
- !collapsedGoals.has(goal.id) && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "work-map-branches", children: threadRuns(goal.id).map((run) => {
215134
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "work-map-branches", children: threadRuns(goal.id).map((run) => {
215128
215135
  const failed = run.nodes.some((n2) => n2.status === "failed");
215129
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "work-map-branch", children: [
215130
- /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { className: "work-map-branch-heading", onClick: () => toggleThread(run.id), "aria-expanded": expandedThreads.has(run.id), children: [
215131
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: `work-map-branch-point ${failed ? "failed" : ""}` }),
215132
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "work-map-branch-copy", children: [
215133
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "work-map-branch-title", children: [
215134
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "work-map-branch-label", children: run.label }),
215135
- /* @__PURE__ */ jsxRuntimeExports.jsx(RollingCount, { value: run.nodes.length, label: `${run.nodes.length} events` })
215136
- ] }),
215137
- /* @__PURE__ */ jsxRuntimeExports.jsx(ActivityCounts, { nodes: run.nodes })
215136
+ const heading2 = /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
215137
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: `work-map-branch-point ${failed ? "failed" : ""}` }),
215138
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "work-map-branch-copy", children: [
215139
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "work-map-branch-title", children: [
215140
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "work-map-branch-label", children: run.technical ? `Technical activity · ${run.label}` : run.label }),
215141
+ /* @__PURE__ */ jsxRuntimeExports.jsx(RollingCount, { value: run.nodes.length, label: `${run.nodes.length} events` })
215138
215142
  ] }),
215143
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ActivityCounts, { nodes: run.nodes })
215144
+ ] })
215145
+ ] });
215146
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "work-map-branch", children: [
215147
+ run.technical ? /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { className: "work-map-branch-heading", onClick: () => toggleThread(run.id), "aria-expanded": expandedThreads.has(run.id), children: [
215148
+ heading2,
215139
215149
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "work-map-caret", children: expandedThreads.has(run.id) ? "▾" : "▸" })
215140
- ] }),
215141
- expandedThreads.has(run.id) && /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "work-map-steps", "aria-label": "Activity thread", children: run.nodes.map(renderStep) })
215150
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "work-map-branch-heading", children: heading2 }),
215151
+ (!run.technical || expandedThreads.has(run.id)) && /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "work-map-steps", "aria-label": "Activity thread", children: run.nodes.map(renderStep) })
215142
215152
  ] }, run.id);
215143
215153
  }) })
215144
215154
  ] }, goal.id)),
@@ -215158,7 +215168,6 @@ function WorkMapPanel({ tabId }) {
215158
215168
  setError(null);
215159
215169
  try {
215160
215170
  accept(await window.worker.clearWorkMap(tabId));
215161
- setCollapsedGoals(/* @__PURE__ */ new Set());
215162
215171
  setExpandedThreads(/* @__PURE__ */ new Set());
215163
215172
  setSelected(null);
215164
215173
  setFollowing(true);
@@ -215304,6 +215313,14 @@ function App() {
215304
215313
  const [sessionStart, setSessionStart] = reactExports.useState(null);
215305
215314
  const [layout2, setLayout] = reactExports.useState(DEFAULT_LAYOUT);
215306
215315
  const [hiddenPanes, setHiddenPanes] = reactExports.useState(/* @__PURE__ */ new Set());
215316
+ const ticketStartupPending = reactExports.useRef(true);
215317
+ const handleInitialTicketsLoaded = reactExports.useCallback((empty2) => {
215318
+ if (!ticketStartupPending.current) return;
215319
+ ticketStartupPending.current = false;
215320
+ if (!empty2) return;
215321
+ setLayout((previous) => removePane(previous, "tickets") || previous);
215322
+ setHiddenPanes((previous) => /* @__PURE__ */ new Set([...previous, "tickets"]));
215323
+ }, []);
215307
215324
  const [showSettings, setShowSettings] = reactExports.useState(false);
215308
215325
  const [wsStatus, setWsStatus] = reactExports.useState("disconnected");
215309
215326
  const [cwd2, setCwd] = reactExports.useState(null);
@@ -215572,6 +215589,7 @@ ${transcript.slice(-REMOTE_HANDOFF_CHARS)}` : transcript;
215572
215589
  setActiveTabId(tabId);
215573
215590
  }, []);
215574
215591
  const togglePane = reactExports.useCallback((id) => {
215592
+ if (id === "tickets") ticketStartupPending.current = false;
215575
215593
  if (id === "workmap" && !visiblePaneIds.includes(id) && !canOpenWorkMap()) return;
215576
215594
  if (visiblePaneIds.includes(id)) {
215577
215595
  const newLayout = removePane(layout2, id);
@@ -215714,7 +215732,7 @@ ${transcript.slice(-REMOTE_HANDOFF_CHARS)}` : transcript;
215714
215732
  ] })
215715
215733
  },
215716
215734
  { id: "ctlsurf", label: "ctlsurf", content: /* @__PURE__ */ jsxRuntimeExports.jsx(CtlsurfPanel, { navigate: ctlsurfNav }) },
215717
- { id: "tickets", label: "Tickets", content: /* @__PURE__ */ jsxRuntimeExports.jsx(TicketPane, { onSendToTerminal: handleSendToTerminal }) },
215735
+ { id: "tickets", label: "Tickets", content: /* @__PURE__ */ jsxRuntimeExports.jsx(TicketPane, { onSendToTerminal: handleSendToTerminal, onInitialLoad: handleInitialTicketsLoaded }) },
215718
215736
  { id: "workmap", label: "Work map", content: /* @__PURE__ */ jsxRuntimeExports.jsx(WorkMapPanel, { tabId: activeTabId }, activeTabId) }
215719
215737
  ];
215720
215738
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "app", children: [
@@ -1,5 +1,5 @@
1
- import { conf as conf$1, language as language$1 } from "./typescript-MRx8M-TQ.js";
2
- import "./index-BSPboVCX.js";
1
+ import { conf as conf$1, language as language$1 } from "./typescript-DiF0ejYV.js";
2
+ import "./index-CHdMn4av.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-BSPboVCX.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-fZZkw0qY.js";
3
- import { a, D, h, R, c, i, j, t, k } from "./lspLanguageFeatures-fZZkw0qY.js";
1
+ import { c as createWebWorker, l as languages, e as editor } from "./index-CHdMn4av.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-m4j5zxQl.js";
3
+ import { a, D, h, R, c, i, j, t, k } from "./lspLanguageFeatures-m4j5zxQl.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-BSPboVCX.js";
1
+ import { l as languages } from "./index-CHdMn4av.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-BSPboVCX.js";
1
+ import { R as Range$1, l as languages, e as editor, U as Uri, M as MarkerSeverity } from "./index-CHdMn4av.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-BSPboVCX.js";
1
+ import { l as languages } from "./index-CHdMn4av.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  blockComment: ["{/*", "*/}"]
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-BSPboVCX.js";
1
+ import { l as languages } from "./index-CHdMn4av.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  lineComment: "#",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-BSPboVCX.js";
1
+ import { l as languages } from "./index-CHdMn4av.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-BSPboVCX.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-CHdMn4av.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-BSPboVCX.js";
1
+ import { l as languages } from "./index-CHdMn4av.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-BSPboVCX.js";
1
+ import { l as languages } from "./index-CHdMn4av.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  blockComment: ["<!--", "-->"]
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-BSPboVCX.js";
1
+ import { l as languages } from "./index-CHdMn4av.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-BSPboVCX.js"></script>
109
+ <script type="module" crossorigin src="./assets/index-CHdMn4av.js"></script>
110
110
  <link rel="stylesheet" crossorigin href="./assets/index-CmvYnexl.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.17.6",
3
+ "version": "0.17.7",
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": {