dsh-web-fetch-enhanced 0.0.4 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md CHANGED
@@ -30,11 +30,12 @@ With an empty CIDR allowlist, the security boundary remains equivalent to the na
30
30
  - **Anonymous bounded GET requests** — no cookies, Authorization header, or URL credentials;
31
31
  - **Resource limits** — URL length, response bytes, decoded characters, redirects, and time are bounded;
32
32
  - **IPv4 and IPv6 coverage** — including IPv4-mapped IPv6 and active DNS64 / NAT64 checks;
33
- - **Outbound HTTP proxy alignment** — seamlessly respects DSH global proxy routes (`HTTP_PROXY` / `HTTPS_PROXY` / `ALL_PROXY` / `NO_PROXY`), while refusing unvalidated private IP literals from bypassing address checks through the proxy.
33
+ - **Outbound HTTP proxy alignment** — seamlessly respects DSH global proxy routes (`HTTP_PROXY` / `HTTPS_PROXY` / `ALL_PROXY` / `NO_PROXY`), while refusing unvalidated private IP literals from bypassing address checks through the proxy;
34
+ - **Dynamic system prompt alignment** — automatically injects explicit authorization guidance into the system prompt when non-public allowlists are configured, eliminating LLM refusal hallucinations when fetching authorized private destinations.
34
35
 
35
36
  ## Compatibility & Support Policy
36
37
 
37
- - **Minimum Supported DSH Version**: `0.1.2-rc.1`
38
+ - **Minimum Supported DSH Version**: `0.1.7-rc.1`
38
39
  - **Support Policy**: This plugin **only supports DeepSeek Harness RC (Release Candidate) releases and future stable releases**. Compatibility is not maintained for rapid-moving Alpha or development snapshot versions.
39
40
 
40
41
  ## Quick start
@@ -59,9 +60,9 @@ dsh plugin --profile web add link:/absolute/path/to/dsh-web-fetch-enhanced
59
60
 
60
61
  Open DSH Web and go to:
61
62
 
62
- **Settings → Plugins → Configurable plugins → Web Fetch Enhanced**
63
+ **Plugins → dsh-web-fetch-enhanced**
63
64
 
64
- Expand the card and enter one network per line under **Allowed CIDRs**. For a typical Clash / Mihomo fake-IP setup:
65
+ The details page shows the allowlist form directly. Enter one network per line under **Allowed CIDRs**. For a typical Clash / Mihomo fake-IP setup:
65
66
 
66
67
  ```text
67
68
  198.18.0.0/15
@@ -74,7 +75,9 @@ api.example.com
74
75
  *.docs.example.com
75
76
  ```
76
77
 
77
- Choose **Save**. The next `web_fetch` uses the new policy; no Profile restart is required.
78
+ Choose **Save**. The page shows **Saved** and keeps the fields visible. The next `web_fetch` uses the new policy; no Profile restart is required.
79
+
80
+ DSH displays component status below the form. You do not need to open a component to configure the allowlist.
78
81
 
79
82
  ### 3. Keep using `web_fetch` normally
80
83
 
@@ -149,12 +152,21 @@ Allow only the smallest range you actually need. Do not add all RFC 1918 space f
149
152
 
150
153
  ## Settings actions
151
154
 
152
- - **Save** writes the current draft to the user settings layer.
153
- - **Discard** drops unsaved edits and restores the effective values.
154
- - **Reset to Profile** stages removal of the user overrides for `allowCidrs` and `allowHostnames`, restoring Profile inheritance after you choose **Save**.
155
- - A **read-only** card means the current connection cannot persist Host Profile settings. Normally, open DSH Web from a loopback address on the Host.
155
+ - **Save** writes both allowlists in one mutation to the selected Profile plugin row. Host rejection or a revision conflict is not reported as success.
156
+ - **Discard** drops unsaved edits and restores effective values.
157
+ - **Restore inherited values** stages removal of both allowlist overrides; choose **Save** to apply. Inherited values may contain a non-empty allowlist, so review the resulting policy.
158
+ - **Read-only** means the form is not ready, the row is unavailable, or the connection cannot write. The card never falls back to another Profile or global configuration.
159
+
160
+ ## Profile configuration and migration
161
+
162
+ Starting with DSH `0.1.7-rc.1`, this plugin uses Profile-owned Cordis `Config`, `.volatile()`, and plugin-manager `configForms`. It no longer reads global `$DSH_HOME/settings.yaml`.
156
163
 
157
- Saving explicit empty lists is different from resetting: empty lists override the Profile with nothing, while reset restores inheritance.
164
+ - Effective configuration combines schema defaults with the current Profile composition/patch. Web edits target only the selected plugin row.
165
+ - **Clearing a field and saving writes an explicit `[]`** to revoke inherited allowlists. Empty arrays are meaningful security overrides and are no longer pruned.
166
+ - **Restore is not clear**: only an explicit restore uses `unset`, which may reactivate an inherited allowlist.
167
+ - Back up legacy settings, review the old `web-fetch-enhanced` section, and move intended rules into the target Profile plugin configuration. Global authorizations are never automatically copied to every Profile.
168
+
169
+ See the [0.1.7-rc.1 migration notes (Chinese)](docs/migration-0.1.7-rc.1.zh-CN.md).
158
170
 
159
171
  ## Security guidance
160
172
 
@@ -210,7 +222,9 @@ No. After a successful Web settings save, the next `web_fetch` uses the new poli
210
222
  <details>
211
223
  <summary><strong>Why is the settings card read-only?</strong></summary>
212
224
 
213
- The current browser connection cannot persist Host settings. Open DSH Web from `127.0.0.1` or `localhost` on the Host and verify that the Profile settings service is writable.
225
+ Verify that the target Profile plugin row is enabled, its form is available, and the current connection has configuration write permission. An unavailable form never falls back to a different configuration.
226
+
227
+ If both inputs remain disabled on DSH `0.1.7-rc.1` while the card renders normally, update to a build containing the configuration schema serialization fix, restart the Host, and refresh the page. Older builds expose custom validators whose callbacks are stripped during transport, preventing the browser form from becoming ready. The fix retains full Host validation.
214
228
  </details>
215
229
 
216
230
  <details>
package/README.md CHANGED
@@ -30,11 +30,12 @@ DeepSeek Harness 原生 HTTP provider 默认拒绝所有非公网地址,这是
30
30
  - **受限匿名请求**:只发送无 Cookie、无 Authorization、无 URL 凭据的 GET 请求;
31
31
  - **完整资源上限**:限制 URL、响应字节、解码字符、重定向次数和超时时间;
32
32
  - **IPv4 / IPv6 防护**:覆盖 IPv4-mapped IPv6 与活动 DNS64 / NAT64 目标检查;
33
- - **全局出站代理协同**:无缝对接 DSH 全局 HTTP 代理路由(`HTTP_PROXY` / `HTTPS_PROXY` / `ALL_PROXY` / `NO_PROXY`),同时严格禁止非公网 IP 字面量越权走代理,杜绝内网 SSRF 风险。
33
+ - **全局出站代理协同**:无缝对接 DSH 全局 HTTP 代理路由(`HTTP_PROXY` / `HTTPS_PROXY` / `ALL_PROXY` / `NO_PROXY`),同时严格禁止非公网 IP 字面量越权走代理,杜绝内网 SSRF 风险;
34
+ - **动态系统提示词协同**:当管理员配置了非公网白名单时,自动向模型系统提示词注入显式授权声明,消除模型因默认安全准则而产生“无法访问内网”的拒答幻觉。
34
35
 
35
36
  ## 版本兼容性与支持策略
36
37
 
37
- - **最低支持的 DSH 版本**:`0.1.2-rc.1`
38
+ - **最低支持的 DSH 版本**:`0.1.7-rc.1`
38
39
  - **版本支持策略**:本插件**仅对 DeepSeek Harness 的 RC(Release Candidate)候选发布版本及后续稳定正式版提供支持**。由于 Alpha 或开发快照版本更迭频繁且缺乏稳定的 API 保证,本插件不再对 Alpha 等非 RC 阶段版本进行维护与适配。
39
40
 
40
41
  ## 快速开始
@@ -59,9 +60,9 @@ dsh plugin --profile web add link:/absolute/path/to/dsh-web-fetch-enhanced
59
60
 
60
61
  打开 DSH Web,进入:
61
62
 
62
- **设置 → 插件 → 可配置插件 → Web Fetch Enhanced**
63
+ **插件 → dsh-web-fetch-enhanced**
63
64
 
64
- 展开卡片,在“允许的 CIDR”中每行填写一个网段。例如 Clash / Mihomo 的常见 Fake-IP 配置:
65
+ 详情页直接显示白名单表单,在“允许的 CIDR”中每行填写一个网段。例如 Clash / Mihomo 的常见 Fake-IP 配置:
65
66
 
66
67
  ```text
67
68
  198.18.0.0/15
@@ -74,7 +75,9 @@ api.example.com
74
75
  *.docs.example.com
75
76
  ```
76
77
 
77
- 点击“保存”。无需重启 Profile,下一次 `web_fetch` 就会使用新规则。
78
+ 点击“保存”,页面显示“已保存”并保留输入框。无需重启 Profile,下一次 `web_fetch` 就会使用新规则。
79
+
80
+ 下方“包含的组件”由 DSH 展示插件运行状态,配置白名单不需要进入组件。
78
81
 
79
82
  ### 3. 正常使用 `web_fetch`
80
83
 
@@ -149,12 +152,21 @@ wiki.corp.example
149
152
 
150
153
  ## 设置页按钮说明
151
154
 
152
- - **保存**:把当前草稿写入用户设置层;
153
- - **放弃修改**:丢弃尚未保存的编辑,恢复当前生效值;
154
- - **重置为 Profile 配置**:把“删除 `allowCidrs` 和 `allowHostnames` 用户覆盖、重新继承 Profile composition”的操作加入草稿;仍需点击“保存”才会生效;
155
- - **只读状态**:当前连接没有持久化 Host Profile 设置的权限。通常应从 Host 本机的 loopback 地址打开 Web GUI。
155
+ - **保存**:将两项白名单作为一次配置变更写入当前 Profile 的插件行;Host 校验失败或版本冲突不会显示为成功。
156
+ - **放弃修改**:丢弃尚未保存的编辑,恢复当前生效值。
157
+ - **恢复继承值**:将移除两项白名单覆盖的操作加入草稿;仍需点击“保存”才生效。继承值可能包含非空白名单,请检查保存后的生效值。
158
+ - **只读状态**:当前表单尚未就绪、配置行不可用或连接没有写权限;不会回退到其他 Profile 或全局配置。
159
+
160
+ ## Profile 配置与旧版本迁移
161
+
162
+ 从 DSH `0.1.7-rc.1` 起,本插件使用 Profile 拥有的 Cordis `Config`、`.volatile()` 和插件管理页的 `configForms` 表单,不再读取全局 `$DSH_HOME/settings.yaml`。
156
163
 
157
- “保存空列表”和“重置为 Profile 配置”含义不同:前者显式覆盖为空,后者恢复继承。
164
+ - 配置由 Schema 默认值与当前 Profile composition/patch 决定;Web 保存只修改选中的插件行。
165
+ - **清空输入并保存会显式写入 `[]`**,用于撤销继承的白名单。空数组具有安全意义,不再自动清理。
166
+ - **恢复继承与清空不同**:只有显式恢复操作才执行 `unset`,可能重新启用底层配置中的白名单。
167
+ - 升级前备份旧设置,将旧 `web-fetch-enhanced` 节中的授权规则逐项审查后迁入目标 Profile 的插件配置。插件不会自动将全局授权复制到所有 Profile。
168
+
169
+ 详见 [0.1.7-rc.1 升级说明](docs/migration-0.1.7-rc.1.zh-CN.md)。
158
170
 
159
171
  ## 安全提示
160
172
 
@@ -210,7 +222,9 @@ Fake-IP 模式会把域名解析到 `198.18.0.0/15` 等保留网段,再由代
210
222
  <details>
211
223
  <summary><strong>为什么设置卡片是只读的?</strong></summary>
212
224
 
213
- 当前浏览器连接不能持久化 Host 设置。请确认你从 Host 本机通过 `127.0.0.1` 或 `localhost` 访问,并检查 Profile 的设置服务是否允许写入。
225
+ 请确认目标 Profile 的插件行已启用且配置表单可用,并检查当前连接的配置写权限。表单未就绪或已失效时不会尝试修改其他配置。
226
+
227
+ 若在 DSH `0.1.7-rc.1` 中卡片正常显示,但两个输入框持续禁用,请更新到包含配置 schema 序列化修复的构建,重启 Host 后刷新页面。旧构建的自定义校验回调在传输中被移除,导致浏览器表单无法就绪;修复保留了 Host 端的完整校验。
214
228
  </details>
215
229
 
216
230
  <details>
@@ -40,7 +40,7 @@ flowchart LR
40
40
 
41
41
  本插件是 Host 侧 provider:它消费已有的 <code>web</code> 服务并注册一个 fetch provider,但不发布新的 Cordis 服务。因此它属于 Host composition,不属于 agent preset。模型工具仍由 preset 中原有的 <code>tool-web</code> 行提供。
42
42
 
43
- 入口采用 namespace plugin 约定,只命名导出 <code>name</code>、<code>inject</code>、<code>Config</code>、安全的 <code>createProvider</code> 和 <code>apply</code>,没有 default export,也不公开低级 pinned transport/custom resolver helper。与 DeepSeek Harness 内部插件一致,源码使用显式 <code>.ts</code> 相对导入,<code>cordis.source.patch.yml</code> 在开发时直接加载源码;发布构建由 TypeScript 生成 <code>lib/types</code>,再由 tsdown 分别输出 Host ESM <code>lib/index.js</code> 和浏览器 Client ESM <code>lib/client.js</code>。Client face 以 <code>web-fetch-enhanced</code> 命名空间键向 <code>settings.plugin.item</code> 注册白名单卡片;Host face 通过 <code>installSettingsSection</code> 将 Profile composition 作为 base layer,并让 provider 在每次请求时读取最新 resolved section。随包发布的 <code>cordis.patch.yml</code> 供操作者显式合并到 Profile composition。
43
+ 入口采用 namespace plugin 约定,无 default export;源码使用显式 `.ts` 相对导入。构建生成 Host ESM `lib/index.js`、类型声明及通过 DSH ModuleLoader 注册的浏览器 `lib/client.js`。Client face 在 `plugins.bundle.config` 中提供插件详情页白名单表单,通过 `configForms.get('web-fetch-enhanced')` 绑定当前 Profile 的固定插件行,并用 `useSyncExternalStore` 订阅状态。页面不重复绘制插件标题或嵌套折叠卡片,保存后保持字段可见并显示结果。Host face 使用带 `.volatile()` 的 Config 字段,通过 `.get()` 读取每次请求的配置快照。Loader 在完整 schema 校验后原子提交 live refs,`loader/volatile-update` 通知更新系统提示词;`providerId` 保持非 volatile,修改时由 Loader 重建实例。随包发布的 `cordis.patch.yml` 为 Profile 提供默认 composition。
44
44
 
45
45
  ## 3. Provider 选择
46
46
 
@@ -100,6 +100,15 @@ flowchart LR
100
100
 
101
101
  ## 6. 配置与生命周期
102
102
 
103
+ ### 6.1 Profile 配置层级
104
+
105
+ 配置由 Schema 默认值、Profile composition 和 Profile patch 覆盖共同决定,不再使用全局 `settings.yaml` 或 `settings.installSection`。客户端只绑定随包 patch 声明的 `web-fetch-enhanced` 行;配置不可用或只读时不向其他行写入。
106
+
107
+ ### 6.2 保存、清空与恢复继承
108
+
109
+ 表单将两项白名单通过单次 `form.mutate(ops, revision)` 原子提交,使用草稿开始时的 revision 校验并发修改。清空字段保存为显式空数组,只有“恢复继承”执行 `unset`。保存失败时保留草稿,放弃修改重新读取当前 Profile 的值。离开页面会丢弃未保存的草稿;外部变更会更新未编辑的表单,不覆盖正在编辑的草稿。
110
+
111
+ ### 6.3 启动阶段校验
103
112
  Cordis Config schema 提供所有默认值;<code>createProvider()</code> 也在直接调用时应用同一默认值。启动阶段校验:
104
113
 
105
114
  - provider ID 字符集和长度;
@@ -129,7 +138,7 @@ Cordis Config schema 提供所有默认值;<code>createProvider()</code> 也
129
138
 
130
139
  ## 8. 兼容策略
131
140
 
132
- 插件只依赖 <code>@deepseek-ai/dsh-web</code> 和 <code>@deepseek-ai/dsh-timeout</code> 的公开包根 API,不依赖 DSH 包的 <code>src/*</code> 深路径。安全 transport 在本包内维护,相关行为通过契约测试固定。
141
+ 最低支持 DSH `0.1.7-rc.1`,DSH peers 声明 `>=0.1.7-rc.1 <0.2.0`,开发依赖固定为经过验证的 rc.1。使用 web、timeout、http-proxy、system-prompt、Cordis Loader 与客户端插件管理/配置表单的公开导出,不依赖 DSH 包的 `src/*` 深路径。安全 transport 在本包内维护,相关行为通过契约测试固定。
133
142
 
134
143
  版本升级时重点回归:
135
144
 
@@ -0,0 +1,63 @@
1
+ # DSH 0.1.7-rc.1 适配与迁移说明
2
+
3
+ ## 基线与版本门禁
4
+
5
+ 此次按上游 `dsh-v0.1.7-rc.1` 源码及 npm 发布包核对接口,不将历史会话评估当作 API 规范。最低支持版本由 `0.1.5-rc.2` 提升为 **`0.1.7-rc.1`**。
6
+
7
+ - `engines.dsh` 和所有 DSH peer 范围为 `>=0.1.7-rc.1 <0.2.0`。
8
+ - DSH 开发依赖固定 `0.1.7-rc.1`,锁文件同步更新;Cordis 使用 4.0.4、Schemastery 使用 3.18.4、Loader 使用 1.0.5。
9
+ - 上游 `packages/boot/app-boot/src/plugin-compatibility.ts` 实际使用 `semver.satisfies(..., { includePrerelease: true })`。显式 rc 下界避免错误接纳更早版本,也能在常规包管理器 semver 语义下接纳目标 rc。
10
+ - 本次验证针对 rc.1;范围内的未来版本不代表已实测,0.2 系列需重新评估。没有添加版本豁免,也没有修改用户 Profile。
11
+
12
+ ## 采用的上游新能力
13
+
14
+ | 接入面 | 原实现 | 本次迁移 |
15
+ | --- | --- | --- |
16
+ | Host 配置 | settings.installSection/register 与全局覆盖 | Profile-owned Config + `.volatile()` |
17
+ | 实时值 | 自定义 current/source/watch | Loader 稳定 live refs 的 `.get()` |
18
+ | 配置通知 | Settings watcher | `loader/volatile-update`;授权变更后通知系统提示词 |
19
+ | 客户端 | settingsScope + settings.plugin.item | 插件详情页 `plugins.bundle.config` 与订阅当前 Profile 的 configForms |
20
+ | 保存 | 比对 user layer 推测写入结果 | 单次批量 mutate、revision 乐观并发校验和 Promise<boolean> 结果 |
21
+ | 清空白名单 | unset 并自动清理空数组 | 显式保存 [];恢复继承才 unset |
22
+ | 类型契约 | 本地模拟 Settings/SystemPrompt seam | 公开 Loader、SystemPrompt、PluginManager 类型 |
23
+
24
+ 注意:rc.1 的 volatile 字段是引用对象,不是自动变更的普通数组;没有使用未经上游证实的 `ctx.accept` API。`providerId` 不是 volatile 字段,修改 composition 中的身份会重建 provider,而不是把旧 ID 静默指向新配置。
25
+
26
+ 白名单和资源限制在 schema 校验阶段完整验证,Loader 成功后原子更新;非法候选不会部分扩大授权。每个请求捕获一份配置快照,在途请求继续使用启动时规则,下一次请求使用新配置。
27
+
28
+ ## 操作者迁移步骤
29
+
30
+ 1. 备份旧版 `$DSH_HOME/settings.yaml` 与目标 Profile composition。
31
+ 2. 将 Host 升级至 DSH `0.1.7-rc.1` 或更高的兼容版本,并安装/链接本插件新构建。
32
+ 3. 审查旧 `web-fetch-enhanced` 节,将必要的 `allowCidrs`、`allowHostnames` 及资源限制迁入目标 Profile 的 `web-fetch-enhanced` 插件行 config;或在插件详情页直接编辑白名单。
33
+ 4. 不再依赖全局 settings.yaml;本插件不会自动把全局授权复制到各 Profile,以免扩大网络访问权限。
34
+ 5. 保存后确认生效值。清空 CIDR 并保存意味着明确撤销非公网例外;恢复继承可能重新启用底层白名单,两者不可混同。
35
+ 6. 升级插件文件后按部署方式重载/重启 Host 并刷新 Web 页面;配置字段的正常保存不需要重启。
36
+ 7. 在实际部署中验证一个明确授权目标及一个未授权私网目标;不要为了测试额外放宽生产白名单。
37
+
38
+ 默认 bundle 行 ID 为 `web-fetch-enhanced`,插件详情页注册键为包名 `dsh-web-fetch-enhanced`。bundle 插槽不提供 owner form,客户端显式订阅该 Profile 行的 ConfigForm。手写 composition 改名时,需要使用宿主通用配置表单或配套调整订阅的行 ID;组件不会猜测其他行的配置。
39
+
40
+ 白名单在包详情页直接显示,不再进入组件行或展开额外卡片。保存后保留字段并显示结果,宿主的组件状态列表位于表单下方。
41
+
42
+ ## 输入框持续禁用的修复
43
+
44
+ 在 rc.1 的真实页面中,插件行正常运行且 Host 可写,但两个白名单输入框持续禁用。原因是 `settings.describe` 的传输 schema 保留了 `transform` 节点,却移除了其 `callback`。浏览器的 `ConfigFormController.decode()` 调用 `SettingsSchemaService.validate()` 时因此失败,表单一直停留在 `loading`。
45
+
46
+ 插件现在仅在 Host 的运行时 schema 中保留自定义校验;序列化时输出对应的普通数组和数值 schema,并保留默认值、上下界及 volatile 元数据。Host 的 ConfigEditor/Loader 仍通过原始 Standard Schema 校验完整候选,再持久化和提交 live refs;浏览器表单不承担 CIDR 和域名的安全校验。序列化节点身份保持稳定,避免无配置变化时递增 revision。
47
+
48
+ 已运行的 Host 需要重载插件模块或重启后刷新浏览器,单独刷新页面不会替换内存中的旧 Host schema。
49
+
50
+ ## 保持不变及不适用项目
51
+
52
+ - `web_fetch` 工具名称、请求参数和返回结果不变;实际 rc.1 WebFetchProvider、WebFetchResult、代理路由接口与现有实现兼容。
53
+ - DNS 全答案检查、连接固定、NAT64 检查、同源重定向、取消/超时、匿名 GET 与非公网默认拒绝策略保持。
54
+ - 本插件没有旧图标导出、PTC、session-start、自定义会话附件、workspaceFiles 或工具视图接入,不为追逐新特性引入无关的浏览器/终端权限。
55
+ - 程序化调用 `createProvider()` 的原始配置类型现在为 `ProviderConfig`;`Config` 表示 Loader 解析后的 live-ref 配置。旧客户端 settingsScope 相关 helper 不再导出。
56
+
57
+ ## 验证入口
58
+
59
+ 运行 `pnpm run check`:类型检查、类型感知 lint、Host/Client 构建、全部测试及 publint。测试覆盖版本门禁、真实 Loader 热配置生命周期、原子拒绝非法候选、系统提示词刷新、请求快照、表单拒绝/版本冲突和既有 SSRF/代理回归。另在独立临时 Profile、DSH 0.1.7-rc.1 和 Chromium 中验收实际配置页面;该验收不代表运行中的用户 Profile 已重载插件。
60
+
61
+ 本次验证结果:类型检查通过;类型感知 lint 为 0 warnings / 0 errors;Host、Client 与声明构建通过;13 个测试文件、100 项测试通过;发布覆盖率检查通过(行 99.54%、分支 95.48%);`git diff --check` 通过。publint 退出码为 0,但保留一项提示:`./client` 的 `.js` 在 `type: module` 包中含 CJS 形式。该产物不是直接由 Node 导入的通用 ESM,而是 DSH `window.__ModuleLoader__.load` 的 factory 包装;已有构建产物测试验证实际 loader 注册与执行。没有为消除提示擅自改变宿主要求的客户端加载格式。
62
+
63
+ 真实浏览器验收通过:插件详情页直接显示可编辑表单、保存后字段保持可见并显示成功、刷新保留值、Host 拒绝非法 CIDR 且保留草稿、放弃修改、显式空数组持久化、恢复继承并从 Profile patch 中移除覆盖。桌面与 390px 窄屏布局均已检查;双标签页验证了未编辑表单同步、外部更新保留草稿及过期 revision 拒绝写入。测试使用隔离的临时 Profile,未改动用户生产 Profile。
@@ -0,0 +1,22 @@
1
+ # v0.0.7
2
+
3
+ ## 兼容性
4
+
5
+ - 最低支持 DeepSeek Harness **0.1.7-rc.1**,支持范围为 `>=0.1.7-rc.1 <0.2.0`。
6
+ - 配置改为当前 Profile 的 Cordis Config 与 volatile 字段,不再读取全局 `settings.yaml`。旧版用户请按[迁移说明](../migration-0.1.7-rc.1.zh-CN.md)迁移白名单。
7
+ - 程序化创建 provider 的原始配置类型为 `ProviderConfig`;`Config` 表示 Loader 解析后的 live-ref 配置。
8
+
9
+ ## 修复与改进
10
+
11
+ - 修复配置 schema 的校验回调在传输中被移除后,两个输入框持续禁用的问题;Host 仍完整校验所有保存请求。
12
+ - 白名单表单直接显示在插件详情页,无需进入组件;去掉重复标题和折叠卡片,保存后显示结果并保持字段可见。
13
+ - 同步外部配置变更,保留未保存草稿,通过 revision 检查拒绝过期写入。
14
+ - 清空白名单保存为显式空数组;只有“恢复继承”才移除覆盖,避免意外恢复底层授权。
15
+ - 白名单与资源限制更新后供下一次请求使用,在途请求保留原配置快照;授权变化同步更新系统提示词。
16
+ - 改善窄屏按钮布局,补充表单交互、schema 传输与 Loader 热更新回归测试。
17
+
18
+ 升级插件后重启 Host 并刷新 Web 页面。日常白名单保存无需重启。
19
+
20
+ ## English
21
+
22
+ Requires DSH 0.1.7-rc.1 or later within the 0.1 series. Configuration now belongs to the active Profile; review and migrate legacy global allowlists before upgrading. This release fixes disabled configuration inputs, moves the form onto the plugin details page, preserves drafts during external updates, rejects stale writes, and distinguishes explicit empty overrides from resetting to inherited values. Host validation and request-level configuration snapshots remain enforced. Restart the Host and refresh the browser after upgrading.