dsh-sidenote 0.6.0 → 0.6.2

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/README.md CHANGED
@@ -1,110 +1,93 @@
1
1
  <p align="center">
2
- <img src="docs/assets/banner.png" alt="dsh-sidenote —— 侧边开一岔对话,划选留一条注释,主线永不被打断" width="100%">
2
+ <picture>
3
+ <source media="(max-width: 640px)" srcset="docs/assets/hero-compact.svg">
4
+ <img src="docs/assets/hero.svg" alt="dsh-sidenote:思路可以分岔,主线始终向前。划选注释、侧边追问,再把结论带回来。" width="100%">
5
+ </picture>
3
6
  </p>
4
7
 
5
8
  <p align="center">
6
- DSH(DeepSeek Harness)插件——支线问题不打断主线,结论一键回流。
9
+ 为 <b>DeepSeek Harness</b> 加上侧边聊天与划选注释。<br>
10
+ 读到一个疑问,就在旁边聊透;有了结论,再带回正在推进的任务。
7
11
  </p>
8
12
 
9
13
  <p align="center">
10
- <a href="https://www.npmjs.com/package/dsh-sidenote"><img src="https://img.shields.io/npm/v/dsh-sidenote" alt="npm version"></a>
11
- <a href="https://github.com/g-yixuan/dsh-sidenote/actions/workflows/ci.yml"><img src="https://github.com/g-yixuan/dsh-sidenote/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
12
- <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT license"></a>
13
- <img src="https://img.shields.io/badge/peer-none-informational" alt="no required peer dependencies">
14
+ <a href="#安装">安装</a> ·
15
+ <a href="#看看它如何工作">功能演示</a> ·
16
+ <a href="docs/usage.md">使用指南</a> ·
17
+ <a href="README_EN.md">English</a>
14
18
  </p>
15
19
 
16
20
  <p align="center">
17
- <a href="README_EN.md">English</a> · <b>中文</b>
21
+ <a href="https://www.npmjs.com/package/dsh-sidenote"><img src="https://img.shields.io/npm/v/dsh-sidenote?color=3B5BFD&amp;label=npm" alt="npm version"></a>
22
+ <a href="https://github.com/g-yixuan/dsh-sidenote/actions/workflows/ci.yml"><img src="https://github.com/g-yixuan/dsh-sidenote/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
23
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-60708E" alt="MIT license"></a>
18
24
  </p>
19
25
 
20
- ![演示:划选注释 → 侧边聊天 → 回流主线](docs/assets/demo.gif)
26
+ ![新版浅色界面:左侧保留主对话,右侧深入讨论,结论回到主输入框](docs/assets/workflow.jpg)
27
+
28
+ <p align="center"><sub>dsh-sidenote 0.6.0 · DSH 0.2.0-rc.2 · 原生侧栏 · 浅色主题</sub></p>
21
29
 
22
30
  ## 安装
23
31
 
32
+ 在已安装 DSH 的环境中执行:
33
+
24
34
  ```bash
25
35
  dsh plugin --profile web add dsh-sidenote
26
36
  ```
27
37
 
28
- **一步直装,无前置依赖。** 装完顶栏点「侧边」,或直接划选任意回复文本。
29
-
30
- 本地开发挂载:`dsh plugin --profile web add link:<本仓库路径>`(client 改动热重载,host 改动需重启 `dsh web`)。
31
-
32
- ## 侧边聊天——支线问题不打断主线
33
-
34
- 从当前主会话 **fork**(全量历史快照,不压缩)出独立侧边会话,在右侧栏多轮对话:
38
+ 打开 DSH Web,点击会话顶栏的 **「侧边」**,或划选一段回复开始。也可输入 `/side` 打开侧聊,用 `Alt+J` 切换主、侧输入焦点。
35
39
 
36
- - 顶栏「侧边」按钮 / 右侧栏 guide / 斜杠命令 `/side` 三个入口;
37
- - 与主对话**同一套渲染材质**:工具卡、思考预览、任务卡、模型/权限切换、`@` 引用、图片附件;
38
- - 审批/提问**在面板内直接答复**,不用跳回主视图;跑完有 toast 通知;
39
- - 继承历史默认折叠成指示卡;折叠态/滚动位置刷新不丢;`Alt+J` 主↔侧切焦点。
40
- - 侧聊默认不进入左侧会话列表或搜索结果,创建时也不会先出现再消失;保存为正式会话后才列出。DSH 0.1.7+ 可在 **设置 → 通用设置 → 在会话列表中显示侧边聊天** 中找回较早的侧聊;该选择仅保存在当前浏览器、当前 DSH 地址。旧版继续归档隐藏,通过 `/side` 重开最近关闭。
40
+ 原生侧栏宿主无需额外安装 `dsh-better-sidebar`;旧宿主按[兼容表](docs/compatibility.md)安装对应组合。
41
41
 
42
- ![侧边聊天面板:fork 历史 + 原生级工具卡 + 同能力 composer](docs/assets/04-side-chat-panel.png)
42
+ ## 一个任务,容得下更多思路
43
43
 
44
- ## 回流主线——侧边结论不烂在支线
44
+ ### 有疑问,在旁边聊透
45
45
 
46
- - 侧边结论一键「回流到主会话」:**问答成对**(结论 + 它回答的问题)收为受控 chip 挂在主输入框上方,随下一条消息发给主线;`@` 也可直接引用侧边聊天;
47
- - 「保存为正式会话」转正进会话列表;`/side` 弹层重开最近关闭。
46
+ 评审方案时想追问一个细节,读代码时想弄清一种实现,都可以从当前对话开一个侧聊。**完整历史随 fork 保留**,不用再交代一遍背景。
48
47
 
49
- ![回流 chip:侧边结论挂进主输入框](docs/assets/06-reflow-chip.png)
48
+ 侧聊有独立的多轮对话、工具卡、模型和权限切换,也支持图片、`@` 引用以及面板内审批。主线和支线各自推进。
50
49
 
51
- ## 划选注释——把「这句有问题」变成模型的上下文
50
+ ### 有想法,直接落在原文上
52
51
 
53
- - 划选 assistant 回复 → 浮层 → 注解编辑器,右缘编号角标锚定原文;
54
- - 添加到主对话或侧边聊天都保存为同一类受控注释,使用同一套 chip 预览、逐条移除及批量清空;引用和注解全文保留,**草稿零污染**,可只发送引用;
55
- - 新建注解点击编辑器外部或按 Enter 保存,Esc 明确取消;主→侧先等待选定 Tab 的真实子会话,等待期间可按 Esc 取消,失败则保留注解并提示重试;
56
- - 通过宿主原生输入机发送,保留 `@` 引用、图片附件和队列/steer 仲裁;目标会话出现持久消息或真实队列记录后,这一批注释才标为已发送,气泡收成「批注 ×N」留痕;
57
- - 保存的注释按目标会话隔离;存储不可用时提示仅保存在内存。发送失败保留注释与正文,提交期间新增或修改的注释留给下一条消息。
58
- - 侧边 assistant 正文也支持局部划选、多段落、列表与代码引用,入口只向所在侧聊添加;继承历史同样归当前子会话。流式、跨消息、思考和控件不作为引用。角标与高亮跟随来源消息并裁剪到其可见区域;原文折叠时注释仍在 chip 中。
59
- - 已保存注释刷新后保留。宿主恢复原生 tab 时重新绑定原子会话;未恢复侧栏时,可用 `/side` 中的“重开”恢复原子会话及注释。新建 fork 使用自己的独立注释列表。
60
-
61
- | 划选浮层 | 注解编辑器 |
62
- |---|---|
63
- | ![划选浮层](docs/assets/01-selection-popover.png) | ![注解编辑器](docs/assets/02-annotation-editor.png) |
52
+ 划选主对话或侧聊中的一段回复,写下问题或修改意见。**原文和注释一起保留**,可累积多条,发送前预览、移除,正文草稿照常编辑。
64
53
 
54
+ 读到「没有结果时,引导用户调整搜索词」,就选中这一句,追问「这里如何设计才不会让用户卡住?」。
65
55
 
66
- <details>
67
- <summary><b>更多截图</b></summary>
56
+ ### 有结论,带回正在做的事
68
57
 
69
- | 折叠态(继承卡 + 操作行) | 侧边斜杠菜单 |
70
- |---|---|
71
- | ![折叠态](docs/assets/04a-side-chat-collapsed.png) | ![斜杠菜单](docs/assets/04b-side-slash-menu.png) |
58
+ 侧聊回答下点击「回流到主会话」,**问题与回答成对带回**,出现在主输入框上方,随下一条消息送入主线。也可以整段回流,或将值得保留的侧聊保存为正式会话。
72
59
 
73
- | 角标 + 注释 chip | 发送后留痕 |
74
- |---|---|
75
- | ![角标与注释 chip](docs/assets/03-badge-and-chip.png) | ![发送后留痕](docs/assets/05-sent-trace.png) |
60
+ ## 看看它如何工作
76
61
 
77
- </details>
62
+ **划选一句 → 带着上下文追问 → 把结论带回主线。**
78
63
 
79
- ## 兼容性
64
+ ![浅色主题操作录屏:划选原文、添加问题、发送到侧边聊天、回流结论](docs/assets/demo.gif)
80
65
 
81
- 维护范围按精确组合列在[兼容与维护政策](docs/compatibility.md):0.1.7 当前维护,0.1.5 延长维护,0.1.1/0.1.2 的三组旧路径冻结且保留必需验收,0.2.0-rc.2 已通过精确准入并纳入当前维护。未列组合不作已验证承诺;安装引擎范围不代表其中所有版本均兼容。
66
+ [观看清晰版 MP4](docs/assets/demo.mp4) · [查看静态截图](docs/assets/workflow.jpg)
82
67
 
83
- 诊断默认关闭。排障时在 **设置 → 通用设置 → dsh-sidenote 诊断模式** 手动开启,顶栏才会出现“兼容诊断”,可查看、重查或导出当前接入状态。选择仅保存在当前浏览器、当前 DSH 地址,刷新后保留;无法本地保存时只在当前页生效。关闭诊断不影响能力检测、输入恢复或失败时的内容保留,也不修改宿主的全局开发者开关。服务尚未就绪不等于不兼容;无法读取的宿主版本显示未知。报告手动下载,不包含用户正文、凭证或本机路径。
68
+ <sub>以上素材重新录制于 dsh-sidenote 0.6.0 / DSH 0.2.0-rc.2。使用隔离环境中的示例对话与本地演示模型,展示真实界面操作;内容与回答为合成示例。</sub>
84
69
 
85
- 原生右栏无需 BS;旧版依赖表中的 BS 组合。原生 page kind 每 pane 一个,分栏可容纳多个 pane;普通入口聚焦既有 tab,关闭后 `/side` 重开原 child。其他 BS 共存或未来 `multiple` 能力需单独验收。
70
+ ## 用起来顺手的细节
86
71
 
87
- ## 设计要点
88
-
89
- - **真 fork,不压缩**:侧边会话是真实 DSH 会话(全量历史快照),与主会话能力对等;不是「摘要 + 一次性问答」。
90
- - **列表卫生**:插件自管侧聊身份和列表可见性;新版保持侧聊可运行,旧版保留归档路径。关闭或刷新不会把已登记侧聊重新放回列表。
91
- - **可累积的标注工作流**:多次划选累积多条注释,编辑、删除、随消息一起发出——不是一次性单引文。
72
+ | 你关心的事 | Sidenote 如何处理 |
73
+ |---|---|
74
+ | 之前聊过的内容 | 侧聊继承完整历史,默认折叠,按需展开。 |
75
+ | 一次有多处意见 | 多条注释可以一起发送,也能逐条预览和移除。 |
76
+ | 发不出去怎么办 | 发送失败保留注释与正文,便于重试。 |
77
+ | 刷新后继续 | 已保存的注释保留;侧栏未恢复时,可从 `/side` 重开原侧聊。 |
78
+ | 不想让支线堆满列表 | 侧聊默认不进入会话列表和搜索,保存为正式会话后才列出。 |
79
+ | 结论值得长期保留 | 保存为正式会话,后续继续讨论。 |
92
80
 
93
- ## 开发
81
+ 具体操作、恢复行为和划选范围见[使用指南](docs/usage.md)。
94
82
 
95
- | 命令 | 说明 |
96
- |---|---|
97
- | `pnpm typecheck` | tsc --noEmit |
98
- | `pnpm test` | vitest 单测(先运行 build) |
99
- | `pnpm build` | 类型声明 + tsdown(host ESM + client CJS bundle,纯度门) |
100
- | `pnpm test:mount` | 真实 `dsh web` + 种子会话 + Playwright 挂载与交互验收(`BS_VERSION`/`DSH_CMD` 切版本矩阵) |
83
+ ## 兼容与帮助
101
84
 
102
- ## 参与贡献
85
+ 已验证的原生侧栏组合为 **DSH 0.1.5-rc.2、0.1.7-rc.2、0.2.0-rc.2**;旧版的三组 BS 组合继续保留验收。支持范围以[兼容与维护政策](docs/compatibility.md)中的精确版本为准。
103
86
 
104
- 欢迎报告问题、提出需求、协助复现、改进文档和提交代码。请从 [Issue 入口](https://github.com/g-yixuan/dsh-sidenote/issues/new/choose) 或[贡献指南](CONTRIBUTING.md)开始;中文和 English 都可以。
87
+ 遇到问题时,可在 **设置 → 通用设置 → dsh-sidenote 诊断模式** 开启诊断,查看并手动导出接入状态。[报告问题或提出建议](https://github.com/g-yixuan/dsh-sidenote/issues/new/choose)。
105
88
 
106
- 维护者见[仓库维护](docs/maintaining.md)和[发布指南](docs/releasing.md)。
89
+ ## 一起完善 Sidenote
107
90
 
108
- ## License
91
+ 欢迎补充使用反馈、复现问题、改进文档和提交代码,中文与 English 都可以。开发环境、命令和检查步骤见[贡献指南](CONTRIBUTING.md)。
109
92
 
110
- MIT
93
+ [仓库维护](docs/maintaining.md) · [发布指南](docs/releasing.md) · [MIT License](LICENSE)
@@ -0,0 +1,23 @@
1
+ # README media / 首页素材
2
+
3
+ The screenshots and recording used by the README were captured on **2026-10-18** with **dsh-sidenote 0.6.0** (source: `7ed85e4`) and **DSH 0.2.0-rc.2**, using the native right sidebar without better-sidebar. The host's active bundle inventory and the mounted plugin's build hash were checked before capture.
4
+
5
+ 首页截图与录屏于 **2026-10-18** 重新采集,使用 **dsh-sidenote 0.6.0**(源码 `7ed85e4`)与 **DSH 0.2.0-rc.2** 原生右侧栏,不安装 better-sidebar。采集前核对了宿主实际激活的组件版本与插件构建摘要。
6
+
7
+ - `workflow.jpg`: the main and side conversations with a returned answer / 主、侧对话与回流结论。
8
+ - `selection.jpg`: a selected passage and its note editor / 划选与注释编辑器。
9
+ - `sidechat.jpg`: a completed side-chat response / 侧聊问答。
10
+ - `demo.gif`, `demo.mp4`: the same continuous selection → annotation → side reply → reflow sequence / 同一段连续操作的 GIF 与 MP4。
11
+ - `hero.svg`, `hero-en.svg` and their `-compact.svg` variants: original vector covers; regenerate with `python3 scripts/build-brand-assets.py` / 原创矢量封面,可用该命令重新生成。
12
+
13
+ The host uses its **light theme** and a 16 px conversation font. Screenshots show the real interface; they are not UI mockups. The recording preserves browser frame timing. A browser translation extension's floating control was temporarily hidden during capture and restored afterwards. No DSH controls were altered.
14
+
15
+ 宿主使用**浅色主题**与 16 px 会话字号。截图来自真实界面,录屏保留浏览器帧的时间间隔。录制期间临时隐藏了浏览器翻译扩展的浮动控件,随后恢复;没有修改 DSH 控件。
16
+
17
+ Conversation content is a synthetic note-search design example. A local demo adapter supplies fixed answers through the host's LLM interface; the fork, annotation, submission, and reflow paths are real. This illustrates the workflow, not model answer quality or latency. No private sessions or external model credentials are used.
18
+
19
+ 对话内容是合成的笔记搜索设计示例。本地演示模型通过宿主 LLM 接口提供固定回答;fork、注释、发送与回流均执行真实流程。素材用于说明操作,不代表模型回答质量或响应速度,也不使用私人会话或外部模型凭证。
20
+
21
+ For future captures, use a fresh isolated DSH home and a verified host version, confirm the mounted bundle, select the light theme, and repeat the complete workflow. The older `capture-demo.mjs` and `capture-video.mjs` scripts target historical BS layouts and do not reproduce these native-sidebar assets unchanged.
22
+
23
+ 以后重录时,使用全新隔离的 DSH home 和已验证宿主版本,核对实际挂载构建,选择浅色主题,并走完完整流程。旧 `capture-demo.mjs`、`capture-video.mjs` 面向历史 BS 布局,不能原样用于复现这组原生侧栏素材。
@@ -0,0 +1,18 @@
1
+ <svg width="128" height="128" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0" stop-color="#3B5BFD"/>
5
+ <stop offset="1" stop-color="#2743D8"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="128" height="128" rx="28" fill="url(#bg)"/>
9
+ <!-- 主区:两行文本(主对话流)——垂直中心配平 -->
10
+ <rect x="24" y="42" width="46" height="9" rx="4.5" fill="#fff" opacity="0.92"/>
11
+ <rect x="24" y="59" width="36" height="9" rx="4.5" fill="#fff" opacity="0.5"/>
12
+ <!-- 侧栏分隔线 -->
13
+ <rect x="79" y="30" width="2.5" height="68" rx="1.25" fill="#fff" opacity="0.3"/>
14
+ <!-- 侧边气泡(侧边聊天)——尾巴与泡体一体成形 -->
15
+ <path d="M94.5 42 h12 a5.5 5.5 0 0 1 5.5 5.5 v6 a5.5 5.5 0 0 1 -5.5 5.5 h-7.5 l-4.5 6 v-6 a5.5 5.5 0 0 1 -5.5 -5.5 v-6 a5.5 5.5 0 0 1 5.5 -5.5 z" fill="#fff"/>
16
+ <!-- 侧栏次级行 -->
17
+ <rect x="89" y="70" width="15" height="7" rx="3.5" fill="#fff" opacity="0.5"/>
18
+ </svg>
package/lib/client.js CHANGED
@@ -619,7 +619,7 @@ window.__ModuleLoader__.load({
619
619
  let dockRegistered = false;
620
620
  let report = {
621
621
  versions: {
622
- sidenote: "0.6.0",
622
+ sidenote: "0.6.2",
623
623
  dsh: "unknown",
624
624
  betterSidebar: null
625
625
  },
@@ -1234,15 +1234,15 @@ window.__ModuleLoader__.load({
1234
1234
  document.head.appendChild(tag);
1235
1235
  }
1236
1236
  var diagnostics_module_css_default = {
1237
- "list": "tGe0LW_list",
1238
- "header": "tGe0LW_header",
1239
1237
  "description": "tGe0LW_description",
1240
- "settingTitle": "tGe0LW_settingTitle",
1241
- "actions": "tGe0LW_actions",
1242
- "trigger": "tGe0LW_trigger",
1243
1238
  "versions": "tGe0LW_versions",
1239
+ "list": "tGe0LW_list",
1244
1240
  "panel": "tGe0LW_panel",
1245
- "setting": "tGe0LW_setting"
1241
+ "actions": "tGe0LW_actions",
1242
+ "setting": "tGe0LW_setting",
1243
+ "header": "tGe0LW_header",
1244
+ "trigger": "tGe0LW_trigger",
1245
+ "settingTitle": "tGe0LW_settingTitle"
1246
1246
  };
1247
1247
  //#endregion
1248
1248
  //#region src/client/diagnostics/index.tsx
@@ -3225,97 +3225,97 @@ window.__ModuleLoader__.load({
3225
3225
  document.head.appendChild(tag);
3226
3226
  }
3227
3227
  var sidechat_module_css_default = {
3228
- "snapshotText": "_5KEEsG_snapshotText",
3229
- "toolRunning": "_5KEEsG_toolRunning",
3230
- "reasoningBody": "_5KEEsG_reasoningBody",
3231
- "composerCard": "_5KEEsG_composerCard",
3232
3228
  "todoBody": "_5KEEsG_todoBody",
3233
- "pendingQText": "_5KEEsG_pendingQText",
3234
- "pendingTitle": "_5KEEsG_pendingTitle",
3235
- "composer": "_5KEEsG_composer",
3236
- "input": "_5KEEsG_input",
3237
- "densityToggle": "_5KEEsG_densityToggle",
3238
- "attachRail": "_5KEEsG_attachRail",
3239
- "pendingReason": "_5KEEsG_pendingReason",
3240
- "densityRow": "_5KEEsG_densityRow",
3241
- "stateScreen": "_5KEEsG_stateScreen",
3242
- "quoteBody": "_5KEEsG_quoteBody",
3243
- "composerChips": "_5KEEsG_composerChips",
3244
- "sentChip": "_5KEEsG_sentChip",
3229
+ "toolBodyText": "_5KEEsG_toolBodyText",
3230
+ "emptyIcon": "_5KEEsG_emptyIcon",
3231
+ "attachImg": "_5KEEsG_attachImg",
3232
+ "pendingCard": "_5KEEsG_pendingCard",
3245
3233
  "pendingQuestion": "_5KEEsG_pendingQuestion",
3234
+ "stateScreen": "_5KEEsG_stateScreen",
3235
+ "parentStrip": "_5KEEsG_parentStrip",
3236
+ "attachRail": "_5KEEsG_attachRail",
3246
3237
  "visibilitySetting": "_5KEEsG_visibilitySetting",
3247
- "rowPreview": "_5KEEsG_rowPreview",
3248
- "transcript": "_5KEEsG_transcript",
3249
- "empty": "_5KEEsG_empty",
3250
- "slashGroupTitle": "_5KEEsG_slashGroupTitle",
3251
- "noticeRow": "_5KEEsG_noticeRow",
3252
- "pendingHead": "_5KEEsG_pendingHead",
3253
- "composerFoot": "_5KEEsG_composerFoot",
3254
- "pendingBtnGhost": "_5KEEsG_pendingBtnGhost",
3255
- "sidechat-pulse": "_5KEEsG_sidechat-pulse",
3256
- "slashMenu": "_5KEEsG_slashMenu",
3257
- "sentChipRow": "_5KEEsG_sentChipRow",
3258
- "slashItemName": "_5KEEsG_slashItemName",
3259
- "slashItemDetail": "_5KEEsG_slashItemDetail",
3260
- "jumpBottom": "_5KEEsG_jumpBottom",
3261
- "body": "_5KEEsG_body",
3262
- "attachButton": "_5KEEsG_attachButton",
3263
- "snapshotBody": "_5KEEsG_snapshotBody",
3264
- "slashItemActive": "_5KEEsG_slashItemActive",
3265
- "pendingCustom": "_5KEEsG_pendingCustom",
3266
- "stateDetail": "_5KEEsG_stateDetail",
3267
- "pendingOptionActive": "_5KEEsG_pendingOptionActive",
3268
- "dotPending": "_5KEEsG_dotPending",
3269
- "toolBody": "_5KEEsG_toolBody",
3270
- "pendingDesc": "_5KEEsG_pendingDesc",
3271
- "root": "_5KEEsG_root",
3272
- "errorRow": "_5KEEsG_errorRow",
3238
+ "todoText": "_5KEEsG_todoText",
3239
+ "reflowButton": "_5KEEsG_reflowButton",
3273
3240
  "toolGenericBody": "_5KEEsG_toolGenericBody",
3274
- "attachRemove": "_5KEEsG_attachRemove",
3275
- "pendingCard": "_5KEEsG_pendingCard",
3241
+ "snapshotBody": "_5KEEsG_snapshotBody",
3276
3242
  "toolError": "_5KEEsG_toolError",
3277
- "rowActions": "_5KEEsG_rowActions",
3243
+ "pendingReason": "_5KEEsG_pendingReason",
3244
+ "root": "_5KEEsG_root",
3278
3245
  "pendingOptionDesc": "_5KEEsG_pendingOptionDesc",
3279
- "reasoning": "_5KEEsG_reasoning",
3280
- "attachImg": "_5KEEsG_attachImg",
3281
- "pendingActions": "_5KEEsG_pendingActions",
3282
3246
  "headerSide": "_5KEEsG_headerSide",
3283
- "nativeHost": "_5KEEsG_nativeHost",
3284
- "flowRowError": "_5KEEsG_flowRowError",
3247
+ "userBubble": "_5KEEsG_userBubble",
3248
+ "dotIdle": "_5KEEsG_dotIdle",
3249
+ "composerChips": "_5KEEsG_composerChips",
3250
+ "pendingBtnGhost": "_5KEEsG_pendingBtnGhost",
3285
3251
  "todoItem": "_5KEEsG_todoItem",
3286
- "attachThumb": "_5KEEsG_attachThumb",
3287
- "userRow": "_5KEEsG_userRow",
3252
+ "sentChipRow": "_5KEEsG_sentChipRow",
3253
+ "pendingQHeader": "_5KEEsG_pendingQHeader",
3254
+ "sidechat-pulse": "_5KEEsG_sidechat-pulse",
3255
+ "rowPreview": "_5KEEsG_rowPreview",
3288
3256
  "streamingHint": "_5KEEsG_streamingHint",
3289
- "stopButton": "_5KEEsG_stopButton",
3290
- "todoDot": "_5KEEsG_todoDot",
3291
- "slashItem": "_5KEEsG_slashItem",
3292
- "emptyIcon": "_5KEEsG_emptyIcon",
3293
- "userBubble": "_5KEEsG_userBubble",
3257
+ "snapshotText": "_5KEEsG_snapshotText",
3258
+ "slashItemActive": "_5KEEsG_slashItemActive",
3259
+ "attachThumb": "_5KEEsG_attachThumb",
3260
+ "pendingOption": "_5KEEsG_pendingOption",
3261
+ "nativeHost": "_5KEEsG_nativeHost",
3262
+ "pendingActions": "_5KEEsG_pendingActions",
3263
+ "errorRow": "_5KEEsG_errorRow",
3264
+ "flowRow": "_5KEEsG_flowRow",
3265
+ "slashItemName": "_5KEEsG_slashItemName",
3266
+ "composerFoot": "_5KEEsG_composerFoot",
3267
+ "sentChip": "_5KEEsG_sentChip",
3268
+ "writeNotice": "_5KEEsG_writeNotice",
3269
+ "composerCard": "_5KEEsG_composerCard",
3270
+ "densityRow": "_5KEEsG_densityRow",
3294
3271
  "modelSelect": "_5KEEsG_modelSelect",
3272
+ "attachRemove": "_5KEEsG_attachRemove",
3295
3273
  "dotRunning": "_5KEEsG_dotRunning",
3296
- "toolHead": "_5KEEsG_toolHead",
3297
- "writeNotice": "_5KEEsG_writeNotice",
3274
+ "modelLabel": "_5KEEsG_modelLabel",
3275
+ "emptyTitle": "_5KEEsG_emptyTitle",
3276
+ "emptyText": "_5KEEsG_emptyText",
3277
+ "noticeRow": "_5KEEsG_noticeRow",
3278
+ "stopButton": "_5KEEsG_stopButton",
3279
+ "toolRunning": "_5KEEsG_toolRunning",
3280
+ "slashMenu": "_5KEEsG_slashMenu",
3281
+ "rowActions": "_5KEEsG_rowActions",
3298
3282
  "pendingBar": "_5KEEsG_pendingBar",
3299
- "pendingBtnPrimary": "_5KEEsG_pendingBtnPrimary",
3300
- "reflowButton": "_5KEEsG_reflowButton",
3301
- "toolLocations": "_5KEEsG_toolLocations",
3302
- "assistantBody": "_5KEEsG_assistantBody",
3303
- "flowRow": "_5KEEsG_flowRow",
3283
+ "pendingHead": "_5KEEsG_pendingHead",
3284
+ "pendingTitle": "_5KEEsG_pendingTitle",
3285
+ "transcript": "_5KEEsG_transcript",
3286
+ "empty": "_5KEEsG_empty",
3287
+ "quoteBody": "_5KEEsG_quoteBody",
3304
3288
  "assistantRow": "_5KEEsG_assistantRow",
3289
+ "todoDot": "_5KEEsG_todoDot",
3290
+ "attachButton": "_5KEEsG_attachButton",
3291
+ "toolBody": "_5KEEsG_toolBody",
3292
+ "pendingOptionActive": "_5KEEsG_pendingOptionActive",
3293
+ "assistantBody": "_5KEEsG_assistantBody",
3294
+ "composer": "_5KEEsG_composer",
3295
+ "pendingQText": "_5KEEsG_pendingQText",
3296
+ "actionGroup": "_5KEEsG_actionGroup",
3297
+ "toolCard": "_5KEEsG_toolCard",
3298
+ "jumpBottom": "_5KEEsG_jumpBottom",
3299
+ "toolLocations": "_5KEEsG_toolLocations",
3300
+ "slashGroupTitle": "_5KEEsG_slashGroupTitle",
3301
+ "flowRowError": "_5KEEsG_flowRowError",
3302
+ "slashItem": "_5KEEsG_slashItem",
3303
+ "pendingBtnPrimary": "_5KEEsG_pendingBtnPrimary",
3304
+ "toolHead": "_5KEEsG_toolHead",
3305
+ "writeNoticeClose": "_5KEEsG_writeNoticeClose",
3305
3306
  "inheritedBody": "_5KEEsG_inheritedBody",
3306
- "pendingQHeader": "_5KEEsG_pendingQHeader",
3307
- "emptyTitle": "_5KEEsG_emptyTitle",
3308
- "modelLabel": "_5KEEsG_modelLabel",
3309
- "dotIdle": "_5KEEsG_dotIdle",
3310
- "toolBodyText": "_5KEEsG_toolBodyText",
3307
+ "reasoning": "_5KEEsG_reasoning",
3308
+ "userRow": "_5KEEsG_userRow",
3309
+ "reasoningBody": "_5KEEsG_reasoningBody",
3310
+ "pendingCustom": "_5KEEsG_pendingCustom",
3311
+ "dotPending": "_5KEEsG_dotPending",
3312
+ "pendingDesc": "_5KEEsG_pendingDesc",
3313
+ "stateDetail": "_5KEEsG_stateDetail",
3314
+ "input": "_5KEEsG_input",
3315
+ "body": "_5KEEsG_body",
3311
3316
  "sendButton": "_5KEEsG_sendButton",
3312
- "todoText": "_5KEEsG_todoText",
3313
- "emptyText": "_5KEEsG_emptyText",
3314
- "toolCard": "_5KEEsG_toolCard",
3315
- "parentStrip": "_5KEEsG_parentStrip",
3316
- "pendingOption": "_5KEEsG_pendingOption",
3317
- "actionGroup": "_5KEEsG_actionGroup",
3318
- "writeNoticeClose": "_5KEEsG_writeNoticeClose"
3317
+ "densityToggle": "_5KEEsG_densityToggle",
3318
+ "slashItemDetail": "_5KEEsG_slashItemDetail"
3319
3319
  };
3320
3320
  //#endregion
3321
3321
  //#region src/client/chat/ToolCard.tsx
@@ -5298,17 +5298,17 @@ ${entries.map((entry) => {
5298
5298
  document.head.appendChild(tag);
5299
5299
  }
5300
5300
  var annotations_module_css_default = {
5301
+ "chip": "SVnebq_chip",
5302
+ "chipRow": "SVnebq_chipRow",
5301
5303
  "chipClearAll": "SVnebq_chipClearAll",
5302
5304
  "side": "SVnebq_side",
5303
- "chipRow": "SVnebq_chipRow",
5304
- "chipNumber": "SVnebq_chipNumber",
5305
- "chipPanel": "SVnebq_chipPanel",
5306
- "chip": "SVnebq_chip",
5307
- "chipWrap": "SVnebq_chipWrap",
5305
+ "chipRemove": "SVnebq_chipRemove",
5306
+ "storageNotice": "SVnebq_storageNotice",
5308
5307
  "chipText": "SVnebq_chipText",
5308
+ "chipPanel": "SVnebq_chipPanel",
5309
5309
  "chipNote": "SVnebq_chipNote",
5310
- "chipRemove": "SVnebq_chipRemove",
5311
- "storageNotice": "SVnebq_storageNotice"
5310
+ "chipNumber": "SVnebq_chipNumber",
5311
+ "chipWrap": "SVnebq_chipWrap"
5312
5312
  };
5313
5313
  //#endregion
5314
5314
  //#region src/client/annotations/chip.tsx
@@ -5733,6 +5733,11 @@ ${entries.map((entry) => {
5733
5733
  composer.setDraft(event.target.value);
5734
5734
  triggerCtl?.track(event.target.value, event.target.selectionStart ?? event.target.value.length, guardOf(composer.phase), composer.draftRev ?? 0);
5735
5735
  },
5736
+ onPaste: (event) => {
5737
+ if (!composer.canAttach) return;
5738
+ const images = [...event.clipboardData.files].filter((file) => file.type.startsWith("image/"));
5739
+ if (images.length > 0 && composer.attachImages(images)) event.preventDefault();
5740
+ },
5736
5741
  onKeyDown: (event) => {
5737
5742
  if (menuOpen && triggerCtl !== null) {
5738
5743
  const arbKey = arbitrateKeyOf(event.key);
@@ -7811,34 +7816,34 @@ ${entries.map((entry) => {
7811
7816
  document.head.appendChild(tag);
7812
7817
  }
7813
7818
  var annotate_module_css_default = {
7814
- "toolbarBelow": "_SVViG_toolbarBelow",
7815
- "sentCardNote": "_SVViG_sentCardNote",
7816
- "hint": "_SVViG_hint",
7817
- "badgeSent": "_SVViG_badgeSent",
7818
- "hintClose": "_SVViG_hintClose",
7819
- "editorSpacer": "_SVViG_editorSpacer",
7819
+ "toolbar": "_SVViG_toolbar",
7820
7820
  "editorNew": "_SVViG_editorNew",
7821
- "cancelButton": "_SVViG_cancelButton",
7822
7821
  "editorEdit": "_SVViG_editorEdit",
7823
- "editorAsk": "_SVViG_editorAsk",
7822
+ "highlight": "_SVViG_highlight",
7823
+ "editorTextarea": "_SVViG_editorTextarea",
7824
7824
  "editorTarget": "_SVViG_editorTarget",
7825
- "confirmButton": "_SVViG_confirmButton",
7826
- "editorAskRow": "_SVViG_editorAskRow",
7827
- "deleteButton": "_SVViG_deleteButton",
7825
+ "badge": "_SVViG_badge",
7826
+ "editorSpacer": "_SVViG_editorSpacer",
7827
+ "toolbarBelow": "_SVViG_toolbarBelow",
7828
+ "editorFooter": "_SVViG_editorFooter",
7829
+ "cancelButton": "_SVViG_cancelButton",
7828
7830
  "editorError": "_SVViG_editorError",
7831
+ "sentCardTitle": "_SVViG_sentCardTitle",
7832
+ "deleteButton": "_SVViG_deleteButton",
7829
7833
  "toolbarButton": "_SVViG_toolbarButton",
7834
+ "confirmButton": "_SVViG_confirmButton",
7835
+ "saveButton": "_SVViG_saveButton",
7836
+ "badgeSent": "_SVViG_badgeSent",
7837
+ "sentCardQuote": "_SVViG_sentCardQuote",
7838
+ "sentCardNote": "_SVViG_sentCardNote",
7839
+ "editorAskRow": "_SVViG_editorAskRow",
7840
+ "hint": "_SVViG_hint",
7830
7841
  "dshSidenoteHintIn": "_SVViG_dshSidenoteHintIn",
7842
+ "sentChip": "_SVViG_sentChip",
7831
7843
  "sentChipRow": "_SVViG_sentChipRow",
7832
- "badge": "_SVViG_badge",
7833
- "highlight": "_SVViG_highlight",
7834
- "editorTextarea": "_SVViG_editorTextarea",
7835
- "sentCardQuote": "_SVViG_sentCardQuote",
7836
- "toolbar": "_SVViG_toolbar",
7837
- "saveButton": "_SVViG_saveButton",
7844
+ "hintClose": "_SVViG_hintClose",
7838
7845
  "editorInput": "_SVViG_editorInput",
7839
- "editorFooter": "_SVViG_editorFooter",
7840
- "sentChip": "_SVViG_sentChip",
7841
- "sentCardTitle": "_SVViG_sentCardTitle"
7846
+ "editorAsk": "_SVViG_editorAsk"
7842
7847
  };
7843
7848
  //#endregion
7844
7849
  //#region src/client/annotate/hint.tsx
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "dsh-sidenote",
3
- "version": "0.6.0",
4
- "description": "DSH web plugin: Codex-style side chat (fork the current session into a persistent side panel) + selection annotations with numbered badges and a composer chip. Runs directly on the DSH native right sidebar (DSH ≥ 0.1.5); dsh-better-sidebar is an optional peer for older hosts. / Codex 风格侧边聊天 + 划选注释的 DSH 插件。",
3
+ "version": "0.6.2",
4
+ "description": "Follow the tangent. Keep the thread. Annotate, explore on the side, and bring answers back to DeepSeek Harness. / 思路可以分岔,主线始终向前。划选注释、侧边追问,再把结论带回正在推进的任务。",
5
+ "icon": "docs/assets/logo.svg",
5
6
  "type": "module",
6
7
  "license": "MIT",
7
8
  "main": "lib/index.js",
@@ -42,6 +43,7 @@
42
43
  "lib/types/**/*.d.ts",
43
44
  "src",
44
45
  "cordis.patch.yml",
46
+ "docs/assets/logo.svg",
45
47
  "README.md",
46
48
  "LICENSE"
47
49
  ],
@@ -84,6 +84,11 @@ export function ComposerBar(props: {
84
84
  composer.draftRev ?? 0,
85
85
  )
86
86
  }}
87
+ onPaste={(event) => {
88
+ if (!composer.canAttach) return
89
+ const images = [...event.clipboardData.files].filter(file => file.type.startsWith('image/'))
90
+ if (images.length > 0 && composer.attachImages(images)) event.preventDefault()
91
+ }}
87
92
  onKeyDown={(event) => {
88
93
  // 菜单开着先仲裁(上下/Enter 选中/Esc 关闭归控制器)。
89
94
  if (menuOpen && triggerCtl !== null) {