dsh-layered-memory 0.8.10 → 0.8.11
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/client.js +50 -4
- package/package.json +1 -1
package/dist/client.js
CHANGED
|
@@ -417,6 +417,19 @@ var __defProp = Object.defineProperty;
|
|
|
417
417
|
".dsh-mem-pill-off:focus-visible { outline: 2px solid var(--dsh-mem-accent); outline-offset: 1px; }",
|
|
418
418
|
// 流光态焦点环(同一物理按钮的两态焦点反馈对称,配方同 .dsh-mem-btn)
|
|
419
419
|
".dsh-mem-flow:focus-visible { outline: 2px solid var(--dsh-mem-accent); outline-offset: 1px; }",
|
|
420
|
+
// ── 触屏隐形热区(手机端适配):触点目标补足 44px 标准(iOS HIG)。
|
|
421
|
+
// 伪元素不参与布局(浮层/输入栏几何零变化),指针事件落在宿主元素上。
|
|
422
|
+
// 全端统一不做 pointer:coarse 分端(桌面点中目标变大是纯收益)。
|
|
423
|
+
// pill:视觉高 24px,::after 上下各外扩 10px;只上下不左右——左右是宿主输入栏
|
|
424
|
+
// 邻位控件(模式选择器),外扩制造误触重叠带。
|
|
425
|
+
// 滑轨:视觉轨 22px,::before 上下各外扩 11px;touch-action:none 已随轨声明,
|
|
426
|
+
// 伪元素区的触摸同样命中轨元素。两处 px 值改须与注释口径同步 ──
|
|
427
|
+
".dsh-mem-pill-hit::after {",
|
|
428
|
+
" content: ''; position: absolute; left: 0; right: 0; top: -10px; bottom: -10px;",
|
|
429
|
+
"}",
|
|
430
|
+
".dsh-mem-hitband::before {",
|
|
431
|
+
" content: ''; position: absolute; left: 0; right: 0; top: -11px; bottom: -11px;",
|
|
432
|
+
"}",
|
|
420
433
|
// ── 浮层(dsh 原生菜单同配方:不透明实底 + inverted 描边(浅色不可见)+ lv3 阴影) ──
|
|
421
434
|
".dsh-mem-popover {",
|
|
422
435
|
" border-radius: 12px;",
|
|
@@ -3272,6 +3285,35 @@ var __defProp = Object.defineProperty;
|
|
|
3272
3285
|
themeObs.disconnect();
|
|
3273
3286
|
};
|
|
3274
3287
|
}, []);
|
|
3288
|
+
const popRef = (0, import_react16.useRef)(null);
|
|
3289
|
+
const shiftRef = (0, import_react16.useRef)(0);
|
|
3290
|
+
const [shiftX, setShiftX] = (0, import_react16.useState)(0);
|
|
3291
|
+
(0, import_react16.useLayoutEffect)(() => {
|
|
3292
|
+
const clamp = () => {
|
|
3293
|
+
const el = popRef.current;
|
|
3294
|
+
if (!el) return;
|
|
3295
|
+
const r = el.getBoundingClientRect();
|
|
3296
|
+
if (r.width === 0) return;
|
|
3297
|
+
const left = r.left - shiftRef.current;
|
|
3298
|
+
const edge = 8;
|
|
3299
|
+
let next = 0;
|
|
3300
|
+
if (left < edge) next = edge - left;
|
|
3301
|
+
else if (left + r.width > window.innerWidth - edge) {
|
|
3302
|
+
next = window.innerWidth - edge - (left + r.width);
|
|
3303
|
+
}
|
|
3304
|
+
if (next !== shiftRef.current) {
|
|
3305
|
+
shiftRef.current = next;
|
|
3306
|
+
setShiftX(next);
|
|
3307
|
+
}
|
|
3308
|
+
};
|
|
3309
|
+
clamp();
|
|
3310
|
+
window.addEventListener("resize", clamp);
|
|
3311
|
+
const iv = window.setInterval(clamp, 100);
|
|
3312
|
+
return () => {
|
|
3313
|
+
window.removeEventListener("resize", clamp);
|
|
3314
|
+
window.clearInterval(iv);
|
|
3315
|
+
};
|
|
3316
|
+
}, []);
|
|
3275
3317
|
const stops = [];
|
|
3276
3318
|
for (let i = 0; i < MODES.length; i++) {
|
|
3277
3319
|
const stopLeft = i / (MODES.length - 1) * INNER_W + THUMB / 2;
|
|
@@ -3298,11 +3340,12 @@ var __defProp = Object.defineProperty;
|
|
|
3298
3340
|
return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
3299
3341
|
"div",
|
|
3300
3342
|
{
|
|
3343
|
+
ref: popRef,
|
|
3301
3344
|
style: {
|
|
3302
3345
|
position: "absolute",
|
|
3303
3346
|
bottom: "calc(100% + 8px)",
|
|
3304
3347
|
left: "50%",
|
|
3305
|
-
transform: "translateX(-50%)",
|
|
3348
|
+
transform: "translateX(calc(-50% + " + shiftX + "px))",
|
|
3306
3349
|
zIndex: 1e3
|
|
3307
3350
|
},
|
|
3308
3351
|
children: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
|
|
@@ -3315,6 +3358,7 @@ var __defProp = Object.defineProperty;
|
|
|
3315
3358
|
"div",
|
|
3316
3359
|
{
|
|
3317
3360
|
ref: trackRef,
|
|
3361
|
+
className: "dsh-mem-hitband",
|
|
3318
3362
|
style: {
|
|
3319
3363
|
position: "relative",
|
|
3320
3364
|
// 容器宽 = thumb 活动范围(0..INNER_W + THUMB),点击映射与视觉两端严格对齐
|
|
@@ -3477,10 +3521,10 @@ var __defProp = Object.defineProperty;
|
|
|
3477
3521
|
const onKey = (e) => {
|
|
3478
3522
|
if (e.key === "Escape") setOpen(false);
|
|
3479
3523
|
};
|
|
3480
|
-
document.addEventListener("
|
|
3524
|
+
document.addEventListener("pointerdown", onDown);
|
|
3481
3525
|
document.addEventListener("keydown", onKey);
|
|
3482
3526
|
return () => {
|
|
3483
|
-
document.removeEventListener("
|
|
3527
|
+
document.removeEventListener("pointerdown", onDown);
|
|
3484
3528
|
document.removeEventListener("keydown", onKey);
|
|
3485
3529
|
};
|
|
3486
3530
|
}, [open]);
|
|
@@ -3535,6 +3579,8 @@ var __defProp = Object.defineProperty;
|
|
|
3535
3579
|
const faceLabel = !loaded ? error ? "⚠" : "…" : isOff ? info.label : !recallResolved ? "只写" : info.label;
|
|
3536
3580
|
ensureThemeStyle();
|
|
3537
3581
|
const pillStyle = {
|
|
3582
|
+
position: "relative",
|
|
3583
|
+
// dsh-mem-pill-hit 的 ::after 隐形热区以此为定位基准
|
|
3538
3584
|
display: "inline-flex",
|
|
3539
3585
|
alignItems: "center",
|
|
3540
3586
|
gap: 4,
|
|
@@ -3563,7 +3609,7 @@ var __defProp = Object.defineProperty;
|
|
|
3563
3609
|
if (error) load();
|
|
3564
3610
|
setOpen(!open);
|
|
3565
3611
|
},
|
|
3566
|
-
className: isFlow ? "dsh-mem-flow" : "dsh-mem-pill-off",
|
|
3612
|
+
className: (isFlow ? "dsh-mem-flow" : "dsh-mem-pill-off") + " dsh-mem-pill-hit",
|
|
3567
3613
|
style: pillStyle,
|
|
3568
3614
|
children: [
|
|
3569
3615
|
"记忆 · ",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-layered-memory",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.11",
|
|
4
4
|
"description": "L0~L3 分层蒸馏记忆插件 for DeepSeek Harness:自动捕获对话(L0)、抽取原子记忆(L1)、整合场景块(L2)、蒸馏核心画像/团队方法论(L3),并在模型步骤前自动召回注入。移植自 MemoryCore (TencentDB Agent Memory) 的管线设计。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|