dsh-context 0.46.0 → 0.46.1

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 (3) hide show
  1. package/README.md +3 -3
  2. package/lib/client.js +139 -142
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -8,19 +8,19 @@
8
8
 
9
9
  **The best [DeepSeek Harness plugin](https://www.deepseek.com/harness/) for Agent's context insights and management.**
10
10
 
11
- `dsh-context` provides full context lifecycle management features.
11
+ [`dsh-context`](https://www.npmjs.com/package/dsh-context) provides full context lifecycle management features.
12
12
  - **Context tab** — an UI context dashboard for DeepSeek Harness's context stats, composition, trend, events, and messages.
13
13
  - **`/context` command** — the slash command shows the context model for current context composition and recent context evolution.
14
14
 
15
15
  ## Install / Update
16
16
 
17
- To Install from any DeepSeek Harness installation:
17
+ Install [`dsh-context`](https://www.npmjs.com/package/dsh-context) plugin from [DeepSeek Harness](https://www.npmjs.com/package/@deepseek-ai/dsh):
18
18
 
19
19
  ```sh
20
20
  dsh plugin --profile web add dsh-context
21
21
  ```
22
22
 
23
- Or to update the `dsh-context` plugin:
23
+ Or update the `dsh-context` plugin:
24
24
 
25
25
  ```sh
26
26
  dsh plugin --profile web update dsh-context@latest
package/lib/client.js CHANGED
@@ -72,8 +72,9 @@ window.__ModuleLoader__.load({
72
72
  "gran.total": "全量",
73
73
  "gran.delta": "增量",
74
74
  "gran.modeHint": "全量:累计构成;增量:相对上一条请求的变化量",
75
- "trend.hint": "✂ 表示压缩/剪枝,步骤/轮次 切换粒度",
76
75
  "trend.focus": "仅展示 {cat}",
76
+ "trend.adaptive": "自适应",
77
+ "trend.adaptiveHint": "按当前可视范围内的柱子重新缩放高度,滚动时随之变化",
77
78
  "trend.empty": "发起一轮对话后,这里会展示每次模型请求的上下文构成",
78
79
  "detail.step": "第 {t} 轮 · 第 {s} 步",
79
80
  "detail.turn": "第 {t} 轮 · 共 {n} 步",
@@ -89,7 +90,6 @@ window.__ModuleLoader__.load({
89
90
  "brief.noInputs": "(无新增)",
90
91
  "brief.locate": "在上下文浏览器中查看",
91
92
  "jump.title": "在上下文标签页中查看此轮",
92
- "jump.statsLine": "在上下文标签页中查看上下文构成",
93
93
  "brief.turnTip": "这一轮开场时用户发送的消息;回合内的每一步都会回显同一条",
94
94
  "brief.inputTip": "上一步回复之后、本次请求发出前新进入上下文的内容——通常是上一步所调工具的结果;每轮的第一步无新增",
95
95
  "brief.replyTip": "这一步模型返回的内容(文本回复或工具调用);此步发起的调用,其结果会出现在下一柱的「输入」行",
@@ -358,8 +358,9 @@ window.__ModuleLoader__.load({
358
358
  "gran.total": "Total",
359
359
  "gran.delta": "Delta",
360
360
  "gran.modeHint": "Total: cumulative makeup; Delta: change vs the previous request",
361
- "trend.hint": "✂ marks compaction/prune, Step/Turn switches granularity",
362
361
  "trend.focus": "Showing {cat} only",
362
+ "trend.adaptive": "Adaptive",
363
+ "trend.adaptiveHint": "Rescale bar heights to the visible range, following the scroll",
363
364
  "trend.empty": "Send a message and each model request’s context makeup shows up here",
364
365
  "detail.step": "Turn {t} · Step {s}",
365
366
  "detail.turn": "Turn {t} · {n} steps",
@@ -375,7 +376,6 @@ window.__ModuleLoader__.load({
375
376
  "brief.noInputs": "(nothing new)",
376
377
  "brief.locate": "Reveal in Context Browser",
377
378
  "jump.title": "View this turn in the Context tab",
378
- "jump.statsLine": "View the context composition in the Context tab",
379
379
  "brief.turnTip": "The user message that opened this turn — every step of the turn recalls it",
380
380
  "brief.inputTip": "What entered after the previous reply and before this request went out — usually the previous tool-call results; a turn opener has nothing new",
381
381
  "brief.replyTip": "What the model returned on this step (a text reply or tool calls) — results of calls made here appear in the In row of the next bar",
@@ -3336,6 +3336,7 @@ window.__ModuleLoader__.load({
3336
3336
  label: dnaLabel(it),
3337
3337
  group: it.cat
3338
3338
  })) ?? null;
3339
+ const liveDnaKey = dnaKey !== null && dnaByKey.has(dnaKey) ? dnaKey : null;
3339
3340
  const pickDna = (key) => {
3340
3341
  const it = dnaByKey.get(key);
3341
3342
  /* v8 ignore next 1 -- the bar only reports keys of the parts it was handed; defensive. */
@@ -3638,7 +3639,7 @@ window.__ModuleLoader__.load({
3638
3639
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StackedBar, {
3639
3640
  parts: dnaParts ?? parts,
3640
3641
  height: 10,
3641
- hoverKey: dna ? dnaKey ?? linkKey ?? pinKey : linkKey ?? pinKey,
3642
+ hoverKey: dna ? liveDnaKey ?? linkKey ?? pinKey : linkKey ?? pinKey,
3642
3643
  onHoverKey: dna ? setDnaKey : linked ? props.onHoverKey : void 0,
3643
3644
  tip: dna,
3644
3645
  onPickKey: dna ? pickDna : void 0,
@@ -5158,6 +5159,35 @@ window.__ModuleLoader__.load({
5158
5159
  for (const r of requests) if (r.seq > seq && (gone === void 0 || gone > r.seq)) return r.seq;
5159
5160
  return gone === void 0 ? "live" : null;
5160
5161
  }
5162
+ //#endregion
5163
+ //#region src/client/overscroll.ts
5164
+ /**
5165
+ * Stop a horizontal scroller's overscroll from reaching the browser's history navigation — the trackpad
5166
+ * swipe-back (left edge) and swipe-forward (right edge) gestures. The spec answer is `overscroll-behavior-x:
5167
+ * contain`, the harness's own idiom for its horizontal scrollers and what the sheets beside this module's
5168
+ * callers already set; it covers Chromium and Firefox, but WebKit still navigates on horizontal overscroll with
5169
+ * the property set (bug 240183), where a canceled wheel is the only lever. Without either, one swipe past the
5170
+ * edge of the trend chart or the agent graph leaves the whole app for another page in the tab's history.
5171
+ */
5172
+ /**
5173
+ * Cancel the horizontal-dominant wheel gestures a scroller cannot consume — the ones the browser would
5174
+ * otherwise read as a history swipe. Vertical-dominant gestures are left alone: they belong to the page's own
5175
+ * scrolling, and the scrollers this guards only overflow horizontally.
5176
+ * @param el - the horizontal scroll container (the listener must be non-passive, so it cannot ride React's passive wheel seat).
5177
+ * @returns the disposer removing the listener.
5178
+ */
5179
+ function containHorizontalOverscroll(el) {
5180
+ const onWheel = (e) => {
5181
+ if (Math.abs(e.deltaX) <= Math.abs(e.deltaY)) return;
5182
+ const atStart = e.deltaX < 0 && el.scrollLeft <= 0;
5183
+ const atEnd = e.deltaX > 0 && el.scrollLeft + el.clientWidth >= el.scrollWidth - 1;
5184
+ if (atStart || atEnd) e.preventDefault();
5185
+ };
5186
+ el.addEventListener("wheel", onWheel, { passive: false });
5187
+ return () => {
5188
+ el.removeEventListener("wheel", onWheel);
5189
+ };
5190
+ }
5161
5191
  const SLOT_MAX = 184;
5162
5192
  const SLOT_MIN = 112;
5163
5193
  const CAPTION_GUTTER = 8;
@@ -5605,6 +5635,13 @@ window.__ModuleLoader__.load({
5605
5635
  };
5606
5636
  /* v8 ignore stop */
5607
5637
  }, []);
5638
+ (0, react.useEffect)(() => {
5639
+ const el = stageRef.current;
5640
+ /* v8 ignore next 1 -- the stage renders whenever the card does, and React
5641
+ attaches refs before effects run; el is never null here. */
5642
+ if (el === null) return;
5643
+ return containHorizontalOverscroll(el);
5644
+ }, []);
5608
5645
  (0, react.useEffect)(() => {
5609
5646
  if (face === null || typeof sessionId !== "string" || sessionId === "") return;
5610
5647
  if (typeof face.refreshSubagents !== "function") return;
@@ -6445,7 +6482,7 @@ window.__ModuleLoader__.load({
6445
6482
  return function PluginInfo() {
6446
6483
  const [latest, setLatest] = (0, react.useState)(null);
6447
6484
  (0, react.useEffect)(() => {
6448
- if ("0.46.0".includes("-dev")) return;
6485
+ if ("0.46.1".includes("-dev")) return;
6449
6486
  let on = true;
6450
6487
  fetchLatestVersion().then((v) => {
6451
6488
  if (on && v) setLatest(v);
@@ -6454,8 +6491,8 @@ window.__ModuleLoader__.load({
6454
6491
  on = false;
6455
6492
  };
6456
6493
  }, []);
6457
- const update = latest !== null && isNewerVersion(latest, "0.46.0") ? latest : null;
6458
- const nameText = "dsh-context (v0.46.0)";
6494
+ const update = latest !== null && isNewerVersion(latest, "0.46.1") ? latest : null;
6495
+ const nameText = "dsh-context (v0.46.1)";
6459
6496
  const nameValue = [nameText];
6460
6497
  if (update) nameValue.push(/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6461
6498
  className: "lc-pi-update",
@@ -7576,6 +7613,42 @@ window.__ModuleLoader__.load({
7576
7613
  focus
7577
7614
  ]);
7578
7615
  const markers = props.markers;
7616
+ const adaptive = props.adaptive === true;
7617
+ const [visMax, setVisMax] = (0, react.useState)(null);
7618
+ const measureVisible = (el) => {
7619
+ if (!adaptive) return;
7620
+ const n = requests.length;
7621
+ if (n === 0 || el.clientWidth <= 0) return;
7622
+ const pitch = 16;
7623
+ const sl = el.scrollLeft;
7624
+ const vr = sl + el.clientWidth;
7625
+ let total = 0;
7626
+ let up = 0;
7627
+ let down = 0;
7628
+ const from = Math.max(0, Math.floor(sl / pitch));
7629
+ const to = Math.min(n - 1, Math.max(from, Math.floor((vr - 1) / pitch)));
7630
+ for (let i = from; i <= to; i++) {
7631
+ const col = i * pitch;
7632
+ if (col >= vr || col + BAR_W <= sl) continue;
7633
+ const req = requests[i];
7634
+ if (delta) {
7635
+ let bu = 0;
7636
+ let bd = 0;
7637
+ for (const c of CATS) {
7638
+ const d = req[c.key] || 0;
7639
+ if (d > 0) bu += d;
7640
+ else bd -= d;
7641
+ }
7642
+ if (bu > up) up = bu;
7643
+ if (bd > down) down = bd;
7644
+ } else if (req.total > total) total = req.total;
7645
+ }
7646
+ setVisMax((prev) => prev !== null && prev.total === total && prev.up === up && prev.down === down ? prev : {
7647
+ total,
7648
+ up,
7649
+ down
7650
+ });
7651
+ };
7579
7652
  let maxTotal = 1;
7580
7653
  let maxUp = 0;
7581
7654
  let maxDown = 0;
@@ -7591,6 +7664,14 @@ window.__ModuleLoader__.load({
7591
7664
  if (down > maxDown) maxDown = down;
7592
7665
  }
7593
7666
  else for (const req of requests) if (req.total > maxTotal) maxTotal = req.total;
7667
+ if (adaptive && visMax !== null) {
7668
+ if (delta) {
7669
+ if (visMax.up + visMax.down > 0) {
7670
+ maxUp = visMax.up;
7671
+ maxDown = visMax.down;
7672
+ }
7673
+ } else maxTotal = Math.max(1, visMax.total);
7674
+ }
7594
7675
  const span = Math.max(1, maxUp + maxDown);
7595
7676
  const deltaScale = CHART_H / span;
7596
7677
  const upPx = Math.round(maxUp * deltaScale);
@@ -7710,11 +7791,38 @@ window.__ModuleLoader__.load({
7710
7791
  prevScrollWidthRef.current = el.scrollWidth;
7711
7792
  updateTurnLabels(el);
7712
7793
  syncTip(el);
7794
+ measureVisible(el);
7713
7795
  }, [
7714
7796
  props.granularity,
7715
7797
  props.focusTurn,
7716
- requests
7798
+ requests,
7799
+ adaptive
7717
7800
  ]);
7801
+ const measureRef = (0, react.useRef)(measureVisible);
7802
+ (0, react.useLayoutEffect)(() => {
7803
+ measureRef.current = measureVisible;
7804
+ });
7805
+ (0, react.useLayoutEffect)(() => {
7806
+ const el = scrollRef.current;
7807
+ /* v8 ignore next 1 -- the scroll div renders unconditionally and React
7808
+ attaches refs before layout effects run; el is never null here. */
7809
+ if (el === null) return;
7810
+ if (typeof ResizeObserver !== "function") return;
7811
+ const observer = new ResizeObserver(() => {
7812
+ measureRef.current(el);
7813
+ });
7814
+ observer.observe(el);
7815
+ return () => {
7816
+ observer.disconnect();
7817
+ };
7818
+ }, []);
7819
+ (0, react.useLayoutEffect)(() => {
7820
+ const el = scrollRef.current;
7821
+ /* v8 ignore next 1 -- the scroll div renders unconditionally and React
7822
+ attaches refs before layout effects run; el is never null here. */
7823
+ if (el === null) return;
7824
+ return containHorizontalOverscroll(el);
7825
+ }, []);
7718
7826
  const tipRowsOf = (req) => {
7719
7827
  const n = req.stepCount ?? 1;
7720
7828
  const head = props.granularity === "turn" ? n > 1 ? t("tip.turn", {
@@ -7819,6 +7927,7 @@ window.__ModuleLoader__.load({
7819
7927
  onScroll: (e) => {
7820
7928
  updateTurnLabels(e.currentTarget);
7821
7929
  syncTip(e.currentTarget);
7930
+ measureVisible(e.currentTarget);
7822
7931
  },
7823
7932
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7824
7933
  className: "lc-chart",
@@ -7969,6 +8078,7 @@ window.__ModuleLoader__.load({
7969
8078
  const [hoverTurn, setHoverTurn] = (0, react.useState)(null);
7970
8079
  const [granularity, setGranularity] = (0, react.useState)(() => settings.defaultGranularity());
7971
8080
  const [trendMode, setTrendMode] = (0, react.useState)(() => settings.defaultTrendMode());
8081
+ const [adaptive, setAdaptive] = (0, react.useState)(false);
7972
8082
  const [focusTurn, setFocusTurn] = (0, react.useState)(null);
7973
8083
  const [jumpSeq, setJumpSeq] = (0, react.useState)(null);
7974
8084
  const [hoverCat, setHoverCat] = (0, react.useState)(null);
@@ -8192,9 +8302,22 @@ window.__ModuleLoader__.load({
8192
8302
  children: t("trend.title")
8193
8303
  }),
8194
8304
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8195
- className: "lc-card-sub",
8196
- children: focusCat !== null ? t("trend.focus", { cat: kit.catLabel(focusCat) }) : t("trend.hint")
8305
+ className: "lc-gran lc-trend-adaptive",
8306
+ role: "group",
8307
+ title: t("trend.adaptiveHint"),
8308
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
8309
+ type: "button",
8310
+ className: "lc-gran-btn" + (adaptive ? " lc-gran-on" : ""),
8311
+ onClick: () => {
8312
+ setAdaptive((on) => !on);
8313
+ },
8314
+ children: t("trend.adaptive")
8315
+ })
8197
8316
  }),
8317
+ focusCat !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8318
+ className: "lc-card-sub",
8319
+ children: t("trend.focus", { cat: kit.catLabel(focusCat) })
8320
+ }) : null,
8198
8321
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8199
8322
  className: "lc-trend-ctl",
8200
8323
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -8248,6 +8371,7 @@ window.__ModuleLoader__.load({
8248
8371
  focusTurn,
8249
8372
  hoverCat: trendHoverCat,
8250
8373
  focusCat,
8374
+ adaptive,
8251
8375
  onSelect: setSelectedSeq,
8252
8376
  onHover: setHoveredSeq,
8253
8377
  onHoverTurn: setHoverTurn,
@@ -8436,124 +8560,6 @@ window.__ModuleLoader__.load({
8436
8560
  };
8437
8561
  }
8438
8562
  //#endregion
8439
- //#region src/client/components/statsJump.tsx
8440
- /**
8441
- * The chat page's stats line — the harness's own StatsLine entry on the
8442
- * `conversation.composer.dock` seat — becomes a jump affordance: hovering
8443
- * underlines it, a click (or Enter/Space) opens the Context tab. The plugin
8444
- * wires this from a sibling dock entry that renders no UI of its own: an
8445
- * invisible anchor mounts inside the slot's `[data-slot]` wrapper and spots
8446
- * the stats row beside it, and a MutationObserver re-spots it on dock churn
8447
- * (the row mounts only once the first stats exist, tooltip bubbles come and
8448
- * go beside it, and switching conversations remounts the pair together).
8449
- *
8450
- * EVERY step degrades silently: a host without the dock seat never mounts
8451
- * the entry; a dock without exactly one spotless candidate row (another
8452
- * plugin's entry, a crash face, an unexpected layout) decorates nothing; a
8453
- * row that throws mid-wiring stays unwired; a drag-selection click is
8454
- * ignored. The affordance is simply absent — nothing here can take the chat
8455
- * page down.
8456
- */
8457
- /** The plugin's invisible dock anchor, and the class it brands the stats row with. */
8458
- const ANCHOR_CLASS = "lc-stats-jump";
8459
- const ROW_CLASS = "lc-stats-jump-row";
8460
- /**
8461
- * The stats row beside `anchor`: the single element child that is neither
8462
- * the anchor nor a tooltip bubble. Children are untrusted input — one that
8463
- * throws on attribute access is skipped whole, and two live candidates at
8464
- * once (another plugin's dock entry, a crash face) answer null so nothing
8465
- * is ever decorated on a guess.
8466
- */
8467
- function statsRowOf(anchor) {
8468
- const parent = anchor.parentElement;
8469
- if (parent === null) return null;
8470
- let row = null;
8471
- for (const child of parent.children) {
8472
- try {
8473
- if (child === anchor || child.getAttribute("role") === "tooltip") continue;
8474
- } catch {
8475
- continue;
8476
- }
8477
- if (row !== null) return null;
8478
- row = child;
8479
- }
8480
- return row;
8481
- }
8482
- /**
8483
- * Wire the dock beside `anchor`: decorate today's stats row and re-spot it
8484
- * on dock churn. Returns the teardown that disconnects the observer and
8485
- * strips every mark the wiring left on the row.
8486
- */
8487
- function wireDock(anchor, label, activate) {
8488
- if (anchor === null) return () => {};
8489
- let wired = null;
8490
- const unwire = () => {
8491
- wired?.off();
8492
- wired = null;
8493
- };
8494
- const scan = () => {
8495
- try {
8496
- const row = statsRowOf(anchor);
8497
- if (wired?.row === row) return;
8498
- unwire();
8499
- if (row === null || !(row instanceof HTMLElement)) return;
8500
- row.classList.add(ROW_CLASS);
8501
- row.setAttribute("role", "button");
8502
- row.setAttribute("tabindex", "0");
8503
- row.setAttribute("aria-label", label);
8504
- const onKey = (e) => {
8505
- if (e.key !== "Enter" && e.key !== " ") return;
8506
- e.preventDefault();
8507
- activate();
8508
- };
8509
- const onClick = () => {
8510
- const selection = anchor.ownerDocument.getSelection();
8511
- if (selection !== null && !selection.isCollapsed) return;
8512
- activate();
8513
- };
8514
- row.addEventListener("click", onClick);
8515
- row.addEventListener("keydown", onKey);
8516
- wired = {
8517
- row,
8518
- off() {
8519
- row.removeEventListener("click", onClick);
8520
- row.removeEventListener("keydown", onKey);
8521
- row.classList.remove(ROW_CLASS);
8522
- row.removeAttribute("role");
8523
- row.removeAttribute("tabindex");
8524
- row.removeAttribute("aria-label");
8525
- }
8526
- };
8527
- } catch {}
8528
- };
8529
- scan();
8530
- const parent = anchor.parentElement;
8531
- if (parent === null) return unwire;
8532
- const observer = new MutationObserver(scan);
8533
- observer.observe(parent, { childList: true });
8534
- return () => {
8535
- observer.disconnect();
8536
- unwire();
8537
- };
8538
- }
8539
- /** The dock entry component: the invisible anchor plus the wiring around it. */
8540
- function makeStatsJump(kit) {
8541
- const { t } = kit;
8542
- return function StatsJump() {
8543
- const anchorRef = (0, react.useRef)(null);
8544
- const label = t("jump.statsLine");
8545
- (0, react.useEffect)(() => wireDock(anchorRef.current, label, () => {
8546
- activateContextTab(t("tab"));
8547
- }), [label]);
8548
- return (0, react.createElement)("span", {
8549
- ref: anchorRef,
8550
- className: ANCHOR_CLASS,
8551
- hidden: true,
8552
- "aria-hidden": "true"
8553
- });
8554
- };
8555
- }
8556
- //#endregion
8557
8563
  //#region src/client/viewkit.ts
8558
8564
  function makeViewKit(t) {
8559
8565
  const { eventLabel, eventAt } = makeEventText(t);
@@ -8570,7 +8576,7 @@ window.__ModuleLoader__.load({
8570
8576
  }
8571
8577
  //#endregion
8572
8578
  //#region \0dsh-global-css:/home/runner/work/dsh-context/dsh-context/src/client/styles/base.css.mjs
8573
- const css$13 = ".lc-root{box-sizing:border-box;height:100%;color:var(--dsw-alias-label-primary);padding:16px 20px 32px;font-size:13px;overflow-y:auto}.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{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{align-items:center;gap:6px;margin-left:auto;display:flex}.lc-trend-ctl .lc-gran{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-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-col{flex:1;min-width:min(280px,100%)}.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{container:lc-head-row/inline-size}.lc-head>.lc-card{flex:1 1 0;min-width:0}@container lc-head-row (width<=1045px){.lc-head>.lc-card{flex-basis:40%}}@container lc-head-row (width<=480px){.lc-head>.lc-card{flex-basis:100%}}.lc-head>.lc-card:first-child{flex-direction:column;display:flex}.lc-head>.lc-card:first-child .lc-stats{flex:1;align-content:stretch}.lc-head>.lc-card:first-child .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-error-retry:hover{border-color:var(--dsw-alias-label-primary)}.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}";
8579
+ const css$13 = ".lc-root{box-sizing:border-box;height:100%;color:var(--dsw-alias-label-primary);padding:16px 20px 32px;font-size:13px;overflow-y:auto}.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{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{align-items:center;gap:6px;margin-left:auto;display:flex}.lc-trend-ctl .lc-gran{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-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-col{flex:1;min-width:min(280px,100%)}.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{container:lc-head-row/inline-size}.lc-head>.lc-card{flex:1 1 0;min-width:0}@container lc-head-row (width<=1045px){.lc-head>.lc-card{flex-basis:40%}}@container lc-head-row (width<=480px){.lc-head>.lc-card{flex-basis:100%}}.lc-head>.lc-card:first-child{flex-direction:column;display:flex}.lc-head>.lc-card:first-child .lc-stats{flex:1;align-content:stretch}.lc-head>.lc-card:first-child .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-error-retry:hover{border-color:var(--dsw-alias-label-primary)}.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}";
8574
8580
  const tagId$13 = "dsh-context/base.css";
8575
8581
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$13) + "]") === null) {
8576
8582
  const tag = document.createElement("style");
@@ -8592,7 +8598,7 @@ window.__ModuleLoader__.load({
8592
8598
  }
8593
8599
  //#endregion
8594
8600
  //#region \0dsh-global-css:/home/runner/work/dsh-context/dsh-context/src/client/styles/jump.css.mjs
8595
- const css$11 = ".lc-jump{width:calc(28px + var(--dsh-content-font-delta,0px));height:calc(28px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-tertiary);cursor:pointer;transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out), color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border:0;border-radius:28px;justify-content:center;align-items:center;padding:6px;display:inline-flex}.lc-jump svg{width:calc(16px + var(--dsh-content-font-delta,0px));height:calc(16px + var(--dsh-content-font-delta,0px))}.lc-jump:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}.lc-stats-jump{display:none}.lc-stats-jump-row{cursor:pointer}.lc-stats-jump-row:hover,.lc-stats-jump-row:focus-visible{text-decoration:underline}";
8601
+ const css$11 = ".lc-jump{width:calc(28px + var(--dsh-content-font-delta,0px));height:calc(28px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-tertiary);cursor:pointer;transition:background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out), color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border:0;border-radius:28px;justify-content:center;align-items:center;padding:6px;display:inline-flex}.lc-jump svg{width:calc(16px + var(--dsh-content-font-delta,0px));height:calc(16px + var(--dsh-content-font-delta,0px))}.lc-jump:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}";
8596
8602
  const tagId$11 = "dsh-context/jump.css";
8597
8603
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$11) + "]") === null) {
8598
8604
  const tag = document.createElement("style");
@@ -8625,7 +8631,7 @@ window.__ModuleLoader__.load({
8625
8631
  }
8626
8632
  //#endregion
8627
8633
  //#region \0dsh-global-css:/home/runner/work/dsh-context/dsh-context/src/client/styles/trendChart.css.mjs
8628
- 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;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-bar:hover{background:var(--dsw-alias-bg-layer-2)}.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:#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 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=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;width:max-content;min-width:100%;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;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}";
8634
+ 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{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-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;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-bar:hover{background:var(--dsw-alias-bg-layer-2)}.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:#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 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=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;width:max-content;min-width:100%;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;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}";
8629
8635
  const tagId$8 = "dsh-context/trendChart.css";
8630
8636
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$8) + "]") === null) {
8631
8637
  const tag = document.createElement("style");
@@ -8713,7 +8719,7 @@ window.__ModuleLoader__.load({
8713
8719
  }
8714
8720
  //#endregion
8715
8721
  //#region \0dsh-global-css:/home/runner/work/dsh-context/dsh-context/src/client/styles/agentGraph.css.mjs
8716
- const css = ".lc-agents-chips{flex-wrap:wrap;gap:6px;margin-bottom:10px;display:flex}.lc-agents-chip{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;border-radius:999px;padding:2px 8px;font-size:11px}.lc-agents-chip-on{color:var(--dsw-alias-state-success-primary);border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent)}.lc-agents-stage{margin:0 -4px;padding:0 4px;overflow-x:auto}.lc-agents-svg{max-width:none;margin:0 auto;display:block}.lc-agents-link{stroke-width:1.5px;stroke-opacity:.45}.lc-agents-link-live{stroke-opacity:.85}.lc-agents-flow{stroke-width:2px;stroke-linecap:round;stroke-dasharray:2 7;animation:.9s linear infinite lc-agent-flow}@keyframes lc-agent-flow{to{stroke-dashoffset:-9px}}.lc-agent-node{outline:none}.lc-agent-clickable{cursor:pointer}.lc-agent-halo{fill:#0000;transition:fill var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out)}.lc-agent-hover .lc-agent-halo,.lc-agent-node:focus-visible .lc-agent-halo{fill:var(--dsw-alias-interactive-bg-hover,var(--dsw-alias-bg-layer-2))}.lc-agent-self .lc-agent-halo{fill:var(--dsw-alias-bg-layer-2)}.lc-agent-running .lc-agent-halo{fill:color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent);animation:1.8s ease-in-out infinite lc-agent-glow}.lc-agent-done .lc-agent-halo{fill:color-mix(in srgb, var(--dsw-alias-state-success-primary) 7%, transparent)}@keyframes lc-agent-glow{0%,to{opacity:1}50%{opacity:.4}}.lc-agent-track{fill:var(--dsw-alias-bg-layer-1);stroke:var(--dsw-alias-border-l1);stroke-width:1.5px}.lc-agent-seg{fill:none;stroke-width:9px;transition:stroke-dasharray .3s,stroke-dashoffset .3s}.lc-agent-free{stroke:color-mix(in srgb, var(--dsw-alias-label-secondary) 18%, transparent)}.lc-agent-pct{fill:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;pointer-events:none;font-size:11px;font-weight:600}.lc-agent-caption{text-align:center;pointer-events:none;width:100%;line-height:1.25}.lc-agent-label{color:var(--dsw-alias-label-primary);overflow-wrap:break-word;-webkit-line-clamp:3;-webkit-box-orient:vertical;font-size:11px;display:-webkit-box;overflow:hidden}.lc-agent-tokens{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-size:10px}.lc-agents-solo{padding:4px 0 10px}.lc-agents-inspector{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:8px;flex-wrap:wrap;align-items:baseline;gap:4px 8px;min-width:0;margin-top:10px;padding:7px 10px;font-size:12px;display:flex}.lc-agents-inspector-name{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}.lc-agents-badge{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:1px 6px;font-size:10px}.lc-agent-self-badge{vertical-align:1px;margin-left:5px}.lc-agents-badge-on{color:var(--dsw-alias-state-success-primary);border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent)}.lc-agents-inspector-stats{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.lc-agents-inspector-open{color:var(--dsw-alias-brand-primary,#3b82f6);flex:none;margin-left:auto}.lc-agents-legend{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:4px 14px;margin-top:8px;font-size:11px;display:flex}.lc-agents-legend-item{align-items:center;gap:5px;display:inline-flex}.lc-agents-legend-item i{border-radius:2px;width:8px;height:8px}.lc-agents-legend-free{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 18%, transparent)}.lc-agents-legend-edge{border-top:2px dashed var(--dsw-alias-label-secondary);border-radius:0!important;width:14px!important;height:0!important}";
8722
+ const css = ".lc-agents-chips{flex-wrap:wrap;gap:6px;margin-bottom:10px;display:flex}.lc-agents-chip{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;border-radius:999px;padding:2px 8px;font-size:11px}.lc-agents-chip-on{color:var(--dsw-alias-state-success-primary);border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent)}.lc-agents-stage{overscroll-behavior-x:contain;margin:0 -4px;padding:0 4px;overflow-x:auto}.lc-agents-svg{max-width:none;margin:0 auto;display:block}.lc-agents-link{stroke-width:1.5px;stroke-opacity:.45}.lc-agents-link-live{stroke-opacity:.85}.lc-agents-flow{stroke-width:2px;stroke-linecap:round;stroke-dasharray:2 7;animation:.9s linear infinite lc-agent-flow}@keyframes lc-agent-flow{to{stroke-dashoffset:-9px}}.lc-agent-node{outline:none}.lc-agent-clickable{cursor:pointer}.lc-agent-halo{fill:#0000;transition:fill var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out)}.lc-agent-hover .lc-agent-halo,.lc-agent-node:focus-visible .lc-agent-halo{fill:var(--dsw-alias-interactive-bg-hover,var(--dsw-alias-bg-layer-2))}.lc-agent-self .lc-agent-halo{fill:var(--dsw-alias-bg-layer-2)}.lc-agent-running .lc-agent-halo{fill:color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent);animation:1.8s ease-in-out infinite lc-agent-glow}.lc-agent-done .lc-agent-halo{fill:color-mix(in srgb, var(--dsw-alias-state-success-primary) 7%, transparent)}@keyframes lc-agent-glow{0%,to{opacity:1}50%{opacity:.4}}.lc-agent-track{fill:var(--dsw-alias-bg-layer-1);stroke:var(--dsw-alias-border-l1);stroke-width:1.5px}.lc-agent-seg{fill:none;stroke-width:9px;transition:stroke-dasharray .3s,stroke-dashoffset .3s}.lc-agent-free{stroke:color-mix(in srgb, var(--dsw-alias-label-secondary) 18%, transparent)}.lc-agent-pct{fill:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;pointer-events:none;font-size:11px;font-weight:600}.lc-agent-caption{text-align:center;pointer-events:none;width:100%;line-height:1.25}.lc-agent-label{color:var(--dsw-alias-label-primary);overflow-wrap:break-word;-webkit-line-clamp:3;-webkit-box-orient:vertical;font-size:11px;display:-webkit-box;overflow:hidden}.lc-agent-tokens{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-size:10px}.lc-agents-solo{padding:4px 0 10px}.lc-agents-inspector{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);border-radius:8px;flex-wrap:wrap;align-items:baseline;gap:4px 8px;min-width:0;margin-top:10px;padding:7px 10px;font-size:12px;display:flex}.lc-agents-inspector-name{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}.lc-agents-badge{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:1px 6px;font-size:10px}.lc-agent-self-badge{vertical-align:1px;margin-left:5px}.lc-agents-badge-on{color:var(--dsw-alias-state-success-primary);border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent)}.lc-agents-inspector-stats{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.lc-agents-inspector-open{color:var(--dsw-alias-brand-primary,#3b82f6);flex:none;margin-left:auto}.lc-agents-legend{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:4px 14px;margin-top:8px;font-size:11px;display:flex}.lc-agents-legend-item{align-items:center;gap:5px;display:inline-flex}.lc-agents-legend-item i{border-radius:2px;width:8px;height:8px}.lc-agents-legend-free{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 18%, transparent)}.lc-agents-legend-edge{border-top:2px dashed var(--dsw-alias-label-secondary);border-radius:0!important;width:14px!important;height:0!important}";
8717
8723
  const tagId = "dsh-context/agentGraph.css";
8718
8724
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
8719
8725
  const tag = document.createElement("style");
@@ -8778,15 +8784,6 @@ window.__ModuleLoader__.load({
8778
8784
  locale: NS
8779
8785
  }, (props) => (0, react.createElement)(ContextJump, props));
8780
8786
  });
8781
- const StatsJump = makeStatsJump(kit);
8782
- ctx.slots.inject("conversation.composer.dock", () => {
8783
- return ctx.slots.register({
8784
- name: "conversation.composer.dock",
8785
- id: "stats-jump",
8786
- order: 10,
8787
- locale: NS
8788
- }, (props) => (0, react.createElement)(StatsJump, props));
8789
- });
8790
8787
  registerContextCommand(ctx, kit);
8791
8788
  const ContextModal = makeContextModal(ctx, kit);
8792
8789
  ctx.slots.inject("conversation.input.overlay", () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-context",
3
- "version": "0.46.0",
3
+ "version": "0.46.1",
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": {