@wendongfly/myhi 1.3.156 → 1.3.158

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/dist/chat.html CHANGED
@@ -2636,12 +2636,25 @@
2636
2636
  // claude 满 ~90% 会 auto-compact;myhi 显示水位 + 过阈值提示,让用户在任务节点**主动**压缩更可控。
2637
2637
  const CTX_WARN = 0.75, CTX_URGENT = 0.9;
2638
2638
  let _ctxIs1M = false; // stream 里 model 带 [1m] 后缀(如 claude-opus-5-5[1m])→ 精确判定 1M 窗口
2639
+ // 网关路由的第三方模型(glm-5.2 等)名字里没有 [1m],猜不住——会话数据面板里可手动指定窗口,
2640
+ // 存 localStorage 按会话隔离;优先级:手动指定 > [1m] 后缀 > >200k 兜底
2641
+ function ctxLimitOverride() {
2642
+ try {
2643
+ const v = parseInt(localStorage.getItem('myhi_ctx_limit_' + SESSION_ID), 10);
2644
+ if (v === 200_000 || v === 1_000_000) return v;
2645
+ } catch { /* ignore */ }
2646
+ return 0;
2647
+ }
2639
2648
  function ctxLimit(tokens) {
2649
+ const ov = ctxLimitOverride();
2650
+ if (ov) return ov;
2640
2651
  if (_ctxIs1M) return 1_000_000;
2641
2652
  // 没有 [1m] 标记时的兜底:200k 窗口装不下 >200k,超过即证明是 1M
2642
2653
  return tokens > 200_000 ? 1_000_000 : 200_000;
2643
2654
  }
2655
+ let _lastCtxTokens = 0;
2644
2656
  function ctxUpdate(tokens) {
2657
+ if (tokens > 0) _lastCtxTokens = tokens;
2645
2658
  const chip = document.getElementById('ctx-chip');
2646
2659
  if (!chip) return;
2647
2660
  if (!tokens || tokens <= 0) { chip.style.display = 'none'; return; }
@@ -2700,16 +2713,26 @@
2700
2713
  const tokens = s.contextTokens || 0;
2701
2714
  let html = '';
2702
2715
 
2716
+ // 窗口手动切换(网关模型名不带 [1m],猜不住 → 让用户指定;跑查询前也可先设好)
2717
+ const limitButtons = (limit) => {
2718
+ const ov = ctxLimitOverride();
2719
+ const auto = ov ? '' : '(自动)';
2720
+ const btn = (v, label) => `<button onclick="ctxSetLimit(${v})" style="border:1px solid ${limit === v ? 'var(--blue2)' : 'var(--border)'};background:${limit === v ? 'var(--blue2)' : 'var(--bg)'};color:${limit === v ? '#fff' : 'var(--text2)'};border-radius:6px;padding:0.1rem 0.45rem;font-size:0.7rem;cursor:pointer">${label}</button>`;
2721
+ return `<span style="font-weight:400;font-size:0.68rem;color:var(--muted)">窗口${auto} ${btn(200_000, '200k')} ${btn(1_000_000, '1M')}</span>`;
2722
+ };
2723
+
2703
2724
  // ① 上下文水位
2704
2725
  if (tokens > 0) {
2705
2726
  const limit = ctxLimit(tokens);
2706
2727
  const pct = Math.min(100, Math.round(tokens / limit * 100));
2707
2728
  const barColor = pct >= 90 ? 'var(--red)' : pct >= 75 ? 'var(--yellow)' : 'var(--blue2)';
2708
- html += `<div ${C}><div ${H}>上下文水位</div>` +
2729
+ html += `<div ${C}><div ${H} style="display:flex;justify-content:space-between;align-items:center"><span>上下文水位</span>${limitButtons(limit)}</div>` +
2709
2730
  `<div style="background:var(--surface2);border-radius:6px;height:10px;overflow:hidden;margin-bottom:0.4rem"><div style="width:${pct}%;height:100%;background:${barColor};border-radius:6px;transition:width 0.4s"></div></div>` +
2710
2731
  `<div ${R}><span>${pct}%(${pct >= 90 ? '快满了,建议主动压缩' : pct >= 75 ? '建议任务节点压缩' : '健康'})</span><span ${V}>${(tokens / 1000).toFixed(1)}k / ${limit >= 1_000_000 ? '1M' : '200k'}</span></div></div>`;
2711
2732
  } else {
2712
- html += `<div ${C}><div ${H}>上下文水位</div><div ${R}><span style="color:var(--muted)">本轮还没跑过查询</span></div></div>`;
2733
+ html += `<div ${C}><div ${H} style="display:flex;justify-content:space-between;align-items:center"><span>上下文水位</span>${limitButtons(ctxLimit(0))}</div>` +
2734
+ `<div ${R}><span style="color:var(--muted)">还没跑过查询,跑一轮后显示水位</span></div>` +
2735
+ `<div ${R} style="margin-top:0.3rem"><span style="color:var(--muted);font-size:0.7rem">网关模型(如 glm-5.2)名字不带 [1m] 时请手动指定窗口</span></div></div>`;
2713
2736
  }
2714
2737
 
2715
2738
  // ② 累计用量(服务端权威账本)
@@ -2737,6 +2760,12 @@
2737
2760
  n = n || 0;
2738
2761
  return n >= 1_000_000 ? (n / 1_000_000).toFixed(2) + 'M' : n >= 1000 ? (n / 1000).toFixed(1) + 'k' : String(n);
2739
2762
  }
2763
+ // 手动指定上下文窗口:存 localStorage(按会话),刷新 chip 与面板
2764
+ window.ctxSetLimit = function(v) {
2765
+ try { localStorage.setItem('myhi_ctx_limit_' + SESSION_ID, String(v)); } catch { /* ignore */ }
2766
+ ctxUpdate(_lastCtxTokens || 0);
2767
+ openCtxSheet(); // 重开面板重渲染(重新拉数据)
2768
+ };
2740
2769
 
2741
2770
  // 服务端本地处理的 slash 命令(agent.js 拦截后只回一条 system/info、不 spawn claude、
2742
2771
  // 永远等不到 result)—— 这些不能进 thinking/working 态,否则没人把它清回来:
@@ -3841,6 +3870,7 @@
3841
3870
  socket.emit('agent:query', { prompt: '/clear' });
3842
3871
  addStatusMessage('已清除对话和 Claude 上下文');
3843
3872
  _ctxNudgeLevel = 0;
3873
+ _lastCtxTokens = 0;
3844
3874
  ctxUpdate(0); // 上下文已清空,水位指示复位
3845
3875
  } else {
3846
3876
  addStatusMessage('聊天记录已清除');