dsh-openwrite 0.2.26 → 0.2.28

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 (37) hide show
  1. package/README.md +16 -4
  2. package/docs/CLOSED_ISSUE_FOLLOWUPS.md +35 -0
  3. package/docs/CONTEXT_SLOTS.md +60 -0
  4. package/docs/EDITOR_SAFETY_REPAIRS.md +17 -0
  5. package/docs/ISSUES_105_113.md +4 -1
  6. package/docs/ISSUES_121_123.md +97 -0
  7. package/docs/ISSUES_98_100.md +2 -0
  8. package/docs/ISSUE_123_FOLLOWUP.md +54 -0
  9. package/docs/OPENCODE_GO.md +24 -18
  10. package/docs/RELEASE_ACCEPTANCE.md +89 -1
  11. package/docs/SELECTION_UPGRADE_REPAIRS.md +16 -0
  12. package/docs/TOOLS.md +1356 -0
  13. package/dog-tools.mjs +5 -3
  14. package/package.json +5 -4
  15. package/packages/openwrite-bridge/lib/contracts-generated.js +9 -0
  16. package/packages/openwrite-bridge/lib/dog-delivery.js +7 -3
  17. package/packages/openwrite-bridge/lib/managed-runtime.d.ts +1 -0
  18. package/packages/openwrite-bridge/lib/managed-runtime.js +22 -2
  19. package/packages/openwrite-bridge/lib/tool-policy.js +2 -0
  20. package/packages/openwrite-bridge/lib/tools.js +28 -5
  21. package/packages/studio-panel/lib/client.js +821 -544
  22. package/packages/studio-panel/lib/client.js.map +1 -1
  23. package/packages/studio-panel/lib/types/client/VditorBody.d.ts +7 -1
  24. package/packages/studio-panel/lib/types/client/dto.d.ts +2 -0
  25. package/packages/studio-panel/lib/types/client/locales.d.ts +1 -1
  26. package/packages/studio-panel/lib/types/client/manuscript-annotations.d.ts +2 -1
  27. package/packages/studio-panel/lib/types/client/manuscript-overlay.d.ts +2 -1
  28. package/packages/studio-panel/lib/types/client/manuscript-selection.d.ts +18 -5
  29. package/packages/studio-panel/lib/types/client/selection-coordinates.d.ts +15 -0
  30. package/preset-definition.mjs +1 -1
  31. package/release/{openwrite-5.8.14-py3-none-any.whl → openwrite-5.8.20-py3-none-any.whl} +0 -0
  32. package/release/runtime-manifest.json +6 -5
  33. package/release/source.json +3 -3
  34. package/scripts/safe-upgrade.mjs +104 -9
  35. package/vendor/dsh-dog/lib/{core-BAlgZpLq.js → core--byUPJL8.js} +129 -12
  36. package/vendor/dsh-dog/lib/core.js +1 -1
  37. package/vendor/dsh-dog/lib/index.js +54 -103
package/README.md CHANGED
@@ -27,6 +27,16 @@
27
27
  这是 [OpenWrite](https://github.com/LiPu-jpg/Openwrite/tree/native-core) 的 dsh 插件版本。
28
28
  [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 提供 Agent 与交互界面,OpenWrite Core 提供小说领域能力;人物、设定、大纲、正文和评审保存在本地作品目录。
29
29
 
30
+ ## 开发中:0.2.28(未发布)
31
+
32
+ Core 5.8.20 候选继续修复正文最后输入漏存、审稿修订越过选区,以及真实 Markdown 编辑器格式转换导致的选区拒绝,见 [正文编辑与审稿补修](docs/EDITOR_SAFETY_REPAIRS.md)。前轮修复见 [选区与升级补修](docs/SELECTION_UPGRADE_REPAIRS.md)。宿主正式发布与 Android/Termux 真机两项继续跟踪,本轮不发布;下面的 npm/GitHub 安装入口仍为已发布的 0.2.27。
33
+
34
+ ## 0.2.27
35
+
36
+ 工作台新增 OpenCode Go Console 认证,捆绑 Core 5.8.16,自动读取本机官方 CLI 的有效凭据和工作区信息;不必手工复制会过期的 Console 令牌。评审首次调用遵守模型输出预算,补充旧会话永久别名和跨平台回归。真实工作台连接测试、流式写作及 Go 安全评审已通过。见 [OpenCode Go 接入](docs/OPENCODE_GO.md) 和 [旧报告复核与待办](docs/CLOSED_ISSUE_FOLLOWUPS.md)。正式发行状态、各平台验收和安装包校验值见 [发布验收](docs/RELEASE_ACCEPTANCE.md)。
37
+
38
+ [GitHub 0.2.27](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.27) 与 [npm 0.2.27](https://www.npmjs.com/package/dsh-openwrite/v/0.2.27) 均已发布,`@latest` 已更新到 0.2.27。两处公开下载包均与 CI 验收包逐字节一致,可使用下方安装命令获取本次修复。
39
+
30
40
  ## 0.2.26 更新
31
41
 
32
42
  本版捆绑 Core **5.8.14**,包含旧会话恢复、精确 DSH `0.2.1-rc.3` 兼容、
@@ -36,12 +46,12 @@ Android/ARM 外部 Studio 诊断,以及连载写作可靠性、完整上下文
36
46
 
37
47
  ## 快速安装
38
48
 
39
- **0.2.26 标准插件包**兼容精确 dsh 版本 **0.1.2-rc.1 / 0.1.5-alpha.1 / 0.2.0-rc.2 / 0.2.1-rc.2 / 0.2.1-rc.3**。五个版本均已完成 Web 工作台渲染与 DoG 数据读取验证,Windows Electron 桌面端启动/恢复链路尚未实机复测。可下载版本、各平台验收结果和 SHA-256 以 [GitHub Release](https://github.com/LiPu-jpg/Openwrite/releases/latest) 附件为准;验收方法见 [发布验收](docs/RELEASE_ACCEPTANCE.md)。商城所需的精确预览版兼容性、验证范围和安装限制见 [DSH STORE 接入](docs/DSH_STORE.md)。
49
+ **0.2.27 标准插件包**兼容精确 dsh 版本 **0.1.2-rc.1 / 0.1.5-alpha.1 / 0.2.0-rc.2 / 0.2.1-rc.2 / 0.2.1-rc.3**。五个版本均已完成 Web 工作台渲染与 DoG 数据读取验证,Windows Electron 桌面端启动/恢复链路尚未实机复测。可下载版本、各平台验收结果和 SHA-256 以 [GitHub Release](https://github.com/LiPu-jpg/Openwrite/releases/latest) 附件为准;验收方法见 [发布验收](docs/RELEASE_ACCEPTANCE.md)。商城所需的精确预览版兼容性、验证范围和安装限制见 [DSH STORE 接入](docs/DSH_STORE.md)。
40
50
 
41
- 正式发布状态以 [npm](https://www.npmjs.com/package/dsh-openwrite) 的 `latest` 与对应 GitHub Release 为准;两处使用同一份验收产物。也可安装精确版本的 Release 包:
51
+ 正式发行状态以 [npm 版本列表](https://www.npmjs.com/package/dsh-openwrite?activeTab=versions) 和 [GitHub Release](https://github.com/LiPu-jpg/Openwrite/releases/latest) 为准。以下是 0.2.27 精确版本的安装命令;发布时两处使用同一份验收产物:
42
52
 
43
53
  ```sh
44
- dsh plugin --profile web add -w https://github.com/LiPu-jpg/Openwrite/releases/download/v0.2.26/dsh-openwrite-0.2.26.tgz
54
+ dsh plugin --profile web add -w https://github.com/LiPu-jpg/Openwrite/releases/download/v0.2.27/dsh-openwrite-0.2.27.tgz
45
55
  dsh web
46
56
  ```
47
57
 
@@ -71,7 +81,7 @@ dsh web
71
81
 
72
82
  ### dsh 0.2 桌面端升级
73
83
 
74
- `0.2.26`(Core 5.8.14)包含 #105–#114 修复,以及 #103/#104 的 Embedding 维度和配置改进。升级前完全退出 dsh/桌面客户端;安装后重新启动并刷新浏览器。原有作品、凭据和会话继续保留,历史版本预设用于恢复旧会话。受限平台使用外部 Studio,OpenCode Go 的服务商使用范围和配置要求见上述文档。
84
+ `0.2.27`(Core 5.8.16)包含 Go 工作台认证、评审输出预算及后台重试补漏,并保留 #105–#113 与 #103/#104 的既有修复;原始场景仍待验证的条目见 [#123](https://github.com/LiPu-jpg/Openwrite/issues/123)。升级前完全退出 dsh/桌面客户端;安装后重新启动并刷新浏览器。原有作品、凭据和会话继续保留,历史版本预设用于恢复旧会话。受限平台使用外部 Studio,OpenCode Go 的服务商使用范围和配置要求见上述文档。
75
85
 
76
86
  `0.2.25`(Core 5.8.12)已在 [GitHub Release](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.25) 与 [npm](https://www.npmjs.com/package/dsh-openwrite/v/0.2.25) 发布,新增连载体检、分段续写、共享术语/范本、章组审计和漂移裁决,并修复验收与任务可观测性。范围、离线升级工具及宿主侧限制见 [#98–#100 实现说明](docs/ISSUES_98_100.md),完整验收见 [发布验收](docs/RELEASE_ACCEPTANCE.md#025)。
77
87
 
@@ -162,6 +172,8 @@ dsh web
162
172
  |---|---|
163
173
  | [安装指南](docs/INSTALL.md) | Agent 安装步骤、手动安装、模型配置、升级和排错 |
164
174
  | [使用流程](docs/WORKFLOWS.md) | Workspace、规划、写章、审稿、修订、导入导出 |
175
+ | [工具参考](docs/TOOLS.md) | 全部 novel_* 工具的作用、操作影响、必填与可选参数 |
176
+ | [写手上下文槽位](docs/CONTEXT_SLOTS.md) | 来源文件、选择规则、动态预算、压缩与逐文档用量 |
165
177
  | [模型测试](docs/BENCHMARK_TASKS.md) | 章节选择、大纲范围、任务 DAG 和结果解读 |
166
178
  | [审稿 DAG](docs/REVIEW_DAG_FRAMEWORK.md) | 标准评审框架与证据结构 |
167
179
  | [工程说明](docs/DEVELOPMENT.md) | 组件职责、维护命令、调研和改进记录 |
@@ -0,0 +1,35 @@
1
+ # 已关闭报告复核与后续验证
2
+
3
+ 2026-10-26 复核重点为 #105–#114,以及 #65、#76、#88–#100 的相关修复。
4
+ “源码合并”“回归通过”“原始环境通过”“正式发布”分别记录,不以 issue 关闭代替四项证据。
5
+
6
+ ## 本次补漏(0.2.27 / Core 5.8.16)
7
+
8
+ - #69:旧实现首次评审仍把 24000 输出上限压到 4096,只有成功返回 reasoning usage 后才抬高后续预算。安全门和单项评审可能直接失败。现在从首次调用使用配置上限,同时遵守上下文限制;达到上限后按检查项拆分,不重复相同上限的请求。显式较小预算的重试会重新预留输入空间。完整 Core 1478 passed / 32 skipped。
9
+ - #109 B-13:新增真实 HTTP 预览、应用、撤销及精确字节校验,覆盖 LF / CRLF、行中 `> `、结束标题保留和不换行空格造成的真实不匹配;工具层覆盖 edits 数组与 JSON 字符串的逐字透传。以上均通过,原报告失败仍待脱敏最小复现,不能声称原问题已被证实修复。
10
+ - #105:永久兼容列表补充 0.2.26/27,发布测试要求每个新版本身份进入永久列表,避免迁移旧会话而没有旧目录后失效。预设生命周期、停机升级和运行时测试加入原生安装矩阵,包括 Windows Node。该自动化不替代 Electron 历史会话人工验收。
11
+ - 运行时:跨平台回归发现自动恢复耗尽后的手动重试可能复用尚未清理的旧启动 promise,返回失效连接。现在等待旧启动结束后重新准备;并发重试共享新连接,后来发生的取消优先。五项可控时序回归在旧实现上失败,修复后通过。
12
+ - #114:本版包含 Core 5.8.15 的工作台 Console 认证、自动工作区头与请求前凭据更新。此前真实工作台连接/流式写作通过;此次真实 Go 安全评审首次请求 max_tokens=24000,流式调用 4.424 秒通过,没有写入作者正文或作品配置。
13
+
14
+ ## 后续实机证据(2026-10-27)
15
+
16
+ 报告者已补充[旧会话恢复记录](https://github.com/LiPu-jpg/Openwrite/issues/123#issuecomment-6422870871)和 [B-13 Windows 实测](https://github.com/LiPu-jpg/Openwrite/issues/123#issuecomment-6423904648):旧预设目录缺失时历史会话正常打开;行首/行中 `>`、混合行尾锚点预览通过。两项原场景验证据此完成,不再索要同一材料。此前“待最小复现/实机”的记录反映当时证据边界;新补修与候选状态见 [#123 回复补修](ISSUE_123_FOLLOWUP.md)。
17
+
18
+ ## 保留的未完成工作
19
+
20
+ 统一跟踪:[issue #123](https://github.com/LiPu-jpg/Openwrite/issues/123)。
21
+
22
+ | 来源 | 已有证据 | 尚待完成 |
23
+ | --- | --- | --- |
24
+ | #98.1 | 独立停机旁路升级工具已发布;宿主候选补丁通过 Windows/Linux 专项 CI。 | [fork PR #1](https://github.com/LiPu-jpg/deepseek-harness/pull/1) 尚未成为正式宿主;[上游讨论](https://github.com/deepseek-ai/deepseek-harness/discussions/10745) 继续跟踪。原生安装命令不受插件工具保护。 |
25
+ | #111 | 不支持平台返回明确错误并提供外部 Studio 配置;原报告接受此降级方向。 | Android/Termux 真机与外部 Studio 实测;当前没有 Android 原生运行时。 |
26
+
27
+ 后续独立反馈 [#121](https://github.com/LiPu-jpg/Openwrite/issues/121)、[#122](https://github.com/LiPu-jpg/Openwrite/issues/122) 已修复、验收并合并关闭;候选尚未发布。关闭代码报告不代替上述两项外部条件。
28
+
29
+ ## 后续关闭条件
30
+
31
+ 1. 记录原始失败版本、平台、实际工具入口与最小复现;未复现时明确写待复现。
32
+ 2. 检查 tool schema、参数序列化、HTTP、应用服务、核心逻辑和实际模型请求,按问题涉及的完整路径验收。
33
+ 3. 为复现增加会在旧实现上失败的行为回归;用量、预算和部分完成状态必须如实报告。
34
+ 4. 记录已合并提交及用户可安装的版本;只合并源码时标待发布。
35
+ 5. 实机验收或上游依赖没有完成时保留独立跟踪,汇总 issue 的关闭不自动完成这些待办。
@@ -0,0 +1,60 @@
1
+ # 写手上下文槽位参考
2
+
3
+ 本表对应候选 Core 5.8.20,来源提交 `9611c654e5d77bcb5968105a7adfa8e9b4f9624a`。由捆绑 wheel 的 SECTION_SOURCES、保护规则和 shares 生成,共 20 个来源条目,包含兼容别名;不是每次写作都会装满这些槽位。
4
+
5
+ ## 看本章实际用了什么
6
+
7
+ 先用 `novel_context_preview {"chapter":"ch_001","include_agent_payload":true}`;要看所选 writer 档案、guidance 与 target_words 的最终输入,使用 `novel_write_chapter {"chapter_id":"ch_001","dry_run":true}`。这些预览不发起写作模型请求。
8
+
9
+ `context_manifest.items` 提供实际槽位、来源指纹、字符数、估算 token、保护/压缩状态;`documents` 列出 character/setting/style 每份文档原始与装配字符数、compressed/excluded。`missing_items` 与 `excluded_items` 解释缺失/排除。来源目录是候选来源,不能把目录中所有文件都当成实际已送给模型的文档。
10
+
11
+ ## 预算怎样分配
12
+
13
+ 没有固定的每槽字符上限。先按模型上下文窗、输出预留和安全余量计算输入预算;未超预算保持原文。受保护硬约束先占预算,装不下就明确失败;不会静默删掉它们。其余容量换算为字符后,按以下 shares 归一化分配(这不是整窗百分比):
14
+
15
+ | 配额组 | 默认权重 |
16
+ | --- | --- |
17
+ | historical_outline | 0.08 |
18
+ | current_outline | 0.08 |
19
+ | previous_chapter | 0.18 |
20
+ | protagonist_state | 0.04 |
21
+ | characters | 0.13 |
22
+ | settings | 0.08 |
23
+ | style | 0.12 |
24
+
25
+ style 权重可用 novel_config.yaml 的 context_style_share 调整,限制在 0.01–0.5。风格容量还会优先保留最多 4000 字符的已有风格(不超过可选总容量的一半),其余组随剩余容量缩放。最终仍检查 token 总量。
26
+
27
+ 多文档按各自容量占比分配;同优先级按名称排序,剩余字符依次补给。设置/角色通常截取开头,上一章正文保留结尾;配额为零的文档排除。风格优先顺序见下表。目录表里的 level 是来源层级,不是逐层删除顺序。
28
+
29
+ ## 来源、选择和消费者
30
+
31
+ | 槽位 | 层级 | 作品根目录内来源 | 预算 | 选择/压缩规则 | 谁读 |
32
+ | --- | --- | --- | --- | --- | --- |
33
+ | `author_intent` | 3 | `src/story/author_intent.md` | 受保护,不截断 | 作者意图;完整保留硬约束 | 章节装配/兼容输入 → writer;manifest 展示 |
34
+ | `creative_focus` | 1 | `src/story/current_focus.md` | 受保护,不截断 | 创作罗盘;完整保留硬约束 | 章节装配/兼容输入 → writer;manifest 展示 |
35
+ | `story_background` | 3 | `src/story/background.md`、`src/story/foundation.md` | 受保护,不截断 | 兼容别名;有 core_documents 时 manifest 隐藏重复项 | 章节装配/兼容输入 → writer;manifest 展示 |
36
+ | `core_documents` | 3 | `src/story/background.md`、`src/story/foundation.md` | 受保护,不截断 | 故事背景与基础正典;完整保留 | 章节装配/兼容输入 → writer;manifest 展示 |
37
+ | `historical_arc_summaries` | 4 | `src/outline.md` | historical_outline | 已结束篇摘要;按摘要文档分配,截取开头 | 章节装配/兼容输入 → writer;manifest 展示 |
38
+ | `current_arc_sections` | 2 | `src/outline.md` | current_outline | 当前篇各节摘要;按摘要文档分配,截取开头 | 章节装配/兼容输入 → writer;manifest 展示 |
39
+ | `chapter_requirements` | 0 | `src/outline.md` | 受保护,不截断 | 当前章目标、节拍、悬念、章节承诺 promise/payoff_of 与登记的扩展字段;完整保留 | 章节装配/兼容输入 → writer;manifest 展示 |
40
+ | `scene_context` | 0 | `data/story_structure/scenes.json` | 受保护,不截断 | 仅当前正文版本匹配的场景结构;过期时排除并诊断 | ContextBuilder → writer;manifest 展示 |
41
+ | `previous_chapter_content` | 0 | `data/manuscript/` | previous_chapter | 默认上一章全文;可选 tail/有效 summary;预算压力下保留结尾 | 章节装配/兼容输入 → writer;manifest 展示 |
42
+ | `character_states` | 1 | `data/manuscript/`、`src/outline.md` | 由 ContextBuilder/检索预算决定 | ContextBuilder 提取本章涉及人物的行内状态;受该装配器预算约束 | ContextBuilder → writer;manifest 展示 |
43
+ | `semantic_references` | 4 | `data/manuscript/`、`data/sources/` | 由 ContextBuilder/检索预算决定 | ContextBuilder 语义检索的远距离正文/资料;需可用的独立 Embedding 档案;受检索与装配预算约束 | ContextBuilder → writer;manifest 展示 |
44
+ | `protagonist_state` | 1 | `data/world/current_state.md` | protagonist_state | 本章涉及人物的当前状态;可选区按配额截取 | 章节装配/兼容输入 → writer;manifest 展示 |
45
+ | `current_state` | 3 | `data/world/current_state.md` | 受保护,不截断 | 兼容连续性字段;有 continuity_documents 时隐藏重复项 | 章节装配/兼容输入 → writer;manifest 展示 |
46
+ | `ledger` | 3 | `data/world/ledger.md` | 受保护,不截断 | 兼容粒子台账;有 continuity_documents 时隐藏重复项 | 章节装配/兼容输入 → writer;manifest 展示 |
47
+ | `relationships` | 3 | `data/world/relationships.md` | 受保护,不截断 | 兼容人物关系;有 continuity_documents 时隐藏重复项 | 章节装配/兼容输入 → writer;manifest 展示 |
48
+ | `character_documents` | 2 | `src/characters/` | characters | 只选本章涉及人物;按文档容量分配、保留开头 | 章节装配/兼容输入 → writer;manifest 展示 |
49
+ | `concept_documents` | 2 | `src/world/` | settings | setting_documents 的兼容别名;不重复计算 | 章节装配/兼容输入 → writer;manifest 展示 |
50
+ | `setting_documents` | 2 | `src/world/`、`src/progression/` | settings | 世界规则/术语/时间线 + 本章涉及实体 + 全部 YAML 进阶体系;按文档容量分配、保留开头 | 章节装配/兼容输入 → writer;manifest 展示 |
51
+ | `continuity_documents` | 3 | `data/world/`、`data/foreshadowing/` | 受保护,不截断 | 运行态正典 current_state/ledger/relationships;完整保留 | 章节装配/兼容输入 → writer;manifest 展示 |
52
+ | `style_documents` | 3 | `data/style/`、`craft/` | style | 作品风格与 craft;优先 work.composed/manifest/fingerprint/craft,再按文档容量分配 | 章节装配/兼容输入 → writer;manifest 展示 |
53
+
54
+ ## 渐进摘要与进阶体系
55
+
56
+ `progressive_compressor` 是较早的分节/分篇摘要组件:节摘要目标约 800 字符,篇摘要目标约 2000 字符,优先首尾、关键词和事件,降低对话优先级并在句子边界截断。它不是上表 ChapterAssemblerV2 的逐槽预算器;不要把旧组件的目标长度当成当前每槽固定预算。
57
+
58
+ 作者在资产页创建的进阶体系保存于 `src/progression/<id>.yaml`。本候选实际加载 .yaml/.yml 为 `setting_documents[progression.<id>]`,经过同一设置预算进入 writer,并出现在逐文档用量里;即使没有 world/ 目录也可加载。文件存在不保证预算不足时完整送达,写前应核对预览。
59
+
60
+ 工具参数与修改方式见 [工具参考](TOOLS.md)。
@@ -0,0 +1,17 @@
1
+ # 正文编辑与审稿选区补修
2
+
3
+ 候选 0.2.28 / Core 5.8.20,尚未发布。原先 22 项检查没有覆盖编辑器延迟回调、审稿选区上限与真实 Markdown 序列化;本轮三项均先复现,再修复并增加行为回归。
4
+
5
+ | 缺口 | 修复后行为 | 验证 |
6
+ | --- | --- | --- |
7
+ | 输入后立即保存或离开,最后一段未进入延迟回调 | 首次 DOM 输入立即启用保存;保存、离开和相关操作前同步收集最新正文。切章/切工作区时,只保存到原正文的恢复草稿;明确放弃后不复活旧稿。 | 9 项真实 CreationView/VditorBody 生命周期测试,含首次输入、未 blur 的保存、切工作区/章节、加载失败后重试保护、明确丢弃、未编辑对照。 |
8
+ | “按审稿改这段”扩大到选区外 | 按实际锚点优先选择问题;传递完整原文选区,服务端在生成前验证准确片段、版本和问题范围。问题证据可与选区部分重叠,生成范围始终限定为作者选区。 | 重复句和部分选区,经同步/后台真实 HTTP;重新生成/应用保留上限,选区外问题及不匹配拒绝且零调用。 |
9
+ | Vditor 自动补换行/调整空行后拒绝未编辑的正文 | 加载时记录原文与实际序列化结果,仅对这一对文本支持末尾换行、标题空行和连续换行的范围映射。其余字符、NBSP、后续作者改动、版本变化和不明确边界仍拒绝。 | 真实候选包 Vditor、独立 Studio 编辑器包装、Core 与原生面板映射模块共 9 组浏览器场景;额外 3 项独立 Studio 实际绑定代码测试。 |
10
+
11
+ 正文不会为了通过映射而被静默规范化。批注提示、定位及选区请求使用同一份源范围映射。常规“按所选问题修订”入口不提供 selection 时仍保留原语义;选区入口不能仅凭 original_text 猜重复句位置。
12
+
13
+ `novel_revision_create_from_review` 新增可选 `selection: {start,end,original_text}`,start/end 是保存原文的 Unicode 码点下标,保留原始 CR/LF。传递当前 `expected_document_revision` 与 `expected_review_revision`。旧界面只带 original_text 而没有明确选区时返回 INVALID_SELECTION,请刷新界面重新选择。
14
+
15
+ 本地 Core 1550 passed / 32 skipped,真实 HTTP 14 passed,界面 336 passed,managed 34 passed,完整插件检查通过。Core wheel 的 499 个运行时源文件逐字节一致,163 个应打包 Python 文件无遗漏。原生安装矩阵额外对同一候选 tarball 中的真实 Vditor/独立编辑器和两端映射器运行 9 组场景,结果写入每份原生报告的 editorSerialization 字段。
16
+
17
+ 测试不调用付费模型,不写作者作品或真实 profile。最终跨平台回执见[发布验收](RELEASE_ACCEPTANCE.md)。#123 的宿主正式发布和 Android/Termux 真机验收仍保留,本次不发布。
@@ -1,9 +1,11 @@
1
1
  # 升级恢复与宿主兼容修复(0.2.26)
2
2
 
3
3
  - #105:0.2 宿主的新会话使用稳定 ID `openwrite`。为历史 `openwrite-0-2-1` 至
4
- `openwrite-0-2-25`、当前版本及现存版本目录注册兼容定义;已有同 ID 自定义定义优先。
4
+ `openwrite-0-2-27`、当前版本及现存版本目录注册兼容定义;已有同 ID 自定义定义优先。
5
5
  会话日志与缓存不改写。0.1 所需的版本目录在宿主退出后保留,避免下次恢复悬空引用。
6
6
  历史兼容项会出现在宿主预设列表中,这是当前 registry 无 alias API 的限制。
7
+ 0.2.27 补充 0.2.26/27 的永久别名,并用发布门禁要求新版本身份进入永久列表,
8
+ 避免迁移会话但未复制旧预设目录后再次失效。
7
9
  - #106 / #107 / #108 / #110 / #112 / #113:根包、bridge、panel、DoG 的精确兼容声明、
8
10
  peer 和 lock 元数据同步加入 `0.2.1-rc.3`,保留旧宿主构建基线;发布矩阵加入该版本。
9
11
  - #111:不支持的平台返回 `RUNTIME_PLATFORM_UNSUPPORTED`(503),包含平台与下一步;
@@ -13,3 +15,4 @@
13
15
  DSH `0.2.1-rc.3` 隔离 Web 浏览器验收通过:版本闸门、客户端激活、预设选择、作品导航、
14
16
  工作台三页签、实际渲染、DoG 快照与其他插件共存;模型调用 0。
15
17
  未在 Windows Electron 或 Android 真机复测;完整发布状态与制品验收以 [GitHub Release](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.26) 和 [发布验收](RELEASE_ACCEPTANCE.md) 为准。
18
+ 未完成的原始场景验收与宿主发布统一保留在 [#123](https://github.com/LiPu-jpg/Openwrite/issues/123)。
@@ -0,0 +1,97 @@
1
+ # #121–#123 与 #128 修复验证记录(已合并,未发布)
2
+
3
+ 本轮按“先修能修的”处理。以下变更尚未发布到 npm 或 GitHub Release,公开版本仍为 0.2.27。
4
+ 没有原始复现、没有设备或仍依赖上游的项目继续保留,不能用自动测试代替这些证据。
5
+
6
+ ## 修复范围
7
+
8
+ | 报告条目 | 开发分支中的变更 | 验证方式 |
9
+ | --- | --- | --- |
10
+ | #121 B-18 | JavaScript 验收脚本使用 Electron 的 Node 子进程模式;不再把脚本交给桌面应用模式运行。 | 真实 Electron 44.7.0 执行 ESM;旧实现失败、修复后通过;追加 Linux/macOS/Windows CI。 |
11
+ | B-19 | 区分脚本缺失、启动失败、非零退出、超时、输出超限和输出格式错误;保留退出码、stderr 尾部及前 200 字节完整 UTF-8 输出。 | 真实子进程成功、退出 3、错误输出、缺失文件和取消回归。 |
12
+ | B-20 / #122 F-10 | 生成前被阻止的请求也留下失败运行;保留每次运行的错误。已取消/失败的历史记录不再被后续验收改成运行中。删除章节后的运行继续存在于归档,可显式列出并定位原始产物。 | 三次被阻止的请求留下三份 V1/V2 记录;删除归档后的历史与原始字节读取;取消后再次写作不改写旧运行。 |
13
+ | B-21 / F-13 | 返回结构化 `delivery_diagnostics`,列出未定论检查、未评范围、服务商错误和实际未提供的上下文字段。保留兼容的字符串 `delivery_reason`。不从“正典检查未定论”直接推断一定缺结算;降级后的总分为 null,并给 `score_valid`。 | 正典与部分审稿诊断、评分有效性、持久化和 DoG 消费回归。 |
14
+ | B-23 | 区分流水线执行完成、作者确认和 DoG 交付判定;工作流页提示“审稿执行完成”不代表交付通过。 | 下方映射表;工作流组件回归。 |
15
+ | B-24 | 分别返回 Agent 会话缺失、plan 模式、沙盘策略服务不可用、只读沙盘的具体代码与恢复提示。只读 DoG 查询继续可用。 | 四类拒绝条件及只读放行回归。 |
16
+ | B-25 / F-12 | 工作流页展示作者确认的工具入口、参数及核对顺序;不自动代替作者确认,也不把确认当成补跑结算。 | 组件显示确认提示与执行/交付区别。 |
17
+ | #122 F-01 | 现有异步写作/取消接口接上请求内模型取消;流式接收时检查取消并关闭流,停止后续模型请求。每段更新草稿,而非只保留第一段;恢复部分草稿创建新运行,核对上下文、源文件和项目配置。 | 流关闭及部分正文保留;取消→拒绝变化后的输入且零新增调用→恢复原输入续写→分阶段提交;旧取消记录保持不变。 |
18
+ | F-02 | 每次写作模型请求记录阶段、分段号、重试次数、reasoning token、用量及提供方成本。V2 的 draft/fact_extract/settle 分别保存自己的用量;失败请求和部分稿保留用量记录。 | 分段与失败调用账本、reasoning 明细相加、阶段用量归属、提供方零费用和缺失费用回归。 |
19
+ | F-03 | 项目可选择上一章全文、结尾字符或已核对的章节摘要;摘要缺失/过期会明确报错。 | 两层上下文组装与实际 writer 预览一致。 |
20
+ | F-04 | `novel_review_chapter` 增加 `depth=quick/full` 和域选择。quick 审 coherence/canon/prose 与 safety;已选范围单独报告分数与结论,不冒充完整交付批准。 | 参数透传、非法范围拒绝、部分范围全通过而整章仍未批准。 |
21
+ | F-05 | manifest 按文档记录原始/组装字符数及 compressed/excluded,包含 craft 文档。 | 预算压力下逐份字符数与实际组装文本一致。 |
22
+ | F-06 | `novel_write_chapter(dry_run=true)` 组装所选模型档案下的 writer 输入,包含传入的 guidance/target_words 与文档尺寸,不创建写作任务。 | 工具→HTTP 路由参数测试;Studio dry-run 不调用 writer。 |
23
+ | F-07 | `outline_extra_keys` 允许登记章级扩展字段,解析、缓存、受保护的章节要求和 writer 大纲均保留;未登记字段有解析诊断及警告。 | 大纲源→缓存→双层上下文→writer 预览回归。 |
24
+ | F-09 | 同一来源对同一组章节、同一正文版本重复接纳复用操作,不重复失效化。不同来源(例如历史恢复)仍保留独立操作语义。 | 重复请求无额外写入;正文变化生成新操作;历史恢复既有回归。 |
25
+ | F-11 | 单章和批量工具均明确异步返回 task_id;单章可取消,连续写作以批次任务查询进度。 | 工具描述、任务接口与取消回归;不另造重复的异步入口。 |
26
+ | #128 D-01 / D-02 | 新增作者可查的 [95 项工具参考](TOOLS.md) 与 [上下文槽位参考](CONTEXT_SLOTS.md),README 提供入口。工具参数从注册定义生成;槽位、来源、保护规则和默认配额从固定 Core 源码生成。进阶体系 YAML 实际进入设定上下文,参与原有预算与逐文档用量。 | 95 个运行时注册名称与说明逐项一致;20 个来源条目覆盖,生成物漂移检查纳入 CI;创建真实结构化进阶资产后,验证普通及无 world/ 目录的装配、writer 输入、来源与文档尺寸。 |
27
+
28
+ 成本仅在提供方明确报告时视为已知。`cost_summary.reported_usd` 是已报告部分,`complete=false` 表示存在未知费用;未知值不会伪装成零,也不会把估算当作账单。
29
+ 取消是协作式操作:`requested` 与 `cancelled` 分开,等待提供方响应时不承诺瞬间停止计费;已收到的流内容与已完成段落会保留,后续请求不再调度。
30
+
31
+ CI 额外发现并修复归档路径缺陷:排除规则只判断作品内部相对路径,父目录或作品 ID 为 `tmp`、`cache`、`secrets` 或 `exports` 不会再误删大纲等必需内容。四种父目录及四种作品 ID、内部凭据/缓存排除与正文逐字节恢复均有回归。
32
+
33
+ 真实 OpenCode Go 取消测试发现 LiteLLM 的同步包装流没有 `close()`,原清理逻辑未关闭它持有的 HTTP 流。现在取消和流式总时限耗尽时,沿包装流找到本次请求拥有的底层连接并关闭,不关闭共享客户端。直接流和包装流的取消、包装流超时均有回归;真实 Go 测试只有一次服务商请求,取消后已收到的正文保留、HTTP 响应确认关闭,后续请求在调用服务商前被拒绝,`~/my_novel` 文件未改变。实测源码的文件哈希与冻结 Core 提交核对一致。
34
+
35
+ Windows 全量 CI 又暴露 12 个失败。任务快照读取与写入互斥,并对 Windows 共享冲突做有限重试;正文搜索、工作台、接纳、审稿和历史使用原始 UTF-8 字节计算版本,结构化预览/应用/撤销和场景失败回滚保留行尾。大纲新增内容跟随原有 LF/CRLF。研究进程使用跨平台输出读取和进程树取消,Windows pnpm 脚本通过 Node 入口执行;测试中的 `/bin/echo` 改为真实 Python 子进程。POSIX 权限位断言只适用于 POSIX,凭据不出现在接口的断言在每种系统都运行。新增 20 项专门回归,另将搜索与场景回滚的既有测试扩为 LF/CRLF 两种输入。
36
+
37
+ 字节版本已同步到章节记忆、角色状态索引、导出预检及相关文档接口;搜索检索仍使用规范化行文本,来源版本则保持与原文件一致。旧历史记录缺少格式标记时,兼容其当年的行尾规范化校验,只返回其校验值所代表的文本,不改写旧产物。新记录标为 `source_revision_format=utf8-bytes`,行尾改变也会触发完整性错误。
38
+
39
+ DSH rc.3 的依赖安装时间固定为发布日之后的 `2026-10-24T00:00:00Z`。原来的未来时间边界会让上游正在发布的一批依赖进入验收,已出现依赖声明早于实际包发布六秒的安装失败;历史依赖图已在 npm 官方 registry 成功解析,最终仍以完整宿主验收为准。
40
+
41
+ 安装回归还发现自动恢复的进度更新会清空上一次后端崩溃原因;现在恢复期间保留该诊断,直到进入 ready 或结束恢复。回归会在新后端启动的边界核对诊断,避免靠观察时机碰巧通过。源码校验从固定 Git 提交归档还原字节并关闭行尾转换,再逐文件比较 wheel;CRLF 检出副本已验证可还原匹配,存在本地改动时拒绝覆盖。
42
+
43
+ 任务快照读取只在文件句柄打开期间互斥,YAML 解析在锁外进行,避免观察进度阻塞后台写入。阻塞解析的并发回归在旧实现失败、修复后通过。异步功能测试允许慢速磁盘下的有限等待,降低轮询频率;错误终态立即失败,超时附最后状态,不把超时或失败任务视为成功。
44
+
45
+ ## 使用补充
46
+
47
+ 项目 `novel_config.yaml` 可配置:
48
+
49
+ ```yaml
50
+ previous_chapter_mode: tail # full / tail / summary,默认 full
51
+ previous_chapter_tail_chars: 800
52
+ outline_extra_keys:
53
+ - 故事线
54
+ - 视角人物
55
+ ```
56
+
57
+ 在章纲中按 `> 故事线: 雨钥线` 填写扩展字段。summary 模式要求上一章有与当前正文匹配的有效章节记忆;不能用过期摘要继续写作。
58
+
59
+ 只组装不生成:`novel_write_chapter {chapter_id, dry_run:true, guidance, target_words}`。
60
+ 普通写作立即返回 task_id,用 `novel_task_get` 查询,用 `novel_task_cancel` 请求取消。
61
+ 取消后使用 `resume_from_draft:true` 续写最近可用的部分稿;原上下文或源文件变动时会拒绝自动续写,需先检查草稿。
62
+ 新运行通过 `resumed_from_run_id` 指向旧运行,费用记录分别保留。
63
+
64
+ 历史运行:`novel_chapter_run_action {action:"list", chapter_id, include_archived:true}`。
65
+ 删除章节会把原运行及产物移动到 `data/chapter_deletions/<operation>/`,不会删除这些历史;返回的 `archive_directory` 和 artifact 指向归档位置。
66
+ 当前没有自动清除运行的保留策略。列表默认 20 条、最多 200 条,可按章节和时间筛选;这不是磁盘保留上限。
67
+
68
+ ## 三套阶段的对应关系
69
+
70
+ | 语义 | Chapter Run V2 | 工作流页 | DoG 交付图 |
71
+ | --- | --- | --- | --- |
72
+ | 输入准备 | context / plan | context_assembly | writing 的上游依据 |
73
+ | 草稿生成、事实提取和入库 | draft / fact_extract / settle / validate / commit | writing | writing 检查已入库正文及版本 |
74
+ | 执行一次模型审稿 | review(completed 只表示调用与保存完成) | review | review 检查当前正文对应的审稿结论 |
75
+ | 作者核对验收影响 | 验收台账中的 acknowledge | user_confirm | closure 的交付依据之一 |
76
+ | 文风/压缩诊断 | 上下文与写作产物 | styling / compression | 不直接等于交付通过 |
77
+ | 修订到最终交付 | 修订记录与再次审稿 | 不由单个绿色步骤代表 | revision / application / rereview / closure |
78
+
79
+ `gate_status` 表示硬门禁,`delivery_status` 表示完整交付结论;硬门禁通过仍可能因未评范围、证据不足或质量不足而不能交付。
80
+ 部分审稿使用 `scope_status=partial`、`scope_quality_score`、`scope_passed` 和 `unreviewed_dimensions`;完整章总分保持 null,完整交付仍需全范围检查。
81
+
82
+ ## 验证边界和发布限制
83
+
84
+ 冻结 Core 提交本地全量 1531 passed / 32 skipped,包含新增 20 项定向回归;DoG 64 项(含真实 macOS Electron 二进制)、界面 310 项组件、两项真实 HTTP 路由回归通过。最终 22 项 CI 全部成功,Linux/macOS/Windows 各 1531 passed / 32 skipped、HTTP 各 2 passed、真实 Electron 各 5 passed;32 项为缺失旧样例的既有跳过。修复 PR #126/#127 已合并,最终源码、产物哈希和报告范围见 [候选验收记录](RELEASE_ACCEPTANCE.md#0228-候选未发布)。
85
+
86
+ 本轮 Go 快速审稿先遇到本机 CLI 凭据读取错误,排查后四次流式请求成功、无服务商错误;所选范围通过,整章交付仍按部分审稿保持未定论,作品文件未改变。提供方未返回 token/费用明细,不将零占位计为已知账单。该实测发生于 `61c3f68`,之后完善审稿诊断与 Windows 文件处理,模型请求协议未改动。另一次 Go 取消验收使用的流处理模块与最终冻结提交逐文件哈希一致,已确认 HTTP 连接关闭。
87
+
88
+ #121/#122 的报告条目已修复、验收并合并,现已关闭。尚未发布不作为继续打开已完成报告的理由;发布暂停由以下真实未完成项维持。
89
+
90
+ [#123](https://github.com/LiPu-jpg/Openwrite/issues/123) 继续跟踪:
91
+
92
+ - #98.1 宿主原生升级补丁正式发布,仍取决于上游;插件停机绕行工具不等于宿主已修。
93
+ - #105 已由报告者补充 Windows Electron 旧会话恢复成功的[实机证据](https://github.com/LiPu-jpg/Openwrite/issues/123#issuecomment-6422870871),本项验收完成。
94
+ - #109 B-13 已由报告者确认行中 `>` 与混合行尾锚点的 [Windows 实测通过](https://github.com/LiPu-jpg/Openwrite/issues/123#issuecomment-6423904648),本项验收完成。
95
+ - #111 Android/Termux 真机及外部 Studio 验收;没有 Android 原生运行时。
96
+
97
+ 此前缺少材料时保留四项;报告者新回复已补齐其中两项,现只保留宿主正式发布及 Android/Termux 实机两项。回复中新发现的代码问题另见 [补修记录](ISSUE_123_FOLLOWUP.md),候选仍未发布。
@@ -33,6 +33,8 @@ node /path/to/package/scripts/safe-upgrade.mjs --profile desktop --package /abso
33
33
 
34
34
  可用 `npm pack dsh-openwrite@0.2.25` 下载官方包,或从对应 GitHub Release 获取相同字节的附件。`DSH_HOME` 必须指向实际宿主的 home;默认 `~/.dsh`。Windows 另设 `DSH_BIN` 为已验收宿主运行时的绝对 `lib/bin.js` 路径,使用 Node 直接执行而非 `.cmd` shell。其余平台可通过 DSH_BIN 指定同一受信任 CLI。
35
35
 
36
+ 候选 0.2.28 的工具可从解压目录读取所选已安装 profile 中的运行依赖;本地 tgz 会先保存到 `<DSH_HOME>/openwrite/packages/<sha256>.tgz`,再传给安装器,避免新依赖和锁文件指向临时下载。此改进尚未发布,旧包解压入口缺少依赖时应使用已安装包内的工具。pnpm 11 的 store/构建授权及既有失效锁文件仍属于宿主安装路径限制,失败时查看操作日志;不要把源码 tarball 与预编译发行包混用。详见 [#123 回复补修](ISSUE_123_FOLLOWUP.md)。
37
+
36
38
  安装在旁路 profile 中进行;整个旧 profile(包括其他插件、锁文件及设置)在切换前保持可用。只有 OpenWrite 的必要文件和 manifest 校验成功才进入目录切换。切换为两次同盘 rename,**不是整个目录树的单次原子交换**;停机状态避免读取窗口,中断由持久事务记录恢复。锁覆盖本工具的并发操作,不能阻止未经协调的原生安装器或用户重新启动宿主。
37
39
 
38
40
  记录保存在 `<DSH_HOME>/openwrite/upgrades/upgrade_*/`:`operation.json`、`pnpm.log`、成功切换后的 `previous-profile/`。stdout/stderr 实时落盘;安装 180 秒超时终止子进程。保留目录可能占用较多空间,确认升级稳定后再人工清理。
@@ -0,0 +1,54 @@
1
+ # #123 回复补修与验收(候选 0.2.28 / Core 5.8.18,未发布)
2
+
3
+ 依据报告者的[升级、会话与模型调用记录](https://github.com/LiPu-jpg/Openwrite/issues/123#issuecomment-6422870871)及 [B-13 Windows 实测](https://github.com/LiPu-jpg/Openwrite/issues/123#issuecomment-6423904648)更新结论。回复是有版本、入口和结果的外部验收证据;不把其中推测当成已证实根因。
4
+
5
+ ## 两项原待办已有实机证据
6
+
7
+ - #105:报告者确认 Windows Desktop 按手工替换路径升级到 0.2.26 后,旧会话正常打开;旧 0.2.24 预设目录缺失时兼容注册仍可解析。此证据不代表宿主原生安装器安全。0.2.27 已补齐 0.2.26/27 的永久别名,当前候选覆盖至 0.2.28;发布回归要求每个版本身份进入永久列表,新会话使用稳定 ID `openwrite`。
8
+ - #109 B-13:报告者在 Windows 11、DSH Desktop、插件 0.2.27 / Core 5.8.16 上确认行中/行首 `>`、混合行尾预览均可匹配,读取指纹与原始文件字节一致。NBSP 与普通空格不等属于精确匹配的预期拒绝。保留精确字节匹配,不自动归一化再写文件;候选增加混合行尾的 HTTP 预览、应用、撤销回归。
9
+
10
+ ## 本轮代码补修
11
+
12
+ | 问题 | 最终行为 | 验证 |
13
+ | --- | --- | --- |
14
+ | `thinking_modes.chapter_write` 漏传 | Writer 的草稿、分段、重试、事实提取和结算都默认传 `chapter_write`;显式 operation 仍优先。usage 的阶段名独立保留。 | 直接检查实际提供方请求参数:enabled / disabled / omit;草稿、观察、结算及重试均覆盖,不只检查配置对象。 |
15
+ | 同类修订漏传 | 正文修订模型请求传 `revision`。Dante 的章节生成仍经 Writer;Goethe/通用 ReAct 的规划及工具选择没有冒用写章开关。 | 真实 LLMClient 调用到提供方边界的替身检查;旧冻结源码三个用例失败,新实现通过。 |
16
+ | 修订选择的原文不匹配 | `OLD_TEXT_NOT_FOUND` / HTTP 400,带当前范围、原始字节版本、唯一精确候选与空白差异提示。真正的 apply 版本漂移仍为 `DOCUMENT_CONFLICT` / 409。 | LF 请求与 CRLF/混合文件不符时零模型调用、磁盘不变;既有 apply 冲突回归保留。 |
17
+ | `similarity:1` 但匹配失败 | 增加 `similarity_basis=whitespace_collapsed`、`mismatch_kind`;该相似度不承诺字节相等。范围锚点失败也给各缺失锚点的诊断,不自动重定位/应用。 | NBSP 与换行提示保留准确原文;不确定时不伪造唯一候选。 |
18
+ | 预览 `changed:true` 误读 | 保留兼容字段 `changed`,增加 `would_change`;`applied:false` 明确还没有写入。锚点不匹配返回 400,版本冲突仍返回 409。 | 公共 HTTP 测试逐字节核对预览无写入、确认后写入、撤销恢复。 |
19
+ | 已有正文时错误过于泛化 | 直接写章预检返回 `CHAPTER_ALREADY_EXISTS`、章节 ID 和打开正文/创建修订的恢复提示。 | 预检拒绝且不调用模型;不再依赖泛化的 `STUDIO_ERROR` 推断原因。 |
20
+ | 健康检查版本不一致 | 当前源码已使用同一版本来源;新增 health / workspace / pyproject 元数据一致性检查。 | 不把旧 5.8.14 环境的字符串误报当成新候选仍存在的缺陷。 |
21
+ | 解压包运行升级工具找不到依赖 | 延迟解析依赖,先查工具自身,再查明确选择的 profile;不加载已安装插件、不修改凭据。 | 解压目录没有 node_modules,依赖只存在于目标 profile 时仍完成受控暂存/切换。 |
22
+ | 升级后引用被删除的 tgz | 先按 SHA-256 将本地 tgz 固定到 `<DSH_HOME>/openwrite/packages/`,再交安装器写依赖与锁文件。 | 原下载目录在安装过程中删除后,稳定缓存和提交后的 file: 引用仍可读。 |
23
+
24
+ ## 升级路径与边界
25
+
26
+ 在宿主原生保护正式发布前,继续使用[停机旁路工具](ISSUES_98_100.md#离线升级和损坏修复),先完全退出 Desktop(含托盘)及 dsh/managed runtime,并备份 profile。使用正式预编译 tgz,不把 GitHub 源码包当成相同的离线安装包;源码包可能需要构建授权。
27
+
28
+ 这轮修复了解压工具的依赖入口,并避免新安装记录引用易删除的 tgz;**不承诺修复宿主的 pnpm 11 store、构建授权或既有损坏锁文件**。遇到安装器失败,活动 profile 保持原样,保留操作日志与旧完整目录;不要反复改 profile 的依赖、store 配置和锁文件拼凑安装成功。
29
+
30
+ #124/#125 的首次评审输出预算与 B-20 的运行历史留存是两件事;后者已由 #126/#127 补修。0.2.27 已正式发布;这里的 Core 5.8.18 和插件 0.2.28 仍为候选,未经新一轮全部验收不发布。
31
+
32
+ ## 继续保留的两项
33
+
34
+ - #98.1:原生宿主升级保护补丁进入正式宿主,插件旁路工具不替代该条件。
35
+ - #111:Android/Termux 真机及受信任外部 Studio 连接验收。
36
+
37
+ #123 保持打开跟踪以上两项。代码、原始环境确认、CI 产物与正式发布分别记录。
38
+
39
+ ## 最终验收与合并
40
+
41
+ [Core PR #131](https://github.com/LiPu-jpg/Openwrite/pull/131) 和 [插件 PR #132](https://github.com/LiPu-jpg/Openwrite/pull/132) 已合并。最终 **22 项 CI 全部成功**:[三系统回归](https://github.com/LiPu-jpg/Openwrite/actions/runs/40437762040)、[安装/客户端验收](https://github.com/LiPu-jpg/Openwrite/actions/runs/40437761963)、[插件检查](https://github.com/LiPu-jpg/Openwrite/actions/runs/40437762138)。
42
+
43
+ | 项目 | Linux | macOS | Windows |
44
+ | --- | --- | --- | --- |
45
+ | 固定 Core 全量 | 1541 passed / 32 skipped | 1541 passed / 32 skipped | 1541 passed / 32 skipped |
46
+ | 真实 HTTP dry-run / 归档历史 | 2 passed | 2 passed | 2 passed |
47
+ | 真实 Electron 44.7.0 脚本 | 5 passed | 5 passed | 5 passed |
48
+ | wheel 源码 / 应打包 Python 文件 | 498 / 163 一致 | 498 / 163 一致 | 498 / 163 一致 |
49
+
50
+ 32 项跳过均为缺失旧样例/checkout 的既有跳过,新增回归未跳过。另有混合行尾的公开 HTTP 预览/应用/撤销测试包含在 Core 全量中。本地插件完整检查、310 项组件、34 项原生预设/升级/运行时组合通过。最终 8 份安装/源码、5 份客户端、6 份原生报告已下载复核,安装包报告绑定同一 tarball,源码安装固定插件提交。
51
+
52
+ Core 固定提交 `43cb604a7583b7268f47e54ceb8a0c30b95e82b2`,wheel SHA-256 `09f9baef5fe0d502510c8542f20c6abaf6893f02e2d069d7f0d7cc50c7aeea93`。候选 tarball SHA-256 `4bcde6d6f535906a5a04490218a0d972e84329ff750af6803a4214fbf609024e`;CI 来源提交 `ecfb7c34c5b0a29d395136da775bb964c3c91d11` 与主分支修复合并提交 `14dd3a5dbc7d1661adb9b684e0f137298bf2591f` 的 tree 同为 `67042838daf11f5c7fc27e0ffe158677a73c3196`。
53
+
54
+ 本轮没有发起真实付费模型请求,thinking 参数通过实际 LLMClient 到提供方请求边界的替身验证;不把它描述为真实服务商计费或输出质量验收。候选产物只保存为验收证据,**未发布 npm 或 GitHub Release,公开版本仍为 0.2.27**。
@@ -1,31 +1,37 @@
1
1
  # OpenCode Go:DeepSeek V4.1 Flash
2
2
 
3
- #114 的配置应使用 OpenAI 兼容 **Chat Completions** 协议。
4
- 按 [OpenCode Go 官方文档](https://opencode.ai/v2/docs/console/go/)(2026-10-26 核对):
3
+ #114 的底层请求和工作台认证接入分两步完成。0.2.26(Core 5.8.14)仅补充客户端/会话请求头;工作台的 Console 认证、工作区与续期接入从 Core 5.8.15 开始,正式插件版本以 npm/Release 为准。
5
4
 
6
- | OpenWrite 模型档案字段 | 值 |
5
+ ## 工作台:使用已有 Console 登录
6
+
7
+ 1. 在 **Studio 后端所在电脑**安装官方 OpenCode CLI 并登录 OpenCode Console。已验证 CLI 1.18.15 的 `opencode console login`;官方 V2 对应 `opencode auth login opencode`,以当前 CLI 提示为准。浏览器授权由用户按页面范围确认。
8
+ 2. 打开「任务 → 模型」,在认证方式选择 **本机 OpenCode Console(Go)**。界面填入官方 Go Chat 地址与 `deepseek-v4.1-flash`,无需复制 API Key。
9
+ 3. 工作区 ID 留空会跟随 CLI 当前工作区;可填写 ID 固定到指定工作区。若 CLI 切换到其他工作区,固定档案会拒绝请求,而非悄悄换账户/工作区。
10
+ 4. 保存并运行连接测试,成功后再把档案选为写作/评审/研究等任务路由。
11
+
12
+ 远程/外部 Studio 使用的是远程后端的 CLI 登录,不是浏览器所在电脑的登录。CLI 不存在、未登录、配置读取失败或工作区不匹配时,工作台提供对应登录/工作区提示。
13
+
14
+ 每次模型请求通过 `opencode debug config --pure` 读取 Go 凭据与 `x-opencode-org-id`,官方 CLI 负责令牌续期;OpenWrite 不把 Console 令牌复制到模型档案、浏览器 DTO 或日志。普通、流式、连接测试及图检索调用均携带真实 `OpenWrite/<版本>` 和客户端内稳定的 `x-opencode-session`。Console 认证只允许官方 Go HTTPS Chat 接口,不能通过编辑 Base URL 把令牌发送给其他站点。
15
+
16
+ ## 手工 API Key
17
+
18
+ | 字段 | 值 |
7
19
  | --- | --- |
8
20
  | Provider / 协议适配器 | `openai` |
9
21
  | API format | `chat` |
10
22
  | Base URL | `https://opencode.ai/inference/go/openai/v1` |
11
23
  | Model ID | `deepseek-v4.1-flash` |
12
- | API Key | 当前 OpenCode Go 工作区的 Key |
24
+ | 认证方式 | API Key |
25
+ | Go 工作区 ID | 账户级凭据需要填写对应工作区 ID |
26
+
27
+ 不要把 OpenCode 的 `opencode-go/` 模型选择前缀放入原始 API Model ID。完整 `/chat/completions` 地址会被 Core 规范化为 API 根路径;旧 `/zen/go/v1` 地址继续兼容。
13
28
 
14
- 不要把 OpenCode 自己的 `opencode-go/` 模型选择前缀放入原始 API Model ID。
15
- 完整 `/chat/completions` 地址也会被 Core 规范化为 API 根路径;旧 `/zen/go/v1`
16
- 地址仅作为原有配置保留,不作为当前官方地址推荐。
29
+ `401 api_key_expired` 表示旧 Key 过期,普通网页登录不能续期该 Key。对于 Console 登录,请使用上述工作台认证方式;`403 Workspace selection is required` 表示账户级凭据缺少 `x-opencode-org-id`,仅填写 URL/模型/Key 不够。
17
30
 
18
- Core 5.8.14 对 Go 请求自动发送真实 `OpenWrite/<版本>` User-Agent 与同一客户端内稳定的
19
- `x-opencode-session`,符合官方客户端标识说明;不会冒充其他应用,也不发送作品路径。
20
- 这覆盖 OpenWrite Core 的模型调用,DSH 对话模型另由宿主自己的适配器处理。
31
+ ## 实测与边界
21
32
 
22
- 官方说明 DeepSeek 模型可能需要工作区 Settings → Privacy → Regions 允许 Global。
23
- Go 面向编码客户端,服务端的用途、地区、权限或额度策略仍可能拒绝请求;若订阅不适用写作,
24
- 应选用服务商允许的 API 产品。这里不会尝试绕过服务端限制。
33
+ 2026-10-26 使用用户授权的 Go 订阅验证:0.2.26 底层手工补齐 Console 工作区请求头后,普通与流式小说生成均 HTTP 200;去掉工作区头时为 HTTP 403。补齐后的工作台 API 保存 Console 档案、测试连接返回 `OK`,经保存档案的实际流式写作也成功;没有手工传入 Key 或请求头,作者正文与作品配置哈希未变,Console 令牌未写入模型凭据文件。
25
34
 
26
- 先在「任务 → 模型」保存档案并运行连接测试,再将其选为写作/评审路由。
27
- 认证、授权、模型不存在及限流分别保留对应错误码。若仍失败,反馈脱敏错误码、HTTP 状态、
28
- 所用 API 路径和模型名即可,不需要提供 API Key。
35
+ 自动回归覆盖每次请求读取更新凭据、64 KiB 以上 CLI 配置、超时/缺失/工作区错误的脱敏、错误目标站点拦截、普通 Key 工作区、图检索、连接测试、档案迁移及前端保存/测试。
29
36
 
30
- 自动化测试核对新旧 Go 根路径、Chat 协议、原始模型名和稳定请求头;未使用用户的 Go 凭据,
31
- 未执行收费请求,也不保证特定账户的授权状态。该修复是否已发布,以 npm/Release 为准。
37
+ [官方 Go 文档](https://opencode.ai/v2/docs/console/go/)要求 DeepSeek 所用工作区 Privacy → Regions 允许 Global。Go 面向编码客户端,本次短文实测通过不保证服务商未来接受所有小说任务;仍需遵守账号用途、地区与额度规则。此接入覆盖 OpenWrite Core 模型调用,DSH 聊天适配器属于宿主,未在此修改。
@@ -1,11 +1,99 @@
1
1
  # 发布验收记录
2
2
 
3
+ ## 0.2.28 候选(未发布)
4
+
5
+ 本轮捆绑 Core **5.8.20**,固定源码 `9611c654e5d77bcb5968105a7adfa8e9b4f9624a`。修复正文延迟输入漏存、按审稿修订越过作者选区,以及真实 Vditor 换行规范化导致的选区拒绝,详见[补修范围](EDITOR_SAFETY_REPAIRS.md)。
6
+
7
+ 本地 Core **1550 passed / 32 skipped**、真实 HTTP **14 passed**、界面 **336 passed**、managed **34 passed**、完整插件检查通过。新增真实候选包编辑器浏览器场景 **9 组通过**。wheel 的 499 个运行时文件与固定源码逐字节一致,163 个应打包 Python 文件无遗漏,SHA-256 为 `aa1f25f3c615497cd73c3c059fd2acc4e71ba2e936765d02331d1382df4b201a`。跨平台最终结果在验收后补齐。
8
+
9
+ 候选仍未发布,公开版本为 **0.2.27**;#123 的宿主正式发布和 Android/Termux 真机条件继续保留。
10
+
11
+ ### 前轮候选证据(Core 5.8.19,未发布)
12
+
13
+ 本轮捆绑 Core **5.8.19**,固定源码 `d2b3cbe6009a1ab4f1064dca0115cb44ba080a3f`。修复 CRLF/emoji 选区坐标、独立 Studio 原始片段保留、中断升级无依赖恢复与损坏 tgz 缓存重试,详见 [补修记录](SELECTION_UPGRADE_REPAIRS.md)。
14
+
15
+ 本地 Core 全量 **1542 passed / 32 skipped**,修订服务与真实 HTTP 23 passed,原生预设/升级/运行时 40 passed,managed 33 passed,界面 319 passed,插件完整检查通过。wheel 的 499 个运行时文件与固定源码逐字节一致,163 个应打包 Python 文件无遗漏,SHA-256 为 `9d5307201bea47be3675b2d968ab444503479ff71d2b7ad9b3922a998889ba3a`。本地测试不计作 Windows/Android 真机验收。
16
+
17
+ [Core PR #134](https://github.com/LiPu-jpg/Openwrite/pull/134) 与 [插件 PR #135](https://github.com/LiPu-jpg/Openwrite/pull/135) 已合并,最终 **22 项检查全部成功**:[三系统回归](https://github.com/LiPu-jpg/Openwrite/actions/runs/40446870919)、[完整安装/客户端验收](https://github.com/LiPu-jpg/Openwrite/actions/runs/40446870931)、[插件检查](https://github.com/LiPu-jpg/Openwrite/actions/runs/40446870954)。下载原始报告后再次核对:
18
+
19
+ | 验收 | Linux | macOS | Windows |
20
+ | --- | --- | --- | --- |
21
+ | 固定 Core 全量 | 1542 passed / 32 skipped | 1542 passed / 32 skipped | 1542 passed / 32 skipped |
22
+ | 真实 HTTP 路由与选区保护 | 10 passed | 10 passed | 10 passed |
23
+ | 真实 Electron 44.7.0 脚本 | 5 passed / 0 skipped | 5 passed / 0 skipped | 5 passed / 0 skipped |
24
+ | wheel 源码字节 / 应打包 Python 文件 | 499 / 163 一致 | 499 / 163 一致 | 499 / 163 一致 |
25
+
26
+ 8 份安装/源码、5 份精确宿主客户端、6 份原生回归报告全部通过。六组原生安装测试对同一 tarball 中的预设、升级与运行时脚本运行 40 项回归。32 项 Core 跳过项沿用缺失样例/外部 checkout 限制,新增回归没有跳过;测试不调用真实模型。
27
+
28
+ 候选 tarball SHA-256:`b73ed0a87da44f93f804ded3c5fffe6c83c29a9d6bf9c64fe9141eefc5a3a85b`。CI 提交 `7c91429693dd672bd1d426fa54a1bc075cad13b4` 与插件合并提交 `3c51627bf2a21a4e7c22fc3e77ab0e61f0db891f` 的源码 tree 均为 `879b9f30ed0c812d5b3aca34571a186f86670471`。Core 来源提交保留于 native-core 合并提交 `1ff7d699a456b90b7315eccfcf63c042cbf37d99`;候选包保留为验收证据,未发布。
29
+
30
+ #123 的宿主正式发布与 Android/Termux 真机两项继续保留,暂停发布。公开 npm/GitHub 版本仍为 **0.2.27**。
31
+
32
+ ### 前轮候选证据(Core 5.8.18,未发布)
33
+
34
+ 本轮根据 #123 新回复捆绑 Core **5.8.18**,固定源码 `43cb604a7583b7268f47e54ceb8a0c30b95e82b2`。本地全量 **1541 passed / 32 skipped**,真实 HTTP 2 passed;wheel 的 498 个打包源文件与固定源码逐字节一致,163 个应打包 Python 文件无遗漏,SHA-256 为 `09f9baef5fe0d502510c8542f20c6abaf6893f02e2d069d7f0d7cc50c7aeea93`。
35
+
36
+ 写章/修订 thinking 模式的三个回归在旧冻结源码失败,新实现通过。原生预设/升级/运行时本地 34 passed。报告者已补齐旧会话与 B-13 的 Windows 验收;余下宿主正式发布和 Android/Termux 真机两项仍暂停新版本发布。具体修复、来源和边界见 [#123 回复补修](ISSUE_123_FOLLOWUP.md)。
37
+
38
+ [PR #131](https://github.com/LiPu-jpg/Openwrite/pull/131) / [#132](https://github.com/LiPu-jpg/Openwrite/pull/132) 已合并,最终 22 项检查全部成功:[三系统回归](https://github.com/LiPu-jpg/Openwrite/actions/runs/40437762040)、[完整安装/客户端验收](https://github.com/LiPu-jpg/Openwrite/actions/runs/40437761963)、[插件检查](https://github.com/LiPu-jpg/Openwrite/actions/runs/40437762138)。三系统 Core 各 1541 passed / 32 skipped、HTTP 各 2 passed、真实 Electron 各 5 passed。8 份安装/源码、5 份客户端和 6 份原生报告下载后复核通过。
39
+
40
+ 本轮 tarball SHA-256 为 `4bcde6d6f535906a5a04490218a0d972e84329ff750af6803a4214fbf609024e`;CI 提交 `ecfb7c34c5b0a29d395136da775bb964c3c91d11` 与修复合并提交 `14dd3a5dbc7d1661adb9b684e0f137298bf2591f` 的源码 tree 同为 `67042838daf11f5c7fc27e0ffe158677a73c3196`。产物未发布;本轮未发起真实模型请求,不能把请求边界替身测试算作服务商实测。
41
+
42
+ ### 前轮候选证据(Core 5.8.17,未发布)
43
+
44
+ 按用户要求先修可修部分,保留未完成项并暂停发布。变更范围与限制见 [#121–#123 修复记录](ISSUES_121_123.md)。本节不是正式发布记录,npm/GitHub 公开版本仍为 0.2.27。
45
+
46
+ Core 5.8.17 来源 [PR #126](https://github.com/LiPu-jpg/Openwrite/pull/126),固定提交 `c655dc2106b07cf08324728e0b5babf1fcc12afb`;冻结提交全量 **1531 passed / 32 skipped**。wheel 从该提交的干净归档构建,498 个打包源文件逐字节一致,并核对 163 个应打包 Python 文件未遗漏;wheel SHA-256 为 `93507c54ee5fe3d22d4e858e9e1d8efe0cd2917f554ff5a13872dbb1fed06fab`。
47
+
48
+ 修复已通过 [Core PR #126](https://github.com/LiPu-jpg/Openwrite/pull/126) 和 [插件 PR #127](https://github.com/LiPu-jpg/Openwrite/pull/127) 合并。最终 **22 项检查全部成功**:[三系统回归](https://github.com/LiPu-jpg/Openwrite/actions/runs/40391934852)、[完整安装/客户端验收](https://github.com/LiPu-jpg/Openwrite/actions/runs/40391934711)、[插件检查](https://github.com/LiPu-jpg/Openwrite/actions/runs/40391935114)。原始 CI 报告下载后再次核对:
49
+
50
+ | 验收 | Linux | macOS | Windows |
51
+ | --- | --- | --- | --- |
52
+ | 固定 Core 全量 | 1531 passed / 32 skipped | 1531 passed / 32 skipped | 1531 passed / 32 skipped |
53
+ | 真实 HTTP dry-run / 归档历史 | 2 passed | 2 passed | 2 passed |
54
+ | 真实 Electron 44.7.0 脚本 | 5 passed / 0 skipped | 5 passed / 0 skipped | 5 passed / 0 skipped |
55
+ | wheel 源码字节 / 应打包 Python 文件 | 498 / 163 一致 | 498 / 163 一致 | 498 / 163 一致 |
56
+
57
+ 32 项跳过均来自仓库缺失的旧标准样例、演示作品或外部 checkout,新增问题回归未跳过。自动化没有复现报告者的原 Windows Electron 历史会话,也不等于 Android/Termux 真机验收。
58
+
59
+ 界面 310 项、本地 DoG 64 项和类型检查、managed 32 项及插件完整检查通过。8 份安装/源码、5 份精确宿主客户端和 6 份原生回归报告全部通过;原生报告覆盖持久预设、离线升级和受管理后端三组。安装包报告绑定同一 tarball SHA-256,源码安装固定插件提交。
60
+
61
+ 候选 tarball SHA-256:`2d0f1b6c34c1a48386fc08798c8fb7a09c2e964ef6d2d6a558f62e7ed469c7bb`。CI 来源提交 `a8babe9b9b3909bbfedbf3e26df41d022624abbb` 与主分支修复合并提交 `bc6af78a562725a02a0fff6133eb0e3f5e603d6f` 的 tree 均为 `240a99caea04ba8436c1bfaec306969db0c216ea`。Core 来源提交已保留在 native-core 的合并历史中。
62
+
63
+ 真实 OpenCode Go 单次流式取消验收确认保留部分正文、关闭 HTTP 响应,后续请求在调用提供方前拒绝,作品文件未变;它与不调用模型的 CI 分开记录。新增 [95 项工具参考](TOOLS.md) 和 [上下文槽位参考](CONTEXT_SLOTS.md) 已核对运行时注册、固定 Core 源码及候选包内字节,修复 #128。
64
+
65
+ **以上前轮候选包只作验收证据保存,没有发布。** 当时 #123 的四项待办均保留;后续回复补齐了其中两项,余下条件见本节开头。#121/#122 的报告条目已修复、验收并合并关闭;关闭报告不代表候选版本已发行。
66
+
67
+ ## 0.2.27
68
+
69
+ 捆绑 Core 5.8.16,来源 [PR #124](https://github.com/LiPu-jpg/Openwrite/pull/124),源码提交 `27ec8b3bea0a3f8754f5701a7b21c23a9328d6b7`。wheel 从该提交的干净归档构建,496 个打包源文件与提交逐字节一致,SHA-256 为 `8be4dc5e3feb2d0faf91a1e0763f05ff338c237912edd8c066aaad118ec41ec4`。
70
+
71
+ 本地 Core 全量 1478 passed / 32 skipped;HTTP 行中锚点的 LF/CRLF 预览、应用、撤销与不匹配保护通过。预设生命周期、停机升级与 managed runtime 组合 32 passed(含五项手动重试/取消回归),并加入六组原生安装矩阵。真实 OpenCode Go 流式安全评审 1 次成功,首次 max_tokens=24000、耗时 4.424 秒;此前工作台 Console 档案保存、连接测试及流式写作也成功。CI 本身不调用模型,真实模型记录与其独立,不能把 CI 的 modelCalls:0 解释成真实模型验收。
72
+
73
+ [GitHub Release v0.2.27](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.27) 与 [npm `dsh-openwrite@0.2.27`](https://www.npmjs.com/package/dsh-openwrite/v/0.2.27) 均已发布,官方 registry 的 `latest` 已更新到 0.2.27。GitHub 四份公开附件逐字节与 CI 原始文件一致;从官方 npm registry 无认证重新下载的 10,169,500 字节安装包也与 CI 包逐字节一致,SHA-256、npm 的 SHA-1 与 SHA-512 integrity 均已核对。发布通过本人双重验证后先返回 HTTP 202,等待服务端校验与公开同步完成,再以公开下载验证确认发布成功。
74
+
75
+ 使用 [完整发布 CI](https://github.com/LiPu-jpg/Openwrite/actions/runs/40358781683) 原始 validated-release 产物;[插件检查](https://github.com/LiPu-jpg/Openwrite/actions/runs/40358781965) 同样通过,共 16 项检查全部成功。验收包含 8 份安装/源码报告、5 份精确宿主客户端报告,以及 6 份绑定安装包哈希的原生回归报告,每组 32 项回归通过。tarball SHA-256 为 `94e9df25289b7053f12978f8fc4bb75f3f8da894f02312e82a88ca19efa095f2`。CI 来源提交 `e08679c47258bb1584e2920cf0245f24718bb9db` 与主分支合并提交 `cbab43b4e427ae1507d26e96e47a9abdbeb6414b` 的源码 tree 均为 `5bde0e856c7643d603bfe202704c4051860c43a0`;发布直接使用 CI 包,没有重新打包。
76
+
77
+ 合并后的[主分支发布 CI](https://github.com/LiPu-jpg/Openwrite/actions/runs/40360046529) 和[插件检查](https://github.com/LiPu-jpg/Openwrite/actions/runs/40360046553) 同样全部通过。
78
+
79
+ [未完成验收与上游依赖](CLOSED_ISSUE_FOLLOWUPS.md) 继续由 [#123](https://github.com/LiPu-jpg/Openwrite/issues/123) 跟踪;其后新增的 #121/#122 已由上方候选修复完成并关闭,尚未随新版本发行。
80
+
3
81
  ## CI 运行范围
4
82
 
5
83
  仅修改 README.md 或 docs 下的 Markdown 文档时,跳过插件维护与跨平台发布验收。预设、技能、脚本、依赖、资源和工作流变更仍触发检查;混合文档与代码的提交也照常检查。开发分支通过 PR 检查,避免同一提交在分支 push 与 PR 上重复执行;主分支合并后保留验收,两个工作流均可手动触发。发布必须使用完整验收通过的产物,跳过检查不能作为发布通过的证据。
6
84
 
7
85
  新建作品的验收请求最多等待 60 秒(原为 15 秒),保留成功耗时和失败诊断;不重试写请求,超时仍失败。此调整容纳慢速运行器,不代表初始化耗时问题已被修复。
8
86
 
87
+ ## 0.2.26
88
+
89
+ [GitHub Release](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.26) 与 [npm `dsh-openwrite@0.2.26`](https://www.npmjs.com/package/dsh-openwrite/v/0.2.26) 均已发布,npm `latest` 已更新到 0.2.26。使用 [完整发布 CI](https://github.com/LiPu-jpg/Openwrite/actions/runs/40323278858) 的原始 `validated-release` 产物,没有重新打包;[离线契约](https://github.com/LiPu-jpg/Openwrite/actions/runs/40323278881) 也通过,共 16 项检查全部成功。发布 PR [#118](https://github.com/LiPu-jpg/Openwrite/pull/118) 已合并,合并后的 [主分支发布 CI](https://github.com/LiPu-jpg/Openwrite/actions/runs/40324223823) 和 [插件检查](https://github.com/LiPu-jpg/Openwrite/actions/runs/40324223804) 同样全部通过。
90
+
91
+ 包 SHA-256:`d8cd9926a9b4d749f320028313046f0b14a55dbab68d7626d18f13d49740eccd`,大小 10,159,927 字节;GitHub 附件服务端 digest、公开地址无认证重新下载的完整包,以及官方 npm registry 无认证重新下载的完整包,均与 CI 包一致;npm 的 SHA-1 与 SHA-512 integrity 也已核对。来源提交为 CI 测试合并提交 `7522b6cb3b7f37ebaf267519c6051389413aa089`,源码 tree `9e2a2d746f44af554af9192458eb9d8318a6049d` 与主分支合并提交 `e8805b2bcc43bec74af0e9ae364137146c7edf96` 一致。Core 5.8.14 wheel SHA-256:`b96637d9cad364d280122bae9dd59e42be811cd43389ddb704ff4dc110f0acc0`。
92
+
93
+ 8 份原生安装/源码报告和 5 份精确宿主客户端报告全部通过,覆盖 Linux、macOS arm64/x64、Windows、Node 22.19/24/26、GitHub 源码安装、alpha 兼容,以及 DSH `0.1.2-rc.1` / `0.1.5-alpha.1` / `0.2.0-rc.2` / `0.2.1-rc.2` / `0.2.1-rc.3` 的 Web 工作台、预设、DoG 与其他插件共存。发布包的各平台/alpha 安装及客户端报告均绑定同一 SHA-256;源码安装单独固定来源 Commit。
94
+
95
+ 此前 Core 全量 1451 passed / 32 skipped,前端 307 passed;版本升级后的预设生命周期与离线升级回归 8 passed。真实付费模型调用、Android 原生和 Windows Electron 手工升级/恢复未执行,不能计为通过。修复范围与限制见 [升级恢复](ISSUES_105_113.md)、[连载报告](ISSUE_109_REPAIRS.md)、[OpenCode Go](OPENCODE_GO.md)。
96
+
9
97
  ## 0.2.25
10
98
 
11
99
  [GitHub Release](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.25) 与 [npm `dsh-openwrite@0.2.25`](https://www.npmjs.com/package/dsh-openwrite/v/0.2.25) 均已发布,npm `latest` 已更新到 0.2.25。使用 [PR 完整发布 CI](https://github.com/LiPu-jpg/Openwrite/actions/runs/39893387812) 验收通过的原始产物,没有重新打包。该运行的来源提交为 `1c04d97c9571f09f9a49567c95b7c38c0507ddbc`,源码 tree `3db86dcdb88f69fd6d92f5881fee0db3c2f0bd8c` 与主分支合并提交 `f0785f2c331f2d090450b1e127e5750c64dc4487` 一致。包 SHA-256 为 `ca73ca424844ddee62f37c2725591bf44ff7701f25d1d12693fa270ee0c26049`;官方 registry 无认证下载的完整 10,141,143 字节与 CI 包一致,GitHub Release 的服务端附件 digest 也一致。
@@ -128,7 +216,7 @@ Core 5.8.7 由 `native-core` 分支干净树 `pip wheel` 构建,manifest 的 `
128
216
 
129
217
  ## 0.2.12
130
218
 
131
- [GitHub Release](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.12) 已发布,直接使用[完整 CI](https://github.com/LiPu-jpg/Openwrite/actions/runs/37389772004)验收的同一份包。来源提交 a349ea964e43d75f9fc98d1f83354a237bc2ff51,SHA-256 为 2545031292d80689f80d4c0d8c99e007c18ff0c477d662e2813cf67bc876246c。六组原生平台/Node、源码安装、alpha 兼容及三代宿主客户端共 11 份报告全部通过;详见 Release 的 release-acceptance.json。npm `dsh-openwrite@0.2.12` 和 GitHub Release 均已发布,`latest` 已更新到 0.2.12;从公共 npm registry 无认证重新下载后,SHA-256 与上述 CI / Release 包一致。合并后的[主分支完整 CI](https://github.com/LiPu-jpg/Openwrite/actions/runs/37390503895)也已通过。
219
+ [GitHub Release](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.12) 已发布,直接使用[完整 CI](https://github.com/LiPu-jpg/Openwrite/actions/runs/37389772004)验收的同一份包。来源提交 a349ea964e43d75f9fc98d1f83364a237bc2ff51,SHA-256 为 2545031292d80689f80d4c0d8c99e007c18ff0c477d662e2813cf67bc876246c。六组原生平台/Node、源码安装、alpha 兼容及三代宿主客户端共 11 份报告全部通过;详见 Release 的 release-acceptance.json。npm `dsh-openwrite@0.2.12` 和 GitHub Release 均已发布,`latest` 已更新到 0.2.12;从公共 npm registry 无认证重新下载后,SHA-256 与上述 CI / Release 包一致。合并后的[主分支完整 CI](https://github.com/LiPu-jpg/Openwrite/actions/runs/37390503895)也已通过。
132
220
 
133
221
  本版修复 #50–#52 的 0.2 宿主兼容问题及 #54 阅读模式刷新闪烁,纳入 #53 的导航和会话作用域改动,并保留旧宿主的预设插件。
134
222
 
@@ -0,0 +1,16 @@
1
+ # 选区与中断升级补修
2
+
3
+ 本轮对应未发布候选 0.2.28 / Core 5.8.19;公开版本仍为 0.2.27。来自已关闭报告的相关路径复查,四个问题均先独立复现,再加入回归。
4
+
5
+ | 问题 | 修复后行为 | 验证 |
6
+ | --- | --- | --- |
7
+ | CRLF 或混合行尾在编辑器内变成 LF,选区错位或原文不匹配 | 根据完整原文与编辑器文本映射行尾边界,发送保存文件的原始片段 | 原生面板与 wheel 内独立 Studio 两条界面路径、真实 HTTP 多行选区 |
8
+ | emoji 等字符的 JavaScript UTF-16 与 Python 字符索引不一致 | 请求使用原文 Unicode 码点坐标,批注也按原文坐标映射;重复句仍命中所选的那次 | emoji 前缀、第二次重复句、混合行尾与无末尾换行组合 |
9
+ | 升级中断后 active profile 已移走,恢复脚本找不到依赖 | 恢复使用与正常升级互斥的原生文件锁,无须从已移走的 profile 加载依赖;恢复前核对备份清单指纹 | 独立脚本、失效依赖链接、锁互斥/心跳/陈旧锁和修改备份拒绝 |
10
+ | 被中断的缓存写入留下不完整 tgz,重试永久冲突 | 完整写入并校验临时文件,再原子替换损坏缓存 | 预置部分缓存后重试成功,校验包指纹及临时文件清理 |
11
+
12
+ 映射只容许换行表示不同;正文编辑、普通空格与 NBSP 差别、半个代理对或半个 CRLF 边界均拒绝,不做模糊匹配。提交修订时另带整篇 revision:即使选区外正文变化,也在调用生成器前返回 DOCUMENT_CONFLICT,现有文件保持原样。两端共用映射源,docs:check 校验 wheel 中生成字节。
13
+
14
+ 本地验证:Core 全量 1542 passed / 32 skipped,修订服务与真实 HTTP 23 passed,原生预设/升级/运行时 40 passed,managed 33 passed,界面 319 passed,插件完整检查通过。独立 Studio 用打包 wheel 内的实际绑定代码测试隐藏 textarea 的换行规范化;HTTP 用实际两端映射模块发送请求。测试使用隔离自动化目录,未调用模型。
15
+
16
+ 跨平台最终结果及确切来源在 [发布验收](RELEASE_ACCEPTANCE.md) 记录。#123 的宿主正式发布与 Android/Termux 真机验证仍未完成,本轮修复不解除发布暂停。