dsh-context 0.38.2 → 0.38.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/lib/client.js +50 -47
  2. package/package.json +1 -1
package/lib/client.js CHANGED
@@ -189,8 +189,8 @@ window.__ModuleLoader__.load({
189
189
  "footer": "估算口径:与 dsh 内置 tokenMeter 相同的固定密度启发式(约 4 字符 ≈ 1 token);「实际」为供应商上报用量。",
190
190
  "tip.step": "第 {t} 轮 · 第{s}步",
191
191
  "tip.turn": "第 {t} 轮 · 共 {n} 步",
192
+ "tip.turn1": "第 {t} 轮 · 共 1 步",
192
193
  "tip.total": "合计 ≈ {n}",
193
- "tip.actual": "(实际 {n})",
194
194
  "tip.delta": "Δ {n}",
195
195
  "ev.compaction": "压缩上下文(摘要替换 {n} 条消息)",
196
196
  "ev.prune": "剪枝工具输出",
@@ -457,8 +457,8 @@ window.__ModuleLoader__.load({
457
457
  "footer": "Estimate: same fixed-density heuristic as dsh’s built-in tokenMeter (~4 chars ≈ 1 token); “actual” is provider-reported usage.",
458
458
  "tip.step": "Turn {t} · Step {s}",
459
459
  "tip.turn": "Turn {t} · {n} steps",
460
+ "tip.turn1": "Turn {t} · 1 step",
460
461
  "tip.total": "Total ≈ {n}",
461
- "tip.actual": " (actual {n})",
462
462
  "tip.delta": "Δ {n}",
463
463
  "ev.compaction": "Context compacted (summary replaced {n} messages)",
464
464
  "ev.prune": "Tool output pruned",
@@ -2977,20 +2977,6 @@ window.__ModuleLoader__.load({
2977
2977
  response
2978
2978
  };
2979
2979
  }
2980
- /**
2981
- * seq → one-line reply preview for the chart tooltip: the response node's
2982
- * text, else its tool-call breadcrumb. Absent for usage-only replies and
2983
- * steps outside retention.
2984
- */
2985
- function replyTipsOf(nodes) {
2986
- const m = /* @__PURE__ */ new Map();
2987
- for (const n of nodes) {
2988
- if (n.cat !== "assistant") continue;
2989
- const s = n.text ?? (n.calls !== void 0 ? n.calls.join(" › ") : "");
2990
- if (s !== "") m.set(n.seq, s);
2991
- }
2992
- return m;
2993
- }
2994
2980
  //#endregion
2995
2981
  //#region src/client/fileActivity.ts
2996
2982
  const KIND_BY_TOOL = {
@@ -4830,7 +4816,7 @@ window.__ModuleLoader__.load({
4830
4816
  return function PluginInfo() {
4831
4817
  const [latest, setLatest] = React.useState(null);
4832
4818
  React.useEffect(() => {
4833
- if ("0.38.2".includes("-dev")) return;
4819
+ if ("0.38.3".includes("-dev")) return;
4834
4820
  let on = true;
4835
4821
  fetchLatestVersion().then((v) => {
4836
4822
  if (on && v) setLatest(v);
@@ -4839,8 +4825,8 @@ window.__ModuleLoader__.load({
4839
4825
  on = false;
4840
4826
  };
4841
4827
  }, []);
4842
- const update = latest !== null && isNewerVersion(latest, "0.38.2") ? latest : null;
4843
- const nameText = "dsh-context (v0.38.2)";
4828
+ const update = latest !== null && isNewerVersion(latest, "0.38.3") ? latest : null;
4829
+ const nameText = "dsh-context (v0.38.3)";
4844
4830
  const nameValue = [nameText];
4845
4831
  if (update) nameValue.push(/* @__PURE__ */ React.createElement("span", {
4846
4832
  key: "update",
@@ -5399,11 +5385,14 @@ window.__ModuleLoader__.load({
5399
5385
  return requests.length > 0 ? requests[0] : null;
5400
5386
  }
5401
5387
  function makeTrendChart(kit) {
5402
- const { t, fmt, fmtTime, eventLabel, eventAt } = kit;
5388
+ const { t, fmt, eventLabel, eventAt } = kit;
5403
5389
  const CHART_H = 112;
5390
+ const fmtSigned = (v) => (v > 0 ? "+" : "") + fmt(v);
5404
5391
  const BAR_W = 14;
5405
5392
  const BAR_GAP = 2;
5406
5393
  const TURN_FILLS = ["rgba(128,128,128,0.12)", "rgba(128,128,128,0.26)"];
5394
+ const LABEL_OVERHANG = 48;
5395
+ const LABEL_GAP = 4;
5407
5396
  const anchorOf = (req) => typeof req.prompt === "number" && req.prompt > 0 && req.total > 0 ? req.prompt / req.total : 1;
5408
5397
  const barTotalOf = (req) => typeof req.prompt === "number" && req.prompt > 0 ? req.prompt : req.total;
5409
5398
  /**
@@ -5513,6 +5502,8 @@ window.__ModuleLoader__.load({
5513
5502
  const deltaScale = CHART_H / span;
5514
5503
  const upPx = Math.round(maxUp * deltaScale);
5515
5504
  const downPx = CHART_H - upPx;
5505
+ const q3Clear = Math.abs(28 - upPx) >= 11;
5506
+ const q1Clear = Math.abs(84 - upPx) >= 11;
5516
5507
  const groups = [];
5517
5508
  for (const req of requests) {
5518
5509
  let grp = groups.length > 0 ? groups[groups.length - 1] : null;
@@ -5545,9 +5536,12 @@ window.__ModuleLoader__.load({
5545
5536
  const lastSeqRef = React.useRef(0);
5546
5537
  const prevScrollWidthRef = React.useRef(0);
5547
5538
  /**
5548
- * Keep each turn label centered within its block's VISIBLE slice so it never scrolls out while any part of the block is on screen
5549
- * (narrower-than-label blocks stay put); reads (offsetWidth) batch before writes (transform) to avoid layout thrash out-of-view
5550
- * blocks need no measurement.
5539
+ * Keep each turn label centered within its block's VISIBLE slice, then thin colliding labels: a label wider
5540
+ * than its block overflows it, so consecutive narrow turns (14px bars, 2-digit "T12"s) would smear into each
5541
+ * other walking left→right in content coordinates, a label whose box reaches the previous KEPT one drops to
5542
+ * visibility:hidden. Blocks that cannot reach the viewport even overhung by a label skip their reads/writes
5543
+ * entirely (their transform/visibility just reset); reads (offsetWidth) batch before the writes to avoid layout
5544
+ * thrash, and unchanged styles write nothing.
5551
5545
  */
5552
5546
  const updateTurnLabels = (el) => {
5553
5547
  const labels = el.querySelectorAll(".lc-turn-label");
@@ -5555,23 +5549,35 @@ window.__ModuleLoader__.load({
5555
5549
  const sl = el.scrollLeft;
5556
5550
  const vr = sl + el.clientWidth;
5557
5551
  const writes = [];
5552
+ let chainR = -Infinity;
5558
5553
  for (let i = 0; i < n; i++) {
5559
5554
  const off = turnOffsets[i];
5560
5555
  const w = turnWidths[i];
5561
- const visL = Math.max(off, sl);
5562
- const visR = Math.min(off + w, vr);
5563
5556
  let dx = 0;
5564
- if (visR > visL) {
5557
+ let vis = "";
5558
+ if (off + w + LABEL_OVERHANG > sl && off - LABEL_OVERHANG < vr) {
5565
5559
  const lw = labels[i].offsetWidth;
5566
- if (lw < w) {
5560
+ const visL = Math.max(off, sl);
5561
+ const visR = Math.min(off + w, vr);
5562
+ if (visR > visL && lw < w) {
5567
5563
  const center = (visL + visR) / 2 - off;
5568
5564
  dx = Math.min(Math.max(center, lw / 2), w - lw / 2) - w / 2;
5569
5565
  }
5566
+ const left = off + w / 2 + dx - lw / 2;
5567
+ if (left < chainR) vis = "hidden";
5568
+ else chainR = left + lw + LABEL_GAP;
5570
5569
  }
5571
5570
  const next = dx !== 0 ? `translateX(${dx}px)` : "";
5572
- if (labels[i].style.transform !== next) writes.push([labels[i], next]);
5571
+ if (labels[i].style.transform !== next || labels[i].style.visibility !== vis) writes.push([
5572
+ labels[i],
5573
+ next,
5574
+ vis
5575
+ ]);
5576
+ }
5577
+ for (const [label, next, vis] of writes) {
5578
+ label.style.transform = next;
5579
+ label.style.visibility = vis;
5573
5580
  }
5574
- for (const [label, next] of writes) label.style.transform = next;
5575
5581
  };
5576
5582
  React.useLayoutEffect(() => {
5577
5583
  const el = scrollRef.current;
@@ -5605,23 +5611,22 @@ window.__ModuleLoader__.load({
5605
5611
  props.focusTurn,
5606
5612
  requests
5607
5613
  ]);
5608
- const tipOf = (req) => {
5609
- const head = req.stepCount !== void 0 && req.stepCount > 1 ? t("tip.turn", {
5614
+ const tipRowsOf = (req) => {
5615
+ const n = req.stepCount ?? 1;
5616
+ const head = props.granularity === "turn" ? n > 1 ? t("tip.turn", {
5610
5617
  t: req.turn ?? 0,
5611
- n: req.stepCount
5612
- }) : t("tip.step", {
5618
+ n
5619
+ }) : t("tip.turn1", { t: req.turn ?? 0 }) : t("tip.step", {
5613
5620
  t: req.turn ?? 0,
5614
5621
  s: req.step ?? 0
5615
5622
  });
5616
- const reply = props.replyTips?.get(req.seq);
5617
- const tail = reply !== void 0 ? " · “" + (reply.length > 48 ? reply.slice(0, 48) + "…" : reply) + "”" : "";
5618
5623
  if (delta) {
5619
5624
  /* v8 ignore next 1 -- delta mode only receives records from
5620
5625
  deltaOf, which always assigns net; the fallback is defensive. */
5621
5626
  const n = req.net ?? 0;
5622
- return head + " · " + fmtTime(req.time) + " · " + t("tip.delta", { n: (n > 0 ? "+" : "") + fmt(n) }) + tail;
5627
+ return [head, t("tip.delta", { n: (n > 0 ? "+" : "") + fmt(n) })];
5623
5628
  }
5624
- return head + " · " + fmtTime(req.time) + " · " + t("tip.total", { n: fmt(req.total) }) + (req.prompt !== void 0 ? " · " + t("tip.actual", { n: fmt(req.prompt) }) : "") + tail;
5629
+ return [head, t("tip.total", { n: fmt(barTotalOf(req)) })];
5625
5630
  };
5626
5631
  const hoveredIdx = props.hoveredSeq !== null ? requests.findIndex((r) => r.seq === props.hoveredSeq) : -1;
5627
5632
  const hoveredReq = hoveredIdx >= 0 ? requests[hoveredIdx] : null;
@@ -5651,10 +5656,10 @@ window.__ModuleLoader__.load({
5651
5656
  tipColRef.current = hoveredIdx >= 0 ? hoveredIdx * 16 + BAR_W / 2 : 0;
5652
5657
  syncTip(scrollRef.current);
5653
5658
  });
5654
- return /* @__PURE__ */ React.createElement("div", { className: "lc-chartrow" }, /* @__PURE__ */ React.createElement("div", { className: "lc-axis" }, delta ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("span", { className: "lc-axis-top" }, (maxUp > 0 ? "+" : "") + fmt(maxUp)), /* @__PURE__ */ React.createElement("span", {
5659
+ return /* @__PURE__ */ React.createElement("div", { className: "lc-chartrow" }, /* @__PURE__ */ React.createElement("div", { className: "lc-axis" }, delta ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("span", { className: "lc-axis-top" }, fmtSigned(maxUp)), q3Clear ? /* @__PURE__ */ React.createElement("span", { className: "lc-axis-q3" }, fmtSigned(Math.round(maxUp - span / 4))) : null, /* @__PURE__ */ React.createElement("span", {
5655
5660
  className: "lc-axis-mid",
5656
5661
  style: { top: `${13 + upPx}px` }
5657
- }, "0"), /* @__PURE__ */ React.createElement("span", { className: "lc-axis-bot" }, (maxDown > 0 ? "-" : "") + fmt(maxDown))) : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("span", { className: "lc-axis-top" }, fmt(maxTotal)), /* @__PURE__ */ React.createElement("span", { className: "lc-axis-mid" }, fmt(Math.round(maxTotal / 2))), /* @__PURE__ */ React.createElement("span", { className: "lc-axis-bot" }, "0"))), /* @__PURE__ */ React.createElement("div", { className: "lc-chart-wrap" }, /* @__PURE__ */ React.createElement("div", {
5662
+ }, "0"), q1Clear ? /* @__PURE__ */ React.createElement("span", { className: "lc-axis-q1" }, fmtSigned(Math.round(maxUp - 3 * span / 4))) : null, /* @__PURE__ */ React.createElement("span", { className: "lc-axis-bot" }, fmtSigned(-maxDown))) : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("span", { className: "lc-axis-top" }, fmt(maxTotal)), /* @__PURE__ */ React.createElement("span", { className: "lc-axis-q3" }, fmt(Math.round(maxTotal * 3 / 4))), /* @__PURE__ */ React.createElement("span", { className: "lc-axis-mid" }, fmt(Math.round(maxTotal / 2))), /* @__PURE__ */ React.createElement("span", { className: "lc-axis-q1" }, fmt(Math.round(maxTotal / 4))), /* @__PURE__ */ React.createElement("span", { className: "lc-axis-bot" }, "0"))), /* @__PURE__ */ React.createElement("div", { className: "lc-chart-wrap" }, /* @__PURE__ */ React.createElement("div", {
5658
5663
  className: "lc-chart-scroll" + (props.activeTurn !== null ? " lc-chart-dim" : ""),
5659
5664
  ref: scrollRef,
5660
5665
  onScroll: (e) => {
@@ -5667,10 +5672,10 @@ window.__ModuleLoader__.load({
5667
5672
  onMouseLeave: () => {
5668
5673
  props.onHover(null);
5669
5674
  }
5670
- }, /* @__PURE__ */ React.createElement("div", { className: "lc-grid lc-grid-top" }), delta ? /* @__PURE__ */ React.createElement("div", {
5675
+ }, /* @__PURE__ */ React.createElement("div", { className: "lc-grid lc-grid-top" }), !delta || q3Clear ? /* @__PURE__ */ React.createElement("div", { className: "lc-grid lc-grid-q3" }) : null, !delta || q1Clear ? /* @__PURE__ */ React.createElement("div", { className: "lc-grid lc-grid-q1" }) : null, !delta ? /* @__PURE__ */ React.createElement("div", { className: "lc-grid lc-grid-mid" }) : null, /* @__PURE__ */ React.createElement("div", {
5671
5676
  className: "lc-grid lc-grid-zero",
5672
- style: { top: `${18 + upPx}px` }
5673
- }) : /* @__PURE__ */ React.createElement("div", { className: "lc-grid lc-grid-mid" }), requests.map((req, i) => /* @__PURE__ */ React.createElement(ChartBar, {
5677
+ style: delta ? { top: `${18 + upPx}px` } : void 0
5678
+ }), requests.map((req, i) => /* @__PURE__ */ React.createElement(ChartBar, {
5674
5679
  key: req.seq,
5675
5680
  req,
5676
5681
  marker: markers[i],
@@ -5705,7 +5710,7 @@ window.__ModuleLoader__.load({
5705
5710
  props.onPickTurn(grp.turn);
5706
5711
  }
5707
5712
  }, /* @__PURE__ */ React.createElement("span", { className: "lc-turn-label" }, `T${grp.turn}`));
5708
- }))), hoveredReq !== null ? /* @__PURE__ */ React.createElement("div", { className: "lc-chart-tip" }, tipOf(hoveredReq)) : null));
5713
+ }))), hoveredReq !== null ? /* @__PURE__ */ React.createElement("div", { className: "lc-chart-tip" }, tipRowsOf(hoveredReq).map((row, i) => /* @__PURE__ */ React.createElement("span", { key: i }, row))) : null));
5709
5714
  };
5710
5715
  }
5711
5716
  //#endregion
@@ -5847,7 +5852,6 @@ window.__ModuleLoader__.load({
5847
5852
  requests
5848
5853
  ]);
5849
5854
  const briefList = React.useMemo(() => data ? briefNodes(data) : [], [data]);
5850
- const replyTips = React.useMemo(() => replyTipsOf(briefList), [briefList]);
5851
5855
  const convNodes = conversationNodesOf(props);
5852
5856
  const bySeq = React.useMemo(() => {
5853
5857
  const m = /* @__PURE__ */ new Map();
@@ -6003,8 +6007,7 @@ window.__ModuleLoader__.load({
6003
6007
  },
6004
6008
  onFocusTurnHandled: () => {
6005
6009
  setFocusTurn(null);
6006
- },
6007
- replyTips
6010
+ }
6008
6011
  }), /* @__PURE__ */ React.createElement(RequestDetail, {
6009
6012
  request: activeReq,
6010
6013
  prev: trendMode === "delta" && activeIdx >= 0 ? activeIdx > 0 ? displayRequests[activeIdx - 1] : null : void 0,
@@ -6204,7 +6207,7 @@ window.__ModuleLoader__.load({
6204
6207
  }
6205
6208
  //#endregion
6206
6209
  //#region \0dsh-global-css:/home/runner/work/dsh-context/dsh-context/src/client/styles/trendChart.css.mjs
6207
- const css$8 = ".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-mid{top:69px}.lc-axis-bot{top:125px}.lc-chart-wrap{flex:1;min-width:0;position:relative}.lc-chart-scroll{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-top:18px;display:flex;position:relative}.lc-grid{border-top:1px dashed var(--dsw-alias-border-l1);pointer-events:none;position:absolute;left:0;right:0}.lc-grid-top{top:18px}.lc-grid-mid{top:74px}.lc-grid-zero{border-top-style:solid;border-top-color:#80808080}.lc-bar{cursor:pointer;border-radius:2px;flex:none;align-items:flex-end;width:14px;height:100%;transition:opacity .12s,background-color .12s;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;white-space:nowrap;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);pointer-events:none;border-radius:6px;padding:3px 8px;font-size:12px;position:absolute;top:0;left:0;box-shadow:0 2px 8px #0000002e}.lc-bar:hover{background:var(--dsw-alias-bg-layer-2)}.lc-bar-hovered{outline:1px dashed var(--dsw-alias-brand-primary);outline-offset:1px}.lc-bar-selected{outline:2px solid var(--dsw-alias-label-primary);outline-offset:1px}.lc-bar-in-turn{background:#80808024}.lc-bar-stack{flex-direction:column-reverse;width:100%;display:flex}.lc-bar-stack>div{width:100%}.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-cat-seg{transition:filter .12s,opacity .12s}.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=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-turns{gap:2px;margin-top:4px;display:flex;overflow:hidden}.lc-turn{box-sizing:border-box;text-align:center;color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;cursor:pointer;border-radius:3px;flex:none;height:14px;font-size:10px;font-weight:600;line-height:14px;transition:filter .12s,opacity .12s;overflow:hidden}.lc-turn-on{filter:brightness(1.35);color:var(--dsw-alias-label-primary)}.lc-turn-label{text-overflow:ellipsis;max-width:100%;display:inline-block;overflow:hidden}";
6210
+ const css$8 = ".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{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-top:18px;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:#80808080;top:130px}.lc-bar{cursor:pointer;border-radius:2px;flex:none;align-items:flex-end;width:14px;height:100%;transition:opacity .12s,background-color .12s;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-bar:hover{background:var(--dsw-alias-bg-layer-2)}.lc-bar-hovered{outline:1px dashed var(--dsw-alias-brand-primary);outline-offset:1px}.lc-bar-selected{outline:2px solid var(--dsw-alias-label-primary);outline-offset:1px}.lc-bar-in-turn{background:#80808024}.lc-bar-stack{flex-direction:column-reverse;width:100%;display:flex}.lc-bar-stack>div{width:100%}.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-cat-seg{transition:filter .12s,opacity .12s}.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=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-turns{gap:2px;margin-top:4px;display:flex;overflow:hidden}.lc-turn{box-sizing:border-box;text-align:center;color:var(--dsw-alias-label-secondary);white-space:nowrap;cursor:pointer;border-radius:3px;flex:none;height:14px;font-size:10px;font-weight:600;line-height:14px;transition:filter .12s,opacity .12s}.lc-turn-on{filter:brightness(1.35);color:var(--dsw-alias-label-primary)}.lc-turn-label{display:inline-block}";
6208
6211
  const tagId$8 = "dsh-context/trendChart.css";
6209
6212
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$8) + "]") === null) {
6210
6213
  const tag = document.createElement("style");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-context",
3
- "version": "0.38.2",
3
+ "version": "0.38.3",
4
4
  "description": "A DeepSeek Harness plugin for context insight and management, with context dashboard and context command, for understanding how the context is made of, and how it evolves.",
5
5
  "author": "bowenliang123",
6
6
  "repository": {