dsh-input-assistant 0.1.3 → 0.1.4

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 (42) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/LICENSE +21 -21
  3. package/README.en.md +100 -0
  4. package/README.md +215 -184
  5. package/cordis.patch.yml +3 -3
  6. package/docs/CHANGELOG-0.1.2.md +102 -102
  7. package/docs/evaluation.md +111 -111
  8. package/docs/images/dark.png +0 -0
  9. package/docs/images/light.png +0 -0
  10. package/docs/images/optimize.png +0 -0
  11. package/docs/references.md +39 -39
  12. package/docs/smoke-comparison.md +37 -37
  13. package/docs/validation.md +180 -100
  14. package/lib/browser/components.d.ts +1 -1
  15. package/lib/browser/controller.d.ts +47 -4
  16. package/lib/browser/dom.d.ts +1 -1
  17. package/lib/browser/index.d.ts +1 -1
  18. package/lib/browser/public.d.ts +2 -2
  19. package/lib/browser/runtime.d.ts +4 -2
  20. package/lib/browser/settings.d.ts +1 -1
  21. package/lib/browser/styles.d.ts +1 -1
  22. package/lib/client.js +1164 -222
  23. package/lib/client.meta.json +40 -40
  24. package/lib/core/config.d.ts +1 -1
  25. package/lib/core/context.d.ts +1 -1
  26. package/lib/core/generation.d.ts +2 -2
  27. package/lib/core/index.d.ts +9 -8
  28. package/lib/core/models.d.ts +15 -0
  29. package/lib/core/protection.d.ts +3 -4
  30. package/lib/core/scheduler.d.ts +1 -1
  31. package/lib/core/snapshot.d.ts +1 -1
  32. package/lib/core/types.d.ts +11 -0
  33. package/lib/core.js +280 -53
  34. package/lib/core.js.map +2 -2
  35. package/lib/host/rpc.d.ts +2 -0
  36. package/lib/host/runtime.d.ts +5 -3
  37. package/lib/host/storage.d.ts +11 -3
  38. package/lib/host/transcript.d.ts +1 -1
  39. package/lib/index.d.ts +5 -3
  40. package/lib/index.js +451 -156
  41. package/lib/index.js.map +4 -4
  42. package/package.json +10 -3
package/README.md CHANGED
@@ -1,184 +1,215 @@
1
- # DSH 输入助手
2
-
3
- [![CI](https://github.com/Somnus678/dsh-input-assistant/actions/workflows/ci.yml/badge.svg)](https://github.com/Somnus678/dsh-input-assistant/actions/workflows/ci.yml)
4
- [![release](https://img.shields.io/badge/release-v0.1.3-blue)](https://github.com/Somnus678/dsh-input-assistant/releases/tag/v0.1.3)
5
- [![license](https://img.shields.io/badge/license-MIT-green)](LICENSE)
6
- [![dsh](https://img.shields.io/badge/DSH-0.2.1--rc.2-purple)](https://github.com/deepseek-ai/deepseek-harness)
7
- [![tests](https://img.shields.io/badge/tests-121%20passed-brightgreen)](docs/validation.md)
8
-
9
- [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 的输入框增强插件:**提示词优化**、**下一句预测**、**输入续写**、**草稿暂存**。
10
-
11
- ![优化界面](docs/images/optimize.png)
12
-
13
- ## 功能
14
-
15
- | 功能 | 说明 |
16
- |---|---|
17
- | **提示词优化** | 把草稿或选中文字改写成更准确、可发送的表达。三档强度(轻/标准/深度),显示逐词差异,一键撤销。 |
18
- | **下一句预测** | 回复完成后预测你接下来可能说的话,以灰字提示,Tab 采纳,不发送。 |
19
- | **输入续写** | 根据当前草稿预测后续内容,停顿时间与最小间隔可调。 |
20
- | **草稿暂存** | 当前会话最多保留 3 份草稿,清空输入前自动保存,显式恢复。 |
21
-
22
- 深色与浅色主题均已适配:
23
-
24
- | 浅色 | 深色 |
25
- |---|---|
26
- | ![浅色](docs/images/light.png) | ![深色](docs/images/dark.png) |
27
-
28
- ### 保护机制
29
-
30
- 改写时以下内容保持原样,模型无法篡改:
31
-
32
- - 代码块(``` 和 ~~~)与行内代码
33
- - URL 与盘符绝对路径(`C:\...`)
34
- - 相对路径与文件名(`src/core/generation.ts`、`package.json`、`README.md`)
35
- - 你显式锁定的片段
36
-
37
- 占位符被模型篡改、丢失或重复时,插件拒绝该结果并保留你的原稿。
38
-
39
- ### 失败不丢稿
40
-
41
- 优化、续写、预测在超时、取消、网络失败、模型空输出时都保留原稿,只给出提示。一次瞬时状态轮询失败不会中断正在进行的手动优化。
42
-
43
- ## 安装
44
-
45
- 需要 **Node.js >= 22.19** 和 **DSH `0.2.1-rc.2` 或 `0.2.1-rc.3`**。安装预构建 `.tgz` 不需要在本地编译 TypeScript。
46
-
47
- 一行命令直接从 GitHub Release 安装:
48
-
49
- ```powershell
50
- dsh --version # 确认 0.2.1-rc.2 或 rc.3
51
- dsh plugin --profile web add https://github.com/Somnus678/dsh-input-assistant/releases/download/v0.1.3/dsh-input-assistant-0.1.3.tgz
52
- dsh --profile web --dump-config # 应看到 dsh-input-assistant 层
53
- dsh --profile web
54
- ```
55
-
56
- 也可以先从 [Releases](https://github.com/Somnus678/dsh-input-assistant/releases) 手动下载 `dsh-input-assistant-0.1.3.tgz` 再本地安装:
57
-
58
- ```powershell
59
- dsh plugin --profile web add ./dsh-input-assistant-0.1.3.tgz
60
- ```
61
-
62
- 官方桌面端使用自己的 `desktop` profile(默认 Windows 安装位置):
63
-
64
- ```powershell
65
- $dsh = Join-Path $env:LOCALAPPDATA 'Programs\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd'
66
- & $dsh --version
67
- & $dsh plugin --profile desktop add (Resolve-Path './dsh-input-assistant-0.1.3.tgz').Path
68
- ```
69
-
70
- 安装或升级后**完全退出并重新打开 DSH**,插件才会加载。
71
-
72
- ### 卸载
73
-
74
- ```powershell
75
- dsh plugin --profile web remove dsh-input-assistant
76
- ```
77
-
78
- 同样需要重启对应实例。卸载**不会**清除插件保存的草稿与设置(存在宿主私有 storage 中)。
79
-
80
- ### 从源码构建
81
-
82
- ```powershell
83
- git clone https://github.com/Somnus678/dsh-input-assistant.git
84
- cd dsh-input-assistant
85
- pnpm install
86
- pnpm build
87
- pnpm pack --pack-destination dist
88
- ```
89
-
90
- ## 快速上手
91
-
92
- 1. 安装后重启 DSH,输入框右侧出现**「优化」按钮**。
93
- 2. 在输入框写入草稿,点「优化」或按快捷键,查看差异后决定**采纳**或**撤销**。
94
- 3. 左下角账号菜单 → **设置 → 输入助手**,可分别开关四个模块、调整强度与高级参数。
95
-
96
- > **默认会调用模型。** `下一句预测` 和 `输入续写` 默认开启,会在你输入时自动发起请求。若只想手动使用优化功能或控制成本,请先在设置中关闭这两项。
97
-
98
- ## 设置项
99
-
100
- | 设置 | 默认 | 范围 | 说明 |
101
- |---|---|---|---|
102
- | 提示词优化 | 开 | — | 是否显示优化入口 |
103
- | 草稿暂存 | 开 | — | 清空输入前是否自动保存 |
104
- | 下一句预测 | 开 | — | 回复后是否预测下一句 |
105
- | 输入续写 | 开 | — | 输入时是否预测后续内容 |
106
- | 优化强度 | 标准 | 轻/标准/深度 | 改写幅度 |
107
- | 显示方式 | ghost | ghost/panel | 灰字或面板 |
108
- | 续写停顿 `debounceMs` | 600 | 200–5000 | 停止输入多久后触发 |
109
- | 最小间隔 `minIntervalMs` | 2000 | 500–30000 | 两次续写请求的最小间隔 |
110
- | 固定辅助模型 | 跟随输入框 | — | 可指定 provider/model;留空则跟随输入框所选模型 |
111
-
112
- ### 各功能怎么用
113
-
114
- **优化整稿或选区**:输入草稿后点「优化」,或用菜单/快捷键。结果以差异视图展示,逐处标出增删;点「采纳」写入输入框,点「撤销」或按一次 `Ctrl+Z` 恢复原文。
115
-
116
- **下一句预测与输入续写**:预测结果以**灰字**显示在光标后。按 `Tab` 采纳,按 `Esc` 或继续输入忽略。采纳**不会**发送消息。
117
-
118
- **暂存长草稿**:清空输入前,非空草稿会自动暂存到当前会话(最多 3 份)。从插件菜单可查看并显式恢复;切换会话、切换模型、断线重连后暂存仍在该会话下。
119
-
120
- ## 兼容性
121
-
122
- | 项目 | 支持范围 |
123
- |---|---|
124
- | DSH | `0.2.1-rc.2` ~ `0.2.1-rc.3`(声明范围 `>=0.2.1-rc.2 <0.3.0-0`,两端均经全量测试验证) |
125
- | Node.js | `>= 22.19` |
126
- | 操作系统 | Windows x64(已验证);macOS/Linux 未验证 |
127
- | 浏览器测试 | Microsoft Edge |
128
-
129
- ## 已知边界
130
-
131
- **这个插件没有完成完整的效果评测。** 请据此判断是否适合你的场景:
132
-
133
- - 60 条固定合成质量集尚未跑完真实模型评测,也没有独立人工语义标注,状态为 `not_evaluated`。
134
- - 6 次真实模型小样本对照只能说明链路可用(2,807 tokens),**不能证明效果优于同类工具**。
135
- - 中文 IME 候选组合、附件/引用组合、完整官方 Web 组合、其他插件组合、非 Windows x64 平台均未验证。
136
- - 兼容声明范围 `0.2.1-rc.2` ~ `0.2.1-rc.3`;此范围外的版本未经测试,可能不兼容。
137
-
138
- 详见 [验收记录](docs/validation.md) 与 [低用量真实模型试验](docs/smoke-comparison.md)。
139
-
140
- ## 数据与隐私
141
-
142
- - 不收集遥测,不上传使用数据。
143
- - 草稿与设置存在宿主 DSH 的私有 storage。
144
- - 模型调用走宿主已配置的提供商;插件不持有或记录 API key。
145
- - 优化/预测/续写会把当前草稿与相关上下文发给模型提供商 —— 这是功能必需,请按你所用提供商的数据政策评估。
146
-
147
- 详见 [安全策略](SECURITY.md)。
148
-
149
- ## 开发
150
-
151
- ```powershell
152
- pnpm install
153
- pnpm typecheck # 类型检查
154
- pnpm test # 121 条测试
155
- pnpm build # 构建 lib/
156
- pnpm test:package # 校验打包产物(需先 pack)
157
- pnpm test:web # 真实 Edge 回归
158
- ```
159
-
160
- 贡献前请阅读 [贡献指南](CONTRIBUTING.md)。技术细节见 [0.1.2 修正记录](docs/CHANGELOG-0.1.2.md)。
161
-
162
- ### 持续集成
163
-
164
- 每次 push 和 PR 都会在 GitHub Actions 上自动运行 [`.github/workflows/ci.yml`](.github/workflows/ci.yml):
165
-
166
- | Job | 环境 | 内容 |
167
- |---|---|---|
168
- | `test-windows` | `windows-latest` | **全量 121 条测试** + 真实 Edge 冒烟 + 构建可复现性校验 |
169
- | `test-linux` | `ubuntu-latest` | 排除 Edge 专属渲染测试(116 条),验证核心/宿主/控制器无 Windows 假设 |
170
- | `package` | `ubuntu-latest` | 打包内容审计:必需文件齐全,且不含研究资料、缓存或测试夹具 |
171
-
172
- `test-windows` 是权威结果:`tests/browser-theme.test.ts` 和 `scripts/smoke-web.mjs` 使用
173
- `chromium.launch({ channel: 'msedge' })` 驱动真实 Microsoft Edge 渲染已发布的 DSH 主题,
174
- 这两项在无 Edge 的 Linux 上无法运行,因此 Linux job 显式排除它们,覆盖由 Windows job 提供。
175
-
176
- 本地想复现 Linux job:
177
-
178
- ```powershell
179
- pnpm vitest run --exclude 'tests/browser-theme.test.ts'
180
- ```
181
-
182
- ## 许可证
183
-
184
- [MIT](LICENSE)。第三方依赖与参考实现各自适用其原许可证,见 [公开参考与实现边界](docs/references.md)。
1
+ # DSH 输入助手
2
+
3
+ 简体中文 | [English](README.en.md)
4
+
5
+ [![CI](https://github.com/Somnus678/dsh-input-assistant/actions/workflows/ci.yml/badge.svg)](https://github.com/Somnus678/dsh-input-assistant/actions/workflows/ci.yml)
6
+ [![release](https://img.shields.io/github/v/release/Somnus678/dsh-input-assistant)](https://github.com/Somnus678/dsh-input-assistant/releases)
7
+ [![license](https://img.shields.io/badge/license-MIT-green)](LICENSE)
8
+ [![dsh](https://img.shields.io/badge/DSH-0.2.1--rc.2-purple)](https://github.com/deepseek-ai/deepseek-harness)
9
+ [![tests](https://img.shields.io/badge/tests-203%20passed-brightgreen)](docs/validation.md)
10
+
11
+ [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 的输入框增强插件:**提示词优化**、**下一句预测**、**输入续写**、**草稿暂存**。
12
+
13
+ 当前源码版本为 **0.1.4**,包含预测详略度、预设、独立预测按钮、预览采纳、手动重试、草稿复制及辅助模型选择。可从当前源码构建并安装本地 `dist/dsh-input-assistant-0.1.4.tgz`;公开发布情况请参见 [Releases](https://github.com/Somnus678/dsh-input-assistant/releases)。
14
+
15
+ ![优化界面](docs/images/optimize.png)
16
+
17
+ 截图来自本地浏览器夹具,使用正式组件、宿主主题及模拟模型输出。
18
+
19
+ ## 功能
20
+
21
+ | 功能 | 说明 |
22
+ |---|---|
23
+ | **提示词优化** | 把草稿或选中文字改写成更准确、可发送的表达。三档强度(轻/标准/深度),先预览差异,采纳后写入,可还原。 |
24
+ | **下一句预测** | 回复完成后预测你接下来可能说的话,以灰字提示,Tab 采纳,不发送。 |
25
+ | **输入续写** | 根据当前草稿预测后续内容,停顿时间与最小间隔可调。 |
26
+ | **手动建议与重试** | 点击独立「预测」按钮生成一次;自动建议关闭时仍可使用,失败后可明确重试。 |
27
+ | **详略度与预设** | 简明、标准、详尽三档;详尽允许多行,始终遵守长度上限。三种预设经保存后生效。 |
28
+ | **草稿暂存** | 当前会话最多保留 3 份草稿,点击“暂存并清空”先保存再清空,显式恢复;删除后 10 秒内可撤销。 |
29
+
30
+ 深色与浅色主题均已适配:
31
+
32
+ | 浅色 | 深色 |
33
+ |---|---|
34
+ | ![浅色](docs/images/light.png) | ![深色](docs/images/dark.png) |
35
+
36
+ ### 保护机制
37
+
38
+ 改写时会识别并锁定以下内容:
39
+
40
+ - 代码块(``` 和 ~~~)与行内代码
41
+ - URL(含平衡括号)与盘符绝对路径(`C:\...`)
42
+ - 正斜线或反斜线相对路径与常见文件名(`src/core/generation.ts`、`src\index.ts`、`package.json`、`.env`、`.gitignore`)
43
+ - 你显式锁定的片段
44
+
45
+ 占位符被模型篡改、丢失或重复时,插件拒绝该结果并保留你的原稿。
46
+
47
+ 带空格的 Windows 路径支持引号边界,未加引号时会按文件名、标点或行尾识别。目录名和后续自然语言存在歧义时,请用引号、反引号或手动锁定,避免依赖自动识别。片段完整不等于语义不变,采纳前仍需审阅。
48
+
49
+ 中文紧贴普通文件名时会切出文件本身,例如“请修改package.json中的scripts”。未引用的纯中文文件名与紧贴的中文说明仍可能存在歧义;混合中英文名称请使用引号、反引号或手动锁定。
50
+
51
+ ### 失败不丢稿
52
+
53
+ 优化、续写、预测在超时、取消、网络失败、模型空输出时都保留原稿,只给出提示。一次瞬时状态轮询失败不会中断正在进行的手动优化。
54
+
55
+ ## 安装
56
+
57
+ 需要 **Node.js >= 22.19** 和 **DSH `0.2.1-rc.2` 或 `0.2.1-rc.3`**。安装预构建 `.tgz` 不需要在本地编译 TypeScript。
58
+
59
+ 构建本版后,将以下路径指向本地包并安装到 Web profile:
60
+
61
+ ```powershell
62
+ dsh --version # 确认 0.2.1-rc.2 或 rc.3
63
+ dsh plugin --profile web add (Resolve-Path './dist/dsh-input-assistant-0.1.4.tgz').Path
64
+ dsh --profile web --dump-config # 应看到 dsh-input-assistant 层
65
+ dsh --profile web
66
+ ```
67
+
68
+ 已发布的 GitHub 安装包可从 [Releases](https://github.com/Somnus678/dsh-input-assistant/releases) 下载,请核对版本号和文件来源。
69
+
70
+ 官方桌面端使用自己的 `desktop` profile(默认 Windows 安装位置):
71
+
72
+ ```powershell
73
+ $dsh = Join-Path $env:LOCALAPPDATA 'Programs\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd'
74
+ & $dsh --version
75
+ & $dsh plugin --profile desktop add (Resolve-Path './dist/dsh-input-assistant-0.1.4.tgz').Path
76
+ ```
77
+
78
+ 安装或升级后**完全退出并重新打开 DSH**,插件才会加载。
79
+
80
+ 如果曾安装其他内容的同名 0.1.4 包,请先核对安装包的来源与 SHA256,并在重启后核对实际加载的插件文件。同版本缓存可能复用旧文件;仅看到版本号相同不能证明已更新。
81
+
82
+ ### 卸载
83
+
84
+ ```powershell
85
+ dsh plugin --profile web remove dsh-input-assistant
86
+ ```
87
+
88
+ 同样需要重启对应实例。卸载**不会**清除插件保存的草稿与设置(存在宿主私有 storage 中)。
89
+
90
+ ### 从源码构建
91
+
92
+ ```powershell
93
+ git clone https://github.com/Somnus678/dsh-input-assistant.git
94
+ cd dsh-input-assistant
95
+ pnpm install
96
+ pnpm build
97
+ pnpm pack --pack-destination dist
98
+ ```
99
+
100
+ ## 快速上手
101
+
102
+ 1. 安装后重启 DSH,输入框右侧出现**「优化」「预测」按钮**和快捷菜单。
103
+ 2. 在输入框写入草稿,点「优化」,查看差异后决定**采纳优化**或**保留原文**;等待期间可取消。
104
+ 3. 左下角账号菜单 → **设置 → 输入助手**,可分别开关四个模块、调整强度与高级参数。
105
+
106
+ > **默认会调用模型。** `下一句预测` 和 `输入续写` 默认开启,会在你输入时自动发起请求。若只想手动使用优化功能或控制成本,请先在设置中关闭这两项。
107
+
108
+ ## 设置项
109
+
110
+ | 设置 | 默认 | 范围 | 说明 |
111
+ |---|---|---|---|
112
+ | 提示词优化 | 开 | — | 是否启用优化 |
113
+ | 草稿暂存 | 开 | — | 是否启用“暂存并清空”与恢复 |
114
+ | 下一句预测 | 开 | — | 回复后是否预测下一句 |
115
+ | 输入续写 | 开 | — | 输入时是否预测后续内容 |
116
+ | 优化强度 | 标准 | 轻/标准/深度 | 改写幅度 |
117
+ | 预测详略度 | 标准 | 简明/标准/详尽 | 不会自动提高长度上限;详尽使用可滚动的候选面板 |
118
+ | 显示方式 | ghost | ghost/panel | 灰字或面板 |
119
+ | 下一句长度上限 | 120 | 20–1000 | Unicode 字符上限 |
120
+ | 续写长度上限 | 80 | 10–500 | Unicode 字符上限 |
121
+ | 续写停顿 `debounceMs` | 600 | 200–5000 | 停止输入多久后触发 |
122
+ | 最小间隔 `minIntervalMs` | 2000 | 500–30000 | 两次续写请求的最小间隔 |
123
+ | 固定辅助模型 | 跟随输入框 | — | 可从宿主目录选择;高级选项支持手填 provider/model;留空跟随输入框模型 |
124
+
125
+ ### 各功能怎么用
126
+
127
+ **优化整稿或选区**:输入草稿后点「优化」。原稿保持不变,结果以差异视图展示;点「采纳优化」才写入输入框,点「保留原文」或按 `Esc` 放弃预览。采纳后可在菜单点「还原」,或按一次 `Ctrl+Z` 恢复原文。
128
+
129
+ **下一句预测与输入续写**:预测结果以**灰字**或候选面板显示。详尽模式统一使用可滚动的面板,完整展示多行候选。按 `Tab` 采纳,按 `Esc` 或继续输入忽略。采纳**不会**发送消息。
130
+
131
+ **手动生成与重试**:点击「预测」或菜单中的「生成建议」,空稿时预测下一句,有草稿时续写。自动功能关闭时仍可使用,失败或正常弃权后可明确重试。输入框需为无附件、无引用的空闲纯文本,光标位于末尾。手动请求仍遵守宿主最小间隔;限流时最多延后重试一次,不会循环调用。页面隐藏会停止自动建议,重新可见后再判断是否触发。
132
+
133
+ **暂存长草稿**:在菜单点击「暂存并清空」,保存成功后才清空输入(最多 3 份)。可显式追加或替换恢复;切换会话、切换模型、断线重连后暂存仍在该会话下。删除或清空暂存后,可在 10 秒内撤销;撤销不会覆盖其他窗口新保存的草稿,容量不足时会提示先释放空间再重试。
134
+
135
+ 保存期间可点「取消清空」保留输入,已开始的保存仍会完成。保存中编辑草稿、切换模型或修改设置,也只保存原快照并保留当前输入。该按钮不用于取消删除或撤销等存储操作。
136
+
137
+ **预设档位**:「敏捷模式」「标准平衡」「节流省流」只修改设置表单,点击「保存设置」后才全局生效,不会立即生成。滑块用于快速调整,数值框支持范围内的精确整数,如 601 毫秒。
138
+
139
+ 最近一次删除的 10 秒撤销期限不会因切走会话再返回而改变。撤销失败的目标单独保留在当前插件运行内,后续删除不会覆盖该目标;可重试、复制或主动放弃。两批备份均恢复失败时,会先要求处理一批,避免继续删除覆盖备份。插件卸载或连接切换会释放这些内存备份。草稿卡和待恢复备份都支持复制,复制不受当前输入附件或引用限制。
140
+
141
+ 功能开关、显示方式、辅助模型和高级参数集中在 **设置 → 输入助手**,均为全局设置。快捷菜单只保留常用操作,并明确标注优化强度的全局作用范围。
142
+
143
+ 辅助模型选择只保存插件自己的路由,不切换主会话模型;目录部分失败或不支持目录接口时,可刷新或使用高级手动填写,已有选择会保留。输入、优化和暂存的字数预算均按 Unicode 码点统计。
144
+
145
+ ## 兼容性
146
+
147
+ | 项目 | 支持范围 |
148
+ |---|---|
149
+ | DSH | 声明 `>=0.2.1-rc.2 <0.3.0-0`;本轮测试依赖以 `0.2.1-rc.3` 为基准,完整宿主组合尚未验证 |
150
+ | Node.js | `>= 22.19` |
151
+ | 操作系统 | Windows x64(已验证);macOS/Linux 未验证 |
152
+ | 浏览器测试 | Microsoft Edge |
153
+
154
+ ## 已知边界
155
+
156
+ **这个插件没有完成完整的效果评测。** 请据此判断是否适合你的场景:
157
+
158
+ - 60 条固定合成质量集尚未跑完真实模型评测,也没有独立人工语义标注,状态为 `not_evaluated`。
159
+ - 6 次真实模型小样本对照只能说明链路可用(2,807 tokens),**不能证明效果优于同类工具**。
160
+ - 中文 IME 候选组合、附件/引用组合、完整官方 Web 组合、其他插件组合、非 Windows x64 平台均未验证。
161
+ - 声明允许 `0.2.1-rc.2` 至 `<0.3.0-0`;本版未对声明范围内每个宿主版本完成实机验证。
162
+
163
+ 详见 [验收记录](docs/validation.md) 与 [低用量真实模型试验](docs/smoke-comparison.md)。
164
+
165
+ ## 数据与隐私
166
+
167
+ - 不收集遥测,不上传使用数据。
168
+ - 草稿与设置存在宿主 DSH 的私有 storage。
169
+ - 模型调用走宿主已配置的提供商;插件不持有或记录 API key。
170
+ - 优化/预测/续写会把当前草稿与相关上下文发给模型提供商 —— 这是功能必需,请按你所用提供商的数据政策评估。
171
+
172
+ 详见 [安全策略](SECURITY.md)。
173
+
174
+ ## 开发
175
+
176
+ ```powershell
177
+ pnpm install
178
+ pnpm typecheck # 类型检查
179
+ pnpm test # 全量工程回归(含 Edge)
180
+ pnpm build # 构建 lib/
181
+ pnpm pack --pack-destination dist # 先生成当前版本归档
182
+ pnpm test:package # 校验打包产物(需先 pack)
183
+ pnpm test:web # 真实 Edge 回归
184
+ pnpm test:package:web # 直接加载实际 .tgz 的 client/core 做 Edge 回归
185
+ ```
186
+
187
+ 贡献前请阅读 [贡献指南](CONTRIBUTING.md)。技术细节见 [0.1.2 修正记录](docs/CHANGELOG-0.1.2.md)。
188
+
189
+ ### 持续集成
190
+
191
+ 每次 push 和 PR 都会在 GitHub Actions 上自动运行 [`.github/workflows/ci.yml`](.github/workflows/ci.yml):
192
+
193
+ | Job | 环境 | 内容 |
194
+ |---|---|---|
195
+ | `test-windows` | `windows-latest` | 全量工程测试 + 源码与实际安装包的 Edge 回归 + 构建可复现性校验 |
196
+ | `test-linux` | `ubuntu-latest` | Node 22.19 与 24.19 矩阵,排除 Edge 专属渲染测试,验证核心/宿主/控制器及包消费者 |
197
+ | `package` | `ubuntu-latest` | 打包内容审计:必需文件齐全,且不含研究资料、缓存或测试夹具 |
198
+
199
+ `test-windows` 是权威结果:主题测试、`scripts/smoke-web.mjs` 和 `scripts/smoke-package.mjs` 使用
200
+ `chromium.launch({ channel: 'msedge' })` 驱动真实 Microsoft Edge 渲染已发布的 DSH 主题,
201
+ 浏览器检查在无 Edge 的 Linux 上无法运行,因此覆盖由 Windows job 提供。
202
+
203
+ 本地想复现 Linux job:
204
+
205
+ ```powershell
206
+ pnpm vitest run --exclude 'tests/browser-theme.test.ts'
207
+ ```
208
+
209
+ 发布流程复用完整 CI,全部任务通过后才下载并发布其中已验证的同一份 `.tgz`,同时校验 tag 与包版本一致。
210
+
211
+ 推送 `v*` 标签会触发 npm 发布工作流,需要仓库配置 `NPM_TOKEN`;该工作流不会自动创建 GitHub Release。如需在 GitHub 提供下载,需在 CI 成功后另行创建 Release 并附上已验证的归档。发布前应确认版本号、标签和归档一致,且该版本尚未发布。
212
+
213
+ ## 许可证
214
+
215
+ [MIT](LICENSE)。第三方依赖与参考实现各自适用其原许可证,见 [公开参考与实现边界](docs/references.md)。
package/cordis.patch.yml CHANGED
@@ -1,3 +1,3 @@
1
- - insert:
2
- - id: input-assistant
3
- name: dsh-input-assistant
1
+ - insert:
2
+ - id: input-assistant
3
+ name: dsh-input-assistant
@@ -1,102 +1,102 @@
1
- # 0.1.2 修正记录
2
-
3
- 记录日期:2026 年 10 月 23 日(Asia/Shanghai)。
4
-
5
- `0.1.2` 是 `0.1.1` 的缺陷修正版本,不新增用户可见功能。以下每条都先复现、再修复、再补回归用例。测试总数从 **105** 增至 **121**(12 个测试文件)。
6
-
7
- ## 修正清单
8
-
9
- ### 1. 相对路径与裸文件名不受保护(`src/core/protection.ts`)
10
-
11
- **问题**:`0.1.1` 的路径保护正则只覆盖代码块、行内代码、URL、盘符绝对路径(`C:\…`、`D:/…`)和以 `./` `../` `/` 开头的路径。编码类草稿里最常见的裸相对路径完全不保护:
12
-
13
- ```
14
- "修改 package.json 里的 scripts" => []
15
- "看看 src/index.ts 的实现" => []
16
- "不要改 src/a.ts" => []
17
- ```
18
-
19
- 更严重的是**部分保护**造成静默改写。`src/core/generation.ts` 只匹配到 `/core/generation.ts`,前面的 `src` 裸露在外:
20
-
21
- ```
22
- 原稿 : 更新 src/core/generation.ts 的实现
23
- masked: 更新 src⟪DSH_KEEP_0⟫ 的实现
24
- 模型把 src 改成 lib → 恢复成 lib/core/generation.ts ← 不报错,路径已错
25
- ```
26
-
27
- **修复**:新增四条规则——带扩展名的相对路径、无扩展名的深层相对路径、带已知扩展名的裸文件名、已知的无扩展名工程文件(`LICENSE`、`Makefile` 等)。扩展名用**闭集**而非形状猜测,避免把 `e.g.` 这类普通缩写误判成文件。
28
-
29
- **验证**:`tests/core.test.ts` 新增 3 条用例,覆盖 6 种路径形态、`e.g.`/`i.e.` 不误保护、以及"目录部分不得裸露"的回归。core 用例 25 → 28。
30
-
31
- ### 2. 一次瞬时 status 轮询失败会静默杀死在途优化(`src/browser/controller.ts`)
32
-
33
- **问题**:状态轮询每 900ms 一次。`refresh()` 的 `catch` 分支注释写着"失败的 status 读取不构成草稿/模型/回合变化的证据",但紧接着调用 `invalidate(false)`,而 `invalidate` 第一行就是 `cancelActive()`。实测:点"优化"→ 一次网络抖动 → 请求被 abort、按钮复位、**没有任何提示**,用户的操作无声消失。
34
-
35
- **修复**:`invalidate` 增加 `cancelInFlight` 参数。瞬时 status 失败走 `invalidate(false, false)`:清掉自动建议缓存(灰字便宜且必须随连接失效而消失),但保留在途的手动优化。真正的状态变化路径仍完整取消。
36
-
37
- **验证**:`tests/browser-controller.test.ts` 新增 1 条用例,断言失败轮询后 `busy` 仍为 `optimize`、请求 `signal.aborted === false`、随后正常完成并生成改动记录。controller 用例 35 → 36。
38
-
39
- ### 3. `debounceMs > 900` 时输入续写完全失效(`src/browser/controller.ts`)
40
-
41
- **问题**:`driveSuggestions()` 第一行无条件 `clearTimer()`,末尾才重新 `setTimeout`。而它每 900ms 被状态轮询调用一次,于是**任何超过 900ms 的 debounce 定时器每 900ms 被清掉重建,永远等不到触发**。实测阈值是断崖式:
42
-
43
- ```
44
- debounce=899 → 1 次调用 debounce=901 → 0 次调用
45
- debounce=900 → 1 次调用 debounce=2000/5000 → 0 次调用
46
- ```
47
-
48
- 设置页把"续写停顿"暴露为 **200–5000 ms**,也就是说用户按界面允许的范围调大停顿,续写功能会悄悄消失且没有任何提示。默认 600ms 在安全区,所以既有测试发现不了。
49
-
50
- **修复**:记住已武装定时器对应的 cache key(`timerKey`)。`driveSuggestions()` 在各提前返回分支显式 `clearTimer()`;只有 key 变化时才重排定时器,key 未变则保留已武装的那个。
51
-
52
- **验证**:新增 2 条用例——`debounceMs` 取 200/600/900/1000/2000/5000 时 20 次轮询后都恰好触发 1 次;以及草稿在定时器触发前变化时会正确重排并携带新草稿。controller 用例 36 → 43。
53
-
54
- ### 4. 存储中的未知配置键会锁死整个插件(`src/core/config.ts`、`src/host/storage.ts`)
55
-
56
- **问题**:`resolveConfig` 对未知键直接抛 `CONFIG`,而设置是整份对象持久化的。版本漂移(新版本写入新键后用户降级,或记录被部分写入)会导致 `settings/get`、`status`、`generate`、`drafts/*` 全部失败,设置页也加载不出来,且**无法通过保存自愈**——`updateSettings` 把含坏键的旧对象再 merge 回去。
57
-
58
- **修复**:拆成两个入口。`resolveConfig` 保持严格(插件自身 Cordis 配置与每次 `settings/set` 补丁,调用方写错必须报错);新增 `resolveStoredConfig` 用于**读取已存记录**——未知键忽略、单字段非法回退默认值、`provider`/`model` 半填对回退为跟随输入框。下一次成功保存会重写成干净记录。
59
-
60
- **验证**:`tests/host-storage.test.ts` 新增 5 条用例:未知键不锁死、保存后坏键消失、逐字段回退、半填对丢弃、显式补丁仍严格。storage 用例 4 → 9。
61
-
62
- ### 5. 中文 diff 粒度过粗(`src/core/diff.ts`)
63
-
64
- **问题**:分词正则把不含空格的整段中文当作一个 token,于是 `请解释缓存机制` → `请说明缓存机制` 被渲染成整短语删除 + 整短语插入,中文用户基本看不出改了什么。
65
-
66
- **修复**:CJK 按码点切分,保留拉丁词/空白/标点的分组;同时先裁剪相同前后缀再做 DP,并保留超限时的降级路径(先句级,再整段替换),使最大长度草稿也不会卡住。
67
-
68
- **验证**:现有 diff 用例(无损重建、emoji 代理对不拆分)继续通过;人工核对 `解释`→`说明`、`不要修改`→`保持现有` 已是词级粒度。
69
-
70
- ### 6. 无界集合与调度器语义(`src/browser/controller.ts`、`src/core/scheduler.ts`、`src/host/runtime.ts`)
71
-
72
- - `exposed` 与 `nextTurns` 两个 Set 只增不减。加入 512 上限,与既有的 `completionCache` 64 上限保持一致。
73
- - `settings/set` 原来调用 `scheduler.dispose()`,语义上是"销毁调度器"却当"取消在途"用。拆出 `cancelAll()` 表达真实意图并补注释说明为何设置变更要取消所有会话的在途请求。
74
-
75
- ## 未改变的边界
76
-
77
- 以下与 `0.1.1` 一致,没有因为本次修正而变化:
78
-
79
- - 60 条固定合成质量集仍为 `not_evaluated`(0/60)。本次修正**没有**新增任何真实模型调用,也没有做人工语义标注。
80
- - 6 次小样本对照结论不变:只能说明接线可用,不能证明同类领先。
81
- - 未验证项仍是未验证:中文 IME 候选组合、附件/引用组合、完整官方 Web 组合、其他插件组合、非 Windows x64 平台。
82
- - 本次修正未在官方桌面端重新做原生手测;相关证据仍是 `0.1.1` 时期记录,版本号与哈希需以新的 `verification.json` 为准。
83
-
84
- ## 复现命令
85
-
86
- ```powershell
87
- # 类型检查与构建
88
- node node_modules/typescript/bin/tsc --noEmit
89
- node scripts/build.mjs
90
-
91
- # 全部自动化测试(121 条)
92
- node node_modules/vitest/vitest.mjs run
93
-
94
- # 实际打包产物的 Loader 校验
95
- node scripts/verify-package.mjs dist/dsh-input-assistant-0.1.2.tgz
96
-
97
- # 真实 Edge 中的编辑器回归
98
- node scripts/smoke-web.mjs
99
-
100
- # 评测集结构校验(0 次模型调用)
101
- node scripts/evaluate.mjs validate
102
- ```
1
+ # 0.1.2 修正记录
2
+
3
+ 记录日期:2026 年 10 月 23 日(Asia/Shanghai)。
4
+
5
+ `0.1.2` 是 `0.1.1` 的缺陷修正版本,不新增用户可见功能。以下每条都先复现、再修复、再补回归用例。测试总数从 **105** 增至 **121**(12 个测试文件)。
6
+
7
+ ## 修正清单
8
+
9
+ ### 1. 相对路径与裸文件名不受保护(`src/core/protection.ts`)
10
+
11
+ **问题**:`0.1.1` 的路径保护正则只覆盖代码块、行内代码、URL、盘符绝对路径(`C:\…`、`D:/…`)和以 `./` `../` `/` 开头的路径。编码类草稿里最常见的裸相对路径完全不保护:
12
+
13
+ ```
14
+ "修改 package.json 里的 scripts" => []
15
+ "看看 src/index.ts 的实现" => []
16
+ "不要改 src/a.ts" => []
17
+ ```
18
+
19
+ 更严重的是**部分保护**造成静默改写。`src/core/generation.ts` 只匹配到 `/core/generation.ts`,前面的 `src` 裸露在外:
20
+
21
+ ```
22
+ 原稿 : 更新 src/core/generation.ts 的实现
23
+ masked: 更新 src⟪DSH_KEEP_0⟫ 的实现
24
+ 模型把 src 改成 lib → 恢复成 lib/core/generation.ts ← 不报错,路径已错
25
+ ```
26
+
27
+ **修复**:新增四条规则——带扩展名的相对路径、无扩展名的深层相对路径、带已知扩展名的裸文件名、已知的无扩展名工程文件(`LICENSE`、`Makefile` 等)。扩展名用**闭集**而非形状猜测,避免把 `e.g.` 这类普通缩写误判成文件。
28
+
29
+ **验证**:`tests/core.test.ts` 新增 3 条用例,覆盖 6 种路径形态、`e.g.`/`i.e.` 不误保护、以及"目录部分不得裸露"的回归。core 用例 25 → 28。
30
+
31
+ ### 2. 一次瞬时 status 轮询失败会静默杀死在途优化(`src/browser/controller.ts`)
32
+
33
+ **问题**:状态轮询每 900ms 一次。`refresh()` 的 `catch` 分支注释写着"失败的 status 读取不构成草稿/模型/回合变化的证据",但紧接着调用 `invalidate(false)`,而 `invalidate` 第一行就是 `cancelActive()`。实测:点"优化"→ 一次网络抖动 → 请求被 abort、按钮复位、**没有任何提示**,用户的操作无声消失。
34
+
35
+ **修复**:`invalidate` 增加 `cancelInFlight` 参数。瞬时 status 失败走 `invalidate(false, false)`:清掉自动建议缓存(灰字便宜且必须随连接失效而消失),但保留在途的手动优化。真正的状态变化路径仍完整取消。
36
+
37
+ **验证**:`tests/browser-controller.test.ts` 新增 1 条用例,断言失败轮询后 `busy` 仍为 `optimize`、请求 `signal.aborted === false`、随后正常完成并生成改动记录。controller 用例 35 → 36。
38
+
39
+ ### 3. `debounceMs > 900` 时输入续写完全失效(`src/browser/controller.ts`)
40
+
41
+ **问题**:`driveSuggestions()` 第一行无条件 `clearTimer()`,末尾才重新 `setTimeout`。而它每 900ms 被状态轮询调用一次,于是**任何超过 900ms 的 debounce 定时器每 900ms 被清掉重建,永远等不到触发**。实测阈值是断崖式:
42
+
43
+ ```
44
+ debounce=899 → 1 次调用 debounce=901 → 0 次调用
45
+ debounce=900 → 1 次调用 debounce=2000/5000 → 0 次调用
46
+ ```
47
+
48
+ 设置页把"续写停顿"暴露为 **200–5000 ms**,也就是说用户按界面允许的范围调大停顿,续写功能会悄悄消失且没有任何提示。默认 600ms 在安全区,所以既有测试发现不了。
49
+
50
+ **修复**:记住已武装定时器对应的 cache key(`timerKey`)。`driveSuggestions()` 在各提前返回分支显式 `clearTimer()`;只有 key 变化时才重排定时器,key 未变则保留已武装的那个。
51
+
52
+ **验证**:新增 2 条用例——`debounceMs` 取 200/600/900/1000/2000/5000 时 20 次轮询后都恰好触发 1 次;以及草稿在定时器触发前变化时会正确重排并携带新草稿。controller 用例 36 → 43。
53
+
54
+ ### 4. 存储中的未知配置键会锁死整个插件(`src/core/config.ts`、`src/host/storage.ts`)
55
+
56
+ **问题**:`resolveConfig` 对未知键直接抛 `CONFIG`,而设置是整份对象持久化的。版本漂移(新版本写入新键后用户降级,或记录被部分写入)会导致 `settings/get`、`status`、`generate`、`drafts/*` 全部失败,设置页也加载不出来,且**无法通过保存自愈**——`updateSettings` 把含坏键的旧对象再 merge 回去。
57
+
58
+ **修复**:拆成两个入口。`resolveConfig` 保持严格(插件自身 Cordis 配置与每次 `settings/set` 补丁,调用方写错必须报错);新增 `resolveStoredConfig` 用于**读取已存记录**——未知键忽略、单字段非法回退默认值、`provider`/`model` 半填对回退为跟随输入框。下一次成功保存会重写成干净记录。
59
+
60
+ **验证**:`tests/host-storage.test.ts` 新增 5 条用例:未知键不锁死、保存后坏键消失、逐字段回退、半填对丢弃、显式补丁仍严格。storage 用例 4 → 9。
61
+
62
+ ### 5. 中文 diff 粒度过粗(`src/core/diff.ts`)
63
+
64
+ **问题**:分词正则把不含空格的整段中文当作一个 token,于是 `请解释缓存机制` → `请说明缓存机制` 被渲染成整短语删除 + 整短语插入,中文用户基本看不出改了什么。
65
+
66
+ **修复**:CJK 按码点切分,保留拉丁词/空白/标点的分组;同时先裁剪相同前后缀再做 DP,并保留超限时的降级路径(先句级,再整段替换),使最大长度草稿也不会卡住。
67
+
68
+ **验证**:现有 diff 用例(无损重建、emoji 代理对不拆分)继续通过;人工核对 `解释`→`说明`、`不要修改`→`保持现有` 已是词级粒度。
69
+
70
+ ### 6. 无界集合与调度器语义(`src/browser/controller.ts`、`src/core/scheduler.ts`、`src/host/runtime.ts`)
71
+
72
+ - `exposed` 与 `nextTurns` 两个 Set 只增不减。加入 512 上限,与既有的 `completionCache` 64 上限保持一致。
73
+ - `settings/set` 原来调用 `scheduler.dispose()`,语义上是"销毁调度器"却当"取消在途"用。拆出 `cancelAll()` 表达真实意图并补注释说明为何设置变更要取消所有会话的在途请求。
74
+
75
+ ## 未改变的边界
76
+
77
+ 以下与 `0.1.1` 一致,没有因为本次修正而变化:
78
+
79
+ - 60 条固定合成质量集仍为 `not_evaluated`(0/60)。本次修正**没有**新增任何真实模型调用,也没有做人工语义标注。
80
+ - 6 次小样本对照结论不变:只能说明接线可用,不能证明同类领先。
81
+ - 未验证项仍是未验证:中文 IME 候选组合、附件/引用组合、完整官方 Web 组合、其他插件组合、非 Windows x64 平台。
82
+ - 本次修正未在官方桌面端重新做原生手测;相关证据仍是 `0.1.1` 时期记录,版本号与哈希需以新的 `verification.json` 为准。
83
+
84
+ ## 复现命令
85
+
86
+ ```powershell
87
+ # 类型检查与构建
88
+ node node_modules/typescript/bin/tsc --noEmit
89
+ node scripts/build.mjs
90
+
91
+ # 全部自动化测试(121 条)
92
+ node node_modules/vitest/vitest.mjs run
93
+
94
+ # 实际打包产物的 Loader 校验
95
+ node scripts/verify-package.mjs dist/dsh-input-assistant-0.1.2.tgz
96
+
97
+ # 真实 Edge 中的编辑器回归
98
+ node scripts/smoke-web.mjs
99
+
100
+ # 评测集结构校验(0 次模型调用)
101
+ node scripts/evaluate.mjs validate
102
+ ```