@senguoyun/dsh-arkme 0.1.71 → 0.1.73

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.
@@ -0,0 +1,38 @@
1
+ # DSH 嵌入右侧栏边界修复
2
+
3
+ ## 原因与范围
4
+
5
+ Arkme 将原生 DSH iframe 保持为整个浏览器大小,以便任务菜单越过对话区域显示;实际对话通过 AppFrame 定位和 iframe clip-path 限定在第三栏。
6
+
7
+ 原生右侧栏在 AppFrame 宽度小于 768px 时切到 `position: fixed; inset: 0; width: 100%` 的全屏模式,其定位仍相对于整个 iframe。1100px 窗口中第三栏从 x=344 开始、宽 756px,原生面板却从 x=0 开始、宽 1100px。文件列表因此被外层裁掉,造成空白、会话消失的观感;会话实际没有卸载。
8
+
9
+ 本次只在嵌入适配器内限制原生 fullscreen 面板的边界:横向与第三栏一致,纵向位于当前任务标题下方。标题变化通过尺寸观察同步,不写死高度。宽屏 push 并排布局不变,不替换上游面板、消息、输入框或状态存储。
10
+
11
+ ## 验证
12
+
13
+ - 类型检查、构建及本地打包通过。
14
+ - 9 个相关测试文件,78 项通过,覆盖嵌入区域、原生任务下拉、标题、菜单、拖拽与前一轮添加菜单。
15
+ - 独立 Web 预览 3098 安装包与本地 client.js SHA256 一致:`96f62c9b5c8920c554cca275608701cf5ed9c44cee389fdd5289754c36227397`。
16
+ - Chromium 浏览器验证:1440px 为并排面板;1100、900、720px 为第三栏内展开。标题与文件列表可见,开关后保持同一会话、输入组件和任务标题,无页面异常。
17
+ - 面板打开期间,1440 → 1100 → 720 → 420 → 1440 缩放通过,任务下拉仍能打开。
18
+ - 经用户确认继续修复后,420、500、575px 均通过:顶部名称、任务选择及工具按钮不越界,侧栏完整约束在第三栏且可关闭。打开按钮不再触发外层横向滚动;标题与会话输入组件保持原位和身份。
19
+ - 420px 和 1440px 的原生「更多操作」菜单均可打开、位于窗口边界内,Escape 可关闭。所有宽度无 pageerror。
20
+ - 已人工检查 1440、1100、720、420px 截图。未发送消息、创建会话、执行文件操作或调用通话。
21
+
22
+ ## 极窄窗口补充修复(已确认并完成)
23
+
24
+ 420px 窗口下第三栏仅 236px。打开面板前 header.scrollWidth 为 276px,外层会话容器 scrollWidth 为 501px;点击右侧按钮后该容器 scrollLeft 变为 144px,导致顶部标题离开可见区域。此问题与 fullscreen 面板坐标越界不同。
25
+
26
+ 用户确认后,仅在标题内容区域宽度不超过 360px 时将工具按钮另排一行;上方保留对话名与当前任务。使用标题自身的容器查询而非窗口媒体查询,适配左侧目录和侧栏对实际宽度的影响。原生 React 节点和事件绑定不移动、不重建,常规桌面布局不变。
27
+
28
+ 420px 复测中标题保持 x=184,外层 scrollLeft=0;标题高度由 73px 自适应为 109px,侧栏自动从 y=109 开始,不遮盖工具栏。放大回 1440px 后恢复 73px 单行布局。
29
+
30
+ 补充修复预览包:`senguoyun-dsh-arkme-0.1.70-narrow-header-20260921-0204.tgz`。本地与已安装 `harness-session-client.js` SHA256 一致:`0283b1954813f74e199d47c7552bc7a49f04520e03f96a0da96e29502727231e`。
31
+
32
+ ## 交付边界
33
+
34
+ 仅更新独立 3098 预览;未修改已安装的 Arkme 客户端、未发布 npm。Git 提交推送单独执行,不代表已合并或发布。上一轮添加菜单修复保留。旧版安装包和预览回滚包保留。
35
+
36
+ 提交前补充回归:12 个相关测试文件、95 项通过,包含对话/联系人工具栏尺寸和添加菜单 portal;`git diff --check` 通过。
37
+
38
+ 浏览器脚本与截图位于本机 `.codex-artifacts/web-preview-3098/`:`check-dsh-rightbar.mjs`、`dsh-rightbar-fixed-{width}.png`。
@@ -0,0 +1,40 @@
1
+ # 对话与联系人添加按钮回归(2026-09-21)
2
+
3
+ ## 已确认的交互
4
+
5
+ - 第二栏添加按钮与搜索框同高,使用 40×40px 方形按钮、11px 圆角及原有主题色。
6
+ - 悬浮立即展开,按钮与菜单之间可连续移动;短暂移出后 250ms 内返回取消关闭。
7
+ - 选择菜单项、点击外部、Escape 仍直接关闭;保留键盘与触摸入口。
8
+ - 联系人和对话入口统一使用同一个组件,不新增另一套菜单。
9
+
10
+ ## 根因与修改
11
+
12
+ - 旧添加按钮为 28×28px,搜索框为 40px 高。3098 修改前实测分别为 28px、40px。
13
+ - 原 hover 区域只覆盖左右菜单间隙;下拉菜单实际在按钮下方 4px,该间隙不属于有效区域。修改前浏览器鼠标移入间隙立即关闭。
14
+ - 添加按钮直接引用 `directorySearchLayout.field` 的高度和圆角,图标从 14px 放大到 20px。
15
+ - 补齐上、下方向的短距离菜单过渡区域;仅添加菜单启用 250ms 离开缓冲,其他菜单原有关闭时序不变。
16
+ - 返回按钮、菜单或过渡区取消定时关闭;连续向外移动不重置倒计时;关闭或卸载取消旧定时器,避免影响下一次展开。
17
+ - `ArkmePersistentShell` 联系人入口和 `ArkmeVirtualWorkspace` 对话入口均复用 `ArkmeQuickAddButton`,本次修改同时生效。
18
+
19
+ ## 验证
20
+
21
+ - 20 个相关测试文件、186 项测试通过;包含四方向过渡区域、停留间隙、移出再返回、菜单重开、外部点击、Esc、触摸、键盘、联系人真实工具栏尺寸及原有菜单交互。
22
+ - 类型检查、完整构建和打包通过。
23
+ - 独立 3098 页面:对话与联系人各在 1440、900、420px 宽度下验证。两个入口按钮均为 40×40px,与搜索框同高且顶部对齐。
24
+ - 浏览器实际鼠标验证:停留 4px 间隙、斜向进入菜单、短暂移出后返回、离开主页面菜单区域关闭;键盘 Enter/方向键/Escape、外部点击关闭均通过,未出现页面异常。
25
+ - 浏览器验证未创建联系人、群聊、Bot、任务或真实通话;相关业务写请求被拦截,选项动作由组件测试验证。
26
+
27
+ 预览脚本:`/Users/tison/arkme/.codex-artifacts/web-preview-3098/check-quick-add-hover.mjs`。
28
+
29
+ 仅更新独立 3098 Web 预览,未修改已安装 Arkme 客户端。Git 提交推送单独执行,不代表已合并或发布。
30
+
31
+ ## 第二轮:500ms 缓冲与点击固定
32
+
33
+ - 用户反馈对话入口仍不易从按钮移入菜单。旧版 3098 的真实鼠标测试确认:越出菜单停留 350ms 已关闭。
34
+ - 添加菜单离开缓冲改为 500ms;进入按钮、菜单或过渡间隙取消关闭。鼠标离开文档与窗口失焦也遵循缓冲,避免绕过定时器立即收起。
35
+ - 悬浮与点击使用独立状态。点击(包括触摸和键盘激活)固定展开,取消原有倒计时;随后鼠标移开、再次经过按钮均不关闭或退回悬浮模式。
36
+ - 点击外部、选择菜单操作或 Escape 关闭并重置状态,下次单纯悬浮仍按 500ms 规则收起。外部点击覆盖嵌入页面及阻止冒泡的元素。
37
+ - 对话和联系人复用相同入口。其他悬浮菜单未配置延时时仍保持原有立即关闭行为。
38
+ - 定向回归 11 个测试文件、67 项通过;类型检查、通话资源校验和构建通过。
39
+ - 更新独立 3098 后,Chromium 对话及联系人入口在 1440、900、420px 均通过:跨按钮下方间隙、斜向移入、越出 350ms 再返回、点击固定后移开 800ms、重新经过按钮、菜单项可达、外部点击及键盘关闭;无 pageerror。
40
+ - 预览安装包为 `senguoyun-dsh-arkme-0.1.72.tgz`;本地与预览安装目录的 `client.js` SHA256 相同:`a41546e5126b39389f4f509ec22abdd5651b1266445e898aa2abd1d4f2408052`。旧预览包已备份为 `backups/quick-add-before-20260921-0345.tgz`。
@@ -1830,6 +1830,19 @@ Arkme 用户 {v0}|Arkme user {v0}
1830
1830
  top,
1831
1831
  bottom
1832
1832
  });
1833
+ const left = Math.max(anchor.left, menu.left), right = Math.min(anchor.right, menu.right);
1834
+ if (anchor.bottom <= menu.top && menu.top - anchor.bottom <= 24) return contains({
1835
+ left,
1836
+ right,
1837
+ top: anchor.bottom,
1838
+ bottom: menu.top
1839
+ });
1840
+ if (menu.bottom <= anchor.top && anchor.top - menu.bottom <= 24) return contains({
1841
+ left,
1842
+ right,
1843
+ top: menu.bottom,
1844
+ bottom: anchor.top
1845
+ });
1833
1846
  return false;
1834
1847
  }
1835
1848
  //#endregion
@@ -2072,14 +2085,36 @@ Arkme 用户 {v0}|Arkme user {v0}
2072
2085
  const anchor = props.hoverAnchor;
2073
2086
  if (!open || !anchor || typeof document === "undefined") return;
2074
2087
  const doc = anchor.ownerDocument;
2075
- const close = () => closeRef.current();
2088
+ let pending;
2089
+ const cancel = () => {
2090
+ if (pending !== void 0) {
2091
+ clearTimeout(pending);
2092
+ pending = void 0;
2093
+ }
2094
+ };
2095
+ const close = () => {
2096
+ cancel();
2097
+ closeRef.current();
2098
+ };
2099
+ const scheduleClose = () => {
2100
+ if (!props.hoverCloseDelayMs) {
2101
+ close();
2102
+ return;
2103
+ }
2104
+ if (pending === void 0) pending = setTimeout(close, props.hoverCloseDelayMs);
2105
+ };
2076
2106
  const move = (event) => {
2077
2107
  if (event.pointerType === "touch") return;
2108
+ if (!anchor.isConnected) {
2109
+ close();
2110
+ return;
2111
+ }
2078
2112
  const list = menu.current;
2079
- if (!anchor.isConnected || list && !inMenuHoverRegion(event.clientX, event.clientY, anchor.getBoundingClientRect(), list.getBoundingClientRect())) close();
2113
+ if (!list || inMenuHoverRegion(event.clientX, event.clientY, anchor.getBoundingClientRect(), list.getBoundingClientRect())) cancel();
2114
+ else scheduleClose();
2080
2115
  };
2081
2116
  const leave = (event) => {
2082
- if (event.relatedTarget === null) close();
2117
+ if (event.relatedTarget === null) scheduleClose();
2083
2118
  };
2084
2119
  const observer = new MutationObserver(() => {
2085
2120
  if (!anchor.isConnected) close();
@@ -2089,15 +2124,22 @@ Arkme 用户 {v0}|Arkme user {v0}
2089
2124
  subtree: true
2090
2125
  });
2091
2126
  doc.addEventListener("pointermove", move, true);
2127
+ doc.addEventListener("pointerover", move, true);
2092
2128
  doc.addEventListener("pointerout", leave, true);
2093
- doc.defaultView?.addEventListener("blur", close);
2129
+ doc.defaultView?.addEventListener("blur", scheduleClose);
2094
2130
  return () => {
2131
+ cancel();
2095
2132
  observer.disconnect();
2096
2133
  doc.removeEventListener("pointermove", move, true);
2134
+ doc.removeEventListener("pointerover", move, true);
2097
2135
  doc.removeEventListener("pointerout", leave, true);
2098
- doc.defaultView?.removeEventListener("blur", close);
2136
+ doc.defaultView?.removeEventListener("blur", scheduleClose);
2099
2137
  };
2100
- }, [open, props.hoverAnchor]);
2138
+ }, [
2139
+ open,
2140
+ props.hoverAnchor,
2141
+ props.hoverCloseDelayMs
2142
+ ]);
2101
2143
  const actions = props.actions.filter((action) => !!action);
2102
2144
  const items = actions.map((action) => "type" in action ? action : {
2103
2145
  id: action.id,
package/lib/client.js CHANGED
@@ -110527,6 +110527,19 @@ Please report this to https://github.com/markedjs/marked.`, e) {
110527
110527
  top,
110528
110528
  bottom
110529
110529
  });
110530
+ const left = Math.max(anchor.left, menu.left), right = Math.min(anchor.right, menu.right);
110531
+ if (anchor.bottom <= menu.top && menu.top - anchor.bottom <= 24) return contains({
110532
+ left,
110533
+ right,
110534
+ top: anchor.bottom,
110535
+ bottom: menu.top
110536
+ });
110537
+ if (menu.bottom <= anchor.top && anchor.top - menu.bottom <= 24) return contains({
110538
+ left,
110539
+ right,
110540
+ top: menu.bottom,
110541
+ bottom: anchor.top
110542
+ });
110530
110543
  return false;
110531
110544
  }
110532
110545
  //#endregion
@@ -110794,14 +110807,36 @@ Please report this to https://github.com/markedjs/marked.`, e) {
110794
110807
  const anchor = props.hoverAnchor;
110795
110808
  if (!open || !anchor || typeof document === "undefined") return;
110796
110809
  const doc = anchor.ownerDocument;
110797
- const close = () => closeRef.current();
110810
+ let pending;
110811
+ const cancel = () => {
110812
+ if (pending !== void 0) {
110813
+ clearTimeout(pending);
110814
+ pending = void 0;
110815
+ }
110816
+ };
110817
+ const close = () => {
110818
+ cancel();
110819
+ closeRef.current();
110820
+ };
110821
+ const scheduleClose = () => {
110822
+ if (!props.hoverCloseDelayMs) {
110823
+ close();
110824
+ return;
110825
+ }
110826
+ if (pending === void 0) pending = setTimeout(close, props.hoverCloseDelayMs);
110827
+ };
110798
110828
  const move = (event) => {
110799
110829
  if (event.pointerType === "touch") return;
110830
+ if (!anchor.isConnected) {
110831
+ close();
110832
+ return;
110833
+ }
110800
110834
  const list = menu.current;
110801
- if (!anchor.isConnected || list && !inMenuHoverRegion(event.clientX, event.clientY, anchor.getBoundingClientRect(), list.getBoundingClientRect())) close();
110835
+ if (!list || inMenuHoverRegion(event.clientX, event.clientY, anchor.getBoundingClientRect(), list.getBoundingClientRect())) cancel();
110836
+ else scheduleClose();
110802
110837
  };
110803
110838
  const leave = (event) => {
110804
- if (event.relatedTarget === null) close();
110839
+ if (event.relatedTarget === null) scheduleClose();
110805
110840
  };
110806
110841
  const observer = new MutationObserver(() => {
110807
110842
  if (!anchor.isConnected) close();
@@ -110811,15 +110846,22 @@ Please report this to https://github.com/markedjs/marked.`, e) {
110811
110846
  subtree: true
110812
110847
  });
110813
110848
  doc.addEventListener("pointermove", move, true);
110849
+ doc.addEventListener("pointerover", move, true);
110814
110850
  doc.addEventListener("pointerout", leave, true);
110815
- doc.defaultView?.addEventListener("blur", close);
110851
+ doc.defaultView?.addEventListener("blur", scheduleClose);
110816
110852
  return () => {
110853
+ cancel();
110817
110854
  observer.disconnect();
110818
110855
  doc.removeEventListener("pointermove", move, true);
110856
+ doc.removeEventListener("pointerover", move, true);
110819
110857
  doc.removeEventListener("pointerout", leave, true);
110820
- doc.defaultView?.removeEventListener("blur", close);
110858
+ doc.defaultView?.removeEventListener("blur", scheduleClose);
110821
110859
  };
110822
- }, [open, props.hoverAnchor]);
110860
+ }, [
110861
+ open,
110862
+ props.hoverAnchor,
110863
+ props.hoverCloseDelayMs
110864
+ ]);
110823
110865
  const actions = props.actions.filter((action) => !!action);
110824
110866
  const items = actions.map((action) => "type" in action ? action : {
110825
110867
  id: action.id,
@@ -139762,6 +139804,7 @@ body:has([data-arkme-self-topic-menu]) > [role="menu"] { z-index: 10030; }
139762
139804
  let nativeObserver;
139763
139805
  let viewportStyle;
139764
139806
  let contentFrame;
139807
+ let sessionHeader;
139765
139808
  let scheduled = 0;
139766
139809
  let disposed = false;
139767
139810
  const shadow = surface.ownerDocument.createElement("div");
@@ -139798,6 +139841,16 @@ body:has([data-arkme-self-topic-menu]) > [role="menu"] { z-index: 10030; }
139798
139841
  contentFrame = nextContent;
139799
139842
  contentFrame?.setAttribute("data-arkme-harness-content-frame", "");
139800
139843
  }
139844
+ const nextHeader = contentFrame?.querySelector("[data-slot=\"conversation.session.header\"] > header") ?? void 0;
139845
+ if (nextHeader !== sessionHeader) {
139846
+ if (sessionHeader) resize?.unobserve(sessionHeader);
139847
+ sessionHeader = nextHeader;
139848
+ if (sessionHeader) resize?.observe(sessionHeader);
139849
+ }
139850
+ const headerBottom = sessionHeader?.getAttribute("aria-hidden") !== "true" ? sessionHeader?.getBoundingClientRect().bottom ?? rect.top : rect.top;
139851
+ const panelTop = Math.min(rect.bottom, Math.max(rect.top, headerBottom));
139852
+ set(viewport, "--arkme-harness-panel-top", `${panelTop}px`);
139853
+ set(viewport, "--arkme-harness-panel-height", `${Math.max(0, rect.bottom - panelTop)}px`);
139801
139854
  const ready = contentFrame !== void 0;
139802
139855
  const layers = ready ? harnessMenuLayers(native) : [];
139803
139856
  let menuRect;
@@ -139850,6 +139903,8 @@ body:has([data-arkme-self-topic-menu]) > [role="menu"] { z-index: 10030; }
139850
139903
  viewportStyle?.remove();
139851
139904
  contentFrame?.removeAttribute("data-arkme-harness-content-frame");
139852
139905
  contentFrame = void 0;
139906
+ if (sessionHeader) resize?.unobserve(sessionHeader);
139907
+ sessionHeader = void 0;
139853
139908
  native?.documentElement.removeAttribute("data-arkme-harness-viewport");
139854
139909
  try {
139855
139910
  native = frame.contentDocument ?? void 0;
@@ -139865,6 +139920,12 @@ body:has([data-arkme-self-topic-menu]) > [role="menu"] { z-index: 10030; }
139865
139920
  position: absolute !important; left: var(--arkme-harness-content-left); top: var(--arkme-harness-content-top);
139866
139921
  width: var(--arkme-harness-content-width); height: var(--arkme-harness-content-height);
139867
139922
  }
139923
+ [data-arkme-harness-content-frame] [data-sidebar-right-panel="fullscreen"] {
139924
+ left: var(--arkme-harness-content-left) !important; right: auto !important;
139925
+ top: var(--arkme-harness-panel-top) !important; bottom: auto !important;
139926
+ width: var(--arkme-harness-content-width) !important;
139927
+ height: var(--arkme-harness-panel-height) !important;
139928
+ }
139868
139929
  `;
139869
139930
  native.head.append(viewportStyle);
139870
139931
  nativeObserver = new win.MutationObserver(schedule);
@@ -139876,6 +139937,7 @@ body:has([data-arkme-self-topic-menu]) > [role="menu"] { z-index: 10030; }
139876
139937
  "style",
139877
139938
  "class",
139878
139939
  "hidden",
139940
+ "aria-hidden",
139879
139941
  "data-arkme-session-open",
139880
139942
  "data-arkme-session-frame"
139881
139943
  ]
@@ -139919,6 +139981,7 @@ body:has([data-arkme-self-topic-menu]) > [role="menu"] { z-index: 10030; }
139919
139981
  "width",
139920
139982
  "height"
139921
139983
  ]) native?.documentElement.style.removeProperty(`--arkme-harness-content-${key}`);
139984
+ for (const key of ["top", "height"]) native?.documentElement.style.removeProperty(`--arkme-harness-panel-${key}`);
139922
139985
  };
139923
139986
  }
139924
139987
  //#endregion
@@ -152923,14 +152986,15 @@ html body {
152923
152986
  flex: "none"
152924
152987
  },
152925
152988
  trigger: {
152926
- width: 28,
152927
- height: 28,
152989
+ width: directorySearchLayout.field.height,
152990
+ height: directorySearchLayout.field.height,
152928
152991
  flex: "none",
152929
152992
  padding: 0,
152930
152993
  display: "grid",
152931
152994
  placeItems: "center",
152995
+ boxSizing: "border-box",
152932
152996
  border: 0,
152933
- borderRadius: 999,
152997
+ borderRadius: directorySearchLayout.field.borderRadius,
152934
152998
  backgroundColor: "var(--dsw-specific-selector, transparent)",
152935
152999
  color: "var(--dsw-alias-label-primary)",
152936
153000
  cursor: "pointer",
@@ -153073,6 +153137,7 @@ html body {
153073
153137
  anchor,
153074
153138
  align: "end",
153075
153139
  onClose,
153140
+ hoverCloseDelayMs: 500,
153076
153141
  ...getAnchorRect === void 0 ? {} : { getAnchorRect },
153077
153142
  ...hoverAnchor === void 0 ? {} : { hoverAnchor },
153078
153143
  actions: [
@@ -153121,7 +153186,9 @@ html body {
153121
153186
  }
153122
153187
  function ArkmeQuickAddButton({ onContactAdd, onSourceCreated, onBotCreated, onNewDshSession, notificationActivationRevision = 0, onBlockingOverlayChange }) {
153123
153188
  useArkmeLocale();
153124
- const [menuOpen, setMenuOpen] = (0, react$1.useState)(false);
153189
+ const [menuMode, setMenuMode] = (0, react$1.useState)();
153190
+ const menuOpen = menuMode !== void 0;
153191
+ const closeMenu = () => setMenuMode(void 0);
153125
153192
  const [menuError, setMenuError] = (0, react$1.useState)("");
153126
153193
  const [dialogKind, setDialogKind] = (0, react$1.useState)();
153127
153194
  const [dialogBusy, setDialogBusy] = (0, react$1.useState)(false);
@@ -153144,7 +153211,7 @@ html body {
153144
153211
  if (notificationRevisionRef.current === notificationActivationRevision) return;
153145
153212
  notificationRevisionRef.current = notificationActivationRevision;
153146
153213
  pendingNotificationDismissRef.current = true;
153147
- setMenuOpen(false);
153214
+ closeMenu();
153148
153215
  if (!dialogBusy) {
153149
153216
  pendingNotificationDismissRef.current = false;
153150
153217
  setDialogKind(void 0);
@@ -153156,18 +153223,18 @@ html body {
153156
153223
  setDialogKind(void 0);
153157
153224
  }, [dialogBusy]);
153158
153225
  const chooseDialog = (kind) => {
153159
- setMenuOpen(false);
153226
+ closeMenu();
153160
153227
  setDialogBusy(false);
153161
153228
  setDialogKind(kind);
153162
153229
  };
153163
153230
  const openMenu = () => {
153164
153231
  setMenuError("");
153165
- setMenuOpen(true);
153232
+ setMenuMode((current) => current ?? "hover");
153166
153233
  };
153167
153234
  const menu = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ArkmeQuickAddMenu, {
153168
153235
  open: menuOpen,
153169
- onClose: () => setMenuOpen(false),
153170
- hoverAnchor: triggerRef.current ?? void 0,
153236
+ onClose: closeMenu,
153237
+ hoverAnchor: menuMode === "hover" ? triggerRef.current ?? void 0 : void 0,
153171
153238
  anchor: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
153172
153239
  "data-arkme-feedback": "neutral",
153173
153240
  ref: triggerRef,
@@ -153180,12 +153247,12 @@ html body {
153180
153247
  onPointerEnter: (event) => {
153181
153248
  if (event?.pointerType !== "touch") openMenu();
153182
153249
  },
153183
- onClick: (event) => {
153184
- if ((event?.detail ?? 0) === 0) setMenuOpen((open) => !open);
153185
- else openMenu();
153250
+ onClick: () => {
153251
+ setMenuError("");
153252
+ setMenuMode("pinned");
153186
153253
  },
153187
153254
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutline16, {
153188
- size: 14,
153255
+ size: 20,
153189
153256
  "aria-hidden": true
153190
153257
  })
153191
153258
  }),
@@ -153194,13 +153261,13 @@ html body {
153194
153261
  try {
153195
153262
  onNewDshSession();
153196
153263
  setMenuError("");
153197
- setMenuOpen(false);
153264
+ closeMenu();
153198
153265
  } catch (error) {
153199
153266
  setMenuError(error instanceof Error ? error.message : "暂时无法新建 DSH 会话,请稍后再试");
153200
153267
  }
153201
153268
  },
153202
153269
  onContactAdd: () => {
153203
- setMenuOpen(false);
153270
+ closeMenu();
153204
153271
  onContactAdd();
153205
153272
  },
153206
153273
  onCreateGroup: () => {
@@ -201350,7 +201417,7 @@ registerProcessor('arkme-pcm-journal', ArkmePcmJournal);
201350
201417
  const c$3 = e$24;
201351
201418
  //#endregion
201352
201419
  //#region package.json
201353
- var version = "0.1.71";
201420
+ var version = "0.1.73";
201354
201421
  //#endregion
201355
201422
  //#region src/client/profile-change-store.ts
201356
201423
  let revision = 0;