dsh-better-display 0.3.9 → 0.3.10

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.
package/lib/client.js CHANGED
@@ -4,7 +4,7 @@ window.__ModuleLoader__.load({
4
4
  var module = { exports: {} };
5
5
  var exports = module.exports;
6
6
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
- //#region \0rolldown/runtime.js
7
+ // \0rolldown/runtime.js
8
8
  var __defProp = Object.defineProperty;
9
9
  var __exportAll = (all, no_symbols) => {
10
10
  let target = {};
@@ -15,12 +15,11 @@ window.__ModuleLoader__.load({
15
15
  if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
16
16
  return target;
17
17
  };
18
- //#endregion
19
18
  let react = require("react");
20
19
  let _deepseek_ai_dsh_client_store = require("@deepseek-ai/dsh-client-store");
21
20
  let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
22
21
  let react_jsx_runtime = require("react/jsx-runtime");
23
- //#region node_modules/@deepseek-ai/dsh-util-workspace-path/lib/index.js
22
+ // node_modules/@deepseek-ai/dsh-util-workspace-path/lib/index.js
24
23
  /**
25
24
  * The `dsh-resource://file/…` address grammar: how a file is named across the
26
25
  * Sidebar and the resource model, built and parsed without touching a
@@ -108,8 +107,7 @@ window.__ModuleLoader__.load({
108
107
  if (root !== "" && normalized.startsWith(`${root}/`)) return sessionFileAddress(sessionId, normalized.slice(root.length + 1));
109
108
  return sessionFileAddress(sessionId, normalized);
110
109
  }
111
- //#endregion
112
- //#region src/client/rewind-cut.ts
110
+ // src/client/rewind-cut.ts
113
111
  function asRecord$1(value) {
114
112
  return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
115
113
  }
@@ -349,8 +347,7 @@ window.__ModuleLoader__.load({
349
347
  function visibleChatSignature(chat) {
350
348
  return visibleChatKeys(chat).join("\0");
351
349
  }
352
- //#endregion
353
- //#region src/client/tool-activity.ts
350
+ // src/client/tool-activity.ts
354
351
  /**
355
352
  * callId of a tool-call chat node. Drafts for a call whose node was cut must
356
353
  * not be reintroduced after `group.keys` has already dropped that node.
@@ -722,8 +719,7 @@ window.__ModuleLoader__.load({
722
719
  function preparingLabel(name) {
723
720
  return /^(write|edit|apply_patch)$/.test(name) ? "正在生成文件内容" : /^(bash|shell|exec_command|pwsh)$/.test(name) ? "正在准备命令" : "正在准备工具输入";
724
721
  }
725
- //#endregion
726
- //#region src/client/deliverables.ts
722
+ // src/client/deliverables.ts
727
723
  /** Extract standard filename without directory components. */
728
724
  function basename(path) {
729
725
  const normalized = path.replace(/[/\\]+$/, "");
@@ -813,14 +809,12 @@ window.__ModuleLoader__.load({
813
809
  };
814
810
  } };
815
811
  }
816
- //#endregion
817
- //#region src/workspace-path.ts
812
+ // src/workspace-path.ts
818
813
  /** Absolute paths accepted by both POSIX and Windows hosts. */
819
814
  function isAbsoluteWorkspacePath(path) {
820
815
  return /^(?:\/|[A-Za-z]:[/\\]|\\\\)/.test(path);
821
816
  }
822
- //#endregion
823
- //#region src/client/styles.ts
817
+ // src/client/styles.ts
824
818
  const plugin = "dsh-better-display";
825
819
  const styles$1 = /* @__PURE__ */ new Map();
826
820
  /** Retain injected CSS across host cleanup and restore it before Reader paints. */
@@ -842,8 +836,7 @@ window.__ModuleLoader__.load({
842
836
  document.head.appendChild(tag);
843
837
  }
844
838
  }
845
- //#endregion
846
- //#region src/client/mcp-app.ts
839
+ // src/client/mcp-app.ts
847
840
  /**
848
841
  * Core pure functions for SEP-1865 / MCP Apps integration.
849
842
  * Free of CSS module imports so it can be cleanly tested in Node test environments.
@@ -1083,8 +1076,7 @@ ${trimmed}
1083
1076
  } catch {}
1084
1077
  return false;
1085
1078
  }
1086
- //#endregion
1087
- //#region \0dshx-css-module:McpAppFrame.module.css.mjs
1079
+ // \0dshx-css-module:/home/runner/work/dsh-better-display/dsh-better-display/src/client/McpAppFrame.module.css.mjs
1088
1080
  const css$7 = ".tyd90a_card{border:1px solid var(--dsw-alias-border-l2,#00000014);background:var(--dsw-alias-bg-module-platform,transparent);border-radius:14px;margin:16px 0;transition:border-color .2s cubic-bezier(.22,1,.36,1),box-shadow .2s cubic-bezier(.22,1,.36,1);position:relative;overflow:hidden}.tyd90a_card:hover{border-color:var(--dsw-alias-border-l1,#00000029);box-shadow:0 2px 10px -2px #0000000a}.tyd90a_header{border-bottom:1px solid var(--dsw-alias-border-l2,#0000000f);background:var(--dsw-alias-interactive-bg-hover,#00000004);-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;height:36px;padding:0 14px;display:flex}.tyd90a_titleArea{align-items:center;gap:7px;min-width:0;display:flex}.tyd90a_icon{color:var(--dsw-alias-label-tertiary,#94a3b8);flex-shrink:0;justify-content:center;align-items:center;display:flex}.tyd90a_title{color:var(--dsw-alias-label-secondary,#64748b);letter-spacing:-.01em;text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:500;overflow:hidden}.tyd90a_actions{align-items:center;gap:4px;display:flex}.tyd90a_iconBtn{width:24px;height:24px;color:var(--dsw-alias-label-tertiary,#94a3b8);cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;padding:0;transition:all .15s;display:inline-flex}.tyd90a_iconBtn:hover{background:var(--dsw-alias-interactive-bg-hover,#0000000f);color:var(--dsw-alias-label-primary,#0f172a)}.tyd90a_iconBtn:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#2563eb);outline-offset:1px}.tyd90a_iframeWrapper{background:0 0;width:100%;transition:height .25s cubic-bezier(.22,1,.36,1);position:relative}.tyd90a_iframe{background:0 0;border:none;width:100%;height:100%;display:block}.tyd90a_receipt{background:var(--dsw-alias-interactive-bg-hover,#22c55e0d);border-top:1px solid var(--dsw-alias-border-l2,#0000000f);color:var(--dsw-alias-label-primary,#0f172a);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 12px;padding:8px 14px;font-size:12px;line-height:18px;animation:.2s cubic-bezier(.22,1,.36,1) tyd90a_slideUp;display:flex}.tyd90a_receiptPrompt{color:var(--dsw-alias-label-secondary,#64748b);background:var(--dsw-alias-bg-base,#00000008);border:1px solid var(--dsw-alias-border-l2,#0000000f);-webkit-user-select:text;user-select:text;cursor:text;overflow-wrap:anywhere;border-radius:6px;flex:100%;padding:6px 10px;font-size:12px;line-height:18px}@keyframes tyd90a_slideUp{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.tyd90a_receiptSummary{color:var(--dsw-alias-state-business-primary,#16a34a);text-overflow:ellipsis;white-space:nowrap;align-items:center;gap:6px;font-weight:500;display:flex;overflow:hidden}.tyd90a_receiptHint{align-items:center;gap:6px;display:flex}.tyd90a_sendKbd{color:var(--dsw-alias-label-tertiary,#94a3b8);background:var(--dsw-alias-bg-base,#0000000a);border:1px solid var(--dsw-alias-border-l2,#00000014);cursor:pointer;border-radius:5px;align-items:center;gap:4px;padding:2px 8px;font-family:inherit;font-size:11px;transition:all .15s;display:inline-flex}.tyd90a_sendKbd:hover{background:var(--dsw-alias-interactive-bg-hover,#00000014);color:var(--dsw-alias-label-primary,#0f172a)}.tyd90a_sendKbd:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#2563eb);outline-offset:1px}.tyd90a_streamingPlaceholder{border:1px dashed var(--dsw-alias-border-l2,#0000001f);background:var(--dsw-alias-interactive-bg-hover,#00000004);color:var(--dsw-alias-label-secondary,#64748b);border-radius:14px;align-items:center;gap:10px;margin:16px 0;padding:16px 18px;font-size:13px;display:flex}.tyd90a_pulseDot{background:var(--dsw-alias-state-business-primary,#2563eb);border-radius:50%;width:7px;height:7px;animation:1.5s ease-in-out infinite tyd90a_pulse}@keyframes tyd90a_pulse{0%,to{opacity:.35;transform:scale(.9)}50%{opacity:1;transform:scale(1.15)}}";
1089
1081
  const tagId$7 = "dsh-better-display/McpAppFrame.module.css";
1090
1082
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$7) + "]") === null) {
@@ -1114,8 +1106,7 @@ ${trimmed}
1114
1106
  "title": "tyd90a_title",
1115
1107
  "titleArea": "tyd90a_titleArea"
1116
1108
  };
1117
- //#endregion
1118
- //#region src/client/McpAppFrame.tsx
1109
+ // src/client/McpAppFrame.tsx
1119
1110
  const ComposerFillContext = (0, react.createContext)(void 0);
1120
1111
  function useComposerFill() {
1121
1112
  return (0, react.useContext)(ComposerFillContext);
@@ -1402,8 +1393,7 @@ ${trimmed}
1402
1393
  ] })]
1403
1394
  });
1404
1395
  }
1405
- //#endregion
1406
- //#region src/client/message-chrome.ts
1396
+ // src/client/message-chrome.ts
1407
1397
  /** Local clock and run-duration labels for reader message chrome. */
1408
1398
  function pad2(n) {
1409
1399
  return String(n).padStart(2, "0");
@@ -1439,8 +1429,7 @@ ${trimmed}
1439
1429
  if (d.getFullYear() === n.getFullYear()) return `${d.getMonth() + 1}月${d.getDate()}日 ${clock}`;
1440
1430
  return `${d.getFullYear()}年${d.getMonth() + 1}月${d.getDate()}日 ${clock}`;
1441
1431
  }
1442
- //#endregion
1443
- //#region src/client/primitive-labels.ts
1432
+ // src/client/primitive-labels.ts
1444
1433
  const markdownLabels = {
1445
1434
  code: {
1446
1435
  copyLabel: "复制",
@@ -1461,6 +1450,7 @@ ${trimmed}
1461
1450
  expand: (hidden) => `展开其余 ${hidden} 行`
1462
1451
  };
1463
1452
  const terminalBlockLabels = {
1453
+ commandLine: (line) => `命令第 ${line} 行`,
1464
1454
  signal: (signal) => `信号 ${signal}`,
1465
1455
  exitCode: (code) => `退出码 ${code}`,
1466
1456
  noExitCode: "无退出码",
@@ -1517,8 +1507,7 @@ ${trimmed}
1517
1507
  copyButtonTitle: (action) => action
1518
1508
  };
1519
1509
  const truncatedJsonLabel = (total) => `内容过长,已截断(共 ${total} 个字符)`;
1520
- //#endregion
1521
- //#region src/client/stream-buffer.ts
1510
+ // src/client/stream-buffer.ts
1522
1511
  /** Presentation only. The original session string remains the source of truth. */
1523
1512
  const STREAM_TIMING = {
1524
1513
  catchUpMs: 520,
@@ -1647,8 +1636,7 @@ ${trimmed}
1647
1636
  return end !== before;
1648
1637
  }
1649
1638
  };
1650
- //#endregion
1651
- //#region src/client/word-timeline.ts
1639
+ // src/client/word-timeline.ts
1652
1640
  /** Motion parameters from the public transitions.dev streaming-text recipe. */
1653
1641
  const WORD_MOTION = {
1654
1642
  duration: 350,
@@ -1749,8 +1737,7 @@ ${trimmed}
1749
1737
  }));
1750
1738
  }
1751
1739
  };
1752
- //#endregion
1753
- //#region src/client/streaming.tsx
1740
+ // src/client/streaming.tsx
1754
1741
  const StreamMotionContext = (0, react.createContext)({
1755
1742
  enabled: false,
1756
1743
  activatedAt: 0
@@ -1847,8 +1834,7 @@ ${trimmed}
1847
1834
  reveal: enabled && !options.interrupted && !options.selected
1848
1835
  };
1849
1836
  }
1850
- //#endregion
1851
- //#region src/client/markdown/incremental.ts
1837
+ // src/client/markdown/incremental.ts
1852
1838
  /**
1853
1839
  * Trailing blocks kept unstable. Appended text reshapes at most the last
1854
1840
  * block; the second-to-last is retained as safety margin so a freeze decision
@@ -1924,8 +1910,7 @@ ${trimmed}
1924
1910
  return this.cached;
1925
1911
  }
1926
1912
  };
1927
- //#endregion
1928
- //#region node_modules/mdast-util-to-string/lib/index.js
1913
+ // node_modules/mdast-util-to-string/lib/index.js
1929
1914
  /**
1930
1915
  * @typedef {import('mdast').Nodes} Nodes
1931
1916
  *
@@ -2006,8 +1991,7 @@ ${trimmed}
2006
1991
  function node(value) {
2007
1992
  return Boolean(value && typeof value === "object");
2008
1993
  }
2009
- //#endregion
2010
- //#region node_modules/decode-named-character-reference/index.dom.js
1994
+ // node_modules/decode-named-character-reference/index.dom.js
2011
1995
  const element = document.createElement("i");
2012
1996
  /**
2013
1997
  * @param {string} value
@@ -2020,8 +2004,7 @@ ${trimmed}
2020
2004
  if (character.charCodeAt(character.length - 1) === 59 && value !== "semi") return false;
2021
2005
  return character === characterReference ? false : character;
2022
2006
  }
2023
- //#endregion
2024
- //#region node_modules/micromark-util-chunked/index.js
2007
+ // node_modules/micromark-util-chunked/index.js
2025
2008
  /**
2026
2009
  * Like `Array#splice`, but smarter for giant arrays.
2027
2010
  *
@@ -2090,8 +2073,7 @@ ${trimmed}
2090
2073
  }
2091
2074
  return items;
2092
2075
  }
2093
- //#endregion
2094
- //#region node_modules/micromark-util-combine-extensions/index.js
2076
+ // node_modules/micromark-util-combine-extensions/index.js
2095
2077
  /**
2096
2078
  * @import {
2097
2079
  * Extension,
@@ -2161,8 +2143,7 @@ ${trimmed}
2161
2143
  while (++index < list.length) (list[index].add === "after" ? existing : before).push(list[index]);
2162
2144
  splice(existing, 0, 0, before);
2163
2145
  }
2164
- //#endregion
2165
- //#region node_modules/micromark-util-decode-numeric-character-reference/index.js
2146
+ // node_modules/micromark-util-decode-numeric-character-reference/index.js
2166
2147
  /**
2167
2148
  * Turn the number (in string form as either hexa- or plain decimal) coming from
2168
2149
  * a numeric character reference into a character.
@@ -2182,8 +2163,7 @@ ${trimmed}
2182
2163
  if (code < 9 || code === 11 || code > 13 && code < 32 || code > 126 && code < 160 || code > 55295 && code < 57344 || code > 64975 && code < 65008 || (code & 65535) === 65535 || (code & 65535) === 65534 || code > 1114111) return "�";
2183
2164
  return String.fromCodePoint(code);
2184
2165
  }
2185
- //#endregion
2186
- //#region node_modules/micromark-util-normalize-identifier/index.js
2166
+ // node_modules/micromark-util-normalize-identifier/index.js
2187
2167
  /**
2188
2168
  * Normalize an identifier (as found in references, definitions).
2189
2169
  *
@@ -2206,8 +2186,7 @@ ${trimmed}
2206
2186
  function normalizeIdentifier(value) {
2207
2187
  return value.replace(/[\t\n\r ]+/g, " ").replace(/^ | $/g, "").toLowerCase().toUpperCase();
2208
2188
  }
2209
- //#endregion
2210
- //#region node_modules/micromark-util-character/index.js
2189
+ // node_modules/micromark-util-character/index.js
2211
2190
  /**
2212
2191
  * @import {Code} from 'micromark-util-types'
2213
2192
  */
@@ -2434,8 +2413,7 @@ ${trimmed}
2434
2413
  return code !== null && code > -1 && regex.test(String.fromCharCode(code));
2435
2414
  }
2436
2415
  }
2437
- //#endregion
2438
- //#region node_modules/micromark-util-sanitize-uri/index.js
2416
+ // node_modules/micromark-util-sanitize-uri/index.js
2439
2417
  /**
2440
2418
  * Normalize a URL.
2441
2419
  *
@@ -2479,8 +2457,7 @@ ${trimmed}
2479
2457
  }
2480
2458
  return result.join("") + value.slice(start);
2481
2459
  }
2482
- //#endregion
2483
- //#region node_modules/micromark-factory-space/index.js
2460
+ // node_modules/micromark-factory-space/index.js
2484
2461
  /**
2485
2462
  * @import {Effects, State, TokenType} from 'micromark-util-types'
2486
2463
  */
@@ -2586,8 +2563,7 @@ ${trimmed}
2586
2563
  return size >= min ? ok(code) : nok(code);
2587
2564
  }
2588
2565
  }
2589
- //#endregion
2590
- //#region node_modules/micromark/lib/initialize/content.js
2566
+ // node_modules/micromark/lib/initialize/content.js
2591
2567
  /**
2592
2568
  * @import {
2593
2569
  * InitialConstruct,
@@ -2653,8 +2629,7 @@ ${trimmed}
2653
2629
  return data;
2654
2630
  }
2655
2631
  }
2656
- //#endregion
2657
- //#region node_modules/micromark-util-edit-map/index.js
2632
+ // node_modules/micromark-util-edit-map/index.js
2658
2633
  /**
2659
2634
  * @import {Event} from 'micromark-util-types'
2660
2635
  */
@@ -2799,8 +2774,7 @@ ${trimmed}
2799
2774
  editMap.map.push(change);
2800
2775
  editMap.index.set(at, change);
2801
2776
  }
2802
- //#endregion
2803
- //#region node_modules/micromark/lib/initialize/document.js
2777
+ // node_modules/micromark/lib/initialize/document.js
2804
2778
  /**
2805
2779
  * @import {
2806
2780
  * Construct,
@@ -3019,8 +2993,7 @@ ${trimmed}
3019
2993
  function tokenizeContainer(effects, ok, nok) {
3020
2994
  return factorySpace(effects, effects.attempt(this.parser.constructs.document, ok, nok), "linePrefix", this.parser.constructs.disable.null.includes("codeIndented") ? void 0 : 4);
3021
2995
  }
3022
- //#endregion
3023
- //#region node_modules/micromark-util-classify-character/index.js
2996
+ // node_modules/micromark-util-classify-character/index.js
3024
2997
  /**
3025
2998
  * @import {Code} from 'micromark-util-types'
3026
2999
  */
@@ -3042,8 +3015,7 @@ ${trimmed}
3042
3015
  if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) return 1;
3043
3016
  if (unicodePunctuation(code)) return 2;
3044
3017
  }
3045
- //#endregion
3046
- //#region node_modules/micromark-util-resolve-all/index.js
3018
+ // node_modules/micromark-util-resolve-all/index.js
3047
3019
  /**
3048
3020
  * @import {Event, Resolver, TokenizeContext} from 'micromark-util-types'
3049
3021
  */
@@ -3072,8 +3044,7 @@ ${trimmed}
3072
3044
  }
3073
3045
  return events;
3074
3046
  }
3075
- //#endregion
3076
- //#region node_modules/micromark-core-commonmark/lib/attention.js
3047
+ // node_modules/micromark-core-commonmark/lib/attention.js
3077
3048
  /**
3078
3049
  * @import {
3079
3050
  * Code,
@@ -3280,8 +3251,7 @@ ${trimmed}
3280
3251
  point.offset += offset;
3281
3252
  point._bufferIndex += offset;
3282
3253
  }
3283
- //#endregion
3284
- //#region node_modules/micromark-core-commonmark/lib/autolink.js
3254
+ // node_modules/micromark-core-commonmark/lib/autolink.js
3285
3255
  /**
3286
3256
  * @import {
3287
3257
  * Construct,
@@ -3491,8 +3461,7 @@ ${trimmed}
3491
3461
  return nok(code);
3492
3462
  }
3493
3463
  }
3494
- //#endregion
3495
- //#region node_modules/micromark-core-commonmark/lib/blank-line.js
3464
+ // node_modules/micromark-core-commonmark/lib/blank-line.js
3496
3465
  /**
3497
3466
  * @import {
3498
3467
  * Construct,
@@ -3548,8 +3517,7 @@ ${trimmed}
3548
3517
  return code === null || markdownLineEnding(code) ? ok(code) : nok(code);
3549
3518
  }
3550
3519
  }
3551
- //#endregion
3552
- //#region node_modules/micromark-core-commonmark/lib/block-quote.js
3520
+ // node_modules/micromark-core-commonmark/lib/block-quote.js
3553
3521
  /**
3554
3522
  * @import {
3555
3523
  * Construct,
@@ -3675,8 +3643,7 @@ ${trimmed}
3675
3643
  function exit$1(effects) {
3676
3644
  effects.exit("blockQuote");
3677
3645
  }
3678
- //#endregion
3679
- //#region node_modules/micromark-core-commonmark/lib/character-escape.js
3646
+ // node_modules/micromark-core-commonmark/lib/character-escape.js
3680
3647
  /**
3681
3648
  * @import {
3682
3649
  * Construct,
@@ -3735,8 +3702,7 @@ ${trimmed}
3735
3702
  return nok(code);
3736
3703
  }
3737
3704
  }
3738
- //#endregion
3739
- //#region node_modules/micromark-core-commonmark/lib/character-reference.js
3705
+ // node_modules/micromark-core-commonmark/lib/character-reference.js
3740
3706
  /**
3741
3707
  * @import {
3742
3708
  * Code,
@@ -3873,8 +3839,7 @@ ${trimmed}
3873
3839
  return nok(code);
3874
3840
  }
3875
3841
  }
3876
- //#endregion
3877
- //#region node_modules/micromark-core-commonmark/lib/partial-non-lazy-continuation.js
3842
+ // node_modules/micromark-core-commonmark/lib/partial-non-lazy-continuation.js
3878
3843
  /** @type {Construct} */
3879
3844
  const nonLazyContinuation$2 = {
3880
3845
  partial: true,
@@ -3921,8 +3886,7 @@ ${trimmed}
3921
3886
  return self.parser.lazy[self.now().line] ? nok(code) : ok(code);
3922
3887
  }
3923
3888
  }
3924
- //#endregion
3925
- //#region node_modules/micromark-core-commonmark/lib/code-fenced.js
3889
+ // node_modules/micromark-core-commonmark/lib/code-fenced.js
3926
3890
  /**
3927
3891
  * @import {
3928
3892
  * Code,
@@ -4302,8 +4266,7 @@ ${trimmed}
4302
4266
  }
4303
4267
  }
4304
4268
  }
4305
- //#endregion
4306
- //#region node_modules/micromark-core-commonmark/lib/code-indented.js
4269
+ // node_modules/micromark-core-commonmark/lib/code-indented.js
4307
4270
  /**
4308
4271
  * @import {
4309
4272
  * Construct,
@@ -4434,8 +4397,7 @@ ${trimmed}
4434
4397
  return markdownLineEnding(code) ? furtherStart(code) : nok(code);
4435
4398
  }
4436
4399
  }
4437
- //#endregion
4438
- //#region node_modules/micromark-core-commonmark/lib/code-text.js
4400
+ // node_modules/micromark-core-commonmark/lib/code-text.js
4439
4401
  /**
4440
4402
  * @import {
4441
4403
  * Construct,
@@ -4619,8 +4581,7 @@ ${trimmed}
4619
4581
  return data(code);
4620
4582
  }
4621
4583
  }
4622
- //#endregion
4623
- //#region node_modules/micromark-util-subtokenize/lib/splice-buffer.js
4584
+ // node_modules/micromark-util-subtokenize/lib/splice-buffer.js
4624
4585
  /**
4625
4586
  * Some of the internal operations of micromark do lots of editing
4626
4587
  * operations on very large arrays. This runs into problems with two
@@ -4849,8 +4810,7 @@ ${trimmed}
4849
4810
  chunkStart += 1e4;
4850
4811
  }
4851
4812
  }
4852
- //#endregion
4853
- //#region node_modules/micromark-util-subtokenize/index.js
4813
+ // node_modules/micromark-util-subtokenize/index.js
4854
4814
  /**
4855
4815
  * @import {Chunk, Event, Token} from 'micromark-util-types'
4856
4816
  */
@@ -5004,8 +4964,7 @@ ${trimmed}
5004
4964
  }
5005
4965
  return gaps;
5006
4966
  }
5007
- //#endregion
5008
- //#region node_modules/micromark-core-commonmark/lib/content.js
4967
+ // node_modules/micromark-core-commonmark/lib/content.js
5009
4968
  /**
5010
4969
  * @import {
5011
4970
  * Construct,
@@ -5137,8 +5096,7 @@ ${trimmed}
5137
5096
  return effects.interrupt(self.parser.constructs.flow, nok, ok)(code);
5138
5097
  }
5139
5098
  }
5140
- //#endregion
5141
- //#region node_modules/micromark-factory-destination/index.js
5099
+ // node_modules/micromark-factory-destination/index.js
5142
5100
  /**
5143
5101
  * @import {Effects, State, TokenType} from 'micromark-util-types'
5144
5102
  */
@@ -5321,8 +5279,7 @@ ${trimmed}
5321
5279
  return raw(code);
5322
5280
  }
5323
5281
  }
5324
- //#endregion
5325
- //#region node_modules/micromark-factory-label/index.js
5282
+ // node_modules/micromark-factory-label/index.js
5326
5283
  /**
5327
5284
  * @import {
5328
5285
  * Effects,
@@ -5455,8 +5412,7 @@ ${trimmed}
5455
5412
  return labelInside(code);
5456
5413
  }
5457
5414
  }
5458
- //#endregion
5459
- //#region node_modules/micromark-factory-title/index.js
5415
+ // node_modules/micromark-factory-title/index.js
5460
5416
  /**
5461
5417
  * @import {
5462
5418
  * Code,
@@ -5600,8 +5556,7 @@ ${trimmed}
5600
5556
  return inside(code);
5601
5557
  }
5602
5558
  }
5603
- //#endregion
5604
- //#region node_modules/micromark-factory-whitespace/index.js
5559
+ // node_modules/micromark-factory-whitespace/index.js
5605
5560
  /**
5606
5561
  * @import {Effects, State} from 'micromark-util-types'
5607
5562
  */
@@ -5640,8 +5595,7 @@ ${trimmed}
5640
5595
  return ok(code);
5641
5596
  }
5642
5597
  }
5643
- //#endregion
5644
- //#region node_modules/micromark-core-commonmark/lib/definition.js
5598
+ // node_modules/micromark-core-commonmark/lib/definition.js
5645
5599
  /**
5646
5600
  * @import {
5647
5601
  * Construct,
@@ -5855,8 +5809,7 @@ ${trimmed}
5855
5809
  return code === null || markdownLineEnding(code) ? ok(code) : nok(code);
5856
5810
  }
5857
5811
  }
5858
- //#endregion
5859
- //#region node_modules/micromark-core-commonmark/lib/hard-break-escape.js
5812
+ // node_modules/micromark-core-commonmark/lib/hard-break-escape.js
5860
5813
  /**
5861
5814
  * @import {
5862
5815
  * Construct,
@@ -5912,8 +5865,7 @@ ${trimmed}
5912
5865
  return nok(code);
5913
5866
  }
5914
5867
  }
5915
- //#endregion
5916
- //#region node_modules/micromark-core-commonmark/lib/heading-atx.js
5868
+ // node_modules/micromark-core-commonmark/lib/heading-atx.js
5917
5869
  /**
5918
5870
  * @import {
5919
5871
  * Construct,
@@ -6093,8 +6045,7 @@ ${trimmed}
6093
6045
  return data;
6094
6046
  }
6095
6047
  }
6096
- //#endregion
6097
- //#region node_modules/micromark-util-html-tag-name/index.js
6048
+ // node_modules/micromark-util-html-tag-name/index.js
6098
6049
  /**
6099
6050
  * List of lowercase HTML “block” tag names.
6100
6051
  *
@@ -6192,8 +6143,7 @@ ${trimmed}
6192
6143
  "style",
6193
6144
  "textarea"
6194
6145
  ];
6195
- //#endregion
6196
- //#region node_modules/micromark-core-commonmark/lib/html-flow.js
6146
+ // node_modules/micromark-core-commonmark/lib/html-flow.js
6197
6147
  /**
6198
6148
  * @import {
6199
6149
  * Code,
@@ -6918,8 +6868,7 @@ ${trimmed}
6918
6868
  return effects.attempt(blankLine, ok, nok);
6919
6869
  }
6920
6870
  }
6921
- //#endregion
6922
- //#region node_modules/micromark-core-commonmark/lib/html-text.js
6871
+ // node_modules/micromark-core-commonmark/lib/html-text.js
6923
6872
  /**
6924
6873
  * @import {
6925
6874
  * Code,
@@ -7532,8 +7481,7 @@ ${trimmed}
7532
7481
  return returnState(code);
7533
7482
  }
7534
7483
  }
7535
- //#endregion
7536
- //#region node_modules/micromark-core-commonmark/lib/label-end.js
7484
+ // node_modules/micromark-core-commonmark/lib/label-end.js
7537
7485
  /**
7538
7486
  * @import {
7539
7487
  * Construct,
@@ -8001,8 +7949,7 @@ ${trimmed}
8001
7949
  return nok(code);
8002
7950
  }
8003
7951
  }
8004
- //#endregion
8005
- //#region node_modules/micromark-core-commonmark/lib/label-start-image.js
7952
+ // node_modules/micromark-core-commonmark/lib/label-start-image.js
8006
7953
  /**
8007
7954
  * @import {
8008
7955
  * Construct,
@@ -8100,8 +8047,7 @@ ${trimmed}
8100
8047
  return ok(code);
8101
8048
  }
8102
8049
  }
8103
- //#endregion
8104
- //#region node_modules/micromark-core-commonmark/lib/label-start-link.js
8050
+ // node_modules/micromark-core-commonmark/lib/label-start-link.js
8105
8051
  /**
8106
8052
  * @import {
8107
8053
  * Construct,
@@ -8154,8 +8100,7 @@ ${trimmed}
8154
8100
  return ok(code);
8155
8101
  }
8156
8102
  }
8157
- //#endregion
8158
- //#region node_modules/micromark-core-commonmark/lib/line-ending.js
8103
+ // node_modules/micromark-core-commonmark/lib/line-ending.js
8159
8104
  /**
8160
8105
  * @import {
8161
8106
  * Construct,
@@ -8184,8 +8129,7 @@ ${trimmed}
8184
8129
  return factorySpace(effects, ok, "linePrefix");
8185
8130
  }
8186
8131
  }
8187
- //#endregion
8188
- //#region node_modules/micromark-core-commonmark/lib/thematic-break.js
8132
+ // node_modules/micromark-core-commonmark/lib/thematic-break.js
8189
8133
  /**
8190
8134
  * @import {
8191
8135
  * Code,
@@ -8279,8 +8223,7 @@ ${trimmed}
8279
8223
  return markdownSpace(code) ? factorySpace(effects, atBreak, "whitespace")(code) : atBreak(code);
8280
8224
  }
8281
8225
  }
8282
- //#endregion
8283
- //#region node_modules/micromark-core-commonmark/lib/list.js
8226
+ // node_modules/micromark-core-commonmark/lib/list.js
8284
8227
  /**
8285
8228
  * @import {
8286
8229
  * Code,
@@ -8451,8 +8394,7 @@ ${trimmed}
8451
8394
  return !markdownSpace(code) && tail && tail[1].type === "listItemPrefixWhitespace" ? ok(code) : nok(code);
8452
8395
  }
8453
8396
  }
8454
- //#endregion
8455
- //#region node_modules/micromark-core-commonmark/lib/setext-underline.js
8397
+ // node_modules/micromark-core-commonmark/lib/setext-underline.js
8456
8398
  /**
8457
8399
  * @import {
8458
8400
  * Code,
@@ -8605,8 +8547,7 @@ ${trimmed}
8605
8547
  return nok(code);
8606
8548
  }
8607
8549
  }
8608
- //#endregion
8609
- //#region node_modules/micromark/lib/initialize/flow.js
8550
+ // node_modules/micromark/lib/initialize/flow.js
8610
8551
  /**
8611
8552
  * @import {
8612
8553
  * InitialConstruct,
@@ -8652,8 +8593,7 @@ ${trimmed}
8652
8593
  return initial;
8653
8594
  }
8654
8595
  }
8655
- //#endregion
8656
- //#region node_modules/micromark/lib/initialize/text.js
8596
+ // node_modules/micromark/lib/initialize/text.js
8657
8597
  /**
8658
8598
  * @import {
8659
8599
  * Code,
@@ -8828,8 +8768,7 @@ ${trimmed}
8828
8768
  editMap.consume(events);
8829
8769
  return events;
8830
8770
  }
8831
- //#endregion
8832
- //#region node_modules/micromark/lib/constructs.js
8771
+ // node_modules/micromark/lib/constructs.js
8833
8772
  /**
8834
8773
  * @import {Extension} from 'micromark-util-types'
8835
8774
  */
@@ -8906,8 +8845,7 @@ ${trimmed}
8906
8845
  const attentionMarkers = { null: [42, 95] };
8907
8846
  /** @satisfies {Extension['disable']} */
8908
8847
  const disable = { null: [] };
8909
- //#endregion
8910
- //#region node_modules/micromark/lib/create-tokenizer.js
8848
+ // node_modules/micromark/lib/create-tokenizer.js
8911
8849
  /**
8912
8850
  * @import {
8913
8851
  * Chunk,
@@ -9373,8 +9311,7 @@ ${trimmed}
9373
9311
  }
9374
9312
  return result.join("");
9375
9313
  }
9376
- //#endregion
9377
- //#region node_modules/micromark/lib/parse.js
9314
+ // node_modules/micromark/lib/parse.js
9378
9315
  /**
9379
9316
  * @import {
9380
9317
  * Create,
@@ -9417,8 +9354,7 @@ ${trimmed}
9417
9354
  }
9418
9355
  }
9419
9356
  }
9420
- //#endregion
9421
- //#region node_modules/micromark/lib/postprocess.js
9357
+ // node_modules/micromark/lib/postprocess.js
9422
9358
  /**
9423
9359
  * @import {Event} from 'micromark-util-types'
9424
9360
  */
@@ -9432,8 +9368,7 @@ ${trimmed}
9432
9368
  while (!subtokenize(events));
9433
9369
  return events;
9434
9370
  }
9435
- //#endregion
9436
- //#region node_modules/micromark/lib/preprocess.js
9371
+ // node_modules/micromark/lib/preprocess.js
9437
9372
  /**
9438
9373
  * @import {Chunk, Code, Encoding, Value} from 'micromark-util-types'
9439
9374
  */
@@ -9524,8 +9459,7 @@ ${trimmed}
9524
9459
  return chunks;
9525
9460
  }
9526
9461
  }
9527
- //#endregion
9528
- //#region node_modules/micromark-util-decode-string/index.js
9462
+ // node_modules/micromark-util-decode-string/index.js
9529
9463
  const characterEscapeOrReference = /\\([!-/:-@[-`{-~])|&(#(?:\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi;
9530
9464
  /**
9531
9465
  * Decode markdown strings (which occur in places such as fenced code info
@@ -9561,8 +9495,7 @@ ${trimmed}
9561
9495
  }
9562
9496
  return decodeNamedCharacterReference($2) || $0;
9563
9497
  }
9564
- //#endregion
9565
- //#region node_modules/unist-util-stringify-position/lib/index.js
9498
+ // node_modules/unist-util-stringify-position/lib/index.js
9566
9499
  /**
9567
9500
  * @typedef {import('unist').Node} Node
9568
9501
  * @typedef {import('unist').Point} Point
@@ -9625,8 +9558,7 @@ ${trimmed}
9625
9558
  function index(value) {
9626
9559
  return value && typeof value === "number" ? value : 1;
9627
9560
  }
9628
- //#endregion
9629
- //#region node_modules/mdast-util-from-markdown/lib/index.js
9561
+ // node_modules/mdast-util-from-markdown/lib/index.js
9630
9562
  /**
9631
9563
  * @import {
9632
9564
  * Break,
@@ -10672,8 +10604,7 @@ ${trimmed}
10672
10604
  end: right.end
10673
10605
  }) + ") is still open");
10674
10606
  }
10675
- //#endregion
10676
- //#region node_modules/ccount/index.js
10607
+ // node_modules/ccount/index.js
10677
10608
  /**
10678
10609
  * Count how often a character (or substring) is used in a string.
10679
10610
  *
@@ -10695,14 +10626,12 @@ ${trimmed}
10695
10626
  }
10696
10627
  return count;
10697
10628
  }
10698
- //#endregion
10699
- //#region node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp/index.js
10629
+ // node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp/index.js
10700
10630
  function escapeStringRegexp(string) {
10701
10631
  if (typeof string !== "string") throw new TypeError("Expected a string");
10702
10632
  return string.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d");
10703
10633
  }
10704
- //#endregion
10705
- //#region node_modules/unist-util-is/lib/index.js
10634
+ // node_modules/unist-util-is/lib/index.js
10706
10635
  /**
10707
10636
  * Generate an assertion from a test.
10708
10637
  *
@@ -10815,17 +10744,19 @@ ${trimmed}
10815
10744
  function looksLikeANode(value) {
10816
10745
  return value !== null && typeof value === "object" && "type" in value;
10817
10746
  }
10818
- //#endregion
10819
- //#region node_modules/unist-util-visit-parents/lib/color.node.js
10747
+ // node_modules/unist-util-visit-parents/lib/color.node.js
10820
10748
  /**
10749
+ * Color a string.
10750
+ *
10821
10751
  * @param {string} d
10752
+ * Value.
10822
10753
  * @returns {string}
10754
+ * Colored value.
10823
10755
  */
10824
10756
  function color(d) {
10825
10757
  return "\x1B[33m" + d + "\x1B[39m";
10826
10758
  }
10827
- //#endregion
10828
- //#region node_modules/unist-util-visit-parents/lib/index.js
10759
+ // node_modules/unist-util-visit-parents/lib/index.js
10829
10760
  /**
10830
10761
  * @import {Node as UnistNode, Parent as UnistParent} from 'unist'
10831
10762
  */
@@ -10983,45 +10914,95 @@ ${trimmed}
10983
10914
  * List with one or two values, the first an action, the second an index.
10984
10915
  *
10985
10916
  * @typedef {Action | ActionTuple | Index | null | undefined | void} VisitorResult
10986
- * Any value that can be returned from a visitor.
10917
+ * Any value that can be returned from an enter visitor.
10918
+ *
10919
+ * Like `VisitorResultExit`,
10920
+ * but `SKIP` can also be returned,
10921
+ * to not walk the children of the node,
10922
+ * and `ActionTuple` can be used to combine an action with an index.
10923
+ *
10924
+ * @typedef {Index | boolean | null | undefined | void} VisitorResultExit
10925
+ * Any value that can be returned from an exit visitor.
10987
10926
  */
10988
10927
  /**
10989
10928
  * @callback Visitor
10990
- * Handle a node (matching `test`, if given).
10991
- *
10992
- * Visitors are free to transform `node`.
10993
- * They can also transform the parent of node (the last of `ancestors`).
10994
- *
10995
- * Replacing `node` itself, if `SKIP` is not returned, still causes its
10996
- * descendants to be walked (which is a bug).
10997
- *
10998
- * When adding or removing previous siblings of `node` (or next siblings, in
10999
- * case of reverse), the `Visitor` should return a new `Index` to specify the
11000
- * sibling to traverse after `node` is traversed.
11001
- * Adding or removing next siblings of `node` (or previous siblings, in case
11002
- * of reverse) is handled as expected without needing to return a new `Index`.
11003
- *
11004
- * Removing the children property of an ancestor still results in them being
11005
- * traversed.
10929
+ * Handle a node (matching `test`, if given) before its children.
10930
+ *
10931
+ * Changes inside `node` are walked next.
10932
+ * Replacing or removing it is easier in `exit`.
10933
+ * When replacing or removing it here,
10934
+ * return `SKIP` (as otherwise its old children are walked),
10935
+ * or `[SKIP, index]` to continue with the node now at `index`.
10936
+ * Changing next siblings (in walk order) is fine;
10937
+ * changing previous siblings needs a new `Index`.
10938
+ * Removing an ancestor or changing its previous siblings is not supported.
11006
10939
  * @param {Visited} node
11007
10940
  * Found node.
11008
10941
  * @param {Array<VisitedParents>} ancestors
11009
10942
  * Ancestors of `node`.
10943
+ * @param {number | undefined} index
10944
+ * Index of `node` in its parent (the last of `ancestors`),
10945
+ * or `undefined` for the tree itself.
11010
10946
  * @returns {VisitorResult}
11011
10947
  * What to do next.
11012
10948
  *
11013
- * An `Index` is treated as a tuple of `[CONTINUE, Index]`.
11014
- * An `Action` is treated as a tuple of `[Action]`.
10949
+ * Like `VisitorExit`,
10950
+ * but `SKIP` can also be returned,
10951
+ * to not walk the children of `node`.
10952
+ * Passing a tuple back (`ActionTuple`) only makes sense as `[SKIP, Index]`.
10953
+ * @template {UnistNode} [Visited=UnistNode]
10954
+ * Visited node type.
10955
+ * @template {UnistParent} [VisitedParents=UnistParent]
10956
+ * Ancestor type.
10957
+ */
10958
+ /**
10959
+ * @callback VisitorExit
10960
+ * Handle a node (matching `test`, if given) after its children.
10961
+ *
10962
+ * Changes inside `node` are not walked,
10963
+ * which makes this a good place to change `node` based on its children,
10964
+ * or to replace or remove it.
10965
+ * When removing `node` or changing previous siblings (in walk order),
10966
+ * return a new `Index`.
10967
+ * Removing an ancestor or changing its previous siblings is not supported.
10968
+ * @param {Visited} node
10969
+ * Found node.
10970
+ * @param {Array<VisitedParents>} ancestors
10971
+ * Ancestors of `node`.
10972
+ * @param {number | undefined} index
10973
+ * Index of `node` in its parent (the last of `ancestors`),
10974
+ * or `undefined` for the tree itself.
10975
+ * @returns {VisitorResultExit}
10976
+ * What to do next.
11015
10977
  *
11016
- * Passing a tuple back only makes sense if the `Action` is `SKIP`.
11017
- * When the `Action` is `EXIT`, that action can be returned.
11018
- * When the `Action` is `CONTINUE`, `Index` can be returned.
10978
+ * `CONTINUE` (`true`, nothing) continues as normal,
10979
+ * `EXIT` (`false`) stops traversing,
10980
+ * and `Index` continues at that sibling.
11019
10981
  * @template {UnistNode} [Visited=UnistNode]
11020
10982
  * Visited node type.
11021
10983
  * @template {UnistParent} [VisitedParents=UnistParent]
11022
10984
  * Ancestor type.
11023
10985
  */
11024
10986
  /**
10987
+ * @template {UnistNode} [Visited=UnistNode]
10988
+ * Visited node type.
10989
+ * @template {UnistParent} [VisitedParents=UnistParent]
10990
+ * Ancestor type.
10991
+ * @typedef Visitors
10992
+ * Handle nodes when entering and exiting them.
10993
+ * The `enter` visitor is optional while `exit` is required.
10994
+ *
10995
+ * Pass an `enter` visitor directly to only handle nodes when entering them.
10996
+ *
10997
+ * `enter` is called before children (if any) are walked and `exit` after that.
10998
+ * `exit` is still called when `enter` returns `SKIP`.
10999
+ * Both `enter` and `exit` are only called for nodes that match an optional `test`.
11000
+ * @property {Visitor<Visited, VisitedParents> | null | undefined} [enter]
11001
+ * Handle a node before its children (optional).
11002
+ * @property {VisitorExit<Visited, VisitedParents>} exit
11003
+ * Handle a node after its children.
11004
+ */
11005
+ /**
11025
11006
  * @typedef {Visitor<Matches<InclusiveDescendant<Tree>, Check>, Ancestor<Tree, Matches<InclusiveDescendant<Tree>, Check>>>} BuildVisitor
11026
11007
  * Build a typed `Visitor` function from a tree and a test.
11027
11008
  *
@@ -11031,16 +11012,34 @@ ${trimmed}
11031
11012
  * @template {Test} [Check=Test]
11032
11013
  * Test type.
11033
11014
  */
11015
+ /**
11016
+ * @typedef {Visitors<Matches<InclusiveDescendant<Tree>, Check>, Ancestor<Tree, Matches<InclusiveDescendant<Tree>, Check>>>} BuildVisitors
11017
+ * Build typed `Visitors` from a tree and a test.
11018
+ *
11019
+ * It will infer which values are passed as `node` and which as `parents`.
11020
+ * @template {UnistNode} [Tree=UnistNode]
11021
+ * Tree type.
11022
+ * @template {Test} [Check=Test]
11023
+ * Test type.
11024
+ */
11034
11025
  /** @type {Readonly<ActionTuple>} */
11035
11026
  const empty = [];
11036
11027
  /**
11028
+ * Do not traverse this node’s children.
11029
+ * Only works when entering a node.
11030
+ */
11031
+ const SKIP = "skip";
11032
+ /**
11037
11033
  * Visit nodes, with ancestral information.
11038
11034
  *
11039
11035
  * This algorithm performs *depth-first* *tree traversal* in *preorder*
11040
- * (**NLR**) or if `reverse` is given, in *reverse preorder* (**NRL**).
11036
+ * (**NLR**) or if `reverse` is given,
11037
+ * in *reverse preorder* (**NRL**).
11038
+ * An `exit` visitor is called in *postorder* (**LRN**)
11039
+ * or if `reverse` is given, in *reverse postorder* (**RLN**).
11041
11040
  *
11042
- * You can choose for which nodes `visitor` is called by passing a `test`.
11043
- * For complex tests, you should test yourself in `visitor`, as it will be
11041
+ * You can choose which nodes are visited by passing a `test`.
11042
+ * For complex tests, you should test yourself in a visitor, as it will be
11044
11043
  * faster and will have improved type information.
11045
11044
  *
11046
11045
  * Walking the tree is an intensive task.
@@ -11049,29 +11048,72 @@ ${trimmed}
11049
11048
  * to check if a node matches, and then perform different operations.
11050
11049
  *
11051
11050
  * You can change the tree.
11052
- * See `Visitor` for more info.
11051
+ * Changes inside a node made when entering it are walked,
11052
+ * changes made when exiting it are not.
11053
+ * See `Visitor` and `VisitorExit` for more info.
11054
+ *
11055
+ * @overload
11056
+ * @param {Tree} tree
11057
+ * Tree to traverse.
11058
+ * @param {Check} check
11059
+ * `unist-util-is`-compatible test.
11060
+ * @param {BuildVisitor<Tree, Check>} enter
11061
+ * Handle each node when entering it.
11062
+ * @param {boolean | null | undefined} [reverse]
11063
+ * Walk children from last to first;
11064
+ * for `enter`, reverse preorder (NRL) instead of preorder (NLR);
11065
+ * for `exit`, reverse postorder (RLN) instead of postorder (LRN).
11066
+ * @returns {undefined}
11067
+ * Nothing.
11053
11068
  *
11054
11069
  * @overload
11055
11070
  * @param {Tree} tree
11071
+ * Tree to traverse.
11056
11072
  * @param {Check} check
11057
- * @param {BuildVisitor<Tree, Check>} visitor
11073
+ * `unist-util-is`-compatible test.
11074
+ * @param {BuildVisitors<Tree, Check>} visitors
11075
+ * Handle each node when exiting it, and optionally when entering it.
11076
+ * @param {boolean | null | undefined} [reverse]
11077
+ * Walk children from last to first;
11078
+ * for `enter`, reverse preorder (NRL) instead of preorder (NLR);
11079
+ * for `exit`, reverse postorder (RLN) instead of postorder (LRN).
11080
+ * @returns {undefined}
11081
+ * Nothing.
11082
+ *
11083
+ * @overload
11084
+ * @param {Tree} tree
11085
+ * Tree to traverse.
11086
+ * @param {BuildVisitor<Tree>} enter
11087
+ * Handle each node when entering it.
11058
11088
  * @param {boolean | null | undefined} [reverse]
11089
+ * Walk children from last to first;
11090
+ * for `enter`, reverse preorder (NRL) instead of preorder (NLR);
11091
+ * for `exit`, reverse postorder (RLN) instead of postorder (LRN).
11059
11092
  * @returns {undefined}
11093
+ * Nothing.
11060
11094
  *
11061
11095
  * @overload
11062
11096
  * @param {Tree} tree
11063
- * @param {BuildVisitor<Tree>} visitor
11097
+ * Tree to traverse.
11098
+ * @param {BuildVisitors<Tree>} visitors
11099
+ * Handle each node when exiting it, and optionally when entering it.
11064
11100
  * @param {boolean | null | undefined} [reverse]
11101
+ * Walk children from last to first;
11102
+ * for `enter`, reverse preorder (NRL) instead of preorder (NLR);
11103
+ * for `exit`, reverse postorder (RLN) instead of postorder (LRN).
11065
11104
  * @returns {undefined}
11105
+ * Nothing.
11066
11106
  *
11067
11107
  * @param {UnistNode} tree
11068
11108
  * Tree to traverse.
11069
- * @param {Visitor | Test} test
11070
- * `unist-util-is`-compatible test
11071
- * @param {Visitor | boolean | null | undefined} [visitor]
11072
- * Handle each node.
11109
+ * @param {Visitor | Visitors | Test} testOrEnterOrVisitors
11110
+ * `unist-util-is`-compatible test, `enter`, or `visitors`.
11111
+ * @param {Visitor | Visitors | boolean | null | undefined} [enterOrVisitorsOrReverse]
11112
+ * `enter`, `visitors`, or `reverse` after a test.
11073
11113
  * @param {boolean | null | undefined} [reverse]
11074
- * Traverse in reverse preorder (NRL) instead of the default preorder (NLR).
11114
+ * Walk children from last to first;
11115
+ * for `enter`, reverse preorder (NRL) instead of preorder (NLR);
11116
+ * for `exit`, reverse postorder (RLN) instead of postorder (LRN).
11075
11117
  * @returns {undefined}
11076
11118
  * Nothing.
11077
11119
  *
@@ -11080,20 +11122,46 @@ ${trimmed}
11080
11122
  * @template {Test} Check
11081
11123
  * `unist-util-is`-compatible test.
11082
11124
  */
11083
- function visitParents(tree, test, visitor, reverse) {
11125
+ function visitParents(tree, testOrEnterOrVisitors, enterOrVisitorsOrReverse, reverse) {
11126
+ if (!tree || typeof tree !== "object") throw new Error("Unexpected value `" + tree + "` for `tree`, expected node");
11127
+ let preorder = true;
11084
11128
  /** @type {Test} */
11085
11129
  let check;
11086
- if (typeof test === "function" && typeof visitor !== "function") {
11087
- reverse = visitor;
11088
- visitor = test;
11089
- } else check = test;
11130
+ /** @type {Visitors | Visitor} */
11131
+ let visitors;
11132
+ /** @type {Visitor | null | undefined} */
11133
+ let enter;
11134
+ /** @type {VisitorExit | null | undefined} */
11135
+ let exit;
11136
+ if (typeof enterOrVisitorsOrReverse === "function" || enterOrVisitorsOrReverse && typeof enterOrVisitorsOrReverse === "object") {
11137
+ check = testOrEnterOrVisitors;
11138
+ visitors = enterOrVisitorsOrReverse;
11139
+ if (reverse) preorder = false;
11140
+ } else {
11141
+ visitors = testOrEnterOrVisitors;
11142
+ if (enterOrVisitorsOrReverse) preorder = false;
11143
+ }
11144
+ if (typeof visitors === "function") enter = visitors;
11145
+ else if (visitors && typeof visitors === "object") {
11146
+ if (visitors.enter === null || visitors.enter === void 0) {} else if (typeof visitors.enter === "function") enter = visitors.enter;
11147
+ else throw new Error("Unexpected value `" + visitors.enter + "` for `visitors.enter`, expected optional visitor");
11148
+ if (typeof visitors.exit === "function") exit = visitors.exit;
11149
+ else throw new Error("Unexpected value `" + visitors.exit + "` for `visitors.exit`, expected visitor (pass a visitor directly if you only want an enter visitor)");
11150
+ } else throw new Error("Unexpected value `" + visitors + "` for `enter` or `visitors`, expected visitor or object with visitors");
11090
11151
  const is = convert(check);
11091
- const step = reverse ? -1 : 1;
11152
+ const step = preorder ? 1 : -1;
11092
11153
  factory(tree, void 0, [])();
11093
11154
  /**
11155
+ * Create a function to visit a node.
11156
+ *
11094
11157
  * @param {UnistNode} node
11158
+ * Node to visit.
11095
11159
  * @param {number | undefined} index
11160
+ * Index of `node` in its parent.
11096
11161
  * @param {Array<UnistParent>} parents
11162
+ * Ancestors of `node`.
11163
+ * @returns {() => Readonly<ActionTuple>}
11164
+ * Visit `node`.
11097
11165
  */
11098
11166
  function factory(node, index, parents) {
11099
11167
  const value = node && typeof node === "object" ? node : {};
@@ -11103,31 +11171,31 @@ ${trimmed}
11103
11171
  }
11104
11172
  return visit;
11105
11173
  function visit() {
11174
+ const matches = !check || is(node, index, parents[parents.length - 1] || void 0);
11106
11175
  /** @type {Readonly<ActionTuple>} */
11107
11176
  let result = empty;
11108
- /** @type {Readonly<ActionTuple>} */
11109
- let subresult;
11110
- /** @type {number} */
11111
- let offset;
11112
- /** @type {Array<UnistParent>} */
11113
- let grandparents;
11114
- if (!test || is(node, index, parents[parents.length - 1] || void 0)) {
11115
- result = toResult(visitor(node, parents));
11177
+ if (enter && matches) {
11178
+ result = toResult(enter(node, parents, index));
11116
11179
  if (result[0] === false) return result;
11117
11180
  }
11118
11181
  if ("children" in node && node.children) {
11119
11182
  const nodeAsParent = node;
11120
11183
  if (nodeAsParent.children && result[0] !== "skip") {
11121
- offset = (reverse ? nodeAsParent.children.length : -1) + step;
11122
- grandparents = parents.concat(nodeAsParent);
11184
+ let offset = (preorder ? -1 : nodeAsParent.children.length) + step;
11185
+ const grandparents = [...parents, nodeAsParent];
11123
11186
  while (offset > -1 && offset < nodeAsParent.children.length) {
11124
11187
  const child = nodeAsParent.children[offset];
11125
- subresult = factory(child, offset, grandparents)();
11188
+ const subresult = factory(child, offset, grandparents)();
11126
11189
  if (subresult[0] === false) return subresult;
11127
11190
  offset = typeof subresult[1] === "number" ? subresult[1] : offset + step;
11128
11191
  }
11129
11192
  }
11130
11193
  }
11194
+ if (exit && matches) {
11195
+ const exitResult = toResult(exit(node, parents, index));
11196
+ if (exitResult[0] === "skip") throw new Error("Unexpected value `" + exitResult[0] + "` from `exit`, expected `CONTINUE`, `EXIT`, index, or nothing");
11197
+ if (exitResult[0] === false || typeof exitResult[1] === "number") return exitResult;
11198
+ }
11131
11199
  return result;
11132
11200
  }
11133
11201
  }
@@ -11145,8 +11213,7 @@ ${trimmed}
11145
11213
  if (typeof value === "number") return [true, value];
11146
11214
  return value === null || value === void 0 ? empty : [value];
11147
11215
  }
11148
- //#endregion
11149
- //#region node_modules/mdast-util-find-and-replace/lib/index.js
11216
+ // node_modules/mdast-util-find-and-replace/lib/index.js
11150
11217
  /**
11151
11218
  * @import {Nodes, Parents, PhrasingContent, Root, Text} from 'mdast'
11152
11219
  * @import {BuildVisitor, Test, VisitorResult} from 'unist-util-visit-parents'
@@ -11214,7 +11281,7 @@ ${trimmed}
11214
11281
  * @param {FindAndReplaceList | FindAndReplaceTuple} list
11215
11282
  * Patterns to find.
11216
11283
  * @param {Options | null | undefined} [options]
11217
- * Configuration (when `find` is not `Find`).
11284
+ * Configuration (optional).
11218
11285
  * @returns {undefined}
11219
11286
  * Nothing.
11220
11287
  */
@@ -11222,24 +11289,15 @@ ${trimmed}
11222
11289
  const ignored = convert((options || {}).ignore || []);
11223
11290
  const pairs = toPairs(list);
11224
11291
  let pairIndex = -1;
11225
- while (++pairIndex < pairs.length) visitParents(tree, "text", visitor);
11292
+ while (++pairIndex < pairs.length) visitParents(tree, visitor);
11226
11293
  /**
11227
- * Visit a text node, and handle it if it is not in an ignored parent.
11294
+ * Handle text nodes and skip ignored nodes.
11228
11295
  *
11229
- * @type {BuildVisitor<Root, 'text'>}
11296
+ * @type {BuildVisitor<Root>}
11230
11297
  */
11231
- function visitor(node, parents) {
11232
- let index = -1;
11233
- /** @type {Parents | undefined} */
11234
- let grandparent;
11235
- while (++index < parents.length) {
11236
- const parent = parents[index];
11237
- /** @type {Array<Nodes> | undefined} */
11238
- const siblings = grandparent ? grandparent.children : void 0;
11239
- if (ignored(parent, siblings ? siblings.indexOf(parent) : void 0, grandparent)) return;
11240
- grandparent = parent;
11241
- }
11242
- if (grandparent) return handler(node, parents);
11298
+ function visitor(node, parents, index) {
11299
+ if (node.type === "text" && typeof index === "number") return handler(node, parents, index);
11300
+ if (ignored(node, index, parents[parents.length - 1])) return SKIP;
11243
11301
  }
11244
11302
  /**
11245
11303
  * Handle a text node which is not in an ignored parent.
@@ -11248,15 +11306,16 @@ ${trimmed}
11248
11306
  * Text node to search in.
11249
11307
  * @param {Array<Parents>} parents
11250
11308
  * Ancestors of `node`.
11309
+ * @param {number} index
11310
+ * Index of `node` in its parent.
11251
11311
  * @returns {VisitorResult}
11252
11312
  * Where to continue visiting.
11253
11313
  */
11254
- function handler(node, parents) {
11314
+ function handler(node, parents, index) {
11255
11315
  const parent = parents[parents.length - 1];
11256
11316
  const find = pairs[pairIndex][0];
11257
11317
  const replace = pairs[pairIndex][1];
11258
11318
  let start = 0;
11259
- const index = parent.children.indexOf(node);
11260
11319
  let change = false;
11261
11320
  /** @type {Array<PhrasingContent>} */
11262
11321
  let nodes = [];
@@ -11324,7 +11383,6 @@ ${trimmed}
11324
11383
  if (!Array.isArray(tupleOrList)) throw new TypeError("Expected find and replace tuple or list of tuples");
11325
11384
  /** @type {Pairs} */
11326
11385
  const result = [];
11327
- /** @type {FindAndReplaceList} */
11328
11386
  const list = !tupleOrList[0] || Array.isArray(tupleOrList[0]) ? tupleOrList : [tupleOrList];
11329
11387
  let index = -1;
11330
11388
  while (++index < list.length) {
@@ -11357,8 +11415,7 @@ ${trimmed}
11357
11415
  return replace;
11358
11416
  };
11359
11417
  }
11360
- //#endregion
11361
- //#region node_modules/mdast-util-gfm-autolink-literal/lib/index.js
11418
+ // node_modules/mdast-util-gfm-autolink-literal/lib/index.js
11362
11419
  /**
11363
11420
  * @import {RegExpMatchObject, ReplaceFunction} from 'mdast-util-find-and-replace'
11364
11421
  * @import {CompileContext, Extension as FromMarkdownExtension, Handle as FromMarkdownHandle, Transform as FromMarkdownTransform} from 'mdast-util-from-markdown'
@@ -11537,8 +11594,7 @@ ${trimmed}
11537
11594
  const code = match.input.charCodeAt(match.index - 1);
11538
11595
  return (match.index === 0 || unicodeWhitespace(code) || unicodePunctuation(code)) && (!email || code !== 47);
11539
11596
  }
11540
- //#endregion
11541
- //#region node_modules/mdast-util-gfm-footnote/lib/index.js
11597
+ // node_modules/mdast-util-gfm-footnote/lib/index.js
11542
11598
  /**
11543
11599
  * @import {
11544
11600
  * CompileContext,
@@ -11672,8 +11728,7 @@ ${trimmed}
11672
11728
  }
11673
11729
  };
11674
11730
  }
11675
- //#endregion
11676
- //#region node_modules/mdast-util-gfm-strikethrough/lib/index.js
11731
+ // node_modules/mdast-util-gfm-strikethrough/lib/index.js
11677
11732
  handleDelete.attention = attentionDelete;
11678
11733
  handleDelete.peek = peekDelete;
11679
11734
  /**
@@ -11753,8 +11808,7 @@ ${trimmed}
11753
11808
  function peekDelete() {
11754
11809
  return "~";
11755
11810
  }
11756
- //#endregion
11757
- //#region node_modules/mdast-util-gfm-table/lib/index.js
11811
+ // node_modules/mdast-util-gfm-table/lib/index.js
11758
11812
  /**
11759
11813
  * @typedef {import('mdast').InlineCode} InlineCode
11760
11814
  * @typedef {import('mdast').Table} Table
@@ -11878,8 +11932,7 @@ ${trimmed}
11878
11932
  function replace($0, $1) {
11879
11933
  return $1 === "|" ? $1 : $0;
11880
11934
  }
11881
- //#endregion
11882
- //#region node_modules/mdast-util-gfm-task-list-item/lib/index.js
11935
+ // node_modules/mdast-util-gfm-task-list-item/lib/index.js
11883
11936
  /**
11884
11937
  * @typedef {import('mdast').ListItem} ListItem
11885
11938
  * @typedef {import('mdast').Paragraph} Paragraph
@@ -11947,8 +12000,7 @@ ${trimmed}
11947
12000
  }
11948
12001
  this.exit(token);
11949
12002
  }
11950
- //#endregion
11951
- //#region node_modules/mdast-util-gfm/lib/index.js
12003
+ // node_modules/mdast-util-gfm/lib/index.js
11952
12004
  /**
11953
12005
  * @import {Extension as FromMarkdownExtension} from 'mdast-util-from-markdown'
11954
12006
  * @import {Options} from 'mdast-util-gfm'
@@ -11971,8 +12023,7 @@ ${trimmed}
11971
12023
  gfmTaskListItemFromMarkdown()
11972
12024
  ];
11973
12025
  }
11974
- //#endregion
11975
- //#region node_modules/mdast-util-math/lib/index.js
12026
+ // node_modules/mdast-util-math/lib/index.js
11976
12027
  /**
11977
12028
  * @typedef {import('hast').Element} HastElement
11978
12029
  * @typedef {import('hast').ElementContent} HastElementContent
@@ -12120,8 +12171,7 @@ ${trimmed}
12120
12171
  this.config.exit.data.call(this, token);
12121
12172
  }
12122
12173
  }
12123
- //#endregion
12124
- //#region node_modules/micromark-extension-gfm-autolink-literal/lib/syntax.js
12174
+ // node_modules/micromark-extension-gfm-autolink-literal/lib/syntax.js
12125
12175
  /**
12126
12176
  * @import {Code, ConstructRecord, Event, Extension, Previous, State, TokenizeContext, Tokenizer} from 'micromark-util-types'
12127
12177
  */
@@ -12821,8 +12871,7 @@ ${trimmed}
12821
12871
  if (events.length > 0 && !result) events[events.length - 1][1]._gfmAutolinkLiteralWalkedInto = true;
12822
12872
  return result;
12823
12873
  }
12824
- //#endregion
12825
- //#region node_modules/micromark-extension-gfm-footnote/lib/syntax.js
12874
+ // node_modules/micromark-extension-gfm-footnote/lib/syntax.js
12826
12875
  /**
12827
12876
  * @import {Event, Exiter, Extension, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'
12828
12877
  */
@@ -13240,8 +13289,7 @@ ${trimmed}
13240
13289
  return tail && tail[1].type === "gfmFootnoteDefinitionIndent" && tail[2].sliceSerialize(tail[1], true).length === 4 ? ok(code) : nok(code);
13241
13290
  }
13242
13291
  }
13243
- //#endregion
13244
- //#region node_modules/micromark-extension-gfm-strikethrough/lib/syntax.js
13292
+ // node_modules/micromark-extension-gfm-strikethrough/lib/syntax.js
13245
13293
  /**
13246
13294
  * @import {Options} from 'micromark-extension-gfm-strikethrough'
13247
13295
  * @import {Event, Extension, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'
@@ -13381,8 +13429,7 @@ ${trimmed}
13381
13429
  }
13382
13430
  }
13383
13431
  }
13384
- //#endregion
13385
- //#region node_modules/micromark-extension-gfm-table/lib/edit-map.js
13432
+ // node_modules/micromark-extension-gfm-table/lib/edit-map.js
13386
13433
  /**
13387
13434
  * @import {Event} from 'micromark-util-types'
13388
13435
  */
@@ -13492,8 +13539,7 @@ ${trimmed}
13492
13539
  editMap.map.push(change);
13493
13540
  editMap.index.set(at, change);
13494
13541
  }
13495
- //#endregion
13496
- //#region node_modules/micromark-extension-gfm-table/lib/infer.js
13542
+ // node_modules/micromark-extension-gfm-table/lib/infer.js
13497
13543
  /**
13498
13544
  * @import {Event} from 'micromark-util-types'
13499
13545
  */
@@ -13530,8 +13576,7 @@ ${trimmed}
13530
13576
  }
13531
13577
  return align;
13532
13578
  }
13533
- //#endregion
13534
- //#region node_modules/micromark-extension-gfm-table/lib/syntax.js
13579
+ // node_modules/micromark-extension-gfm-table/lib/syntax.js
13535
13580
  /**
13536
13581
  * @import {Event, Extension, Point, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'
13537
13582
  */
@@ -14247,8 +14292,7 @@ ${trimmed}
14247
14292
  const side = event[0] === "enter" ? "start" : "end";
14248
14293
  return event[1][side];
14249
14294
  }
14250
- //#endregion
14251
- //#region node_modules/micromark-extension-gfm-task-list-item/lib/syntax.js
14295
+ // node_modules/micromark-extension-gfm-task-list-item/lib/syntax.js
14252
14296
  /**
14253
14297
  * @import {Extension, State, TokenizeContext, Tokenizer} from 'micromark-util-types'
14254
14298
  */
@@ -14366,8 +14410,7 @@ ${trimmed}
14366
14410
  return code === null ? nok(code) : ok(code);
14367
14411
  }
14368
14412
  }
14369
- //#endregion
14370
- //#region node_modules/micromark-extension-gfm/index.js
14413
+ // node_modules/micromark-extension-gfm/index.js
14371
14414
  /**
14372
14415
  * @typedef {import('micromark-extension-gfm-footnote').HtmlOptions} HtmlOptions
14373
14416
  * @typedef {import('micromark-extension-gfm-strikethrough').Options} Options
@@ -14394,8 +14437,7 @@ ${trimmed}
14394
14437
  gfmTaskListItem()
14395
14438
  ]);
14396
14439
  }
14397
- //#endregion
14398
- //#region node_modules/micromark-extension-math/lib/math-flow.js
14440
+ // node_modules/micromark-extension-math/lib/math-flow.js
14399
14441
  /**
14400
14442
  * @import {Construct, State, TokenizeContext, Tokenizer} from 'micromark-util-types'
14401
14443
  */
@@ -14699,8 +14741,7 @@ ${trimmed}
14699
14741
  return self.parser.lazy[self.now().line] ? nok(code) : ok(code);
14700
14742
  }
14701
14743
  }
14702
- //#endregion
14703
- //#region node_modules/micromark-extension-math/lib/math-text.js
14744
+ // node_modules/micromark-extension-math/lib/math-text.js
14704
14745
  /**
14705
14746
  * @import {Options} from 'micromark-extension-math'
14706
14747
  * @import {Construct, Previous, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'
@@ -14885,8 +14926,7 @@ ${trimmed}
14885
14926
  function previous(code) {
14886
14927
  return code !== 36 || this.events[this.events.length - 1][1].type === "characterEscape";
14887
14928
  }
14888
- //#endregion
14889
- //#region node_modules/micromark-extension-math/lib/syntax.js
14929
+ // node_modules/micromark-extension-math/lib/syntax.js
14890
14930
  /**
14891
14931
  * @import {Options} from 'micromark-extension-math'
14892
14932
  * @import {Extension} from 'micromark-util-types'
@@ -14906,8 +14946,7 @@ ${trimmed}
14906
14946
  text: { [36]: mathText(options) }
14907
14947
  };
14908
14948
  }
14909
- //#endregion
14910
- //#region node_modules/katex/dist/katex.mjs
14949
+ // node_modules/katex/dist/katex.mjs
14911
14950
  /**
14912
14951
  * This is the ParseError class, which is the main error thrown by KaTeX
14913
14952
  * functions when something has gone wrong. This is used to distinguish internal
@@ -41349,8 +41388,7 @@ ${trimmed}
41349
41388
  LineNode
41350
41389
  }
41351
41390
  };
41352
- //#endregion
41353
- //#region node_modules/micromark-util-symbol/lib/codes.js
41391
+ // node_modules/micromark-util-symbol/lib/codes.js
41354
41392
  /**
41355
41393
  * Character codes.
41356
41394
  *
@@ -41507,8 +41545,7 @@ ${trimmed}
41507
41545
  byteOrderMarker: 65279,
41508
41546
  replacementCharacter: 65533
41509
41547
  };
41510
- //#endregion
41511
- //#region node_modules/micromark-util-symbol/lib/constants.js
41548
+ // node_modules/micromark-util-symbol/lib/constants.js
41512
41549
  /**
41513
41550
  * This module is compiled away!
41514
41551
  *
@@ -41553,8 +41590,7 @@ ${trimmed}
41553
41590
  thematicBreakMarkerCountMin: 3,
41554
41591
  v8MaxSafeChunkSize: 1e4
41555
41592
  };
41556
- //#endregion
41557
- //#region node_modules/micromark-util-symbol/lib/types.js
41593
+ // node_modules/micromark-util-symbol/lib/types.js
41558
41594
  /**
41559
41595
  * This module is compiled away!
41560
41596
  *
@@ -41670,8 +41706,7 @@ ${trimmed}
41670
41706
  chunkText: "chunkText",
41671
41707
  chunkString: "chunkString"
41672
41708
  };
41673
- //#endregion
41674
- //#region src/client/markdown/cjkFriendlyStrong.ts
41709
+ // src/client/markdown/cjkFriendlyStrong.ts
41675
41710
  /** Let asterisk strong emphasis close after punctuation when CJK prose continues without whitespace. */
41676
41711
  const cjkCharacter = new RegExp([
41677
41712
  "\\p{Script_Extensions=Han}",
@@ -41728,8 +41763,7 @@ ${trimmed}
41728
41763
  function cjkFriendlyStrong() {
41729
41764
  return cjkFriendlyStrongExtension;
41730
41765
  }
41731
- //#endregion
41732
- //#region src/client/markdown/mathCompatibility.ts
41766
+ // src/client/markdown/mathCompatibility.ts
41733
41767
  /** Extend upstream dollar-only math syntax with TeX delimiters while reusing its token vocabulary. */
41734
41768
  const previousBackslash = function(code) {
41735
41769
  if (code !== codes.backslash) return true;
@@ -41999,8 +42033,7 @@ ${trimmed}
41999
42033
  function mathCompatibility() {
42000
42034
  return backslashMath;
42001
42035
  }
42002
- //#endregion
42003
- //#region src/client/markdown/parse.ts
42036
+ // src/client/markdown/parse.ts
42004
42037
  /**
42005
42038
  * Parse GFM markdown (the streaming arm's grammar: no math, so incomplete
42006
42039
  * TeX never flashes KaTeX errors mid-stream).
@@ -42030,8 +42063,7 @@ ${trimmed}
42030
42063
  mdastExtensions: [gfmFromMarkdown(), mathFromMarkdown()]
42031
42064
  });
42032
42065
  }
42033
- //#endregion
42034
- //#region node_modules/clsx/dist/clsx.mjs
42066
+ // node_modules/clsx/dist/clsx.mjs
42035
42067
  function r(e) {
42036
42068
  var t, f, n = "";
42037
42069
  if ("string" == typeof e || "number" == typeof e) n += e;
@@ -42045,8 +42077,7 @@ ${trimmed}
42045
42077
  for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
42046
42078
  return n;
42047
42079
  }
42048
- //#endregion
42049
- //#region src/client/markdown/katex.tsx
42080
+ // src/client/markdown/katex.tsx
42050
42081
  /**
42051
42082
  * TeX-to-React via KaTeX, replicating the rehype-katex pipeline this renderer
42052
42083
  * replaced: the same three-arm error chain (strict render, `strict: 'ignore'`
@@ -42126,8 +42157,7 @@ ${trimmed}
42126
42157
  }
42127
42158
  return [...new DOMParser().parseFromString(html, "text/html").body.childNodes].map(domToReact);
42128
42159
  }
42129
- //#endregion
42130
- //#region \0dshx-css-module:MarkdownText.module.css.mjs
42160
+ // \0dshx-css-module:/home/runner/work/dsh-better-display/dsh-better-display/src/client/markdown/MarkdownText.module.css.mjs
42131
42161
  const css$6 = ".zfLqdW_markdown{overflow-wrap:anywhere;min-width:0;font:var(--dsw-font-markdown-base);color:var(--dsw-alias-label-primary)}.zfLqdW_markdown strong{font-weight:600}.zfLqdW_markdown h1{font:var(--dsw-font-markdown-h1);margin:32px 0 16px}.zfLqdW_markdown h2{font:var(--dsw-font-markdown-h2);margin:32px 0 16px}.zfLqdW_markdown h3{font:var(--dsw-font-markdown-h3);margin:32px 0 16px}.zfLqdW_markdown h4{font:var(--dsw-font-markdown-h4);margin:16px 0}.zfLqdW_markdown :where(h5,h6){font:var(--dsw-font-markdown-base-strong);margin:16px 0}.zfLqdW_markdown :where(h1,h2,h3,h4,h5,h6) strong{font-weight:inherit}.zfLqdW_markdown p{margin:16px 0}.zfLqdW_markdown :where(h4,h5,h6)+:where(ul,ol){margin-top:8px}.zfLqdW_markdown :where(h4,h5,h6):has(+:where(ul,ol)){margin-bottom:8px}.zfLqdW_markdown a{color:var(--dsw-alias-state-business-primary);transition:box-shadow var(--ds-transition-duration) var(--ds-ease-in-out);border:2px solid #fff0;border-width:2px 3px;margin-left:-3px;margin-right:-3px;text-decoration:none;position:relative}.zfLqdW_markdown a:hover,.zfLqdW_markdown a:focus{-webkit-text-decoration:underline var(--dsw-alias-state-business-primary);text-decoration:underline var(--dsw-alias-state-business-primary);outline:none}.zfLqdW_markdown a:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-state-business-primary)}.zfLqdW_markdown :where(ul,ol){margin:16px 0;padding-left:18px}.zfLqdW_markdown li:not(:first-child){margin-top:6px}.zfLqdW_markdown li>:where(ul,ol){margin-top:4px}.zfLqdW_markdown li::marker{color:var(--dsw-alias-label-secondary);line-height:28px}.zfLqdW_markdown :where(ul,ol) ol{padding-left:0;list-style-position:inside}.zfLqdW_markdown :where(ul,ol) ol li p{display:inline}.zfLqdW_markdown li>p{margin:8px 0}.zfLqdW_markdown li>:first-child{margin-top:0}.zfLqdW_markdown li>:last-child:not(.md-code-block){margin-bottom:0}.zfLqdW_markdown hr{background:var(--dsw-alias-border-l2);border:none;height:1px;margin:32px 0;display:block}.zfLqdW_markdown blockquote{border-left:2px solid var(--dsw-alias-label-caption);margin:16px 0 0;padding-left:14px}.zfLqdW_markdown pre{font-family:var(--ds-font-family-code);margin:16px 0;overflow:auto}.zfLqdW_markdown :not(pre)>code{box-sizing:border-box;font:var(--dsw-font-markdown-code);font-family:var(--ds-font-family-code);background-color:var(--dsw-alias-markdown-inline-code);border-radius:6px;align-items:center;padding:0 5px;display:inline-flex;font-size:.875em!important}.zfLqdW_markdown :where(h1,h2,h3,h4,h5,h6) code{font:inherit;font-family:var(--ds-font-family-code)}.zfLqdW_markdown .katex-display{max-width:100%;overflow:auto hidden}.zfLqdW_markdown input[type=checkbox]{accent-color:var(--dsw-alias-label-secondary);margin:0 8px 0 0}.zfLqdW_tableScroll{overscroll-behavior-x:contain;max-width:100%;overflow-x:auto}.zfLqdW_tableScroll.md-table-wide{padding-bottom:var(--dsh-scrollbar-width,8px);overflow-x:hidden}:is(.zfLqdW_tableScroll.md-table-wide:hover,.zfLqdW_tableScroll.md-table-wide:focus-visible){padding-bottom:0;overflow-x:auto}.zfLqdW_tableScroll:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-state-business-primary);outline:none}.zfLqdW_tableScroll table{border-collapse:collapse;width:max-content;max-width:max-content}.zfLqdW_tableFill table{width:100%;max-width:none}.zfLqdW_tableScroll th{text-align:start;border-bottom:1px solid var(--dsw-alias-border-l3);font:var(--dsw-font-markdown-table-head);border-top:none;min-width:100px;max-width:min(30vw,320px);padding:10px 16px}.zfLqdW_tableScroll td{border-bottom:1px solid var(--dsw-alias-border-l2);font:var(--dsw-font-markdown-table);min-width:100px;max-width:min(30vw,320px);padding:10px 16px}.zfLqdW_tableScroll th:first-child,.zfLqdW_tableScroll td:first-child{padding-left:0}.zfLqdW_tableScroll td:last-child{padding-right:0}.zfLqdW_tableScroll table code{font-size:13px}.zfLqdW_markdown>:first-child,.zfLqdW_markdown p:first-child{margin-top:0!important}.zfLqdW_markdown>:last-child,.zfLqdW_markdown p:last-child{margin-bottom:0!important}.zfLqdW_imageAlt{color:var(--dsw-alias-label-tertiary);font-style:italic}.zfLqdW_image{background:var(--dsw-alias-bg-base);object-fit:contain;border-radius:8px;width:auto;max-width:100%;height:auto;margin:0;display:block}.zfLqdW_fileMention{font:inherit;color:var(--dsw-alias-state-business-primary);cursor:pointer;background:0 0;border:none;margin:0;padding:0;text-decoration:none}.zfLqdW_fileMention:hover,.zfLqdW_fileMention:focus{-webkit-text-decoration:underline var(--dsw-alias-state-business-primary);text-decoration:underline var(--dsw-alias-state-business-primary);text-underline-offset:3px;outline:none}";
42132
42162
  const tagId$6 = "dsh-better-display/MarkdownText.module.css";
42133
42163
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$6) + "]") === null) {
@@ -42145,8 +42175,7 @@ ${trimmed}
42145
42175
  "tableFill": "zfLqdW_tableFill",
42146
42176
  "tableScroll": "zfLqdW_tableScroll"
42147
42177
  };
42148
- //#endregion
42149
- //#region src/client/markdown/render.tsx
42178
+ // src/client/markdown/render.tsx
42150
42179
  /**
42151
42180
  * Direct mdast→React markdown renderer. Replaces the react-markdown /
42152
42181
  * remark-rehype pipeline with one switch over parsed nodes so streaming can
@@ -42545,8 +42574,7 @@ ${trimmed}
42545
42574
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ol", { children: items })]
42546
42575
  }, "footnotes");
42547
42576
  }
42548
- //#endregion
42549
- //#region src/client/markdown/MarkdownText.tsx
42577
+ // src/client/markdown/MarkdownText.tsx
42550
42578
  /**
42551
42579
  * Untrusted assistant-Markdown renderer over the direct mdast pipeline:
42552
42580
  * `parse.ts` grammars, the incremental streaming parser, and `render.tsx`.
@@ -42725,8 +42753,7 @@ ${trimmed}
42725
42753
  children
42726
42754
  });
42727
42755
  });
42728
- //#endregion
42729
- //#region src/client/platform-media.ts
42756
+ // src/client/platform-media.ts
42730
42757
  /** Web or Desktop file route. Authorization stays Host-side. */
42731
42758
  function localPathMediaUrl(protocol, origin, value) {
42732
42759
  if (!value.startsWith("/") || value.startsWith("//")) return void 0;
@@ -42734,8 +42761,7 @@ ${trimmed}
42734
42761
  if (protocol === "dsh-app:" && origin === "dsh-app://app") return `dsh-app://app/api/file?path=${encodeURIComponent(value)}`;
42735
42762
  }
42736
42763
  const readerPathImages = { resolve: (value) => typeof window === "undefined" ? void 0 : localPathMediaUrl(window.location.protocol, window.location.origin, value) };
42737
- //#endregion
42738
- //#region \0dshx-css-module:Reader.module.css.mjs
42764
+ // \0dshx-css-module:/home/runner/work/dsh-better-display/dsh-better-display/src/client/Reader.module.css.mjs
42739
42765
  const css$5 = ".gNoOdq_root{color:var(--dsw-alias-label-primary);padding:16px calc(var(--dsh-composer-side-clearance,16px) + 16px) 24px;overflow-anchor:auto;--reader-lane-block:max(40px, calc(40px + var(--dsh-content-font-delta,0px)));--reader-lane-plate:linear-gradient(var(--dsw-alias-bg-base), var(--dsw-alias-bg-base)), linear-gradient(var(--dsw-alias-bg-layer-1,transparent), var(--dsw-alias-bg-layer-1,transparent));flex:none;min-width:0;font-family:inherit;font-size:16px;line-height:28px;container-type:inline-size}.gNoOdq_column{max-width:var(--dsh-chat-content-width,748px);flex-direction:column;gap:22px;width:100%;min-width:0;margin:0 auto;display:flex}.gNoOdq_column:focus,.gNoOdq_column:focus-visible{outline:none}.gNoOdq_toolbar{min-height:32px;color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-base);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);justify-content:flex-end;align-items:center;gap:6px;padding:0;font-size:12px;display:flex;position:sticky;top:0}.gNoOdq_turnProcessSticky{background:var(--dsw-alias-bg-base);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);align-items:center;min-height:32px;display:flex;position:sticky}.gNoOdq_turnProcessSticky .gNoOdq_disclosureButton{min-height:32px}.gNoOdq_textButton,.gNoOdq_historyButton,.gNoOdq_iconButton,.gNoOdq_jump,.gNoOdq_disclosureButton,.gNoOdq_imageOpen,.gNoOdq_dialogClose{font:inherit;cursor:pointer}.gNoOdq_textButton{color:var(--dsw-alias-label-secondary);white-space:nowrap;background:0 0;border:0;border-radius:6px;padding:2px 6px}.gNoOdq_textButton:hover,.gNoOdq_iconButton:hover,.gNoOdq_disclosureButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.gNoOdq_root button:focus-visible,.gNoOdq_root summary:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:3px}.gNoOdq_turn,.gNoOdq_turnStickyRegion{flex-direction:column;gap:14px;min-width:0;display:flex}.gNoOdq_turnStickyLanes{top:var(--reader-toolbar-height,var(--reader-lane-block,40px));z-index:6;flex-direction:column;min-width:0;display:flex;position:sticky}.gNoOdq_turn+.gNoOdq_turn,.gNoOdq_retiringContent+.gNoOdq_retiringContent>.gNoOdq_turn{margin-top:12px}.gNoOdq_userCluster{flex-direction:column;align-self:stretch;align-items:flex-end;gap:8px;width:100%;min-width:0;max-width:100%;margin-bottom:4px;display:flex}.gNoOdq_userCluster>[data-slot]>*{box-sizing:border-box;align-self:stretch;width:100%;min-width:0;max-width:100%}.gNoOdq_userImages{flex-direction:column;align-self:flex-end;align-items:flex-end;width:fit-content;min-width:0;max-width:100%;display:flex}.gNoOdq_userImages .gNoOdq_imageFigure{align-self:flex-end}.gNoOdq_user{width:fit-content;max-width:min(calc(var(--dsh-chat-content-width,748px) * .702), 82%);border-radius:var(--dsw-radius-xl,22px);background:var(--dsw-specific-bubble);color:var(--dsw-alias-label-primary);font-size:var(--dsh-content-font-size,14px);line-height:calc(22px + var(--dsh-content-font-delta,0px));white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;box-sizing:border-box;align-self:flex-end;margin-left:auto;padding:10px 16px;font-weight:400}.gNoOdq_user .gNoOdq_blocks{gap:10px}.gNoOdq_answer{overflow-wrap:anywhere;flex-direction:column;min-width:0;display:flex}.gNoOdq_readingText{min-width:0}.gNoOdq_reasonPlain{white-space:pre-wrap;overflow-wrap:anywhere;font:inherit;color:inherit}.gNoOdq_readingText button{min-width:24px;min-height:24px}.gNoOdq_streamWord{display:inline-block}.gNoOdq_streamInlineWord{display:inline}.gNoOdq_streamWord,.gNoOdq_streamInlineWord,.gNoOdq_streamAtom{opacity:1;filter:none}.gNoOdq_streamAtom{min-width:0}@media (prefers-reduced-motion:reduce){.gNoOdq_streamWord,.gNoOdq_streamInlineWord,.gNoOdq_streamAtom{opacity:1!important;filter:none!important}}.gNoOdq_retiringContent{min-width:0}.gNoOdq_retiringContent[data-reader-retiring=retiring]{overflow:hidden}.gNoOdq_mainFlow,.gNoOdq_blocks{flex-direction:column;gap:16px;min-width:0;display:flex}.gNoOdq_mainFlow:empty,.gNoOdq_blocks:empty{display:none}.gNoOdq_blocks>:first-child{margin-top:0}.gNoOdq_blocks>:last-child{margin-bottom:0}.gNoOdq_blocks .md-table-wide{max-width:100%}.gNoOdq_disclosure{min-width:0}.gNoOdq_disclosureButton{max-width:100%;min-height:32px;color:var(--dsw-alias-label-tertiary);font-size:calc(14px + var(--dsh-content-font-delta,0px));line-height:calc(24px + var(--dsh-content-font-delta,0px));text-align:left;background:0 0;border:0;border-radius:7px;align-items:center;gap:6px;margin-left:-6px;padding:4px 6px;font-weight:400;display:inline-flex}.gNoOdq_disclosure[data-reader-status-only]{align-items:center;min-height:32px;display:flex}.gNoOdq_statusText{min-width:0;max-width:100%;font-size:calc(14px + var(--dsh-content-font-delta,0px));line-height:calc(24px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-secondary);font-weight:400;display:inline-flex}.gNoOdq_srOnly{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.gNoOdq_think{--think-swap:.15s;--think-gap:50ms;--think-distance:8px;--think-blur:2px;--think-shimmer:2s;--think-base:var(--dsw-alias-label-secondary);--think-highlight:var(--dsw-alias-label-primary);--think-ease:ease-in-out;text-align:left;max-width:100%;display:inline-block;position:relative}.gNoOdq_thinkSizer{visibility:hidden;white-space:nowrap;display:block}.gNoOdq_thinkText{color:var(--think-base);white-space:nowrap;text-overflow:ellipsis;filter:blur();opacity:1;transition:transform var(--think-swap) var(--think-ease), filter var(--think-swap) var(--think-ease), opacity var(--think-swap) var(--think-ease);display:block;position:absolute;top:0;left:0;right:0;overflow:hidden;transform:translateY(0)}.gNoOdq_think[data-reader-status-phase=running] .gNoOdq_thinkText[data-reader-status-copy=current]{transition-delay:var(--think-gap)}.gNoOdq_think:not([data-reader-status-phase=idle]) .gNoOdq_thinkText{will-change:transform, filter, opacity}@supports (background-clip:text){.gNoOdq_think[data-active=true] .gNoOdq_thinkText:before{content:attr(data-text);pointer-events:none;background-image:linear-gradient(90deg, transparent 0%, transparent 40%, var(--think-highlight) 50%, transparent 60%, transparent 100%);color:#0000;-webkit-text-fill-color:transparent;animation:gNoOdq_thinkShimmer var(--think-shimmer) linear infinite;background-repeat:no-repeat;background-size:400% 100%;background-clip:text;position:absolute;inset:0}}@keyframes gNoOdq_thinkShimmer{0%{background-position:100% 0}to{background-position:0 0}}.gNoOdq_thinkText.gNoOdq_isExit{transform:translateY(calc(var(--think-distance) * -1));filter:blur(var(--think-blur));opacity:0}.gNoOdq_thinkText.gNoOdq_isEnterStart{transform:translateY(var(--think-distance));filter:blur(var(--think-blur));opacity:0;transition:none}[data-motion=off] .gNoOdq_thinkText{filter:none!important;opacity:1!important;transition:none!important;transform:none!important}[data-motion=off] .gNoOdq_thinkText[data-reader-status-copy=outgoing],[data-motion=off] .gNoOdq_thinkText:before{display:none!important}@media (prefers-reduced-motion:reduce),(forced-colors:active){.gNoOdq_thinkText{filter:none!important;opacity:1!important;transition:none!important;transform:none!important}.gNoOdq_thinkText[data-reader-status-copy=outgoing],.gNoOdq_thinkText:before{display:none!important}}.gNoOdq_processMeta{opacity:0;grid-template-rows:0fr;transition:grid-template-rows .26s cubic-bezier(.22,1,.36,1),opacity .16s ease-out;display:grid}.gNoOdq_processMeta[data-open=true]{opacity:1;grid-template-rows:1fr}.gNoOdq_processMetaInner{min-height:0;overflow:hidden}.gNoOdq_processMetaLine{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex-wrap:wrap;align-items:baseline;gap:8px;padding:8px 0 0 16px;font-size:12px;line-height:20px;display:flex}.gNoOdq_processMetaLine .gNoOdq_meta{color:inherit}.gNoOdq_chevron{stroke:currentColor;fill:none;stroke-width:1.4px;stroke-linecap:round;stroke-linejoin:round;flex:none;transition:transform .26s cubic-bezier(.22,1,.36,1)}.gNoOdq_chevron[data-open=true]{transform:rotate(90deg)}.gNoOdq_disclosureBody{transform-origin:top;will-change:height, opacity, transform;height:0;overflow:hidden}.gNoOdq_processContents{border-left:1px solid var(--dsw-alias-border-l2);padding:3px 0 2px var(--reader-gutter,16px);margin:0 0 0 var(--reader-rail,6px);color:var(--dsw-alias-label-secondary);font-size:14px;line-height:24px;display:flow-root}.gNoOdq_processContents>:last-child{margin-bottom:0}.gNoOdq_processSeamRow{min-height:40px;margin-left:var(--reader-rail,6px);padding-left:var(--reader-gutter,16px);border-left:1px solid var(--dsw-alias-border-l2);box-sizing:border-box;align-items:center;display:flex}.gNoOdq_processSeamRow>.gNoOdq_disclosure{align-items:center;min-height:24px;display:flex}.gNoOdq_processSeamRow .gNoOdq_disclosureButton{min-height:24px;color:var(--dsw-alias-label-tertiary);padding-block:2px;font-size:12px;line-height:20px}.gNoOdq_flowCell:has(>.gNoOdq_flowCellInner>[data-reader-seam-after])>.gNoOdq_flowCellInner{padding-bottom:0}.gNoOdq_processFrame{min-width:0}.gNoOdq_toolActivity{min-width:0;color:var(--dsw-alias-label-secondary)}.gNoOdq_nativeToolRow{min-width:0}.gNoOdq_rowSeparator{background:var(--dsw-alias-label-caption);border-radius:1px;flex:none;width:2px;height:2px;margin:0 8px}.gNoOdq_nativeToolSummary{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-tertiary);flex:1;font-size:14px;line-height:24px;overflow:hidden}.gNoOdq_nativeToolRow:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:3px;border-radius:4px}.gNoOdq_toolHeading{width:100%;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:11px;grid-template-columns:20px minmax(0,1fr) auto;align-items:start;gap:10px;padding:10px 14px 4px;display:grid}.gNoOdq_toolHeading:hover{background:var(--dsw-alias-interactive-bg-hover)}.gNoOdq_toolHeading:focus-visible{outline-offset:-3px!important}.gNoOdq_toolGlyph{height:22px;color:var(--dsw-alias-label-secondary);justify-content:center;align-items:center;display:flex}.gNoOdq_toolHeadingCopy{flex-direction:column;gap:3px;min-width:0;display:flex}.gNoOdq_toolTitle{overflow-wrap:anywhere;font-size:13px;font-weight:500;line-height:22px}.gNoOdq_toolTarget{-webkit-line-clamp:2;overflow-wrap:anywhere;color:var(--dsw-alias-label-secondary);-webkit-box-orient:vertical;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:19px;display:-webkit-box;overflow:hidden}.gNoOdq_toolHeadingState{min-height:22px;color:var(--dsw-alias-label-secondary);align-items:center;gap:7px;display:flex}.gNoOdq_diffStat{font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\";white-space:nowrap;flex:none;gap:6px;margin-left:8px;font-size:11px;line-height:18px;display:inline-flex}.gNoOdq_diffAdded{color:var(--dsw-alias-state-success-primary,#2f9e63)}.gNoOdq_diffRemoved{color:var(--dsw-alias-state-error-primary,#d1483c)}.gNoOdq_summaryRow{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;max-width:100%;display:flex}.gNoOdq_summaryRow>.gNoOdq_diffStatRoot{flex:none;margin-left:auto}.gNoOdq_summaryRow>:first-child{min-width:0}.gNoOdq_diffStatRoot{flex:none;position:relative}.gNoOdq_diffStatButton{cursor:pointer;font:inherit;font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\";color:var(--dsw-alias-label-secondary);background:0 0;border:1px solid #0000;border-radius:6px;align-items:center;gap:6px;padding:2px 8px;font-size:11px;line-height:16px;transition:background .12s,border-color .12s;display:inline-flex}.gNoOdq_diffStatButton:hover,.gNoOdq_diffStatButton:focus-visible,.gNoOdq_diffStatButton[aria-expanded=true]{background:var(--dsw-alias-bg-module-platform,#7f7f7f1a);border-color:var(--dsw-alias-border-l2,#7f7f7f47)}.gNoOdq_diffStatButton:focus-visible{outline:none}.gNoOdq_diffStatButton[aria-expanded=true] .gNoOdq_diffCaret{opacity:1}.gNoOdq_diffOverlayRow{box-sizing:border-box;flex:100%;width:100%;min-width:0;max-width:100%;margin-top:6px}.gNoOdq_diffOverlay{box-sizing:border-box;background:var(--dsw-alias-bg-module-platform,#7f7f7f14);border:1px solid var(--dsw-alias-border-l2,#80808038);border-radius:10px;flex-direction:column;width:100%;min-width:0;max-width:100%;padding:8px;display:flex;overflow:hidden}.gNoOdq_diffTabs{scrollbar-width:thin;flex-wrap:nowrap;gap:6px;max-width:100%;margin-bottom:4px;padding-bottom:6px;display:flex;overflow-x:auto}.gNoOdq_diffTab{text-overflow:ellipsis;white-space:nowrap;cursor:pointer;max-width:220px;font:inherit;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-base,#fffc);border:1px solid var(--dsw-alias-border-l2,#80808033);border-radius:6px;flex:none;padding:3px 10px;font-size:11px;line-height:16px;transition:all .12s;overflow:hidden}.gNoOdq_diffTab:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.gNoOdq_diffTab[data-active]{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-state-business-primary,#1e90ff);background:var(--dsw-alias-bg-base);font-weight:500}.gNoOdq_diffScrollArea{overscroll-behavior:contain;-webkit-overflow-scrolling:touch;border:1px solid var(--dsw-alias-border-l2,#80808026);background:var(--dsw-alias-markdown-code-block,#0000000a);border-radius:8px;max-height:420px;overflow:auto}.gNoOdq_diffScrollArea [data-diff]{background:0 0!important;border-radius:0!important;margin:0!important}.gNoOdq_diffCaret{opacity:.6;flex:none;width:10px;font-size:10px}.gNoOdq_diffPath{text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;flex:auto;min-width:0;overflow:hidden}.gNoOdq_diffStat{font-variant-numeric:tabular-nums;flex:none;gap:6px;font-size:11px;display:inline-flex}.gNoOdq_diffHunkBody{flex-direction:column;gap:4px;padding:2px 7px 7px 25px;display:flex}.gNoOdq_diffLines{font-size:11px;line-height:1.55;font-family:var(--dsw-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);white-space:pre;border-radius:6px;margin:0;padding:6px 8px;overflow-x:auto}.gNoOdq_diffLines[data-side=removed]{background:#d1483c1f}.gNoOdq_diffLines[data-side=added]{background:#2f9e631f}.gNoOdq_diffLineRemoved,.gNoOdq_diffLineAdded{display:block}.gNoOdq_diffLineRemoved{color:var(--dsw-alias-state-error-primary,#d1483c)}.gNoOdq_diffLineAdded{color:var(--dsw-alias-state-success-primary,#2f9e63)}.gNoOdq_diffEmpty{color:var(--dsw-alias-label-secondary);margin:0;padding:2px 0;font-size:11px}.gNoOdq_nativeToolSummary[data-running]{background-image:linear-gradient(90deg, currentColor 0%, currentColor 35%, color-mix(in srgb, currentColor 35%, transparent) 50%, currentColor 65%, currentColor 100%);-webkit-text-fill-color:transparent;background-position:100% 0;background-repeat:no-repeat;background-size:300% 100%;background-clip:text;animation:1.6s linear infinite gNoOdq_readerStepShimmer}@keyframes gNoOdq_readerStepShimmer{to{background-position:0 0}}.gNoOdq_toolElapsed[data-slow]{opacity:1;color:var(--dsw-alias-state-warning-primary,#d8862c);font-weight:500}.gNoOdq_toolElapsed{opacity:.72;font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\";white-space:nowrap;flex:none;margin-left:8px;font-size:11px;line-height:18px}[data-motion=off] .gNoOdq_nativeToolSummary[data-running]{-webkit-text-fill-color:currentColor;background-image:none;animation:none!important}@media (prefers-reduced-motion:reduce){.gNoOdq_nativeToolSummary[data-running]{-webkit-text-fill-color:currentColor;background-image:none;animation:none!important}}.gNoOdq_toolState{white-space:nowrap;flex:none;margin-left:8px;font-size:11px;line-height:18px}.gNoOdq_toolState[data-phase=preparing],.gNoOdq_toolState[data-phase=running]{color:var(--dsw-alias-state-business-primary)}.gNoOdq_toolState[data-phase=preparing]:before,.gNoOdq_toolState[data-phase=running]:before{content:\"\";vertical-align:middle;background:currentColor;border-radius:50%;width:6px;height:6px;margin-right:6px;animation:1.4s ease-in-out infinite gNoOdq_readerRunningGlow;display:inline-block}@keyframes gNoOdq_readerRunningGlow{0%{box-shadow:0 0 0 0 color-mix(in srgb, currentColor 60%, transparent);opacity:1}70%{opacity:.7;box-shadow:0 0 0 7px #0000}to{opacity:1;box-shadow:0 0 #0000}}[data-motion=off] .gNoOdq_toolState[data-phase=preparing]:before,[data-motion=off] .gNoOdq_toolState[data-phase=running]:before{animation:none!important}@media (prefers-reduced-motion:reduce){.gNoOdq_toolState[data-phase=preparing]:before,.gNoOdq_toolState[data-phase=running]:before{animation:none!important}}.gNoOdq_toolState[data-phase=failed]{color:var(--dsw-alias-state-error-primary)}.gNoOdq_toolState[data-phase=interrupted]{color:inherit;opacity:.7}.gNoOdq_toolLedger{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex-wrap:wrap;align-items:baseline;gap:4px 12px;padding:10px 14px 0;font-size:11px;line-height:18px;display:flex}.gNoOdq_toolEngine{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.gNoOdq_toolDetails{border:1px solid var(--dsw-alias-border-l2);border-radius:8px;min-width:0;margin:6px 0 0 22px;overflow:hidden}.gNoOdq_toolTabs{align-items:center;gap:15px;padding:0 14px;display:flex}.gNoOdq_toolTabs>button{font:inherit;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;padding:10px 1px 8px;font-size:12px;line-height:20px}.gNoOdq_toolTabs>button[aria-selected=true]{color:var(--dsw-alias-label-primary);border-bottom-color:var(--dsw-alias-state-business-primary)}.gNoOdq_toolPanel{flex-direction:column;gap:12px;min-width:0;padding:12px 14px 14px;font-size:13px;line-height:22px;display:flex}.gNoOdq_toolPanel:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-3px}.gNoOdq_toolDetailNote{color:var(--dsw-alias-label-secondary);margin:0 0 9px;font-size:12px;line-height:20px}.gNoOdq_toolRawLabel{color:var(--dsw-alias-label-secondary);margin:0;font-size:12px;font-weight:500}.gNoOdq_toolRaw{background:var(--dsw-alias-bg-module-platform);max-height:400px;color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:8px;margin:0;padding:12px;font:12px/20px ui-monospace,SFMono-Regular,Menlo,monospace;overflow:auto}.gNoOdq_systemPrompt{background:var(--dsw-alias-bg-module-platform);max-height:320px;color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:8px;margin:0;padding:12px;font:12px/20px ui-monospace,SFMono-Regular,Menlo,monospace;overflow:auto}.gNoOdq_commandInput{white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.gNoOdq_toolReceipt .gNoOdq_blocks,.gNoOdq_toolDocument .gNoOdq_blocks{font-size:13px;line-height:22px}.gNoOdq_toolChildren{margin:0 14px 12px var(--reader-rail,6px);padding-left:var(--reader-gutter,16px);border-left:1px solid var(--dsw-alias-border-l2);flex-direction:column;gap:9px;display:flex}@container (width<=420px){.gNoOdq_toolHeading{grid-template-columns:16px minmax(0,1fr) auto;gap:7px;padding:11px 10px 6px}.gNoOdq_toolHeadingState{gap:4px}.gNoOdq_toolLedger{padding-left:33px;padding-right:10px}.gNoOdq_toolPanel{padding:10px}}@media (pointer:coarse){.gNoOdq_toolTabs>button{min-height:44px}}.gNoOdq_reasonCard{--reason-preview-height:224px;--reason-hold:.84s;--reason-step:.5s;--reason-lines:2;--reason-fade:28px;--reason-ease:cubic-bezier(.22, 1, .36, 1);border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);min-width:0;scroll-margin-block:16px calc(var(--dsh-composer-height,152px) + 16px);border-radius:12px;position:relative;overflow:hidden}.gNoOdq_reasonHeading{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;justify-content:space-between;align-items:baseline;gap:12px;padding:10px 16px 0;font-size:12px;line-height:20px;display:flex}.gNoOdq_reasonCard[data-overflow=false][data-expanded=false]{background:0 0;border-color:#0000;border-radius:0}.gNoOdq_reasonCard[data-overflow=false][data-expanded=false] .gNoOdq_reasonHeading{padding:0}.gNoOdq_reasonCard[data-overflow=false][data-expanded=false] .gNoOdq_reasonText{padding:4px 0 0 22px}.gNoOdq_reasonLabel{font-weight:500}.gNoOdq_reasonViewport{max-height:var(--reason-preview-height);scroll-behavior:auto;overflow-anchor:none;overscroll-behavior-y:contain;scrollbar-width:thin;scrollbar-color:var(--dsw-alias-border-l1) transparent;position:relative;overflow:auto}.gNoOdq_reasonCard[data-expanded=true] .gNoOdq_reasonViewport{max-height:min(60vh, 560px, var(--reason-reading-height,560px))}.gNoOdq_reasonViewport[data-edges=both],.gNoOdq_reasonCard[data-following=true][data-overflow=true] .gNoOdq_reasonViewport{-webkit-mask-image:linear-gradient(transparent 0, black var(--reason-fade), black calc(100% - var(--reason-fade)), transparent 100%);mask-image:linear-gradient(transparent 0, black var(--reason-fade), black calc(100% - var(--reason-fade)), transparent 100%)}.gNoOdq_reasonViewport[data-edges=top]{-webkit-mask-image:linear-gradient(transparent 0, black var(--reason-fade), black 100%);mask-image:linear-gradient(transparent 0, black var(--reason-fade), black 100%)}.gNoOdq_reasonViewport[data-edges=bottom]{-webkit-mask-image:linear-gradient(black 0, black calc(100% - var(--reason-fade)), transparent 100%);mask-image:linear-gradient(black 0, black calc(100% - var(--reason-fade)), transparent 100%)}.gNoOdq_reasonCard[data-expanded=true] .gNoOdq_reasonViewport{mask-image:none}.gNoOdq_reasonViewport:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-3px}.gNoOdq_reasonTrack{position:relative;transform:translateY(0)}.gNoOdq_reasonCard[data-following=true] .gNoOdq_reasonTrack{will-change:transform}.gNoOdq_reasonText{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;padding:8px 16px 16px;font-size:14px;line-height:24px}.gNoOdq_reasonText .gNoOdq_readingText>div{font-size:inherit;line-height:inherit;color:inherit}.gNoOdq_reasonFooter{color:var(--dsw-alias-label-secondary);justify-content:space-between;align-items:center;gap:8px;padding:2px 10px 8px;font-size:12px;line-height:20px;display:flex}.gNoOdq_reasonAction{min-height:28px;color:inherit;font:inherit;cursor:pointer;white-space:nowrap;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;gap:5px;padding:4px 6px;display:inline-flex}.gNoOdq_reasonAction:hover{background:var(--dsw-alias-interactive-bg-hover)}.gNoOdq_reasonAction:disabled{cursor:default;opacity:.65}.gNoOdq_reasonAction svg{fill:none;stroke:currentColor;stroke-width:1.3px;stroke-linecap:round;stroke-linejoin:round;flex:none}.gNoOdq_reasonCaption{padding-left:6px}@container (width<=480px){.gNoOdq_reasonCard{--reason-preview-height:192px}}@media (pointer:coarse){.gNoOdq_reasonAction{min-height:44px}}@media (prefers-reduced-motion:reduce){.gNoOdq_reasonTrack{will-change:auto!important;transition:none!important;transform:none!important}}@media (forced-colors:active){.gNoOdq_reasonViewport{mask-image:none!important}}.gNoOdq_processItem,.gNoOdq_tool{min-width:0;margin:0 0 18px}.gNoOdq_processLabel{color:var(--dsw-alias-label-tertiary);align-items:baseline;gap:12px;margin:0 0 6px;font-size:12px;line-height:20px;display:flex}.gNoOdq_processFootnote{color:var(--dsw-alias-label-tertiary);margin:14px 0 0;font-size:12px;line-height:20px}.gNoOdq_detail{color:var(--dsw-alias-label-secondary);font-size:13px;line-height:22px}.gNoOdq_detail>summary{cursor:pointer;padding:3px 0}.gNoOdq_detail[open]>summary{margin-bottom:8px}.gNoOdq_tool>.gNoOdq_tool{margin:10px 0 0 12px}.gNoOdq_meta{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:20px}.gNoOdq_stopped{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-tertiary);border-radius:6px;align-self:flex-start;margin-top:12px;padding:0 6px;font-size:11px;line-height:18px}.gNoOdq_compactionRow{box-sizing:border-box;flex-direction:column;align-items:center;width:100%;margin:16px 0;display:flex}.gNoOdq_compactionLine{width:100%;color:var(--dsw-alias-label-tertiary);-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;gap:12px;font-size:11px;line-height:18px;display:flex}.gNoOdq_compactionLine:before,.gNoOdq_compactionLine:after{content:\"\";background:var(--dsw-alias-border-l1);opacity:.7;flex:1;height:1px}.gNoOdq_compactionRow>.gNoOdq_compactionLine{animation:.52s cubic-bezier(.4,0,.2,1) both gNoOdq_compactionLineIn}.gNoOdq_compactionRow>.gNoOdq_compactionLine>.gNoOdq_compactionPill{animation:.42s cubic-bezier(.34,1.4,.64,1) .12s both gNoOdq_compactionPillIn}.gNoOdq_compactionRow>.gNoOdq_compactionLine .gNoOdq_compactionIcon{animation:.9s cubic-bezier(.4,0,.2,1) .2s both gNoOdq_compactionDial}@keyframes gNoOdq_compactionLineIn{0%{opacity:0;transform:scaleX(.6)}to{opacity:1;transform:scaleX(1)}}@keyframes gNoOdq_compactionPillIn{0%{opacity:0;transform:translateY(-6px)scale(.94)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes gNoOdq_compactionDial{0%{opacity:0;transform:rotate(-140deg)}to{opacity:.7;transform:rotate(0)}}[data-motion=off] .gNoOdq_compactionRow>.gNoOdq_compactionLine,[data-motion=off] .gNoOdq_compactionRow>.gNoOdq_compactionLine>.gNoOdq_compactionPill,[data-motion=off] .gNoOdq_compactionRow>.gNoOdq_compactionLine .gNoOdq_compactionIcon{animation:none!important}@media (prefers-reduced-motion:reduce){.gNoOdq_compactionRow>.gNoOdq_compactionLine,.gNoOdq_compactionRow>.gNoOdq_compactionLine>.gNoOdq_compactionPill,.gNoOdq_compactionRow>.gNoOdq_compactionLine .gNoOdq_compactionIcon{animation:none!important}}.gNoOdq_compactionPill{background:var(--dsw-alias-bg-module-platform);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-tertiary);border-radius:12px;align-items:center;gap:6px;padding:2px 10px;font-family:inherit;font-size:11px;line-height:18px;display:inline-flex}.gNoOdq_compactionButton{cursor:pointer;transition:color .14s,border-color .14s,background-color .14s}.gNoOdq_compactionButton:hover{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l2);background:var(--dsw-alias-interactive-bg-hover)}.gNoOdq_compactionIcon{opacity:.7;flex:none;width:12px;height:12px}.gNoOdq_compactionToggle{opacity:.8;margin-left:2px;font-size:10px}.gNoOdq_compactionSummaryBox{background:var(--dsw-alias-bg-module-platform);border:1px solid var(--dsw-alias-border-l2);width:100%;max-width:680px;color:var(--dsw-alias-label-secondary);box-sizing:border-box;border-radius:8px;margin-top:10px;padding:12px 16px;font-size:12px;line-height:20px}.gNoOdq_compactionSummaryHeader{color:var(--dsw-alias-label-tertiary);border-bottom:1px dashed var(--dsw-alias-border-l1);margin-bottom:8px;padding-bottom:4px;font-size:11px;font-weight:500}.gNoOdq_notice,.gNoOdq_error,.gNoOdq_attention{overflow-wrap:anywhere;border-radius:10px;padding:12px 14px;font-size:13px;line-height:20px}.gNoOdq_notice{background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);border:1px solid var(--dsw-alias-border-l2)}.gNoOdq_error{color:var(--dsw-alias-label-primary);background:#ef44440f;border:1px solid #ef444438;align-items:flex-start;gap:10px;display:flex}.gNoOdq_errorIcon{color:#ef4444;flex:none;width:16px;height:16px;margin-top:2px}.gNoOdq_errorCopy{flex:1;min-width:0}.gNoOdq_errorTitle{color:#dc2626;align-items:center;gap:8px;margin-bottom:2px;font-weight:500;display:flex}.gNoOdq_errorMessage{color:var(--dsw-alias-label-secondary);word-break:break-word;margin:0;font-size:12px;line-height:18px}.gNoOdq_errorCode{color:#dc2626;background:#ef44441f;border-radius:4px;padding:1px 5px;font-family:inherit;font-size:11px}.gNoOdq_attention{border:1px solid var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-base);flex-direction:column;gap:3px;display:flex}.gNoOdq_attention span{color:var(--dsw-alias-label-secondary)}.gNoOdq_unknown{background:var(--dsw-alias-bg-module-platform);border:1px solid var(--dsw-alias-border-l2);border-radius:10px;padding:12px 14px;font-size:13px;line-height:22px}.gNoOdq_unknown p{margin:0 0 6px}.gNoOdq_historyButton{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:0 0;border-radius:8px;align-self:center;padding:4px 12px;font-size:12px}.gNoOdq_historyButton:disabled{opacity:.55;cursor:default}.gNoOdq_empty{color:var(--dsw-alias-label-tertiary);text-align:center;padding:40px 0}.gNoOdq_answerActions{align-items:center;gap:8px;min-height:28px;margin:13px 0 0 -6px;display:flex}.gNoOdq_userActions{align-items:center;gap:8px;min-height:28px;display:flex}.gNoOdq_messageClock{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-variant-numeric:tabular-nums;font-size:13px;line-height:24px}.gNoOdq_iconButton{color:var(--dsw-alias-label-tertiary);background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;padding:6px;display:inline-flex}.gNoOdq_iconButton svg{fill:none;stroke:currentColor;stroke-width:1.2px;stroke-linecap:round;stroke-linejoin:round}.gNoOdq_imageFigure{box-sizing:border-box;align-self:flex-start;width:min(100%,360px);max-width:100%;margin:0}.gNoOdq_imageFrame{background:var(--dsw-alias-bg-module-platform);border:1px solid var(--dsw-alias-border-l2);box-sizing:border-box;border-radius:12px;max-width:100%;min-height:96px;max-height:440px;position:relative;overflow:hidden}.gNoOdq_imageOpen{background:0 0;border:0;width:100%;height:100%;padding:0;display:flex;position:absolute;inset:0}.gNoOdq_imageOpen img{object-fit:contain;opacity:0;width:100%;height:100%;transition:opacity .2s cubic-bezier(.4,0,.2,1);display:block}.gNoOdq_imageOpen img[data-ready=true]{opacity:1}.gNoOdq_pendingImage{object-fit:contain;width:100%;max-width:100%;height:100%;display:block}.gNoOdq_imagePlaceholder{color:var(--dsw-alias-label-tertiary);pointer-events:none;flex-direction:column;justify-content:center;align-items:center;gap:8px;font-size:13px;display:flex;position:absolute;inset:0}.gNoOdq_imagePlaceholder button{pointer-events:auto}.gNoOdq_imageFigure figcaption{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;margin-top:6px;font-size:12px;line-height:20px}.gNoOdq_imageDialog{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary);border-radius:16px;max-width:90vw;max-height:90vh;padding:38px 20px 20px}.gNoOdq_imageDialog::backdrop{background:var(--dsw-alias-bg-mask-photo)}.gNoOdq_imageDialog img{object-fit:contain;max-width:82vw;max-height:75vh;display:block}.gNoOdq_dialogClose{color:inherit;background:0 0;border:0;border-radius:8px;width:32px;height:32px;font-size:24px;position:absolute;top:4px;right:8px}.gNoOdq_jumpDock{bottom:calc(var(--dsh-composer-height,152px) + 16px);z-index:8;pointer-events:none;justify-content:flex-end;height:0;display:flex;position:sticky}.gNoOdq_deliverablesRoot{grid-template-columns:max-content minmax(0,1fr);align-items:start;column-gap:10px;margin-top:14px;font-size:13px;line-height:22px;display:grid}.gNoOdq_deliverablesLabel{color:var(--dsw-alias-label-tertiary);grid-area:1/1;padding-top:2px;font-size:12px;font-weight:500}.gNoOdq_deliverablesLane{grid-area:1/2;min-width:0}.gNoOdq_deliverablesRow{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.gNoOdq_deliverableChip{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);border-radius:6px;align-items:center;font-size:12px;line-height:20px;transition:border-color .16s,background-color .16s,color .16s;display:inline-flex;overflow:hidden}.gNoOdq_deliverableChip:hover{border-color:var(--dsw-alias-border-l3);background:var(--dsw-alias-bg-module-platform);box-shadow:0 1px 4px var(--dsw-alias-border-l1)}.gNoOdq_deliverableChip[data-status=opened]{color:#059669;background:#10b9811f;border-color:#10b981}.gNoOdq_chipMain{max-width:220px;color:inherit;font:inherit;cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:5px;padding:3px 6px 3px 8px;display:inline-flex}.gNoOdq_chipMain:hover{color:var(--dsw-alias-label-primary)}.gNoOdq_deliverableIcon,.gNoOdq_statusIcon{opacity:.8;flex:none;width:13px;height:13px}.gNoOdq_statusIcon{color:#10b981}.gNoOdq_deliverableName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gNoOdq_chipActions{opacity:.65;border-left:1px solid #0000;align-items:center;gap:2px;padding-right:4px;transition:opacity .15s,border-left-color .15s;display:inline-flex}.gNoOdq_deliverableChip:hover .gNoOdq_chipActions{opacity:1;border-left-color:var(--dsw-alias-border-l2)}.gNoOdq_chipActionBtn{width:20px;height:20px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;padding:0;transition:color .12s,background-color .12s;display:inline-flex}.gNoOdq_chipActionBtn:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover)}.gNoOdq_actionIcon{width:12px;height:12px}.gNoOdq_deliverablesMore{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:12px}.gNoOdq_deliverablesShowFolder{color:var(--dsw-alias-label-tertiary);font:inherit;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:5px;align-items:center;gap:4px;padding:2px 7px;font-size:12px;transition:all .15s;display:inline-flex}.gNoOdq_deliverablesShowFolder:hover{color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-interactive-bg-hover);border-color:var(--dsw-alias-border-l2)}.gNoOdq_deliverablesShowFolder[data-status=opened]{color:#10b981;background:#10b98114;border-color:#10b9814d}.gNoOdq_morphCluster{flex-direction:column;width:100%;min-width:0;display:flex}.gNoOdq_morphDrawer{transform-origin:top;will-change:height, opacity, transform;height:0;overflow:hidden}.gNoOdq_liveFoldImpact{animation:.18s cubic-bezier(.2,0,0,1) both gNoOdq_liveFoldElastic}@keyframes gNoOdq_liveFoldElastic{0%{transform:scale(1)}50%{transform:scale(1.015)}to{transform:scale(1)}}.gNoOdq_liveFoldContainer{top:calc(var(--reader-toolbar-height,var(--reader-lane-block,40px)) + var(--reader-status-height,var(--reader-lane-block,40px)) + var(--reader-summary-height,var(--reader-lane-block,40px)));z-index:4;background:var(--dsw-alias-bg-base);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);transform-origin:0;will-change:transform, opacity;margin-bottom:6px;padding:4px 0;animation:.32s cubic-bezier(.16,1,.3,1) both gNoOdq_liveFoldPulse;position:sticky}@keyframes gNoOdq_liveFoldPulse{0%{opacity:.8;transform:translateY(-4px)scale(.98)}50%{opacity:1;transform:translateY(0)scale(1.02)}to{opacity:1;transform:translateY(0)scale(1)}}[data-motion=off] .gNoOdq_liveFoldContainer{animation:none!important}@media (prefers-reduced-motion:reduce){.gNoOdq_liveFoldContainer{animation:none!important}}.gNoOdq_priorFoldDrawer{flex-direction:column;gap:14px;width:100%;min-width:0;display:flex}.gNoOdq_jump{width:34px;height:34px;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-button-floating-fill,var(--dsw-alias-bg-base));box-shadow:var(--dsw-elevation-panel,0 2px 8px var(--dsw-alias-border-l1));pointer-events:auto;border:0;border-radius:100px;flex:none;justify-content:center;align-items:center;margin-top:-34px;padding:0;display:flex}.gNoOdq_jump:hover{background:var(--dsw-alias-button-floating-hover,var(--dsw-alias-interactive-bg-hover))}.gNoOdq_foldSummary{text-overflow:ellipsis;align-items:baseline;max-width:100%;display:inline-flex;overflow:hidden;white-space:nowrap!important}.gNoOdq_foldSummaryPart{flex:none;align-items:baseline;display:inline-flex;white-space:nowrap!important}.gNoOdq_numberRollRoot{vertical-align:baseline;line-height:inherit;font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\";text-align:center;flex-shrink:0;justify-content:center;min-width:1.45em;display:inline-flex;position:relative;overflow:hidden;white-space:nowrap!important}.gNoOdq_numberRollSizer{visibility:hidden;-webkit-user-select:none;user-select:none;pointer-events:none;line-height:inherit;white-space:nowrap}.gNoOdq_numberRollDigit{line-height:inherit;white-space:nowrap;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.gNoOdq_numberRollExit{animation:.24s cubic-bezier(.16,1,.3,1) forwards gNoOdq_numberRollOut}.gNoOdq_numberRollEnter{animation:.24s cubic-bezier(.16,1,.3,1) forwards gNoOdq_numberRollIn}@keyframes gNoOdq_numberRollOut{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-100%)}}@keyframes gNoOdq_numberRollIn{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}[data-motion=off] .gNoOdq_chevron,[data-motion=off] .gNoOdq_imageOpen img,[data-motion=off] .gNoOdq_processMeta,[data-motion=off] .gNoOdq_numberRollDigit{transition:none!important;animation:none!important}@media (prefers-reduced-motion:reduce){.gNoOdq_chevron,.gNoOdq_imageOpen img,.gNoOdq_processMeta,.gNoOdq_numberRollDigit{transition:none!important;animation:none!important}}.gNoOdq_turnStatus{white-space:nowrap;flex:none;align-self:flex-start;align-items:center;height:26px;margin:4px 0 12px;padding:0 4px;font-size:14px;line-height:22px;display:inline-flex}.gNoOdq_turnStatusLabel{background:linear-gradient(90deg, var(--dsw-static-deepseek-500,#4d6bfe) 0%, var(--dsw-static-deepseek-500,#4d6bfe) 40%, var(--dsw-static-deepseek-200,#a8c7fa) 50%, var(--dsw-static-deepseek-500,#4d6bfe) 60%, var(--dsw-static-deepseek-500,#4d6bfe) 100%);color:#0000;-webkit-text-fill-color:transparent;background-position:100% 0;background-size:250% 100%;background-clip:text;font-weight:500;animation:1.8s linear infinite gNoOdq_dsh-turn-status-shimmer}.gNoOdq_waitClock{flex:none;align-items:center;margin-left:8px;display:inline-flex}.gNoOdq_waitSeconds{font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\";color:var(--dsw-alias-label-caption,#86909c);font-size:13px;font-weight:400}.gNoOdq_waitOvertime{color:var(--dsw-alias-state-warning-primary,#d8862c);background:color-mix(in srgb, var(--dsw-alias-state-warning-primary,#d8862c) 16%, transparent);border-radius:5px;margin-left:8px;padding:0 6px;font-size:11px;line-height:16px}.gNoOdq_turnStatusClock{font-variant-numeric:tabular-nums;font-feature-settings:\"tnum\";color:var(--dsw-alias-label-caption,#86868b);-webkit-text-fill-color:var(--dsw-alias-label-caption,#86868b);margin-left:8px;font-size:13px;font-weight:400}@keyframes gNoOdq_dsh-turn-status-shimmer{to{background-position:0 0}}[data-motion=off] .gNoOdq_turnStatusLabel{color:var(--dsw-static-deepseek-500,#4d6bfe)!important;-webkit-text-fill-color:var(--dsw-static-deepseek-500,#4d6bfe)!important;animation:none!important}@media (prefers-reduced-motion:reduce){.gNoOdq_turnStatusLabel{color:var(--dsw-static-deepseek-500,#4d6bfe)!important;-webkit-text-fill-color:var(--dsw-static-deepseek-500,#4d6bfe)!important;animation:none!important}}@media (pointer:coarse){.gNoOdq_disclosureButton{min-height:44px}}@media (width<=600px){.gNoOdq_root{padding-inline:20px}.gNoOdq_column{gap:18px}.gNoOdq_toolbar{font-size:11px}}.gNoOdq_choreographedFlow{overflow-anchor:none;flex-direction:column;min-width:0;display:flex}.gNoOdq_flowCell{min-width:0;display:flow-root;overflow:clip}.gNoOdq_flowCell[hidden]{display:none}.gNoOdq_flowCellInner{flex-direction:column;min-width:0;padding-bottom:16px;display:flex}.gNoOdq_flowCellInner:empty{padding-bottom:0}.gNoOdq_choreographedFlow[data-reader-transition=collapse] .gNoOdq_flowCell *{animation-play-state:paused!important}.gNoOdq_numberRollExit,.gNoOdq_numberRollEnter{animation-duration:.16s}.gNoOdq_foldSummary{align-items:baseline;display:inline-flex;white-space:nowrap!important;flex-wrap:nowrap!important}.gNoOdq_toolbar{box-sizing:border-box;width:100%;max-width:100%;min-height:var(--reader-lane-block,40px);z-index:7;-webkit-backdrop-filter:none;backdrop-filter:none;border-bottom:0;align-self:stretch}.gNoOdq_turnProcessSticky{box-sizing:border-box;width:calc(100% - var(--reader-control-width,148px));top:var(--reader-toolbar-height,var(--reader-lane-block,40px));min-height:var(--reader-lane-block,40px);z-index:6;-webkit-backdrop-filter:none;backdrop-filter:none;box-shadow:0 -14px 0 var(--dsw-alias-bg-base), var(--reader-control-width,148px) 0 0 var(--dsw-alias-bg-base), 0 -14px 0 var(--dsw-alias-bg-layer-1,transparent), var(--reader-control-width,148px) 0 0 var(--dsw-alias-bg-layer-1,transparent), 0 -14px 0 Canvas, var(--reader-control-width,148px) 0 0 Canvas;background-clip:padding-box;border-bottom:1px solid #0000;padding-right:0}.gNoOdq_turnStickyLanes .gNoOdq_turnProcessSticky,.gNoOdq_turnStickyLanes .gNoOdq_closedProcessSummary{z-index:auto;position:static;top:auto}.gNoOdq_flowCell[data-flow-summary],.gNoOdq_closedProcessSummary{top:calc(var(--reader-toolbar-height,var(--reader-lane-block,40px)) + var(--reader-status-height,var(--reader-lane-block,40px)));z-index:5;box-sizing:border-box;min-height:var(--reader-lane-block,40px);background:var(--dsw-alias-bg-base);border-bottom:0;padding-block:4px;position:sticky;overflow:visible}.gNoOdq_root .md-code-block{z-index:0}.gNoOdq_turnStickyRegion:has(>.gNoOdq_turnStickyLanes>.gNoOdq_closedProcessSummary),.gNoOdq_turnStickyRegion:has(.gNoOdq_flowCell[data-flow-summary]){--reader-code-summary-height:var(--reader-summary-height,var(--reader-lane-block,40px))}.gNoOdq_root .md-code-block>:has(+[data-code-block-content]){top:calc(max(var(--reader-toolbar-height,40px), var(--reader-status-height,0px)) + var(--reader-status-height,0px) + var(--reader-code-summary-height,0px))}.gNoOdq_flowCell[data-flow-summary]{box-shadow:0 -16px 0 var(--dsw-alias-bg-base), 0 -16px 0 var(--dsw-alias-bg-layer-1,transparent), 0 -16px 0 Canvas}.gNoOdq_closedProcessSummary{box-shadow:0 -14px 0 var(--dsw-alias-bg-base), 0 -14px 0 var(--dsw-alias-bg-layer-1,transparent), 0 -14px 0 Canvas}.gNoOdq_foldControl{background:var(--dsw-alias-bg-module-platform);border-radius:8px;align-items:center;gap:0;padding:2px;display:inline-flex}.gNoOdq_foldStop{color:var(--dsw-alias-label-secondary);white-space:nowrap;font:inherit;cursor:pointer;background:0 0;border:0;border-radius:6px;padding:2px 8px;font-size:12px;line-height:18px}.gNoOdq_foldStop[data-on]{background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary)}.gNoOdq_flowCell[data-flow-summary]>.gNoOdq_flowCellInner{padding-bottom:0}.gNoOdq_flowCell[data-flow-summary] .gNoOdq_disclosureButton,.gNoOdq_closedProcessSummary .gNoOdq_disclosureButton{width:auto;max-width:100%}.gNoOdq_flowCell[data-flow-summary] .gNoOdq_foldSummary,.gNoOdq_closedProcessSummary .gNoOdq_foldSummary{min-width:0}.gNoOdq_turnProcessSticky>.gNoOdq_disclosure{flex:auto;min-width:0}.gNoOdq_disclosureButton{width:max-content;max-width:calc(100% + 6px)}.gNoOdq_statusText{flex:0 auto}.gNoOdq_think{width:max-content;min-width:0}.gNoOdq_thinkSizer{white-space:normal;overflow-wrap:anywhere}.gNoOdq_thinkText{white-space:normal;overflow-wrap:anywhere;text-overflow:clip;overflow:visible}.gNoOdq_toolbar,.gNoOdq_turnStickyLanes,.gNoOdq_turnProcessSticky,.gNoOdq_liveFoldContainer,.gNoOdq_flowCell[data-flow-summary],.gNoOdq_closedProcessSummary{background-color:canvas;background-image:var(--reader-lane-plate);background-repeat:no-repeat}.gNoOdq_root[data-reader-glass] .gNoOdq_toolbar,.gNoOdq_root[data-reader-glass] .gNoOdq_turnProcessSticky,.gNoOdq_root[data-reader-glass] .gNoOdq_liveFoldContainer{-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);box-shadow:none;background:0 0;border:0;border-radius:0}.gNoOdq_root[data-reader-glass] .gNoOdq_toolbar,.gNoOdq_root[data-reader-glass] .gNoOdq_turnProcessSticky{-webkit-backdrop-filter:none;backdrop-filter:none}.gNoOdq_root[data-reader-glass] .gNoOdq_toolbar{pointer-events:none}.gNoOdq_root[data-reader-glass] .gNoOdq_toolbar>.gNoOdq_textButton,.gNoOdq_root[data-reader-glass] .gNoOdq_turnProcessSticky .gNoOdq_disclosureButton{pointer-events:auto;background:color-mix(in srgb, var(--dsw-alias-bg-layer-1,#ffffffb3) 80%, transparent);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-radius:999px;padding:2px 10px}.gNoOdq_root[data-reader-glass] .gNoOdq_turnProcessSticky .gNoOdq_disclosureButton{max-width:100%;margin-left:0}.gNoOdq_root[data-reader-glass] .gNoOdq_toolbar>.gNoOdq_textButton:hover,.gNoOdq_root[data-reader-glass] .gNoOdq_turnProcessSticky .gNoOdq_disclosureButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.gNoOdq_root[data-reader-glass] .gNoOdq_flowCell[data-flow-summary],.gNoOdq_root[data-reader-glass] .gNoOdq_closedProcessSummary{box-shadow:none;z-index:auto;border-left:2px solid color-mix(in srgb, var(--dsw-alias-border-l2,#80808059) 80%, transparent);padding-block:2px;background:0 0;border-radius:0;min-height:32px;padding-left:10px;position:static}.gNoOdq_root[data-reader-glass] .gNoOdq_turnStickyLanes{z-index:auto;display:contents;position:static;top:auto}.gNoOdq_root[data-reader-glass] .gNoOdq_turnStickyRegion{--reader-code-summary-height:0px}.gNoOdq_root[data-reader-glass] .gNoOdq_turnStickyLanes .gNoOdq_turnProcessSticky{top:var(--reader-toolbar-height,var(--reader-lane-block,40px));z-index:6;position:sticky}.gNoOdq_root[data-reader-glass] .gNoOdq_user{background:color-mix(in srgb, var(--dsw-specific-bubble,#00000014) 25%, transparent);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1,#8080804d) 30%, transparent)}.gNoOdq_root[data-reader-glass] .gNoOdq_reasonCard{border-color:color-mix(in srgb, var(--dsw-alias-border-l1,#80808059) 65%, transparent);background:0 0}.gNoOdq_root[data-reader-glass] .gNoOdq_toolDetails,.gNoOdq_root[data-reader-glass] .gNoOdq_notice,.gNoOdq_root[data-reader-glass] .gNoOdq_unknown,.gNoOdq_root[data-reader-glass] .gNoOdq_toolRaw,.gNoOdq_root[data-reader-glass] .gNoOdq_systemPrompt,.gNoOdq_root[data-reader-glass] .gNoOdq_compactionSummaryBox,.gNoOdq_root[data-reader-glass] .gNoOdq_attention,.gNoOdq_root[data-reader-glass] .gNoOdq_imageFrame,.gNoOdq_root[data-reader-glass] .gNoOdq_imageDialog{background:0 0}.gNoOdq_root[data-reader-glass] .gNoOdq_diffOverlay{background:color-mix(in srgb, var(--dsw-alias-bg-module-platform,#7f7f7f1a) 20%, transparent);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px)}.gNoOdq_root[data-reader-glass] .gNoOdq_diffScrollArea{background:0 0}.gNoOdq_root[data-reader-glass] .gNoOdq_diffTab{background:color-mix(in srgb, var(--dsw-alias-bg-base,#fffc) 25%, transparent)}.gNoOdq_root[data-reader-glass] .gNoOdq_diffTab[data-active]{background:color-mix(in srgb, var(--dsw-alias-bg-base,#fff) 45%, transparent)}:is(.gNoOdq_root[data-reader-glass] .md-code-block,.gNoOdq_root[data-reader-glass] [data-diff]){border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1,#80808033) 30%, transparent);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background:color-mix(in srgb, var(--dsw-alias-markdown-code-block,#0000000f) 25%, transparent)!important}.gNoOdq_root[data-reader-glass] .gNoOdq_foldControl{background:color-mix(in srgb, var(--dsw-alias-bg-module-platform,#7f7f7f1a) 25%, transparent);border:1px solid color-mix(in srgb, var(--dsw-alias-border-l2,#80808033) 30%, transparent)}.gNoOdq_root[data-reader-glass] .gNoOdq_foldStop[data-on]{background:color-mix(in srgb, var(--dsw-alias-bg-base,#fff) 35%, transparent)}.gNoOdq_root[data-reader-glass] .gNoOdq_compactionPill,.gNoOdq_root[data-reader-glass] .gNoOdq_deliverableChip,.gNoOdq_root[data-reader-glass] .gNoOdq_toolState,.gNoOdq_root[data-reader-glass] .gNoOdq_diffStatButton{background:0 0;border-color:#0000}.gNoOdq_root[data-reader-glass] .gNoOdq_compactionPill:hover,.gNoOdq_root[data-reader-glass] .gNoOdq_compactionPill:focus-visible,.gNoOdq_root[data-reader-glass] .gNoOdq_deliverableChip:hover,.gNoOdq_root[data-reader-glass] .gNoOdq_deliverableChip:focus-within,.gNoOdq_root[data-reader-glass] .gNoOdq_toolState:hover,.gNoOdq_root[data-reader-glass] .gNoOdq_diffStatButton:hover,.gNoOdq_root[data-reader-glass] .gNoOdq_diffStatButton:focus-visible,.gNoOdq_root[data-reader-glass] .gNoOdq_diffStatButton[aria-expanded=true]{background:var(--dsw-alias-bg-module-platform,#7f7f7f1a);border-color:var(--dsw-alias-border-l2,#7f7f7f47)}";
42740
42766
  const tagId$5 = "dsh-better-display/Reader.module.css";
42741
42767
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$5) + "]") === null) {
@@ -42924,8 +42950,7 @@ ${trimmed}
42924
42950
  "waitOvertime": "gNoOdq_waitOvertime",
42925
42951
  "waitSeconds": "gNoOdq_waitSeconds"
42926
42952
  };
42927
- //#endregion
42928
- //#region src/client/word-motion.tsx
42953
+ // src/client/word-motion.tsx
42929
42954
  const WordScope = (0, react.createContext)({
42930
42955
  enabled: false,
42931
42956
  generation: 0
@@ -43079,8 +43104,7 @@ ${trimmed}
43079
43104
  })
43080
43105
  });
43081
43106
  }
43082
- //#endregion
43083
- //#region src/client/text-transform.ts
43107
+ // src/client/text-transform.ts
43084
43108
  /**
43085
43109
  * Cordis service name. Another client plugin lists this in `inject` and
43086
43110
  * registers a transformer. The reading view paints the result. The session
@@ -43289,8 +43313,7 @@ ${trimmed}
43289
43313
  function originalAnswerText(blocks) {
43290
43314
  return blocks.flatMap((block) => block.kind === "text" && typeof block.text === "string" ? [block.text] : []).join("\n\n");
43291
43315
  }
43292
- //#endregion
43293
- //#region \0dshx-css-module:TurnMetrics.module.css.mjs
43316
+ // \0dshx-css-module:/home/runner/work/dsh-better-display/dsh-better-display/src/client/TurnMetrics.module.css.mjs
43294
43317
  const css$4 = "._QZbGG_container{color:var(--dsw-alias-label-tertiary);align-items:center;gap:2px;font-size:13px;line-height:24px;display:inline-flex;position:relative}._QZbGG_pillButton{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-tertiary);cursor:pointer;border-radius:12px;outline:none;align-items:center;gap:5px;padding:2px 8px;font-family:inherit;font-size:11px;transition:all .14s;display:inline-flex}._QZbGG_pillButton:hover,._QZbGG_pillButton[data-active=true]{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l2);background:var(--dsw-alias-interactive-bg-hover)}._QZbGG_timeButton{height:28px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;cursor:pointer;background:0 0;border:none;border-radius:28px;align-items:center;gap:4px;padding:6px 8px;font-family:inherit;font-size:13px;line-height:24px;display:inline-flex}._QZbGG_timeButton:hover,._QZbGG_timeButton[data-active=true]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}._QZbGG_pillIcon{opacity:.8;flex:none;width:12px;height:12px}._QZbGG_metricsPop{background:var(--dsw-alias-bg-base);border:1px solid var(--dsw-alias-border-l2);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);z-index:50;text-align:left;border-radius:10px;flex-direction:column;gap:8px;width:260px;padding:12px 14px;animation:.14s ease-out _QZbGG_popIn;display:flex;position:absolute;bottom:calc(100% + 8px);left:0;box-shadow:0 6px 20px #00000024}@keyframes _QZbGG_popIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}._QZbGG_popHeader{color:var(--dsw-alias-label-primary);border-bottom:1px solid var(--dsw-alias-border-l1);justify-content:space-between;align-items:center;padding-bottom:6px;font-size:12px;font-weight:600;display:flex}._QZbGG_popSection{flex-direction:column;gap:4px;display:flex}._QZbGG_popSectionTitle{text-transform:uppercase;letter-spacing:.5px;color:var(--dsw-alias-label-tertiary);margin-top:2px;font-size:10px;font-weight:600}._QZbGG_popGrid{grid-template-columns:1fr auto;gap:3px 12px;font-size:11px;line-height:18px;display:grid}._QZbGG_popLabel{color:var(--dsw-alias-label-secondary)}._QZbGG_popValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;text-align:right;font-weight:500}._QZbGG_popBadge{background:var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);border-radius:3px;margin-left:4px;padding:0 4px;font-size:10px}";
43295
43318
  const tagId$4 = "dsh-better-display/TurnMetrics.module.css";
43296
43319
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) {
@@ -43315,8 +43338,7 @@ ${trimmed}
43315
43338
  "popValue": "_QZbGG_popValue",
43316
43339
  "timeButton": "_QZbGG_timeButton"
43317
43340
  };
43318
- //#endregion
43319
- //#region src/client/TurnMetrics.tsx
43341
+ // src/client/TurnMetrics.tsx
43320
43342
  function formatTokens(count) {
43321
43343
  if (count >= 1e6) return `${(count / 1e6).toFixed(2)}M tok`;
43322
43344
  if (count >= 1e3) return `${(count / 1e3).toFixed(1)}k tok`;
@@ -43505,8 +43527,7 @@ ${trimmed}
43505
43527
  ]
43506
43528
  });
43507
43529
  });
43508
- //#endregion
43509
- //#region src/client/Blocks.tsx
43530
+ // src/client/Blocks.tsx
43510
43531
  const IMAGE_TYPES = /* @__PURE__ */ new Set([
43511
43532
  "image/png",
43512
43533
  "image/jpeg",
@@ -43974,8 +43995,7 @@ ${trimmed}
43974
43995
  const end = Math.max(0, contentHeight - viewportHeight);
43975
43996
  return Math.min(end, Math.min(end, Math.max(0, top)) + Math.max(1, lineHeight) * Math.max(2, Math.min(40, Math.ceil(backlogLines))));
43976
43997
  }
43977
- //#endregion
43978
- //#region src/client/ReasoningCard.tsx
43998
+ // src/client/ReasoningCard.tsx
43979
43999
  const EASING$1 = "cubic-bezier(.22,1,.36,1)";
43980
44000
  /** One real transcript: reference transform while following, native scroll while reading. */
43981
44001
  function ReasoningCard({ children, step, active, motion, selected, onRead }) {
@@ -44339,8 +44359,7 @@ ${trimmed}
44339
44359
  ]
44340
44360
  });
44341
44361
  }
44342
- //#endregion
44343
- //#region src/client/official-slots.tsx
44362
+ // src/client/official-slots.tsx
44344
44363
  /**
44345
44364
  * RC2 composition adapter. Only public registry operations are used. We lend
44346
44365
  * registrations a Reader-owned seat, not a second implementation of their UI.
@@ -44356,16 +44375,46 @@ ${trimmed}
44356
44375
  tools: "tool.call.toolview",
44357
44376
  tail: "conversation.chat.turnTail",
44358
44377
  nodes: "conversation.chat.node",
44359
- images: "conversation.message.images"
44378
+ messageImages: "conversation.chat.message.images",
44379
+ userImages: "conversation.chat.user.images"
44360
44380
  };
44361
44381
  const OFFICIAL_SEATS = {
44362
44382
  actions: "dsh-better-display.official.actions/conversation.chat.assistant-actions",
44363
44383
  tools: "dsh-better-display.official.tools/tool.call.toolview",
44364
44384
  tail: "dsh-better-display.official.tail/conversation.chat.turnTail",
44365
44385
  nodes: "dsh-better-display.official.nodes/conversation.chat.node",
44366
- images: "dsh-better-display.official.images/conversation.message.images"
44386
+ messageImages: "dsh-better-display.official.messageImages/conversation.chat.message.images",
44387
+ userImages: "dsh-better-display.official.userImages/conversation.chat.user.images"
44367
44388
  };
44368
44389
  const officialSeat = (family, source = OFFICIAL_SLOTS[family]) => `dsh-better-display.official.${family}/${source}`;
44390
+ /**
44391
+ * Searchable hide for official nodes drawn outside the Chat flow viewport.
44392
+ * The flow's own `useGroupAction` is not in scope here; this keeps the same
44393
+ * `hidden="until-found"` contract so browser find can still reveal the row.
44394
+ */
44395
+ function useReaderGroupAction(hidden, reveal) {
44396
+ const ref = (0, react.useRef)(null);
44397
+ (0, react.useLayoutEffect)(() => {
44398
+ const element = ref.current;
44399
+ if (element === null) return;
44400
+ if (hidden && element.contains(element.ownerDocument.activeElement)) {
44401
+ reveal();
44402
+ return;
44403
+ }
44404
+ if (hidden) element.setAttribute("hidden", "until-found");
44405
+ else element.removeAttribute("hidden");
44406
+ }, [hidden, reveal]);
44407
+ (0, react.useEffect)(() => {
44408
+ const element = ref.current;
44409
+ if (element === null) return;
44410
+ element.addEventListener("beforematch", reveal);
44411
+ return () => {
44412
+ element.removeEventListener("beforematch", reveal);
44413
+ };
44414
+ }, [reveal]);
44415
+ return ref;
44416
+ }
44417
+ const readerGroupAction = useReaderGroupAction;
44369
44418
  const READER_OWNED_NODES = /* @__PURE__ */ new Set([
44370
44419
  "tool-call",
44371
44420
  "turn-tail",
@@ -44399,7 +44448,11 @@ ${trimmed}
44399
44448
  kind: "keyed",
44400
44449
  scope: "session"
44401
44450
  },
44402
- images: {
44451
+ messageImages: {
44452
+ kind: "single",
44453
+ scope: "session"
44454
+ },
44455
+ userImages: {
44403
44456
  kind: "single",
44404
44457
  scope: "session"
44405
44458
  }
@@ -44542,8 +44595,7 @@ ${trimmed}
44542
44595
  for (const stop of disposers.splice(0).reverse()) stop();
44543
44596
  };
44544
44597
  }
44545
- //#endregion
44546
- //#region src/client/chat-seat.ts
44598
+ // src/client/chat-seat.ts
44547
44599
  function chatSeatProps(kind, key) {
44548
44600
  return {
44549
44601
  "data-chat-anchor-key": key,
@@ -44552,8 +44604,7 @@ ${trimmed}
44552
44604
  "data-chat-flow-kind": kind
44553
44605
  };
44554
44606
  }
44555
- //#endregion
44556
- //#region src/client/OfficialContent.tsx
44607
+ // src/client/OfficialContent.tsx
44557
44608
  function OfficialActions({ official, messageId }) {
44558
44609
  if (!official || !messageId) return null;
44559
44610
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -44600,17 +44651,19 @@ ${trimmed}
44600
44651
  return {
44601
44652
  cwd: render.cwd,
44602
44653
  openFile: render.openFile ?? (() => {}),
44603
- openSkill: () => {},
44604
44654
  forkAt: render.forkAt ?? (() => {}),
44605
44655
  inspectCall: (callId) => official.openView("trajectory", callId),
44606
44656
  loadImage: official.officialImageLoader,
44607
- renderMessageImages: (images) => official.renderSlot(OFFICIAL_SEATS.images, {
44608
- ...images,
44609
- loadImage: official.officialImageLoader
44610
- }),
44611
44657
  fileMentions: official.officialFileMentions
44612
44658
  };
44613
44659
  }
44660
+ function nodeHookContext(turnData, disclosureReset) {
44661
+ return {
44662
+ turnData,
44663
+ disclosureReset,
44664
+ useGroupAction: readerGroupAction
44665
+ };
44666
+ }
44614
44667
  function OfficialNode({ node, fallback, ...render }) {
44615
44668
  const official = render.official;
44616
44669
  const [disclosureReset] = (0, react.useState)(() => (0, _deepseek_ai_dsh_client_store.createSnapshotStore)(0));
@@ -44625,10 +44678,7 @@ ${trimmed}
44625
44678
  node
44626
44679
  }, {
44627
44680
  entryKey: node.kind,
44628
- hookContext: {
44629
- turnData: turn?.data,
44630
- disclosureReset
44631
- },
44681
+ hookContext: nodeHookContext(turn?.data, disclosureReset),
44632
44682
  fallback
44633
44683
  })
44634
44684
  });
@@ -44666,10 +44716,7 @@ ${trimmed}
44666
44716
  groupPart: "response"
44667
44717
  }, {
44668
44718
  entryKey: "assistant-step",
44669
- hookContext: {
44670
- turnData: turn?.data,
44671
- disclosureReset
44672
- },
44719
+ hookContext: nodeHookContext(turn?.data, disclosureReset),
44673
44720
  fallback
44674
44721
  });
44675
44722
  }
@@ -44685,8 +44732,7 @@ ${trimmed}
44685
44732
  children: official.renderSlot(OFFICIAL_SEATS.tail, tailOwner)
44686
44733
  }) : null;
44687
44734
  }
44688
- //#endregion
44689
- //#region src/client/turn-slots.ts
44735
+ // src/client/turn-slots.ts
44690
44736
  /**
44691
44737
  * Keep live turns in the incoming `groups` order, and keep a departing turn
44692
44738
  * next to the live neighbour that preceded it.
@@ -44748,8 +44794,7 @@ ${trimmed}
44748
44794
  while (insertAt < next.length && next[insertAt]?.live === false) insertAt++;
44749
44795
  next.splice(insertAt, 0, slot);
44750
44796
  }
44751
- //#endregion
44752
- //#region src/client/motion.tsx
44797
+ // src/client/motion.tsx
44753
44798
  const EASING = "cubic-bezier(.22,1,.36,1)";
44754
44799
  function useMotionAllowed(enabled) {
44755
44800
  const [reduced, setReduced] = (0, react.useState)(() => window.matchMedia("(prefers-reduced-motion: reduce)").matches);
@@ -45397,8 +45442,7 @@ ${trimmed}
45397
45442
  }, [])
45398
45443
  };
45399
45444
  }
45400
- //#endregion
45401
- //#region src/client/fold-choreography.ts
45445
+ // src/client/fold-choreography.ts
45402
45446
  /** Presentation clock, not model/network time. */
45403
45447
  const FOLD_TIMING = {
45404
45448
  collapse: 320,
@@ -45462,8 +45506,7 @@ ${trimmed}
45462
45506
  const users = new Set(before.filter((item) => item.kind === "user").map((item) => item.key));
45463
45507
  return after.some((item) => item.kind === "user" && !users.has(item.key));
45464
45508
  }
45465
- //#endregion
45466
- //#region src/client/LiveFold.tsx
45509
+ // src/client/LiveFold.tsx
45467
45510
  /** Values are presentation commits, never live network counters. */
45468
45511
  function SubtleNumberRoll({ value, motion }) {
45469
45512
  const [outgoing, setOutgoing] = (0, react.useState)(null);
@@ -45527,8 +45570,7 @@ ${trimmed}
45527
45570
  }, part.text))
45528
45571
  });
45529
45572
  }
45530
- //#endregion
45531
- //#region src/client/projection.ts
45573
+ // src/client/projection.ts
45532
45574
  function groupNodes(order, get) {
45533
45575
  const groups = [];
45534
45576
  const seenTurns = /* @__PURE__ */ new Set();
@@ -45637,8 +45679,7 @@ ${trimmed}
45637
45679
  if (typeof seq === "number" && Number.isFinite(seq)) return seq;
45638
45680
  }
45639
45681
  }
45640
- //#endregion
45641
- //#region src/client/AssistantNode.tsx
45682
+ // src/client/AssistantNode.tsx
45642
45683
  function isNode$1(node, kind) {
45643
45684
  return node.kind === kind;
45644
45685
  }
@@ -45736,8 +45777,7 @@ ${trimmed}
45736
45777
  })] }, part.start);
45737
45778
  }) });
45738
45779
  });
45739
- //#endregion
45740
- //#region src/client/native/tool-call-model.ts
45780
+ // src/client/native/tool-call-model.ts
45741
45781
  /**
45742
45782
  * Pure row-model derivation for tool summary rows: variant classification,
45743
45783
  * one-line summary, expanded-body text, and flattened result output from the
@@ -45927,8 +45967,7 @@ ${trimmed}
45927
45967
  state
45928
45968
  };
45929
45969
  }
45930
- //#endregion
45931
- //#region src/client/ToolActivity.tsx
45970
+ // src/client/ToolActivity.tsx
45932
45971
  const LABEL = {
45933
45972
  preparing: "输入生成中",
45934
45973
  running: "执行中",
@@ -46529,8 +46568,7 @@ ${trimmed}
46529
46568
  depth: depth + 1
46530
46569
  }, child.callId))] });
46531
46570
  }
46532
- //#endregion
46533
- //#region src/client/open-file.ts
46571
+ // src/client/open-file.ts
46534
46572
  function deliverableOpenModeOf(value) {
46535
46573
  return value === "sidebar" ? "sidebar" : "external";
46536
46574
  }
@@ -46585,8 +46623,7 @@ ${trimmed}
46585
46623
  await args.openExternal(targetPath);
46586
46624
  return "external";
46587
46625
  }
46588
- //#endregion
46589
- //#region src/client/pending-submission.ts
46626
+ // src/client/pending-submission.ts
46590
46627
  function asReadonlyArray(value) {
46591
46628
  return Array.isArray(value) ? value : [];
46592
46629
  }
@@ -46608,8 +46645,7 @@ ${trimmed}
46608
46645
  }
46609
46646
  return [];
46610
46647
  }
46611
- //#endregion
46612
- //#region src/client/WaitClock.tsx
46648
+ // src/client/WaitClock.tsx
46613
46649
  /** Past this, a wait stops being a pause and reads as the model not answering. */
46614
46650
  const WAIT_OVERTIME_MS = 1e4;
46615
46651
  /**
@@ -46646,8 +46682,7 @@ ${trimmed}
46646
46682
  })]
46647
46683
  });
46648
46684
  }
46649
- //#endregion
46650
- //#region src/client/WaitingStatus.tsx
46685
+ // src/client/WaitingStatus.tsx
46651
46686
  function WaitingStatus({ anchor, label }) {
46652
46687
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
46653
46688
  className: Reader_module_css_default.turnStatus,
@@ -46661,8 +46696,7 @@ ${trimmed}
46661
46696
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WaitClock, { startTime: anchor.time }, anchor.key)]
46662
46697
  });
46663
46698
  }
46664
- //#endregion
46665
- //#region src/client/waiting-clock.ts
46699
+ // src/client/waiting-clock.ts
46666
46700
  const timestamp = (value) => typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : null;
46667
46701
  /**
46668
46702
  * Chat-layer kinds that hand the turn back to the model unconditionally.
@@ -46736,8 +46770,7 @@ ${trimmed}
46736
46770
  }
46737
46771
  return anchor;
46738
46772
  }
46739
- //#endregion
46740
- //#region src/client/native/ReferenceIcon.tsx
46773
+ // src/client/native/ReferenceIcon.tsx
46741
46774
  /**
46742
46775
  * Render the icon that identifies one inline reference domain.
46743
46776
  * @param props - Reference kind, optional size, and optional CSS class.
@@ -46767,8 +46800,7 @@ ${trimmed}
46767
46800
  });
46768
46801
  }
46769
46802
  }
46770
- //#endregion
46771
- //#region \0dshx-css-module:ContextBody.module.css.mjs
46803
+ // \0dshx-css-module:/home/runner/work/dsh-better-display/dsh-better-display/src/client/native/ContextBody.module.css.mjs
46772
46804
  const css$3 = ".O-IYlG_text{color:var(--dsw-alias-label-secondary);font:inherit;white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.O-IYlG_fields{border-top:1px solid var(--dsw-alias-line-secondary);flex-direction:column;gap:2px;margin:8px 0 0;padding-top:8px;display:flex}.O-IYlG_field{gap:8px;min-width:0;display:flex}.O-IYlG_fieldKey{min-width:96px;color:var(--dsw-alias-label-caption);flex:none}.O-IYlG_fieldValue{min-width:0;color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;flex:auto;margin:0}.O-IYlG_files{flex-wrap:wrap;gap:4px 12px;margin:0 0 8px;padding:0;list-style:none;display:flex}.O-IYlG_file{align-items:baseline;gap:6px;min-width:0;display:flex}.O-IYlG_filePath{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere}.O-IYlG_fileAction{color:var(--dsw-alias-label-caption)}.O-IYlG_catalogNotice{color:var(--dsw-alias-label-caption);margin:0 0 6px}.O-IYlG_entries{flex-direction:column;gap:4px;margin:0;padding:0;list-style:none;display:flex}.O-IYlG_entry{gap:8px;min-width:0;display:flex}.O-IYlG_entryName{color:var(--dsw-alias-label-secondary);flex:none}.O-IYlG_entryDescription{min-width:0;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:auto;overflow:hidden}.O-IYlG_sections{flex-direction:column;gap:8px;margin:0;display:flex}.O-IYlG_section{flex-direction:column;gap:2px;min-width:0;display:flex}.O-IYlG_sectionName{color:var(--dsw-alias-label-caption)}.O-IYlG_sectionText{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.O-IYlG_relaySender{color:var(--dsw-alias-label-caption);overflow-wrap:anywhere;margin:0 0 6px}.O-IYlG_recalls{flex-direction:column;gap:2px;margin:0 0 8px;padding:0;list-style:none;display:flex}.O-IYlG_recall{gap:8px;min-width:0;display:flex}.O-IYlG_recallLabel{color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere}.O-IYlG_recallCounts{color:var(--dsw-alias-label-caption);flex:none}";
46773
46805
  const tagId$3 = "dsh-better-display/ContextBody.module.css";
46774
46806
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
@@ -46803,8 +46835,7 @@ ${trimmed}
46803
46835
  "sectionText": "O-IYlG_sectionText",
46804
46836
  "text": "O-IYlG_text"
46805
46837
  };
46806
- //#endregion
46807
- //#region src/client/native/ContextBody.tsx
46838
+ // src/client/native/ContextBody.tsx
46808
46839
  /** Model-facing text stays bounded at the disclosure, not at the producer. */
46809
46840
  const MAX_CHARS = 2e4;
46810
46841
  /** Rows a list body materializes before summarizing the remainder. */
@@ -47324,8 +47355,7 @@ ${trimmed}
47324
47355
  default: throw new Error(`unreachable context form: ${String(form)}`);
47325
47356
  }
47326
47357
  }
47327
- //#endregion
47328
- //#region src/client/native/tool-update.ts
47358
+ // src/client/native/tool-update.ts
47329
47359
  /**
47330
47360
  * Classify a context as the rc.2 tool-update row.
47331
47361
  * Mixed or empty content stays on the generic injection presentation.
@@ -47349,8 +47379,7 @@ ${trimmed}
47349
47379
  single: rows.length === 1 ? rows[0] : null
47350
47380
  };
47351
47381
  }
47352
- //#endregion
47353
- //#region \0dshx-css-module:ContextInjectionRow.module.css.mjs
47382
+ // \0dshx-css-module:/home/runner/work/dsh-better-display/dsh-better-display/src/client/native/ContextInjectionRow.module.css.mjs
47354
47383
  const css$2 = ".QsaPka_root{min-width:0}.QsaPka_root[data-open]{padding-bottom:4px}.QsaPka_chevron{color:var(--dsw-alias-label-secondary)}.QsaPka_sep{background:var(--dsw-alias-label-caption);border-radius:1px;flex:none;width:2px;height:2px;margin:0 8px}.QsaPka_source{min-width:0;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:none;font-size:14px;line-height:24px;overflow:hidden}.QsaPka_summary{min-width:0;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:auto;font-size:14px;line-height:24px;overflow:hidden}.QsaPka_body{box-sizing:border-box;background:var(--dsw-alias-markdown-code-block);width:calc(100% - 22px);max-height:141px;color:var(--dsw-alias-label-tertiary);font:400 11px/16px var(--ds-font-family-code);border:none;border-radius:8px;margin:4px 0 0 22px;padding:10px 16px 12px 12px;overflow:auto}.QsaPka_toolChanges{white-space:nowrap}";
47355
47384
  const tagId$2 = "dsh-better-display/ContextInjectionRow.module.css";
47356
47385
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
@@ -47369,8 +47398,7 @@ ${trimmed}
47369
47398
  "summary": "QsaPka_summary",
47370
47399
  "toolChanges": "QsaPka_toolChanges"
47371
47400
  };
47372
- //#endregion
47373
- //#region src/client/native/ContextInjectionRow.tsx
47401
+ // src/client/native/ContextInjectionRow.tsx
47374
47402
  /**
47375
47403
  * Render logged context with the Tool calls disclosure chrome from Figma.
47376
47404
  *
@@ -47449,8 +47477,7 @@ ${trimmed}
47449
47477
  })
47450
47478
  });
47451
47479
  }
47452
- //#endregion
47453
- //#region \0dshx-css-module:TimelineRail.module.css.mjs
47480
+ // \0dshx-css-module:/home/runner/work/dsh-better-display/dsh-better-display/src/client/TimelineRail.module.css.mjs
47454
47481
  const css$1 = ".oG8zJG_slot{z-index:10;pointer-events:none;height:0;position:sticky;top:0}.oG8zJG_frame{--turn-rail-band:calc(var(--dsh-conversation-viewport-height,100dvh) - var(--dsh-composer-height,152px));--turn-preview-height:100px;top:calc(var(--turn-rail-band) / 2);width:26px;height:min(var(--turn-natural-height), max(0px, calc(var(--turn-rail-band) - 64px)), 420px);cursor:pointer;pointer-events:auto;transition:height .22s cubic-bezier(.2,.8,.2,1);position:absolute;right:6px;transform:translateY(-50%)}.oG8zJG_scroller{overscroll-behavior:contain;scrollbar-width:none;position:absolute;inset:0;overflow-y:auto}.oG8zJG_scroller::-webkit-scrollbar{display:none}.oG8zJG_fadeTop{mask-image:linear-gradient(#0000 0,#000 24px 100%)}.oG8zJG_fadeBottom{mask-image:linear-gradient(#000 0 calc(100% - 24px),#0000 100%)}.oG8zJG_fadeTop.oG8zJG_fadeBottom{mask-image:linear-gradient(#0000 0,#000 24px calc(100% - 24px),#0000 100%)}.oG8zJG_marks{height:var(--turn-natural-height);position:relative}.oG8zJG_markPosition{top:calc(var(--turn-natural-position) + var(--turn-rail-inset));height:12px;transition:top .22s cubic-bezier(.2,.8,.2,1);position:absolute;left:0;right:0;transform:translateY(-50%)}.oG8zJG_mark{cursor:pointer;pointer-events:none;background:0 0;border:0;justify-content:flex-end;align-items:center;width:24px;padding:0;display:flex;position:absolute;inset:0 0 0 auto}.oG8zJG_tick{border-radius:2px;flex:none;transition:width .1s cubic-bezier(.16,1,.3,1),height .1s cubic-bezier(.16,1,.3,1),opacity .1s,background-color .14s}.oG8zJG_markBusy .oG8zJG_tick{animation:1s ease-in-out infinite alternate oG8zJG_markBusyPulse}@keyframes oG8zJG_markBusyPulse{0%{opacity:.4;width:8px}to{opacity:1;width:18px}}.oG8zJG_preview{top:clamp(0px, calc(var(--turn-natural-position) + var(--turn-rail-inset) - var(--turn-scroll-top,0px) - var(--turn-preview-height) / 2), calc(100% - var(--turn-preview-height)));box-sizing:border-box;width:min(280px,100cqw - 120px);max-height:var(--turn-preview-height);border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-base);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);pointer-events:none;z-index:40;border-radius:10px;padding:10px 12px;transition:top .14s cubic-bezier(.2,.8,.2,1);animation:.12s ease-out oG8zJG_previewFadeIn;position:absolute;right:calc(100% + 10px);overflow:hidden;box-shadow:0 4px 18px #0000001f}@keyframes oG8zJG_previewFadeIn{0%{opacity:0;transform:translate(4px)}to{opacity:1;transform:translate(0)}}.oG8zJG_previewPrompt{-webkit-line-clamp:2;text-overflow:ellipsis;word-break:break-word;-webkit-box-orient:vertical;font-size:12px;font-weight:500;line-height:18px;display:-webkit-box;overflow:hidden}.oG8zJG_previewResponse{color:var(--dsw-alias-label-tertiary);-webkit-line-clamp:2;text-overflow:ellipsis;word-break:break-word;-webkit-box-orient:vertical;margin-top:4px;font-size:11px;line-height:16px;display:-webkit-box;overflow:hidden}@media (width<=960px){.oG8zJG_slot{display:none!important}}";
47455
47482
  const tagId$1 = "dsh-better-display/TimelineRail.module.css";
47456
47483
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
@@ -47477,8 +47504,7 @@ ${trimmed}
47477
47504
  "slot": "oG8zJG_slot",
47478
47505
  "tick": "oG8zJG_tick"
47479
47506
  };
47480
- //#endregion
47481
- //#region src/client/TimelineRail.tsx
47507
+ // src/client/TimelineRail.tsx
47482
47508
  const TURN_SPACING_PX = 12;
47483
47509
  const RAIL_INSET_PX = 6;
47484
47510
  const FADE_PX = 24;
@@ -47695,8 +47721,7 @@ ${trimmed}
47695
47721
  function landTurn(row, scrollport, offsetPx = 24) {
47696
47722
  scrollport.scrollTop += flowTop(row, scrollport) - offsetPx;
47697
47723
  }
47698
- //#endregion
47699
- //#region src/client/timeline.ts
47724
+ // src/client/timeline.ts
47700
47725
  /**
47701
47726
  * Merge host turn outline with loaded navigation items and turn deliverables.
47702
47727
  * Guarantees strictly ascending turn order and dedupes entries.
@@ -47739,8 +47764,7 @@ ${trimmed}
47739
47764
  if (byTurn.size === 0) return [];
47740
47765
  return [...byTurn.values()].sort((a, b) => a.turn - b.turn);
47741
47766
  }
47742
- //#endregion
47743
- //#region src/client/live-turn.ts
47767
+ // src/client/live-turn.ts
47744
47768
  function liveFoldEnabled(boundary) {
47745
47769
  return boundary.status === "open";
47746
47770
  }
@@ -47950,8 +47974,7 @@ ${trimmed}
47950
47974
  after
47951
47975
  };
47952
47976
  }
47953
- //#endregion
47954
- //#region src/client/fold-intensity.ts
47977
+ // src/client/fold-intensity.ts
47955
47978
  function frostedGlassOf(state) {
47956
47979
  if (state && typeof state === "object" && "frostedGlass" in state) return state.frostedGlass === true;
47957
47980
  return state === true;
@@ -47962,8 +47985,7 @@ ${trimmed}
47962
47985
  function processOnlyFromIntensity(intensity) {
47963
47986
  return intensity === 2;
47964
47987
  }
47965
- //#endregion
47966
- //#region src/client/DiffPanel.tsx
47988
+ // src/client/DiffPanel.tsx
47967
47989
  /**
47968
47990
  * Reveals and withdraws its child by animating real height, in the plugin's own
47969
47991
  * motion language. Height is the animated property rather than transform because
@@ -48130,8 +48152,7 @@ ${trimmed}
48130
48152
  })
48131
48153
  })] });
48132
48154
  }
48133
- //#endregion
48134
- //#region src/client/StickyLane.tsx
48155
+ // src/client/StickyLane.tsx
48135
48156
  const MIN_LANE_PX = 40;
48136
48157
  const LaneOwnerContext = (0, react.createContext)(null);
48137
48158
  const ownersByRoot = /* @__PURE__ */ new WeakMap();
@@ -48247,8 +48268,7 @@ ${trimmed}
48247
48268
  children
48248
48269
  });
48249
48270
  }
48250
- //#endregion
48251
- //#region src/client/ChoreographedFlow.tsx
48271
+ // src/client/ChoreographedFlow.tsx
48252
48272
  const FlowSnapshot = (0, react.createContext)(null);
48253
48273
  /** Public projection only. Descendants cannot leak live data through a frozen frame. */
48254
48274
  const useFlowChat = (selector) => {
@@ -48543,8 +48563,7 @@ ${trimmed}
48543
48563
  })
48544
48564
  });
48545
48565
  }
48546
- //#endregion
48547
- //#region src/client/ClosedProcessSummary.tsx
48566
+ // src/client/ClosedProcessSummary.tsx
48548
48567
  /** Keep process counts discoverable after the live-fold presentation retires. */
48549
48568
  function ClosedProcessSummary({ steps, open, onChange, controls }) {
48550
48569
  const button = (0, react.useRef)(null);
@@ -48574,8 +48593,7 @@ ${trimmed}
48574
48593
  })
48575
48594
  });
48576
48595
  }
48577
- //#endregion
48578
- //#region src/client/Reader.tsx
48596
+ // src/client/Reader.tsx
48579
48597
  function isNode(node, kind) {
48580
48598
  return node.kind === kind;
48581
48599
  }
@@ -48792,21 +48810,17 @@ ${trimmed}
48792
48810
  const owner = {
48793
48811
  cwd: render.cwd,
48794
48812
  openFile: render.openFile ?? (() => {}),
48795
- openSkill: () => {},
48796
48813
  forkAt: render.forkAt ?? (() => {}),
48797
48814
  inspectCall: (callId) => official.openView("trajectory", callId),
48798
48815
  loadImage: official.officialImageLoader,
48799
- renderMessageImages: (images) => official.renderSlot(OFFICIAL_SEATS.images, {
48800
- ...images,
48801
- loadImage: official.officialImageLoader
48802
- }),
48803
48816
  fileMentions: official.officialFileMentions,
48804
48817
  sessionId: render.sessionId
48805
48818
  };
48806
48819
  const options = {
48807
48820
  hookContext: {
48808
48821
  turnData: turn?.data,
48809
- disclosureReset
48822
+ disclosureReset,
48823
+ useGroupAction: readerGroupAction
48810
48824
  },
48811
48825
  fallback
48812
48826
  };
@@ -49842,8 +49856,7 @@ ${trimmed}
49842
49856
  }) })
49843
49857
  });
49844
49858
  }
49845
- //#endregion
49846
- //#region src/client/store.ts
49859
+ // src/client/store.ts
49847
49860
  function applyFoldIntensity(draft, value) {
49848
49861
  draft.foldIntensity = value;
49849
49862
  draft.autoFold = autoFoldFromIntensity(value);
@@ -49886,8 +49899,7 @@ ${trimmed}
49886
49899
  }
49887
49900
  });
49888
49901
  }
49889
- //#endregion
49890
- //#region src/client/entry-policy.ts
49902
+ // src/client/entry-policy.ts
49891
49903
  /** Select the reading view on entry, without fighting a later explicit tab choice. */
49892
49904
  var ReaderEntryPolicy = class {
49893
49905
  requested;
@@ -49910,8 +49922,7 @@ ${trimmed}
49910
49922
  const value = new URLSearchParams(search).get("reader");
49911
49923
  return value === "1" || /^0\.1\.0-trial\.\d+$/.test(value ?? "");
49912
49924
  }
49913
- //#endregion
49914
- //#region src/client/entry.tsx
49925
+ // src/client/entry.tsx
49915
49926
  function isConversationStore(store) {
49916
49927
  return typeof store === "object" && store !== null && store.spec.persist === "dsh.conversation" && typeof store.spec.actions.setView === "function";
49917
49928
  }
@@ -49943,8 +49954,7 @@ ${trimmed}
49943
49954
  inject: () => ({ policy })
49944
49955
  }, ReaderEntry);
49945
49956
  }
49946
- //#endregion
49947
- //#region src/client/settings-copy.ts
49957
+ // src/client/settings-copy.ts
49948
49958
  const en = {
49949
49959
  nav: "Better Display",
49950
49960
  openTitle: "Open deliverables in built-in panel",
@@ -49993,8 +50003,7 @@ ${trimmed}
49993
50003
  function settingsCopyFor(tag) {
49994
50004
  return settingsLanguage(tag) === "zh" ? zh : en;
49995
50005
  }
49996
- //#endregion
49997
- //#region src/skill-status.ts
50006
+ // src/skill-status.ts
49998
50007
  /** Shared generative-mcpapps identity. Plugin-tree presence is not installation. */
49999
50008
  const GENERATIVE_MCPAPPS_SKILL = "generative-mcpapps";
50000
50009
  /** Conventional relative roots only. Never expand $HOME or dump host `root.path`. */
@@ -50038,8 +50047,7 @@ ${trimmed}
50038
50047
  roots: publicSkillRoots()
50039
50048
  };
50040
50049
  }
50041
- //#endregion
50042
- //#region src/client/skill-status.ts
50050
+ // src/client/skill-status.ts
50043
50051
  async function detectGenerativeMcpappsSkill(probe) {
50044
50052
  let host;
50045
50053
  if (probe.fetchHostStatus) try {
@@ -50073,8 +50081,7 @@ ${trimmed}
50073
50081
  if (list?.ids && list.ids.length > 0) return list.ids[0];
50074
50082
  return (list?.byId ? Object.keys(list.byId) : [])[0];
50075
50083
  }
50076
- //#endregion
50077
- //#region \0dshx-css-module:SettingsSection.module.css.mjs
50084
+ // \0dshx-css-module:/home/runner/work/dsh-better-display/dsh-better-display/src/client/SettingsSection.module.css.mjs
50078
50085
  const css = ".fiqtMa_section{flex-direction:column;gap:28px;width:100%;max-width:720px;display:flex}.fiqtMa_row{border-bottom:.5px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:16px 0;display:flex}.fiqtMa_rowText{flex-direction:column;flex:1;gap:4px;min-width:0;padding-right:24px;display:flex}.fiqtMa_title{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}.fiqtMa_desc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.fiqtMa_switch{background:var(--dsw-alias-bg-module-platform);cursor:pointer;border:none;border-radius:12px;flex:none;width:40px;height:24px;padding:0;position:relative}.fiqtMa_switch:after{content:\"\";background:var(--dsw-alias-label-primary);border-radius:50%;width:18px;height:18px;transition:transform .16s;position:absolute;top:3px;left:3px}.fiqtMa_switch[data-on]:after{transform:translate(16px)}.fiqtMa_switch[data-on]{background:var(--dsw-alias-state-business-primary)}.fiqtMa_block{flex-direction:column;gap:10px;display:flex}.fiqtMa_status{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;font-size:13px;line-height:20px;display:inline-flex}.fiqtMa_badge{background:var(--dsw-alias-bg-module-platform);height:22px;color:var(--dsw-alias-label-secondary);border-radius:11px;align-items:center;padding:0 8px;font-size:12px;display:inline-flex}.fiqtMa_badge[data-ok]{color:#059669;background:#10b98124}.fiqtMa_pre{background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);overflow-wrap:anywhere;white-space:pre-wrap;border-radius:8px;margin:0;padding:10px 12px;font-size:12px;line-height:18px}.fiqtMa_roots{color:var(--dsw-alias-label-tertiary);margin:0;padding-left:18px;font-size:12px;line-height:18px}.fiqtMa_actions{gap:8px;display:flex}.fiqtMa_button{border:.5px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);height:32px;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;border-radius:8px;padding:0 12px;font-size:13px}.fiqtMa_button:hover{background:var(--dsw-alias-interactive-bg-hover)}.fiqtMa_button:disabled{opacity:.6;cursor:default}.fiqtMa_segment{background:var(--dsw-alias-bg-module-platform);border-radius:10px;gap:2px;width:100%;margin-top:8px;padding:2px;display:flex}.fiqtMa_segmentStop{min-width:0;height:32px;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:8px;flex:1 1 0;padding:0 8px;font-size:12px;line-height:18px}.fiqtMa_segmentStop[data-on]{background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary);box-shadow:0 0 0 .5px var(--dsw-alias-border-l2)}.fiqtMa_slider{width:100%;accent-color:var(--dsw-alias-state-business-primary);margin:10px 0 0}";
50079
50086
  const tagId = "dsh-better-display/SettingsSection.module.css";
50080
50087
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
@@ -50102,8 +50109,7 @@ ${trimmed}
50102
50109
  "switch": "fiqtMa_switch",
50103
50110
  "title": "fiqtMa_title"
50104
50111
  };
50105
- //#endregion
50106
- //#region src/client/SettingsSection.tsx
50112
+ // src/client/SettingsSection.tsx
50107
50113
  function text(props, copy, key) {
50108
50114
  if (typeof props.t === "function") try {
50109
50115
  const value = props.t(key);
@@ -50272,8 +50278,7 @@ ${trimmed}
50272
50278
  ]
50273
50279
  });
50274
50280
  }
50275
- //#endregion
50276
- //#region src/client/settings.tsx
50281
+ // src/client/settings.tsx
50277
50282
  function languageTag(ctx) {
50278
50283
  const snap = (ctx.get?.("locale") ?? ctx.locale)?.getSnapshot?.();
50279
50284
  return snap?.locale ?? snap?.language ?? (typeof document !== "undefined" ? document.documentElement.lang : void 0) ?? (typeof navigator !== "undefined" ? navigator.language : void 0);
@@ -50320,8 +50325,7 @@ ${trimmed}
50320
50325
  inject: injected
50321
50326
  }, SettingsSection));
50322
50327
  }
50323
- //#endregion
50324
- //#region src/client/index.tsx
50328
+ // src/client/index.tsx
50325
50329
  const officialFileAddressFor = fileAddressFor$1;
50326
50330
  async function openWorkspacePath(ctx, path) {
50327
50331
  const remoteSession = ctx.remote?.session ?? ctx.get?.("remote.session") ?? (ctx.get?.("remote"))?.session;
@@ -50497,7 +50501,6 @@ ${trimmed}
50497
50501
  yield installReaderEntry(ctx);
50498
50502
  });
50499
50503
  }
50500
- //#endregion
50501
50504
  exports.McpAppFrame = McpAppFrame;
50502
50505
  exports.TEXT_TRANSFORM_SERVICE = TEXT_TRANSFORM_SERVICE;
50503
50506
  exports.apply = apply;