@lytharalab/dsh-cons-auto-review 1.1.0

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/CHANGELOG.md ADDED
@@ -0,0 +1,38 @@
1
+ # 1.1.0
2
+
3
+ 首次公开发布:包名 `@lytharalab/dsh-cons-auto-review`(GitHub:`LytharaLab/DSH-Cons-Auto-Review`),npm 包名、Cordis 条目名与插件导出名保持一致;npm 包只包含运行所需文件,测试与测试记录留在仓库中。此前以本地 `.tgz` 形式使用的旧包名 `dsh-cons-auto-review` 不能直接覆盖升级,需先 `dsh plugin --profile desktop remove dsh-cons-auto-review` 再安装新包,并把 profile 中残留的旧包名改为 `@lytharalab/dsh-cons-auto-review`。
4
+
5
+ - 修复频繁 `reviewer ended with max-tokens`:初始预算改为 8192,默认最多扩容两次到 32768,默认总超时 120 秒;不会从截断或推理内容取得授权。
6
+ - 精确模型支持时默认优先低推理,保留显式档位配置;审查输入紧凑序列化且不裁掉授权历史。
7
+ - 所有审批界面始终中文询问,显示具体问题、工具及实际操作;英文说明按需独立翻译,失败时使用明确的中文核对提示。
8
+ - 中文翻译严格校验,只改变展示,不改变已验证的风险和决策;最终拒绝及 `never` 不调用翻译。
9
+ - token 上限、超时、队列、输入上限、协议异常和服务故障使用中文说明,原始诊断保留在审查记录中。
10
+ - 新增预算上限、扩容次数/倍数、低推理优先、中文修复次数、说明与操作展示长度等配置;增加请求和恢复诊断计数。
11
+ - 保留 CAutoR 当前权限及新会话默认设置、重启恢复与停用守护功能。
12
+
13
+ # 1.0.2
14
+
15
+ - CAutoR 加入「新会话的默认权限模式」列表,支持原生设置保存、重启恢复与新会话自动审查。
16
+ - 保存守护预设,使宿主权限服务在 DCAR 尚未启动或已停用时仍能恢复默认值,并使用只读权限。
17
+ - 修复设置保存触发服务重载时旧审查监听器和设置回调残留的问题。
18
+ - 重载后保留已有 CAutoR 会话及子 Agent 的 `never`;不覆盖之后的用户权限改动。
19
+ - 增加默认设置、重启恢复、停用恢复、审批拒绝与兼容适配类的回归验证。
20
+
21
+ # 1.0.1
22
+
23
+ - 修复启用报 `DCAR requires its permission service adapter` 且权限栏没有 CAutoR 的问题。
24
+ - 主插件直接接入宿主已加载的权限服务;安装 patch 不再依赖替换 `permission` 配置行。
25
+ - 保留 1.0.0 权限适配类的导出,兼容已经安装的旧配置。
26
+ - 主要集成测试改用官方权限服务,增加单独启用、权限投影、停用还原和再次启用的回归验证。
27
+
28
+ # 1.0.0
29
+
30
+ - CAutoR 权限选项及动态注册、模式切换、停用回退。
31
+ - 复用 DSH 工作区路径规则,程序批准或升级,第一层不直接拒绝。
32
+ - 普通工具、PTC 内部工具及默认子 Agent 继承。
33
+ - 字面 Shell 语法、自定义工具路径规则和精确 argv 信任。
34
+ - 当前模型/独立模型审查,严格 JSON 与流校验,询问和结构化拒绝。
35
+ - 超时、取消、队列、并发、重试、完整快照缓存。
36
+ - 统计、最近记录、可选磁盘审查日志和轮转。
37
+ - 配置 schema、会话配置覆盖、检查命令、源码声明文件及回归测试。
38
+ - 支持 DSH 0.1.7-rc.2 和 0.2.0-rc.2。
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Con89524 / LytharaLab
4
+ Copyright (c) 2026 DeepSeek (adapted components)
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,126 @@
1
+ # Con's 自动审查 — DCAR 1.1.0
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@lytharalab/dsh-cons-auto-review.svg)](https://www.npmjs.com/package/@lytharalab/dsh-cons-auto-review)
4
+ [![CI](https://github.com/LytharaLab/DSH-Cons-Auto-Review/actions/workflows/ci.yml/badge.svg)](https://github.com/LytharaLab/DSH-Cons-Auto-Review/actions/workflows/ci.yml)
5
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
6
+
7
+ > **English.** DCAR (`@lytharalab/dsh-cons-auto-review`) adds a **CAutoR** preset to the DeepSeek Harness permission menu. Deterministic rules approve safe operations first — workspace writes, declared temp/external roots, literal read-only shell commands — and only what a program cannot approve is escalated to the LLM auto-review. The deterministic layer returns `allow` or `escalate`, never a silent denial. Install with `dsh plugin --profile desktop add @lytharalab/dsh-cons-auto-review`; Node.js 22.19+ or 24+, tested against DSH `0.1.7-rc.2` and `0.2.0-rc.2`. The detailed documentation below is in Chinese.
8
+
9
+ **`@lytharalab/dsh-cons-auto-review`** 为 DeepSeek Harness 的「权限」菜单添加 **CAutoR** 模式:先用 DSH「工作区内修改」的确定性路径规则自动放行安全操作,仅将无法由程序自动批准的操作交给 LLM Auto Review。第一层只返回 `allow` 或 `escalate`。
10
+
11
+ ## 安装与启用
12
+
13
+ 包已发布到 npm:[`@lytharalab/dsh-cons-auto-review`](https://www.npmjs.com/package/@lytharalab/dsh-cons-auto-review)。要求 Node.js 22.19+ 或 24+;兼容并测试 DSH **0.1.7-rc.2**、**0.2.0-rc.2**。DSH 的插件 API 仍在变化,其他版本不作为 1.1.0 的兼容承诺。
14
+
15
+ ```powershell
16
+ dsh plugin --profile desktop add @lytharalab/dsh-cons-auto-review
17
+ ```
18
+
19
+ Web 使用 `--profile web`。也可以离线安装解压的项目目录或仓库随附的 `.tgz`(不需要编译):
20
+
21
+ ```powershell
22
+ dsh plugin --profile desktop add "L:\Projects\DSH-Cons-Auto-Review"
23
+ dsh plugin --profile desktop add "L:\Projects\DSH-Cons-Auto-Review\lytharalab-dsh-cons-auto-review-1.1.0.tgz"
24
+ ```
25
+
26
+ **从旧包名升级:**包在首次公开发布时由 `dsh-cons-auto-review` 改名为 `@lytharalab/dsh-cons-auto-review`。关闭 Desktop,先移除旧包再装新包,然后重新打开:
27
+
28
+ ```powershell
29
+ dsh plugin --profile desktop remove dsh-cons-auto-review
30
+ dsh plugin --profile desktop add @lytharalab/dsh-cons-auto-review
31
+ ```
32
+
33
+ profile 配置里若残留 `name: dsh-cons-auto-review` 的插件行或覆盖片段(含 `dsh-cons-auto-review/permission-presets` 写法),同步改成 `@lytharalab/dsh-cons-auto-review`,写法见 [examples/](examples/)。升级不需要手动替换权限插件或编辑安装补丁:主插件会直接接入已有权限服务。
34
+
35
+ 重新启动 DSH,在聊天输入区「权限」栏选择 **CAutoR**。也可以执行:
36
+
37
+ ```text
38
+ /permission CAutoR
39
+ /dcar on
40
+ ```
41
+
42
+ **默认用于新会话:**打开 DSH 设置,在「新会话的默认权限模式」列表选择 **CAutoR** 并保存。后续新建会话自动使用 CAutoR,重启后仍有效;保存默认值不会改掉现有会话的权限选择。
43
+
44
+ 如果停用 DCAR 而默认值仍为 CAutoR,新会话会使用只读权限,并显示「CAutoR(DCAR 未启用)」;重新启用插件即可恢复,也可以在设置中选择其他默认模式。
45
+
46
+ 在同时安装官方 Auto Review 时,原 `Auto review` 和 `CAutoR` 是两个独立选项;只有选中 CAutoR 才走 DCAR。卸载命令为 `dsh plugin --profile desktop remove @lytharalab/dsh-cons-auto-review`,建议先在所有正在使用的会话执行 `/dcar off`。
47
+
48
+ ## 功能
49
+
50
+ - 当前会话与新会话默认权限列表均提供 CAutoR;默认选择使用 DSH 原生设置保存,并自动为新会话安装审查。
51
+ - 程序优先审查:工作区读写、DSH 平台临时目录、可选额外根目录、真实路径与符号链接检查;受保护路径和未知操作交给 LLM。
52
+ - Shell 快速检查:支持一组明确的只读命令及 `mkdir` / `touch`;未知命令、脚本、管道、重定向、变量展开、通配符和复合命令升级审查。`npm run`、Python、Node 和 Git 默认升级,因为脱离沙箱后它们可以产生工作区外的效果。
53
+ - 可配置工具分类、强制审查工具、显式信任工具、自定义路径字段,以及严格匹配完整 argv 的信任命令。
54
+ - LLM 默认使用当前 Agent 的 provider / model;可指定单独的审查模型、推理档位、输出额度、温度、策略补充、并发上限、超时与重试。
55
+ - 修复 `reviewer ended with max-tokens`:默认预算 8192,截断后最多扩容两次到 32768;只接受完整 JSON 和正常结束,不批准截断输出。
56
+ - 审批问题始终使用中文,包含模型的具体确认问题和本次操作。英文说明按需翻译且保持原决策;翻译失败时显示中文人工核对提示。界面设为英文时也询问中文。
57
+ - 优先选择模型明确支持的 `low` 推理档位;显式配置的档位优先。全部尝试共用总超时,默认 120 秒。
58
+ - `allow` / `ask` / `deny` 决策;模型失败不会自动放行。默认把拒绝或失败交给用户,亦可配置为最终拒绝;子 Agent 的 `never` 策略会把询问转换为拒绝。
59
+ - 普通工具与 PTC 内部工具统一审查;外层 `run_code` 由各内部调用分别接受审查。
60
+ - 子 Agent 默认继承 DCAR,创建时固定继承状态;父 Agent 后续切换模式不会解除已经委派的子 Agent 的审查。
61
+ - 会话统计、规则命中率、程序避免的审查请求数、有限历史、可选 JSONL 日志及轮转;默认不记录工具参数正文。
62
+ - 可选审查缓存,默认关闭;缓存键包含完整授权快照、会话、模型路由与策略,只缓存批准结果。
63
+ - 动态权限策略:审查入口激活后才提供 CAutoR 审查;停用时取消等待中的审查并回退已加载会话。已保存的默认设置保留只读守护项。直接复用 Desktop 已有权限服务,无需替换 `permission` 配置行。
64
+
65
+ CAutoR 的执行策略是 `danger-full-access`。它复用原模式的路径审查逻辑,并以程序检查及 LLM 作为授权入口;不使用原执行沙箱隔离进程。
66
+
67
+ ## 1.1.0 升级配置
68
+
69
+ 直接升级会使用新的默认值。如果旧 profile 中显式保留了 `maxTokens: 1024/2048` 或 `timeoutMs: 45000`,这些自定义值仍会生效;建议改用随包提供的配置示例:
70
+
71
+ ```yaml
72
+ review:
73
+ maxTokens: 8192
74
+ maxTokensLimit: 32768
75
+ tokenLimitRetries: 2
76
+ preferLowReasoning: true
77
+ timeoutMs: 120000
78
+ ```
79
+
80
+ 上限需按审查 provider 的输出能力配置;扩容不是无限续写。token 预算可能包含模型推理,LLM 在截断前未给出完整问题时,插件会明确说明未取得结论,并让你核对真实操作。不会把推理片段当作询问或批准。
81
+
82
+ 参数和命令中的代码、路径及 URL 保持原样;中文化针对说明与询问。默认完整展示最多 3000 字符的操作内容,超过时标明截断,可调整 `review.maxActionChars`。
83
+
84
+ ## 命令
85
+
86
+ | 命令 | 作用 |
87
+ |---|---|
88
+ | `/dcar` 或 `/dcar status` | 版本、当前权限和启用状态 |
89
+ | `/dcar on` / `/dcar off` | 启用 CAutoR / 切回回退模式 |
90
+ | `/dcar stats` | 本会话计数和程序命中率 |
91
+ | `/dcar history 20` | 最近 20 条审查记录 |
92
+ | `/dcar config` | 查看生效配置 |
93
+ | `/dcar config {"review":{"timeoutMs":30000}}` | 修改本会话审查设置 |
94
+ | `/dcar check write {"file_path":"src/a.js","content":"x"}` | 只检查程序规则,不执行工具、不调用模型 |
95
+ | `/dcar clear-cache` | 清空审查缓存 |
96
+ | `/dcar reset` | 重置本会话配置、统计及缓存 |
97
+
98
+ 会话配置覆盖只影响当前进程中的该会话,重启后恢复 profile 配置。命令名、子 Agent 继承及卸载回退模式属于加载时设置,请在 profile 配置中修改并重启。
99
+
100
+ ## 配置与开发
101
+
102
+ 完整配置说明见 [docs/CONFIGURATION.md](docs/CONFIGURATION.md),默认值见 [examples/defaults.json](examples/defaults.json)。[examples/desktop-config.patch.yml](examples/desktop-config.patch.yml) 是可叠加到 profile 的配置示例。
103
+
104
+ 接口适配、测试范围及平台限制见 [docs/COMPATIBILITY.md](docs/COMPATIBILITY.md)。
105
+
106
+ 从源码开发:
107
+
108
+ ```bash
109
+ git clone https://github.com/LytharaLab/DSH-Cons-Auto-Review.git
110
+ cd DSH-Cons-Auto-Review
111
+ npm ci --legacy-peer-deps
112
+ npm run verify # 语法与 Cordis schema 检查 + 全部回归测试
113
+ npm pack --ignore-scripts
114
+ ```
115
+
116
+ 源码使用原生 ESM JavaScript,发布包无需构建步骤。仓库含源码、声明文件、自动测试、配置示例、测试记录与 `.github/workflows` 中的 CI 矩阵;发布到 npm 的包只包含运行所需文件(`src`、`locale`、安装补丁、文档、示例与许可证)。
117
+
118
+ 维护者发布流程见 [docs/RELEASING.md](docs/RELEASING.md)。
119
+
120
+ ## 安全
121
+
122
+ DCAR 放宽的是「哪些操作还需要人工确认」,不是隔离边界:被批准的操作仍以宿主进程权限执行。路径检查与执行之间、以及程序无法识别的命令语义仍存在时间窗口和判断盲区,完整说明见 [docs/COMPATIBILITY.md](docs/COMPATIBILITY.md)。发现安全问题时请通过 [SECURITY.md](SECURITY.md) 给出的私下渠道报告,不要在公开 issue 中贴出可利用细节。
123
+
124
+ ## 许可
125
+
126
+ [MIT](LICENSE)。复制和改编的 DeepSeek MIT 代码见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md) 与 [THIRD_PARTY_LICENSE.txt](THIRD_PARTY_LICENSE.txt)。
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 DeepSeek
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,10 @@
1
+ # Third-party notices
2
+
3
+ This project includes adapted code from [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness/tree/639ed015397290b3745d163aafe02ffee4aa3f84), copyright (c) 2026 DeepSeek, under the MIT License. The full license is reproduced in `LICENSE` and `THIRD_PARTY_LICENSE.txt`.
4
+
5
+ - `src/upstream-reviewer.js`: request snapshot, source-role handling, native/PTC identity checks, strict streaming decision reader and base policy, adapted from `packages/experimental/auto-review/src/index.ts`. DCAR adds the medium-risk `ask` protocol, exposes helpers and uses its own review routing/lifecycle.
6
+ - `src/containment.js`: adapted from `packages/fs/fs-sandbox/src/containment.ts`, retaining canonical path and filesystem identity containment.
7
+ - `src/paths.js`: uses the host DSH filesystem resolver and the public `writableRoots()` function from `@deepseek-ai/dsh-sandbox`.
8
+ - `src/permission-presets.js`: subclasses the host DSH permission service, adding effect-scoped custom review presets and an absent-provider guard; the upstream base implementation stays in the host's installed package.
9
+
10
+ The project's npm peer and development dependencies keep their own license terms. No dependency source or `node_modules` is included in the project ZIP or npm package.
@@ -0,0 +1,5 @@
1
+ # DCAR extends the existing permission service at activation; no host row replacement.
2
+ - insert:
3
+ - id: dcar
4
+ name: '@lytharalab/dsh-cons-auto-review'
5
+ config: {}
@@ -0,0 +1,43 @@
1
+ # 兼容与验证
2
+
3
+ ## 支持版本
4
+
5
+ DCAR 1.1.0 固定支持 DSH **0.1.7-rc.2** 与 **0.2.0-rc.2**。关键路径使用官方扩展点 `tools/pre-execute`、权限 Session 投影、命令注册表、文件系统解析和 `ctx.llm.stream`。
6
+
7
+ 源码基线:DeepSeek Harness `639ed015397290b3745d163aafe02ffee4aa3f84`(`dsh-v0.2.0-rc.2`);旧版本基线为 `477b4f420553e8a52c2fbccc464d7561b239c443`(`dsh-v0.1.7-rc.2`)。两版使用的 reviewer、permission service、containment 与文件路径解析源码一致。
8
+
9
+ ## CAutoR 集成方式
10
+
11
+ 官方权限服务只提供固定 `registerAuto()` 动态接口,通用自定义模式依赖静态预设表。1.0.2 由主插件在激活时给已存在的权限服务实例附加动态模式注册能力;安装补丁只插入 `dcar`,不替换宿主的权限服务行。
12
+
13
+ 运行时适配覆盖该服务实例的 `names/specOf/derive/apply`,复用原始 Session 事件、沙箱和审批 setter、`/permission`、Remote `catalog()`、投影及官方 Auto 注册。审查入口安装后注册 CAutoR;停用时取消审查、回退已加载会话,再撤销审查注册并还原服务原始属性;已保存的默认设置保留只读守护项。它需要官方类中 `specOf/derive/apply/emitCatalogChanged` 的运行时方法;这些不是通用稳定第三方扩展接口,因此依赖版本明确固定为以上两个版本,并在加载时检查方法可用性。插件不修改 DSH 安装目录中的源码,也不注册第二个权限服务。
14
+
15
+ DSH Web/desktop 的权限 UI 从该 `catalog()` 读取选项,自定义标签按服务端 `name` 显示,CAutoR 无需修改前端 bundle。
16
+
17
+ 1.0.2 在原生预设表中发布 CAutoR 的只读守护项,因此原始 `defaultOptions` 与 `defaultSettings()` 均接受这个选项。审查活跃时,`specOf()` 返回完整访问加 `ask` 的 CAutoR 规则;原始沙箱与审批 setter 负责写入新会话。保存原生默认设置时,插件在配置编辑器的正常写入流程中同时保留守护项,避免重启时宿主不认识 CAutoR 或在审查未加载时直接授予完整访问。只读守护项不被推导为活跃审查模式。
18
+
19
+ 设置保存触发权限服务重载时,旧审查监听器及时撤销,当前 CAutoR 会话在新审查入口就绪后恢复;委派会话的 `never` 保留。恢复只接受同一插件 Fiber 保存的确切 Session 游标,后续用户改动会使恢复记录失效。
20
+
21
+ 权限服务配置行的 ID 可以不同,也允许用户配置继续使用官方权限服务;无需修改随插件安装的 patch。包在首次公开发布时改名为 `@lytharalab/dsh-cons-auto-review`,导出映射中的 `./permission-presets` 适配类保留兼容,旧本地安装的 `dsh-cons-auto-review/permission-presets` 写法在升级到 scoped 包后应替换为新包名。没有权限服务、文件系统、工具注册表或 LLM 服务的纯自定义 profile 不属于该默认安装布局。
22
+
23
+ 1.0.0 的测试预先安装了权限适配器,漏掉了主插件在原版权限服务下单独激活的场景。用户报告的 `DCAR requires its permission service adapter` 已在真实 Cordis/DSH 服务中复现。1.0.2 的主要集成测试全部改用原版权限服务,并覆盖已有会话中启用插件、菜单目录通知、权限投影、停用和再次启用。
24
+
25
+ ## 已运行的检查
26
+
27
+ 见 `TEST_REPORT.md` 与 `test-results/`:两个发布版本分别安装对应的真实 DSH npm 包,运行相同的完整插件测试。测试使用真实 Cordis、权限目录、Session、Session 投影、工具执行管线、原生文件读写工具、原生审批和命令服务;模型响应由本地测试 Adapter 提供。
28
+
29
+ 覆盖本地零模型写入、按需升级、拒绝不执行、询问只在批准后执行、符号链接和目录前缀、Shell 混合语法、PTC 内部调用、子 Agent 与创建竞态、卸载回退、缺失审查提供者、配置验证、模型路由、重试、超时、并发、缓存和默认日志参数省略。
30
+
31
+ 1.1.0 同时覆盖推理耗尽输出预算、真实 LLM 服务的截断结束事件、有限扩容、预算硬上限、总超时和取消、中文原生审批、英文说明翻译、翻译不改变授权结论及配置边界。自动低推理使用官方 `resolveModelInfo()`,只选模型明确列出的 `low`,不猜测 provider 的推理档位名。
32
+
33
+ ## 验证范围
34
+
35
+ 验证环境是 Linux、Node.js 24.19.0。未实际运行 Windows/macOS desktop 窗口、真实 API 或 OS 级沙箱进程;平台临时目录和 Windows 路径行为沿用 DSH/Node 实现,需要在目标机器验证。这里的 PTC 检查使用真实工具管线的 nested dispatch 输入,未启动 PTC VM。
36
+
37
+ 默认设置测试使用真实 Settings、Loader 和权限服务,并将配置保存到测试 JSON 文件后重新加载。测试存储替代 DSH 的完整多层 YAML 配置编辑器;未启动实际 Desktop 设置页面。
38
+
39
+ DCAR 不隔离已经批准的宿主进程。路径检查与执行之间仍存在外部进程换链接的时间窗口;这是官方文件系统规则本身接受的限制。程序 Shell 规则假定宿主命令和已安装插件可信,不会识别被替换的系统可执行文件或 PowerShell 配置中的恶意覆盖。
40
+
41
+ 可选缓存的完整授权快照不会探测外部文件或服务状态变化;因此默认关闭。动态文件/系统状态对风险判断有影响时,应保持关闭。
42
+
43
+ 同一进程中停用会移除 CAutoR 并回退已加载会话。卸载整个 package 后,若另一个未加载的历史会话仍记录 CAutoR,请在恢复它时明确选择 `workspace-write`;原始 DSH 权限服务不认识自定义动态 CAutoR 身份。保留 DCAR 权限适配类时,残留的 CAutoR 会话会由缺失提供者检查拦截。
@@ -0,0 +1,167 @@
1
+ # DCAR 1.1.0 配置
2
+
3
+ 配置入口是 profile 中 `id: dcar` 插件行的 `config`。字段可以省略,插件填入默认值;数组是整体替换。所有字段在加载时验证,未知字段、错误类型和非法枚举会明确报错。
4
+
5
+ ```yaml
6
+ - id: dcar
7
+ name: '@lytharalab/dsh-cons-auto-review'
8
+ config:
9
+ rules:
10
+ includeTempRoots: true
11
+ additionalWritableRoots: ['L:/BuildCache']
12
+ review:
13
+ timeoutMs: 120000
14
+ maxTokens: 8192
15
+ maxTokensLimit: 32768
16
+ tokenLimitRetries: 2
17
+ onError: ask
18
+ onDeny: ask
19
+ ```
20
+
21
+ ## 总开关
22
+
23
+ | 字段 | 默认值 | 含义 |
24
+ |---|---|---|
25
+ | `enabled` | `true` | 是否允许启用 CAutoR;关闭时不能选择该模式,已选中的调用也不会直接放行 |
26
+ | `inheritSubagents` | `true` | 创建子 Agent 时继承 DCAR;加载时选项 |
27
+
28
+ ## 程序规则 `rules`
29
+
30
+ | 字段 | 默认值 | 含义 |
31
+ |---|---|---|
32
+ | `enabled` | `true` | 关闭后每个受支持调用都交给 LLM |
33
+ | `allowOutsideReads` | `true` | 与 DSH 工作区内修改一致,允许工作区外的普通文件读取;受保护路径仍升级 |
34
+ | `includeTempRoots` | `true` | 复用 DSH 的 workspace + `/tmp` + `os.tmpdir()` 可写根;Windows 的 `/tmp` 采用 DSH 原规则 |
35
+ | `additionalWritableRoots` | `[]` | 显式增加允许的可写根;相对路径基于会话 cwd |
36
+ | `protectedPaths` | 见 defaults.json | 显式目标匹配时升级 LLM,适用于读取及写入;支持 `*`、`**`、`?` |
37
+ | `safeEnvironmentFiles` | `.env.example` 等 | 对环境示例文件豁免 `.env` 模式;其他受保护目录仍生效 |
38
+ | `readTools` | `read`, `read_image` | 从 `file_path` 检查只读目标 |
39
+ | `searchTools` | `glob`, `grep`, `ls` | 检查 `path` / `cwd` 搜索根;glob 中的绝对路径或 `..` 升级 |
40
+ | `writeTools` | `write`, `edit` | 从 `file_path` 检查写入目标 |
41
+ | `harmlessTools` | `todo_write` | 认为无宿主文件或外部副作用的工具 |
42
+ | `alwaysReviewTools` | `[]` | 强制交给 LLM;优先于其他授权配置 |
43
+ | `trustedTools` | `[]` | 管理员显式按工具名授权;不会根据 MCP annotation 自动信任 |
44
+ | `customTools` | `[]` | 为自定义工具声明 `read/write` 效果和全部路径字段 |
45
+ | `maxArgumentBytes` | `2097152` | 程序层处理的参数 JSON 字节上限;超限升级 |
46
+
47
+ 受保护模式默认包括 `.git`、`.dsh`、`.dcar`、`.ssh`、`.aws`、`.gnupg`、`.env`、`.env.*`、`.npmrc` 和 `credentials.json`。这是一组显式目标规则,不会递归检查每个目录读操作中的全部文件。
48
+
49
+ 自定义工具示例:
50
+
51
+ ```yaml
52
+ customTools:
53
+ - name: project_move
54
+ effect: write
55
+ pathFields: ['source', 'destination']
56
+ - name: project_read_many
57
+ effect: read
58
+ pathFields: ['files']
59
+ ```
60
+
61
+ 字段支持对象点路径,例如 `target.path`;值可以是一个字符串或非空字符串数组。所有声明路径必须通过检查;路径缺失或空数组会升级。
62
+
63
+ 自定义工具、可信工具和可信命令是管理员对真实实现的声明;添加会修改快速放行范围。不要把仅凭名称声称只读的未知工具放入这些列表。
64
+
65
+ ## 命令规则 `shell`
66
+
67
+ | 字段 | 默认值 | 含义 |
68
+ |---|---|---|
69
+ | `enabled` | `true` | 启用命令语法快速检查 |
70
+ | `tools` | `bash`, `pwsh` | 使用命令规则的工具名 |
71
+ | `readCommands` | 见 defaults.json | POSIX `pwd/ls/cat/head/tail/wc/rg/grep/echo` 及四种 PowerShell cmdlet |
72
+ | `workspaceMutationCommands` | `mkdir`, `touch` | 只批准语法明确且全部目标在允许根内的创建操作 |
73
+ | `trustedCommands` | `[]` | 精确的 executable + args 数组,无前缀授权 |
74
+ | `maxCommandChars` | `8192` | 命令字符上限 |
75
+
76
+ 例:对你已审查的项目脚本授予精确命令信任:
77
+
78
+ ```yaml
79
+ trustedCommands:
80
+ - executable: npm
81
+ args: ['run', 'build']
82
+ - executable: pnpm
83
+ args: ['test']
84
+ ```
85
+
86
+ `npm run build extra` 不会匹配 `npm run build`。语法检查先于可信命令匹配:含展开、管道、重定向、通配符、反斜杠或复合语法的命令仍升级。Windows 绝对路径命令常会进入 LLM,原生 `read/write/edit` 文件工具正常使用路径规则。
87
+
88
+ 只把命令加入 `readCommands` 并不会给未知可执行文件赋予只读语义;没有内置解析的命令仍升级,需使用精确 `trustedCommands` 声明信任。
89
+
90
+ ## 模型审查 `review`
91
+
92
+ | 字段 | 默认值 | 含义 |
93
+ |---|---|---|
94
+ | `provider`, `model` | 空 | 都为空时继承当前请求路由;指定时必须同时设置 |
95
+ | `reasoningEffort` | 空 | 可选模型推理档位;由所选 provider 决定支持范围 |
96
+ | `preferLowReasoning` | `true` | 未显式设置档位时,只有精确模型元数据列出 `low` 才选用它;否则保留 provider 默认。程序批准不查询模型 |
97
+ | `timeoutMs` | `120000` | 包含队列、模型能力查询、全部重试和中文翻译的总超时;10–600000 ms |
98
+ | `maxTokens` | `8192` | 初始输出预算;64–65536;实际初始值为与 `maxTokensLimit` 的较小者 |
99
+ | `maxTokensLimit` | `32768` | 输出预算硬上限;64–65536;应按 provider 能力配置 |
100
+ | `tokenLimitRetries` | `2` | 仅 `max-tokens` 截断后的额外扩容尝试;0–5;设为 0 关闭;到达预算上限立即停止 |
101
+ | `tokenGrowthFactor` | `2` | 每次扩容倍数;整数 2–4;最后一次不超过硬上限 |
102
+ | `chineseReasonRetries` | `1` | 英文/不合格说明的中文翻译尝试次数;0–2;0 时直接使用中文人工核对提示 |
103
+ | `maxReasonChars` | `600` | 模型说明与中文翻译的字符预算;100–4000;过长展示标记截断 |
104
+ | `showAction` | `true` | 在中文确认说明里附上实际工具与参数;关闭后仍可查看 DSH 原生工具详情 |
105
+ | `maxActionChars` | `3000` | 附加操作正文字符上限;200–32768;命令和其他参数原样保留,超限标记截断 |
106
+ | `temperature` | `0` | 0–2 |
107
+ | `retries` | `0` | 非 token 截断的审查故障额外尝试;0–5;拒绝不重试。与扩容共享有限计数,不相乘 |
108
+ | `retryDelayMs` | `300` | 失败后的等待;0–10000 ms |
109
+ | `concurrency` | `2` | 同一引擎同时进行的 LLM 审查数量;1–32 |
110
+ | `maxQueued` | `128` | 等待队列上限;1–4096 |
111
+ | `onError` | `ask` | 审查超时、异常、无效输出、上下文超限:`ask` 或 `deny` |
112
+ | `onDeny` | `ask` | LLM 拒绝后的处理:`ask` 或 `deny` |
113
+ | `policyAppend` | 空 | 附加管理员策略;追加到基础审查策略之后 |
114
+ | `maxInputChars` | `180000` | 审查数据段上限;超限按 onError 处理,不裁掉授权上下文 |
115
+ | `allowAsk` | `true` | 允许 LLM 显式请求用户判断;关闭时显式 ask 转为最终拒绝 |
116
+
117
+ 审核输入沿用官方 Auto Review 的来源区分:环境、项目约束、保留的用户/直接父 Agent 指令、历史调用事实和精确待执行动作。检查日志身份与参数一致性。主模型系统提示词和隐藏推理不加入审查输入。模型流必须包含一段最终 JSON 文本和正常 `stop`;可在它之前包含推理块。JSON 重复键、非法字段组合、工具调用、截断和额外文字都属于审查失败。
118
+
119
+ 默认协议:低风险批准;中风险由明确授权决定;高风险拒绝。批准输出只含 `risk` 和 `decision`,拒绝或询问可含 `reason`。拒绝与审查异常在工具错误中分别使用 `DCAR_REVIEW_DENIED` 与 `DCAR_REVIEW_FAILED`,原因也返回主 Agent。用户确认走 DSH 原生审批流程;没有审批通道或策略为 `never` 时不会自动批准。
120
+
121
+ 1.1.0 对 `max-tokens` 使用独立扩容恢复:默认 8192 → 16384 → 32768。每次重新审查同一份完整授权快照,不继续被截断的输出、不删除历史、不复用片段中的批准。即使 JSON 看似完整但终止原因仍是 `max-tokens`,也不接受它。输入 JSON 改用紧凑序列化以减少空白开销,所有字段及字符串内容保留。
122
+
123
+ 中文询问是固定行为,`policyAppend` 不覆盖它。审查提示词要求 `reason` 使用简体中文;展示前检查汉字和连续英文句串,纯英文或混杂长英文说明按需翻译。翻译请求只有原说明,默认最多 2048 输出 tokens,只接受正常结束的单字段中文 `reason` JSON;无法修改已经通过校验的 risk/decision。最终拒绝及 `never` 会话没有询问界面,不额外花费翻译请求。
124
+
125
+ 翻译失败、超时、格式错误或模型未给出说明时,使用中文提示并注明缺少可用说明,不虚构模型问题。批准询问中始终附有程序生成的原审查结论和风险等级,翻译无法改变这些标签。所有语言的 `displayReason` 和原生审批的 `reason` 都是中文,代码和参数保留原样。审查本身失败时,分别说明 token 上限、总超时、队列满、授权输入过长或服务/协议故障;原始错误保留在审查记录中。翻译失败不会改成 `onError`,也不会改变已验证的决策。
126
+
127
+ 普通审查请求最多 `1 + retries + tokenLimitRetries` 次,再加最多 `chineseReasonRetries` 次翻译;总超时可能提前终止。扩容到硬上限仍截断时直接按 `onError` 处理,不在同一预算上无限重试。
128
+
129
+ ## 缓存 `cache`
130
+
131
+ | 字段 | 默认值 | 含义 |
132
+ |---|---|---|
133
+ | `enabled` | `false` | 启用完整快照批准缓存 |
134
+ | `ttlMs` | `30000` | 有效期;1–3600000 ms |
135
+ | `maxEntries` | `128` | 条目上限;1–10000 |
136
+
137
+ 只缓存 `allow`,不缓存 `ask/deny` 或失败。授权历史通常随调用增长,所以常规会话中的缓存命中可能很少;节省请求主要来自程序层。修改会话配置或 `/dcar clear-cache` 会清空缓存。
138
+
139
+ ## 记录 `audit`
140
+
141
+ | 字段 | 默认值 | 含义 |
142
+ |---|---|---|
143
+ | `enabled` | `true` | 内存审查历史;计数器始终保留 |
144
+ | `file` | 空 | 空值不写磁盘;相对路径按会话 cwd 定位 |
145
+ | `maxBytes` | `5242880` | 单个 JSONL 文件上限,达到后轮转为 `.1` |
146
+ | `historyLimit` | `200` | 每会话最大内存条目;1–10000 |
147
+ | `includeArguments` | `false` | 写入完整参数正文;默认只记录参数 SHA-256 |
148
+ | `includeReasons` | `true` | 记录规则/LLM 原因;每条最多 2000 字符 |
149
+
150
+ 日志包含时间、会话、调用 ID、工具、参数摘要、审查层、DCAR 决策、规则码、耗时与缓存命中。`/dcar stats` 同时给出请求数、失败数和日志 I/O 错误。记录的是 DCAR 的审查结果;后续独立策略仍可拒绝执行。
151
+
152
+ 1.1.0 增加 `reviewAttempts/tokenLimitRetries/translationAttempts/lastMaxTokens/errorCode`,并在启用原因记录时保存原始 `reason` 与中文 `displayReason`。统计中的 `llmRequests` 包括翻译,`translationRequests` 单列翻译数,`tokenLimitRetries` 单列实际发起的扩容重试次数。历史记录只保存说明的前 2000 字符。
153
+
154
+ ## 命令与生命周期
155
+
156
+ | 字段 | 默认值 | 含义 |
157
+ |---|---|---|
158
+ | `commands.enabled` | `true` | 注册管理命令 |
159
+ | `commands.name` | `dcar` | 小写命令名,可修改以避免冲突 |
160
+ | `commands.allowSessionConfig` | `true` | 允许命令修改本会话配置 |
161
+ | `lifecycle.fallbackPreset` | `workspace-write` | 关闭/卸载时回退的已配置受限模式;不能是完整访问或 CAutoR |
162
+
163
+ 会话覆盖支持 `enabled/rules/shell/review/cache/audit`;其余为加载时设置。会话覆盖在重启后清除。
164
+
165
+ 从 1.0.2 起,CAutoR 同时出现在「新会话的默认权限模式」列表。在 DSH 原生设置中选择 CAutoR 并保存,默认值由宿主权限服务的 `defaultPreset` 持久化,后续新会话自动进入 CAutoR。此设置独立于 `/dcar on`,保存时保留已有会话的权限选择。应通过原生设置保存,插件会同时写入启动守护预设;无需手动修改权限服务配置。
166
+
167
+ 停用插件后,已加载的 CAutoR 会话按 `lifecycle.fallbackPreset` 回退;默认仍为 CAutoR 的新会话使用只读、`never` 审批,并标记 DCAR 未启用。启用插件后,未开始交互的新会话恢复审查;也可把默认值改回其他模式。
@@ -0,0 +1,108 @@
1
+ # 发布流程(维护者)
2
+
3
+ 包名:`@lytharalab/dsh-cons-auto-review` · 仓库:`LytharaLab/DSH-Cons-Auto-Review` · 发布目标:<https://registry.npmjs.org>
4
+
5
+ ## 一次性准备
6
+
7
+ 1. 确认自己的 npm 账号对 `@lytharalab` scope 有发布权限:
8
+
9
+ ```bash
10
+ npm login --registry=https://registry.npmjs.org/
11
+ npm org ls lytharalab
12
+ ```
13
+
14
+ 2. **首次发布**:由于 scoped 包默认是私有可见性,必须在首次发布时显式指定公开:
15
+
16
+ ```bash
17
+ npm publish --access public
18
+ ```
19
+
20
+ `package.json` 的 `publishConfig` 已经固定 `registry` 与 `access`,所以即使本机默认 registry 指向镜像也不会发错地方;`prepublishOnly` 会在真正上传前跑一次 `npm run verify`。
21
+
22
+ 这一次发布不经过 CI,因此**不带 provenance**;从下一个版本起由工作流发布,都会附带来来源证明。已手工发布过的版本不能再由 CI 重复发布(registry 认为版本已存在),标签推送从新版本号开始。
23
+
24
+ > npm 已停止签发经典 publish token(2025-11-05 起创建被禁用,存量 token 于 2025-12 前后被吊销)。不要再用 `NPM_TOKEN` 这类长期令牌,改用下面的 Trusted Publishing。
25
+
26
+ 3. **配置 Trusted Publishing(OIDC)**:包必须已经存在于 registry,`npm trust` 才能给它配置信任关系(npm 文档明确写了 "Package must exist"),所以首次发布只能手工完成。之后用 CLI 配置,比网页点选更不容易写错:
27
+
28
+ ```bash
29
+ npm trust github @lytharalab/dsh-cons-auto-review \
30
+ --repo LytharaLab/DSH-Cons-Auto-Review \
31
+ --file publish.yml \
32
+ --allow-publish -y
33
+ ```
34
+
35
+ 也可在网页上配置:包的 Settings → **Trusted Publisher**,填 Organization or user = `LytharaLab`、Repository = `DSH-Cons-Auto-Review`、Workflow filename = `publish.yml`、Environment 留空。
36
+
37
+ 这几项必须与 `.github/workflows/publish.yml` 完全一致:npm 只在发布那一刻校验,不匹配时只会给出 `404` 或 `ENEEDAUTH`,看不出是哪一项错了。配置完成后就不需要任何 secret。可用 `npm trust list @lytharalab/dsh-cons-auto-review` 核对,用 `npm trust revoke --id <id>` 撤销。
38
+
39
+ > `npm trust` 要求 npm ≥ 11.15.0、账号开启 2FA,且不支持带 bypass 2FA 的 Granular Access Token——请用交互式 `npm login` 登录,不要贴 token。OIDC 发布本身需要 npm ≥ 11.5.1(随 Node ≥ 22.14.0 提供);工作流固定用 Node 24,满足要求。另外不要在发布步骤里设置空的 `NODE_AUTH_TOKEN`——它会让 npm 退回 token 认证而不再走 OIDC。
40
+
41
+ ## 每次发版
42
+
43
+ 1. 更新 `package.json` 的 `version`,在 `CHANGELOG.md` 顶部补一条对应版本说明。
44
+ 2. 本地验证并按需刷新离线产物:
45
+
46
+ ```bash
47
+ npm ci --legacy-peer-deps
48
+ npm run verify
49
+ npm pack --ignore-scripts
50
+ ```
51
+
52
+ 3. 提交并打标签,标签名与版本一致(`v` 前缀可省略检查,但必须与 `package.json` 的版本号一致):
53
+
54
+ ```bash
55
+ git commit -am "1.1.1"
56
+ git tag v1.1.1
57
+ git push origin main --tags
58
+ ```
59
+
60
+ 4. `.github/workflows/publish.yml` 会校验 tag 与版本号一致、跑一遍 `npm run verify`、以 Trusted Publishing 发布(附带 provenance),最后用生成式说明创建 GitHub Release。
61
+
62
+ ## 工作流的几个约定
63
+
64
+ - 打标签(`v*`)触发真正的发布;手动 `workflow_dispatch` 只会跑校验与 `npm publish --dry-run`,不会真的上传。
65
+ - 只有 `publish.yml` 会执行 `npm publish`。npm 的 trusted publisher 绑定的是 workflow 文件名,出现第二个能发布的 workflow 会互相干扰。
66
+ - 发布步骤使用 `--access public --provenance`;`actions/setup-node` 故意**不设置** `registry-url`,避免生成依赖 `NODE_AUTH_TOKEN` 的 `.npmrc`,发布目标由 `publishConfig.registry` 决定。
67
+ - `.github/workflows/ci.yml` 在每次推送与 PR 上跑 Node 22/24 × DSH `0.1.7-rc.2` / `0.2.0-rc.2` 矩阵,另外单独校验 npm 包内容:必需文件齐全、`tests/`、`test-results/`、`.github/` 不得进入发布包。
68
+
69
+ ## 发布包内容
70
+
71
+ `package.json` 的 `files` 字段决定 npm 包内容:`src`、`locale`、`cordis.patch.yml`、`icon.svg`、`docs`、`examples`、`README.md`、`CHANGELOG.md`、`LICENSE` 与第三方声明。测试、测试记录和 `.github` 只留在 Git 仓库里。用 `npm pack --dry-run` 可以先确认。
72
+
73
+ ## 离线产物
74
+
75
+ 需要给别人 `.tgz` 时:
76
+
77
+ ```bash
78
+ npm pack --ignore-scripts
79
+ sha256sum lytharalab-dsh-cons-auto-review-<version>.tgz
80
+ ```
81
+
82
+ 把结果写进 `SHA256SUMS`(该文件同时记录仓库内所有文件的校验和,可用下面的命令整体刷新):
83
+
84
+ ```bash
85
+ node --input-type=module -e "
86
+ import { readdirSync, readFileSync, writeFileSync } from 'node:fs';
87
+ import { createHash } from 'node:crypto';
88
+ const skip = new Set(['node_modules', '.git']);
89
+ const files = [];
90
+ (function walk(prefix) {
91
+ for (const e of readdirSync(prefix || '.', { withFileTypes: true })) {
92
+ if (skip.has(e.name)) continue;
93
+ const p = prefix ? prefix + '/' + e.name : e.name;
94
+ if (e.isDirectory()) walk(p); else files.push(p);
95
+ }
96
+ })('');
97
+ files.sort();
98
+ writeFileSync('SHA256SUMS', files.filter((f) => f !== 'SHA256SUMS')
99
+ .map((f) => createHash('sha256').update(readFileSync(f)).digest('hex') + ' ' + f)
100
+ .join('\n') + '\n');
101
+ "
102
+ ```
103
+
104
+ `.gitignore` 已忽略 `*.tgz`,不要把压缩包提交进仓库;需要长期提供时挂到 GitHub Release 上。
105
+
106
+ ## 改名带来的 profile 侧改动
107
+
108
+ 包名从 `dsh-cons-auto-review` 改为 scoped 名后,已安装的 profile 需要同步:`package.json` 的依赖键与 `dsh.profile.bundles` 由 `dsh plugin --profile desktop add` 自动重写;若 profile 的 `cordis.patch.yml` 中存在带 `name` 的 `id: dcar` 覆盖或禁用行,必须手动改成新包名——否则该行会被 `patch: name mismatch ... skipping` 跳过,插件在插件管理器里也会变成只读。旧 `compatibility.json` 中按「包名@版本」记录的豁免项同样会失效,需要重新确认。