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.
Files changed (2) hide show
  1. package/dist/client.js +50 -4
  2. 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("mousedown", onDown);
3524
+ document.addEventListener("pointerdown", onDown);
3481
3525
  document.addEventListener("keydown", onKey);
3482
3526
  return () => {
3483
- document.removeEventListener("mousedown", onDown);
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.10",
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",