dsh-plugin-dev-kb 1.8.0 → 1.8.1

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 (229) hide show
  1. package/CHANGELOG.md +186 -178
  2. package/README.en.md +172 -172
  3. package/README.md +183 -183
  4. package/kb/INDEX.md +236 -234
  5. package/kb/README.md +88 -88
  6. package/kb/extra/AGENTS.md +77 -77
  7. package/kb/extra/deepseek-llm-api-wire-extensions.md +162 -162
  8. package/kb/extra/deepseek-llm-api-wire-extensions.zh.md +162 -162
  9. package/kb/extra/defensive-patterns/package-surface.md +233 -232
  10. package/kb/extra/defensive-patterns/package-surface.zh.md +233 -232
  11. package/kb/extra/defensive-patterns/remote-and-api.md +117 -117
  12. package/kb/extra/defensive-patterns/remote-and-api.zh.md +117 -117
  13. package/kb/extra/development.md +221 -221
  14. package/kb/extra/development.zh.md +228 -228
  15. package/kb/extra/event-producer-consumer.md +133 -123
  16. package/kb/extra/event-producer-consumer.zh.md +135 -125
  17. package/kb/extra/module-graph.md +1961 -1888
  18. package/kb/extra/module-graph.zh.md +1963 -1890
  19. package/kb/extra/persistence-changes/2026-11-05-timeline-priority-notice.md +60 -0
  20. package/kb/extra/persistence-changes/2026-11-05-timeline-priority-notice.zh.md +60 -0
  21. package/kb/extra/persistence-changes/README.md +92 -92
  22. package/kb/extra/persistence-changes/README.zh.md +92 -92
  23. package/kb/extra/persistence-changes/historical-formats/README.md +75 -75
  24. package/kb/extra/persistence-changes/historical-formats/README.zh.md +75 -75
  25. package/kb/extra/persistence-changes/releases/README.md +103 -103
  26. package/kb/extra/persistence-changes/releases/README.zh.md +103 -103
  27. package/kb/extra/rescope.md +55 -55
  28. package/kb/extra/rescope.zh.md +55 -55
  29. package/kb/extra/subsystems/boot.md +631 -621
  30. package/kb/extra/subsystems/boot.zh.md +631 -621
  31. package/kb/extra/subsystems/computer-use.md +179 -137
  32. package/kb/extra/subsystems/computer-use.zh.md +179 -137
  33. package/kb/extra/subsystems/extensions.md +387 -384
  34. package/kb/extra/subsystems/extensions.zh.md +387 -384
  35. package/kb/extra/subsystems/feedback.md +418 -400
  36. package/kb/extra/subsystems/feedback.zh.md +418 -400
  37. package/kb/extra/subsystems/forge.md +2169 -1226
  38. package/kb/extra/subsystems/forge.zh.md +2171 -1226
  39. package/kb/extra/subsystems/liveshare.md +167 -158
  40. package/kb/extra/subsystems/liveshare.zh.md +167 -158
  41. package/kb/extra/subsystems/mcp.md +237 -234
  42. package/kb/extra/subsystems/mcp.zh.md +237 -234
  43. package/kb/extra/subsystems/office-kit.md +122 -0
  44. package/kb/extra/subsystems/office-kit.zh.md +122 -0
  45. package/kb/extra/subsystems/working-directory.md +95 -64
  46. package/kb/extra/subsystems/working-directory.zh.md +95 -64
  47. package/kb/extra/subsystems/worktrees.md +187 -127
  48. package/kb/extra/subsystems/worktrees.zh.md +187 -127
  49. package/kb/extra/upgrade-guide/v0.2.1-alpha.1/python-ptc-sandbox/guide.md +21 -21
  50. package/kb/extra/upgrade-guide/v0.2.1-alpha.1/python-ptc-sandbox/guide.zh.md +21 -21
  51. package/kb/extra/upgrade-guide/v0.2.1-rc.4/sandbox-unsupported-policy-error/guide.md +18 -0
  52. package/kb/extra/upgrade-guide/v0.2.1-rc.4/sandbox-unsupported-policy-error/guide.zh.md +18 -0
  53. package/kb/extra/upgrade-guide/v0.2.2-alpha.2/llm-error-builtin-codes/guide.md +18 -0
  54. package/kb/extra/upgrade-guide/v0.2.2-alpha.2/llm-error-builtin-codes/guide.zh.md +18 -0
  55. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-kit-package/guide.md +34 -0
  56. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-kit-package/guide.zh.md +34 -0
  57. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.md +49 -0
  58. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.zh.md +49 -0
  59. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-skill-resources/guide.md +36 -0
  60. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-skill-resources/guide.zh.md +36 -0
  61. package/kb/extra/upgrade-guide/v0.2.2-rc.1/account-notification-fields/guide.md +26 -0
  62. package/kb/extra/upgrade-guide/v0.2.2-rc.1/account-notification-fields/guide.zh.md +26 -0
  63. package/kb/extra/upgrade-guide/v0.2.2-rc.1/account-remote-provider/guide.md +22 -0
  64. package/kb/extra/upgrade-guide/v0.2.2-rc.1/account-remote-provider/guide.zh.md +22 -0
  65. package/kb/extra/upgrade-guide/v0.2.2-rc.1/archive-worktrees/guide.md +21 -0
  66. package/kb/extra/upgrade-guide/v0.2.2-rc.1/archive-worktrees/guide.zh.md +21 -0
  67. package/kb/extra/upgrade-guide/v0.2.2-rc.1/attachment-error-codes/guide.md +23 -0
  68. package/kb/extra/upgrade-guide/v0.2.2-rc.1/attachment-error-codes/guide.zh.md +23 -0
  69. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-ax-read-limits/guide.md +20 -0
  70. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-ax-read-limits/guide.zh.md +20 -0
  71. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-hover-ax-only/guide.md +18 -0
  72. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-hover-ax-only/guide.zh.md +18 -0
  73. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-native-platform/guide.md +23 -0
  74. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-native-platform/guide.zh.md +23 -0
  75. package/kb/extra/upgrade-guide/v0.2.2-rc.1/dsh-doc-skill/guide.md +35 -0
  76. package/kb/extra/upgrade-guide/v0.2.2-rc.1/dsh-doc-skill/guide.zh.md +35 -0
  77. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-change-request-overview/guide.md +26 -0
  78. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-change-request-overview/guide.zh.md +26 -0
  79. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-pinned-diff/guide.md +26 -0
  80. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-pinned-diff/guide.zh.md +26 -0
  81. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-review-reads/guide.md +19 -0
  82. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-review-reads/guide.zh.md +19 -0
  83. package/kb/extra/upgrade-guide/v0.2.2-rc.1/package-export-cleanup/guide.md +26 -0
  84. package/kb/extra/upgrade-guide/v0.2.2-rc.1/package-export-cleanup/guide.zh.md +26 -0
  85. package/kb/extra/upgrade-guide/v0.2.2-rc.1/plugin-update-method/guide.md +22 -0
  86. package/kb/extra/upgrade-guide/v0.2.2-rc.1/plugin-update-method/guide.zh.md +22 -0
  87. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-bootstrap-protocol/guide.md +25 -0
  88. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-bootstrap-protocol/guide.zh.md +25 -0
  89. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-inspect-output/guide.md +48 -0
  90. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-inspect-output/guide.zh.md +48 -0
  91. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-scoped-repl-default/guide.md +45 -0
  92. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-scoped-repl-default/guide.zh.md +45 -0
  93. package/kb/extra/upgrade-guide/v0.2.2-rc.1/runtime-context-reminders/guide.md +19 -0
  94. package/kb/extra/upgrade-guide/v0.2.2-rc.1/runtime-context-reminders/guide.zh.md +19 -0
  95. package/kb/extra/upgrade-guide/v0.2.2-rc.1/session-append-overloads/guide.md +17 -0
  96. package/kb/extra/upgrade-guide/v0.2.2-rc.1/session-append-overloads/guide.zh.md +17 -0
  97. package/kb/extra/upgrade-guide/v0.2.2-rc.1/subagent-interrupt-default/guide.md +27 -0
  98. package/kb/extra/upgrade-guide/v0.2.2-rc.1/subagent-interrupt-default/guide.zh.md +27 -0
  99. package/kb/extra/upgrade-guide/v0.2.2-rc.1/terminal-backend-cleanup-error/guide.md +20 -0
  100. package/kb/extra/upgrade-guide/v0.2.2-rc.1/terminal-backend-cleanup-error/guide.zh.md +20 -0
  101. package/kb/extra/upgrade-guide/v0.2.2-rc.1/terminal-bundle-sidebar-backend/guide.md +19 -0
  102. package/kb/extra/upgrade-guide/v0.2.2-rc.1/terminal-bundle-sidebar-backend/guide.zh.md +19 -0
  103. package/kb/extra/upgrade-guide/v0.2.2-rc.1/web-fetch-transport-error-codes/guide.md +18 -0
  104. package/kb/extra/upgrade-guide/v0.2.2-rc.1/web-fetch-transport-error-codes/guide.zh.md +18 -0
  105. package/kb/extra/upgrade-guide/v0.2.2-rc.1/web-search-billing/guide.md +41 -0
  106. package/kb/extra/upgrade-guide/v0.2.2-rc.1/web-search-billing/guide.zh.md +41 -0
  107. package/kb/extra/upgrade-guide/v0.2.2-rc.1/window-drag-regions/guide.md +21 -0
  108. package/kb/extra/upgrade-guide/v0.2.2-rc.1/window-drag-regions/guide.zh.md +21 -0
  109. package/kb/extra/upgrade-guide/v0.2.2-rc.2/client-module-metadata/guide.md +29 -0
  110. package/kb/extra/upgrade-guide/v0.2.2-rc.2/client-module-metadata/guide.zh.md +29 -0
  111. package/kb/extra/upgrade-guide/v0.2.2-rc.2/connection-page-peer/guide.md +25 -0
  112. package/kb/extra/upgrade-guide/v0.2.2-rc.2/connection-page-peer/guide.zh.md +25 -0
  113. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cordis-root-and-intercept-metadata/guide.md +31 -0
  114. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cordis-root-and-intercept-metadata/guide.zh.md +31 -0
  115. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-agents-without-preset/guide.md +24 -0
  116. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-agents-without-preset/guide.zh.md +24 -0
  117. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-macos-provider/guide.md +24 -0
  118. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-macos-provider/guide.zh.md +24 -0
  119. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-partial-observations/guide.md +19 -0
  120. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-partial-observations/guide.zh.md +19 -0
  121. package/kb/extra/upgrade-guide/v0.2.2-rc.2/deepseek-files-timeout/guide.md +15 -0
  122. package/kb/extra/upgrade-guide/v0.2.2-rc.2/deepseek-files-timeout/guide.zh.md +15 -0
  123. package/kb/extra/upgrade-guide/v0.2.2-rc.2/experimental-tool-error-codes/guide.md +28 -0
  124. package/kb/extra/upgrade-guide/v0.2.2-rc.2/experimental-tool-error-codes/guide.zh.md +28 -0
  125. package/kb/extra/upgrade-guide/v0.2.2-rc.2/package-export-cleanup/guide.md +36 -0
  126. package/kb/extra/upgrade-guide/v0.2.2-rc.2/package-export-cleanup/guide.zh.md +36 -0
  127. package/kb/extra/upgrade-guide/v0.2.2-rc.2/python-ptc-removal/guide.md +22 -0
  128. package/kb/extra/upgrade-guide/v0.2.2-rc.2/python-ptc-removal/guide.zh.md +22 -0
  129. package/kb/extra/upgrade-guide/v0.2.2-rc.2/session-status-package/guide.md +31 -0
  130. package/kb/extra/upgrade-guide/v0.2.2-rc.2/session-status-package/guide.zh.md +31 -0
  131. package/kb/extra/upgrade-guide/v0.2.2-rc.2/shared-search-filter/guide.md +18 -0
  132. package/kb/extra/upgrade-guide/v0.2.2-rc.2/shared-search-filter/guide.zh.md +18 -0
  133. package/kb/extra/upgrade-guide/v0.2.2-rc.2/shell-fs-tool-error-codes/guide.md +30 -0
  134. package/kb/extra/upgrade-guide/v0.2.2-rc.2/shell-fs-tool-error-codes/guide.zh.md +30 -0
  135. package/kb/extra/web-styling.md +57 -57
  136. package/kb/extra/web-styling.zh.md +57 -57
  137. package/kb/meta/search-index.json +4508 -3980
  138. package/kb/meta/source.json +18 -18
  139. package/kb/site/develop/practice/llm-adapter.md +192 -192
  140. package/kb/site/en/develop/practice/llm-adapter.md +192 -192
  141. package/kb/site/en/guide/desktop-uninstall-cleanup.md +63 -0
  142. package/kb/site/en/guide/plugin-market.md +153 -151
  143. package/kb/site/en/guide/providers.md +234 -234
  144. package/kb/site/en/guide/quickstart.md +35 -34
  145. package/kb/site/en/reference/capability-seams.md +789 -767
  146. package/kb/site/en/reference/config-catalog.md +5432 -5128
  147. package/kb/site/en/reference/cookbook/adding-a-package.md +175 -175
  148. package/kb/site/en/reference/cookbook/adding-a-tool.md +105 -104
  149. package/kb/site/en/reference/cookbook/extension-cookbook.md +178 -135
  150. package/kb/site/en/reference/cordis-api/context.md +373 -369
  151. package/kb/site/en/reference/cordis-api/fiber.md +457 -433
  152. package/kb/site/en/reference/cordis-api/inherited.md +44 -44
  153. package/kb/site/en/reference/cordis-api/service.md +118 -107
  154. package/kb/site/en/reference/experimental-persistence-catalog.md +36 -23
  155. package/kb/site/en/reference/index.md +174 -174
  156. package/kb/site/en/reference/persistence-catalog.md +9453 -9432
  157. package/kb/site/en/reference/subsystems/compaction.md +288 -288
  158. package/kb/site/en/reference/subsystems/core.md +1172 -1171
  159. package/kb/site/en/reference/subsystems/credentials.md +526 -497
  160. package/kb/site/en/reference/subsystems/filesystem.md +708 -708
  161. package/kb/site/en/reference/subsystems/index.md +82 -82
  162. package/kb/site/en/reference/subsystems/llm-streaming.md +1290 -1288
  163. package/kb/site/en/reference/subsystems/lsp.md +230 -206
  164. package/kb/site/en/reference/subsystems/persistence.md +451 -432
  165. package/kb/site/en/reference/subsystems/plan.md +91 -91
  166. package/kb/site/en/reference/subsystems/ptc-runtime.md +295 -261
  167. package/kb/site/en/reference/subsystems/sandbox.md +250 -232
  168. package/kb/site/en/reference/subsystems/session-query.md +525 -515
  169. package/kb/site/en/reference/subsystems/session-reference.md +231 -229
  170. package/kb/site/en/reference/subsystems/session.md +1478 -1431
  171. package/kb/site/en/reference/subsystems/sidebar-right.md +165 -165
  172. package/kb/site/en/reference/subsystems/skills.md +356 -356
  173. package/kb/site/en/reference/subsystems/slots.md +235 -231
  174. package/kb/site/en/reference/subsystems/terminal.md +188 -188
  175. package/kb/site/en/reference/subsystems/tools.md +902 -891
  176. package/kb/site/en/reference/subsystems/user-questions.md +330 -327
  177. package/kb/site/en/reference/subsystems/web-client.md +161 -104
  178. package/kb/site/en/reference/subsystems/web-server.md +434 -351
  179. package/kb/site/en/reference/subsystems/web.md +268 -268
  180. package/kb/site/en/reference/subsystems/workflow.md +287 -282
  181. package/kb/site/en/reference/subsystems/workspace.md +743 -651
  182. package/kb/site/en/reference/tool-catalog.md +2867 -2704
  183. package/kb/site/guide/desktop-uninstall-cleanup.md +63 -0
  184. package/kb/site/guide/plugin-market.md +153 -151
  185. package/kb/site/guide/providers.md +234 -234
  186. package/kb/site/guide/quickstart.md +35 -34
  187. package/kb/site/reference/capability-seams.md +789 -767
  188. package/kb/site/reference/config-catalog.md +5432 -5128
  189. package/kb/site/reference/cookbook/adding-a-package.md +175 -175
  190. package/kb/site/reference/cookbook/adding-a-tool.md +107 -106
  191. package/kb/site/reference/cookbook/extension-cookbook.md +182 -139
  192. package/kb/site/reference/cordis-api/context.md +373 -369
  193. package/kb/site/reference/cordis-api/fiber.md +459 -435
  194. package/kb/site/reference/cordis-api/inherited.md +44 -44
  195. package/kb/site/reference/cordis-api/service.md +118 -107
  196. package/kb/site/reference/experimental-persistence-catalog.md +36 -23
  197. package/kb/site/reference/index.md +178 -178
  198. package/kb/site/reference/persistence-catalog.md +9453 -9432
  199. package/kb/site/reference/subsystems/compaction.md +288 -288
  200. package/kb/site/reference/subsystems/core.md +1184 -1183
  201. package/kb/site/reference/subsystems/credentials.md +526 -497
  202. package/kb/site/reference/subsystems/filesystem.md +708 -708
  203. package/kb/site/reference/subsystems/index.md +82 -82
  204. package/kb/site/reference/subsystems/llm-streaming.md +1296 -1294
  205. package/kb/site/reference/subsystems/lsp.md +230 -206
  206. package/kb/site/reference/subsystems/persistence.md +451 -432
  207. package/kb/site/reference/subsystems/plan.md +91 -91
  208. package/kb/site/reference/subsystems/ptc-runtime.md +295 -261
  209. package/kb/site/reference/subsystems/sandbox.md +250 -232
  210. package/kb/site/reference/subsystems/session-query.md +525 -515
  211. package/kb/site/reference/subsystems/session-reference.md +231 -229
  212. package/kb/site/reference/subsystems/session.md +1482 -1435
  213. package/kb/site/reference/subsystems/sidebar-right.md +165 -165
  214. package/kb/site/reference/subsystems/skills.md +356 -356
  215. package/kb/site/reference/subsystems/slots.md +239 -235
  216. package/kb/site/reference/subsystems/terminal.md +188 -188
  217. package/kb/site/reference/subsystems/tools.md +902 -891
  218. package/kb/site/reference/subsystems/user-questions.md +330 -327
  219. package/kb/site/reference/subsystems/web-client.md +161 -104
  220. package/kb/site/reference/subsystems/web-server.md +434 -351
  221. package/kb/site/reference/subsystems/web.md +268 -268
  222. package/kb/site/reference/subsystems/workflow.md +287 -282
  223. package/kb/site/reference/subsystems/workspace.md +743 -651
  224. package/kb/site/reference/tool-catalog.md +2872 -2709
  225. package/lib/index.js +359 -359
  226. package/package.json +68 -68
  227. package/skills/dsh-plugin-dev-kb.md +71 -70
  228. package/kb/extra/subsystems/office-to-pdf.md +0 -87
  229. package/kb/extra/subsystems/office-to-pdf.zh.md +0 -87
@@ -0,0 +1,20 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "TerminalBackendCleanupError 改为继承 TerminalError 而非 AggregateError,并带 CLEANUP_FAILED 错误码。"
4
+ ---
5
+
6
+ # `TerminalBackendCleanupError` 改为继承 `TerminalError`
7
+
8
+ [English](guide.md) | 中文
9
+
10
+ ## 变更
11
+
12
+ `@deepseek-ai/dsh-terminal` 导出的 `TerminalBackendCleanupError` 由 PTY 后端在启动失败且清理部分资源也失败时抛出。它原先继承 `AggregateError`,现在继承 `TerminalError`,因此是带 code `CLEANUP_FAILED` 的 `HarnessError`,携带它的工具结果会记录 `error.name` `TerminalBackendCleanupError` 和 `error.code` `CLEANUP_FAILED`。构造函数、`name`、`spawnError`、`cleanupError` 以及按原顺序排列的 `errors` 列表不变;`errors` 的类型由 `any[]` 改为 `readonly unknown[]`。`cause` 新增为同样两个失败组成的 `AggregateError`。`error instanceof AggregateError` 现在为 `false`。
13
+
14
+ 只构造该错误、读取 `spawnError` 或 `cleanupError`、或检查 `instanceof TerminalBackendCleanupError` 的后端与消费方不受影响。
15
+
16
+ ## 迁移
17
+
18
+ 1. 把针对该错误的 `error instanceof AggregateError` 检查改为 `error instanceof TerminalBackendCleanupError`,或对 `TerminalError` 检查 `error.code === 'CLEANUP_FAILED'`。
19
+ 2. TypeScript 代码未经收窄就读取 `error.errors` 元素成员时,先收窄每个 `unknown` 元素,或改为读取 `spawnError` 与 `cleanupError`。
20
+ 3. 在消费项目中运行 `pnpm exec tsc --noEmit` 确认通过,并检查启动清理失败仍会进入原有的处理路径。
@@ -0,0 +1,19 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "The experimental terminal bundle opens Agent terminals in the Web sidebar and replaces its optional-terminal-bash and optional-terminal-pwsh rows with optional-terminal-panel."
4
+ ---
5
+ # Persistent terminals open in the Web sidebar
6
+
7
+ English | [中文](guide.zh.md)
8
+
9
+ ## Change
10
+
11
+ The **Persistent terminals** bundle (`@deepseek-ai/dsh-experimental-terminal-bundle`) used to run Agent terminals through `@deepseek-ai/dsh-terminal-bash`: a profile-free Bash on POSIX and PowerShell on Windows, invisible to the person, with sandbox-mode changes refused while one was open. Its `optional-persistent-terminals` group now mounts [`@deepseek-ai/dsh-terminal-panel`](../../../../packages/experimental/terminal-panel/README.md) instead. Each `terminal_open` becomes a sidebar tab running the execution environment's default shell with the person's startup files, or `pwsh` then `powershell` on Windows; the person can type into it and take it over. The bundle also registers `user_terminal_list` and `user_terminal_read`, and it requires the Web or Desktop composition, which mounts the terminal controller.
12
+
13
+ Profile patches that target the removed `optional-terminal-bash` or `optional-terminal-pwsh` rows, or that configure `@deepseek-ai/dsh-terminal-bash` options such as `pollIntervalMs` through them, no longer apply. Headless or other compositions without the terminal controller no longer get a working `shell` backend from this bundle.
14
+
15
+ ## Migration
16
+
17
+ 1. In your profile patch (`cordis.patch.yml`), remove entries for the ids `optional-terminal-bash` and `optional-terminal-pwsh`. To tune the new backend, target `optional-terminal-panel` with [its configuration fields](../../../../packages/experimental/terminal-panel/README.md#use-this-package), for example `config: { timeoutMs: 60000 }` or `config: { readUserTerminals: false }`.
18
+ 2. For headless use, mount `@deepseek-ai/dsh-terminal`, `@deepseek-ai/dsh-terminal-bash` and `@deepseek-ai/dsh-tool-terminal` in your own patch instead of enabling the bundle.
19
+ 3. Confirm the migration by keeping `@deepseek-ai/dsh-experimental-terminal-bundle` in `dsh.profile.bundles` of `$DSH_HOME/profiles/<name>/package.json`, restarting that profile, and asking the Agent to open a terminal: a tab with an **Agent** badge appears in the sidebar.
@@ -0,0 +1,19 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "实验终端 bundle 改为在 Web 侧栏打开 Agent 终端,并用 optional-terminal-panel 行替换 optional-terminal-bash 和 optional-terminal-pwsh 行。"
4
+ ---
5
+ # 持久终端改为在 Web 侧栏打开
6
+
7
+ [English](guide.md) | 中文
8
+
9
+ ## 变更
10
+
11
+ **持久终端** bundle(`@deepseek-ai/dsh-experimental-terminal-bundle`)原先通过 `@deepseek-ai/dsh-terminal-bash` 运行 Agent 终端:POSIX 上是不加载配置文件的 Bash,Windows 上是 PowerShell,人看不到这些终端,而且有终端打开时会拒绝切换沙箱模式。现在它的 `optional-persistent-terminals` 分组改为挂载 [`@deepseek-ai/dsh-terminal-panel`](../../../../packages/experimental/terminal-panel/README.zh.md)。每次 `terminal_open` 都会成为一个侧栏标签页,运行执行环境的默认 shell 并加载人的启动文件,Windows 上依次优先 `pwsh` 和 `powershell`;人可以在其中输入并接管。该 bundle 还会注册 `user_terminal_list` 和 `user_terminal_read`,并且需要挂载终端控制器的 Web 或 Desktop 组合。
12
+
13
+ 针对已移除的 `optional-terminal-bash` 或 `optional-terminal-pwsh` 行的 profile patch,以及借这些行配置 `@deepseek-ai/dsh-terminal-bash` 选项(例如 `pollIntervalMs`)的 patch,都不再生效。没有终端控制器的 headless 或其他组合,不再能从这个 bundle 得到可用的 `shell` 后端。
14
+
15
+ ## 迁移
16
+
17
+ 1. 在 profile patch(`cordis.patch.yml`)中删除针对 id `optional-terminal-bash` 和 `optional-terminal-pwsh` 的条目。如需调整新后端,请以 `optional-terminal-panel` 为目标,使用[它的配置字段](../../../../packages/experimental/terminal-panel/README.zh.md#use-this-package),例如 `config: { timeoutMs: 60000 }` 或 `config: { readUserTerminals: false }`。
18
+ 2. 在 headless 中使用时,不要启用该 bundle,而是在自己的 patch 中挂载 `@deepseek-ai/dsh-terminal`、`@deepseek-ai/dsh-terminal-bash` 和 `@deepseek-ai/dsh-tool-terminal`。
19
+ 3. 确认 `$DSH_HOME/profiles/<name>/package.json` 的 `dsh.profile.bundles` 中保留 `@deepseek-ai/dsh-experimental-terminal-bundle`,重启该 profile,再让 Agent 打开一个终端,侧栏中出现带 **Agent** 徽标的标签页,即说明迁移完成。
@@ -0,0 +1,18 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "Local HTTP fetch transport failures raise classified WEB_FETCH_* codes instead of WEB_PROVIDER_ERROR."
4
+ ---
5
+
6
+ # Local HTTP fetch transport failures use classified codes
7
+
8
+ English | [中文](guide.zh.md)
9
+
10
+ ## Change
11
+
12
+ The local HTTP fetch provider (`dsh-web-fetch-http`) previously raised `WEB_PROVIDER_ERROR` with the text `web fetch failed: TypeError: fetch failed` for every network failure before or during the response. It now raises one of `WEB_FETCH_DNS_FAILED`, `WEB_FETCH_CONNECTION_REFUSED`, `WEB_FETCH_CONNECTION_TIMEOUT`, `WEB_FETCH_CERTIFICATE_INVALID`, `WEB_FETCH_CONNECTION_INTERRUPTED`, `WEB_FETCH_NETWORK_UNREACHABLE`, or `WEB_FETCH_NETWORK_ERROR` for an unrecognized failure. The message names the failure class, the system error code, and the underlying error. The same code appears in the `error.code` of new `web_fetch` tool results. Callers of `ctx.web.fetch()` and readers of tool-result error codes that match `WEB_PROVIDER_ERROR` for network failures are affected. Other providers, and other `dsh-web-fetch-http` failures, are unchanged.
13
+
14
+ ## Migration
15
+
16
+ 1. Where code routes local fetch network failures on `WEB_PROVIDER_ERROR`, match the seven codes above instead.
17
+ 2. Do not parse the message text; it is diagnostic and may change.
18
+ 3. Confirm by fetching an unresolvable host, such as `http://example.invalid/`, and checking that the error code is `WEB_FETCH_DNS_FAILED`.
@@ -0,0 +1,18 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "本地 HTTP 抓取的传输故障改为抛出分类后的 WEB_FETCH_* 代码,而不是 WEB_PROVIDER_ERROR。"
4
+ ---
5
+
6
+ # 本地 HTTP 抓取的传输故障使用分类代码
7
+
8
+ [English](guide.md) | 中文
9
+
10
+ ## 变更
11
+
12
+ 本地 HTTP 抓取提供方(`dsh-web-fetch-http`)以前在响应之前或响应期间遇到任何网络故障时,都会抛出 `WEB_PROVIDER_ERROR`,文本为 `web fetch failed: TypeError: fetch failed`。现在它会抛出 `WEB_FETCH_DNS_FAILED`、`WEB_FETCH_CONNECTION_REFUSED`、`WEB_FETCH_CONNECTION_TIMEOUT`、`WEB_FETCH_CERTIFICATE_INVALID`、`WEB_FETCH_CONNECTION_INTERRUPTED`、`WEB_FETCH_NETWORK_UNREACHABLE` 之一;无法识别的故障则抛出 `WEB_FETCH_NETWORK_ERROR`。错误消息会写明故障类别、系统错误码和底层错误。新的 `web_fetch` 工具结果的 `error.code` 中也会出现相同的代码。受影响的是 `ctx.web.fetch()` 的调用方,以及对网络故障匹配 `WEB_PROVIDER_ERROR` 的工具结果错误码读取方。其他提供方,以及 `dsh-web-fetch-http` 的其他故障,均不受影响。
13
+
14
+ ## 迁移
15
+
16
+ 1. 如果代码按 `WEB_PROVIDER_ERROR` 路由本地抓取的网络故障,改为匹配上述七个代码。
17
+ 2. 不要解析错误消息文本;它仅用于诊断,可能会变化。
18
+ 3. 抓取一个无法解析的主机(例如 `http://example.invalid/`),确认错误码为 `WEB_FETCH_DNS_FAILED`。
@@ -0,0 +1,41 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "DeepSeek Search and Fetch add per-capability billing and replace provider authentication fields with ordered credential sources."
4
+ ---
5
+
6
+ # DeepSeek web search and fetch choose their credential by billing
7
+
8
+ English | [中文](guide.zh.md)
9
+
10
+ ## Change
11
+
12
+ The DeepSeek Search and Fetch APIs (`web-deepseek-api`) previously used the signed-in account only in `deepseek-account` conversations; other conversations required an API key. New `searchBilling` and `fetchBilling` settings accept `auto` (default), `account`, or `api-key`. With `auto`, DeepSeek model routes behave as before; other conversations and operations outside a Session now use the signed-in account when no key exists. `account` uses only the account; `api-key` only the key. Non-empty `*BaseURL` or `*ApiKeyEnv` settings still take precedence. Other providers, including local HTTP fetch, are unaffected.
13
+
14
+ In TypeScript, `DeepSeekSearchApiOptions` and `DeepSeekFetchApiOptions` lose their top-level `baseURL`. Their `auth` becomes `{ sources, missingCredentialMessage? }`. Each account or API-key source carries its own address; list order replaces the implicit account-first order. Direct provider constructors must migrate.
15
+
16
+ With an `AbortSignal`, credential-read errors now retain the original `Error` as `cause` and its name in the diagnostic without an extra `Error:` wrapper. A resolver throwing a DOMException named `AbortError` now yields `WEB_ABORTED`, not `WEB_PROVIDER_ERROR`, even when that signal is not aborted. The no-signal path already behaves this way.
17
+
18
+ ## Migration
19
+
20
+ 1. To disable the new account fallback, set both capabilities to `api-key` on the `web-deepseek-api` row, or choose **DeepSeek API key** under **Plugins > Built-in plugin settings > Web search and fetch** when each DeepSeek API is selected:
21
+
22
+ ```yaml
23
+ - name: '@deepseek-ai/dsh-web-deepseek-api'
24
+ config:
25
+ searchBilling: api-key
26
+ fetchBilling: api-key
27
+ ```
28
+
29
+ This also disables account billing in account conversations; it does not fully restore the old route-dependent behavior.
30
+ 2. Migrate direct `DeepSeekSearchApiProvider` and `DeepSeekFetchApiProvider` constructors. The table describes TypeScript options, not YAML settings:
31
+
32
+ | Old option | Replacement |
33
+ |---|---|
34
+ | `baseURL: base`, `auth.apiKey: key` | `auth.sources: [{ kind: 'api-key', baseURL: base, key }]` |
35
+ | `auth.resolveApiKey`, `auth.apiKeyEnv` | An API-key source with `key: { ref, configured, resolve }`. Keep the reference (`DEEPSEEK_API_KEY` when omitted); `configured()` checks presence without reading the value, and `resolve()` reads it. |
36
+ | `auth.account` | `{ kind: 'account', ...account }`; preserve its address and callbacks. Place it before the Key source to retain account-first behavior. |
37
+ | `auth.missingKeyMessage` | `auth.missingCredentialMessage` |
38
+ | `auth.invalidRoute` | `{ kind: 'misconfigured', message }` at the position of the invalid source; it fails only when reached. |
39
+
40
+ 3. Update error handling to recognize resolver `AbortError` as cancellation. Do not depend on the extra error wrapper or its diagnostic prefix.
41
+ 4. Confirm migrated constructors type-check. With the DeepSeek APIs selected and `api-key` billing, missing keys withhold their tools; configured keys allow requests. Local HTTP fetch remains unaffected.
@@ -0,0 +1,41 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "DeepSeek Search 与 Fetch 新增按能力选择的计费方式,并将提供方认证字段替换为有序凭据来源。"
4
+ ---
5
+
6
+ # DeepSeek 网页搜索与获取按计费方式选择凭据
7
+
8
+ [English](guide.md) | 中文
9
+
10
+ ## 变更
11
+
12
+ DeepSeek Search 与 Fetch API(`web-deepseek-api`)过去只在 `deepseek-account` 会话中使用已登录账号;其他会话需要 API 密钥。新增的 `searchBilling` 与 `fetchBilling` 设置接受 `auto`(默认)、`account` 或 `api-key`。在 `auto` 下,DeepSeek 模型路由的行为不变;其他会话与会话之外的操作在没有密钥时改用已登录账号。`account` 只使用账号,`api-key` 只使用密钥。非空的 `*BaseURL` 或 `*ApiKeyEnv` 设置仍然优先。其他提供方(包括本地 HTTP 抓取)不受影响。
13
+
14
+ 在 TypeScript 中,`DeepSeekSearchApiOptions` 与 `DeepSeekFetchApiOptions` 移除了顶层 `baseURL`。其 `auth` 改为 `{ sources, missingCredentialMessage? }`。每个账号或 API 密钥来源携带自己的地址;列表顺序替代隐式的账号优先顺序。直接调用提供方构造函数的代码需要迁移。
15
+
16
+ 传入 `AbortSignal` 时,凭据读取错误现在保留原始 `Error` 作为 `cause`,诊断也保留其名称,不再额外包装一层 `Error:`。解析函数抛出名为 `AbortError` 的 DOMException 时,即使该 signal 未取消,现在也返回 `WEB_ABORTED`,而非 `WEB_PROVIDER_ERROR`。未传 signal 的路径原本就采用此行为。
17
+
18
+ ## 迁移
19
+
20
+ 1. 要禁用新增的账号回退,在 `web-deepseek-api` 行把两个能力都设为 `api-key`;也可以在**插件 > 内置插件配置 > 网页搜索与获取**中,选中相应的 DeepSeek API 后选择 **DeepSeek API Key**:
21
+
22
+ ```yaml
23
+ - name: '@deepseek-ai/dsh-web-deepseek-api'
24
+ config:
25
+ searchBilling: api-key
26
+ fetchBilling: api-key
27
+ ```
28
+
29
+ 这也会禁用账号会话中的账号计费,并不能完全恢复原来按路由选择的行为。
30
+ 2. 迁移直接调用 `DeepSeekSearchApiProvider` 与 `DeepSeekFetchApiProvider` 构造函数的代码。下表描述 TypeScript 选项,而非 YAML 设置:
31
+
32
+ | 原选项 | 替换方式 |
33
+ |---|---|
34
+ | `baseURL: base`、`auth.apiKey: key` | `auth.sources: [{ kind: 'api-key', baseURL: base, key }]` |
35
+ | `auth.resolveApiKey`、`auth.apiKeyEnv` | API 密钥来源的 `key: { ref, configured, resolve }`。保留原引用(省略时为 `DEEPSEEK_API_KEY`);`configured()` 只检查是否存在,不读取值,`resolve()` 读取值。 |
36
+ | `auth.account` | `{ kind: 'account', ...account }`;保留其地址和回调。放在 Key 来源之前可保留账号优先行为。 |
37
+ | `auth.missingKeyMessage` | `auth.missingCredentialMessage` |
38
+ | `auth.invalidRoute` | 在无效来源的位置放置 `{ kind: 'misconfigured', message }`;只有轮到该项才失败。 |
39
+
40
+ 3. 更新错误处理,将解析函数的 `AbortError` 识别为取消。不要依赖额外的错误包装层或其诊断前缀。
41
+ 4. 确认迁移后的构造代码通过类型检查。选中 DeepSeek API 并使用 `api-key` 计费时,缺少密钥会隐藏相应工具;配置密钥后可以发请求。本地 HTTP 抓取不受影响。
@@ -0,0 +1,21 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "Custom Client overlays that relied on global macOS no-drag exclusions must declare their window regions."
4
+ ---
5
+
6
+ # Explicit window regions for custom Client overlays
7
+
8
+ English | [中文](guide.zh.md)
9
+
10
+ ## Change
11
+
12
+ After upgrading from 0.2.2-rc.1, macOS Desktop automatically excludes interactive controls only inside `data-window-drag` rows or `data-window-drag-controls` scopes. Previously, matching controls and ARIA roles anywhere in the application received `no-drag`. Custom Client plugins that relied on that rule for content covering a draggable header must now declare an exclusion. Ordinary scrollable content without an explicit region declaration contributes no region, so content clipped above its viewport no longer blocks header dragging.
13
+
14
+ This affects custom overlays outside those scopes that cover a drag row. Controls already inside a marked row, overlays using shared primitives with their own exclusions, and components with explicit `no-drag` declarations need no migration. The rule applies only to macOS Desktop; plain Web and Windows behavior is unchanged.
15
+
16
+ ## Migration
17
+
18
+ 1. Inspect the JSX and CSS Modules of custom Client overlays that can cover a header. Check whether their interactive content relied on the previous automatic exclusion.
19
+ 2. For an interactive viewport without nested drag rows, put `data-window-drag-exclude` on its visible viewport element. This excludes the viewport's own rectangle and keeps clipped descendants out of the region calculation. For a container whose controls need separate exclusions, put `data-window-drag-controls` on their containing element. Overlays and containers with nested drag rows must declare their regions separately; follow the [window-region rules](../../../../packages/client/web/README.md#understand-the-implementation).
20
+ 3. Keep exclusions on visible owners rather than every focusable descendant. Use a shared `Modal` or `MenuSurface` for the corresponding overlay, or explicitly exclude the custom overlay's visible box. A body portal with no layout box needs an exclusion on its visible content.
21
+ 4. Load the updated plugin in macOS Desktop. Open the overlay over a header and confirm its controls act without dragging the window. Close it and confirm the header's blank area still drags; scroll the plugin's content out of view and confirm that clipped content does not block the header.
@@ -0,0 +1,21 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "依赖 macOS 全局 no-drag 排除的自定义 Client 浮层必须声明自己的窗口区域。"
4
+ ---
5
+
6
+ # 自定义 Client 浮层显式声明窗口区域
7
+
8
+ [English](guide.md) | 中文
9
+
10
+ ## 变更
11
+
12
+ 从 0.2.2-rc.1 升级后,macOS Desktop 仅自动排除 `data-window-drag` 行或 `data-window-drag-controls` 范围内的交互控件。此前,应用中任意位置匹配的控件和 ARIA role 都会获得 `no-drag`。自定义 Client 插件若依赖该规则使覆盖可拖动页头的内容保持可交互,现在必须声明排除。未显式声明区域的普通滚动内容不贡献区域,因此被裁剪到视口上方的内容不会再阻挡页头拖动。
13
+
14
+ 该变更影响这些范围之外、覆盖拖动行的自定义浮层。已位于标记行内的控件、使用自带排除的共享原语的浮层,以及已显式声明 `no-drag` 的组件无需迁移。规则仅适用于 macOS Desktop,普通 Web 和 Windows 行为不变。
15
+
16
+ ## 迁移
17
+
18
+ 1. 检查可能覆盖页头的自定义 Client 浮层的 JSX 与 CSS Modules,确认其交互内容是否依赖此前的自动排除。
19
+ 2. 对不含嵌套拖动行的交互视口,在可见视口元素上添加 `data-window-drag-exclude`。它仅排除视口自身矩形,使被裁剪的子元素不参与区域计算。若容器内的控件需要分别排除,在承载这些控件的元素上添加 `data-window-drag-controls`。浮层和含嵌套拖动行的容器必须单独声明区域,遵循[窗口区域规则](../../../../packages/client/web/README.zh.md#understand-the-implementation)。
20
+ 3. 在可见区域所有者上声明排除,不要逐个排除可聚焦子元素。对应浮层采用共享 `Modal` 或 `MenuSurface`,或显式排除自定义浮层的可见矩形。不产生布局矩形的 body portal 需在可见内容上声明排除。
21
+ 4. 在 macOS Desktop 加载更新后的插件,将浮层打开到页头上方,确认其控件正常生效且不会拖动窗口。关闭浮层后确认页头空白区域仍可拖动;将插件内容滚出可见区,确认被裁剪内容不会阻挡页头。
@@ -0,0 +1,29 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: Client artifact metadata and static library manifests require rebuilding custom browser bundles and updating direct static-artifact consumers.
4
+ ---
5
+
6
+ # Client module metadata
7
+
8
+ English | [中文](guide.zh.md)
9
+
10
+ ## Change
11
+
12
+ Client bundle registrations can carry `meta` beside `id`, `factory`, and optional `chunk`. The factory still returns the plugin or library exports. Metadata optionally contains `stylesheets`, a record keyed by each stylesheet's path within the owning package, such as `src/client/App.module.css`; each descriptor has `text(context)`, with `context.asset()` resolving carrier asset URLs. Compiled stylesheet imports no longer install DOM nodes during JavaScript factory execution.
13
+
14
+ Static Client library index artifacts keep their named exports and add one more, `__$dsh_client_module_manifest`, carrying the same manifest; its factory returns the library's exports without the manifest. Their ESM imports and dynamic imports remain in the final Web build.
15
+
16
+ Styles of `staticLinked` libraries, including `dsh-client-ui-primitives` and `dsh-client-ui-dockkit`, leave the Web shell's CSS file: the renderer installs them when the application mounts. Their CSS Modules class names change from `_<local>_<hash>` to `<hash>_<local>`. Generated style elements keep `data-plugin` with the owning package, add `data-path` with the stylesheet's path within that package, and no longer carry `data-plugin-css`.
17
+
18
+ A bundle built with this preset loads on earlier DSH releases without its styles, because they ignore `meta`. Earlier-preset bundles still inject their own `<style data-plugin>` elements, which Modules no longer removes: disabling or live-replacing such a plugin leaves its styles until reload, and an earlier-preset replacement keeps the old text.
19
+
20
+ The default startup order is unchanged: Modules constructs its Main environment from the existing loading hook, prefetch runs before Loader activation, and renderer installation adds materialized-module styles before the React root. Realm Registry and iframe providers are optional; there is no Isolation or Shadow DOM configuration in this change.
21
+
22
+ ## Migration
23
+
24
+ 1. Rebuild custom Client bundles with the matching `clientBundle` preset. Custom artifact generators that provide compiled CSS expose its descriptors through `meta`; artifacts without metadata can omit it. Do not add metadata to `factory()`'s returned business exports.
25
+ 2. Rebuild `staticLinked` libraries and the consuming shell together. Shell assembly reads the `__$dsh_client_module_manifest` export; plugin code keeps its existing package specifiers and obtains exports through the module loader's `require`. Code that enumerates a static library's namespace sees this additional key.
26
+ 3. Keep carrier asset resolution available through `context.asset()` when generating stylesheet text. Leave DOM installation to the renderer; module factories no longer own generated style tags.
27
+ 4. Verify that registrations do not evaluate metadata, CSS appears before the application root renders, lazy metadata appears only after its module materializes, and module replacement removes or updates the prior styles. The [module reference](../../../../packages/client/modules/README.md) and [renderer reference](../../../../packages/client/ui-renderer/README.md) define ownership and failure behavior.
28
+ 5. Replace selectors in custom CSS, user scripts, and tests that match generated class names such as `[class*="_header_"]` with `data-*` attributes or accessible roles, and `style[data-plugin-css]` with `style[data-plugin][data-path]`.
29
+ 6. Set the rebuilt plugin's `engines.dsh` minimum to the DSH release with this change. Reload the page after disabling or updating an earlier-preset plugin.
@@ -0,0 +1,29 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: Client 产物元信息和静态库 manifest 要求重新构建自定义浏览器 bundle,并更新直接消费静态产物的代码。
4
+ ---
5
+
6
+ # Client 模块元信息
7
+
8
+ [English](guide.md) | 中文
9
+
10
+ ## 变更
11
+
12
+ Client bundle 注册可在 `id`、`factory` 和可选 `chunk` 之外携带 `meta`。factory 仍返回插件或库的导出。元信息可包含 `stylesheets`,即以样式在所属包内的路径(如 `src/client/App.module.css`)为键的字典;每份描述具有 `text(context)`,由 `context.asset()` 解析载体资源 URL。编译后的样式 import 不再在 JavaScript factory 执行期间安装 DOM 节点。
13
+
14
+ 静态 Client 库的 index 产物保留原有具名导出,并增加一个携带相同 manifest 的导出 `__$dsh_client_module_manifest`;其 factory 返回不含 manifest 的库导出。ESM import 和动态 import 仍留给最终 Web 构建。
15
+
16
+ `staticLinked` 库(包括 `dsh-client-ui-primitives` 和 `dsh-client-ui-dockkit`)的样式不再进入 Web 外壳的 CSS 文件,改由 renderer 在应用挂载时安装。它们的 CSS Modules 类名从 `_<local>_<hash>` 变为 `<hash>_<local>`。生成的 style 元素仍以 `data-plugin` 携带所属包名,新增以 `data-path` 携带的包内样式路径,不再带 `data-plugin-css`。
17
+
18
+ 用本预设构建的 bundle 可以在较早的 DSH 版本上加载,但没有样式,因为较早版本会忽略 `meta`。用较早预设构建的 bundle 仍自行插入 `<style data-plugin>` 元素,Modules 不再删除它们:禁用或实时替换这类插件后,其样式保留到页面刷新;替换版本同样由较早预设构建时,页面保留旧样式文本。
19
+
20
+ 默认启动顺序不变:Modules 从原有加载 hook 建立 Main 环境,prefetch 在 Loader 激活前运行,renderer 在 React 根之前安装已物化模块的样式。Realm Registry 与 iframe 提供方是可选的;本次没有 Isolation 或 Shadow DOM 配置。
21
+
22
+ ## 迁移
23
+
24
+ 1. 使用配套版本的 `clientBundle` 预设重新构建自定义 Client bundle。自定义产物生成器通过 `meta` 提供编译 CSS 的描述;没有元信息的产物可省略它。不要把元信息加入 `factory()` 返回的业务导出。
25
+ 2. 同时重新构建 `staticLinked` 库和消费它的外壳。外壳组装读取 `__$dsh_client_module_manifest` 导出;插件代码保留原有包标识符,通过模块加载器的 `require` 取得导出。枚举静态库命名空间的代码会看到这个新增的键。
26
+ 3. 生成样式文本时通过 `context.asset()` 保留载体资源解析。DOM 安装交给 renderer,模块 factory 不再拥有生成的 style 标签。
27
+ 4. 确认登记不会求值元信息、CSS 在应用根渲染前出现、lazy 元信息只在对应模块物化后出现,以及模块替换会移除或更新旧样式。[模块参考](../../../../packages/client/modules/README.zh.md)和 [renderer 参考](../../../../packages/client/ui-renderer/README.zh.md)定义所有权与失败行为。
28
+ 5. 自定义 CSS、用户脚本和测试中匹配生成类名的选择器(如 `[class*="_header_"]`)改用 `data-*` 属性或无障碍角色,`style[data-plugin-css]` 改用 `style[data-plugin][data-path]`。
29
+ 6. 把重新构建的插件在 `engines.dsh` 中声明的最低版本设为包含本变更的 DSH 版本。禁用或更新用较早预设构建的插件后,刷新页面。
@@ -0,0 +1,25 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: WebServer routes require authentication by default, and default Token login moves to a Provider plugin.
4
+ ---
5
+
6
+ # Token Provider and route admission migration
7
+
8
+ English | [中文](guide.zh.md)
9
+
10
+ ## Change
11
+
12
+ Default Token verification and HTTP login exchanges move to `@deepseek-ai/dsh-host-authentication-token`. Connection removes BrowserAuth, `authorizeIndex`, `authenticatedUrl`, `requestRejection`, `ConnectionRequestRejection`, `peer(id)`, `createPeer.socketOwned`, `ConnectionAdmission`, and `admitConnection`. Token owns `/api/remote.mux` Socket claims through the post-admission `webserver/upgrade` waterfall. Cookie formats and `/connect` remain; valid v2 Cookies now also authenticate pages, without a page/API `purpose` field.
13
+
14
+ WebServer registrations now accept `auth: 'anonymous' | 'required' | 'deny'` or a synchronous selector, defaulting to `required`. Previously public handlers, resources, fallbacks, and upgrades need explicit anonymous declarations. HTTP and upgrade handlers receive the admitted Peer as an optional trailing argument; resources keep their Peer argument. Connection source checks also apply to anonymous routes when its listener is active.
15
+
16
+ ## Migration
17
+
18
+ 1. Mount Token beside Connection and Credentials. Manually move `cookieMaxAgeDays` from `connection.config` to `authentication-token.config`. The old location has no effect and is neither migrated nor rejected; leaving Token's value unset uses 30 days.
19
+ 2. Audit `webServer.register`, `registerFallback`, and `registerUpgrade` calls. Direct administrative handlers also require an owner Peer. Keep authenticated access for protected routes; declare `auth: 'anonymous'` for credential-free assets and login endpoints, and `auth: 'deny'` for blocked routes. Convert a bare fallback handler to `{ handler, auth }` when changing its policy. Check `trustedHosts` for every intended authority, including public assets.
20
+ 3. Remove page adapters' `purpose` and repeated authentication calls. Consume the Peer passed to `(req, res, peer?)`, `(req, socket, head, peer?)`, or `resource(request, peer?)`. Render protected pages for that Peer. Trusted in-process `readResource(request, peer)` still uses its explicit Peer without source or Cookie checks, but respects `deny`.
21
+ 4. Keep `printUrl`, `openBrowser`, and `publicUrl` on WebApp. After readiness, WebApp emits `webserver/entry-url(baseUrl, entries)`; listeners append `{ label, url, open }`. WebApp prints entries in order and opens the first eligible one outside SSH. No entries means no output or opening. Token contributes its signed URL without depending on WebApp. Custom HTTP carriers retain `webserver/request` before routing.
22
+ 5. Providers inject `connection` and `connection.authentication`, retain their `createPeer({ principal, interactions })` results, and call `ctx.connection.authentication.register(provider)`. Keep `browserPeer` for trusted in-process use. Use `admit` instead of `requestRejection`. Without an authorization decision, `required` returns 503 and `anonymous` allows access.
23
+ 6. Emit all `webserver/*` events with the WebServer as thisArg, including `index-inject` and `entry-url`. Ordinary listeners follow `webServer` isolation; `global: true` opts out. Run upgrade middleware after admission, before protocol handling; await `next()`. Token claims its API Peers only on `/api/remote.mux`.
24
+ 7. Verify root Token login, existing Cookies, v2 page access, HTTP/WS, `/connect`, anonymous assets, and source-rejection 403. Duplicate mux Sockets still return 409; closing the owning Socket revokes credentials before Peer disposal. Only root Token queries exchange credentials. Token load failure grants no protected access.
25
+ 8. Update custom Desktop shell/Host pairs together: per-process credentials travel over private IPC before ready; main processes use `authenticationCookie` and the ordinary Host URL. Keep credentials out of the renderer. Desktop may also mount Token.
@@ -0,0 +1,25 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: WebServer 路由默认要求认证,默认 Token 登录迁入 Provider 插件。
4
+ ---
5
+
6
+ # Token Provider 与路由准入迁移
7
+
8
+ [English](guide.md) | 中文
9
+
10
+ ## 变更
11
+
12
+ 默认 Token 验证与 HTTP 登录交换迁入 `@deepseek-ai/dsh-host-authentication-token`。Connection 移除 BrowserAuth、`authorizeIndex`、`authenticatedUrl`、`requestRejection`、`ConnectionRequestRejection`、`peer(id)`、`createPeer.socketOwned`、`ConnectionAdmission` 与 `admitConnection`。Token 通过准入后的 `webserver/upgrade` waterfall 拥有 `/api/remote.mux` Socket 认领。Cookie 格式与 `/connect` 保持;有效 v2 Cookie 也可认证页面,不再有页面/API `purpose` 字段。
13
+
14
+ WebServer 注册新增 `auth: 'anonymous' | 'required' | 'deny'` 或同步选择器,默认 `required`。此前公开的 handler、resource、回退与 upgrade 需要显式声明匿名。HTTP 与 upgrade handler 通过可选末尾参数接收准入 Peer;resource 保留已有 Peer 参数。Connection 监听器活动时,来源检查也适用于匿名路由。
15
+
16
+ ## 迁移
17
+
18
+ 1. 在 Connection 与 Credentials 旁挂载 Token。手动将 `cookieMaxAgeDays` 从 `connection.config` 移到 `authentication-token.config`。旧位置的值不生效,既不会自动迁移,也不会被拒绝;未配置 Token 的值时采用30天。
19
+ 2. 检查 `webServer.register`、`registerFallback` 与 `registerUpgrade` 调用。直接管理 handler 还必须要求 owner Peer。受保护路由保持认证要求;免凭据资源与登录端点声明 `auth: 'anonymous'`,禁止访问的路由声明 `auth: 'deny'`。改变裸回退 handler 策略时改为 `{ handler, auth }`。为所有预期 authority 检查 `trustedHosts`,包括公开资源。
20
+ 3. 移除页面适配器的 `purpose` 与重复认证调用。使用 `(req, res, peer?)`、`(req, socket, head, peer?)` 或 `resource(request, peer?)` 传入的 Peer,并为该 Peer 渲染受保护页面。可信进程内 `readResource(request, peer)` 仍使用显式 Peer,不检查来源或 Cookie,但遵守 `deny`。
21
+ 4. `printUrl`、`openBrowser` 与 `publicUrl` 保留在 WebApp。WebApp 就绪后触发 `webserver/entry-url(baseUrl, entries)`;监听器追加 `{ label, url, open }`。WebApp 按序打印入口,并在非 SSH 下打开首个允许自动打开的入口。没有入口就不输出、不打开。Token 贡献签名 URL,不依赖 WebApp。自定义 HTTP 载体在路由前保留 `webserver/request`。
22
+ 5. Provider 注入 `connection` 与 `connection.authentication`,保存 `createPeer({ principal, interactions })` 结果,并调用 `ctx.connection.authentication.register(provider)`。`browserPeer` 保留给可信进程内调用。使用 `admit` 替代 `requestRejection`。无人作出准入决策时,`required` 返回503,`anonymous` 允许访问。
23
+ 6. 发起所有 `webserver/*` 事件时传入 WebServer 作为 thisArg,包括 `index-inject` 与 `entry-url`。普通监听器遵循 `webServer` isolation;`global: true` 跳过过滤。在准入后、协议处理前运行 upgrade 中间件,并等待 `next()`。Token 仅在 `/api/remote.mux` 上认领自己的 API Peer。
24
+ 7. 验证根 Token 登录、已有 Cookie、v2 页面访问、HTTP/WS、`/connect`、匿名资源及来源拒绝403。重复 mux Socket 仍返回409;所属 Socket 关闭时先撤销凭据,再释放 Peer。只有根 Token query 执行凭据交换。Token 加载失败不授予受保护访问。
25
+ 8. 自定义 Desktop shell/Host 一同更新:每进程凭据在 ready 前通过私有 IPC 交付;主进程使用 `authenticationCookie` 与普通 Host URL。凭据不得进入 renderer。Desktop 也可挂载 Token。
@@ -0,0 +1,31 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "Cordis 4.0.0-rc.12 replaces ctx.root with ctx[Context.root] and renames the service intercept-metadata API."
4
+ ---
5
+
6
+ # `ctx[Context.root]` replaces `ctx.root`, and service intercept metadata is renamed
7
+
8
+ English | [中文](guide.zh.md)
9
+
10
+ ## Change
11
+
12
+ `@deepseek-ai/cordis` now carries upstream Cordis 4.0.0-rc.12. Third-party plugins and services written against the previous release are affected:
13
+
14
+ - `ctx.root` no longer exists. The root context is `ctx[Context.root]`; `Context.root` is a symbol exported on the `Context` class. Inside a plugin, reading `ctx.root` throws `cannot get property "root" without inject`.
15
+ - `Service.config` becomes `Service.metadata`. A service declares its intercept type with `declare [Service.metadata]: T`.
16
+ - `[Service.resolveConfig](base?, head?)` becomes `[Service.resolveIntercept]()`, which takes no arguments.
17
+ - The global symbol `Symbol.for('cordis.metadata')` now keys `Service.metadata`. The method metadata that decorators such as `@Inject()` store moved to `symbols.decorator` (`Symbol.for('cordis.decorator')`).
18
+ - A service's `Config.merge` hook is no longer called. Override `[Service.mergeIntercept](...values)` instead; it receives the values in increasing precedence.
19
+ - Metadata a plugin declares in object-form `inject` now has the lowest precedence. Intercepts added with `ctx.intercept()` override it; previously the injected value overrode them.
20
+ - A context created with `ctx.isolate(name)` no longer falls back to the enclosing plugin's injected `name`. Plugins started under it, and reads after its own provision is withdrawn, throw `cannot get property "<name>" without inject`.
21
+ - A failed `ctx.parallel()` throws an `AggregateError` whose message names the event, and a fiber disposed while it was not active, such as a failed one, now settles to `FiberState.DISPOSED`.
22
+
23
+ ## Migration
24
+
25
+ 1. Replace every `ctx.root` with `ctx[Context.root]`, importing `Context` as a value from `@deepseek-ai/cordis`. Plain JavaScript without the import can read `ctx[Symbol.for('cordis.root')]`.
26
+ 2. In service classes, rename `declare [Service.config]` to `declare [Service.metadata]` and calls of `[Service.resolveConfig]()` to `[Service.resolveIntercept]()`. Replace `base` and `head` arguments by declaring the base value in `inject` and adding the override with `ctx.intercept()`.
27
+ 3. Where code reads or writes decorator method metadata through `symbols.metadata` or `Symbol.for('cordis.metadata')`, use `symbols.decorator` instead.
28
+ 4. Move a `Config.merge` implementation to a `[Service.mergeIntercept](...values)` method on the service class.
29
+ 5. Where a plugin relied on its `inject` metadata overriding an ancestor `ctx.intercept()`, set the value with `ctx.intercept()` at the plugin's context instead.
30
+ 6. Where code under `ctx.isolate(name)` needs the enclosing plugin's service, provide that service inside the isolated context or start the code from a context that is not isolated.
31
+ 7. Run your TypeScript build: references to `ctx.root`, `Service.config` and `Service.resolveConfig` fail to compile. Start the plugin and confirm that services resolve and logs keep their names.
@@ -0,0 +1,31 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "Cordis 4.0.0-rc.12 用 ctx[Context.root] 取代 ctx.root,并重命名服务拦截元数据 API。"
4
+ ---
5
+
6
+ # `ctx[Context.root]` 取代 `ctx.root`,服务拦截元数据 API 重命名
7
+
8
+ [English](guide.md) | 中文
9
+
10
+ ## 变更
11
+
12
+ `@deepseek-ai/cordis` 现在包含上游 Cordis 4.0.0-rc.12。针对上一版本编写的第三方插件和服务会受到以下影响:
13
+
14
+ - `ctx.root` 不再存在。根上下文改为 `ctx[Context.root]`;`Context.root` 是 `Context` 类上导出的 symbol。在插件内读取 `ctx.root` 会抛出 `cannot get property "root" without inject`。
15
+ - `Service.config` 改为 `Service.metadata`。服务用 `declare [Service.metadata]: T` 声明其拦截类型。
16
+ - `[Service.resolveConfig](base?, head?)` 改为不带参数的 `[Service.resolveIntercept]()`。
17
+ - 全局 symbol `Symbol.for('cordis.metadata')` 现在对应 `Service.metadata`。`@Inject()` 等装饰器存储的方法元数据改用 `symbols.decorator`(`Symbol.for('cordis.decorator')`)。
18
+ - 服务的 `Config.merge` 钩子不再被调用。改为重写 `[Service.mergeIntercept](...values)`;它按优先级从低到高接收各个值。
19
+ - 插件在对象形式的 `inject` 中声明的元数据现在优先级最低,用 `ctx.intercept()` 添加的拦截会覆盖它;此前是注入的值覆盖拦截。
20
+ - 用 `ctx.isolate(name)` 创建的上下文不再回退到外层插件注入的 `name`。在其下启动的插件,以及在其自身提供撤回后的读取,都会抛出 `cannot get property "<name>" without inject`。
21
+ - `ctx.parallel()` 失败时抛出的 `AggregateError` 的消息会注明事件名;在非活动状态下被销毁的 fiber(例如失败的 fiber)现在会进入 `FiberState.DISPOSED`。
22
+
23
+ ## 迁移
24
+
25
+ 1. 将所有 `ctx.root` 替换为 `ctx[Context.root]`,并从 `@deepseek-ai/cordis` 以值的形式导入 `Context`。无法导入的纯 JavaScript 可以读取 `ctx[Symbol.for('cordis.root')]`。
26
+ 2. 在服务类中,将 `declare [Service.config]` 改为 `declare [Service.metadata]`,将对 `[Service.resolveConfig]()` 的调用改为 `[Service.resolveIntercept]()`。原来的 `base` 参数改为在 `inject` 中声明,`head` 参数改为用 `ctx.intercept()` 添加。
27
+ 3. 如果代码通过 `symbols.metadata` 或 `Symbol.for('cordis.metadata')` 读写装饰器的方法元数据,改用 `symbols.decorator`。
28
+ 4. 将 `Config.merge` 的实现移到服务类的 `[Service.mergeIntercept](...values)` 方法中。
29
+ 5. 如果插件依赖其 `inject` 元数据覆盖祖先的 `ctx.intercept()`,改为在该插件的上下文上用 `ctx.intercept()` 设置该值。
30
+ 6. 如果 `ctx.isolate(name)` 之下的代码需要外层插件的服务,在隔离的上下文中提供该服务,或从未隔离的上下文启动这段代码。
31
+ 7. 运行 TypeScript 构建:引用 `ctx.root`、`Service.config` 和 `Service.resolveConfig` 的代码会编译失败。启动插件,确认服务可以解析,日志名称保持不变。
@@ -0,0 +1,24 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "A native CUA provider configured with a preset id now gives Agents without an Agent preset the cua_run_code tool."
4
+ ---
5
+
6
+ # CUA gives Agents without a preset `cua_run_code`
7
+
8
+ English | [中文](guide.zh.md)
9
+
10
+ ## Change
11
+
12
+ A native CUA provider whose `agentPreset` is a preset id, including the default `ptc`, registered no tool for an Agent that had joined no Agent preset, and nothing at all in a composition without the preset registry. Such an Agent now receives `cua_run_code` and its operation guidance. Agents on the configured preset still receive raw `cua`, Agents on other presets still receive `cua_run_code`, and `agentPreset: false` still registers raw `cua` globally.
13
+
14
+ Hosts that create Agents without a preset are affected: the `sdk`, `sdk-minimal`, `headless`, and `acp` profiles and custom compositions. Web and Desktop sessions join a preset and do not change. An affected composition that mounts the provider with a preset id, directly or through the Computer Use bundle, observes:
15
+
16
+ - The model request gains the `cua_run_code` schema and the CUA guidance.
17
+ - Agent creation waits for the provider's dedicated program runtime; it rejects while that runtime or the `workingDirectory` service is unavailable, for example with `CUA program tool is unavailable`.
18
+ - With `@deepseek-ai/dsh-tool-executor-ptc` mounted on the Host, programs see `tools.cua_run_code` inside `run_code`.
19
+
20
+ ## Migration
21
+
22
+ 1. To keep raw `cua`, called directly or as `tools.cua` under the PTC tool executor, set `agentPreset: false` under the provider entry's `config` in the profile patch or overlay. Preserve its other fields.
23
+ 2. To keep Computer Use away from these Agents, disable the provider entry or deselect the Computer Use bundle for that profile.
24
+ 3. Start a session and confirm the model's tool list: `cua_run_code` by default, `cua` after step 1, and neither after step 2.
@@ -0,0 +1,24 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "以 preset ID 配置的原生 CUA 提供方现在为未组合 Agent preset 的 Agent 提供 cua_run_code 工具。"
4
+ ---
5
+
6
+ # CUA 为未组合 preset 的 Agent 提供 `cua_run_code`
7
+
8
+ [English](guide.md) | 中文
9
+
10
+ ## 变更
11
+
12
+ 原生 CUA 提供方的 `agentPreset` 为 preset ID(包括默认值 `ptc`)时,以前不为未组合 Agent preset 的 Agent 注册工具,在不包含 preset 注册表的组合中则完全不注册。这类 Agent 现在获得 `cua_run_code` 及其操作指引。使用所配置 preset 的 Agent 仍获得原始 `cua`,使用其他 preset 的 Agent 仍获得 `cua_run_code`,`agentPreset: false` 仍全局注册原始 `cua`。
13
+
14
+ 受影响的是创建 Agent 时不组合 preset 的 Host:`sdk`、`sdk-minimal`、`headless` 和 `acp` profile,以及自定义组合。Web 和 Desktop 会话都会组合 preset,行为不变。受影响的组合如果直接或通过 Computer Use 组合包以 preset ID 挂载该提供方,会观察到:
15
+
16
+ - 模型请求增加 `cua_run_code` 的 schema 和 CUA 指引。
17
+ - 创建 Agent 时等待提供方的专用程序运行时;该运行时或 `workingDirectory` 服务不可用时创建失败,例如报告 `CUA program tool is unavailable`。
18
+ - Host 挂载 `@deepseek-ai/dsh-tool-executor-ptc` 时,程序在 `run_code` 中看到 `tools.cua_run_code`。
19
+
20
+ ## 迁移
21
+
22
+ 1. 如需保留原始 `cua`(直接调用,或在 PTC 工具执行器下作为 `tools.cua` 调用),在 profile patch 或 overlay 的提供方条目 `config` 下设置 `agentPreset: false`,保留其他字段。
23
+ 2. 如需让这些 Agent 不使用 Computer Use,禁用提供方条目,或在该 profile 取消选择 Computer Use 组合包。
24
+ 3. 启动一个会话,确认模型的工具列表:默认包含 `cua_run_code`,执行第 1 步后包含 `cua`,执行第 2 步后两者都没有。
@@ -0,0 +1,24 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "Update direct dependencies and configuration overrides for the renamed macOS Computer Use provider."
4
+ ---
5
+
6
+ # macOS Computer Use provider name
7
+
8
+ English | [中文](guide.zh.md)
9
+
10
+ ## Change
11
+
12
+ The Computer Use bundle picks up the renamed macOS provider automatically. Direct dependencies and overrides use the following names.
13
+
14
+ | Name | Previous | New |
15
+ |---|---|---|
16
+ | npm package | `@deepseek-ai/dsh-experimental-cua-macos` | `@deepseek-ai/dsh-cua-macos` |
17
+ | Cordis plugin | `experimental-cua-macos` | `cua-macos` |
18
+ | Bundle entry ID | `cua` | `cua-macos` |
19
+
20
+ ## Migration
21
+
22
+ 1. New versions are published under the new npm name. Update direct dependencies and imports to `@deepseek-ai/dsh-cua-macos` and refresh your lockfile. In custom Cordis compositions, update the provider's `name` if it references the old package.
23
+ 2. In home or profile `cordis.patch.yml` and other overlays targeting the bundled provider, change `id: cua` to `id: cua-macos`. Keep the whole existing `config`, including any `agentPreset`, `helperPath` or `sourceSigning` values. If an overlay still targets the old bundle entry, `--dump-config` reports `patch: entry "cua" not found` and the Loader skips that override. Source builds then use the default ad-hoc signature unless another entry supplies `sourceSigning`. macOS may ask for permission again after the helper is rebuilt. Custom compositions can keep their own entry IDs.
24
+ 3. On macOS with Computer Use enabled, run `dsh --profile web --dump-config` (substitute your profile). Check that the `cua-macos` entry loads the new package and has your expected configuration.
@@ -0,0 +1,24 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "更新直接依赖和配置中引用的 macOS Computer Use 提供方名称。"
4
+ ---
5
+
6
+ # macOS Computer Use 提供方名称
7
+
8
+ [English](guide.md) | 中文
9
+
10
+ ## 变更
11
+
12
+ Computer Use 组合会自动加载改名后的 macOS 提供方。直接依赖或覆盖配置使用的名称如下。
13
+
14
+ | 名称 | 旧值 | 新值 |
15
+ |---|---|---|
16
+ | npm 包 | `@deepseek-ai/dsh-experimental-cua-macos` | `@deepseek-ai/dsh-cua-macos` |
17
+ | Cordis 插件 | `experimental-cua-macos` | `cua-macos` |
18
+ | 组合配置行 ID | `cua` | `cua-macos` |
19
+
20
+ ## 迁移
21
+
22
+ 1. 后续版本使用新包名发布。将直接依赖和导入改为 `@deepseek-ai/dsh-cua-macos`,并更新锁文件。如果自定义 Cordis 配置的 `name` 引用了旧包,也要更新。
23
+ 2. 如果主目录或配置档的 `cordis.patch.yml` 及其他覆盖配置指向组合提供的 macOS 后端,将 `id: cua` 改为 `id: cua-macos`。保留完整的 `config`,包括已设置的 `agentPreset`、`helperPath` 和 `sourceSigning`。如果仍指向组合的旧配置行,`--dump-config` 会提示 `patch: entry "cua" not found`,Loader 会跳过这条覆盖配置。如果其他配置也没有指定 `sourceSigning`,源码构建会使用默认的临时签名,重新构建 helper 后,macOS 可能再次要求授权。自定义组合可以保留自行指定的配置行 ID。
24
+ 3. 在 macOS 上启用 Computer Use 后,运行 `dsh --profile web --dump-config`,将 `web` 换成实际使用的配置档。检查 `cua-macos` 行是否加载了新包,以及各项配置是否符合预期。
@@ -0,0 +1,19 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "macOS CUA returns marked partial AX observations and distinguishes observation failures from stale input snapshots."
4
+ ---
5
+ # macOS CUA isolates unavailable AX branches
6
+
7
+ English | [中文](guide.zh.md)
8
+
9
+ ## Change
10
+
11
+ macOS `getState` previously rejected an entire AX read with `STALE_SNAPSHOT` when one traversed element became invalid. It now returns readable nodes, marks each unavailable branch in `tree` with `[One child could not be read.]`, and sets `hasUnreadableElements: true`. Markers have no element IDs; their contents are unknown. `truncated` still describes traversal limits independently. macOS omits `hasUnreadableElements` when no unreadable node or child-list entry was encountered; other providers may also omit the field.
12
+
13
+ Invalid top-level roots no longer prevent reading healthy windows. Application-wide observations mark those roots unreadable, and a focus lookup that encounters an invalid root yields a null `focusedWindowId`. An invalid AX object that prevents resolving the requested observation scope returns `AX_OBSERVATION_UNAVAILABLE`. Encountering such an object while discovering an unresolved window or sheet rejects the read instead of publishing an empty complete snapshot. An AX `cannotComplete` failure during observation previously returned `NATIVE_ERROR`; it now also returns `AX_OBSERVATION_UNAVAILABLE`. Both failures retain the failing AX operation and native error code in the message. Permission, application/window identity, cancellation and other errors still reject the read. `STALE_SNAPSHOT` remains the error for expired or mismatched snapshots used by input operations.
14
+
15
+ ## Migration
16
+
17
+ Update raw-tool consumers to preserve `hasUnreadableElements` and display the branch markers. Only use element IDs returned by the latest successful tree. Use a window screenshot to inspect unavailable contents; an incomplete tree does not establish that a control is absent.
18
+
19
+ Handle `AX_OBSERVATION_UNAVAILABLE` separately from stale input snapshots. A failed refresh still invalidates the previous snapshot for its scope. Read fresh state or use a screenshot without automatically repeating preceding input. Confirm that a local invalid element returns marked partial state while communication and permission failures remain errors.
@@ -0,0 +1,19 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "macOS CUA 返回带标记的部分 AX 观察,并区分观察失败与输入快照过期。"
4
+ ---
5
+ # macOS CUA 隔离不可用的 AX 分支
6
+
7
+ [English](guide.md) | 中文
8
+
9
+ ## 变更
10
+
11
+ 此前,macOS `getState` 在一个遍历元素失效时会以 `STALE_SNAPSHOT` 拒绝整次 AX 读取。现在返回可读节点,在 `tree` 中用 `[One child could not be read.]` 标记每个不可用分支,并设置 `hasUnreadableElements: true`。标记没有元素 ID,分支内容未知。`truncated` 仍独立表示遍历上限。未遇到不可读节点或子项列表条目时,macOS 省略 `hasUnreadableElements`;其他 provider 也可以省略此字段。
12
+
13
+ 顶层根节点失效不再阻止读取健康窗口。应用级观察将这些根节点标记为不可读,焦点查询遇到失效根节点时,`focusedWindowId` 为 null。观察准备阶段的失效 AX 对象导致请求范围无法确定时,返回 `AX_OBSERVATION_UNAVAILABLE`。发现未解析的窗口或 sheet 时遇到这类对象,读取会失败,不发布空的完整快照。观察期间 AX 返回 `cannotComplete` 时,此前返回 `NATIVE_ERROR`,现在也返回 `AX_OBSERVATION_UNAVAILABLE`。两类失败均在消息中保留失败的 AX 操作和原生错误码。权限、应用或窗口身份、取消及其他错误仍会拒绝读取。输入操作使用过期或不匹配的快照时,仍返回 `STALE_SNAPSHOT`。
14
+
15
+ ## 迁移
16
+
17
+ 更新原始工具调用方,保留 `hasUnreadableElements` 并显示分支标记。只使用最新成功树返回的元素 ID。通过窗口截图查看不可用内容;不完整树不能证明某个控件不存在。
18
+
19
+ 将 `AX_OBSERVATION_UNAVAILABLE` 与输入快照过期分开处理。刷新失败仍会使同一范围的旧快照失效。重新读状态或使用截图,不自动重复此前的输入。确认局部元素失效返回带标记的部分状态,而通信和权限失败仍返回错误。
@@ -0,0 +1,15 @@
1
+ ---
2
+ kind: upgrade-guide
3
+ description: "Keep a longer image upload deadline on slow DeepSeek gateways."
4
+ ---
5
+ # DeepSeek image upload timeout
6
+
7
+ English | [中文](guide.zh.md)
8
+
9
+ ## Change
10
+
11
+ The default `filesApiTimeoutMs` falls from 60,000 to 20,000 milliseconds. After an upload times out, the adapter sends inline images for the next request that needs an upload. Further timeouts double the number of requests skipped. A successful upload resets the count.
12
+
13
+ ## Migration
14
+
15
+ If your gateway needs the previous deadline, set `filesApiTimeoutMs: 60000` on the DeepSeek provider in the active profile’s `cordis.patch.yml`. Existing explicit values take effect as configured. Run `dsh --profile <profile> --dump-config` and check the value on the provider entry.