# 第二栏快捷新建 DSH 会话

登录后的会话列表「＋」菜单第一项增加「新建 DSH 会话」，沿用菜单原有尺寸、图标线条、分隔线和关闭交互。原有添加联系人、创建群聊、添加 Bot 顺序不变。

在 DSH、私聊、群聊或发给自己页面点击后，触发嵌入 Harness 原生侧栏的新建按钮，然后显示 Harness，关闭菜单并聚焦原生输入框。沿用宿主的工作区继承、空白会话复用和会话创建流程，不另建数据模型，也不向会话发送内容。第二栏名称通过现有官方选择摘要同步。

动作严格限定在登录态、Arkme 持有的同源 Harness iframe。优先使用已经识别的原生新建按钮标记，升级后布局不匹配时回退到原侧栏的中英文语义按钮；按钮缺失或禁用时保留菜单并提示稍后重试，不伪造创建成功。焦点只进入原生 composer，用户另行点击或两秒超时后取消聚焦尝试。

未登录仍沿用原有登录入口；未提供 Harness 入口的其他菜单保留三项。只安装到独立 3082 Web profile，不修改桌面客户端。

## 外部点击收起

原菜单只监听外层 document，DSH iframe 内点击和 Esc 不会冒泡到外层，导致菜单不收起。菜单打开期间额外监听可访问的嵌入文档及其同源子页面，随 iframe 插入、加载、刷新和移除更新绑定；菜单关闭时完整释放。外部点击不阻止默认行为或传播，仍能聚焦原输入框、点击原按钮。Esc 由当前菜单先处理并把焦点还给「＋」，避免触发下层快捷操作。外观不变，未新增遮罩，也不读取或绕过跨域页面。

## 外部点击收起的兜底

2026-09-20 的后续修复：原生 DSH 菜单只在**冒泡阶段**监听 `document` 的 `pointerdown`，因此从点击目标到 `document` 之间只要有任意一层调用了 `stopPropagation()`（自定义滚动条把手、拖拽层、卡片包装层都可能在列），事件就永远到不了 `document`，整个菜单的外部点击收起会被静默禁用，而外观和键盘交互都没有任何异常迹象。

`ArkmeActionMenu` 因此在菜单打开期间额外挂一个**捕获阶段**的 `pointerdown` 监听：捕获阶段先于所有其他处理器运行，无法被下层阻断。为避免和原生路径重复关闭，同一个 `document` 上还挂一个冒泡阶段监听，只要事件正常冒泡到 `document` 就取消捕获阶段排下的兜底，所以正常路径仍然**只关闭一次**（`tests/native-action-menu.test.tsx` 断言的单次契约保持不变）；只有在传播确实被阻断时，兜底才在下一个任务里执行收起。菜单本身和外层锚点的判断沿用原生口径（`rootRef` 与菜单列表都不包含目标才关闭），点击触发按钮仍走原有开合逻辑。

验证：`tests/quick-add-dismissal.test.tsx` 覆盖宿主文档外部点击、同源嵌入文档内点击、以及目标阻断传播三种情况；确认移除捕获监听时阻断用例会失败。类型检查、完整测试与打包通过。

## 悬浮展开与统一控件

2026-09-20 的后续调整：第二栏的「添加」入口此前是点击才展开，曝光率低；同时它自成一个方形按钮并使用文字 `＋` 字形，和会话输入框不是同一套控件。现在改为**鼠标悬浮即展开**，并把它统一成 DSH 会话输入框左下角那颗圆形加号。

交互：指针移入触发按钮即展开，指针离开「触发按钮 + 浮层菜单」这一整块区域才收起，两者之间的窄缝也算同一悬停目标，因此从按钮移向菜单不会误关。触屏不因 `pointerenter` 展开，仍沿用点击；键盘激活（`detail === 0`）继续切换开合，而鼠标点击只会展开、不会把已展开的菜单点掉。外部点击、Esc 与之前的传播兜底收起逻辑不变。

控件：改用官方 primitives 的 `IconPlusOutline16`（`size={14}`）与 28×28 圆形底板，底面色沿用官方 `--dsw-specific-selector`，不再引入第二套图形或文字字形，也不再需要本地覆盖规则。悬停反馈继续走共享的 `[data-arkme-feedback]`，内联样式只用 `backgroundColor` 声明底色——`background` 简写会重置悬停渐变层，这一点在实现中已固化。

验证：`tests/quick-add-menu.test.tsx` 覆盖悬浮展开、触屏不展开、鼠标点击不误关、键盘切换、指针离开后收起，以及原有的三种外部点击收起；`tests/quick-add-ui.test.tsx` 断言新尺寸、圆角与官方加号路径；并确认去掉悬浮处理、去掉触屏判断、改回点击切换或把内联底色改回 `background` 简写时，对应用例都会失败。类型检查、完整测试与打包通过。
