dsh-select-quote 0.3.0 → 0.3.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.
Files changed (3) hide show
  1. package/README.md +67 -55
  2. package/lib/client.js +489 -486
  3. package/package.json +6 -2
package/README.md CHANGED
@@ -1,12 +1,13 @@
1
1
  # dsh-select-quote
2
2
 
3
- [DeepSeek Harness](https://deepseek-harness.github.io/deepseek-harness/guide/quickstart) 的 Web 客户端插件:在对话里**划词加批注**——把选中的原文连同你的评论一起交给模型,并让它在回答里明确指出说的是哪一段。
3
+ [DeepSeek Harness](https://deepseek-harness.github.io/deepseek-harness/guide/quickstart) 的客户端插件:在对话里**划词加批注**——选中的原文连同你的评论一起交给模型,并让它在回答里明确指出说的是哪一段。
4
4
 
5
5
  - **划词工具条**:选中对话区任意文本,浮出「复制 / 添加到任务」;拖拽结束才出现,不挡操作
6
- - **批注卡片**:添加后输入框内出现一张摘要卡片(可多条),**草稿里不会出现任何协议文本**
7
- - **正文标记**:被划中的文字在原消息里留下虚线下划线 + 序号角标;点卡片里的条目会滚回那段文字
8
- - **模型回指**:模型回答时以内联指令标出它处理的每一条批注,插件把这些指令渲染成可点击的 chip
9
- - **对话记录**:已发送消息里的批注渲染为卡片,用户气泡只剩你打的问题
6
+ - **批注卡片**:添加后输入框内出现摘要卡片(可多条),草稿里不会出现任何协议文本
7
+ - **正文标记**:被划中的文字在原消息里留下虚线下划线 + 序号角标,点卡片条目会滚回那段文字
8
+ - **模型回指**:模型回答里指向某条批注的位置,渲染成可点击的 chip
9
+ - **对话记录**:已发送消息里的批注渲染成卡片,用户气泡只剩你打的问题
10
+ - **界面语言**:跟随 dsh 自己的语言设置,简体中文 / English / Русский
10
11
 
11
12
  ![screenshot](https://raw.githubusercontent.com/latte03/dsh-select-quote/main/assets/screenshot-1.png)
12
13
 
@@ -14,88 +15,99 @@
14
15
 
15
16
  ---
16
17
 
17
- ## 兼容性
18
-
19
- | 项 | 值 |
20
- |---|---|
21
- | dsh | `0.1.7-rc.1`(2026-09-24 实测:划词、批注卡片、正文标记、对话记录渲染全通) |
22
- | profile | web(`dsh web`)与桌面端(desktop)都可用;桌面端在 0.2.0 及更早版本会楔死渲染进程,本仓库已修复,详见下节 |
23
- | 运行时 | 只有浏览器半有业务;Node 半仅用于让包被 Loader 挂载 |
24
-
25
- 实现依赖若干产品内部约定(槽位名、composer DOM、深色主题属性等),升级 dsh 后请先跑 `npm run check`,再照 [`docs/internals.md`](docs/internals.md) 末尾的复核清单人工回归一遍。
26
-
27
- ### 桌面端(desktop profile)
28
-
29
- 桌面端是 Electron 外壳 + 同一个 Web 客户端,插件声明的 `dsh.client.platform: "web"` 在桌面端同样加载,槽位与 DOM 契约都在,功能本身可用(实测批注随消息送达模型、模型回指渲染为 chip 均正常)。
30
-
31
- > ⚠️ **0.2.0 及更早版本在桌面端会楔死渲染进程**,见 [#1](https://github.com/latte03/dsh-select-quote/issues/1):App 能启动、界面完整渲染,但整个输入区无法点击,renderer 子进程单核 100% 持续旋转。根因在插件自己的装饰器里——协议头部逐字写出了 `:dsh-annotation{index="N"}`,当文本含有这个字面量而严格正则一条都没匹配上时,装饰器仍然替换了一次内容完全相同的 Text 节点,于是被自己的 `MutationObserver` 反复触发,微任务队列永远排不空,宏任务和定时器再也得不到执行。触发条件是文本内容,与 Electron 或 `dsh-app://` 无关,桌面端只是恰好把那段文本送进了 Text 节点。完整机制与两道防线记录在 [`docs/internals.md`](docs/internals.md) 关键机制 8。
32
-
33
- > **现在的状态**:修复已进主干,Windows 桌面端 0.2.0-rc.2 实测重新启用插件后批注正常送达、Turn 正常结束、输入框可点击、没有新的崩溃日志。npm 上可安装的仍是 `0.2.0`,也就是带缺陷的那一版,因此桌面端用户在修复版发布之前请在 `dsh.profile.bundles` 中摘除本插件,或改用浏览器访问同一个端口。[#1](https://github.com/latte03/dsh-select-quote/issues/1) 保持 open,等报告人复验后关闭。
34
-
35
18
  ## 安装
36
19
 
37
- ### 方式一:从 npm 安装(bundle)
20
+ 网页版:
38
21
 
39
22
  ```bash
40
23
  dsh plugin --profile web add dsh-select-quote
41
24
  dsh --profile web
42
25
  ```
43
26
 
44
- > npm 上目前最新是 `0.2.0`(2026-09-24 发布):带批注卡片、正文标记与模型回指,但界面只有简体中文,桌面端还会楔死渲染进程(见兼容性一节)。本仓库的 `0.3.0` 修掉了楔死、加了简体中文 / English / Русский 三语,并把对话记录里的批注卡片改到用户气泡内,**还没发布到 npm**。要用 `0.3.0` 的行为,先按方式二从本地 checkout 加载;发布完成后这一节需要更新。仓库里另有 `0.1.0`,那是旧版「引用块」,不要装错。
27
+ 桌面版:在应用内输入`dsh-select-quote`安装,或者插件页搜索 `dsh-select-quote` 安装,重启客户端生效。
45
28
 
46
- ### 方式二:本地 checkout 加载(`--patch`)
29
+ 改了代码想立刻验证,用本地 checkout 加载:
47
30
 
48
31
  ```bash
49
- git clone <repo> && cd dsh-select-quote
50
- npm install && npm run build
32
+ git clone https://github.com/latte03/dsh-select-quote && cd dsh-select-quote
33
+ pnpm install && pnpm run build
51
34
  dsh web --patch "$PWD/dev.patch.yml"
52
35
  ```
53
36
 
54
- 打开 `http://127.0.0.1:3080`,在对话消息里划词即可看到工具条。`dev.patch.yml` 里的插件路径按本机写死(必须是绝对路径),换机器或换目录时改那一行;该文件不随 npm 包发布。
37
+ 打开 `http://127.0.0.1:3080`,在对话消息里划词即可看到工具条。`dev.patch.yml` 里的插件路径必须是绝对路径,换机器或换目录时改那一行;该文件不随 npm 包发布。
55
38
 
56
39
  ## 用法
57
40
 
58
- 1. 在对话区选中一段文本 → 点「添加到任务」
59
- 2. 弹出评论框,写一句想说的话(可留空,只划不评)→ `⌘/Ctrl + Enter` 确认
60
- 3. 输入框上方出现批注卡片,悬停可展开列表:逐条编辑、删除,或一键清空;点条目会跳到正文里对应的那段文字
61
- 4. 正常打字、按 Enter 发送。批注随消息一起交给模型,卡片随之消失
62
- 5. 模型回答里指向某条批注的位置,会显示成可点的 chip
41
+ 1. 在对话区选中一段文本,点「添加到任务」
42
+ 2. 在弹出的评论框里写一句想说的话(可留空,只划不评),`⌘/Ctrl + Enter` 确认
43
+ 3. 输入框上方出现批注卡片:悬停展开列表,可逐条编辑、删除或一键清空,点条目跳回正文对应文字
44
+ 4. 正常打字发送,批注随消息一起交给模型,卡片随之消失
45
+ 5. 模型回答里引用某条批注的位置显示为可点击 chip
63
46
 
64
- ## 语言 / Localization
47
+ ## 语言
65
48
 
66
- 界面文案支持 **简体中文 / English / Русский**,默认跟随浏览器语言:
49
+ 界面语言由 dsh 决定,插件不再自己判断浏览器语言。在 **设置 → 通用 → 语言** 里切换。
67
50
 
68
- | 语言 | 默认值 |
69
- |---|---|
70
- | `zh` | 原文案,同时作为缺失键的兜底词典 |
71
- | `en` | 非中文环境 |
72
- | `ru` | `ru` / `ru-RU` 等标签 |
73
51
 
74
- 想固定语言,在 Web GUI 控制台里设置后刷新页面:
52
+ ## 已知限制
75
53
 
76
- ```js
77
- localStorage.setItem('dsq-locale', 'ru') // 'ru' | 'en' | 'zh'
78
- localStorage.removeItem('dsq-locale') // 恢复跟随浏览器
79
- ```
54
+ - **待发批注只在内存里**:刷新页面或切换会话后会丢,卡片不持久化;已发送消息里的批注不受影响。
55
+ - **占用了用户气泡的渲染**:本插件以最低优先级替换内置 `user` 节点。其它插件若替换同一个键(例如 `dsh-easyrewrite` 用 `-1`),会被本插件屏蔽。
56
+ - **卡片宽度有限**:输入框内每条摘要最宽约为输入框的 1/4,超长标题走省略号。
57
+ - **划词只在对话区生效**:不介入编辑器、终端等面板。
80
58
 
81
- **刻意不翻译的部分**:`> [选中文本]`、`<response-annotations>`、`:dsh-annotation{index="N"}` 这些是模型与解析器约定的传输格式;`# Response annotations:` 那段是给模型的指令正文,不是界面文案。只有面向人的 chrome 走 `t()`。
59
+ ## 常见问题
82
60
 
83
- 新增文案:在 `src/client/i18n.ts` 的三份词典里各加一条,再在组件里 `t('key', { ... })` 调用。带 `{count}` 的键可以写成复数形式对象(中文用 `other`,俄语用 `one` / `few` / `many`)。
61
+ **升级 dsh 之后功能不对?** 先 `pnpm run check`;产物没问题就对照 [`docs/internals.md`](docs/internals.md) 的「依赖的产品内部约定」逐条复核,那里列了所有产品内部名。
84
62
 
85
- ## 已知限制
63
+ **划词没有工具条?** 确认选区在对话区而不是编辑器里;刷新页面(样式与观察者是幂等注入的);宿主 boot 日志里应出现 `dsh-select-quote`。
86
64
 
87
- - **待发批注只在内存里**:刷新页面或切换会话后会丢,卡片不持久化(已发送消息里的批注不受影响)。
88
- - **占用了用户气泡的渲染**:本插件以最低优先级替换内置 `user` 节点。若其它插件也替换同一个键(例如 `dsh-easyrewrite` 用 `-1`),会被本插件屏蔽。
89
- - **卡片宽度有限**:输入框内每条摘要最宽约为输入框的 1/4,超长标题走省略号。
90
- - 划词只在对话区生效,不介入编辑器、终端等面板。
65
+ **输入框里出现了协议原文?** 发送前的注入没生效,一般是 composer 结构变了——检查 `[data-composer-card]` 是否还在。
66
+
67
+ **对话记录里没有批注卡片?** 卡片渲染在用户气泡内部,若 `user` 节点被别的接管者赢走,或那条消息里确实没有批注块,都不会出现。
68
+
69
+ **界面语言不跟着 dsh 变?** 文案取自宿主的语言服务;宿主没有该服务或语言未注册时回退到 English。此时确认 dsh 版本带 `dsh-client-locale`,以及设置里确有语言选项。
70
+
71
+ **改了 CSS 不生效?** 样式只注入一次,刷新页面。
91
72
 
92
73
  ## 开发
93
74
 
94
75
  ```bash
95
- npm run check # typecheck + build + verify,提交前跑这个
76
+ pnpm install
77
+ pnpm run check # typecheck + build + verify
78
+ pnpm run watch # 增量重建
96
79
  ```
97
80
 
98
- 改 CSS 后要刷新页面(样式只注入一次)。协议格式、槽位注册、以及几处非显而易见的坑(U+200B 草稿标记、portal 到 body 的浮层、`--dsq-quote-pad` 高度补偿)记录在 **[docs/internals.md](docs/internals.md)**。
81
+ 依赖用 pnpm 管理(锁文件 `pnpm-lock.yaml`);构建产物 `lib/` 随源码一起提交,运行时直接读它。
82
+
83
+ `pnpm run verify` 无头执行产物,断言 8 项贡献都注册上,并检查三份词典的键与 `{placeholder}` 在每种语言里都齐备(复数消息必须有 `.other` 兜底)。
84
+
85
+ ### 热更新到桌面客户端
86
+
87
+ 宿主每半秒比较一次各插件 client 产物的文件状态,一旦变化就通过 `/plugins/events` 让页面只重载这个模块,所以运行中的客户端不用重启:
88
+
89
+ ```bash
90
+ pnpm run sync:desktop # 把 lib/ 推给已安装的副本
91
+ pnpm run sync:desktop -- --watch # 常驻:lib/ 一变就推
92
+ pnpm dev:desktop # 增量重建 + 推送,一条命令
93
+ ```
94
+
95
+ 目标路径按 `$DSH_HOME`(默认 `~/.dsh`)与 profile 名推导,profile 用 `--profile <name>` 或 `$DSH_PROFILE` 指定,默认 `desktop`。字节没变就不写,避免空重载。重载会重置插件的内存状态,未发送的批注会丢。
96
+
97
+ 发布:先把源码与产物 `lib/` 一起提交,再跑
98
+
99
+ ```bash
100
+ pnpm run release # check → 追加 CHANGELOG.md → 提升版本号并打 tag
101
+ ```
102
+
103
+ ## 贡献
104
+
105
+ fork 后开分支,提交前跑 `pnpm run check`。一个 PR 只讲一件事,功能与文档分开,方便追溯。PR 里写清复现方式(环境、dsh 版本、操作步骤)。
106
+
107
+ ## 致谢
108
+
109
+ - [@imallakov](https://github.com/imallakov):多语言文案、跨平台构建、装饰器楔死修复与批注卡片归属(PR #2 / #3 / #4)
110
+ - [@EliteOtaku](https://github.com/EliteOtaku):桌面端渲染进程楔死的定位报告与 CDP 探针方法([#1](https://github.com/latte03/dsh-select-quote/issues/1))
99
111
 
100
112
  ## License
101
113