dsh-context 0.53.0 → 0.53.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.
package/lib/client.js CHANGED
@@ -75,6 +75,9 @@ window.__ModuleLoader__.load({
75
75
  "placement.tab": "标签页",
76
76
  "placement.sidebar": "侧边栏",
77
77
  "placement.all": "全部",
78
+ "settings.insightsEntry": "上下文洞察入口",
79
+ "insightsEntry.show": "显示",
80
+ "insightsEntry.hide": "隐藏",
78
81
  "settings.gran": "趋势图 · 默认粒度",
79
82
  "settings.mode": "趋势图 · 默认展示方式",
80
83
  "settings.toolSort": "工具定义 · 默认排序",
@@ -323,17 +326,28 @@ window.__ModuleLoader__.load({
323
326
  "ov.kpi.sessions": "活跃会话",
324
327
  "ov.kpi.ofTotal": "共 {n} 个",
325
328
  "ov.kpi.tokens": "累计消耗",
326
- "ov.kpi.costSub": "models.dev 刊例价估算",
327
- "ov.kpi.cacheSub": "缓存读取 / 计费输入",
329
+ "ov.kpi.sessionsSub": "含 {n} 个会话",
328
330
  "ov.kpi.toolSub": "工具执行 {dur}",
329
331
  "ov.kpi.wallSub": "模型调用 {n}",
330
332
  "ov.heat.title": "活跃度",
331
- "ov.heat.sub": "点击按日期筛选",
333
+ "ov.heat.sub": "按日期筛选",
332
334
  "ov.heat.empty": "暂无活跃数据 — 会话产生模型请求后,这里会显示每日用量",
333
335
  "ov.heat.sessions": "{n} 个活跃会话",
334
336
  "ov.heat.wd.1": "一",
335
337
  "ov.heat.wd.3": "三",
336
338
  "ov.heat.wd.5": "五",
339
+ "ov.heat.mon.01": "1月",
340
+ "ov.heat.mon.02": "2月",
341
+ "ov.heat.mon.03": "3月",
342
+ "ov.heat.mon.04": "4月",
343
+ "ov.heat.mon.05": "5月",
344
+ "ov.heat.mon.06": "6月",
345
+ "ov.heat.mon.07": "7月",
346
+ "ov.heat.mon.08": "8月",
347
+ "ov.heat.mon.09": "9月",
348
+ "ov.heat.mon.10": "10月",
349
+ "ov.heat.mon.11": "11月",
350
+ "ov.heat.mon.12": "12月",
337
351
  "ov.list.title": "会话",
338
352
  "ov.list.search": "搜索标题或目录…",
339
353
  "ov.list.sortLabel": "排序",
@@ -427,6 +441,9 @@ window.__ModuleLoader__.load({
427
441
  "placement.tab": "Tab",
428
442
  "placement.sidebar": "Sidebar",
429
443
  "placement.all": "All",
444
+ "settings.insightsEntry": "Context Insights entry",
445
+ "insightsEntry.show": "Show",
446
+ "insightsEntry.hide": "Hide",
430
447
  "settings.gran": "Trend Chart · Default granularity",
431
448
  "settings.mode": "Trend Chart · Default display",
432
449
  "settings.toolSort": "Tool Schemas · Default sort",
@@ -675,17 +692,28 @@ window.__ModuleLoader__.load({
675
692
  "ov.kpi.sessions": "Active Sessions",
676
693
  "ov.kpi.ofTotal": "of {n} total",
677
694
  "ov.kpi.tokens": "Tokens Used",
678
- "ov.kpi.costSub": "estimated at models.dev list prices",
679
- "ov.kpi.cacheSub": "cache reads of billed input",
695
+ "ov.kpi.sessionsSub": "across {n} sessions",
680
696
  "ov.kpi.toolSub": "tool runs {dur}",
681
697
  "ov.kpi.wallSub": "{n} model calls",
682
698
  "ov.heat.title": "Activity",
683
- "ov.heat.sub": "Click to filter by day",
699
+ "ov.heat.sub": "Filter by date",
684
700
  "ov.heat.empty": "No activity yet — daily usage appears once sessions make model requests",
685
701
  "ov.heat.sessions": "{n} active sessions",
686
702
  "ov.heat.wd.1": "M",
687
703
  "ov.heat.wd.3": "W",
688
704
  "ov.heat.wd.5": "F",
705
+ "ov.heat.mon.01": "Jan",
706
+ "ov.heat.mon.02": "Feb",
707
+ "ov.heat.mon.03": "Mar",
708
+ "ov.heat.mon.04": "Apr",
709
+ "ov.heat.mon.05": "May",
710
+ "ov.heat.mon.06": "Jun",
711
+ "ov.heat.mon.07": "Jul",
712
+ "ov.heat.mon.08": "Aug",
713
+ "ov.heat.mon.09": "Sep",
714
+ "ov.heat.mon.10": "Oct",
715
+ "ov.heat.mon.11": "Nov",
716
+ "ov.heat.mon.12": "Dec",
689
717
  "ov.list.title": "Sessions",
690
718
  "ov.list.search": "Search title or path…",
691
719
  "ov.list.sortLabel": "Sort",
@@ -5942,10 +5970,30 @@ window.__ModuleLoader__.load({
5942
5970
  const overviewStore = createStore();
5943
5971
  //#endregion
5944
5972
  //#region src/client/components/overviewButton.tsx
5945
- function makeOverviewButton(kit) {
5973
+ /**
5974
+ * The Context Dashboard's sidebar entry: a footer action stacked directly
5975
+ * above Settings (the harness's own foot layout: footer actions, then the
5976
+ * settings row), mirroring the Settings trigger's geometry in both column
5977
+ * widths. The button carries the plugin emblem and, on the wide
5978
+ * column, its label; a badge counts the sessions currently running (the one
5979
+ * glanceable live fact a footer can carry). Clicking opens the overview
5980
+ * overlay through the shared module store (overviewStore.ts).
5981
+ *
5982
+ * The per-user `insightsEntry` preference takes the entry down (renders
5983
+ * null) without unregistering the seat. The subscription fails open: an
5984
+ * absent settings store, an unserved namespace, or a value the plugin
5985
+ * cannot understand all leave the entry visible.
5986
+ */
5987
+ /** Stable subscription faces for the settings-less degrade (no re-subscribes). */
5988
+ const subscribeNever = () => () => {};
5989
+ const entryShown = () => "show";
5990
+ function makeOverviewButton(kit, settings) {
5946
5991
  const { t } = kit;
5992
+ const subscribeEntry = settings === void 0 ? subscribeNever : (listener) => settings.store.subscribe(listener);
5993
+ const getEntry = settings === void 0 ? entryShown : () => settings.insightsEntry();
5947
5994
  return function OverviewButton(props) {
5948
5995
  const running = runningCountOf(sessionsSnapshotOf(props));
5996
+ if ((0, react.useSyncExternalStore)(subscribeEntry, getEntry) === "hide") return null;
5949
5997
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
5950
5998
  type: "button",
5951
5999
  className: props.wide === true ? "lc-ov-entry" : "lc-ov-entry lc-ov-entry-rail",
@@ -6210,7 +6258,8 @@ window.__ModuleLoader__.load({
6210
6258
  //#region src/client/components/heatmap.tsx
6211
6259
  /**
6212
6260
  * The Context Dashboard's activity heatmap: a GitHub-style contribution grid
6213
- * (weeks as columns, Monday-first weekdays as rows) over the merged daily
6261
+ * (weeks as columns, Monday-first weekdays as rows, a month label over the
6262
+ * column where each month begins) over the merged daily
6214
6263
  * ledger (overview.ts). Cell depth is the day's billed-token share of the
6215
6264
  * window's maximum, in four steps; a day with data is a button whose click
6216
6265
  * pins the session list to that day (click again to release). Cells tip
@@ -6309,36 +6358,43 @@ window.__ModuleLoader__.load({
6309
6358
  }, row))
6310
6359
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6311
6360
  className: "lc-heat-cols",
6312
- children: columns.map((column, wi) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6313
- className: "lc-heat-col",
6314
- children: column.map((cell) => {
6315
- if (cell.future) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6316
- className: "lc-heat-cell lc-heat-future",
6317
- "aria-hidden": "true"
6318
- }, cell.key);
6319
- const level = cell.entry === void 0 ? 0 : levelOf(cell.entry.tokens, max);
6320
- if (cell.entry === void 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
6321
- label: cell.key,
6322
- side: "top",
6323
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "lc-heat-cell lc-heat-0" })
6324
- }, cell.key);
6325
- const picked = props.selected === cell.key;
6326
- const label = `${cell.key}\n${t("ov.heat.sessions", { n: cell.entry.sessions })}`;
6327
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
6328
- label,
6329
- side: "top",
6330
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6331
- type: "button",
6332
- className: `lc-heat-cell lc-heat-${String(level)}${picked ? " lc-heat-on" : ""}`,
6333
- "aria-label": label,
6334
- "aria-pressed": picked,
6335
- onClick: () => {
6336
- if (props.onSelect !== void 0) props.onSelect(picked ? null : cell.key);
6337
- }
6338
- })
6339
- }, cell.key);
6340
- })
6341
- }, wi))
6361
+ children: columns.map((column, wi) => {
6362
+ const opens = column[0].key.slice(0, 7) !== column[6].key.slice(0, 7) || column[0].key.slice(8, 10) === "01";
6363
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6364
+ className: "lc-heat-col",
6365
+ children: [opens && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6366
+ className: "lc-heat-mon",
6367
+ "aria-hidden": "true",
6368
+ children: t("ov.heat.mon." + column[6].key.slice(5, 7))
6369
+ }), column.map((cell) => {
6370
+ if (cell.future) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6371
+ className: "lc-heat-cell lc-heat-future",
6372
+ "aria-hidden": "true"
6373
+ }, cell.key);
6374
+ const level = cell.entry === void 0 ? 0 : levelOf(cell.entry.tokens, max);
6375
+ if (cell.entry === void 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
6376
+ label: cell.key,
6377
+ side: "top",
6378
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "lc-heat-cell lc-heat-0" })
6379
+ }, cell.key);
6380
+ const picked = props.selected === cell.key;
6381
+ const label = `${cell.key}\n${t("ov.heat.sessions", { n: cell.entry.sessions })}`;
6382
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
6383
+ label,
6384
+ side: "top",
6385
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6386
+ type: "button",
6387
+ className: `lc-heat-cell lc-heat-${String(level)}${picked ? " lc-heat-on" : ""}`,
6388
+ "aria-label": label,
6389
+ "aria-pressed": picked,
6390
+ onClick: () => {
6391
+ if (props.onSelect !== void 0) props.onSelect(picked ? null : cell.key);
6392
+ }
6393
+ })
6394
+ }, cell.key);
6395
+ })]
6396
+ }, wi);
6397
+ })
6342
6398
  })]
6343
6399
  });
6344
6400
  };
@@ -6768,7 +6824,7 @@ window.__ModuleLoader__.load({
6768
6824
  }),
6769
6825
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6770
6826
  className: "lc-stat-sub",
6771
- children: t("ov.kpi.costSub")
6827
+ children: t("ov.kpi.sessionsSub", { n: kpi.sessions })
6772
6828
  })
6773
6829
  ]
6774
6830
  }),
@@ -6785,7 +6841,7 @@ window.__ModuleLoader__.load({
6785
6841
  }),
6786
6842
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6787
6843
  className: "lc-stat-sub",
6788
- children: t("ov.kpi.cacheSub")
6844
+ children: t("ov.kpi.sessionsSub", { n: kpi.sessions })
6789
6845
  })
6790
6846
  ]
6791
6847
  }),
@@ -7146,6 +7202,21 @@ window.__ModuleLoader__.load({
7146
7202
  props.set?.("defaultPlacement", id);
7147
7203
  }
7148
7204
  }),
7205
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PrefRow, {
7206
+ label: t("settings.insightsEntry"),
7207
+ value: state.insightsEntry,
7208
+ disabled,
7209
+ options: [{
7210
+ id: "show",
7211
+ label: t("insightsEntry.show")
7212
+ }, {
7213
+ id: "hide",
7214
+ label: t("insightsEntry.hide")
7215
+ }],
7216
+ onPick: (id) => {
7217
+ props.set?.("insightsEntry", id);
7218
+ }
7219
+ }),
7149
7220
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PrefRow, {
7150
7221
  label: t("settings.gran"),
7151
7222
  value: state.granularity,
@@ -7235,7 +7306,8 @@ window.__ModuleLoader__.load({
7235
7306
  ...v.defaultGranularity === "step" || v.defaultGranularity === "turn" ? { granularity: v.defaultGranularity } : {},
7236
7307
  ...v.defaultTrendMode === "total" || v.defaultTrendMode === "delta" ? { mode: v.defaultTrendMode } : {},
7237
7308
  ...v.defaultToolSort === "size" || v.defaultToolSort === "count" || v.defaultToolSort === "name" ? { toolSort: v.defaultToolSort } : {},
7238
- ...v.defaultFileSort === "count" || v.defaultFileSort === "latest" || v.defaultFileSort === "path" ? { fileSort: v.defaultFileSort } : {}
7309
+ ...v.defaultFileSort === "count" || v.defaultFileSort === "latest" || v.defaultFileSort === "path" ? { fileSort: v.defaultFileSort } : {},
7310
+ ...v.insightsEntry === "show" || v.insightsEntry === "hide" ? { insightsEntry: v.insightsEntry } : {}
7239
7311
  };
7240
7312
  }
7241
7313
  function createContextSettings() {
@@ -7246,29 +7318,34 @@ window.__ModuleLoader__.load({
7246
7318
  mode: "total",
7247
7319
  toolSort: "count",
7248
7320
  fileSort: "count",
7321
+ insightsEntry: "show",
7249
7322
  writable: false
7250
7323
  };
7251
7324
  let scope;
7252
7325
  const listeners = /* @__PURE__ */ new Set();
7253
7326
  const publish = (next) => {
7254
- 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.writable === state.writable) return;
7327
+ 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;
7255
7328
  state = next;
7256
7329
  for (const listener of listeners) listener();
7257
7330
  };
7258
7331
  const sync = (bound) => {
7259
7332
  const snap = bound.getSnapshot();
7260
7333
  const prefs = prefsOf(snap.value);
7261
- const rawPlacement = snap.value !== null && typeof snap.value === "object" ? snap.value.defaultPlacement : void 0;
7334
+ const raw = snap.value !== null && typeof snap.value === "object" ? snap.value : void 0;
7262
7335
  publish({
7263
7336
  status: snap.status === "ready" || snap.status === "unavailable" ? snap.status : "loading",
7264
- placement: prefs.placement ?? (rawPlacement === void 0 ? state.placement : "all"),
7337
+ placement: prefs.placement ?? (raw?.defaultPlacement === void 0 ? state.placement : "all"),
7265
7338
  granularity: prefs.granularity ?? state.granularity,
7266
7339
  mode: prefs.mode ?? state.mode,
7267
7340
  toolSort: prefs.toolSort ?? state.toolSort,
7268
7341
  fileSort: prefs.fileSort ?? state.fileSort,
7342
+ insightsEntry: prefs.insightsEntry ?? (raw?.insightsEntry === void 0 ? state.insightsEntry : "show"),
7269
7343
  writable: snap.writable
7270
7344
  });
7271
- return prefs.placement;
7345
+ return {
7346
+ placement: prefs.placement,
7347
+ insightsEntry: prefs.insightsEntry
7348
+ };
7272
7349
  };
7273
7350
  return {
7274
7351
  store: {
@@ -7285,6 +7362,7 @@ window.__ModuleLoader__.load({
7285
7362
  defaultTrendMode: () => state.mode,
7286
7363
  defaultToolSort: () => state.toolSort,
7287
7364
  defaultFileSort: () => state.fileSort,
7365
+ insightsEntry: () => state.insightsEntry,
7288
7366
  attach(bound) {
7289
7367
  scope = bound;
7290
7368
  sync(bound);
@@ -7301,10 +7379,14 @@ window.__ModuleLoader__.load({
7301
7379
  if (bound === void 0) return;
7302
7380
  bound.set(field, value).catch(() => {
7303
7381
  const truth = sync(bound);
7304
- if (field === "defaultPlacement" && truth === void 0) publish({
7382
+ if (field === "defaultPlacement" && truth.placement === void 0) publish({
7305
7383
  ...state,
7306
7384
  placement: "all"
7307
7385
  });
7386
+ if (field === "insightsEntry" && truth.insightsEntry === void 0) publish({
7387
+ ...state,
7388
+ insightsEntry: "show"
7389
+ });
7308
7390
  });
7309
7391
  }
7310
7392
  };
@@ -9410,7 +9492,7 @@ window.__ModuleLoader__.load({
9410
9492
  return function PluginInfo() {
9411
9493
  const [latest, setLatest] = (0, react.useState)(null);
9412
9494
  (0, react.useEffect)(() => {
9413
- if ("0.53.0".includes("-dev")) return;
9495
+ if ("0.53.1".includes("-dev")) return;
9414
9496
  let on = true;
9415
9497
  fetchLatestVersion().then((v) => {
9416
9498
  if (on && v) setLatest(v);
@@ -9419,8 +9501,8 @@ window.__ModuleLoader__.load({
9419
9501
  on = false;
9420
9502
  };
9421
9503
  }, []);
9422
- const update = latest !== null && isNewerVersion(latest, "0.53.0") ? latest : null;
9423
- const nameText = "dsh-context (v0.53.0)";
9504
+ const update = latest !== null && isNewerVersion(latest, "0.53.1") ? latest : null;
9505
+ const nameText = "dsh-context (v0.53.1)";
9424
9506
  const nameValue = [nameText];
9425
9507
  if (update) nameValue.push(/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
9426
9508
  className: "lc-pi-update",
@@ -11266,7 +11348,7 @@ window.__ModuleLoader__.load({
11266
11348
  }
11267
11349
  //#endregion
11268
11350
  //#region \0dsh-global-css:/home/runner/work/dsh-context/dsh-context/src/client/styles/overview.css.mjs
11269
- const css = ".lc-ov-entry{box-sizing:border-box;width:calc(100% + 4px);height:42px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:0;border-radius:12px;align-items:center;gap:8px;margin:0 -2px;padding:0 10px 0 8px;font-family:inherit;font-size:14px;line-height:22px;display:flex;position:relative;overflow:hidden}.lc-ov-entry:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-ov-entry-rail{border-radius:50%;flex:none;justify-content:center;gap:0;width:36px;height:36px;margin:0;padding:0}.lc-ov-entry-icon{flex:none}.lc-ov-entry-label{text-align:left;white-space:nowrap;text-overflow:ellipsis;flex:auto;min-width:0;overflow:hidden}.lc-ov-badge{box-sizing:border-box;background:var(--color-green-500);color:#fff;pointer-events:none;border-radius:999px;justify-content:center;align-items:center;min-width:15px;height:15px;padding:0 4px;font-size:9px;font-weight:700;line-height:1;display:flex;position:absolute;top:1px;right:4px}.lc-ov-backdrop{z-index:200;background:var(--dsw-alias-bg-mask-1,#00000073);justify-content:center;align-items:center;display:flex;position:fixed;inset:0;container:lc-ov/inline-size}.lc-ov-card{box-sizing:border-box;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);width:min(1120px,100vw - 32px);max-height:min(86vh,900px);box-shadow:var(--dsw-shadow-lv3,0 12px 32px #0006);color:var(--dsw-alias-label-primary);border-radius:12px;flex-direction:column;padding:16px 18px 18px;font-size:13px;display:flex;overflow:hidden}.lc-ov-head{flex-wrap:wrap;flex:none;align-items:center;gap:10px;margin-bottom:14px;display:flex}.lc-ov-head-icon{flex:none}.lc-ov-title{white-space:nowrap;font-size:15px;font-weight:600}.lc-ov-head .lc-modal-close{flex:none;margin-left:0}.lc-ov-body{flex:auto;grid-template-columns:minmax(0,3fr) minmax(0,7fr);gap:10px;min-height:0;display:grid}.lc-ov-left{flex-direction:column;gap:10px;min-height:0;display:flex;overflow-y:auto}.lc-ov-right{min-height:0;overflow-y:auto}@container lc-ov (width<=932px){.lc-ov-card{overflow-y:auto}.lc-ov-body{display:block}.lc-ov-left{margin-bottom:12px}.lc-ov-left,.lc-ov-right{min-height:auto;overflow:visible}.lc-ov-heat-card{flex:none}}.lc-ov-left>.lc-card{box-sizing:border-box;min-width:0;margin-bottom:0}.lc-ov-kpis{flex:none;grid-template-rows:repeat(3,1fr);grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;display:grid}.lc-ov-kpi{align-items:center;padding:10px 8px}.lc-ov-kpi .lc-stat-value{font-size:20px}.lc-ov-heat-card{flex-direction:column;flex:1 0 auto;display:flex}.lc-heat{flex:1;justify-content:center;align-items:center;gap:4px;display:flex}.lc-heat-wds{flex-direction:column;gap:3px;display:flex}.lc-heat-wd{width:10px;height:20px;color:var(--dsw-alias-label-secondary);text-align:center;flex:none;justify-content:center;align-items:center;font-size:9px;display:flex}.lc-heat-cols{gap:3px;display:flex}.lc-heat-col{flex-direction:column;gap:3px;display:flex}.lc-heat-cell{box-sizing:border-box;background:var(--dsw-alias-bg-layer-2);cursor:default;border:0;border-radius:20%;width:20px;height:20px;padding:0}button.lc-heat-cell{cursor:pointer}button.lc-heat-cell:hover{box-shadow:0 0 0 1.5px color-mix(in srgb, var(--color-blue-500) 70%, transparent)}.lc-heat-future{background:0 0}.lc-heat-0{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 16%, transparent)}.lc-heat-1{background:color-mix(in srgb, var(--color-blue-500) 28%, transparent)}.lc-heat-2{background:color-mix(in srgb, var(--color-blue-500) 50%, transparent)}.lc-heat-3{background:color-mix(in srgb, var(--color-blue-500) 72%, transparent)}.lc-heat-4{background:color-mix(in srgb, var(--color-blue-500) 92%, transparent)}.lc-heat-on{box-shadow:0 0 0 1.5px var(--color-blue-500)}.lc-ov-list-head{flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:10px;display:flex}.lc-ov-list-title{white-space:nowrap;font-weight:600}.lc-ov-list-count{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;background:var(--dsw-alias-bg-layer-2);border-radius:8px;padding:1px 7px;font-size:11px}.lc-ov-day-chip{border:1px solid color-mix(in srgb, var(--color-blue-500) 45%, transparent);color:var(--color-blue-500);background:color-mix(in srgb, var(--color-blue-500) 10%, transparent);cursor:pointer;white-space:nowrap;border-radius:999px;padding:1px 10px;font-family:inherit;font-size:11px;line-height:1.4}.lc-ov-search{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);min-width:110px;font:inherit;color:var(--dsw-alias-label-primary);transition:border-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-radius:6px;outline:none;flex:150px;padding:4px 10px;font-size:12px}.lc-ov-search:focus{border-color:var(--dsw-alias-label-secondary)}.lc-ov-search::placeholder{color:var(--dsw-alias-label-secondary)}.lc-ov-groups{flex-wrap:wrap;gap:6px;margin:-2px 0 10px;display:flex}.lc-ov-chip{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;white-space:nowrap;text-overflow:ellipsis;max-width:220px;transition: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), background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border-radius:999px;align-items:baseline;gap:5px;padding:2px 10px;font-size:11px;line-height:1.5;display:inline-flex;overflow:hidden}.lc-ov-chip:hover{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-secondary)}.lc-ov-chip-on,.lc-ov-chip-on:hover{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground);border-color:#0000}.lc-ov-chip-n{font-variant-numeric:tabular-nums;opacity:.65;font-size:10px}.lc-ov-chip-on .lc-ov-chip-n{opacity:.85}.lc-ov-grid{grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:10px;display:grid}.lc-ov-session{text-align:left;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;font:inherit;color:inherit;transition:border-color 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);border-radius:10px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}.lc-ov-session:hover{border-color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2)}.lc-ov-session-current{border-color:color-mix(in srgb, var(--color-blue-500) 65%, transparent)}.lc-ov-session-head{align-items:flex-start;gap:6px;min-width:0;display:flex}.lc-ov-running{background:var(--color-green-500);border-radius:50%;flex:none;width:7px;height:7px}.lc-ov-session-title{-webkit-line-clamp:2;overflow-wrap:anywhere;-webkit-box-orient:vertical;flex:auto;min-width:0;font-weight:600;display:-webkit-box;overflow:hidden}.lc-ov-current{color:var(--color-blue-500);border:1px solid color-mix(in srgb, var(--color-blue-500) 45%, transparent);border-radius:4px;flex:none;padding:0 4px;font-size:10px;line-height:1.5}.lc-ov-session-times{flex-direction:column;flex:none;align-items:flex-end;gap:1px;display:flex}.lc-ov-session-time{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-size:11px}.lc-ov-session-created{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-variant-numeric:tabular-nums;font-size:10px;line-height:1.4}.lc-ov-session-crumb{min-width:0;color:var(--dsw-alias-label-secondary);white-space:nowrap;align-items:center;gap:5px;font-size:11px;display:flex;overflow:hidden}.lc-ov-crumb-group{text-overflow:ellipsis;flex:none;max-width:55%;overflow:hidden}.lc-ov-crumb-sep{opacity:.55;flex:none}.lc-ov-crumb-project{text-overflow:ellipsis;min-width:0;font-family:var(--ds-font-family-code,ui-monospace, SFMono-Regular, Menlo, monospace);color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-label-secondary) 16%, transparent);border-radius:999px;flex:0 auto;padding:0 8px;font-size:10px;line-height:1.6;overflow:hidden}.lc-ov-session-body{align-items:center;gap:14px;min-width:0;display:flex}.lc-ov-mini-stats{flex-direction:column;flex:auto;gap:3px;min-width:0;display:flex}.lc-ov-mini-stat{justify-content:space-between;align-items:baseline;gap:10px;font-size:11px;display:flex}.lc-ov-mini-label{color:var(--dsw-alias-label-secondary);white-space:nowrap;flex:none}.lc-ov-mini-value{font-variant-numeric:tabular-nums;white-space:nowrap;font-weight:600}.lc-ov-session-empty{color:var(--dsw-alias-label-secondary);padding:6px 0;font-size:11px;line-height:1.5}.lc-ov-session-preview{border-top:1px solid color-mix(in srgb, var(--dsw-alias-border-l2) 60%, transparent);align-items:baseline;gap:6px;min-width:0;margin-top:auto;padding-top:6px;display:flex}.lc-ov-session-preview-label{color:var(--dsw-alias-label-secondary);flex:none;font-size:10px}.lc-ov-session-preview-text{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-primary);flex:0 auto;font-size:11px;line-height:1.5;overflow:hidden}.lc-ov-pager{justify-content:center;align-items:center;gap:10px;margin-top:12px;display:flex}.lc-ov-pager-btn{border:1px solid var(--dsw-alias-border-l2);width:26px;height:22px;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);background:0 0;border-radius:6px;flex:none;justify-content:center;align-items:center;line-height:1;display:flex}.lc-ov-pager-btn:hover:enabled{border-color:var(--dsw-alias-label-secondary)}.lc-ov-pager-btn:disabled{opacity:.4;cursor:default}.lc-ov-pager-n{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:11px}";
11351
+ const css = ".lc-ov-entry{box-sizing:border-box;width:calc(100% + 4px);height:42px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:0;border-radius:12px;align-items:center;gap:8px;margin:0 -2px;padding:0 10px 0 8px;font-family:inherit;font-size:14px;line-height:22px;display:flex;position:relative;overflow:hidden}.lc-ov-entry:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-ov-entry-rail{border-radius:50%;flex:none;justify-content:center;gap:0;width:36px;height:36px;margin:0;padding:0}.lc-ov-entry-icon{flex:none}.lc-ov-entry-label{text-align:left;white-space:nowrap;text-overflow:ellipsis;flex:auto;min-width:0;overflow:hidden}.lc-ov-badge{box-sizing:border-box;background:var(--color-green-500);color:#fff;pointer-events:none;border-radius:999px;justify-content:center;align-items:center;min-width:15px;height:15px;padding:0 4px;font-size:9px;font-weight:700;line-height:1;display:flex;position:absolute;top:1px;right:4px}.lc-ov-backdrop{z-index:200;background:var(--dsw-alias-bg-mask-1,#00000073);justify-content:center;align-items:center;display:flex;position:fixed;inset:0;container:lc-ov/inline-size}.lc-ov-card{box-sizing:border-box;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);width:min(1120px,100vw - 32px);max-height:min(86vh,900px);box-shadow:var(--dsw-shadow-lv3,0 12px 32px #0006);color:var(--dsw-alias-label-primary);border-radius:12px;flex-direction:column;padding:16px 18px 18px;font-size:13px;display:flex;overflow:hidden}.lc-ov-head{flex-wrap:wrap;flex:none;align-items:center;gap:10px;margin-bottom:14px;display:flex}.lc-ov-head-icon{flex:none}.lc-ov-title{white-space:nowrap;font-size:15px;font-weight:600}.lc-ov-head .lc-modal-close{flex:none;margin-left:0}.lc-ov-body{flex:auto;grid-template-columns:minmax(0,3fr) minmax(0,7fr);gap:10px;min-height:0;display:grid}.lc-ov-left{scrollbar-gutter:stable;flex-direction:column;gap:10px;min-height:0;padding-right:8px;display:flex;overflow-y:auto}.lc-ov-right{scrollbar-gutter:stable;min-height:0;padding-right:8px;overflow-y:auto}@container lc-ov (width<=932px){.lc-ov-card{overflow-y:auto}.lc-ov-body{display:block}.lc-ov-left{margin-bottom:12px}.lc-ov-left,.lc-ov-right{min-height:auto;padding-right:0;overflow:visible}.lc-ov-heat-card{flex:none}}.lc-ov-left>.lc-card{box-sizing:border-box;min-width:0;margin-bottom:0}.lc-ov-kpis{flex:none;grid-template-rows:repeat(3,1fr);grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;display:grid}.lc-ov-kpi{align-items:center;padding:10px 8px}.lc-ov-kpi .lc-stat-value{font-size:20px}.lc-ov-heat-card{flex-direction:column;flex:1 0 auto;display:flex}.lc-heat{flex:1;justify-content:center;align-items:center;gap:4px;display:flex}.lc-heat-wds,.lc-heat-col{padding-top:13px}.lc-heat-wds{flex-direction:column;gap:3px;display:flex}.lc-heat-wd{width:10px;height:20px;color:var(--dsw-alias-label-secondary);text-align:center;flex:none;justify-content:center;align-items:center;font-size:9px;display:flex}.lc-heat-cols{gap:3px;display:flex}.lc-heat-col{flex-direction:column;gap:3px;display:flex;position:relative}.lc-heat-mon{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-size:9px;line-height:13px;position:absolute;top:0;left:0}.lc-heat-cell{box-sizing:border-box;background:var(--dsw-alias-bg-layer-2);cursor:default;border:0;border-radius:20%;width:20px;height:20px;padding:0}button.lc-heat-cell{cursor:pointer}button.lc-heat-cell:hover{box-shadow:0 0 0 1.5px color-mix(in srgb, var(--color-blue-500) 70%, transparent)}.lc-heat-future{background:0 0}.lc-heat-0{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 16%, transparent)}.lc-heat-1{background:color-mix(in srgb, var(--color-blue-500) 28%, transparent)}.lc-heat-2{background:color-mix(in srgb, var(--color-blue-500) 50%, transparent)}.lc-heat-3{background:color-mix(in srgb, var(--color-blue-500) 72%, transparent)}.lc-heat-4{background:color-mix(in srgb, var(--color-blue-500) 92%, transparent)}.lc-heat-on{box-shadow:0 0 0 1.5px var(--color-blue-500)}.lc-ov-list-head{flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:10px;display:flex}.lc-ov-list-title{white-space:nowrap;font-weight:600}.lc-ov-list-count{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;background:var(--dsw-alias-bg-layer-2);border-radius:8px;padding:1px 7px;font-size:11px}.lc-ov-day-chip{border:1px solid color-mix(in srgb, var(--color-blue-500) 45%, transparent);color:var(--color-blue-500);background:color-mix(in srgb, var(--color-blue-500) 10%, transparent);cursor:pointer;white-space:nowrap;border-radius:999px;padding:1px 10px;font-family:inherit;font-size:11px;line-height:1.4}.lc-ov-search{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);min-width:110px;font:inherit;color:var(--dsw-alias-label-primary);transition:border-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);border-radius:6px;outline:none;flex:150px;padding:4px 10px;font-size:12px}.lc-ov-search:focus{border-color:var(--dsw-alias-label-secondary)}.lc-ov-search::placeholder{color:var(--dsw-alias-label-secondary)}.lc-ov-groups{flex-wrap:wrap;gap:6px;margin:-2px 0 10px;display:flex}.lc-ov-chip{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;white-space:nowrap;text-overflow:ellipsis;max-width:220px;transition: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), background-color var(--ds-transition-duration,.2s) var(--ds-ease-in-out,ease-in-out);background:0 0;border-radius:999px;align-items:baseline;gap:5px;padding:2px 10px;font-size:11px;line-height:1.5;display:inline-flex;overflow:hidden}.lc-ov-chip:hover{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-secondary)}.lc-ov-chip-on,.lc-ov-chip-on:hover{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground);border-color:#0000}.lc-ov-chip-n{font-variant-numeric:tabular-nums;opacity:.65;font-size:10px}.lc-ov-chip-on .lc-ov-chip-n{opacity:.85}.lc-ov-grid{grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:10px;display:grid}.lc-ov-session{text-align:left;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;font:inherit;color:inherit;transition:border-color 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);border-radius:10px;flex-direction:column;gap:6px;padding:10px 12px;display:flex}.lc-ov-session:hover{border-color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2)}.lc-ov-session-current{border-color:color-mix(in srgb, var(--color-blue-500) 65%, transparent)}.lc-ov-session-head{align-items:flex-start;gap:6px;min-width:0;display:flex}.lc-ov-running{background:var(--color-green-500);border-radius:50%;flex:none;width:7px;height:7px}.lc-ov-session-title{-webkit-line-clamp:2;overflow-wrap:anywhere;-webkit-box-orient:vertical;flex:auto;min-width:0;font-weight:600;display:-webkit-box;overflow:hidden}.lc-ov-current{color:var(--color-blue-500);border:1px solid color-mix(in srgb, var(--color-blue-500) 45%, transparent);border-radius:4px;flex:none;padding:0 4px;font-size:10px;line-height:1.5}.lc-ov-session-times{flex-direction:column;flex:none;align-items:flex-end;gap:1px;display:flex}.lc-ov-session-time{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-size:11px}.lc-ov-session-created{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-variant-numeric:tabular-nums;font-size:10px;line-height:1.4}.lc-ov-session-crumb{min-width:0;color:var(--dsw-alias-label-secondary);white-space:nowrap;align-items:center;gap:5px;font-size:11px;display:flex;overflow:hidden}.lc-ov-crumb-group{text-overflow:ellipsis;flex:none;max-width:55%;overflow:hidden}.lc-ov-crumb-sep{opacity:.55;flex:none}.lc-ov-crumb-project{text-overflow:ellipsis;min-width:0;font-family:var(--ds-font-family-code,ui-monospace, SFMono-Regular, Menlo, monospace);color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-label-secondary) 16%, transparent);border-radius:999px;flex:0 auto;padding:0 8px;font-size:10px;line-height:1.6;overflow:hidden}.lc-ov-session-body{align-items:center;gap:14px;min-width:0;display:flex}.lc-ov-mini-stats{flex-direction:column;flex:auto;gap:3px;min-width:0;display:flex}.lc-ov-mini-stat{justify-content:space-between;align-items:baseline;gap:10px;font-size:11px;display:flex}.lc-ov-mini-label{color:var(--dsw-alias-label-secondary);white-space:nowrap;flex:none}.lc-ov-mini-value{font-variant-numeric:tabular-nums;white-space:nowrap;font-weight:600}.lc-ov-session-empty{color:var(--dsw-alias-label-secondary);padding:6px 0;font-size:11px;line-height:1.5}.lc-ov-session-preview{border-top:1px solid color-mix(in srgb, var(--dsw-alias-border-l2) 60%, transparent);align-items:baseline;gap:6px;min-width:0;margin-top:auto;padding-top:6px;display:flex}.lc-ov-session-preview-label{color:var(--dsw-alias-label-secondary);flex:none;font-size:10px}.lc-ov-session-preview-text{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-primary);flex:0 auto;font-size:11px;line-height:1.5;overflow:hidden}.lc-ov-pager{justify-content:center;align-items:center;gap:10px;margin-top:12px;display:flex}.lc-ov-pager-btn{border:1px solid var(--dsw-alias-border-l2);width:26px;height:22px;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);background:0 0;border-radius:6px;flex:none;justify-content:center;align-items:center;line-height:1;display:flex}.lc-ov-pager-btn:hover:enabled{border-color:var(--dsw-alias-label-secondary)}.lc-ov-pager-btn:disabled{opacity:.4;cursor:default}.lc-ov-pager-n{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:11px}";
11270
11352
  const tagId = "dsh-context/overview.css";
11271
11353
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
11272
11354
  const tag = document.createElement("style");
@@ -11345,7 +11427,7 @@ window.__ModuleLoader__.load({
11345
11427
  inject: (sessionId = "") => ({ hooks: { contextModal: modalStoreOf(sessionId) } })
11346
11428
  }, (props) => (0, react.createElement)(ContextModal, props));
11347
11429
  });
11348
- const OverviewButton = makeOverviewButton(kit);
11430
+ const OverviewButton = makeOverviewButton(kit, settings);
11349
11431
  ctx.slots.inject("sidebar.footer.action", () => {
11350
11432
  return ctx.slots.register({
11351
11433
  name: "sidebar.footer.action",
package/lib/index.js CHANGED
@@ -2943,7 +2943,8 @@ const SettingsSchema = z$1.object({
2943
2943
  "count",
2944
2944
  "latest",
2945
2945
  "path"
2946
- ]).default("count").loose()
2946
+ ]).default("count").loose(),
2947
+ insightsEntry: z$1.union(["show", "hide"]).default("show").loose()
2947
2948
  });
2948
2949
  /** Serve the namespace while a settings provider is composed; inert otherwise. */
2949
2950
  function installSettings(ctx) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-context",
3
- "version": "0.53.0",
3
+ "version": "0.53.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": {