dsh-context 0.59.2 → 0.61.0

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
@@ -107,6 +107,7 @@ window.__ModuleLoader__.load({
107
107
  "insightsEntry.hide": "隐藏",
108
108
  "settings.gran": "趋势图 · 默认粒度",
109
109
  "settings.mode": "趋势图 · 默认展示方式",
110
+ "settings.deltaBase": "上下文浏览器 · 对比基线",
110
111
  "settings.toolSort": "工具定义 · 默认排序",
111
112
  "settings.fileSort": "文件活动 · 默认排序",
112
113
  "settings.expand": "展开",
@@ -118,6 +119,9 @@ window.__ModuleLoader__.load({
118
119
  "trend.focus": "仅展示 {cat}",
119
120
  "trend.adaptive": "自适应",
120
121
  "trend.adaptiveHint": "按当前可视范围内的柱子重新缩放高度,滚动时随之变化",
122
+ "trend.dna": "DNA 模式",
123
+ "trend.dnaTip": "把每根柱子画成该次请求的上下文指纹:按模型读取顺序逐条铺色,配合增量模式逐条展示每次请求的增减;悬停查看条目,点击让上下文浏览器定位到该条目,同一条目在所有柱子中亮出其存续变化",
124
+ "trend.dnaItem": "{label}:{n}",
121
125
  "trend.empty": "发起一轮对话后,这里会展示每次模型请求的上下文构成",
122
126
  "detail.step": "第 {t} 轮 · 第 {s} 步 (共 {n} 步)",
123
127
  "detail.turn": "第 {t} 轮 · 共 {n} 步",
@@ -279,7 +283,9 @@ window.__ModuleLoader__.load({
279
283
  "browser.items": "{n} 项",
280
284
  "browser.missingLive": "… 另有 {n} 条更早的消息也在上下文中(超出展示窗口)",
281
285
  "browser.approx": "该步骤涉及的部分已移除消息超出保留范围,以下为近似构成",
282
- "browser.deltaHint": "对比上轮末步的变动",
286
+ "browser.base.step": "比前步",
287
+ "browser.base.turn": "比前轮",
288
+ "browser.base.tip": "变动对比的基线:比前步=与上一步对比;比前轮=与上一轮最后一步对比(首轮无基线,全部计为变动)",
283
289
  "browser.dna": "DNA 模式",
284
290
  "browser.dnaTip": "按模型读取上下文的次序逐条展示每一项:系统提示词、工具定义,然后是按时间排列的消息;悬停查看条目,点击定位到下方列表",
285
291
  "browser.noHeader": "此数据来自旧版插件:仅提供 token 估算,无实际内容",
@@ -290,8 +296,12 @@ window.__ModuleLoader__.load({
290
296
  "browser.search.user": "按消息内容过滤…",
291
297
  "browser.search.inject": "按注入内容过滤…",
292
298
  "browser.search.skill": "按技能过滤…",
293
- "browser.search.assistant": "按回复或调用过滤…",
299
+ "browser.search.assistant": "按回复、调用或思考过滤…",
294
300
  "browser.search.tool": "按工具或参数过滤…",
301
+ "browser.kind.think": "思考",
302
+ "browser.kind.tool": "工具",
303
+ "browser.kind.answer": "回答",
304
+ "browser.kindTip": "按内容种类过滤回复:思考、工具调用、回答文本",
295
305
  "browser.rowNoMatch": "没有匹配当前过滤条件的行",
296
306
  "browser.loading": "正在从更早的会话历史加载完整内容…",
297
307
  "browser.notInLog": "会话日志中未找到该条目的完整内容(可能已被压缩或清理)",
@@ -494,6 +504,7 @@ window.__ModuleLoader__.load({
494
504
  "insightsEntry.hide": "Hide",
495
505
  "settings.gran": "Trend Chart · Default granularity",
496
506
  "settings.mode": "Trend Chart · Default display",
507
+ "settings.deltaBase": "Context Browser · Diff baseline",
497
508
  "settings.toolSort": "Tool Schemas · Default sort",
498
509
  "settings.fileSort": "File Activity · Default sort",
499
510
  "settings.expand": "Expand",
@@ -505,6 +516,9 @@ window.__ModuleLoader__.load({
505
516
  "trend.focus": "Showing {cat} only",
506
517
  "trend.adaptive": "Adaptive",
507
518
  "trend.adaptiveHint": "Rescale bar heights to the visible range, following the scroll",
519
+ "trend.dna": "DNA Mode",
520
+ "trend.dnaTip": "Draw each bar as that request’s context fingerprint — one band per item in the order the model reads it; with Delta, each band shows that item’s change against the previous bar. Hover for the item, click to reveal it in the Context browser, and every bar lights the same item’s lifetime",
521
+ "trend.dnaItem": "{label}: {n}",
508
522
  "trend.empty": "Send a message and each model request’s context makeup shows up here",
509
523
  "detail.step": "Turn {t} · Step {s} of {n}",
510
524
  "detail.turn": "Turn {t} · {n} steps",
@@ -666,7 +680,9 @@ window.__ModuleLoader__.load({
666
680
  "browser.items": "{n} Items",
667
681
  "browser.missingLive": "… {n} earlier messages are also part of the context (outside the served window)",
668
682
  "browser.approx": "Some removed messages of this step exceed retention — the makeup below is approximate",
669
- "browser.deltaHint": "vs previous turn",
683
+ "browser.base.step": "prev step",
684
+ "browser.base.turn": "prev turn",
685
+ "browser.base.tip": "Diff baseline: the previous step, or the previous turn’s last step — with no predecessor, everything counts as change",
670
686
  "browser.dna": "DNA Mode",
671
687
  "browser.dnaTip": "One band per item in the order the model reads the context — system prompt, tool schemas, then messages chronologically; hover for details, click to open its row below",
672
688
  "browser.noHeader": "Served by an older plugin build: token estimates only, no content",
@@ -677,8 +693,12 @@ window.__ModuleLoader__.load({
677
693
  "browser.search.user": "Filter by message text…",
678
694
  "browser.search.inject": "Filter injected context…",
679
695
  "browser.search.skill": "Filter skills…",
680
- "browser.search.assistant": "Filter by reply or calls…",
696
+ "browser.search.assistant": "Filter by reply, calls, or thinking…",
681
697
  "browser.search.tool": "Filter by tool or arguments…",
698
+ "browser.kind.think": "Thinking",
699
+ "browser.kind.tool": "Tools",
700
+ "browser.kind.answer": "Answer",
701
+ "browser.kindTip": "Filter replies by content kind: thinking, tool calls, or answer text",
682
702
  "browser.rowNoMatch": "No rows match the current filter",
683
703
  "browser.loading": "Loading full content from older session history…",
684
704
  "browser.notInLog": "This item is not in the session log anymore (it may have been compacted away or cleared)",
@@ -708,7 +728,7 @@ window.__ModuleLoader__.load({
708
728
  "rich.md.copied": "Copied",
709
729
  "rich.md.footnotes": "Footnotes",
710
730
  "block.thinking": "Reasoning",
711
- "block.answer": "Response",
731
+ "block.answer": "Answer",
712
732
  "block.content": "Content",
713
733
  "block.result": "Result",
714
734
  "block.summary": "Summary",
@@ -818,13 +838,19 @@ window.__ModuleLoader__.load({
818
838
  * package.json `icon` hands to the Host's package-meta reader, which serves
819
839
  * it to the Plugins page's package cards. The client bundle inlines the
820
840
  * file's markup at build time (the `?raw` channel in tsdown.config.ts) and
821
- * re-renders it at every requested size. Fixed fills, never `currentColor` —
822
- * the sheet is deliberately polychrome on both light and dark chrome.
841
+ * re-renders it at every requested size. The identity seats (tab chip,
842
+ * command, sidebar registration, panel head) keep the sheet's fixed fills —
843
+ * deliberately polychrome on both light and dark chrome — while the
844
+ * sidebar-foot entry seat (overviewButton.tsx) opts into `mono`, trading
845
+ * every fill for `currentColor` so the glyph sits quietly beside the
846
+ * harness's own footer rows (Settings and friends).
823
847
  */
824
848
  /** Everything between the file's `<svg>` tags: the sheet's strokes in paint order, whitespace-folded. */
825
849
  const SHEET_MARKUP = icon_default.slice(icon_default.indexOf(">") + 1, icon_default.lastIndexOf("</svg>")).trim().replace(/>\s+</g, "><");
826
- /** The colourful document sheet at the requested square edge. */
827
- function ContextIcon({ size = 20, className }) {
850
+ /** The mono seat's strokes: same geometry, every palette fill traded for the surrounding text colour. */
851
+ const SHEET_MARKUP_MONO = SHEET_MARKUP.replace(/fill="#[0-9A-Fa-f]{6}"/g, "fill=\"currentColor\"");
852
+ /** The document sheet at the requested square edge — polychrome by default, text-coloured in `mono`. */
853
+ function ContextIcon({ size = 20, className, mono = false }) {
828
854
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
829
855
  width: size,
830
856
  height: size,
@@ -832,7 +858,7 @@ window.__ModuleLoader__.load({
832
858
  className,
833
859
  "aria-hidden": "true",
834
860
  xmlns: "http://www.w3.org/2000/svg",
835
- dangerouslySetInnerHTML: { __html: SHEET_MARKUP }
861
+ dangerouslySetInnerHTML: { __html: mono ? SHEET_MARKUP_MONO : SHEET_MARKUP }
836
862
  });
837
863
  }
838
864
  /**
@@ -2179,6 +2205,15 @@ window.__ModuleLoader__.load({
2179
2205
  * stops the trailing until the head moves again. With no detail at all,
2180
2206
  * failure surfaces as a retryable note on the detail cards instead of an
2181
2207
  * empty chart.
2208
+ *
2209
+ * The cold start: a session can sit with NO pushed `contextTimeline` value
2210
+ * at all — the enable recomposition raced its open baseline (and the
2211
+ * projection store clears a key its baseline omits), or its checkpoint row
2212
+ * is missing or version-stale on a cold-observed session. Waiting for a
2213
+ * push that never comes would stall the view on "loading" forever, so the
2214
+ * source opens the detail channel on its own (rev 0): the route folds the
2215
+ * durable log on demand and serves the slim head beside the collections,
2216
+ * and the next pushed head takes the channel back per its own revision.
2182
2217
  */
2183
2218
  const DETAIL_ROUTE = "/api/dsh-context/detail";
2184
2219
  /**
@@ -2370,30 +2405,39 @@ window.__ModuleLoader__.load({
2370
2405
  const sessionId = typeof props.sessionId === "string" ? props.sessionId : "";
2371
2406
  const headRev = head !== null && typeof head.detailRev === "number" ? head.detailRev : null;
2372
2407
  const slim = headRev !== null;
2373
- const store = (0, react.useMemo)(() => slim ? detailStoreOf(ctx, sessionId) : null, [
2408
+ const cold = head === null;
2409
+ const store = (0, react.useMemo)(() => slim || cold ? detailStoreOf(ctx, sessionId) : null, [
2374
2410
  ctx,
2375
2411
  sessionId,
2376
- slim
2412
+ slim,
2413
+ cold
2377
2414
  ]);
2378
2415
  const snap = (0, react.useSyncExternalStore)(store !== null ? store.subscribe : noopSubscribe, store !== null ? store.getSnapshot : () => EMPTY_SNAP);
2379
2416
  (0, react.useEffect)(() => {
2380
- if (store !== null && headRev !== null) store.request(headRev);
2417
+ if (store !== null) store.request(headRev ?? 0);
2381
2418
  }, [store, headRev]);
2382
2419
  return (0, react.useMemo)(() => {
2383
- if (head === null) return {
2384
- data: null,
2385
- detailState: "loading",
2386
- retryDetail: noopRetry
2387
- };
2388
- if (!slim || store === null) return {
2420
+ const detail = snap.detail;
2421
+ const retry = store !== null ? store.retry : noopRetry;
2422
+ if (head !== null && !slim) return {
2389
2423
  data: head,
2390
2424
  detailState: "legacy",
2391
2425
  retryDetail: noopRetry
2392
2426
  };
2393
- const detail = snap.detail;
2427
+ const base = head !== null ? head : detail !== null ? detail.head ?? null : null;
2428
+ if (base === null) return {
2429
+ data: null,
2430
+ detailState: store !== null && (snap.failed || detail !== null) ? "failed" : "loading",
2431
+ retryDetail: retry
2432
+ };
2433
+ if (detail === null) return {
2434
+ data: base,
2435
+ detailState: snap.failed ? "failed" : "loading",
2436
+ retryDetail: retry
2437
+ };
2394
2438
  return {
2395
- data: detail === null ? head : {
2396
- ...head,
2439
+ data: {
2440
+ ...base,
2397
2441
  requests: detail.requests,
2398
2442
  events: detail.events,
2399
2443
  nodes: detail.nodes,
@@ -2404,8 +2448,8 @@ window.__ModuleLoader__.load({
2404
2448
  ...detail.fileOps !== void 0 ? { fileOps: detail.fileOps } : {},
2405
2449
  ...detail.fileOpsFloor !== void 0 ? { fileOpsFloor: detail.fileOpsFloor } : {}
2406
2450
  },
2407
- detailState: detail !== null ? "ready" : snap.failed ? "failed" : "loading",
2408
- retryDetail: store.retry
2451
+ detailState: "ready",
2452
+ retryDetail: retry
2409
2453
  };
2410
2454
  }, [
2411
2455
  head,
@@ -2498,6 +2542,102 @@ window.__ModuleLoader__.load({
2498
2542
  });
2499
2543
  return items;
2500
2544
  }
2545
+ /** The per-bar bands behind a trend chart bar: read order, category colors, cumulative offsets. */
2546
+ function trendBandsOf(view) {
2547
+ const bands = [];
2548
+ let off = 0;
2549
+ for (const it of dnaOf(view)) {
2550
+ if ("node" in it) bands.push({
2551
+ key: it.key,
2552
+ cat: it.cat,
2553
+ tokens: it.tokens,
2554
+ off,
2555
+ color: CAT_COLOR[it.cat],
2556
+ node: it.node
2557
+ });
2558
+ else bands.push({
2559
+ key: it.key,
2560
+ cat: it.cat,
2561
+ tokens: it.tokens,
2562
+ off,
2563
+ color: CAT_COLOR[it.cat]
2564
+ });
2565
+ off += it.tokens;
2566
+ }
2567
+ return bands;
2568
+ }
2569
+ function deltaBandsOf(bands, prev) {
2570
+ if (prev === null) return {
2571
+ up: [],
2572
+ down: []
2573
+ };
2574
+ const before = new Map(prev.map((b) => [b.key, b.tokens]));
2575
+ const after = new Map(bands.map((b) => [b.key, b.tokens]));
2576
+ const up = [];
2577
+ const down = [];
2578
+ for (const b of bands) {
2579
+ const d = b.tokens - (before.get(b.key) ?? 0);
2580
+ if (d <= 0) continue;
2581
+ up.push("node" in b ? {
2582
+ key: b.key,
2583
+ cat: b.cat,
2584
+ tokens: d,
2585
+ off: 0,
2586
+ color: b.color,
2587
+ node: b.node
2588
+ } : {
2589
+ key: b.key,
2590
+ cat: b.cat,
2591
+ tokens: d,
2592
+ off: 0,
2593
+ color: b.color
2594
+ });
2595
+ }
2596
+ for (const b of prev) {
2597
+ const d = (after.get(b.key) ?? 0) - b.tokens;
2598
+ if (d >= 0) continue;
2599
+ down.push("node" in b ? {
2600
+ key: b.key,
2601
+ cat: b.cat,
2602
+ tokens: d,
2603
+ off: 0,
2604
+ color: b.color,
2605
+ node: b.node
2606
+ } : {
2607
+ key: b.key,
2608
+ cat: b.cat,
2609
+ tokens: d,
2610
+ off: 0,
2611
+ color: b.color
2612
+ });
2613
+ }
2614
+ let u = 0;
2615
+ for (const x of up) {
2616
+ x.off = u;
2617
+ u += x.tokens;
2618
+ }
2619
+ let dn = 0;
2620
+ for (const x of down) {
2621
+ x.off = dn;
2622
+ dn -= x.tokens;
2623
+ }
2624
+ return {
2625
+ up,
2626
+ down
2627
+ };
2628
+ }
2629
+ /**
2630
+ * The compact item name both DNA surfaces share — the browser appends the
2631
+ * item's time on top of it for its own tooltip, the trend chart does not.
2632
+ * Header bands name the system prompt / the tool schema; message bands name
2633
+ * the item the way its browser row would (skill name, tool name, injection
2634
+ * form, else the category label).
2635
+ */
2636
+ function dnaBaseLabel(b, t, catLabel) {
2637
+ if (!("node" in b)) return b.cat === "system" ? catLabel("system") : b.key.slice(5);
2638
+ const n = b.node;
2639
+ return n.skill !== void 0 ? t("node.skillTag", { name: n.skill }) : n.cat === "tool" ? n.tool ?? "?" : n.cat === "inject" ? t("form." + (n.form || "context")) : catLabel(n.cat);
2640
+ }
2501
2641
  //#endregion
2502
2642
  //#region src/shared/fileOps.ts
2503
2643
  /** Parse a call's raw JSON arguments; non-string/malformed/non-record inputs yield null. */
@@ -2967,6 +3107,124 @@ window.__ModuleLoader__.load({
2967
3107
  out.net = net;
2968
3108
  return out;
2969
3109
  };
3110
+ const DnaBar = function DnaBar(props) {
3111
+ const visible = [];
3112
+ for (const b of props.bands) if (b.tokens > 0) visible.push(b);
3113
+ if (visible.length === 0) return null;
3114
+ const runs = [];
3115
+ for (const b of visible) {
3116
+ const from = Math.round(b.off / props.total * 1e4) / 100;
3117
+ const to = Math.round((b.off + b.tokens) / props.total * 1e4) / 100;
3118
+ const last = runs.length > 0 ? runs[runs.length - 1] : null;
3119
+ if (last !== null && last.color === b.color && last.to === from) last.to = to;
3120
+ else runs.push({
3121
+ color: b.color,
3122
+ from,
3123
+ to
3124
+ });
3125
+ }
3126
+ const hitAt = (e) => {
3127
+ const rect = e.currentTarget.getBoundingClientRect();
3128
+ const pos = (rect.height > 0 ? Math.min(1, Math.max(0, 1 - (e.clientY - rect.top) / rect.height)) : 0) * props.total;
3129
+ let hit = visible[0];
3130
+ for (const b of props.bands) {
3131
+ if (b.off > pos) break;
3132
+ if (b.tokens > 0) hit = b;
3133
+ }
3134
+ return hit;
3135
+ };
3136
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3137
+ className: "lc-bar-dna animate-lc-bar-in motion-reduce:animate-none",
3138
+ style: {
3139
+ height: `${Math.max(1, Math.round(props.total / props.maxTotal * CHART_H))}px`,
3140
+ background: "linear-gradient(to top, " + runs.map((r) => `${r.color} ${r.from}%, ${r.color} ${r.to}%`).join(", ") + ")",
3141
+ "--lc-i": Math.min(props.enterIndex, STAGGER_CAP)
3142
+ },
3143
+ onMouseMove: (e) => {
3144
+ props.onHit(hitAt(e).key);
3145
+ },
3146
+ onMouseLeave: () => {
3147
+ props.onHit(null);
3148
+ },
3149
+ onClick: (e) => {
3150
+ if (props.onPick !== void 0) props.onPick(props.seq, hitAt(e));
3151
+ }
3152
+ });
3153
+ };
3154
+ const DnaDeltaBar = function DnaDeltaBar(props) {
3155
+ let upSum = 0;
3156
+ for (const b of props.d.up) upSum += b.tokens;
3157
+ let downSum = 0;
3158
+ for (const b of props.d.down) downSum -= b.tokens;
3159
+ const gradSpan = upSum + downSum;
3160
+ if (gradSpan === 0) return null;
3161
+ const runs = [];
3162
+ const pushRun = (color, mag, at) => {
3163
+ const from = Math.round(at / gradSpan * 1e4) / 100;
3164
+ const to = Math.round((at + mag) / gradSpan * 1e4) / 100;
3165
+ const last = runs.length > 0 ? runs[runs.length - 1] : null;
3166
+ if (last !== null && last.color === color && last.to === from) last.to = to;
3167
+ else runs.push({
3168
+ color,
3169
+ from,
3170
+ to
3171
+ });
3172
+ return at + mag;
3173
+ };
3174
+ let acc = 0;
3175
+ for (let i = props.d.down.length - 1; i >= 0; i--) acc = pushRun(props.d.down[i].color, -props.d.down[i].tokens, acc);
3176
+ for (const b of props.d.up) acc = pushRun(b.color, b.tokens, acc);
3177
+ const height = Math.max(1, Math.round(gradSpan * props.scale));
3178
+ const hitAt = (e) => {
3179
+ const rect = e.currentTarget.getBoundingClientRect();
3180
+ const pos = (rect.height > 0 ? Math.min(1, Math.max(0, 1 - (e.clientY - rect.top) / rect.height)) : 0) * gradSpan - downSum;
3181
+ const useUp = pos >= 0 && props.d.up.length > 0;
3182
+ const arm = useUp ? props.d.up : props.d.down;
3183
+ const p = useUp ? pos : -pos;
3184
+ let hit = arm[0];
3185
+ for (const b of arm) {
3186
+ if (b.off > p) break;
3187
+ hit = b;
3188
+ }
3189
+ return hit;
3190
+ };
3191
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3192
+ className: "lc-bar-dna animate-lc-bar-in motion-reduce:animate-none",
3193
+ style: {
3194
+ position: "absolute",
3195
+ bottom: `${Math.round(props.zeroBottom - downSum * props.scale)}px`,
3196
+ height: `${height}px`,
3197
+ background: "linear-gradient(to top, " + runs.map((r) => `${r.color} ${r.from}%, ${r.color} ${r.to}%`).join(", ") + ")",
3198
+ transformOrigin: `50% ${Math.round(downSum / gradSpan * 1e4) / 100}%`,
3199
+ "--lc-i": Math.min(props.enterIndex, STAGGER_CAP)
3200
+ },
3201
+ onMouseMove: (e) => {
3202
+ props.onHit(hitAt(e).key);
3203
+ },
3204
+ onMouseLeave: () => {
3205
+ props.onHit(null);
3206
+ },
3207
+ onClick: (e) => {
3208
+ if (props.onPick !== void 0) props.onPick(props.seq, hitAt(e));
3209
+ }
3210
+ });
3211
+ };
3212
+ const DnaHighlights = (0, react.memo)(function DnaHighlights(props) {
3213
+ if (props.slices === null) return null;
3214
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3215
+ className: "lc-dna-hl",
3216
+ children: props.slices.map((s, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3217
+ className: "lc-dna-cell",
3218
+ children: s !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3219
+ className: "lc-dna-slice",
3220
+ style: {
3221
+ bottom: `${s.bottom}px`,
3222
+ height: `${s.height}px`
3223
+ }
3224
+ }) : null
3225
+ }, i))
3226
+ });
3227
+ });
2970
3228
  const ChartBar = (0, react.memo)(function ChartBar(props) {
2971
3229
  const { req, marker } = props;
2972
3230
  const markerAt = marker !== void 0 ? eventAt(marker) : null;
@@ -2996,7 +3254,23 @@ window.__ModuleLoader__.load({
2996
3254
  title: "✂ " + (markerAt !== null ? markerAt + " — " : "") + eventLabel(marker),
2997
3255
  children: "✂"
2998
3256
  }) : null,
2999
- diverge ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3257
+ props.dna !== null ? props.dnaDelta !== null && props.dnaScale !== void 0 && props.zeroBottom !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DnaDeltaBar, {
3258
+ d: props.dnaDelta,
3259
+ scale: props.dnaScale,
3260
+ zeroBottom: props.zeroBottom,
3261
+ enterIndex: props.enterIndex,
3262
+ seq: req.seq,
3263
+ onHit: props.onDnaHit,
3264
+ onPick: props.onPickBand
3265
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DnaBar, {
3266
+ bands: props.dna,
3267
+ total: req.total,
3268
+ maxTotal: props.maxTotal,
3269
+ enterIndex: props.enterIndex,
3270
+ seq: req.seq,
3271
+ onHit: props.onDnaHit,
3272
+ onPick: props.onPickBand
3273
+ }) : diverge ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3000
3274
  className: "lc-bar-up animate-lc-bar-in motion-reduce:animate-none",
3001
3275
  style: {
3002
3276
  bottom: `${props.downPx}px`,
@@ -3052,8 +3326,13 @@ window.__ModuleLoader__.load({
3052
3326
  });
3053
3327
  });
3054
3328
  return function TrendChart(props) {
3329
+ const dnaBands = props.dna ?? null;
3330
+ const dnaOn = dnaBands !== null;
3055
3331
  const delta = props.mode === "delta";
3056
- const focus = props.focusCat !== null && props.focusCat !== void 0 && CATS.some((c) => c.key === props.focusCat) ? props.focusCat : null;
3332
+ const dnaDeltaOn = dnaOn && delta;
3333
+ const focus = !dnaOn && props.focusCat !== null && props.focusCat !== void 0 && CATS.some((c) => c.key === props.focusCat) ? props.focusCat : null;
3334
+ const [dnaHit, setDnaHit] = (0, react.useState)(null);
3335
+ const dnaDeltas = (0, react.useMemo)(() => dnaDeltaOn ? dnaBands.map((bands, i) => deltaBandsOf(bands, i > 0 ? dnaBands[i - 1] : null)) : null, [dnaDeltaOn, dnaBands]);
3057
3336
  const requests = (0, react.useMemo)(() => {
3058
3337
  const base = focus !== null ? props.requests.map((req) => focusOf(req, focus)) : props.requests;
3059
3338
  return delta ? base.map((req, i) => deltaOf(req, i > 0 ? base[i - 1] : null)) : base;
@@ -3081,7 +3360,14 @@ window.__ModuleLoader__.load({
3081
3360
  const col = i * pitch;
3082
3361
  if (col >= vr || col + BAR_W <= sl) continue;
3083
3362
  const req = requests[i];
3084
- if (delta) {
3363
+ if (dnaDeltaOn && dnaDeltas !== null) {
3364
+ let bu = 0;
3365
+ let bd = 0;
3366
+ for (const b of dnaDeltas[i].up) bu += b.tokens;
3367
+ for (const b of dnaDeltas[i].down) bd -= b.tokens;
3368
+ if (bu > up) up = bu;
3369
+ if (bd > down) down = bd;
3370
+ } else if (delta) {
3085
3371
  let bu = 0;
3086
3372
  let bd = 0;
3087
3373
  for (const c of CATS) {
@@ -3102,7 +3388,15 @@ window.__ModuleLoader__.load({
3102
3388
  let maxTotal = 1;
3103
3389
  let maxUp = 0;
3104
3390
  let maxDown = 0;
3105
- if (delta) for (const req of requests) {
3391
+ if (dnaDeltaOn && dnaDeltas !== null) for (const d of dnaDeltas) {
3392
+ let up = 0;
3393
+ let down = 0;
3394
+ for (const b of d.up) up += b.tokens;
3395
+ for (const b of d.down) down -= b.tokens;
3396
+ if (up > maxUp) maxUp = up;
3397
+ if (down > maxDown) maxDown = down;
3398
+ }
3399
+ else if (delta) for (const req of requests) {
3106
3400
  let up = 0;
3107
3401
  let down = 0;
3108
3402
  for (const c of CATS) {
@@ -3246,7 +3540,8 @@ window.__ModuleLoader__.load({
3246
3540
  props.granularity,
3247
3541
  props.focusTurn,
3248
3542
  requests,
3249
- adaptive
3543
+ adaptive,
3544
+ dnaDeltaOn
3250
3545
  ]);
3251
3546
  const measureRef = (0, react.useRef)(measureVisible);
3252
3547
  (0, react.useLayoutEffect)(() => {
@@ -3274,6 +3569,45 @@ window.__ModuleLoader__.load({
3274
3569
  return containHorizontalOverscroll(el);
3275
3570
  }, []);
3276
3571
  const stepsOf = (0, react.useMemo)(() => turnStepsOf(props.requests), [props.requests]);
3572
+ const hoveredIdx = props.hoveredSeq !== null ? requests.findIndex((r) => r.seq === props.hoveredSeq) : -1;
3573
+ const hoveredReq = hoveredIdx >= 0 ? requests[hoveredIdx] : null;
3574
+ const hoveredBands = dnaOn && !dnaDeltaOn && hoveredIdx >= 0 ? dnaBands[hoveredIdx] : null;
3575
+ const hitBand = hoveredBands !== null && dnaHit !== null ? hoveredBands.find((b) => b.key === dnaHit && b.tokens > 0) ?? null : null;
3576
+ const hoveredDelta = dnaDeltaOn && hoveredIdx >= 0 && dnaDeltas !== null ? dnaDeltas[hoveredIdx].up.find((b) => b.key === dnaHit) ?? dnaDeltas[hoveredIdx].down.find((b) => b.key === dnaHit) ?? null : null;
3577
+ const dnaSlices = (0, react.useMemo)(() => {
3578
+ if (!dnaOn || dnaHit === null) return null;
3579
+ const slices = [];
3580
+ if (dnaDeltaOn && dnaDeltas !== null) for (const d of dnaDeltas) {
3581
+ const hit = d.up.find((b) => b.key === dnaHit) ?? d.down.find((b) => b.key === dnaHit) ?? null;
3582
+ if (hit === null) {
3583
+ slices.push(null);
3584
+ continue;
3585
+ }
3586
+ const mag = Math.abs(hit.tokens);
3587
+ const edge = hit.tokens > 0 ? downPx + hit.off * deltaScale : downPx - (hit.off + mag) * deltaScale;
3588
+ slices.push({
3589
+ bottom: Math.round(edge),
3590
+ height: Math.max(1, Math.round(mag * deltaScale))
3591
+ });
3592
+ }
3593
+ else for (const bands of dnaBands) {
3594
+ const hit = bands.find((b) => b.key === dnaHit && b.tokens > 0) ?? null;
3595
+ slices.push(hit === null ? null : {
3596
+ bottom: Math.round(hit.off / maxTotal * CHART_H),
3597
+ height: Math.max(1, Math.round(hit.tokens / maxTotal * CHART_H))
3598
+ });
3599
+ }
3600
+ return slices;
3601
+ }, [
3602
+ dnaOn,
3603
+ dnaHit,
3604
+ dnaDeltaOn,
3605
+ dnaDeltas,
3606
+ dnaBands,
3607
+ downPx,
3608
+ deltaScale,
3609
+ maxTotal
3610
+ ]);
3277
3611
  const tipRowsOf = (req) => {
3278
3612
  const n = req.stepCount ?? 1;
3279
3613
  const head = props.granularity === "turn" ? n > 1 ? t("tip.turn", {
@@ -3284,19 +3618,20 @@ window.__ModuleLoader__.load({
3284
3618
  s: req.step ?? 0,
3285
3619
  n: stepsOf(req.turn)
3286
3620
  });
3287
- if (delta) {
3288
- /* v8 ignore next 1 -- delta mode only receives records from
3289
- deltaOf, which always assigns net; the fallback is defensive. */
3290
- const n = req.net ?? 0;
3291
- return [head, t("tip.delta", { n: (n > 0 ? "+" : "") + fmt(n) })];
3292
- }
3621
+ const band = hitBand ?? hoveredDelta;
3622
+ if (band !== null) return [head, t("trend.dnaItem", {
3623
+ label: dnaBaseLabel(band, t, catLabel),
3624
+ n: dnaDeltaOn ? fmtSigned(band.tokens) : fmt(band.tokens)
3625
+ })];
3626
+ if (delta)
3627
+ /* v8 ignore next 1 -- delta mode only receives records from
3628
+ deltaOf, which always assigns net; the fallback is defensive. */
3629
+ return [head, t("tip.delta", { n: fmtSigned(req.net ?? 0) })];
3293
3630
  return [head, focus !== null ? t("tip.cat", {
3294
3631
  cat: catLabel(focus),
3295
3632
  n: fmt(req.total)
3296
3633
  }) : t("tip.total", { n: fmt(req.total) })];
3297
3634
  };
3298
- const hoveredIdx = props.hoveredSeq !== null ? requests.findIndex((r) => r.seq === props.hoveredSeq) : -1;
3299
- const hoveredReq = hoveredIdx >= 0 ? requests[hoveredIdx] : null;
3300
3635
  const tipColRef = (0, react.useRef)(0);
3301
3636
  /**
3302
3637
  * Glue the hover tip to its bar's VISIBLE slice. The tip deliberately does NOT live inside the scrolling
@@ -3386,6 +3721,7 @@ window.__ModuleLoader__.load({
3386
3721
  "data-catdim": props.hoverCat ?? void 0,
3387
3722
  onMouseLeave: () => {
3388
3723
  props.onHover(null);
3724
+ setDnaHit(null);
3389
3725
  },
3390
3726
  children: [
3391
3727
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "lc-grid lc-grid-top" }),
@@ -3408,9 +3744,16 @@ window.__ModuleLoader__.load({
3408
3744
  downPx: delta ? downPx : void 0,
3409
3745
  deltaScale: delta ? deltaScale : void 0,
3410
3746
  enterIndex: i,
3747
+ dna: dnaOn ? dnaBands[i] : null,
3748
+ dnaDelta: dnaDeltaOn && dnaDeltas !== null ? dnaDeltas[i] : null,
3749
+ dnaScale: dnaDeltaOn ? deltaScale : void 0,
3750
+ zeroBottom: dnaDeltaOn ? downPx : void 0,
3751
+ onDnaHit: setDnaHit,
3752
+ onPickBand: props.onPickBand,
3411
3753
  onSelect: props.onSelect,
3412
3754
  onHover: props.onHover
3413
- }, `${req.seq}:${props.granularity}`))
3755
+ }, `${req.seq}:${props.granularity}`)),
3756
+ dnaOn ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DnaHighlights, { slices: dnaSlices }) : null
3414
3757
  ]
3415
3758
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3416
3759
  className: "lc-turns",
@@ -4496,6 +4839,58 @@ window.__ModuleLoader__.load({
4496
4839
  function nodeNameOf(n) {
4497
4840
  return typeof n.name === "string" ? n.name : "";
4498
4841
  }
4842
+ /**
4843
+ * The content kinds one assistant message proves, as the assistant category's
4844
+ * kind chips count and filter them: thinking (a reasoning block — only the
4845
+ * conversation join can prove it), tool calls (join blocks, else the fold's
4846
+ * text-less-reply `calls` stamp), and answer text (join blocks, else the
4847
+ * node's `text`). Legacy `content` joins classify the same way the body
4848
+ * renders them. The flags are independent, so a combined reply lights
4849
+ * several chips.
4850
+ */
4851
+ function msgKindsOf(n, conv) {
4852
+ let think = false;
4853
+ let tool = false;
4854
+ let answer = false;
4855
+ for (const blocks of [conv?.blocks, conv?.content]) {
4856
+ if (!Array.isArray(blocks)) continue;
4857
+ for (const b of blocks) {
4858
+ const blk = b !== null && typeof b === "object" ? b : null;
4859
+ const k = blk !== null ? typeof blk.kind === "string" ? blk.kind : typeof blk.type === "string" ? blk.type : "" : "";
4860
+ if (k === "reasoning") think = true;
4861
+ else if (k === "tool-call") tool = true;
4862
+ else if (k === "text") answer = true;
4863
+ }
4864
+ }
4865
+ return {
4866
+ think,
4867
+ tool: tool || Array.isArray(n.calls) && n.calls.length > 0,
4868
+ answer: answer || typeof n.text === "string" && n.text !== ""
4869
+ };
4870
+ }
4871
+ /**
4872
+ * The reasoning texts one assistant row's conversation join proves, concatenated for the row filter's scan —
4873
+ * the fold stamps no reasoning on the node, so this is the only scan face the thinking blocks expose. Both block
4874
+ * vocabularies classify here (the body renders the same blocks as the Reasoning sections); malformed blocks drop.
4875
+ */
4876
+ function reasoningTextOf(conv) {
4877
+ if (conv === void 0) return "";
4878
+ let out = "";
4879
+ for (const blocks of [conv.blocks, conv.content]) {
4880
+ if (!Array.isArray(blocks)) continue;
4881
+ for (const b of blocks) {
4882
+ const blk = b !== null && typeof b === "object" ? b : null;
4883
+ if ((blk !== null ? typeof blk.kind === "string" ? blk.kind : typeof blk.type === "string" ? blk.type : "" : "") === "reasoning" && typeof blk?.text === "string") out += blk.text + "\n";
4884
+ }
4885
+ }
4886
+ return out;
4887
+ }
4888
+ /** The assistant rows' kind chips, in display order. */
4889
+ const ROW_KINDS = [
4890
+ "think",
4891
+ "tool",
4892
+ "answer"
4893
+ ];
4499
4894
  function countOf(asm, byCat, c) {
4500
4895
  if (c === "system") return asm.system !== null ? 1 : 0;
4501
4896
  if (c === "tools") return asm.header !== null ? asm.header.tools.length : 0;
@@ -4523,9 +4918,19 @@ window.__ModuleLoader__.load({
4523
4918
  const [openCat, setOpenCat] = (0, react.useState)(null);
4524
4919
  const [openElem, setOpenElem] = (0, react.useState)(null);
4525
4920
  const [rowQuery, setRowQuery] = (0, react.useState)("");
4921
+ const [rowKind, setRowKind] = (0, react.useState)(null);
4526
4922
  const [toolSort, setToolSort] = (0, react.useState)(() => settings.defaultToolSort());
4527
- const [dna, setDna] = (0, react.useState)(false);
4923
+ const [dnaLocal, setDnaLocal] = (0, react.useState)(false);
4924
+ const dnaLinked = props.dna !== void 0 && props.onDnaChange !== void 0;
4925
+ const dna = dnaLinked ? props.dna === true : dnaLocal;
4926
+ const setDna = (on) => {
4927
+ if (dnaLinked)
4928
+ /* v8 ignore next 1 -- `dnaLinked` requires both props, so the handler is always present. */
4929
+ props.onDnaChange?.(on);
4930
+ else setDnaLocal(on);
4931
+ };
4528
4932
  const [dnaKey, setDnaKey] = (0, react.useState)(null);
4933
+ const [deltaBase, setDeltaBase] = (0, react.useState)(() => settings.defaultDeltaBase());
4529
4934
  const onOpenCat = props.onOpenCat;
4530
4935
  const setCat = (c) => {
4531
4936
  setOpenCat(c);
@@ -4559,7 +4964,9 @@ window.__ModuleLoader__.load({
4559
4964
  if (nodeFocus === null || nodeFocus === void 0) return;
4560
4965
  setSel(nodeFocus.step);
4561
4966
  setCat(nodeFocus.cat);
4562
- setOpenElem("n" + String(nodeFocus.seq));
4967
+ setOpenElem(nodeFocus.key);
4968
+ setRowQuery("");
4969
+ setRowKind(null);
4563
4970
  focusScrollRef.current = true;
4564
4971
  if (props.onNodeFocusHandled !== void 0) props.onNodeFocusHandled();
4565
4972
  }, [
@@ -4596,7 +5003,14 @@ window.__ModuleLoader__.load({
4596
5003
  setCat(null);
4597
5004
  setOpenElem(null);
4598
5005
  };
4599
- const refReq = req === null ? requests.length > 0 ? requests[requests.length - 1] : null : lastOfTurn(requests, (req.turn ?? 0) - 1);
5006
+ const prevRecordOf = (r) => {
5007
+ const i = requests.findIndex((x) => x.seq === r.seq);
5008
+ return i > 0 ? requests[i - 1] : null;
5009
+ };
5010
+ const lastReq = requests.length > 0 ? requests[requests.length - 1] : null;
5011
+ const turnBaseOf = (r) => lastOfTurn(requests, (r.turn ?? 0) - 1);
5012
+ const refReq = req === null ? deltaBase === "step" ? lastReq : lastReq === null ? null : turnBaseOf(lastReq) : deltaBase === "turn" ? turnBaseOf(req) : prevRecordOf(req);
5013
+ const zeroBase = refReq === null && lastReq !== null;
4600
5014
  const prevView = refReq !== null ? assemble(data, headers, refReq.seq) : null;
4601
5015
  const prevByCat = prevView !== null ? byCatOf(prevView) : null;
4602
5016
  const byCat = byCatOf(view);
@@ -4604,12 +5018,7 @@ window.__ModuleLoader__.load({
4604
5018
  for (const n of view.nodes) if ((n.cat === "tool" || n.cat === "skill") && n.tool !== void 0) toolHits.set(n.tool, (toolHits.get(n.tool) ?? 0) + 1);
4605
5019
  const toolHitsOf = (tool) => toolHits.get(tool.name) ?? 0;
4606
5020
  const dnaLabel = (it) => {
4607
- let base;
4608
- if (!("node" in it)) base = it.cat === "system" ? catLabel("system") : it.key.slice(5);
4609
- else {
4610
- const n = it.node;
4611
- base = n.skill !== void 0 ? t("node.skillTag", { name: n.skill }) : n.cat === "tool" ? n.tool ?? "?" : n.cat === "inject" ? t("form." + (n.form || "context")) : catLabel(n.cat);
4612
- }
5021
+ const base = dnaBaseLabel(it, t, catLabel);
4613
5022
  return it.time !== void 0 ? base + " · " + fmtTime(it.time) : base;
4614
5023
  };
4615
5024
  const dnaItems = dna ? dnaOf(view) : null;
@@ -4628,6 +5037,7 @@ window.__ModuleLoader__.load({
4628
5037
  if (it === void 0) return;
4629
5038
  setCat(it.cat);
4630
5039
  setRowQuery("");
5040
+ setRowKind(null);
4631
5041
  setOpenElem(key);
4632
5042
  focusScrollRef.current = true;
4633
5043
  };
@@ -4652,6 +5062,7 @@ window.__ModuleLoader__.load({
4652
5062
  }
4653
5063
  setCat(c);
4654
5064
  setRowQuery("");
5065
+ setRowKind(null);
4655
5066
  setOpenElem(singleKeyOf(c));
4656
5067
  };
4657
5068
  const toggleElem = (key) => {
@@ -4678,7 +5089,7 @@ window.__ModuleLoader__.load({
4678
5089
  title: t("node.failed")
4679
5090
  }) : null,
4680
5091
  tag !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4681
- className: "lc-br-tag",
5092
+ className: "lc-br-tags",
4682
5093
  children: tag
4683
5094
  }) : null,
4684
5095
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
@@ -4701,6 +5112,19 @@ window.__ModuleLoader__.load({
4701
5112
  }) : null]
4702
5113
  }, key);
4703
5114
  };
5115
+ const rowTagNode = (tag, names) => {
5116
+ if (tag === null) return null;
5117
+ if (names === null) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5118
+ className: "lc-br-tag",
5119
+ children: tag
5120
+ });
5121
+ const counts = /* @__PURE__ */ new Map();
5122
+ for (const name of names) counts.set(name, (counts.get(name) ?? 0) + 1);
5123
+ return [...counts.entries()].map(([name, count]) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5124
+ className: "lc-br-tag",
5125
+ children: count > 1 ? name + " ×" + String(count) : name
5126
+ }, name));
5127
+ };
4704
5128
  const catBody = (c) => {
4705
5129
  if (c === "system") {
4706
5130
  const sys = view.system;
@@ -4803,22 +5227,27 @@ window.__ModuleLoader__.load({
4803
5227
  const conv = bySeq.get(n.seq);
4804
5228
  const rowErr = (n.cat === "tool" || n.cat === "skill") && toolErrOf(n, conv).err;
4805
5229
  let tag = null;
5230
+ let tagNames = null;
4806
5231
  let preview = nodeText(n);
4807
5232
  const id = nodeNameOf(n);
4808
5233
  if (n.cat === "tool") {
4809
5234
  tag = n.tool ?? "?";
5235
+ tagNames = n.tool !== void 0 ? [n.tool] : null;
4810
5236
  preview = callSummaryOf(conv) ?? t("node.toolResult");
4811
5237
  } else if (n.cat === "skill") {
4812
5238
  tag = n.skill !== void 0 ? t("node.skillTag", { name: n.skill }) : t("form." + (n.form || "context"));
4813
5239
  preview = (n.skill === void 0 && id !== "" ? id : null) ?? (n.text !== void 0 && n.text !== "" ? n.text : null) ?? callSummaryOf(conv) ?? preview;
4814
- } else if (n.cat === "assistant" && Array.isArray(n.calls) && n.calls.length > 0) {
4815
- tag = n.calls.join(" › ");
4816
- preview = (n.text !== void 0 && n.text !== "" ? n.text : null) ?? blockSummaryOf(conv) ?? t("node.empty");
4817
- } else if (n.cat === "assistant" && (n.text === void 0 || n.text === "")) preview = blockSummaryOf(conv) ?? preview;
4818
- else if (n.cat === "user") {
5240
+ } else if (n.cat === "assistant") {
5241
+ const names = Array.isArray(n.calls) && n.calls.length > 0 ? n.calls : callNamesOf(conv);
5242
+ if (names.length > 0) {
5243
+ tag = names.join(" › ");
5244
+ tagNames = names;
5245
+ preview = (n.text !== void 0 && n.text !== "" ? n.text : null) ?? blockSummaryOf(conv) ?? t("node.empty");
5246
+ } else if (n.text === void 0 || n.text === "") preview = blockSummaryOf(conv) ?? preview;
5247
+ } else if (n.cat === "user") {
4819
5248
  const imgCount = conv !== void 0 && Array.isArray(conv.content) ? conv.content.filter((b) => imageRefOf(b) !== null).length : 0;
4820
5249
  if (imgCount > 0 && openElem !== `n${n.seq}`) tag = t("attach.image") + (imgCount > 1 ? " ×" + String(imgCount) : "");
4821
- } else if (n.cat === "inject") {
5250
+ } else {
4822
5251
  tag = t("form." + (n.form || "context"));
4823
5252
  if (id !== "") preview = id;
4824
5253
  else if (n.text !== void 0 && n.text !== "") preview = n.form === "snapshot" ? t("node.snapshot") + n.text : n.text;
@@ -4828,21 +5257,44 @@ window.__ModuleLoader__.load({
4828
5257
  conv,
4829
5258
  rowErr,
4830
5259
  tag,
4831
- preview
5260
+ tagNames,
5261
+ preview,
5262
+ reasoning: n.cat === "assistant" ? reasoningTextOf(conv) : "",
5263
+ kinds: msgKindsOf(n, conv)
4832
5264
  };
4833
5265
  });
4834
5266
  const q = rowQuery.trim().toLowerCase();
4835
- const shown = q === "" ? rows : rows.filter((r) => (r.tag ?? "").toLowerCase().includes(q) || r.preview.toLowerCase().includes(q) || typeof r.n.text === "string" && r.n.text.toLowerCase().includes(q));
4836
- const rowctl = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowToolbar, {
5267
+ const kindCounts = c === "assistant" ? ROW_KINDS.map((k) => ({
5268
+ k,
5269
+ n: rows.reduce((acc, r) => acc + (r.kinds[k] ? 1 : 0), 0)
5270
+ })) : null;
5271
+ const shown = q === "" && rowKind === null ? rows : rows.filter((r) => (rowKind === null || r.kinds[rowKind]) && (q === "" || (r.tag ?? "").toLowerCase().includes(q) || r.preview.toLowerCase().includes(q) || typeof r.n.text === "string" && r.n.text.toLowerCase().includes(q) || r.reasoning.toLowerCase().includes(q)));
5272
+ const rowctl = kindCounts === null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowToolbar, {
4837
5273
  value: rowQuery,
4838
5274
  placeholder: t("browser.search." + c),
4839
5275
  onChange: setRowQuery
5276
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowToolbar, {
5277
+ value: rowQuery,
5278
+ placeholder: t("browser.search." + c),
5279
+ tip: t("browser.kindTip"),
5280
+ onChange: setRowQuery,
5281
+ children: kindCounts.map(({ k, n }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
5282
+ type: "button",
5283
+ className: "lc-gran-btn" + (rowKind === k ? " lc-gran-on" : ""),
5284
+ onClick: () => {
5285
+ setRowKind(rowKind === k ? null : k);
5286
+ },
5287
+ children: [t("browser.kind." + k), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5288
+ className: "lc-kind-n",
5289
+ children: fmt(n)
5290
+ })]
5291
+ }, k))
4840
5292
  });
4841
5293
  if (shown.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [rowctl, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4842
5294
  className: "lc-br-note",
4843
5295
  children: t("browser.rowNoMatch")
4844
5296
  })] });
4845
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [rowctl, shown.map(({ n, conv, rowErr, tag, preview }) => elemRow(`n${n.seq}`, tag, preview, n.tokens, n.time, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NodeContent, {
5297
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [rowctl, shown.map(({ n, conv, rowErr, tag, tagNames, preview }) => elemRow(`n${n.seq}`, rowTagNode(tag, tagNames), preview, n.tokens, n.time, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NodeContent, {
4846
5298
  node: n,
4847
5299
  conv,
4848
5300
  rich,
@@ -4886,14 +5338,30 @@ window.__ModuleLoader__.load({
4886
5338
  type: "button",
4887
5339
  className: "lc-gran-btn" + (dna ? " lc-gran-on" : ""),
4888
5340
  onClick: () => {
4889
- setDna((on) => !on);
5341
+ setDna(!dna);
4890
5342
  },
4891
5343
  children: t("browser.dna")
4892
5344
  })
4893
5345
  }),
4894
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4895
- className: "lc-br-hint",
4896
- children: t("browser.deltaHint")
5346
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5347
+ className: "lc-gran",
5348
+ role: "group",
5349
+ title: t("browser.base.tip"),
5350
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5351
+ type: "button",
5352
+ className: "lc-gran-btn" + (deltaBase === "step" ? " lc-gran-on" : ""),
5353
+ onClick: () => {
5354
+ setDeltaBase("step");
5355
+ },
5356
+ children: t("browser.base.step")
5357
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5358
+ type: "button",
5359
+ className: "lc-gran-btn" + (deltaBase === "turn" ? " lc-gran-on" : ""),
5360
+ onClick: () => {
5361
+ setDeltaBase("turn");
5362
+ },
5363
+ children: t("browser.base.turn")
5364
+ })]
4897
5365
  }),
4898
5366
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
4899
5367
  className: "lc-br-pick",
@@ -4910,7 +5378,7 @@ window.__ModuleLoader__.load({
4910
5378
  t: r.turn ?? 0,
4911
5379
  s: r.step ?? 0,
4912
5380
  n: stepsOf(r.turn)
4913
- }) + " · " + fmtTime(r.time)
5381
+ })
4914
5382
  }, r.seq))]
4915
5383
  })
4916
5384
  ]
@@ -4965,9 +5433,9 @@ window.__ModuleLoader__.load({
4965
5433
  children: CATS.map((c) => {
4966
5434
  const count = toolCount(c.key);
4967
5435
  const v = breakdown[c.key] || 0;
4968
- const prevCount = prevView !== null && prevByCat !== null ? countOf(prevView, prevByCat, c.key) : null;
5436
+ const prevCount = zeroBase ? 0 : prevView !== null && prevByCat !== null ? countOf(prevView, prevByCat, c.key) : null;
4969
5437
  const countDelta = prevCount !== null ? count - prevCount : null;
4970
- const prevTokens = refReq !== null ? refReq[c.key] || 0 : null;
5438
+ const prevTokens = zeroBase ? 0 : refReq !== null ? refReq[c.key] || 0 : null;
4971
5439
  const tokenDelta = prevTokens !== null ? v - prevTokens : null;
4972
5440
  const openable = count > 0 || (c.key === "system" || c.key === "tools") && view.header === null;
4973
5441
  const open = openCat === c.key && openable;
@@ -5358,6 +5826,7 @@ window.__ModuleLoader__.load({
5358
5826
  const StackedBar = makeStackedBar(kit);
5359
5827
  const CurrentComposition = makeCurrentComposition(kit, StackedBar, makeLegend(kit));
5360
5828
  const ContextBrowser = makeContextBrowser(kit, StackedBar, settings);
5829
+ const DetailNote = makeDetailNote(kit);
5361
5830
  const ErrorBoundary = makeErrorBoundary(t);
5362
5831
  function ContextModalBody(props) {
5363
5832
  const sessionId = typeof props.sessionId === "string" ? props.sessionId : "";
@@ -5425,7 +5894,10 @@ window.__ModuleLoader__.load({
5425
5894
  onClick: close,
5426
5895
  children: "×"
5427
5896
  })]
5428
- }), data === null || head === null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5897
+ }), data === null || head === null ? source.detailState === "failed" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DetailNote, {
5898
+ state: "failed",
5899
+ onRetry: source.retryDetail
5900
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5429
5901
  className: "lc-empty",
5430
5902
  children: t("loading")
5431
5903
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(CurrentComposition, {
@@ -5479,9 +5951,10 @@ window.__ModuleLoader__.load({
5479
5951
  * The Context Dashboard's sidebar entry: a footer action stacked directly
5480
5952
  * above Settings (the harness's own foot layout: footer actions, then the
5481
5953
  * settings row), mirroring the Settings trigger's geometry in both column
5482
- * widths. The button carries the plugin emblem and, on the wide
5483
- * column, its label. Clicking opens the overview overlay through the shared
5484
- * module store (overviewStore.ts).
5954
+ * widths. The button carries the plugin emblem — in the mono seat, so the
5955
+ * glyph matches the harness's own footer rows rather than shouting over
5956
+ * them — and, on the wide column, its label. Clicking opens the overview
5957
+ * overlay through the shared module store (overviewStore.ts).
5485
5958
  *
5486
5959
  * The per-user `insightsEntry` preference takes the entry down (renders
5487
5960
  * null) without unregistering the seat. The subscription fails open: an
@@ -5507,7 +5980,8 @@ window.__ModuleLoader__.load({
5507
5980
  },
5508
5981
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ContextIcon, {
5509
5982
  size: props.wide === true ? 16 : 18,
5510
- className: "lc-ov-entry-icon"
5983
+ className: "lc-ov-entry-icon",
5984
+ mono: true
5511
5985
  }), props.wide === true && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5512
5986
  className: "lc-ov-entry-label",
5513
5987
  children: t("ov.entry")
@@ -8314,7 +8788,7 @@ window.__ModuleLoader__.load({
8314
8788
  //#endregion
8315
8789
  //#region src/client/components/settingsCard.tsx
8316
8790
  /**
8317
- * The dsh-context preference cards — two seats over the same six rows. The
8791
+ * The dsh-context preference cards — two seats over the same seven rows. The
8318
8792
  * settings-section card (`settings.plugin.item`, the older harness lines)
8319
8793
  * renders a collapsible list item in Settings → Plugins → Plugin
8320
8794
  * configuration; the Plugins-page card (`plugins.bundle.config`, the
@@ -8361,7 +8835,7 @@ window.__ModuleLoader__.load({
8361
8835
  })]
8362
8836
  });
8363
8837
  }
8364
- /** The six preference rows shared by both seats. */
8838
+ /** The seven preference rows shared by both seats. */
8365
8839
  function PreferenceRows(props) {
8366
8840
  const { t, state, set } = props;
8367
8841
  const disabled = state.status !== "ready" || !state.writable;
@@ -8433,6 +8907,21 @@ window.__ModuleLoader__.load({
8433
8907
  set?.("defaultTrendMode", id);
8434
8908
  }
8435
8909
  }),
8910
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PrefRow, {
8911
+ label: t("settings.deltaBase"),
8912
+ value: state.deltaBase,
8913
+ disabled,
8914
+ options: [{
8915
+ id: "step",
8916
+ label: t("browser.base.step")
8917
+ }, {
8918
+ id: "turn",
8919
+ label: t("browser.base.turn")
8920
+ }],
8921
+ onPick: (id) => {
8922
+ set?.("defaultDeltaBase", id);
8923
+ }
8924
+ }),
8436
8925
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PrefRow, {
8437
8926
  label: t("settings.toolSort"),
8438
8927
  value: state.toolSort,
@@ -8563,6 +9052,7 @@ window.__ModuleLoader__.load({
8563
9052
  ...v.defaultPlacement === "all" || v.defaultPlacement === "tab" || v.defaultPlacement === "sidebar" ? { placement: v.defaultPlacement } : {},
8564
9053
  ...v.defaultGranularity === "step" || v.defaultGranularity === "turn" ? { granularity: v.defaultGranularity } : {},
8565
9054
  ...v.defaultTrendMode === "total" || v.defaultTrendMode === "delta" ? { mode: v.defaultTrendMode } : {},
9055
+ ...v.defaultDeltaBase === "step" || v.defaultDeltaBase === "turn" ? { deltaBase: v.defaultDeltaBase } : {},
8566
9056
  ...v.defaultToolSort === "size" || v.defaultToolSort === "count" || v.defaultToolSort === "name" ? { toolSort: v.defaultToolSort } : {},
8567
9057
  ...v.defaultFileSort === "count" || v.defaultFileSort === "latest" || v.defaultFileSort === "path" ? { fileSort: v.defaultFileSort } : {},
8568
9058
  ...v.insightsEntry === "show" || v.insightsEntry === "hide" ? { insightsEntry: v.insightsEntry } : {}
@@ -8574,6 +9064,7 @@ window.__ModuleLoader__.load({
8574
9064
  placement: "all",
8575
9065
  granularity: "step",
8576
9066
  mode: "total",
9067
+ deltaBase: "step",
8577
9068
  toolSort: "count",
8578
9069
  fileSort: "count",
8579
9070
  insightsEntry: "show",
@@ -8582,7 +9073,7 @@ window.__ModuleLoader__.load({
8582
9073
  let scope;
8583
9074
  const listeners = /* @__PURE__ */ new Set();
8584
9075
  const publish = (next) => {
8585
- if (next.status === state.status && next.placement === state.placement && next.granularity === state.granularity && next.mode === state.mode && next.toolSort === state.toolSort && next.fileSort === state.fileSort && next.insightsEntry === state.insightsEntry && next.writable === state.writable) return;
9076
+ if (next.status === state.status && next.placement === state.placement && next.granularity === state.granularity && next.mode === state.mode && next.deltaBase === state.deltaBase && next.toolSort === state.toolSort && next.fileSort === state.fileSort && next.insightsEntry === state.insightsEntry && next.writable === state.writable) return;
8586
9077
  state = next;
8587
9078
  for (const listener of listeners) listener();
8588
9079
  };
@@ -8595,6 +9086,7 @@ window.__ModuleLoader__.load({
8595
9086
  placement: prefs.placement ?? (raw?.defaultPlacement === void 0 ? state.placement : "all"),
8596
9087
  granularity: prefs.granularity ?? state.granularity,
8597
9088
  mode: prefs.mode ?? state.mode,
9089
+ deltaBase: prefs.deltaBase ?? state.deltaBase,
8598
9090
  toolSort: prefs.toolSort ?? state.toolSort,
8599
9091
  fileSort: prefs.fileSort ?? state.fileSort,
8600
9092
  insightsEntry: prefs.insightsEntry ?? (raw?.insightsEntry === void 0 ? state.insightsEntry : "show"),
@@ -8618,6 +9110,7 @@ window.__ModuleLoader__.load({
8618
9110
  defaultPlacement: () => state.placement,
8619
9111
  defaultGranularity: () => state.granularity,
8620
9112
  defaultTrendMode: () => state.mode,
9113
+ defaultDeltaBase: () => state.deltaBase,
8621
9114
  defaultToolSort: () => state.toolSort,
8622
9115
  defaultFileSort: () => state.fileSort,
8623
9116
  insightsEntry: () => state.insightsEntry,
@@ -10784,7 +11277,7 @@ window.__ModuleLoader__.load({
10784
11277
  return function PluginInfo() {
10785
11278
  const [latest, setLatest] = (0, react.useState)(null);
10786
11279
  (0, react.useEffect)(() => {
10787
- if ("0.59.2".includes("-dev")) return;
11280
+ if ("0.61.0".includes("-dev")) return;
10788
11281
  let on = true;
10789
11282
  fetchLatestVersion().then((v) => {
10790
11283
  if (on && v) setLatest(v);
@@ -10793,8 +11286,8 @@ window.__ModuleLoader__.load({
10793
11286
  on = false;
10794
11287
  };
10795
11288
  }, []);
10796
- const update = latest !== null && isNewerVersion(latest, "0.59.2") ? latest : null;
10797
- const nameText = "dsh-context (v0.59.2)";
11289
+ const update = latest !== null && isNewerVersion(latest, "0.61.0") ? latest : null;
11290
+ const nameText = "dsh-context (v0.61.0)";
10798
11291
  const nameValue = [nameText];
10799
11292
  if (update) nameValue.push(/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10800
11293
  className: "lc-pi-update",
@@ -11757,6 +12250,7 @@ window.__ModuleLoader__.load({
11757
12250
  const [hoverTurn, setHoverTurn] = (0, react.useState)(null);
11758
12251
  const [granularity, setGranularity] = (0, react.useState)(() => settings.defaultGranularity());
11759
12252
  const [trendMode, setTrendMode] = (0, react.useState)(() => settings.defaultTrendMode());
12253
+ const [dna, setDna] = (0, react.useState)(false);
11760
12254
  const [adaptive, setAdaptive] = (0, react.useState)(false);
11761
12255
  const [focusTurn, setFocusTurn] = (0, react.useState)(null);
11762
12256
  const [jumpSeq, setJumpSeq] = (0, react.useState)(null);
@@ -11812,6 +12306,21 @@ window.__ModuleLoader__.load({
11812
12306
  const displayRequests = (0, react.useMemo)(() => granularity === "turn" ? aggregateByTurn(requests) : requests, [requests, granularity]);
11813
12307
  const stepsOf = (0, react.useMemo)(() => turnStepsOf(requests), [requests]);
11814
12308
  const markers = (0, react.useMemo)(() => attachMarkers(displayRequests, events), [displayRequests, events]);
12309
+ /* v8 ignore next 1 -- a missing projection returns the loading screen before the trend card
12310
+ (and its DNA toggle) renders, so `dna && data === null` cannot occur. */
12311
+ const dnaBands = (0, react.useMemo)(() => dna && data !== null ? displayRequests.map((req) => trendBandsOf(assemble(data, headers, req.seq))) : null, [
12312
+ dna,
12313
+ data,
12314
+ headers,
12315
+ displayRequests
12316
+ ]);
12317
+ const revealBand = (0, react.useCallback)((seq, band) => {
12318
+ setNodeFocus({
12319
+ step: seq,
12320
+ key: band.key,
12321
+ cat: band.cat
12322
+ });
12323
+ }, []);
11815
12324
  (0, react.useEffect)(() => {
11816
12325
  if (typeof sessionId !== "string" || sessionId === "") return;
11817
12326
  const take = () => {
@@ -11909,7 +12418,7 @@ window.__ModuleLoader__.load({
11909
12418
  if (step === null) return;
11910
12419
  setNodeFocus({
11911
12420
  step,
11912
- seq,
12421
+ key: "n" + String(seq),
11913
12422
  cat: "tool"
11914
12423
  });
11915
12424
  }, [requests]);
@@ -11921,7 +12430,7 @@ window.__ModuleLoader__.load({
11921
12430
  const step = isResponse ? next !== null ? next.seq : "live" : activeReq.seq;
11922
12431
  setNodeFocus({
11923
12432
  step,
11924
- seq: node.seq,
12433
+ key: "n" + String(node.seq),
11925
12434
  cat: node.cat
11926
12435
  });
11927
12436
  }, [
@@ -11932,7 +12441,10 @@ window.__ModuleLoader__.load({
11932
12441
  if (!data) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
11933
12442
  className: "lc-root",
11934
12443
  ref: rootRef,
11935
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12444
+ children: source.detailState === "failed" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DetailNote, {
12445
+ state: "failed",
12446
+ onRetry: source.retryDetail
12447
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
11936
12448
  className: "lc-empty",
11937
12449
  children: t("loading")
11938
12450
  })
@@ -11980,6 +12492,19 @@ window.__ModuleLoader__.load({
11980
12492
  className: "lc-card-title-text",
11981
12493
  children: t("trend.title")
11982
12494
  }),
12495
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12496
+ className: "lc-gran lc-trend-dna",
12497
+ role: "group",
12498
+ title: t("trend.dnaTip"),
12499
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12500
+ type: "button",
12501
+ className: "lc-gran-btn" + (dna ? " lc-gran-on" : ""),
12502
+ onClick: () => {
12503
+ setDna((v) => !v);
12504
+ },
12505
+ children: t("trend.dna")
12506
+ })
12507
+ }),
11983
12508
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11984
12509
  className: "lc-gran lc-trend-adaptive",
11985
12510
  role: "group",
@@ -12051,6 +12576,8 @@ window.__ModuleLoader__.load({
12051
12576
  hoverCat: trendHoverCat,
12052
12577
  focusCat,
12053
12578
  adaptive,
12579
+ dna: dnaBands,
12580
+ onPickBand: revealBand,
12054
12581
  onSelect: setSelectedSeq,
12055
12582
  onHover: setHoveredSeq,
12056
12583
  onHoverTurn: setHoverTurn,
@@ -12090,7 +12617,9 @@ window.__ModuleLoader__.load({
12090
12617
  onNodeFocusHandled: clearNodeFocus,
12091
12618
  loadImage,
12092
12619
  detailState: source.detailState,
12093
- onDetailRetry: source.retryDetail
12620
+ onDetailRetry: source.retryDetail,
12621
+ dna,
12622
+ onDnaChange: setDna
12094
12623
  });
12095
12624
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12096
12625
  className: "lc-root",
@@ -12335,7 +12864,7 @@ window.__ModuleLoader__.load({
12335
12864
  }
12336
12865
  //#endregion
12337
12866
  //#region \0dsh-global-css:/home/runner/work/dsh-context/dsh-context/src/client/styles/tailwind.css.mjs
12338
- const css$15 = "/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}:root,:host{--spacing:4px;--color-red-500:oklch(63.7% .237 25.331);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-500:oklch(76.9% .188 70.08);--color-green-500:oklch(72.3% .219 149.579);--color-teal-500:oklch(70.4% .14 182.503);--color-blue-500:oklch(62.3% .214 259.815);--color-indigo-500:oklch(58.5% .233 277.117);--color-violet-500:oklch(60.6% .25 292.717);--color-purple-500:oklch(62.7% .265 303.9);--color-pink-500:oklch(65.6% .241 354.308);--color-slate-400:oklch(70.4% .04 256.788);--color-neutral-500:oklch(55.6% 0 none);--animate-lc-donut-in:lc-donut-in .45s cubic-bezier(.4, 0, .2, 1) calc(var(--lc-i,0) * 50ms) backwards;--animate-lc-stacked-in:lc-stacked-in .4s cubic-bezier(.4, 0, .2, 1) calc(var(--lc-i,0) * 40ms) backwards;--animate-lc-bar-in:lc-bar-in .35s cubic-bezier(.4, 0, .2, 1) calc(var(--lc-i,0) * 15ms) backwards;--animate-lc-agent-flow:lc-agent-flow .9s linear infinite;--animate-lc-agent-glow:lc-agent-glow 1.8s ease-in-out infinite}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.container{width:100%}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.table{display:table}.min-w-0{min-width:0}.min-w-\\[min\\(240px\\,100\\%\\)\\]{min-width:min(240px,100%)}.min-w-\\[min\\(360px\\,100\\%\\)\\]{min-width:min(360px,100%)}.flex-1{flex:1}.flex-\\[3\\]{flex:3}.flex-auto{flex:auto}.shrink{flex-shrink:1}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-lc-agent-flow{animation:var(--animate-lc-agent-flow)}.animate-lc-agent-glow{animation:var(--animate-lc-agent-glow)}.animate-lc-bar-in{animation:var(--animate-lc-bar-in)}.animate-lc-donut-in{animation:var(--animate-lc-donut-in)}.animate-lc-stacked-in{animation:var(--animate-lc-stacked-in)}.resize{resize:both}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(108px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(108px,1fr))}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-start{justify-content:flex-start}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-3{gap:calc(var(--spacing) * 3)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.border{border-style:var(--tw-border-style);border-width:1px}.fill-\\(--dsw-alias-bg-layer-1\\){fill:var(--dsw-alias-bg-layer-1)}.fill-\\(--dsw-alias-label-primary\\){fill:var(--dsw-alias-label-primary)}.fill-current{fill:currentColor}.fill-none{fill:none}.fill-transparent{fill:#0000}.stroke-\\(--dsw-alias-border-l1\\){stroke:var(--dsw-alias-border-l1)}.stroke-2{stroke-width:2px}.stroke-4{stroke-width:4px}.stroke-9{stroke-width:9px}.stroke-\\[1\\.5px\\]{stroke-width:1.5px}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}@media (hover:hover){.group-hover\\/agent\\:fill-\\[var\\(--dsw-alias-interactive-bg-hover\\,var\\(--dsw-alias-bg-layer-2\\)\\)\\]:is(:where(.group\\/agent):hover *){fill:var(--dsw-alias-interactive-bg-hover,var(--dsw-alias-bg-layer-2))}.group-hover\\/pi\\:underline:is(:where(.group\\/pi):hover *){text-decoration-line:underline}.group-hover\\/tip\\:border-\\(--dsw-alias-label-primary\\):is(:where(.group\\/tip):hover *){border-color:var(--dsw-alias-label-primary)}.group-hover\\/tip\\:text-\\(--dsw-alias-label-primary\\):is(:where(.group\\/tip):hover *){color:var(--dsw-alias-label-primary)}.group-hover\\/tip\\:opacity-100:is(:where(.group\\/tip):hover *){opacity:1}}.group-focus-visible\\/agent\\:fill-\\[var\\(--dsw-alias-interactive-bg-hover\\,var\\(--dsw-alias-bg-layer-2\\)\\)\\]:is(:where(.group\\/agent):focus-visible *){fill:var(--dsw-alias-interactive-bg-hover,var(--dsw-alias-bg-layer-2))}@media (hover:hover){.hover\\:border-\\(--dsw-alias-label-dimmed\\):hover{border-color:var(--dsw-alias-label-dimmed)}.hover\\:border-\\(--dsw-alias-label-primary\\):hover{border-color:var(--dsw-alias-label-primary)}.hover\\:bg-\\(--dsw-alias-bg-layer-2\\):hover{background-color:var(--dsw-alias-bg-layer-2)}.hover\\:bg-\\(--dsw-alias-interactive-bg-hover\\):hover{background-color:var(--dsw-alias-interactive-bg-hover)}.hover\\:bg-\\[var\\(--dsw-alias-interactive-bg-hover\\,var\\(--dsw-alias-bg-layer-2\\)\\)\\]:hover{background-color:var(--dsw-alias-interactive-bg-hover,var(--dsw-alias-bg-layer-2))}.hover\\:text-\\(--dsw-alias-label-primary\\):hover{color:var(--dsw-alias-label-primary)}.hover\\:text-\\(--dsw-alias-label-secondary\\):hover{color:var(--dsw-alias-label-secondary)}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.hover\\:brightness-\\[1\\.15\\]:hover{--tw-brightness:brightness(1.15);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}.focus\\:border-\\(--dsw-alias-label-dimmed\\):focus{border-color:var(--dsw-alias-label-dimmed)}@media (hover:hover){.hover\\:enabled\\:bg-\\(--dsw-alias-interactive-bg-hover\\):hover:enabled{background-color:var(--dsw-alias-interactive-bg-hover)}}.disabled\\:cursor-default:disabled{cursor:default}.disabled\\:opacity-50:disabled{opacity:.5}@media (prefers-reduced-motion:reduce){.motion-reduce\\:animate-none{animation:none}}@container lc-card (width<380px){.\\@max-\\[380px\\]\\/lc-card\\:basis-\\[calc\\(100\\%-46px\\)\\]{flex-basis:calc(100% - 46px)}.\\@max-\\[380px\\]\\/lc-card\\:basis-\\[calc\\(100\\%-92px\\)\\]{flex-basis:calc(100% - 92px)}.\\@max-\\[380px\\]\\/lc-card\\:flex-wrap{flex-wrap:wrap}}@container lc-card (width<320px){.\\@max-\\[320px\\]\\/lc-card\\:gap-2{gap:calc(var(--spacing) * 2)}}@container lc-card (width<240px){.\\@max-\\[240px\\]\\/lc-card\\:mx-auto{margin-inline:auto}.\\@max-\\[240px\\]\\/lc-card\\:basis-full{flex-basis:100%}.\\@max-\\[240px\\]\\/lc-card\\:flex-wrap{flex-wrap:wrap}}@property --tw-rotate-x{syntax:\"*\";inherits:false}@property --tw-rotate-y{syntax:\"*\";inherits:false}@property --tw-rotate-z{syntax:\"*\";inherits:false}@property --tw-skew-x{syntax:\"*\";inherits:false}@property --tw-skew-y{syntax:\"*\";inherits:false}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\"*\";inherits:false}@property --tw-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\"*\";inherits:false}@property --tw-inset-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:\"*\";inherits:false}@property --tw-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\"*\";inherits:false}@property --tw-inset-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\"*\";inherits:false}@property --tw-ring-offset-width{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\"*\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-blur{syntax:\"*\";inherits:false}@property --tw-brightness{syntax:\"*\";inherits:false}@property --tw-contrast{syntax:\"*\";inherits:false}@property --tw-grayscale{syntax:\"*\";inherits:false}@property --tw-hue-rotate{syntax:\"*\";inherits:false}@property --tw-invert{syntax:\"*\";inherits:false}@property --tw-opacity{syntax:\"*\";inherits:false}@property --tw-saturate{syntax:\"*\";inherits:false}@property --tw-sepia{syntax:\"*\";inherits:false}@property --tw-drop-shadow{syntax:\"*\";inherits:false}@property --tw-drop-shadow-color{syntax:\"*\";inherits:false}@property --tw-drop-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:\"*\";inherits:false}@keyframes lc-donut-in{0%{stroke-dasharray:0 100}}@keyframes lc-stacked-in{0%{transform:scaleX(0)}}@keyframes lc-bar-in{0%{transform:scaleY(0)}}@keyframes lc-agent-flow{to{stroke-dashoffset:-9px}}@keyframes lc-agent-glow{0%,to{opacity:1}50%{opacity:.4}}";
12867
+ const css$15 = "/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}:root,:host{--spacing:4px;--color-red-500:oklch(63.7% .237 25.331);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-500:oklch(76.9% .188 70.08);--color-green-500:oklch(72.3% .219 149.579);--color-teal-500:oklch(70.4% .14 182.503);--color-blue-500:oklch(62.3% .214 259.815);--color-indigo-500:oklch(58.5% .233 277.117);--color-violet-500:oklch(60.6% .25 292.717);--color-purple-500:oklch(62.7% .265 303.9);--color-pink-500:oklch(65.6% .241 354.308);--color-slate-400:oklch(70.4% .04 256.788);--color-neutral-500:oklch(55.6% 0 none);--animate-lc-donut-in:lc-donut-in .45s cubic-bezier(.4, 0, .2, 1) calc(var(--lc-i,0) * 50ms) backwards;--animate-lc-stacked-in:lc-stacked-in .4s cubic-bezier(.4, 0, .2, 1) calc(var(--lc-i,0) * 40ms) backwards;--animate-lc-bar-in:lc-bar-in .35s cubic-bezier(.4, 0, .2, 1) calc(var(--lc-i,0) * 15ms) backwards;--animate-lc-agent-flow:lc-agent-flow .9s linear infinite;--animate-lc-agent-glow:lc-agent-glow 1.8s ease-in-out infinite}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.container{width:100%}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.table{display:table}.min-w-0{min-width:0}.min-w-\\[min\\(240px\\,100\\%\\)\\]{min-width:min(240px,100%)}.min-w-\\[min\\(360px\\,100\\%\\)\\]{min-width:min(360px,100%)}.flex-1{flex:1}.flex-\\[3\\]{flex:3}.flex-auto{flex:auto}.shrink{flex-shrink:1}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-lc-agent-flow{animation:var(--animate-lc-agent-flow)}.animate-lc-agent-glow{animation:var(--animate-lc-agent-glow)}.animate-lc-bar-in{animation:var(--animate-lc-bar-in)}.animate-lc-donut-in{animation:var(--animate-lc-donut-in)}.animate-lc-stacked-in{animation:var(--animate-lc-stacked-in)}.resize{resize:both}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(108px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(108px,1fr))}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-start{justify-content:flex-start}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-3{gap:calc(var(--spacing) * 3)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.border{border-style:var(--tw-border-style);border-width:1px}.fill-\\(--dsw-alias-bg-layer-1\\){fill:var(--dsw-alias-bg-layer-1)}.fill-\\(--dsw-alias-label-primary\\){fill:var(--dsw-alias-label-primary)}.fill-current{fill:currentColor}.fill-none{fill:none}.fill-transparent{fill:#0000}.stroke-\\(--dsw-alias-border-l1\\){stroke:var(--dsw-alias-border-l1)}.stroke-2{stroke-width:2px}.stroke-4{stroke-width:4px}.stroke-9{stroke-width:9px}.stroke-\\[1\\.5px\\]{stroke-width:1.5px}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,ease);transition-duration:var(--tw-duration,0s)}@media (hover:hover){.group-hover\\/agent\\:fill-\\[var\\(--dsw-alias-interactive-bg-hover\\,var\\(--dsw-alias-bg-layer-2\\)\\)\\]:is(:where(.group\\/agent):hover *){fill:var(--dsw-alias-interactive-bg-hover,var(--dsw-alias-bg-layer-2))}.group-hover\\/pi\\:underline:is(:where(.group\\/pi):hover *){text-decoration-line:underline}.group-hover\\/tip\\:border-\\(--dsw-alias-label-primary\\):is(:where(.group\\/tip):hover *){border-color:var(--dsw-alias-label-primary)}.group-hover\\/tip\\:text-\\(--dsw-alias-label-primary\\):is(:where(.group\\/tip):hover *){color:var(--dsw-alias-label-primary)}.group-hover\\/tip\\:opacity-100:is(:where(.group\\/tip):hover *){opacity:1}}.group-focus-visible\\/agent\\:fill-\\[var\\(--dsw-alias-interactive-bg-hover\\,var\\(--dsw-alias-bg-layer-2\\)\\)\\]:is(:where(.group\\/agent):focus-visible *){fill:var(--dsw-alias-interactive-bg-hover,var(--dsw-alias-bg-layer-2))}@media (hover:hover){.hover\\:border-\\(--dsw-alias-label-dimmed\\):hover{border-color:var(--dsw-alias-label-dimmed)}.hover\\:border-\\(--dsw-alias-label-primary\\):hover{border-color:var(--dsw-alias-label-primary)}.hover\\:bg-\\(--dsw-alias-bg-layer-2\\):hover{background-color:var(--dsw-alias-bg-layer-2)}.hover\\:bg-\\(--dsw-alias-interactive-bg-hover\\):hover{background-color:var(--dsw-alias-interactive-bg-hover)}.hover\\:bg-\\[var\\(--dsw-alias-interactive-bg-hover\\,var\\(--dsw-alias-bg-layer-2\\)\\)\\]:hover{background-color:var(--dsw-alias-interactive-bg-hover,var(--dsw-alias-bg-layer-2))}.hover\\:text-\\(--dsw-alias-label-primary\\):hover{color:var(--dsw-alias-label-primary)}.hover\\:text-\\(--dsw-alias-label-secondary\\):hover{color:var(--dsw-alias-label-secondary)}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.hover\\:brightness-\\[1\\.15\\]:hover{--tw-brightness:brightness(1.15);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}.focus\\:border-\\(--dsw-alias-label-dimmed\\):focus{border-color:var(--dsw-alias-label-dimmed)}@media (hover:hover){.hover\\:enabled\\:bg-\\(--dsw-alias-interactive-bg-hover\\):hover:enabled{background-color:var(--dsw-alias-interactive-bg-hover)}}.disabled\\:cursor-default:disabled{cursor:default}.disabled\\:opacity-50:disabled{opacity:.5}@media (prefers-reduced-motion:reduce){.motion-reduce\\:animate-none{animation:none}}@container lc-card (width<380px){.\\@max-\\[380px\\]\\/lc-card\\:basis-\\[calc\\(100\\%-46px\\)\\]{flex-basis:calc(100% - 46px)}.\\@max-\\[380px\\]\\/lc-card\\:basis-\\[calc\\(100\\%-92px\\)\\]{flex-basis:calc(100% - 92px)}.\\@max-\\[380px\\]\\/lc-card\\:flex-wrap{flex-wrap:wrap}}@container lc-card (width<320px){.\\@max-\\[320px\\]\\/lc-card\\:gap-2{gap:calc(var(--spacing) * 2)}}@container lc-card (width<240px){.\\@max-\\[240px\\]\\/lc-card\\:mx-auto{margin-inline:auto}.\\@max-\\[240px\\]\\/lc-card\\:basis-full{flex-basis:100%}.\\@max-\\[240px\\]\\/lc-card\\:flex-wrap{flex-wrap:wrap}}@property --tw-rotate-x{syntax:\"*\";inherits:false}@property --tw-rotate-y{syntax:\"*\";inherits:false}@property --tw-rotate-z{syntax:\"*\";inherits:false}@property --tw-skew-x{syntax:\"*\";inherits:false}@property --tw-skew-y{syntax:\"*\";inherits:false}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\"*\";inherits:false}@property --tw-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\"*\";inherits:false}@property --tw-inset-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:\"*\";inherits:false}@property --tw-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\"*\";inherits:false}@property --tw-inset-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\"*\";inherits:false}@property --tw-ring-offset-width{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\"*\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-blur{syntax:\"*\";inherits:false}@property --tw-brightness{syntax:\"*\";inherits:false}@property --tw-contrast{syntax:\"*\";inherits:false}@property --tw-grayscale{syntax:\"*\";inherits:false}@property --tw-hue-rotate{syntax:\"*\";inherits:false}@property --tw-invert{syntax:\"*\";inherits:false}@property --tw-opacity{syntax:\"*\";inherits:false}@property --tw-saturate{syntax:\"*\";inherits:false}@property --tw-sepia{syntax:\"*\";inherits:false}@property --tw-drop-shadow{syntax:\"*\";inherits:false}@property --tw-drop-shadow-color{syntax:\"*\";inherits:false}@property --tw-drop-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:\"*\";inherits:false}@keyframes lc-donut-in{0%{stroke-dasharray:0 100}}@keyframes lc-stacked-in{0%{transform:scaleX(0)}}@keyframes lc-bar-in{0%{transform:scaleY(0)}}@keyframes lc-agent-flow{to{stroke-dashoffset:-9px}}@keyframes lc-agent-glow{0%,to{opacity:1}50%{opacity:.4}}";
12339
12868
  const tagId$15 = "dsh-context/tailwind.css";
12340
12869
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$15) + "]") === null) {
12341
12870
  const tag = document.createElement("style");
@@ -12346,7 +12875,7 @@ window.__ModuleLoader__.load({
12346
12875
  }
12347
12876
  //#endregion
12348
12877
  //#region \0dsh-global-css:/home/runner/work/dsh-context/dsh-context/src/client/styles/base.css.mjs
12349
- const css$14 = ".lc-root{box-sizing:border-box;height:100%;color:var(--dsw-alias-label-primary);padding:16px 20px 32px;font-size:13px;overflow-y:auto}[data-sidebar-right-open] .lc-root,[data-sidebar-right-float-host] .lc-root{padding:12px}.lc-title-icon{flex:none}.lc-title-label{padding-right:30px}.lc-card{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);border-radius:10px;margin-bottom:14px;padding:14px 16px}.lc-root .lc-card{box-sizing:border-box;margin-bottom:7px;padding:7px 8px;container:lc-card/inline-size}.lc-root .lc-cols{gap:7px;margin-bottom:7px}.lc-card-title{flex-wrap:wrap;align-items:baseline;gap:8px;margin-bottom:10px;font-weight:600;display:flex}.lc-card-title-text{white-space:nowrap;flex:none}.lc-gran,.lc-kinds{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:6px;gap:2px;margin-left:auto;padding:1px;display:flex}.lc-trend-ctl,.lc-heat-ctl{align-items:center;gap:6px;margin-left:auto;display:flex}.lc-trend-ctl .lc-gran,.lc-heat-ctl .lc-gran,.lc-heat-ctl .lc-card-sub{margin-left:0}.lc-trend-adaptive{flex:none;margin-left:0}.lc-gran-btn{color:var(--dsw-alias-label-secondary);cursor:pointer;transition:color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border:0;border-radius:5px;padding:3px 8px;font-family:inherit;font-size:11px;line-height:1}.lc-gran-btn:hover{color:var(--dsw-alias-label-primary)}.lc-gran-on,.lc-gran-on:hover{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}.lc-kind-n{font-variant-numeric:tabular-nums;opacity:.65;margin-left:4px}.lc-gran-on .lc-kind-n{opacity:.85}.lc-tip{z-index:6;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:max-content;color:var(--dsw-alias-label-primary);box-shadow:var(--dsw-shadow-lv3,0 2px 8px #0000002e);pointer-events:none;opacity:0;transition:opacity var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-radius:6px;padding:6px 10px;font-size:12px;position:absolute}.lc-events,.lc-fa-list{flex-direction:column;gap:2px;height:320px;display:flex;overflow-y:auto}.lc-cols{flex-wrap:wrap;gap:14px;margin-bottom:14px;display:flex}.lc-cols>.lc-card,.lc-col>.lc-card:last-child{margin-bottom:0}.lc-col-browser{flex-direction:column;display:flex}.lc-col-browser>.lc-card{flex:1}.lc-head>.lc-card:has(.lc-stats){flex-direction:column;display:flex}.lc-head .lc-stats{flex:1;align-content:stretch}.lc-head .lc-stat{justify-content:center}.lc-empty{color:var(--dsw-alias-label-secondary);text-align:center;padding:18px 0}.lc-error{flex-direction:column;align-items:center;gap:8px;padding:40px 16px;display:flex}.lc-error-msg{font-family:var(--ds-font-family-code,ui-monospace, SFMono-Regular, Menlo, monospace);color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);overflow-wrap:anywhere;border-radius:6px;max-width:100%;padding:4px 8px;font-size:12px}.lc-error-retry{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;transition:border-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-radius:6px;padding:4px 14px;font-size:12px}.lc-foot{color:var(--dsw-alias-label-secondary);margin-top:4px;font-size:12px}[data-conversation-scroll]:has(.lc-root)>[data-composer-seat]:not(:has([data-approval-key],[data-question-key],[data-plan-review-key])),[data-conversation-scroll]:has(.lc-root,.lc-modal-backdrop)~[data-width-handle]{display:none}";
12878
+ const css$14 = ".lc-root{box-sizing:border-box;height:100%;color:var(--dsw-alias-label-primary);padding:16px 20px 32px;font-size:13px;overflow-y:auto}[data-sidebar-right-open] .lc-root,[data-sidebar-right-float-host] .lc-root{padding:12px}.lc-title-icon{flex:none}.lc-title-label{padding-right:30px}.lc-card{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);border-radius:10px;margin-bottom:14px;padding:14px 16px}.lc-root .lc-card{box-sizing:border-box;margin-bottom:7px;padding:7px 8px;container:lc-card/inline-size}.lc-root .lc-cols{gap:7px;margin-bottom:7px}.lc-card-title{flex-wrap:wrap;align-items:baseline;gap:8px;margin-bottom:10px;font-weight:600;display:flex}.lc-card-title-text{white-space:nowrap;flex:none}.lc-gran,.lc-kinds{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:6px;gap:2px;margin-left:auto;padding:1px;display:flex}.lc-trend-ctl,.lc-heat-ctl{align-items:center;gap:6px;margin-left:auto;display:flex}.lc-trend-ctl .lc-gran,.lc-heat-ctl .lc-gran,.lc-heat-ctl .lc-card-sub{margin-left:0}.lc-trend-dna,.lc-trend-adaptive{flex:none;margin-left:0}.lc-gran-btn{color:var(--dsw-alias-label-secondary);cursor:pointer;transition:color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border:0;border-radius:5px;padding:3px 8px;font-family:inherit;font-size:11px;line-height:1}.lc-gran-btn:hover{color:var(--dsw-alias-label-primary)}.lc-gran-btn:disabled{opacity:.4;cursor:not-allowed}.lc-gran-btn:disabled:hover{color:var(--dsw-alias-label-secondary)}.lc-gran-on,.lc-gran-on:hover{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}.lc-kind-n{font-variant-numeric:tabular-nums;opacity:.65;margin-left:4px}.lc-gran-on .lc-kind-n{opacity:.85}.lc-tip{z-index:6;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:max-content;color:var(--dsw-alias-label-primary);box-shadow:var(--dsw-shadow-lv3,0 2px 8px #0000002e);pointer-events:none;opacity:0;transition:opacity var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-radius:6px;padding:6px 10px;font-size:12px;position:absolute}.lc-events,.lc-fa-list{flex-direction:column;gap:2px;height:320px;display:flex;overflow-y:auto}.lc-cols{flex-wrap:wrap;gap:14px;margin-bottom:14px;display:flex}.lc-cols>.lc-card,.lc-col>.lc-card:last-child{margin-bottom:0}.lc-col-browser{flex-direction:column;display:flex}.lc-col-browser>.lc-card{flex:1}.lc-head>.lc-card:has(.lc-stats){flex-direction:column;display:flex}.lc-head .lc-stats{flex:1;align-content:stretch}.lc-head .lc-stat{justify-content:center}.lc-empty{color:var(--dsw-alias-label-secondary);text-align:center;padding:18px 0}.lc-error{flex-direction:column;align-items:center;gap:8px;padding:40px 16px;display:flex}.lc-error-msg{font-family:var(--ds-font-family-code,ui-monospace, SFMono-Regular, Menlo, monospace);color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);overflow-wrap:anywhere;border-radius:6px;max-width:100%;padding:4px 8px;font-size:12px}.lc-error-retry{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;transition:border-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-radius:6px;padding:4px 14px;font-size:12px}.lc-foot{color:var(--dsw-alias-label-secondary);margin-top:4px;font-size:12px}[data-conversation-scroll]:has(.lc-root)>[data-composer-seat]:not(:has([data-approval-key],[data-question-key],[data-plan-review-key])),[data-conversation-scroll]:has(.lc-root,.lc-modal-backdrop)~[data-width-handle]{display:none}";
12350
12879
  const tagId$14 = "dsh-context/base.css";
12351
12880
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$14) + "]") === null) {
12352
12881
  const tag = document.createElement("style");
@@ -12401,7 +12930,7 @@ window.__ModuleLoader__.load({
12401
12930
  }
12402
12931
  //#endregion
12403
12932
  //#region \0dsh-global-css:/home/runner/work/dsh-context/dsh-context/src/client/styles/trendChart.css.mjs
12404
- const css$9 = ".lc-chartrow{align-items:stretch;gap:6px;display:flex}.lc-axis{box-sizing:border-box;width:40px;height:150px;color:var(--dsw-alias-label-secondary);padding-top:18px;font-size:11px;position:relative}.lc-axis span{line-height:1;position:absolute;right:0}.lc-axis-top{top:13px}.lc-axis-q3{top:41px}.lc-axis-mid{top:69px}.lc-axis-q1{top:97px}.lc-axis-bot{top:125px}.lc-chart-wrap{flex:1;min-width:0;position:relative}.lc-chart-scroll{overscroll-behavior-x:contain;scrollbar-gutter:stable;padding-bottom:var(--dsh-scrollbar-width,8px);overflow:auto hidden}.lc-chart{box-sizing:border-box;align-items:flex-end;gap:2px;width:max-content;min-width:100%;height:130px;padding:18px 2px 0;display:flex;position:relative}.lc-grid{border-top:1px dashed var(--dsw-alias-border-l2);pointer-events:none;position:absolute;left:0;right:0}.lc-grid-top{top:18px}.lc-grid-q3{top:46px}.lc-grid-mid{top:74px}.lc-grid-q1{top:102px}.lc-grid-zero{border-top-style:solid;border-top-color:color-mix(in srgb, var(--color-neutral-500) 50%, transparent);top:130px}.lc-bar{cursor:pointer;outline-offset:1px;width:14px;height:100%;transition:opacity var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out), background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out), outline-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-radius:2px;outline:1px dashed #0000;flex:none;align-items:flex-end;display:flex;position:relative}.lc-chart-dim .lc-bar{opacity:.35}.lc-chart-dim .lc-bar-in-turn{opacity:1}.lc-chart-dim .lc-turn{opacity:.35}.lc-chart-dim .lc-turn-on{opacity:1}.lc-chart-tip{z-index:5;box-sizing:border-box;overflow-wrap:break-word;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);max-width:100%;color:var(--dsw-alias-label-primary);pointer-events:none;border-radius:6px;flex-direction:column;gap:2px;padding:3px 8px;font-size:12px;display:flex;position:absolute;bottom:calc(100% + 4px);left:0;box-shadow:0 2px 8px #0000002e}.lc-chart-tip span+span{color:var(--dsw-alias-label-secondary)}.lc-bar-hovered{outline-color:var(--dsw-alias-brand-primary)}.lc-bar-selected{outline:2px solid var(--dsw-alias-label-primary);outline-offset:1px}.lc-bar-in-turn{background:color-mix(in srgb, var(--color-neutral-500) 14%, transparent)}.lc-bar-stack{flex-direction:column-reverse;width:100%;display:flex}.lc-bar-stack>div{width:100%}.lc-bar-stack,.lc-bar-up,.lc-bar-down{transform-origin:50% 100%}.lc-bar-down{transform-origin:50% 0}.lc-bar-stack>div:first-child{border-radius:0 0 2px 2px}.lc-bar-stack>div:last-child{border-radius:2px 2px 0 0}.lc-bar-stack>div:only-child{border-radius:2px}.lc-bar-up,.lc-bar-down{width:100%;display:flex;position:absolute;left:0}.lc-bar-up{flex-direction:column-reverse}.lc-bar-down{flex-direction:column}.lc-bar-up>div,.lc-bar-down>div{width:100%}.lc-bar-up>div:last-child{border-radius:2px 2px 0 0}.lc-bar-down>div:last-child{border-radius:0 0 2px 2px}.lc-cat-seg{transition:filter var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out), opacity var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out)}.lc-chart[data-catdim] .lc-cat-seg{opacity:.35}.lc-chart[data-catdim=system] .lc-cat-seg[data-cat=system],.lc-chart[data-catdim=tools] .lc-cat-seg[data-cat=tools],.lc-chart[data-catdim=user] .lc-cat-seg[data-cat=user],.lc-chart[data-catdim=inject] .lc-cat-seg[data-cat=inject],.lc-chart[data-catdim=skill] .lc-cat-seg[data-cat=skill],.lc-chart[data-catdim=assistant] .lc-cat-seg[data-cat=assistant],.lc-chart[data-catdim=tool] .lc-cat-seg[data-cat=tool]{opacity:1;filter:brightness(1.18)}.lc-bar-marker{color:var(--dsw-alias-state-warn-primary);font-size:11px;position:absolute;top:-16px;left:50%;transform:translate(-50%)}.lc-step-flag{background:color-mix(in srgb, var(--color-neutral-500) 45%, transparent);pointer-events:none;width:1px;position:absolute;top:-17px;bottom:0;right:-1px}.lc-step-flag-label{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--color-neutral-500) 45%, transparent);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);white-space:nowrap;border-radius:3px;padding:1px 3px;font-size:9px;font-weight:600;line-height:1;position:absolute;top:0;right:0}.lc-turns{box-sizing:border-box;gap:2px;width:max-content;min-width:100%;margin-top:4px;padding:0 2px;display:flex;overflow:hidden}.lc-turn{box-sizing:border-box;text-align:center;color:var(--dsw-alias-label-secondary);white-space:nowrap;cursor:pointer;height:14px;transition:filter var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out), opacity var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-radius:3px;flex:none;font-size:10px;font-weight:600;line-height:14px}.lc-turn-on{filter:brightness(1.35);color:var(--dsw-alias-label-primary)}.lc-turn-label{display:inline-block}";
12933
+ const css$9 = ".lc-chartrow{align-items:stretch;gap:6px;display:flex}.lc-axis{box-sizing:border-box;width:40px;height:150px;color:var(--dsw-alias-label-secondary);padding-top:18px;font-size:11px;position:relative}.lc-axis span{line-height:1;position:absolute;right:0}.lc-axis-top{top:13px}.lc-axis-q3{top:41px}.lc-axis-mid{top:69px}.lc-axis-q1{top:97px}.lc-axis-bot{top:125px}.lc-chart-wrap{flex:1;min-width:0;position:relative}.lc-chart-scroll{overscroll-behavior-x:contain;scrollbar-gutter:stable;padding-bottom:var(--dsh-scrollbar-width,8px);overflow:auto hidden}.lc-chart{box-sizing:border-box;align-items:flex-end;gap:2px;width:max-content;min-width:100%;height:130px;padding:18px 2px 0;display:flex;position:relative}.lc-grid{border-top:1px dashed var(--dsw-alias-border-l2);pointer-events:none;position:absolute;left:0;right:0}.lc-grid-top{top:18px}.lc-grid-q3{top:46px}.lc-grid-mid{top:74px}.lc-grid-q1{top:102px}.lc-grid-zero{border-top-style:solid;border-top-color:color-mix(in srgb, var(--color-neutral-500) 50%, transparent);top:130px}.lc-bar{cursor:pointer;outline-offset:1px;width:14px;height:100%;transition:opacity var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out), background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out), outline-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-radius:2px;outline:1px dashed #0000;flex:none;align-items:flex-end;display:flex;position:relative}.lc-chart-dim .lc-bar{opacity:.35}.lc-chart-dim .lc-bar-in-turn{opacity:1}.lc-chart-dim .lc-turn{opacity:.35}.lc-chart-dim .lc-turn-on{opacity:1}.lc-chart-tip{z-index:5;box-sizing:border-box;overflow-wrap:break-word;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);max-width:100%;color:var(--dsw-alias-label-primary);pointer-events:none;border-radius:6px;flex-direction:column;gap:2px;padding:3px 8px;font-size:12px;display:flex;position:absolute;bottom:calc(100% + 4px);left:0;box-shadow:0 2px 8px #0000002e}.lc-chart-tip span+span{color:var(--dsw-alias-label-secondary)}.lc-bar-hovered{outline-color:var(--dsw-alias-brand-primary)}.lc-bar-selected{outline:2px solid var(--dsw-alias-label-primary);outline-offset:1px}.lc-bar-in-turn{background:color-mix(in srgb, var(--color-neutral-500) 14%, transparent)}.lc-bar-stack{flex-direction:column-reverse;width:100%;display:flex}.lc-bar-stack>div{width:100%}.lc-bar-dna{border-radius:2px;width:100%}.lc-bar-stack,.lc-bar-up,.lc-bar-down,.lc-bar-dna{transform-origin:50% 100%}.lc-bar-down{transform-origin:50% 0}.lc-bar-stack>div:first-child{border-radius:0 0 2px 2px}.lc-bar-stack>div:last-child{border-radius:2px 2px 0 0}.lc-bar-stack>div:only-child{border-radius:2px}.lc-bar-up,.lc-bar-down{width:100%;display:flex;position:absolute;left:0}.lc-bar-up{flex-direction:column-reverse}.lc-bar-down{flex-direction:column}.lc-bar-up>div,.lc-bar-down>div{width:100%}.lc-bar-up>div:last-child{border-radius:2px 2px 0 0}.lc-bar-down>div:last-child{border-radius:0 0 2px 2px}.lc-cat-seg{transition:filter var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out), opacity var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out)}.lc-chart[data-catdim] .lc-cat-seg{opacity:.35}.lc-chart[data-catdim=system] .lc-cat-seg[data-cat=system],.lc-chart[data-catdim=tools] .lc-cat-seg[data-cat=tools],.lc-chart[data-catdim=user] .lc-cat-seg[data-cat=user],.lc-chart[data-catdim=inject] .lc-cat-seg[data-cat=inject],.lc-chart[data-catdim=skill] .lc-cat-seg[data-cat=skill],.lc-chart[data-catdim=assistant] .lc-cat-seg[data-cat=assistant],.lc-chart[data-catdim=tool] .lc-cat-seg[data-cat=tool]{opacity:1;filter:brightness(1.18)}.lc-dna-hl{z-index:1;pointer-events:none;align-items:stretch;gap:2px;display:flex;position:absolute;inset:18px 2px 0}.lc-dna-cell{flex:none;width:14px;position:relative}.lc-dna-slice{box-sizing:border-box;border:1px solid var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 26%, transparent);border-radius:1px;width:100%;position:absolute;left:0}.lc-bar-marker{z-index:2;color:var(--dsw-alias-state-warn-primary);font-size:11px;position:absolute;top:-16px;left:50%;transform:translate(-50%)}.lc-step-flag{z-index:2;background:color-mix(in srgb, var(--color-neutral-500) 45%, transparent);pointer-events:none;width:1px;position:absolute;top:-17px;bottom:0;right:-1px}.lc-step-flag-label{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--color-neutral-500) 45%, transparent);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);white-space:nowrap;border-radius:3px;padding:1px 3px;font-size:9px;font-weight:600;line-height:1;position:absolute;top:0;right:0}.lc-turns{box-sizing:border-box;gap:2px;width:max-content;min-width:100%;margin-top:4px;padding:0 2px;display:flex;overflow:hidden}.lc-turn{box-sizing:border-box;text-align:center;color:var(--dsw-alias-label-secondary);white-space:nowrap;cursor:pointer;height:14px;transition:filter var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out), opacity var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-radius:3px;flex:none;font-size:10px;font-weight:600;line-height:14px}.lc-turn-on{filter:brightness(1.35);color:var(--dsw-alias-label-primary)}.lc-turn-label{display:inline-block}";
12405
12934
  const tagId$9 = "dsh-context/trendChart.css";
12406
12935
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$9) + "]") === null) {
12407
12936
  const tag = document.createElement("style");
@@ -12412,7 +12941,7 @@ window.__ModuleLoader__.load({
12412
12941
  }
12413
12942
  //#endregion
12414
12943
  //#region \0dsh-global-css:/home/runner/work/dsh-context/dsh-context/src/client/styles/requestDetail.css.mjs
12415
- const css$8 = ".lc-detail{border-top:1px solid var(--dsw-alias-border-l1);margin-top:12px;padding-top:12px}.lc-detail-head{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;align-items:center;gap:6px 8px;margin-bottom:10px;display:flex}.lc-detail-head b{color:var(--dsw-alias-label-primary);font-size:13px}.lc-detail-time{font-variant-numeric:tabular-nums;white-space:nowrap;margin-left:auto;font-size:12px}.lc-detail-marker{color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);border-radius:6px;padding:1px 7px;font-size:11px}.lc-detail-tag{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);border-radius:4px;padding:0 6px;font-size:11px}.lc-detail-metric{font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-label-secondary) 14%, transparent);border-radius:6px;padding:2px 8px;font-size:12px;font-weight:600}.lc-detail-metric-up{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 15%, transparent)}.lc-detail-metric-down{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent)}.lc-detail-rows{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:4px 24px;margin-top:10px;display:grid}.lc-brief{flex-direction:column;gap:2px;min-height:76px;margin:-4px 0 10px;display:flex}.lc-brief-row{min-width:0;color:var(--dsw-alias-label-primary);text-align:left;transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;margin-left:-6px;margin-right:-6px;padding:3px 6px;font-family:inherit;font-size:12px;line-height:1.5;display:flex}button.lc-brief-row-link{cursor:pointer}.lc-brief-tag{box-sizing:border-box;text-align:center;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);min-width:56px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;position:relative}.lc-brief-tip{white-space:normal;text-align:left;max-width:240px;font-weight:400;line-height:1.5;bottom:calc(100% + 6px);left:0}.lc-brief-text{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-brief-empty{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-tertiary);flex:1;overflow:hidden}.lc-brief-fact{box-sizing:border-box;text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);max-width:160px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;overflow:hidden}.lc-brief-chip{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);min-width:0;max-width:260px;color:var(--dsw-alias-label-primary);transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-radius:5px;align-items:center;gap:5px;padding:0 7px;font-size:12px;display:inline-flex;overflow:hidden}.lc-brief-chip-grow{flex:1;max-width:none}.lc-brief-chip-tag{text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);max-width:120px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;overflow:hidden}.lc-brief-chip-text{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-brief-chip-link{cursor:pointer}.lc-brief-more{color:var(--dsw-alias-label-secondary);flex:none;font-size:11px}.lc-detail-row{transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-radius:4px;align-items:center;gap:8px;margin:-1px -4px;padding:1px 4px;display:flex}.lc-detail-row i{transition:box-shadow var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out)}.lc-detail-row-on{background:var(--dsw-alias-interactive-bg-hover)}.lc-detail-row-on i{box-shadow:0 0 0 1px var(--dsw-alias-brand-primary)}.lc-detail-row-on .lc-detail-label{font-weight:600}.lc-detail-label{white-space:nowrap;min-width:70px;color:var(--dsw-alias-label-secondary)}.lc-bar-track{background:color-mix(in srgb, var(--color-neutral-500) 18%, transparent);border-radius:3px;flex:1;height:5px;display:block;position:relative;overflow:hidden}.lc-bar-fill{border-radius:3px;height:100%;display:block}.lc-bar-zero{border-left:1px solid color-mix(in srgb, var(--color-neutral-500) 45%, transparent);position:absolute;top:0;bottom:0;left:50%}.lc-bar-fill-up,.lc-bar-fill-down{height:100%;display:block;position:absolute;top:0}.lc-bar-fill-up{border-radius:0 3px 3px 0;left:50%}.lc-bar-fill-down{border-radius:3px 0 0 3px;right:50%}.lc-detail-num{text-align:right;font-variant-numeric:tabular-nums;width:52px}.lc-detail-num-up{color:var(--dsw-alias-state-success-primary)}.lc-detail-num-down{color:var(--dsw-alias-state-error-primary)}.lc-detail-pct{text-align:right;width:34px;color:var(--dsw-alias-label-secondary)}";
12944
+ const css$8 = ".lc-detail{border-top:1px solid var(--dsw-alias-border-l1);margin-top:12px;padding-top:12px}.lc-detail-head{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;align-items:center;gap:6px 8px;margin-bottom:10px;display:flex}.lc-detail-head b{color:var(--dsw-alias-label-primary);font-size:13px}.lc-detail-time{font-variant-numeric:tabular-nums;white-space:nowrap;margin-left:auto;font-size:12px}.lc-detail-marker{color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);border-radius:6px;padding:1px 7px;font-size:11px}.lc-detail-tag{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);border-radius:4px;padding:0 6px;font-size:11px}.lc-detail-metric{font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-label-secondary) 14%, transparent);border-radius:6px;padding:2px 8px;font-size:12px;font-weight:600}.lc-detail-metric-up{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 15%, transparent)}.lc-detail-metric-down{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent)}.lc-detail-rows{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:4px 24px;margin-top:10px;display:grid}.lc-brief{flex-direction:column;gap:2px;min-height:76px;margin:-4px 0 10px;display:flex}.lc-brief-row{min-width:0;color:var(--dsw-alias-label-primary);text-align:left;transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;margin-left:-6px;margin-right:-6px;padding:3px 6px;font-family:inherit;font-size:12px;line-height:1.5;display:flex}button.lc-brief-row-link{cursor:pointer}.lc-brief-tag{box-sizing:border-box;text-align:center;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);min-width:56px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;position:relative}.lc-brief-tip{white-space:normal;text-align:left;max-width:240px;font-weight:400;line-height:1.5;bottom:calc(100% + 6px);left:0}.lc-brief-text{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-brief-empty{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-tertiary);flex:1;overflow:hidden}.lc-brief-fact{box-sizing:border-box;text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);max-width:160px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;overflow:hidden}.lc-brief-chip{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);min-width:0;max-width:260px;color:var(--dsw-alias-label-primary);transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-radius:5px;align-items:center;gap:5px;padding:0 7px;font-size:12px;display:inline-flex;overflow:hidden}.lc-brief-chip-grow{flex:1;max-width:none}.lc-brief-chip-tag{text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);max-width:120px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;overflow:hidden}.lc-brief-chip-text{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-brief-chip-link{cursor:pointer}.lc-brief-more{color:var(--dsw-alias-label-secondary);flex:none;font-size:11px}.lc-detail-row{transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-radius:4px;align-items:center;gap:8px;margin:-1px -4px;padding:1px 4px;display:flex}.lc-detail-row i{transition:box-shadow var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out)}.lc-detail-row-on{background:var(--dsw-alias-interactive-bg-hover)}.lc-detail-row-on i{box-shadow:0 0 0 1px var(--dsw-alias-brand-primary)}.lc-detail-row-on .lc-detail-label{font-weight:600}.lc-detail-label{white-space:nowrap;min-width:70px;color:var(--dsw-alias-label-secondary)}.lc-bar-track{background:color-mix(in srgb, var(--color-neutral-500) 18%, transparent);border-radius:3px;flex:1;height:5px;display:block;position:relative;overflow:hidden}.lc-bar-fill{border-radius:3px;height:100%;display:block}.lc-bar-zero{border-left:1px solid color-mix(in srgb, var(--color-neutral-500) 45%, transparent);position:absolute;top:0;bottom:0;left:50%}.lc-bar-fill-up,.lc-bar-fill-down{height:100%;display:block;position:absolute;top:0}.lc-bar-fill-up{border-radius:0 3px 3px 0;left:50%}.lc-bar-fill-down{border-radius:3px 0 0 3px;right:50%}.lc-detail-num{text-align:right;font-variant-numeric:tabular-nums;width:52px}.lc-detail-num-up{color:var(--dsw-alias-state-success-primary)}.lc-detail-num-down{color:var(--dsw-alias-state-error-primary)}.lc-detail-pct{text-align:right;width:34px;color:var(--dsw-alias-label-secondary)}";
12416
12945
  const tagId$8 = "dsh-context/requestDetail.css";
12417
12946
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$8) + "]") === null) {
12418
12947
  const tag = document.createElement("style");
@@ -12434,7 +12963,7 @@ window.__ModuleLoader__.load({
12434
12963
  }
12435
12964
  //#endregion
12436
12965
  //#region \0dsh-global-css:/home/runner/work/dsh-context/dsh-context/src/client/styles/fileCard.css.mjs
12437
- const css$6 = ".lc-fa-ctl,.lc-br-toolctl{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:8px;display:flex}.lc-fa-ctl .lc-gran{margin-left:0}.lc-fa-n{opacity:.75;margin-left:4px;font-weight:700}.lc-fa-search,.lc-br-tool-search{min-width:80px;font:inherit;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:6px;outline:none;flex:1;padding:3px 8px;font-size:12px}.lc-fa-meta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:6px;font-size:12px;display:flex}.lc-fa-meta .lc-fa-sort{flex:none}.lc-fa-meta-delta{position:relative}.lc-fa-meta-tip{white-space:normal;max-width:260px;line-height:1.5;top:calc(100% + 6px);left:0}.lc-fa-item{transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out), border-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border:1px solid #0000;border-radius:8px}.lc-fa-item-on{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-border-l2)}.lc-fa-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border:0;border-radius:7px;align-items:center;gap:7px;padding:6px 8px;font-size:12px;display:flex}.lc-fa-form{opacity:.85;flex:none;justify-content:center;align-items:center;width:20px;height:14px;font-size:11px;display:flex}.lc-fa-lang{border-radius:4px;justify-content:center;align-items:center;min-width:16px;height:13px;padding:0 2px;font-size:8px;font-weight:700;line-height:1;display:inline-flex}.lc-fa-row .lc-br-chev{margin-right:-2px}.lc-fa-path{word-break:break-all;min-width:0}.lc-fa-file{cursor:pointer}.lc-fa-path em{color:var(--dsw-alias-label-secondary);font-style:normal}.lc-fa-badge{font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:4px;padding:1px 7px;font-size:11px;font-weight:600;display:inline-flex}.lc-fa-badge i{background:currentColor;border-radius:50%;width:5px;height:5px;display:inline-block}.lc-fa-b-read{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent)}.lc-fa-b-write{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent)}.lc-fa-b-search{color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent)}.lc-fa-chip-read,.lc-fa-chip-read:hover{color:var(--dsw-alias-brand-primary)}.lc-fa-chip-write,.lc-fa-chip-write:hover{color:var(--dsw-alias-state-success-primary)}.lc-fa-chip-search,.lc-fa-chip-search:hover{color:var(--dsw-alias-state-warn-primary)}.lc-fa-chip-read.lc-gran-on,.lc-fa-chip-read.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent);color:var(--dsw-alias-brand-primary)}.lc-fa-chip-write.lc-gran-on,.lc-fa-chip-write.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent);color:var(--dsw-alias-state-success-primary)}.lc-fa-chip-search.lc-gran-on,.lc-fa-chip-search.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);color:var(--dsw-alias-state-warn-primary)}.lc-fa-delta{font-variant-numeric:tabular-nums;white-space:nowrap;flex:none;gap:5px;font-size:11px;font-weight:600;display:inline-flex}.lc-fa-up{color:var(--dsw-alias-state-success-primary)}.lc-fa-down{color:var(--dsw-alias-state-error-primary)}.lc-fa-time{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex:none;font-size:11px}.lc-fa-ops{border-left:2px solid var(--dsw-alias-border-l1);flex-direction:column;gap:1px;margin:0 8px 8px 15px;padding:2px 0 2px 10px;display:flex}.lc-fa-op{min-width:0;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border:0;border-radius:5px;align-items:center;gap:8px;padding:3px 6px;font-size:11px;display:flex}.lc-fa-op-link{cursor:pointer}.lc-fa-op-time{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex:none;margin-left:auto}.lc-fa-op-tool{text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);max-width:220px;color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:0 6px;font-size:11px;overflow:hidden}.lc-fa-op-detail{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-secondary);flex:1;overflow:hidden}.lc-fa-read{color:var(--dsw-alias-brand-primary);font-variant-numeric:tabular-nums;white-space:nowrap;flex:none;font-size:11px;font-weight:600}";
12966
+ const css$6 = ".lc-fa-ctl,.lc-br-toolctl{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:8px;display:flex}.lc-fa-ctl .lc-gran{margin-left:0}.lc-fa-n{opacity:.75;margin-left:4px;font-weight:700}.lc-fa-search,.lc-br-tool-search{min-width:80px;font:inherit;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:6px;outline:none;flex:1;padding:3px 8px;font-size:12px}.lc-fa-meta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:6px;font-size:12px;display:flex}.lc-fa-meta .lc-fa-sort{flex:none}.lc-fa-meta-delta{position:relative}.lc-fa-meta-tip{white-space:normal;max-width:260px;line-height:1.5;top:calc(100% + 6px);left:0}.lc-fa-item{transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out), border-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border:1px solid #0000;border-radius:8px}.lc-fa-item-on{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-border-l2)}.lc-fa-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border:0;border-radius:7px;align-items:center;gap:7px;padding:6px 8px;font-size:12px;display:flex}.lc-fa-form{opacity:.85;flex:none;justify-content:center;align-items:center;width:20px;height:14px;font-size:11px;display:flex}.lc-fa-lang{border-radius:4px;justify-content:center;align-items:center;min-width:16px;height:13px;padding:0 2px;font-size:8px;font-weight:700;line-height:1;display:inline-flex}.lc-fa-row .lc-br-chev{margin-right:-2px}.lc-fa-path{word-break:break-all;min-width:0}.lc-fa-file{cursor:pointer}.lc-fa-path em{color:var(--dsw-alias-label-secondary);font-style:normal}.lc-fa-badge{font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:4px;padding:1px 7px;font-size:11px;font-weight:600;display:inline-flex}.lc-fa-badge i{background:currentColor;border-radius:50%;width:5px;height:5px;display:inline-block}.lc-fa-b-read{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent)}.lc-fa-b-write{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent)}.lc-fa-b-search{color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent)}.lc-fa-chip-read,.lc-fa-chip-read:hover{color:var(--dsw-alias-brand-primary)}.lc-fa-chip-write,.lc-fa-chip-write:hover{color:var(--dsw-alias-state-success-primary)}.lc-fa-chip-search,.lc-fa-chip-search:hover{color:var(--dsw-alias-state-warn-primary)}.lc-fa-chip-read.lc-gran-on,.lc-fa-chip-read.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent);color:var(--dsw-alias-brand-primary)}.lc-fa-chip-write.lc-gran-on,.lc-fa-chip-write.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent);color:var(--dsw-alias-state-success-primary)}.lc-fa-chip-search.lc-gran-on,.lc-fa-chip-search.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);color:var(--dsw-alias-state-warn-primary)}.lc-fa-delta{font-variant-numeric:tabular-nums;white-space:nowrap;flex:none;gap:5px;font-size:11px;font-weight:600;display:inline-flex}.lc-fa-up{color:var(--dsw-alias-state-success-primary)}.lc-fa-down{color:var(--dsw-alias-state-error-primary)}.lc-fa-time{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex:none;font-size:11px}.lc-fa-ops{border-left:2px solid var(--dsw-alias-border-l1);flex-direction:column;gap:1px;margin:0 8px 8px 15px;padding:2px 0 2px 10px;display:flex}.lc-fa-op{min-width:0;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border:0;border-radius:5px;align-items:center;gap:8px;padding:3px 6px;font-size:11px;display:flex}.lc-fa-op-link{cursor:pointer}.lc-fa-op-time{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex:none;margin-left:auto}.lc-fa-op-tool{text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);max-width:220px;color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:0 6px;font-size:11px;overflow:hidden}.lc-fa-op-detail{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-secondary);flex:1;overflow:hidden}.lc-fa-read{color:var(--dsw-alias-brand-primary);font-variant-numeric:tabular-nums;white-space:nowrap;flex:none;font-size:11px;font-weight:600}";
12438
12967
  const tagId$6 = "dsh-context/fileCard.css";
12439
12968
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$6) + "]") === null) {
12440
12969
  const tag = document.createElement("style");
@@ -12456,7 +12985,7 @@ window.__ModuleLoader__.load({
12456
12985
  }
12457
12986
  //#endregion
12458
12987
  //#region \0dsh-global-css:/home/runner/work/dsh-context/dsh-context/src/client/styles/browser.css.mjs
12459
- const css$4 = ".lc-br-dna-ctl{flex:none;margin-left:0}.lc-br-bar-dna .lc-stacked-seg{background-image:linear-gradient(to right, transparent calc(100% - min(.5px, 12.5%)), var(--dsw-alias-bg-layer-1) 0)}.lc-br-hint{color:var(--dsw-alias-label-secondary);white-space:nowrap;margin-left:auto;font-size:11px;font-weight:400}.lc-br-pick{font:inherit;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:6px;max-width:240px;padding:3px 6px;font-size:12px}.lc-br-meta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:6px 16px;margin-bottom:8px;display:flex}.lc-br-meta b{color:var(--dsw-alias-label-primary)}.lc-br-meta .lc-est{margin-left:auto}.lc-br-note{color:var(--dsw-alias-label-secondary);margin-top:8px;font-size:12px}.lc-br-retry{color:var(--dsw-alias-brand-primary);font:inherit;cursor:pointer;text-underline-offset:2px;transition:filter var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border:0;padding:0;font-size:12px;text-decoration:underline}.lc-br-cats{flex-direction:column;gap:4px;margin-top:10px;display:flex}.lc-br-cat{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:8px;overflow:hidden}.lc-br-cat-empty{opacity:.55}.lc-br-cat-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border:0;align-items:center;gap:8px;padding:7px 10px;display:flex}.lc-br-cat-on{background:var(--dsw-alias-interactive-bg-hover)}.lc-br-cat-on i{box-shadow:0 0 0 1px var(--dsw-alias-brand-primary)}.lc-br-cat-open{background:var(--dsw-alias-interactive-bg-hover)}.lc-br-cat-row i{width:8px;height:8px;transition:box-shadow var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-radius:2px;flex:none;display:inline-block}.lc-br-cat-label{font-weight:600}.lc-br-cat-count{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-size:12px}.lc-br-count-grp{flex:1;align-items:center;gap:4px;min-width:0;display:inline-flex}.lc-br-chev{width:12px;height:14px;color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;display:flex}.lc-br-chev:before{content:\"\";width:5px;height:5px;transition:transform var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-bottom:1px solid;border-right:1px solid;transform:rotate(-45deg)}.lc-br-chev-on:before{transform:rotate(45deg)}.lc-br-tokens{color:var(--dsw-alias-label-secondary);flex:none;font-size:12px}.lc-br-delta,.lc-br-tdelta{white-space:nowrap;border-radius:4px;flex:none;padding:0 5px;font-size:11px;font-weight:600}.lc-br-delta-up,.lc-br-tdelta-up{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 15%, transparent)}.lc-br-delta-down,.lc-br-tdelta-down{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent)}.lc-br-tokens-grp{flex:none;align-items:center;gap:4px;min-width:0;display:inline-flex}.lc-br-pct{text-align:right;width:36px;color:var(--dsw-alias-label-secondary);flex:none;font-size:12px}.lc-br-body{border-top:1px solid var(--dsw-alias-border-l1);flex-direction:column;gap:2px;padding:4px 6px;display:flex}.lc-br-elem{border-radius:6px}.lc-br-elem-on{background:var(--dsw-alias-interactive-bg-active)}.lc-br-elem-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;padding:5px 6px;font-size:12px;display:flex}.lc-br-err-dot{background:var(--dsw-alias-state-error-primary);width:6px;height:6px;box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);border-radius:50%;flex:none}.lc-br-tag{min-width:0;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;max-width:220px;padding:0 6px;font-size:11px;overflow:hidden}.lc-br-tool-plugin{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent);border-color:#0000;border-radius:6px;font-size:12px}.lc-br-preview{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-br-time,.lc-br-hits{color:var(--dsw-alias-label-secondary);flex:none;font-size:11px}.lc-br-content{flex-direction:column;gap:6px;padding:2px 6px 8px 26px;display:flex}.lc-br-dim{color:var(--dsw-alias-label-secondary)}";
12988
+ const css$4 = ".lc-br-dna-ctl{flex:none;margin-left:0}.lc-br-bar-dna .lc-stacked-seg{background-image:linear-gradient(to right, transparent calc(100% - min(.5px, 12.5%)), var(--dsw-alias-bg-layer-1) 0)}.lc-br-pick{font:inherit;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:6px;max-width:240px;padding:3px 6px;font-size:12px}.lc-br-meta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:6px 16px;margin-bottom:8px;display:flex}.lc-br-meta b{color:var(--dsw-alias-label-primary)}.lc-br-meta .lc-est{margin-left:auto}.lc-br-note{color:var(--dsw-alias-label-secondary);margin-top:8px;font-size:12px}.lc-br-retry{color:var(--dsw-alias-brand-primary);font:inherit;cursor:pointer;text-underline-offset:2px;transition:filter var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border:0;padding:0;font-size:12px;text-decoration:underline}.lc-br-cats{flex-direction:column;gap:4px;margin-top:10px;display:flex}.lc-br-cat{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:8px;overflow:hidden}.lc-br-cat-empty{opacity:.55}.lc-br-cat-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border:0;align-items:center;gap:8px;padding:7px 10px;display:flex}.lc-br-cat-on{background:var(--dsw-alias-interactive-bg-hover)}.lc-br-cat-on i{box-shadow:0 0 0 1px var(--dsw-alias-brand-primary)}.lc-br-cat-open{background:var(--dsw-alias-interactive-bg-hover)}.lc-br-cat-row i{width:8px;height:8px;transition:box-shadow var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-radius:2px;flex:none;display:inline-block}.lc-br-cat-label{font-weight:600}.lc-br-cat-count{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-size:12px}.lc-br-count-grp{flex:1;align-items:center;gap:4px;min-width:0;display:inline-flex}.lc-br-chev{width:12px;height:14px;color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;display:flex}.lc-br-chev:before{content:\"\";width:5px;height:5px;transition:transform var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-bottom:1px solid;border-right:1px solid;transform:rotate(-45deg)}.lc-br-chev-on:before{transform:rotate(45deg)}.lc-br-tokens{color:var(--dsw-alias-label-secondary);flex:none;font-size:12px}.lc-br-delta,.lc-br-tdelta{white-space:nowrap;border-radius:4px;flex:none;padding:0 5px;font-size:11px;font-weight:600}.lc-br-delta-up,.lc-br-tdelta-up{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 15%, transparent)}.lc-br-delta-down,.lc-br-tdelta-down{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent)}.lc-br-tokens-grp{flex:none;align-items:center;gap:4px;min-width:0;display:inline-flex}.lc-br-pct{text-align:right;width:36px;color:var(--dsw-alias-label-secondary);flex:none;font-size:12px}.lc-br-body{border-top:1px solid var(--dsw-alias-border-l1);flex-direction:column;gap:2px;padding:4px 6px;display:flex}.lc-br-elem{border-radius:6px}.lc-br-elem-on{background:var(--dsw-alias-interactive-bg-active)}.lc-br-elem-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;padding:5px 6px;font-size:12px;display:flex}.lc-br-err-dot{background:var(--dsw-alias-state-error-primary);width:6px;height:6px;box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);border-radius:50%;flex:none}.lc-br-tag{min-width:0;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;max-width:220px;padding:0 6px;font-size:11px;overflow:hidden}.lc-br-tags{align-items:center;gap:4px;min-width:0;display:inline-flex}.lc-br-tool-plugin{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent);border-color:#0000;border-radius:6px;font-size:12px}.lc-br-preview{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-br-time,.lc-br-hits{color:var(--dsw-alias-label-secondary);flex:none;font-size:11px}.lc-br-content{flex-direction:column;gap:6px;padding:2px 6px 8px 26px;display:flex}.lc-br-dim{color:var(--dsw-alias-label-secondary)}";
12460
12989
  const tagId$4 = "dsh-context/browser.css";
12461
12990
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) {
12462
12991
  const tag = document.createElement("style");