sage-mem 2.7.0 → 2.7.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/README.en.md +1 -1
- package/README.md +1 -1
- package/lib/client.js +94 -10
- package/package.json +1 -1
package/README.en.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
**Cross-session memory for DeepSeek Harness — plain markdown files, no database, no worker.**
|
|
14
14
|
|
|
15
|
-
**Current release: `2.7.
|
|
15
|
+
**Current release: `2.7.1`** — the npm badge above is the dynamic source of truth. **Contract baseline: `1.0.0`** — the first stable release, whose public commitments, the capability boundaries and the list of things it explicitly cannot do are frozen in the
|
|
16
16
|
[frozen contract](https://github.com/gezi-wen/sage-mem/blob/main/docs/1.0.0-contract.md).
|
|
17
17
|
|
|
18
18
|
If it is useful to you, a Star is the most direct feedback.
|
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
> File-based cross-session memory for DeepSeek Harness — every memory is a plain markdown file you can open, edit and delete. No database, no worker, no port.
|
|
16
16
|
|
|
17
|
-
**当前发布版本:`2.7.
|
|
17
|
+
**当前发布版本:`2.7.1`** —— 顶部 npm 徽章是动态权威。**契约基线:`1.0.0`** —— 第一个稳定版,公开承诺、能力边界与「明确做不到」的清单冻结在
|
|
18
18
|
[契约冻结](https://github.com/gezi-wen/sage-mem/blob/main/docs/1.0.0-contract.md)。
|
|
19
19
|
|
|
20
20
|
如果它对你有用,给个 Star 是最直接的反馈。
|
package/lib/client.js
CHANGED
|
@@ -678,9 +678,10 @@ const StarmapRuntime = (function (require, _react) {
|
|
|
678
678
|
"uniform float uTime;",
|
|
679
679
|
"uniform float uHoverIdx;",
|
|
680
680
|
"uniform float uRevealT;",
|
|
681
|
+
"uniform float uFadeMs;",
|
|
681
682
|
"float revealFactor(){",
|
|
682
683
|
" if (vBirth < 0.0) return 1.0;",
|
|
683
|
-
" float t = clamp((uRevealT - vBirth) /
|
|
684
|
+
" float t = clamp((uRevealT - vBirth) / uFadeMs, 0.0, 1.0);",
|
|
684
685
|
" return t * t * (3.0 - 2.0 * t);",
|
|
685
686
|
"}",
|
|
686
687
|
"void main(){",
|
|
@@ -725,9 +726,10 @@ const StarmapRuntime = (function (require, _react) {
|
|
|
725
726
|
"varying vec4 vColor;",
|
|
726
727
|
"varying float vBirth;",
|
|
727
728
|
"uniform float uRevealT;",
|
|
729
|
+
"uniform float uFadeMs;",
|
|
728
730
|
"void main(){",
|
|
729
731
|
" if (vBirth < 0.0){ gl_FragColor = vColor; return; }",
|
|
730
|
-
" float t = clamp((uRevealT - vBirth) /
|
|
732
|
+
" float t = clamp((uRevealT - vBirth) / uFadeMs, 0.0, 1.0);",
|
|
731
733
|
" t = t * t * (3.0 - 2.0 * t);",
|
|
732
734
|
" gl_FragColor = vec4(vColor.rgb, vColor.a * t);",
|
|
733
735
|
"}",
|
|
@@ -756,6 +758,44 @@ const StarmapRuntime = (function (require, _react) {
|
|
|
756
758
|
const SMAP_CORNERS = [-1, -1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1];
|
|
757
759
|
const SMAP_ATTR_SIZE = { aCorner: 2, aMeta0: 3, aColor: 4, aMeta1: 3, aBirth: 1 };
|
|
758
760
|
|
|
761
|
+
/**
|
|
762
|
+
* 诞生回放的**数值域**(Q15 尾巴 / 2.7.2)。
|
|
763
|
+
*
|
|
764
|
+
* 为什么不能把 epoch 毫秒直接喂给 shader:`vBirth` 是 Float32 顶点属性,`uRevealT`
|
|
765
|
+
* 也是 Float32 uniform —— 1.7e12 这个量级的 ulp = 2^(40-23) ≈ 131072 ms,而渐亮窗口
|
|
766
|
+
* 只有 900 ms。两个数各自舍入之后,`uRevealT - vBirth` 要么 ≤ 0 要么 ≫ 窗口,
|
|
767
|
+
* 于是 WebGL 后端里每颗星其实都是**瞬亮**;canvas2d 兜底路径用 double 不受影响,
|
|
768
|
+
* 所以肉眼看不出差异 —— 这正是一个藏了五版的精度问题。
|
|
769
|
+
*
|
|
770
|
+
* 修法两层:① 时间域压到**最老的那颗星**(base = 最小 mtime),birth 存相对值,
|
|
771
|
+
* 最大量级只剩「最老的记忆有多老」;② 窗口按跨度取 `max(900, span/40)`,
|
|
772
|
+
* 保证窗口 ≫ 1 ulp(跨度越大时间轴越粗,但 900ms 的固定窗口对粗时间轴毫无意义)。
|
|
773
|
+
*
|
|
774
|
+
* @param {Array<{star?:{mtimeMs?:number}}>} pts 参与绘制的可见点
|
|
775
|
+
* @returns {{base:number, span:number, fadeMs:number}} base=0 表示没有任何时间信息
|
|
776
|
+
*/
|
|
777
|
+
function starmapRevealDomain(pts) {
|
|
778
|
+
const list = Array.isArray(pts) ? pts : [];
|
|
779
|
+
let mn = Infinity;
|
|
780
|
+
let mx = -Infinity;
|
|
781
|
+
for (const p of list) {
|
|
782
|
+
const m = p && p.star && typeof p.star.mtimeMs === "number" ? p.star.mtimeMs : 0;
|
|
783
|
+
if (m > 0) {
|
|
784
|
+
if (m < mn) mn = m;
|
|
785
|
+
if (m > mx) mx = m;
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
if (!isFinite(mn)) return { base: 0, span: 1, fadeMs: 900 };
|
|
789
|
+
const span = Math.max(mx - mn, 1);
|
|
790
|
+
return { base: mn, span: span, fadeMs: starmapFadeMs(span) };
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
/** 渐亮窗口:至少 900ms;跨度大时取跨度的 1/40(18s 回放走完整段,观感仍是逐颗点亮)。 */
|
|
794
|
+
function starmapFadeMs(span) {
|
|
795
|
+
const s = typeof span === "number" && isFinite(span) && span > 0 ? span : 1;
|
|
796
|
+
return Math.max(900, s / 40);
|
|
797
|
+
}
|
|
798
|
+
|
|
759
799
|
function pushStarQuad(arr, cx, cy, r, rgb, aBase, twPhase, fresh, idx, birth) {
|
|
760
800
|
for (let v = 0; v < 6; v++) {
|
|
761
801
|
arr.push(SMAP_CORNERS[v * 2], SMAP_CORNERS[v * 2 + 1]);
|
|
@@ -794,8 +834,8 @@ const StarmapRuntime = (function (require, _react) {
|
|
|
794
834
|
gl.viewport(0, 0, canvasEl.width, canvasEl.height);
|
|
795
835
|
const pal = starmapPalette();
|
|
796
836
|
const progBg = glProgram(gl, SMAP_BG_VS, smapBgFs(pal.bgGl[0], pal.bgGl[1]), ["aPos"], ["uRes", "uTime"]);
|
|
797
|
-
const progStar = glProgram(gl, SMAP_STAR_VS, SMAP_STAR_FS, ["aCorner", "aMeta0", "aColor", "aMeta1", "aBirth"], ["uRes", "uTime", "uHoverIdx", "uRevealT"]);
|
|
798
|
-
const progLine = glProgram(gl, SMAP_LINE_VS, SMAP_LINE_FS, ["aPos", "aColor", "aBirth"], ["uRes", "uRevealT"]);
|
|
837
|
+
const progStar = glProgram(gl, SMAP_STAR_VS, SMAP_STAR_FS, ["aCorner", "aMeta0", "aColor", "aMeta1", "aBirth"], ["uRes", "uTime", "uHoverIdx", "uRevealT", "uFadeMs"]);
|
|
838
|
+
const progLine = glProgram(gl, SMAP_LINE_VS, SMAP_LINE_FS, ["aPos", "aColor", "aBirth"], ["uRes", "uRevealT", "uFadeMs"]);
|
|
799
839
|
|
|
800
840
|
// 背景全屏两三角(clip space 直给)
|
|
801
841
|
const bgQuadBuf = gl.createBuffer();
|
|
@@ -825,17 +865,22 @@ const StarmapRuntime = (function (require, _react) {
|
|
|
825
865
|
// 脏标记:canvas 晚于 visibility effect 挂载时(JSX 分支决定 ref 时序),
|
|
826
866
|
// setGeometry 可能从未被调过——render 前自动补传,顺序无关。
|
|
827
867
|
let geoDirty = true;
|
|
868
|
+
// 诞生回放的时间域(base / span / 渐亮窗口):由 uploadStars 现算,
|
|
869
|
+
// 顶点里的 birth、uniform 的 uRevealT 与 uFadeMs 三处必须共用同一份。
|
|
870
|
+
let revealDomain = { base: 0, span: 1, fadeMs: 900 };
|
|
828
871
|
|
|
829
872
|
function uploadStars() {
|
|
830
873
|
const arr = [];
|
|
831
874
|
const nowMs = Date.now();
|
|
875
|
+
revealDomain = starmapRevealDomain(layout.pts.filter(function (p, i) { return !!visBox.flags[i]; }));
|
|
832
876
|
for (let i = 0; i < layout.pts.length; i++) {
|
|
833
877
|
if (!visBox.flags[i]) continue;
|
|
834
878
|
const p = layout.pts[i];
|
|
835
879
|
const meta = KIND_META[p.star.kind] || KIND_META.special;
|
|
836
880
|
const arch = p.star.archived === true;
|
|
837
881
|
const fresh = p.star.mtimeMs > 0 && nowMs - p.star.mtimeMs < FRESH_MS ? 1 : 0;
|
|
838
|
-
|
|
882
|
+
// -1 在着色器里是「没有诞生时刻,永远全亮」(尘星也是这条分支)。
|
|
883
|
+
const birth = p.star.mtimeMs > 0 ? p.star.mtimeMs - revealDomain.base : -1;
|
|
839
884
|
if (arch) {
|
|
840
885
|
// 归档星 = 暗星,两层画:
|
|
841
886
|
// ① 一层很淡的冷色底盘(走 dust 分支:不带星芒、不参与 hover),
|
|
@@ -864,7 +909,8 @@ const StarmapRuntime = (function (require, _react) {
|
|
|
864
909
|
const hot = hoverLineIdx >= 0 && (ln[0] === hoverLineIdx || ln[1] === hoverLineIdx);
|
|
865
910
|
const mul = hot ? 1 : 0.72;
|
|
866
911
|
const al = hot ? 0.6 : 0.22;
|
|
867
|
-
const
|
|
912
|
+
const birthAbs = Math.max(a.star.mtimeMs || 0, b.star.mtimeMs || 0);
|
|
913
|
+
const birth = birthAbs > 0 ? birthAbs - revealDomain.base : -1;
|
|
868
914
|
arr.push(a.x, a.y, c[0] * mul, c[1] * mul, c[2] * mul, al, birth);
|
|
869
915
|
arr.push(b.x, b.y, c[0] * mul, c[1] * mul, c[2] * mul, al, birth);
|
|
870
916
|
}
|
|
@@ -878,10 +924,12 @@ const StarmapRuntime = (function (require, _react) {
|
|
|
878
924
|
gl.drawArrays(gl.TRIANGLES, 0, count);
|
|
879
925
|
}
|
|
880
926
|
|
|
881
|
-
let revealT = null; // null = 全亮;数字 =
|
|
927
|
+
let revealT = null; // null = 全亮;数字 = 诞生回放的当前时刻(墙钟 ms)
|
|
882
928
|
function render(phase) {
|
|
883
929
|
if (geoDirty) { uploadStars(); uploadLines(); geoDirty = false; }
|
|
884
|
-
|
|
930
|
+
// 全亮用一个足够大的哨兵(1e30 在 Float32 里仍可表示,且远大于任何跨度);
|
|
931
|
+
// 回放时刻换算到与顶点里的 birth 同一个时间域 —— 两边的差才是精度问题的所在。
|
|
932
|
+
const rt = revealT === null ? 1e30 : revealT - revealDomain.base;
|
|
885
933
|
gl.viewport(0, 0, canvasEl.width, canvasEl.height);
|
|
886
934
|
// 背景:不透明
|
|
887
935
|
gl.disable(gl.BLEND);
|
|
@@ -899,6 +947,7 @@ const StarmapRuntime = (function (require, _react) {
|
|
|
899
947
|
gl.useProgram(progLine.prog);
|
|
900
948
|
gl.uniform2f(progLine.uni.uRes, W, H);
|
|
901
949
|
gl.uniform1f(progLine.uni.uRevealT, rt);
|
|
950
|
+
gl.uniform1f(progLine.uni.uFadeMs, revealDomain.fadeMs);
|
|
902
951
|
gl.bindBuffer(gl.ARRAY_BUFFER, lineBuf);
|
|
903
952
|
if (progLine.attr.aPos >= 0) { gl.enableVertexAttribArray(progLine.attr.aPos); gl.vertexAttribPointer(progLine.attr.aPos, 2, gl.FLOAT, false, 28, 0); }
|
|
904
953
|
if (progLine.attr.aColor >= 0) { gl.enableVertexAttribArray(progLine.attr.aColor); gl.vertexAttribPointer(progLine.attr.aColor, 4, gl.FLOAT, false, 28, 8); }
|
|
@@ -910,6 +959,7 @@ const StarmapRuntime = (function (require, _react) {
|
|
|
910
959
|
gl.uniform1f(progStar.uni.uTime, phase);
|
|
911
960
|
gl.uniform1f(progStar.uni.uHoverIdx, hoverBox.idx);
|
|
912
961
|
gl.uniform1f(progStar.uni.uRevealT, rt);
|
|
962
|
+
gl.uniform1f(progStar.uni.uFadeMs, revealDomain.fadeMs);
|
|
913
963
|
drawQuad(progStar, dustBuf, dustCount);
|
|
914
964
|
if (starCount > 0) drawQuad(progStar, starBuf, starCount);
|
|
915
965
|
}
|
|
@@ -948,6 +998,10 @@ const StarmapRuntime = (function (require, _react) {
|
|
|
948
998
|
canvasEl.width = W * SCALE;
|
|
949
999
|
canvasEl.height = H * SCALE;
|
|
950
1000
|
const nowMs = Date.now();
|
|
1001
|
+
// 与 WebGL 路径共用同一份时间域(只取 fadeMs 用;这里都是 double,不存在精度问题,
|
|
1002
|
+
// 但窗口长度必须一致 —— 否则两条路径的点亮节奏对不上,真机上看就是两套动画)。
|
|
1003
|
+
const domain = starmapRevealDomain(layout.pts.filter(function (p, i) { return !!visBox.flags[i]; }));
|
|
1004
|
+
const fadeMs = domain.fadeMs;
|
|
951
1005
|
function render(phase) {
|
|
952
1006
|
const c2d = canvasEl.getContext("2d");
|
|
953
1007
|
if (!c2d) return;
|
|
@@ -983,7 +1037,7 @@ const StarmapRuntime = (function (require, _react) {
|
|
|
983
1037
|
const birth = Math.max(a.star.mtimeMs || 0, b.star.mtimeMs || 0);
|
|
984
1038
|
let lrv = 1;
|
|
985
1039
|
if (rt !== null) {
|
|
986
|
-
const lt = Math.max(0, Math.min(1, (rt - birth) /
|
|
1040
|
+
const lt = Math.max(0, Math.min(1, (rt - birth) / fadeMs));
|
|
987
1041
|
lrv = lt * lt * (3 - 2 * lt);
|
|
988
1042
|
if (lrv <= 0) continue;
|
|
989
1043
|
}
|
|
@@ -1000,7 +1054,7 @@ const StarmapRuntime = (function (require, _react) {
|
|
|
1000
1054
|
const meta = KIND_META[p.star.kind] || KIND_META.special;
|
|
1001
1055
|
let rv = 1;
|
|
1002
1056
|
if (rt !== null && p.star.mtimeMs > 0) {
|
|
1003
|
-
const st = Math.max(0, Math.min(1, (rt - p.star.mtimeMs) /
|
|
1057
|
+
const st = Math.max(0, Math.min(1, (rt - p.star.mtimeMs) / fadeMs));
|
|
1004
1058
|
rv = st * st * (3 - 2 * st);
|
|
1005
1059
|
if (rv <= 0) continue;
|
|
1006
1060
|
}
|
|
@@ -2623,6 +2677,8 @@ const StarmapRuntime = (function (require, _react) {
|
|
|
2623
2677
|
".smem-num:focus{border-color:var(--dsw-alias-brand-primary,#4d76e6);}",
|
|
2624
2678
|
".smem-status{font-size:12px;color:var(--dsw-alias-label-secondary);}",
|
|
2625
2679
|
".smem-autodream-note{font-size:11.5px;color:var(--dsw-alias-label-secondary);line-height:1.5;}",
|
|
2680
|
+
// 2.7.1(Q04):上限设置的诊断清单 —— 逐条列宿主的原话,缩进浅一点、行距紧一点。
|
|
2681
|
+
".smem-diag-list{margin:4px 0 4px 16px;padding:0;font-size:11.5px;line-height:1.6;color:var(--dsw-alias-label-secondary);}",
|
|
2626
2682
|
".smem-autodream-list{display:flex;flex-direction:column;gap:6px;}",
|
|
2627
2683
|
".smem-report{border:1px solid var(--dsw-alias-border-l1);border-radius:8px;padding:6px 9px;font-size:12px;cursor:pointer;background:transparent;color:inherit;text-align:left;font-family:inherit;}",
|
|
2628
2684
|
".smem-report:hover{border-color:var(--dsw-alias-border-l2);}",
|
|
@@ -3916,6 +3972,15 @@ h("span", { key: "sep", className: "smem-actions-sep", "aria-hidden": "true" }),
|
|
|
3916
3972
|
? h("div", { className: "smem-empty", key: "empty" },
|
|
3917
3973
|
"按当前阈值没有可归档的 —— 要么闲置天数还没到该类型的阈值,要么台账里还没有访问记录。")
|
|
3918
3974
|
: h("div", { className: "smem-cand-list", key: "list" }, [
|
|
3975
|
+
// 2.7.1(Q05 尾巴):锁表读不出来时**不许装作「都没锁」**。
|
|
3976
|
+
// 宿主 2.1.12 起就在 archiveCandidates 的结果里带 lockedUnknown / lockedError,
|
|
3977
|
+
// 但那两个字段一直只在日志里 —— 面板照样把整张清单画成「全部未锁定」。
|
|
3978
|
+
// 这里如实标出来:自动归档会直接拒绝,手动归档要不要继续由人自己判断。
|
|
3979
|
+
c.lockedUnknown === true
|
|
3980
|
+
? h("div", { className: "smem-cand-note smem-ad-warn", key: "lockunknown", role: "status" },
|
|
3981
|
+
"⚠ 锁表读不出来" + (c.lockedError ? "(" + String(c.lockedError) + ")" : "") +
|
|
3982
|
+
":下面每一条的锁定状态都是「未知」(不是「都没锁」)。自动归档会直接拒绝执行;手动归档前请自己确认。")
|
|
3983
|
+
: null,
|
|
3919
3984
|
h("div", { className: "smem-cand-note", key: "note" },
|
|
3920
3985
|
"候选只按「多久没被注入过」算。归档 = 移进 archive/(不删),随时可以恢复。"),
|
|
3921
3986
|
offNow
|
|
@@ -4404,6 +4469,8 @@ h("span", { key: "sep", className: "smem-actions-sep", "aria-hidden": "true" }),
|
|
|
4404
4469
|
"ad.limits.pending": "有改动待生效",
|
|
4405
4470
|
"ad.limits.restartWarn": "⚠ 这些值在 DSH 启动时就固化了 —— 要重启 DSH 才生效。下面每行都写清「当前 → 重启后」。",
|
|
4406
4471
|
"ad.limits.restartNote": "这些值在 DSH 启动时固化:保存后要重启 DSH 才生效 —— 所以每行都会标出「当前生效」与「重启后」。",
|
|
4472
|
+
"ad.limits.diagTitle": "⚠ 上限设置里有 {count} 条问题(本次仍按环境变量 / 默认值生效)",
|
|
4473
|
+
"ad.limits.diagNote": "下面是宿主的原话。改好面板里的值只能修一部分 —— 环境变量与 settings.json 里的坏值也要一并清掉。",
|
|
4407
4474
|
"ad.limit.maxResults": "一次注入条数",
|
|
4408
4475
|
"ad.limit.maxChars": "单条字符上限",
|
|
4409
4476
|
"ad.limit.maxBaseline": "baseline 名额",
|
|
@@ -4909,6 +4976,8 @@ h("span", { key: "sep", className: "smem-actions-sep", "aria-hidden": "true" }),
|
|
|
4909
4976
|
"ad.limits.pending": "changes pending",
|
|
4910
4977
|
"ad.limits.restartWarn": "⚠ These values are fixed at DSH startup — restart DSH for them to apply. Each row below shows “current → after restart”.",
|
|
4911
4978
|
"ad.limits.restartNote": "These values are fixed at DSH startup: saving requires a DSH restart to take effect — so each row shows both “currently effective” and “after restart”.",
|
|
4979
|
+
"ad.limits.diagTitle": "⚠ {count} problem(s) with these limits (environment variables / defaults are in effect)",
|
|
4980
|
+
"ad.limits.diagNote": "The lines below are the host's own words. Fixing the values in this panel only covers part of it — bad values in environment variables and settings.json must be cleared too.",
|
|
4912
4981
|
"ad.limit.maxResults": "Memories per injection",
|
|
4913
4982
|
"ad.limit.maxChars": "Characters per memory",
|
|
4914
4983
|
"ad.limit.maxBaseline": "baseline slots",
|
|
@@ -5513,6 +5582,10 @@ h("span", { key: "sep", className: "smem-actions-sep", "aria-hidden": "true" }),
|
|
|
5513
5582
|
const fixedReserved = ((memSet && memSet.reserved) || []).filter(function (n) {
|
|
5514
5583
|
return extraLower.indexOf(String(n).toLowerCase()) < 0;
|
|
5515
5584
|
});
|
|
5585
|
+
// 2.7.1(Q04 尾巴):宿主从 2.1.11 起就在 getSettings 里带 `limitDiagnostics`
|
|
5586
|
+
// —— 坏 JSON / 逐项越界 / 环境变量写错都在这份数组里。以前它只进日志,
|
|
5587
|
+
// 面板上看不见,于是「我改的值怎么没生效」只能靠猜。现在就地摊开逐条列。
|
|
5588
|
+
const limitDiag = Array.isArray(memSet && memSet.limitDiagnostics) ? memSet.limitDiagnostics : [];
|
|
5516
5589
|
// 入口模式:新字段优先,旧 sidebarEntry 兜底;坏值 / 旧宿主一律按「两个都显示」。
|
|
5517
5590
|
// 存了 sidebar 但当前宿主不支持侧栏时,界面按 settings 显示并给一条降级提示。
|
|
5518
5591
|
const entryModeValue = entryModeFromSettings(memSet);
|
|
@@ -5996,6 +6069,17 @@ h("span", { key: "sep", className: "smem-actions-sep", "aria-hidden": "true" }),
|
|
|
5996
6069
|
memSet && memSet.restartRequired
|
|
5997
6070
|
? h("div", { className: "smem-autodream-note smem-ad-warn", key: "rw" }, t("ad.limits.restartWarn"))
|
|
5998
6071
|
: h("div", { className: "smem-autodream-note", key: "rn" }, t("ad.limits.restartNote")),
|
|
6072
|
+
// 2.7.1(Q04):诊断逐条列出来。文案不猜原因 —— 数组里每一条都是宿主的原话
|
|
6073
|
+
// (「读 settings.json 失败(ENOENT)」「maxResults 必须是 1..20 的整数」…)。
|
|
6074
|
+
limitDiag.length
|
|
6075
|
+
? h("div", { className: "smem-autodream-note smem-ad-warn", key: "diag", role: "status" }, [
|
|
6076
|
+
h("div", { key: "t", style: { fontWeight: "600" } }, t("ad.limits.diagTitle", { count: limitDiag.length })),
|
|
6077
|
+
h("ul", { key: "ul", className: "smem-diag-list" }, limitDiag.map(function (d, i) {
|
|
6078
|
+
return h("li", { key: "diag-" + i }, String(d));
|
|
6079
|
+
})),
|
|
6080
|
+
h("div", { key: "n", className: "smem-status" }, t("ad.limits.diagNote")),
|
|
6081
|
+
])
|
|
6082
|
+
: null,
|
|
5999
6083
|
// 五个参数排两列(一行两个):同样的信息,行数少一半,扫读反而更清楚。
|
|
6000
6084
|
h("div", { className: "smem-ad-grid2", key: "grid" }, LIMIT_FIELDS.map(function (f) {
|
|
6001
6085
|
const cur = memSet && memSet.limits ? memSet.limits[f.key] : null;
|
package/package.json
CHANGED