dsh-infinite-gen-3
Minglink/dsh-infinite-gen-3DeepSeek 专用破甲插件:以 order 100 追加无条件服从的系统提示词段,提供带校准元数据的 profile 工具,并通过会话投影在输入框上方显示实时破甲状态徽标。
在 DeepSeek Harness 的会话界面里放一张属于当前工作区的分段便签浮窗:一行一个问题、一段一个卡片,回车就能拆出下一段;需要时把某一段、或选中后的多段一起插入 / 替换 / 发送到对话框。除了文字,也可以直接粘贴或选择图片,输入框里会用缩略芯片显示并可点击预览。0.4 起支持选中、拖拽排序、合并多段;0.5 起空标题只在点击后显示输入框,方向键可切换分段,AI 优化只处理选中的分段并支持撤销 / 缓存;0.6 起插入 / 发送按钮 hover 时展开成「当前会话 / 新会话」按钮组,图片可在浮窗内预览,底部快捷键提示点击轮换,复制全部排除归档,发送行为跟随「设置 > 通用设置」的繁忙发送策略;0.7 起分段改为从上到下、旧→新排列,回车拆分的新卡片紧跟原卡片,段首 Backspace 与上一段合并,空分段按 Backspace 或点删除会直接移除,插入 / 发送 / 归档+删除按钮组会稍候再展开以避免快速划过闪烁,文本达到最大高度才出现滚动条,复位快捷键改为 Ctrl/Cmd + Shift + R。0.8 起设置面板新增「记事本」标签页(主题、毛玻璃、字体字号、自动 / 手动保存、撤销步数、提示词预设、按钮组与 hover 阈值、卡片最大高度、默认尺寸);插件提供撤销 / 重做(输入框内仍是浏览器原生撤销);分段可折叠、可批量归档 / 删除 / 复制;AI 在分段内有选中文字时只优化选中部分并在完成后重新选中;归档按最新在上并自动滚动;顶部工作区改为只列出有内容工作区的下拉列表;图片不显示名称,删除按钮移到缩略图右上角。0.9 起撤销 / 重做把输入文字也算进历史,不再吞掉文本;批量删除的按钮悬停变红;移除标题栏复位按钮;工作区下拉只保留存在未归档且非空分段的工作区;AI 预设提示词在只读文本框中展示;设置侧栏换成插件线条图标;主题配色同步作用于设置页;窗口设置可把当前面板位置和尺寸存为默认;AI 优化提高短内容输出预算并在空正文时自动用内置提示词重试一次;工具栏改回单行不换行布局,按钮居右并压在左侧文本之下,溢出时被左侧元素遮盖而不是滚动;Backspace 删除空分段也会播放退出动画;按钮组在鼠标点击后移出会恢复折叠;批量操作时「取消选择」放在按钮栏最左侧;撤销 / 重做按钮移到标题栏「复制全部」左侧,工具栏高度随内容收紧、不再保留滚动条空隙;新会话发送会先打开并通过 live binding 等待可发送状态;AI 优化、撤销 / 重做等程序化改写后会重新测量文本区高度,行数变多也能自动撑开;Backspace 删除最后一条活动分段时保留全部归档。0.10 起在对话框成功发送一条消息时,会把该消息作为一个归档分段自动保存到当前工作区的笔记里,并按内容去重;归档区每条分段都可以折叠 / 展开,自动保存的对话消息默认折叠,手动归档和通过记事本发送按钮归档的分段默认展开。0.11 起撤销 / 重做也记录插入 / 替换输入框(撤销恢复对话框内容、重做再放回,过期的那一步自动作废),发送操作不进入撤销 / 重做,已发送归档的分段不会被历史撤回或重发。0.11.2 起「在新会话中发送」按 workspaceId 建会话,新会话直接归属当前工作区而不是落到侧边栏「未分组」。0.12 起方向键只在分段文本的最开头(↑)/ 最末尾(↓)切换相邻分段,首行 / 末行中间列和长文本软换行都不再误跳;侧边栏工作区角标立即跟随当前笔记的未发送数,保存成功后还会主动唤醒其它会话的角标刷新,15 秒轮询只作为外部改动的兜底。
A per-workspace floating segmented notepad for DeepSeek Harness sessions. Cards run oldest-to-newest; Enter splits after the source card and Backspace at the start merges into the previous card, while empty cards are removed by Backspace or the delete action without a prompt. An empty title is a blank click target, arrow keys step between cards only from the very start / end of the text, and AI improvement only touches the selected cards — the button toggles to undo and unchanged content reuses the cached answer. Hover groups wait briefly before opening: insert/send include current-session and new-session actions, archive+delete shares one group, and replace stays single. 0.8 adds a dedicated settings tab (themes, frosted glass, fonts, save mode, AI prompt presets, button groups, card height, geometry defaults), plugin undo/redo that never overrides textarea history, foldable cards with batch archive / delete / copy, selection-aware AI rewriting that re-selects its output, newest-first archives with auto-scroll, a workspace dropdown limited to workspaces with an unarchived non-empty segment, and image chips whose remove button sits on the thumbnail corner. The action bar is a single non-wrapping row: the left-hand selection label sits above right-aligned buttons, so overflow slides underneath instead of scrolling; mouse-clicking a group releases focus so it collapses when the pointer leaves. Backspace deletion of an empty card uses the same exit animation as the delete button, and batch selection puts Cancel selection leftmost. Image chips open an in-panel preview, the footer rotates shortcut tips, copy-all skips archived content, sending follows the General Settings busy-send policy, and the textarea only scrolls at its height limit. Auto refresh preserves the list scroll position,Ctrl/Cmd + Shift + Rresets the geometry, the panel never covers the host title bar, and notes live in/.dsh/notepad.jsonshared by every session from that workspace. 0.10 mirrors every successful chat-composer send into the workspace archive (de-duplicated by content) and makes archive cards foldable: captured chat messages start folded, while manual archives and notepad sends start expanded. 0.12 keeps the arrow keys inside a card unless the caret sits at the very start / end of its text, and refreshes the sidebar workspace badge at once — a finished save wakes the other sessions' badges instead of waiting for the 15 s poll.
dsh plugin --profile web add @restregular/dsh-notepad安装后重启 / 重新打开 DSH(或刷新页面),打开任意一个会话即可看到右下角的「记事本」浮窗。
┌────────────────────────────────────────────┐
│ ● 记事本 [workspace ▾] 保存 复位 复制 归档+ 折叠 最小化 │
│ ☐ 全选 已选 2 段 展开/折叠 ↺ ↻ 复制 ↙ ⇄ ➤ ⊕ 合并 ✦ 归档 │
│ ┌────────────────────────────────────────┐ │
│ │ ▾ 01 [标题] 🖼 ⧉ ↙ ⇄ ➤ ✦ 归档 │
│ │ 记录较早的一段…… │ │
│ └────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────┐ │
│ │ ▸ 02 [标题] 🖼 ⧉ ↙ ⇄ ➤ ✦ 归档 │
│ │ 记录最新的一段……(折叠后只显示预览) │ │
│ └────────────────────────────────────────┘ │
│ 已保存 · 42 字符 · 2 段 Enter 新建分段… │
└────────────────────────────────────────────┘+ 新建的分段追加在列表底部,拖拽后按你的顺序保存。▾ / ▸ 是折叠按钮,折叠后只保留卡片头和一行预览;工具栏的「全部展开 / 全部折叠」也是按钮组。归档中的分段同样可以折叠 / 展开:自动保存的对话消息默认折叠,手动归档和通过发送按钮自动归档的分段默认展开。.dsh/notepad.json,并按内容去重(活动分段和归档分段都会参与比较)。插入 / 替换输入框不算发送;记事本自己的发送按钮仍按原逻辑把分段移入归档。↑ 跳到上一张卡片末尾;在文本最末尾时按 ↓ 跳到下一张卡片开头。分段内(包括首行 / 末行的中间列、以及长文本软换行出来的行)始终是正常光标移动,不会误跳。--np-blur,右缘 12px 渐隐过渡),右侧操作按钮整体右对齐、层级更低;按钮宽度超出时从左侧滑到文本下方并被毛玻璃遮住,不滚动、不换行。按钮组被鼠标点击后释放焦点,鼠标移出即恢复折叠。Backspace 会与上一段合并;如果当前段完全为空(无标题、无文字、无图片),则播放与删除按钮相同的退出动画后再删除,不弹确认框。删除按钮对空分段同样跳过确认。Ctrl/Cmd + Z 与 Ctrl/Cmd + Shift + Z。输入框内的撤销仍由浏览器原生处理,插件绝不再拦一次;拆分、合并、归档、恢复、排序、批量操作、AI 优化,以及「插入到输入框 / 替换输入框内容」都由插件记录,最多 50 步(可调),切换工作区或外部内容刷新时丢弃历史。插入 / 替换记录的是对话框内容的「操作前 / 操作后」文本:撤销会把对话框恢复成操作前的内容,重做再放回;如果之后又改过对话框或发送过消息,这一步会自动作废,不会吞掉新输入。发送不进入历史:记事本发送、发送到新会话、对话框发送后的自动归档都不记录,撤销 / 重做既不会撤回已发送的分段,也不会重新发送;被发送归档的分段固定在归档里,不会被历史快照恢复成未发送状态。「在新会话中插入」作用于另一个会话的输入框,也不进入当前会话的撤销历史。标题栏的 ↺ / ↻ 按钮位于「复制全部」左侧,AI 优化按钮自己的「撤销优化」继续保留。Esc 关闭。图片芯片不再显示文件名,右上角的 × 用于移除引用。Ctrl/Cmd + Shift + R 把位置和尺寸恢复为设置里的默认值(初始 420 × 460,右下角),最小化 / 归档展开等状态不变;标题栏不再放复位按钮。设置面板新增独立的「记事本」标签页,全部改动即时生效(保存在本机浏览器 localStorage)。启用 / 禁用项使用 toggle,选项使用与其它插件一致的自定义下拉列表;配色主题同时作用于浮窗和设置页,并沿用宿主 --dsw-alias-* token,深色模式自动适配。设置侧栏中的「记事本」使用插件自己的 16px 单色线条图标,而不是宿主默认齿轮。
设置 · 说明 配色主题 · 跟随宿主 / 海蓝 / 紫罗兰 / 翠绿 / 琥珀 / 玫瑰;只改强调色和一层很淡的底色,不破坏宿主主题 UI 风格 · 纯色扁平 / 毛玻璃模糊;毛玻璃的模糊程度 0–40px 可调 字体与字号 · 跟随宿主 / 无衬线 / 衬线 / 等宽;字号 11–20px 保存方式 · 自动保存(约 0.5 秒防抖)/ 手动保存;手动模式下标题栏出现保存按钮,Ctrl/Cmd + S 也可保存 撤销步数 · 5–200,默认 50;只影响插件记录的操作,不影响输入框原生撤销 按钮组模式 · 开启时次级按钮 hover 展开;关闭时全部按钮平铺 展开 hover 时间阈值 · 0–1000ms,只在按钮组模式开启时显示 AI 提示词 · 通用润色 / 精简压缩 / 专业文档 / 分点大纲 / 自定义;下方文本框展示当前预设的完整提示词(只读),选择「自定义」后同一位置切换为可编辑输入框 分段卡片最大高度 · 80–800px,决定文本区何时出现滚动条 默认位置和尺寸 · 宽高可调;「将当前位置和尺寸设为默认」把浮窗此刻的位置与尺寸写成默认,复位快捷键随后回到这里;也可以立即恢复浮窗,或恢复出厂数值 快捷键绑定 · 显示 / 隐藏、复位、撤销、重做、保存五项,点击输入框后直接按新组合键即可;可一键恢复默认
操作 · 入口 · 说明 新建分段 · 标题栏 +,或分段末尾按回车 · 新卡片追加在列表底部(旧→新),并自动获得焦点 回车拆分 · 分段文本内按 Enter · 从光标处拆开,新卡片紧跟当前卡片下方 Backspace 合并 · 光标在分段最前面按 Backspace · 与上一张卡片合并,光标停在新旧文字交界处 空分段删除 · 空分段内按 Backspace,或空分段的删除按钮 · 无标题、无文字、无图片时跳过确认,并播放退出动画后删除 编辑分段 · 点击卡片文本区 · 自动模式下停止输入约 0.5 秒后保存;手动模式下等保存按钮 / Ctrl+S 分段标题 · 空标题的空白点击区 / 已有标题的输入框 · 空标题不显示文字和 hover 效果,点击后才出现输入框;保存方式同上 选中分段 · 点击左上角序号 · 卡片的强调色边框表示已选;再点一次取消,选中的段参与批量操作 折叠 / 展开分段 · 序号左边的 ▾ / ▸ · 折叠后隐藏编辑器,只保留标题和一行预览;工具栏可全部展开 / 折叠 拖拽排序 · 按住左上角序号拖动到另一张卡片的上 / 下半区 · 松开后按新顺序保存,序号自动重排;可撤销 合并分段 · 选中 2 段以上 → 顶部工具栏合并按钮 · 按当前显示顺序合并文字、标题和图片,可撤销 AI 优化此段 · 卡片工具栏的 ✦ 按钮 · 用当前默认模型润色这一段,保留图片;成功后按钮变为「撤销优化」 AI 优化选中内容 · 在分段里选中文字后点卡片 ✦ · 只把选中的片段发给模型,结果替换回原位置并重新选中该段结果 AI 优化选中分段 · 选中分段 → 顶部工具栏的 ✦ 按钮 · 只优化选中的非空未归档分段(段内选中文字时只优化该片段),显示进度;可整体撤销 撤销优化 · 优化后的 ✦ 按钮(或顶部工具栏) · 恢复优化前的文字;再次优化相同内容时直接复用上次结果 撤销 / 重做 · Ctrl/Cmd+Z / Ctrl/Cmd+Shift+Z,或标题栏 ↺ / ↻(复制全部左侧) · 插件记录结构操作(拆分、合并、归档、排序、AI、批量等)与插入 / 替换输入框(恢复对话框的操作前 / 操作后文本),最多 50 步可调;发送不入历史;输入框内仍用浏览器原生撤销,切换工作区后历史清空 方向键切换 · 分段文本内按 ↑ / ↓ · 文本最开头 ↑ 到上一段末尾,文本最末尾 ↓ 到下一段开头;首行 / 末行中间列不跳 未发送角标 · 最小化后的右下角图标;左侧边栏工作区行左上角 · 有未发送内容时显示数量,超过 99 显示 99+ 添加图片(选择) · 卡片头部的图片按钮 · 桌面端直接用所选文件的宿主路径引入,不复制文件 添加图片(粘贴) · 在分段文本区粘贴截图 / 图片 · 写入 .dsh/notepad/images/,再以该路径引入 添加图片(拖入) · 把图片拖到分段文本区 · 优先使用宿主路径,浏览器拿不到路径时按粘贴方式保存 图片芯片 · 分段输入框内 · 只显示缩略图;右上角 × 移除引用,点击缩略图在浮窗内预览并可打开原图 带图插入 / 发送 · 与文字相同入口 · 图片以 ` 追加在分段文字之后 单段插入 · 卡片上的左下箭头 · 插入到当前会话输入框光标处,不发送;进入撤销 / 重做历史 多段插入 · 选中分段 → 工具栏左下箭头,或全选后操作 · 按卡片顺序用空行合并后一次插入;进入撤销 / 重做历史 在新会话中插入 · hover 插入按钮片刻后出现的第二个按钮 · 在同一工作区新建会话并打开,内容填进它的输入框;图标与新会话发送区分;作用于另一个会话,不进入当前撤销历史 替换对话框 · 卡片上的 ⇄,或选中后工具栏 ⇄ · 用该段 / 多段合并内容替换整个输入框(没有按钮组);进入撤销 / 重做历史 单段发送 · 卡片上的纸飞机 · 直接发进当前会话;发送成功后自动归档该段;发送不可撤销 / 重做 多段发送 · 选中分段 → 工具栏纸飞机 · 合并成一条消息发送;发送成功后自动归档这些段;发送不可撤销 / 重做 在新会话中发送 · hover 发送按钮片刻后出现的第二个按钮 · 在同一工作区新建会话并发送,随后切换到该会话;新会话按 workspaceId 归属到当前工作区(不会落到「未分组」);纸飞机叠加图标与插入区分;发送不可撤销 / 重做 全选 · 列表上方「全选」复选框 · 一键选中所有未归档分段,再点一次取消 归档 · 卡片上归档+删除按钮组的主按钮,或工具栏归档图标 · 把分段移入归档区(不发送);可批量归档选中分段 对话框发送自动归档 · 在会话输入框发送消息 · 成功发送后自动把消息存成归档分段;按内容去重,活动 / 归档分段都参与比较;写入失败或发送失败不会留下归档 折叠归档分段 · 归档卡片左边的 ▾ / ▸ · 折叠后只显示一行预览;自动保存的对话消息默认折叠,手动归档 / 发送归档默认展开 显示 / 隐藏归档 · 标题栏归档图标 · 展开 / 收起归档区,状态按浏览器记忆;**最新归档排在最上面**,展开时自动滚到第一条 恢复 · 归档卡片上的恢复图标 · 把归档分段放回未归档列表 删除(未归档) · 归档+删除按钮组中 hover 出现的垃圾桶 · 空分段跳过确认;非空分段弹窗二次确认并提示 **删除后无法恢复**;播放消失动画后移除 批量删除 · 选中分段 → 工具栏归档组里 hover 出现的垃圾桶 · 二次确认后删除选中的活动分段,不可撤销 删除(已归档) · 归档卡片上的垃圾桶 · 删除归档分段,可撤销 清空归档 · 归档区标题「清空归档」 · 批量删除归档,可撤销 复制此段 · 卡片头部的复制按钮 · 把这一段文字与图片引用合并后写入剪贴板 复制选中的 N 段 · 选中分段 → 工具栏复制按钮 · 按卡片顺序用空行合并后复制;复制全部仍只包含未归档分段 切换工作区 · 标题栏工作区下拉列表 · 只列出存在未归档且非空分段的工作区;点选后打开该工作区的新会话并加载对应笔记 快捷键提示 · 底部的一条提示文字 · 点击轮换显示下一条快捷键说明 发送策略 · 卡片 / 工具栏发送按钮 · 繁忙时按「设置 > 通用设置 > 繁忙时的发送行为」选择排队或插话 滚动条 · 分段文本达到设置里的最大高度后 · 未到上限不显示纵向滚动条,超过后才出现;默认 240px 调整尺寸 · 拖动右下角斜纹手柄 · 宽高按浏览器记忆,最小 320 × 240 复位位置和尺寸 · Ctrl/Cmd + Shift + R · 恢复设置里的默认位置和尺寸(初始 420 × 460,右下角),其它状态不变 手动保存 · 手动模式下的标题栏保存按钮,或 Ctrl/Cmd + S · 立即写入当前内容;自动模式下按钮不显示 窗口折叠 / 展开 · 标题栏上下折叠箭头 · 只保留标题栏,内容继续按保存策略保存 最小化 / 恢复 · 标题栏最小化图标,或 Ctrl/Cmd + Shift + N` · 收成右下角小图标,带平滑过渡 拖动位置 · 按住标题栏拖动 · 位置按浏览器记忆;不会越过 DSH 窗口最顶部的标题栏(最大化 / 最小化 / 关闭那一栏)
同一个工作区里的不同会话共用同一份笔记:在 A 会话写的内容,切到同工作区的 B 会话仍然在。切换工作区时浮窗自动加载对应工作区的文件。
--dsw-alias-*)和 DSH 的正文字体变量 --dsw-font-family;默认「跟随宿主」,也可以在「设置 > 记事本」里换成无衬线 / 衬线 / 等宽和 11–20px 字号。backdrop-filter,两者都沿用宿主 token。body[data-ds-dark-theme],对卡片阴影、选中底色、归档弱化、下拉列表和设置卡片做了单独适配。prefers-reduced-motion。{
"version": 5,
"segments": [
{
"id": "seg-1",
"text": "遇到的问题\n下一步:补测试",
"title": "待办",
"createdAt": "2026-10-23T03:19:57.000Z"
},
{
"id": "seg-2",
"text": "看这张报错截图",
"title": "报错",
"createdAt": "2026-10-23T03:19:58.000Z",
"images": [{ "path": ".dsh/notepad/images/m1x2-image.png", "name": "image.png" }]
},
{ "id": "seg-3", "text": "已发送的分段", "archived": true, "archivedAt": "2026-10-23T03:20:00.000Z", "origin": "send" }
],
"text": "遇到的问题\n下一步:补测试\n\n看这张报错截图\n\n\n已发送的分段",
"updatedAt": "2026-10-23T03:20:01.000Z"
}text 是 segments(含图片引用)用空行合并后的副本,方便人工查看,也兼容旧版本。v5 起卡片按从旧到新、从上到下的顺序保存;读取到 v4(0.4–0.6)文件时,客户端会反转一次以迁移顺序,之后按卡片数组顺序保存(拖拽后的顺序不会被自动重排)。旧版单段文件(只有 text)、v2/v3 分段文件和手动改成纯文本的文件会在读取时迁移为分段;images[].path 工作区内用相对路径,工作区外保留绝对路径;name 仅用于显示和 Markdown 替代文本。title 最长 200 字符。归档分段可以带一个可选的 origin:manual(手动归档)、send(记事本发送按钮自动归档)或 compose(对话输入框发送后自动保存)。缺省 / 未知的 origin 按旧版手动归档处理,即默认展开;compose 默认折叠。origin 只写在已归档分段上,恢复后清空。
conversation.sendSession 返回成功后,把发送的文本作为一段 archived: true、origin: "compose" 的分段写入当前工作区;写入前用 text.trim()(并统一 \r\n)与现有活动 / 归档分段逐条比较,内容相同就跳过,所以重复发送不会产生重复卡片。只保存文字;纯附件消息、发送失败和记事本内部的“插入 / 替换”不会触发。自动保存无视“手动保存”模式立即落盘,避免消息已发出去而归档还停留在内存里。分段数达到 200 段上限时会跳过并输出一条控制台警告。/.dsh/notepad/images/,由宿主接口原子写入,只接受 PNG / JPEG / WebP / GIF,单张最大 20 MB;笔记只保存路径,不内嵌 base64。选择的图片直接引用原路径,不复制。每段最多 20 张。.dsh/notepad/images/ 下的对应文件;引用工作区外原路径的图片只删引用,不碰原文件。删除已归档分段 / 清空归档 / 直接删除未归档分段时,未被其它分段引用的插件图片会在撤销窗口(未归档删除没有撤销窗口,按同样延迟)结束后自动清理。localStorage 的 dsh-notepad.ui.v1 中;设置页的全部选项保存在 dsh-notepad.settings.v1 中(同一浏览器 / 设备生效),都不写入工作区。位置会被限制在宿主标题栏下方(读取 DSH 的 --dsh-frame-chrome-top / --dsh-frame-top-clearance),复位会使用设置里的默认宽高并停到右下角。archivedAt 最新在上显示(不改变 .dsh/notepad.json 里的分段顺序);展开归档或新增归档时自动滚动到第一条。新分段、归档和删除都有过渡动画。/dsh-notepad/api/note,粘贴图片走 /dsh-notepad/api/image,AI 优化走 /dsh-notepad/api/optimize,侧边栏角标计数与顶部工作区下拉走 /dsh-notepad/api/unsent;这些都只接受 127.0.0.1 的同源请求,并且只允许当前会话的 cwd 或已注册工作区。图片接口只会在固定的 .dsh/notepad/images/ 下写入 / 删除合法的图片文件,不能用来读写或删除工作区里的其它文件。AI 优化使用当前默认模型,未配置模型时返回 unavailable,不会影响记事本的其它功能。/unsent 只返回工作区 id、路径、标题、未发送数和 hasContent 布尔值,不暴露任何笔记正文。scrollTop,写入新内容后恢复,读取时也保留当前卡片顺序,不会让正在看的卡片或列表位置跳动。index.js + lib/note-store.js + lib/image-store.js):ctx.inject(['webServer']) 注册 /dsh-notepad/api 下的 GET/PUT /note、POST/DELETE /image、GET /unsent 与 POST /optimize,用临时文件 + rename 原子写入 .dsh/notepad.json;GET 返回 segments(含 title / createdAt / images)与合并后的 text,PUT 接受 { segments: [...] },也兼容旧的 { text }。POST /image 校验 base64、MIME 与文件签名后写入 .dsh/notepad/images/;DELETE /image 只允许删除该目录下的普通文件。/unsent 为已注册工作区统计未发送段数并返回 hasContent;/optimize 先用 workspace + title + prompt + text 查进程内缓存,命中时返回 { cached: true },否则把可选的 system 提示词(附加输出约束)交给 agentDefaultModel.currentSelection() + llm.prepareCall(),流式拼接文本后写入缓存并返回。client.js):整个 bundle 包在 IIFE 里,通过 shell.overlay 注册浮窗、通过 settings.section 注册「记事本」设置页,读取 uiSession.adapter.current 得到当前会话与工作区。设置存于模块级 readSettings()/writeSettings()/subscribeSettings() 小仓库(localStorage),设置页和浮窗即时同步。分段历史用统一的快照栈记录结构操作与插入 / 替换输入框,最多 undoLimit 步:结构步骤存整份分段快照;插入 / 替换步骤存 { sessionId, before, after } 三个字段的对话框文本,撤销 / 重做时通过 inputActions.setDraft() 写回,且只在对话框仍等于该步骤留下的内容时才生效(否则丢弃该步,绝不吞掉之后的手动输入);读取当前对话框文本走标准 props 的 hooks.input(即 DSH 的 InputState store),拿不到时插入 / 替换只生效、不记历史。发送相关提交(记事本发送归档、新会话发送预归档、对话框发送自动归档)都用 record: false 提交,不产生历史步骤;恢复历史快照时 keepSentCards() 会把当前所有 origin 为 send / compose 的归档分段按现内容、现归档状态固定回快照(快照里没有就补回),所以撤销 / 重做既不会把已发送分段恢复成未发送,也不会改写或删除它们。输入框或标题输入框内的 Ctrl+Z 直接交给浏览器原生处理,插件只在焦点不在可编辑元素时接管。折叠是纯 UI 状态;归档展示顺序按 archivedAt 倒序,写入文件的分段顺序不变。工具栏的按钮组统一走 actionGroup(),展开延迟用 --np-group-delay 变量,关闭按钮组模式时给组加 data-expanded=true 直接平铺;插入 / 发送的新会话按钮使用不同图标。卡片进入 / 退出分别用 dsh-np-item-in / dsh-np-item-out,归档或删除先标记 data-leaving,约 160ms 后再提交结构变化。文本区的 ref 回调按分段缓存,growTextarea() 在重测高度前后保存 / 恢复列表 scrollTop,避免自动保存触发列表跳回顶部。顶部工作区下拉使用 /unsent 的 hasContent 过滤,选择后调用 uiWorkspace.startSession(workspaceId, { clearPreviousDraft: true }) 打开该工作区的新会话。侧边栏角标用 MutationObserver 监听 [data-row-key^="workspace:"] 并写 data-np-unsent:当前工作区那一行始终用笔记里的实时未发送数覆盖轮询值(笔记已加载、状态非 loading / error 时),其它行用 /unsent 的计数;任一会话保存成功后调用 requestBadgeRefresh() 唤醒所有已挂载浮窗重新取数,切会话、窗口重新聚焦、页面重新可见时也会立即取一次,15 秒轮询只用于外部改动兜底。当前工作区 id 由 resolveWorkspaceId() 解析:优先按会话的 Workspace 成员关系,其次按工作区投影 / 注册表路径(Windows 盘符与 UNC 大小写不敏感),避免路径写法不同导致角标只剩慢轮询可用。粘贴图片用 FileReader 读成 base64 交给宿主保存;选择 / 拖入图片优先通过桌面桥 __DSH_HOST_PATHS__.pathFor(file) 拿宿主路径。插入 / 替换通过 inputActions.captureInsertion()/insertText() 与 setDraft();发送按繁忙策略选择 sessions.scope(id).conversation.send()(排队)或 sessions.binding(id).session.prompt(..., 'steer')(插话),steer 不可用时回退到排队。新会话发送先解析当前工作区并 sessions.create({ workspaceId }):先按当前会话的 Workspace 成员关系匹配,匹配不到再按规范化后的 cwd 路径匹配(Windows 盘符 / UNC 大小写不敏感),都没有命中才退回 sessions.create({ cwd });只传 cwd 时 Host 不会把新会话挂进任何工作区,会落到侧边栏「未分组」。workspaceId 附件失败时 Host 仍会发布真实会话,此时直接用它继续发送,而不是再建一个未分组会话。因为 create 只写入 placeholder、不会立刻产生 live binding,还必须先 uiWorkspace.openSession(id) 激活,再轮询 sessions.binding(id)?.session.prompt 后发送;发送失败会把预先归档的分段恢复。图片在插入 / 发送时以 Markdown 图片语法追加。对话发送归档在根上下文里给 conversation.sendSession 包一层 after-hook(状态挂在服务自己身上,插件热重载复用同一个 hook);只有 sendSession 成功且文本非空时才回调浮窗。浮窗监听当前会话 id,等待笔记首次加载完成,去重后追加 origin: "compose" 的归档分段并立即保存。归档折叠状态仍是浏览器内的 UI 状态:加载 / 外部刷新时只对没见过的归档 id 应用一次默认值(compose 折叠,其余展开),用户手动切换后不会被刷新重置。clampUi(),最小 top 取 --dsh-frame-chrome-top(全屏时为 0)/ --dsh-frame-top-clearance 再加 8px。显示 / 隐藏、复位、撤销 / 重做、保存五个快捷键优先注册到 DSH 的 shortcuts 服务(默认 Ctrl/Cmd+Shift+N / Ctrl/Cmd+Shift+R / Ctrl/Cmd+Z / Ctrl/Cmd+Shift+Z / Ctrl/Cmd+S),设置改变后会重新注册;注册失败时保留原始 keydown 监听。标题栏不再放复位按钮。sessions.list 的 running,繁忙时读取 configForms.get('ui-conversation') 快照里的 busyEnter(queue / steer);空闲时始终排队。locale 服务注册中英文;找不到 locale 时按浏览器语言回退。# 语法
node --check index.js
node --check client.js
# 宿主存储与路由
node test/note-store.test.mjs
node test/route.test.mjs
# 客户端离线冒烟(迷你 React + 浏览器垫片)
node test/client-smoke.mjs
# 包清单、导出、locale 元数据与图标
node test/package.test.mjs
# 或一次跑完
npm testtest/client-smoke.mjs 会真正执行 apply(ctx) 并渲染浮窗与设置页,覆盖:分段加载、编辑自动保存、手动保存模式与保存按钮、自动刷新保持列表滚动位置、设置 toggle / 自定义下拉 / 快捷键录制与恢复默认 / 主题(同时作用于浮窗和设置页)/ 字号 / 按钮组模式 / hover 阈值显隐 / 预设提示词只读展示与自定义切换 / 将当前几何设为默认、插件撤销 / 重做与输入框原生撤销的边界(含输入文字不被撤销吞掉)、分段折叠与全部展开 / 折叠、归档卡片折叠 / 展开与默认状态、对话发送自动归档 / 内容去重 / origin 落盘、单段 / 选中复制、工作区下拉(只列存在未归档且非空分段的工作区)与切换新会话、归档最新在上 / 自动滚动 / 退出动画(含 Backspace 删除空分段,且删除最后一条活动分段不会清空归档)、右对齐且不换行的按钮栏(「全选 / 已选 N 段」为毛玻璃底色而不是不透明色块)、标题栏「复制全部」左侧的撤销 / 重做、按钮组点击后失焦折叠、批量选择时最左侧的「取消选择」与危险按钮 hover 配色、设置侧栏线条图标、新分段追加到底部、空标题空白点击区与点击后出现输入框、标题自动保存、序号选中、方向键跨分段切换光标、段首 Backspace 合并上一段、空分段 Backspace / 删除按钮无确认删除、回车拆分后新卡片紧跟原卡片、文本区未到高度上限不显示滚动条、合并、单段 / 选中分段 AI 优化与段内选中文字优化、优化后按钮切换为撤销、AI 改写后文本区高度自动重测、相同内容命中缓存、插入 / 发送 / 归档+删除 hover 按钮组(含延迟 CSS 与新会话图标区分)与在新会话中插入 / 发送(新会话需先 open 再等待 live binding,且必须按 workspaceId 建会话而不是只传 cwd)、插入 / 替换进入插件撤销 / 重做(撤销恢复对话框内容、重做再放回,过期的那一步不吞新输入)、发送不进入历史(连续撤销 / 重做不会撤回或重发已发送分段)、图片面板内预览、非空删除的二次确认与不可撤销、底部快捷键轮换、复制全部排除归档、繁忙发送策略、拖拽排序、未发送角标、侧边栏工作区角标、单段/多段插入与替换、单段/多段发送与自动归档、归档显示隐藏、归档恢复与删除(含撤销)、全选、窗口折叠、最小化 / 恢复、拖动调整尺寸、标题栏下方位置限制、全局快捷键与 Ctrl+Shift+R 复位(标题栏不再有复位按钮)、DSH shortcuts 五个命令注册、深色模式与设置 CSS、重复执行 bundle 的兼容性,以及粘贴 / 选择图片、图片芯片、删除芯片时清理磁盘文件与带图插入发送。
conversation.sendSession;服务不可用或被其它插件替换掉该方法时,记事本本身不受影响,只是不会自动归档。它只捕获当前会话在浮窗挂载后成功发送的文字消息:纯附件消息、发送失败、在别的窗口 / 会话里发送的消息都不会写入当前工作区。uiWorkspace / sessions 服务;不可用时插入会降级为复制,发送会提示失败。Ctrl/Cmd + Shift + R 在部分浏览器里是硬刷新快捷键;DSH 桌面端通过 shortcuts 先消费该组合,网页端如果仍被浏览器占用,可在「设置 > 记事本」里点「立即恢复浮窗位置和尺寸」。localStorage,换浏览器 / 设备不会同步;删除站点数据或更换 profile 会恢复默认设置。/unsent 返回的 hasContent;宿主未提供 workspaceRegistry 或只有当前会话 cwd 时,下拉仍会显示当前工作区,但无法列出其它工作区。sessions.create + workspaces(工作区归属)+ uiWorkspace.openSession;workspaces 服务不可用时仍能创建并发送,但新会话只能按 cwd 落盘、可能显示在「未分组」;sessions.create 不可用时降级为插入 / 复制。__DSH_HOST_PATHS__ 桥,选择 / 拖入的图片会像粘贴一样先复制到 .dsh/notepad/images/。MIT