@phenx-inc/ctlsurf 0.17.5 → 0.17.6

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/README.md +1 -1
  2. package/out/headless/index.mjs +1 -1
  3. package/out/headless/index.mjs.map +1 -1
  4. package/out/renderer/assets/{cssMode-CRJW4vYa.js → cssMode-LC2bCRa_.js} +3 -3
  5. package/out/renderer/assets/{freemarker2-IgsORiC6.js → freemarker2-Di7O120K.js} +1 -1
  6. package/out/renderer/assets/{handlebars-pDu2AR4b.js → handlebars-Dt8Fn4oY.js} +1 -1
  7. package/out/renderer/assets/{html-DNF7NUE5.js → html-wsYLMz8Z.js} +1 -1
  8. package/out/renderer/assets/{htmlMode-gbfJICtW.js → htmlMode-DAHN3Rfc.js} +3 -3
  9. package/out/renderer/assets/{index-CbuISbRh.js → index-BSPboVCX.js} +97 -29
  10. package/out/renderer/assets/{index-CBWAeUYW.css → index-CmvYnexl.css} +15 -3
  11. package/out/renderer/assets/{javascript-CzPWOwBB.js → javascript-Ch481vNL.js} +2 -2
  12. package/out/renderer/assets/{jsonMode-CWOEvILb.js → jsonMode-BmUlJiUR.js} +3 -3
  13. package/out/renderer/assets/{liquid-CP-HUzpK.js → liquid-DAvcjBM1.js} +1 -1
  14. package/out/renderer/assets/{lspLanguageFeatures-DsiaqQq_.js → lspLanguageFeatures-fZZkw0qY.js} +1 -1
  15. package/out/renderer/assets/{mdx-DerBk5VK.js → mdx-su1pUNh_.js} +1 -1
  16. package/out/renderer/assets/{python-DkUMRAVL.js → python-U5jDm-Cc.js} +1 -1
  17. package/out/renderer/assets/{razor-C6ynuc0X.js → razor-CE13v8rw.js} +1 -1
  18. package/out/renderer/assets/{tsMode-DXrOkNVu.js → tsMode-Dtr-mLSh.js} +1 -1
  19. package/out/renderer/assets/{typescript-BmhhpI43.js → typescript-MRx8M-TQ.js} +1 -1
  20. package/out/renderer/assets/{xml-CTMRAgAB.js → xml-DYFD_EMc.js} +1 -1
  21. package/out/renderer/assets/{yaml-DYNNafNI.js → yaml-B_Zhj_tf.js} +1 -1
  22. package/out/renderer/index.html +2 -2
  23. package/package.json +1 -1
  24. package/scripts/test-work-map-ui.cjs +55 -1
  25. package/src/renderer/components/RollingCount.tsx +60 -0
  26. package/src/renderer/components/WorkMapPanel.tsx +24 -1
  27. package/src/renderer/styles.css +15 -3
@@ -1,6 +1,6 @@
1
- import { c as createWebWorker, l as languages } from "./index-CbuISbRh.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-DsiaqQq_.js";
3
- import { h, i, j, t, k } from "./lspLanguageFeatures-DsiaqQq_.js";
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";
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-CbuISbRh.js";
1
+ import { l as languages } from "./index-BSPboVCX.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "assign",
4
4
  "flush",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-CbuISbRh.js";
1
+ import { l as languages } from "./index-BSPboVCX.js";
2
2
  const EMPTY_ELEMENTS = [
3
3
  "area",
4
4
  "base",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-CbuISbRh.js";
1
+ import { l as languages } from "./index-BSPboVCX.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-CbuISbRh.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-DsiaqQq_.js";
3
- import { a, e, d, R, i, j, t, k } from "./lspLanguageFeatures-DsiaqQq_.js";
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";
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-CRJW4vYa.js","./lspLanguageFeatures-DsiaqQq_.js","./htmlMode-gbfJICtW.js","./jsonMode-CWOEvILb.js","./javascript-CzPWOwBB.js","./typescript-BmhhpI43.js"])))=>i.map(i=>d[i]);
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]);
2
2
  function getDefaultExportFromCjs(x) {
3
3
  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
4
4
  }
@@ -30602,7 +30602,7 @@ class AnimationFrameQueueItem {
30602
30602
  }
30603
30603
  };
30604
30604
  })();
30605
- function getComputedStyle(el) {
30605
+ function getComputedStyle$1(el) {
30606
30606
  return getWindow(el).getComputedStyle(el, null);
30607
30607
  }
30608
30608
  function getClientArea(element, defaultValue, fallbackElement) {
@@ -30632,7 +30632,7 @@ class SizeUtils {
30632
30632
  return parseFloat(value) || 0;
30633
30633
  }
30634
30634
  static getDimension(element, cssPropertyName) {
30635
- const computedStyle = getComputedStyle(element);
30635
+ const computedStyle = getComputedStyle$1(element);
30636
30636
  const value = computedStyle ? computedStyle.getPropertyValue(cssPropertyName) : "0";
30637
30637
  return SizeUtils.convertToPixels(element, value);
30638
30638
  }
@@ -30714,7 +30714,7 @@ function getTopLeftOffset(element) {
30714
30714
  let left = element.offsetLeft;
30715
30715
  while ((element = element.parentNode) !== null && element !== element.ownerDocument.body && element !== element.ownerDocument.documentElement) {
30716
30716
  top -= element.scrollTop;
30717
- const c = isShadowRoot(element) ? null : getComputedStyle(element);
30717
+ const c = isShadowRoot(element) ? null : getComputedStyle$1(element);
30718
30718
  if (c) {
30719
30719
  left -= c.direction !== "rtl" ? element.scrollLeft : -element.scrollLeft;
30720
30720
  }
@@ -30753,7 +30753,7 @@ function getDomNodeZoomLevel(domNode) {
30753
30753
  let testElement = domNode;
30754
30754
  let zoom = 1;
30755
30755
  do {
30756
- const elementZoomLevel = getComputedStyle(testElement).zoom;
30756
+ const elementZoomLevel = getComputedStyle$1(testElement).zoom;
30757
30757
  if (elementZoomLevel !== null && elementZoomLevel !== void 0 && elementZoomLevel !== "1") {
30758
30758
  zoom *= elementZoomLevel;
30759
30759
  }
@@ -132423,7 +132423,7 @@ class FindWidget extends Widget$1 {
132423
132423
  if (width2 < FIND_WIDGET_INITIAL_WIDTH) {
132424
132424
  return;
132425
132425
  }
132426
- const maxWidth = parseFloat(getComputedStyle(this._domNode).maxWidth) || 0;
132426
+ const maxWidth = parseFloat(getComputedStyle$1(this._domNode).maxWidth) || 0;
132427
132427
  if (width2 > maxWidth) {
132428
132428
  return;
132429
132429
  }
@@ -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-CRJW4vYa.js"), true ? __vite__mapDeps([0,1]) : void 0, import.meta.url);
208474
+ return __vitePreload(() => import("./cssMode-LC2bCRa_.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-gbfJICtW.js"), true ? __vite__mapDeps([2,1]) : void 0, import.meta.url);
208579
+ return __vitePreload(() => import("./htmlMode-DAHN3Rfc.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-CWOEvILb.js"), true ? __vite__mapDeps([3,1]) : void 0, import.meta.url);
208663
+ return __vitePreload(() => import("./jsonMode-BmUlJiUR.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-DXrOkNVu.js"), true ? [] : void 0, import.meta.url);
208909
+ return __vitePreload(() => import("./tsMode-Dtr-mLSh.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-IgsORiC6.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
209104
+ return __vitePreload(() => import("./freemarker2-Di7O120K.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-IgsORiC6.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationDollar);
209111
+ return __vitePreload(() => import("./freemarker2-Di7O120K.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-IgsORiC6.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationDollar);
209118
+ return __vitePreload(() => import("./freemarker2-Di7O120K.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-IgsORiC6.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAngleInterpolationBracket);
209125
+ return __vitePreload(() => import("./freemarker2-Di7O120K.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-IgsORiC6.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagBracketInterpolationBracket);
209132
+ return __vitePreload(() => import("./freemarker2-Di7O120K.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-IgsORiC6.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationDollar);
209139
+ return __vitePreload(() => import("./freemarker2-Di7O120K.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-IgsORiC6.js"), true ? [] : void 0, import.meta.url).then((m) => m.TagAutoInterpolationBracket);
209146
+ return __vitePreload(() => import("./freemarker2-Di7O120K.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-pDu2AR4b.js"), true ? [] : void 0, import.meta.url)
209167
+ loader: () => __vitePreload(() => import("./handlebars-Dt8Fn4oY.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-DNF7NUE5.js"), true ? [] : void 0, import.meta.url)
209180
+ loader: () => __vitePreload(() => import("./html-wsYLMz8Z.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-CzPWOwBB.js"), true ? __vite__mapDeps([4,5]) : void 0, import.meta.url)
209203
+ loader: () => __vitePreload(() => import("./javascript-Ch481vNL.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-CP-HUzpK.js"), true ? [] : void 0, import.meta.url)
209242
+ loader: () => __vitePreload(() => import("./liquid-DAvcjBM1.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-DerBk5VK.js"), true ? [] : void 0, import.meta.url)
209260
+ loader: () => __vitePreload(() => import("./mdx-su1pUNh_.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-DkUMRAVL.js"), true ? [] : void 0, import.meta.url)
209359
+ loader: () => __vitePreload(() => import("./python-U5jDm-Cc.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-C6ynuc0X.js"), true ? [] : void 0, import.meta.url)
209378
+ loader: () => __vitePreload(() => import("./razor-CE13v8rw.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-BmhhpI43.js"), true ? [] : void 0, import.meta.url);
209511
+ return __vitePreload(() => import("./typescript-MRx8M-TQ.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-CTMRAgAB.js"), true ? [] : void 0, import.meta.url)
209556
+ loader: () => __vitePreload(() => import("./xml-DYFD_EMc.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-DYNNafNI.js"), true ? [] : void 0, import.meta.url)
209563
+ loader: () => __vitePreload(() => import("./yaml-B_Zhj_tf.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;
@@ -214825,7 +214825,55 @@ function thinkingHighlights(text2, focus) {
214825
214825
  }
214826
214826
  return merged;
214827
214827
  }
214828
+ function RollingCount({ value, label }) {
214829
+ const previous = reactExports.useRef(value);
214830
+ const increasing = value > previous.current;
214831
+ reactExports.useLayoutEffect(() => {
214832
+ previous.current = value;
214833
+ }, [value]);
214834
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "work-map-count", role: "img", "aria-label": label || String(value), "data-value": value, children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "work-map-counter", "aria-hidden": "true", children: String(value).split("").map((_2, index2, digits) => {
214835
+ const place = digits.length - index2 - 1;
214836
+ const turns = Math.floor(value / 10 ** place);
214837
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(RollingDigit, { turns, initial: increasing ? 0 : turns }, place);
214838
+ }) }) });
214839
+ }
214840
+ function RollingDigit({ turns, initial }) {
214841
+ const reel = reactExports.useRef(null);
214842
+ const previous = reactExports.useRef(initial);
214843
+ const animation = reactExports.useRef(null);
214844
+ const digit = turns % 10;
214845
+ reactExports.useLayoutEffect(() => {
214846
+ const el = reel.current;
214847
+ const before = previous.current;
214848
+ previous.current = turns;
214849
+ let start = before % 10;
214850
+ if (animation.current) {
214851
+ const style = getComputedStyle(el);
214852
+ start = -new DOMMatrixReadOnly(style.transform).m42 / parseFloat(style.fontSize) % 10;
214853
+ animation.current.cancel();
214854
+ animation.current = null;
214855
+ }
214856
+ if (turns <= before || window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
214857
+ const distance = Math.min(turns - before, 10 + (turns - before) % 10);
214858
+ let end = before % 10 + distance;
214859
+ while (end <= start) end += 10;
214860
+ const roll = el.animate([
214861
+ { transform: `translateY(${-start}em)` },
214862
+ { transform: `translateY(${-end}em)` }
214863
+ ], { duration: 550, easing: "cubic-bezier(.2, .65, .3, 1)" });
214864
+ animation.current = roll;
214865
+ void roll.finished.then(() => {
214866
+ if (animation.current === roll) animation.current = null;
214867
+ }, () => {
214868
+ });
214869
+ }, [turns]);
214870
+ reactExports.useLayoutEffect(() => () => {
214871
+ animation.current?.cancel();
214872
+ }, []);
214873
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "work-map-counter-digit", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "work-map-counter-reel", ref: reel, style: { transform: `translateY(${-digit}em)` }, children: Array.from({ length: 30 }, (_2, i2) => /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: i2 % 10 }, i2)) }) });
214874
+ }
214828
214875
  const ICONS = { thinking: "✦", investigating: "⌕", editing: "✎", testing: "✓", planning: "◇", reporting: "≡" };
214876
+ const ACTIVITIES = { thinking: "Thinking", investigating: "Investigations", editing: "Edits", testing: "Tests", planning: "Plans", reporting: "Updates" };
214829
214877
  const STATUS = { running: "Running", succeeded: "Succeeded", failed: "Failed", unknown: "Recorded", interrupted: "Stopped" };
214830
214878
  const INTENTS = { decision: "Decision", hypothesis: "Hypothesis", alternative: "Alternative", next_step: "Next step", context: "Thinking" };
214831
214879
  function WorkMapPanel({ tabId }) {
@@ -215081,8 +215129,13 @@ function WorkMapPanel({ tabId }) {
215081
215129
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "work-map-branch", children: [
215082
215130
  /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { className: "work-map-branch-heading", onClick: () => toggleThread(run.id), "aria-expanded": expandedThreads.has(run.id), children: [
215083
215131
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: `work-map-branch-point ${failed ? "failed" : ""}` }),
215084
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "work-map-branch-label", children: run.label }),
215085
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "work-map-count", children: run.nodes.length }),
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 })
215138
+ ] }),
215086
215139
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "work-map-caret", children: expandedThreads.has(run.id) ? "▾" : "▸" })
215087
215140
  ] }),
215088
215141
  expandedThreads.has(run.id) && /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "work-map-steps", "aria-label": "Activity thread", children: run.nodes.map(renderStep) })
@@ -215116,6 +215169,21 @@ function WorkMapPanel({ tabId }) {
215116
215169
  ] })
215117
215170
  ] });
215118
215171
  }
215172
+ function ActivityCounts({ nodes }) {
215173
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "work-map-activity-counts", children: Object.keys(ACTIVITIES).map((activity) => {
215174
+ const events = nodes.filter((node) => node.activity === activity);
215175
+ if (!events.length) return null;
215176
+ const failed = events.filter((node) => node.status === "failed").length;
215177
+ const running = events.filter((node) => node.status === "running").length;
215178
+ const label = `${ACTIVITIES[activity]}: ${events.length}${running ? `, ${running} running` : ""}${failed ? `, ${failed} failed` : ""}`;
215179
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: `work-map-activity-count ${activity}`, role: "img", "aria-label": label, title: label, children: [
215180
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: `work-map-activity ${activity}`, "aria-hidden": "true", children: ICONS[activity] }),
215181
+ /* @__PURE__ */ jsxRuntimeExports.jsx(RollingCount, { value: events.length }),
215182
+ running > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "work-map-activity-running", "aria-hidden": "true" }),
215183
+ failed > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "work-map-activity-alert", "aria-hidden": "true", children: "!" })
215184
+ ] }, activity);
215185
+ }) });
215186
+ }
215119
215187
  function highlightSource(text2, focus) {
215120
215188
  const ranges = thinkingHighlights(text2, focus);
215121
215189
  if (!ranges.length) return text2;
@@ -7447,11 +7447,23 @@
7447
7447
  .work-map-branch { position: relative; padding: 0 0 17px; }
7448
7448
  .work-map-branch:last-child { padding-bottom: 0; }
7449
7449
  .work-map-branch::before { content: ''; position: absolute; left: -18px; top: 12px; width: 15px; height: 1px; background: var(--border-dim); }
7450
- .work-map-branch-heading { display: flex; align-items: center; gap: 7px; width: 100%; padding: 5px 0; border: 0; background: transparent; text-align: left; color: var(--text-bright); }
7451
- .work-map-branch-point { width: 6px; height: 6px; flex-shrink: 0; border-radius: 2px; background: var(--accent); }
7450
+ .work-map-branch-heading { display: flex; align-items: flex-start; gap: 7px; width: 100%; padding: 5px 0; border: 0; background: transparent; text-align: left; color: var(--text-bright); }
7451
+ .work-map-branch-point { width: 6px; height: 6px; margin-top: 5px; flex-shrink: 0; border-radius: 2px; background: var(--accent); }
7452
7452
  .work-map-branch-point.failed { background: var(--danger); }
7453
+ .work-map-branch-copy { flex: 1; min-width: 0; }
7454
+ .work-map-branch-title { display: flex; align-items: center; gap: 7px; line-height: 1.5; }
7453
7455
  .work-map-branch-label { min-width: 0; overflow-wrap: anywhere; font-size: 11px; font-weight: 600; }
7454
- .work-map-count { padding: 1px 5px; border-radius: 4px; background: var(--bg-chip); color: var(--text-soft); font-size: 9px; }
7456
+ .work-map-count { display: inline-flex; flex-shrink: 0; padding: 2px 5px; border-radius: 4px; background: var(--bg-chip); color: var(--text-soft); font-size: 9px; }
7457
+ .work-map-counter { display: inline-flex; height: 1em; line-height: 1; font-variant-numeric: tabular-nums; }
7458
+ .work-map-counter-digit { display: inline-block; width: 1ch; height: 1em; overflow: hidden; }
7459
+ .work-map-counter-reel { display: flex; flex-direction: column; }
7460
+ .work-map-counter-reel > span { flex: 0 0 1em; height: 1em; text-align: center; }
7461
+ .work-map-activity-counts { display: flex; flex-wrap: wrap; align-items: center; gap: 5px; margin-top: 7px; }
7462
+ .work-map-activity-count { display: inline-flex; align-items: center; gap: 4px; padding: 3px 5px; border: 1px solid var(--border-subtle); border-radius: 5px; background: var(--bg-well); }
7463
+ .work-map-activity-count .work-map-activity { width: 14px; height: 14px; font-size: 13px; background: transparent; }
7464
+ .work-map-activity-count .work-map-count { padding: 0; background: transparent; font-size: 10px; }
7465
+ .work-map-activity-running { width: 4px; height: 4px; border-radius: 50%; background: var(--accent); }
7466
+ .work-map-activity-alert { color: var(--danger); font-size: 10px; font-weight: 700; line-height: 1; }
7455
7467
  .work-map-steps { list-style: none; margin: 5px 0 0 2px; padding: 0 0 0 8px; border-left: 1px solid var(--border-subtle); }
7456
7468
  .work-map-step { margin: 5px 0; border: 1px solid var(--border-well); background: var(--bg-well); border-radius: 7px; overflow: hidden; }
7457
7469
  .work-map-step.failed { border-color: color-mix(in srgb, var(--danger) 45%, var(--border-well)); }
@@ -1,5 +1,5 @@
1
- import { conf as conf$1, language as language$1 } from "./typescript-BmhhpI43.js";
2
- import "./index-CbuISbRh.js";
1
+ import { conf as conf$1, language as language$1 } from "./typescript-MRx8M-TQ.js";
2
+ import "./index-BSPboVCX.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-CbuISbRh.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-DsiaqQq_.js";
3
- import { a, D, h, R, c, i, j, t, k } from "./lspLanguageFeatures-DsiaqQq_.js";
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";
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-CbuISbRh.js";
1
+ import { l as languages } from "./index-BSPboVCX.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-CbuISbRh.js";
1
+ import { R as Range$1, l as languages, e as editor, U as Uri, M as MarkerSeverity } from "./index-BSPboVCX.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-CbuISbRh.js";
1
+ import { l as languages } from "./index-BSPboVCX.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  blockComment: ["{/*", "*/}"]
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-CbuISbRh.js";
1
+ import { l as languages } from "./index-BSPboVCX.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  lineComment: "#",
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-CbuISbRh.js";
1
+ import { l as languages } from "./index-BSPboVCX.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-CbuISbRh.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-BSPboVCX.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-CbuISbRh.js";
1
+ import { l as languages } from "./index-BSPboVCX.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-CbuISbRh.js";
1
+ import { l as languages } from "./index-BSPboVCX.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  blockComment: ["<!--", "-->"]
@@ -1,4 +1,4 @@
1
- import { l as languages } from "./index-CbuISbRh.js";
1
+ import { l as languages } from "./index-BSPboVCX.js";
2
2
  const conf = {
3
3
  comments: {
4
4
  lineComment: "#"
@@ -106,8 +106,8 @@
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-CbuISbRh.js"></script>
110
- <link rel="stylesheet" crossorigin href="./assets/index-CBWAeUYW.css">
109
+ <script type="module" crossorigin src="./assets/index-BSPboVCX.js"></script>
110
+ <link rel="stylesheet" crossorigin href="./assets/index-CmvYnexl.css">
111
111
  </head>
112
112
  <body>
113
113
  <div id="boot-splash">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phenx-inc/ctlsurf",
3
- "version": "0.17.5",
3
+ "version": "0.17.6",
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": {
@@ -55,11 +55,23 @@ async function main() {
55
55
  }
56
56
  win = new BrowserWindow({ show: false, width: 430, height: 860, webPreferences: { backgroundThrottling: false } })
57
57
  await win.loadFile(path.join(temp, 'index.html'))
58
+ win.webContents.debugger.attach('1.3')
59
+ await win.webContents.debugger.sendCommand('Emulation.setEmulatedMedia', { features: [{ name: 'prefers-reduced-motion', value: 'no-preference' }] })
58
60
  const run = code => win.webContents.executeJavaScript(code)
61
+ const finishRolls = () => run(`Promise.all(document.querySelector('.work-map-forest').getAnimations({subtree:true}).map(a=>a.finished.catch(()=>{})))`)
62
+ const investigationCount = `document.querySelector('.work-map-activity-count.investigating .work-map-count')`
63
+ const visibleInvestigationCount = `Array.from(${investigationCount}.querySelectorAll('.work-map-counter-reel'),el=>String(Math.round(-new DOMMatrixReadOnly(getComputedStyle(el).transform).m42/parseFloat(getComputedStyle(el).fontSize))%10)).join('')`
59
64
  await run(`new Promise(resolve=>setTimeout(resolve,150))`)
60
65
  assert.equal(await run(`document.querySelector('.work-map-goal-heading').getAttribute('aria-expanded')`), 'true')
61
66
  assert.equal(await run(`document.querySelector('.work-map-branch-heading').getAttribute('aria-expanded')`), 'false')
62
67
  assert.equal(await run(`document.querySelectorAll('.work-map-step').length`), 0, 'event groups start collapsed')
68
+ assert.deepEqual(await run(`[...document.querySelectorAll('.work-map-activity-count')].map(el=>el.getAttribute('aria-label'))`), ['Thinking: 1', 'Investigations: 10, 1 running', 'Edits: 9', 'Tests: 9, 1 failed'])
69
+ assert.equal(await run(`${visibleInvestigationCount}`), '10', 'initial counts are settled immediately')
70
+ await run(`window.emitMap({nodes:window.mapSnapshot().nodes.map(n=>n.id==='step-27'?{...n,status:'succeeded'}:n)})`)
71
+ await run(`new Promise(resolve=>setTimeout(resolve,30))`)
72
+ assert.equal(await run(`${investigationCount}.dataset.value`), '10', 'a tool result does not add another event')
73
+ assert.equal(await run(`document.querySelector('.work-map-activity-count.investigating').getAttribute('aria-label')`), 'Investigations: 10')
74
+ assert.equal(await run(`${investigationCount}.getAnimations({subtree:true}).length`), 0, 'status changes do not roll unchanged counts')
63
75
  await run(`document.querySelector('.work-map-branch-heading').click()`)
64
76
  await run(`new Promise(resolve=>setTimeout(resolve,30))`)
65
77
  assert.equal(await run(`document.querySelectorAll('.work-map-step').length`), 29, 'choices and actions must share one thread')
@@ -92,6 +104,13 @@ async function main() {
92
104
  await run(`document.querySelector('.work-map-branch-heading').click()`)
93
105
  await run(`new Promise(resolve=>setTimeout(resolve,30))`)
94
106
  assert.equal(await run(`document.querySelectorAll('.work-map-step').length`), 0)
107
+ await run(`window.emitMap({nodes:[...window.mapSnapshot().nodes,{...window.mapSnapshot().nodes.at(-1),id:'collapsed-step',status:'running'}]})`)
108
+ await run(`new Promise(resolve=>setTimeout(resolve,30))`)
109
+ assert.equal(await run(`document.querySelector('.work-map-branch-heading').getAttribute('aria-expanded')`), 'false', 'new activity never reopens a collapsed investigation')
110
+ assert.equal(await run(`document.querySelectorAll('.work-map-step').length`), 0)
111
+ assert.equal(await run(`${investigationCount}.dataset.value`), '12', 'collapsed summaries still receive live events')
112
+ assert(await run(`${investigationCount}.getAnimations({subtree:true}).length>0`), 'live counts roll upward')
113
+ await finishRolls()
95
114
  await run(`document.querySelector('.work-map-branch-heading').click()`)
96
115
  await run(`new Promise(resolve=>setTimeout(resolve,30))`)
97
116
  await run(`document.querySelector('.work-map-step-button').click()`)
@@ -106,9 +125,44 @@ async function main() {
106
125
  await run(`document.querySelector('.work-map-scroll').scrollTop=0`)
107
126
  await run(`new Promise(resolve=>setTimeout(resolve,30))`)
108
127
  assert(await run(`document.documentElement.scrollWidth<=window.innerWidth`), 'no horizontal overflow at panel width')
128
+ await run(`document.querySelector('.work-map-branch-heading').click()`)
129
+ await run(`new Promise(resolve=>setTimeout(resolve,30))`)
109
130
  const screenshot = process.env.WORK_MAP_SCREENSHOT || path.join(repo, 'experiments/live-map/.cache/work-map-panel.png')
110
131
  await fs.mkdir(path.dirname(screenshot), { recursive: true })
111
132
  await fs.writeFile(screenshot, (await win.webContents.capturePage()).toPNG())
133
+ await run(`
134
+ window.beforeCountNodes=window.mapSnapshot().nodes;
135
+ window.withInvestigationCount=count=>window.emitMap({nodes:[
136
+ ...window.beforeCountNodes.filter(n=>n.kind!=='step'||n.activity!=='investigating'),
137
+ ...Array.from({length:count},(_,i)=>({...window.beforeCountNodes.find(n=>n.kind==='step'&&n.activity==='investigating'),id:'counter-step-'+i}))
138
+ ]});
139
+ window.withInvestigationCount(99);
140
+ `)
141
+ await run(`new Promise(resolve=>setTimeout(resolve,30))`)
142
+ await finishRolls()
143
+ assert.equal(await run(visibleInvestigationCount), '99')
144
+ await run(`window.withInvestigationCount(100)`)
145
+ await run(`new Promise(resolve=>setTimeout(resolve,30))`)
146
+ assert(await run(`${investigationCount}.getAnimations({subtree:true}).length>0`), 'digit carry animates from 99 to 100')
147
+ await finishRolls()
148
+ assert.equal(await run(visibleInvestigationCount), '100')
149
+ for (const count of [101, 105]) {
150
+ await run(`window.withInvestigationCount(${count})`)
151
+ await run(`new Promise(resolve=>setTimeout(resolve,30))`)
152
+ }
153
+ await finishRolls()
154
+ assert.equal(await run(visibleInvestigationCount), '105', 'bursts settle on the latest count')
155
+ await run(`window.withInvestigationCount(9)`)
156
+ await run(`new Promise(resolve=>setTimeout(resolve,30))`)
157
+ assert.equal(await run(visibleInvestigationCount), '9', 'trimming or reclassification can decrease a count')
158
+ await win.webContents.debugger.sendCommand('Emulation.setEmulatedMedia', { features: [{ name: 'prefers-reduced-motion', value: 'reduce' }] })
159
+ await run(`window.withInvestigationCount(10)`)
160
+ await run(`new Promise(resolve=>setTimeout(resolve,30))`)
161
+ assert.equal(await run(visibleInvestigationCount), '10')
162
+ assert.equal(await run(`${investigationCount}.getAnimations({subtree:true}).length`), 0, 'reduced motion updates counts immediately')
163
+ win.setSize(320, 860)
164
+ await run(`new Promise(resolve=>setTimeout(resolve,30))`)
165
+ assert(await run(`document.documentElement.scrollWidth<=window.innerWidth`), 'activity icons wrap at narrow panel widths')
112
166
  await run(`document.querySelector('.work-map-footer button').click()`)
113
167
  await run(`new Promise(resolve=>setTimeout(resolve,30))`)
114
168
  assert.equal(await run(`document.querySelectorAll('.work-map-goal').length`), 0)
@@ -128,7 +182,7 @@ async function main() {
128
182
  assert(await run(`document.querySelector('[role=switch]').disabled`))
129
183
  assert(await run(`document.querySelector('select').disabled`))
130
184
  }
131
- console.log('PASS collapsed event groups, unified chronological thread, salient excerpts and reasons, source receipts, action links, omitted-thinking notice, controls and scroll')
185
+ console.log('PASS collapsed event groups, live activity summaries, rolling counts and carry, interrupted rolls, reduced motion, unified chronological thread, source receipts, controls and scroll')
132
186
  console.log('Screenshot:', screenshot)
133
187
  } finally {
134
188
  win?.destroy()