@wendongfly/myhi 1.3.156 → 1.3.157
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 +32 -2
- package/package.json +1 -1
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}
|
|
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('聊天记录已清除');
|
package/package.json
CHANGED