dsh-paoding 0.4.4 → 0.4.6
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.md +5 -4
- package/README_en.md +5 -4
- package/bin/dsh-paoding.mjs +22 -10
- package/docs/architecture.md +6 -5
- package/docs/architecture_en.md +8 -7
- package/docs/configuration.md +9 -1
- package/docs/configuration_en.md +9 -1
- package/docs/installation.md +17 -7
- package/docs/installation_en.md +14 -6
- package/docs/orchestration.md +2 -2
- package/docs/orchestration_en.md +2 -2
- package/package.json +3 -2
- package/plugins/paoding-config-ui/api-core.mjs +171 -2
- package/plugins/paoding-config-ui/icon.svg +8 -0
- package/plugins/paoding-config-ui/index.mjs +88 -6
- package/plugins/paoding-config-ui/lib/base.css +244 -0
- package/plugins/paoding-config-ui/lib/client.js +517 -46
- package/plugins/paoding-config-ui/package.json +7 -2
- package/plugins/paoding-config-ui/runtime-inventory.mjs +22 -0
- package/plugins/paoding-config-ui/stats-core.mjs +362 -0
- package/presets/orchestrator/agent.cordis.yml +2 -1
- package/presets/orchestrator/restrict.mjs +1 -1
- package/tools/lib/cli.mjs +298 -8
- package/tools/lib/config.mjs +117 -0
- package/tools/lib/doctor.mjs +3 -13
- package/tools/lib/lifecycle.mjs +264 -0
package/README.md
CHANGED
|
@@ -19,12 +19,13 @@ dsh-paoding(中文品牌「庖丁」,典出《庄子》——庖丁顺纹理
|
|
|
19
19
|
- **按工作区各有各的班底**:不同项目可以配不同的主/子 agent——「庖丁配置」里选定工作区单独配置,每个工作区生成自己的预设(`orchestrator-<目录名>`),新建会话时选对应预设即可,全局默认不受影响。
|
|
20
20
|
- **图形界面配置**:不习惯改配置文件的话,点开左侧栏底部动作条(设置行上方)的「庖丁配置」入口,整页点选即可,「保存并应用」即时重生成预设——与首装自动化同一条生成管线。
|
|
21
21
|
- **工具条目支持通配符**:`*` 与 `?` 在生成期展开成具体工具名——`mcp__tavily__tavily_*` 一行顶五行,MCP 工具族不必逐个点名;零匹配有提醒,产物与运行时行为不变。
|
|
22
|
-
-
|
|
22
|
+
- **保存前先体检**:预览/应用时自动过一遍检查——配置了但未挂载的工具、零工具角色、查无此名的模型、预设落后于配置,分级提示一目了然;预览还顺带列出「本次变更」逐项明细与主 agent 工具面瘦身统计,改了什么、省了多少都在明面上。CLI 侧 `dsh-paoding doctor` 六项只读自检(配置可解析、安装轨道、声明行托管块、孤儿目录、版本标记、预设漂移),一条命令查全身;`--fix` 自动修孤儿目录与过期声明行两类安全项。
|
|
23
23
|
- **场景模板一键换班底**:轻量(只留实现)、调研(只留检索)、全开(全员到齐、主 agent 带满检测库存)三档点一下就切,只动「谁在场 + 主 agent 额外带什么」,精调过的角色配置分毫不动。
|
|
24
|
-
-
|
|
24
|
+
- **配置可导出可导入,还有后悔药**:面板「更多」菜单一键下载 `dsh-paoding.config.yml`,换机迁移、备份整份拷走;导入先验格式,覆盖整体配置(含工作区段)需二次确认。每次写盘前自动轮换备份三份,「恢复备份」二次确认即回退,误操作不用翻文件。
|
|
25
25
|
- **HTTP 接口直连配置**:预设的列举、新增、更新、删除走 `/api/paoding/presets` 四条接口,随 DSH Web 服务同进程挂载、本机回环直调;与面板「保存并应用」同一条生成管线、同一把写盘互斥闸——脚本和自动化工具改班底,不必开浏览器。
|
|
26
26
|
- **面板中英双语**:界面文案 zh/en 全覆盖,语言自动识别(显式选择 → 中文信号优先:浏览器语言、宿主页面语言、中文时区),「更多」菜单一键切换并记住。
|
|
27
27
|
- **版本更新有提醒,面板一键升级**:面板会对比 npm registry(npmmirror 镜像、GitHub release 依次兜底)上的最新版本,发现新版就地提示并附上发布页链接;点「升级」就地换上新版(profile 自动探测:普通 profile 走 `dsh plugin update dsh-paoding`;desktop profile 被 dsh CLI 的 Electron 专属守卫挡住,改在 profile 目录直跑 `pnpm add dsh-paoding@<版本>`,pnpm 找不到时自动回落 `corepack pnpm`),重启 DSH 后生效,编排预设会在重启时按新版自动重生成。开发检出的 link 形态无法就地升级,面板会提示切回 registry 版的办法;检测失败时页头留一行「版本检测失败 · 重试」(完整原因与代理排查提示在悬浮提示里),不弹窗打扰。
|
|
28
|
+
- **委派效果可量化**:面板「委派效果」卡按角色统计调用数、平均耗时与失败数(近 30 天),数据读宿主会话存档本地聚合——哪个角色用得多、哪个常掉链子,一眼可见。
|
|
28
29
|
- **来去自由**:不改 DSH 一行源码;装完新会话即用,卸载即删目录。
|
|
29
30
|
- **两代宿主都兼容**:DSH 0.1.5 – 0.2.1 全支持(0.1.5 / 0.1.6 / 0.1.7-rc.1 / 0.1.7-rc.2 / 0.2.0-rc.1 / 0.2.0-rc.2 / 0.2.1-rc.2+)——两代宿主发现预设的机制不同(目录扫描 vs patch 声明行),安装器自动检测宿主版本选对落点;编排组合里的 workflow worker 行也按宿主版本自动适配(0.1.5 用 workflow-worker-thread,0.1.6+ 换 workflow-ptc——旧包 0.1.6 起已删除,残留行正是 0.2.0 面板上「加载失败」的元凶);DSH 0.2.1 起角色委派行同步换代(0.2.1 的 dsh-tool-subagent 拒绝内联 persona/toolFilter——人设与工具面改挂各角色的 AgentPreset,spawn 子代理按 agentPreset 选择子预设;0.2.0 及以下保持内联形状),宿主升级、降级后的首次保存/自愈自动迁移(工作区专属预设 orchestrator-<slug> 随同轮自愈一并换代),全程无感;0.2.1 的 prerelease 再细分——tool-subagent 守卫自 0.2.1-rc.2 落地,rc.0/rc.1 仍按内联形状生成。
|
|
30
31
|
|
|
@@ -95,9 +96,9 @@ curl http://127.0.0.1:19387/api/paoding/presets
|
|
|
95
96
|
| 文档 | 内容 |
|
|
96
97
|
|---|---|
|
|
97
98
|
| [架构](docs/architecture.md) | 为什么这样设计——概述、成本账、角色与工具、对应 DSH 原生机制、Token 治理、已知边界。 |
|
|
98
|
-
| [安装](docs/installation.md) | 官方插件通道一条命令安装、版本支持与预设落点双轨(DSH 0.1.5 – 0.2.1)、首装自动化与版本标记、升级、开发检出自装、host patch
|
|
99
|
+
| [安装](docs/installation.md) | 官方插件通道一条命令安装、版本支持与预设落点双轨(DSH 0.1.5 – 0.2.1)、首装自动化与版本标记、升级、开发检出自装、host patch 检测机制、庖丁配置面板、卸载(`dsh-paoding uninstall` 一条命令)、排查(doctor 可 `--fix`)。 |
|
|
99
100
|
| [编排](docs/orchestration.md) | 编排总览、失败如何呈现与三层处理、one-shot vs continuable、上下文隔离。 |
|
|
100
|
-
| [配置](docs/configuration.md) | 配置键全参考、工具条目通配符、内置角色微调、主 agent
|
|
101
|
+
| [配置](docs/configuration.md) | 配置键全参考、工具条目通配符、内置角色微调、主 agent 工具与技能、自定义角色、按角色分模型、角色会话与启动方式、场景模板、配置导出导入与备份回滚、检查提示、HTTP 接口。 |
|
|
101
102
|
|
|
102
103
|
## 贡献
|
|
103
104
|
|
package/README_en.md
CHANGED
|
@@ -19,9 +19,10 @@ dsh-paoding (Chinese brand 「庖丁」/ Pao Ding, from the Zhuangzi parable of
|
|
|
19
19
|
- **A different lineup per workspace**: each project can carry its own main/sub-agent setup — pick the workspace in 庖丁配置, configure it separately, and it gets its own preset (`orchestrator-<basename>`); choose that preset when starting a session. The global default stays untouched.
|
|
20
20
|
- **A visual configurator**: prefer clicking to editing YAML? the 庖丁配置 (Paoding Config) entry in the sidebar bottom action bar (above the Settings row) covers everything; Save & Apply regenerates the preset on the spot — the same generation pipeline as first-install automation.
|
|
21
21
|
- **Tool entries support wildcards**: `*` and `?` expand into concrete tool names at generation time — one `mcp__tavily__tavily_*` line covers the whole family; zero-match patterns get a warning, and artifacts and runtime behavior stay unchanged.
|
|
22
|
-
- **A health check before every save**: preview/apply runs a built-in check — tools configured but not mounted, zero-tool roles, unknown model names, a preset lagging behind the config — each flagged by severity; on the CLI side, `dsh-paoding doctor` runs six read-only checks (config parses, install track, managed declaration block, orphan directories, version marker, preset drift) in one command.
|
|
22
|
+
- **A health check before every save**: preview/apply runs a built-in check — tools configured but not mounted, zero-tool roles, unknown model names, a preset lagging behind the config — each flagged by severity; the preview also lists an itemized "changes since the last save" diff and the main-agent tool-surface stat, so what changed and what it saves are both on the table. On the CLI side, `dsh-paoding doctor` runs six read-only checks (config parses, install track, managed declaration block, orphan directories, version marker, preset drift) in one command; `--fix` automatically repairs the two safe categories (orphan directories, stale declaration rows).
|
|
23
23
|
- **Scenario templates swap the roster in one click**: Lite (implement only), Research (search roles only), and Full (everyone on deck, main agent carrying the whole detected inventory) — templates only touch who is present and what the main agent carries; hand-tuned role settings are never touched.
|
|
24
|
-
- **
|
|
24
|
+
- **Delegation stats you can act on**: the panel's "Delegation" card counts delegations, average duration, and failures per role (last 30 days), aggregated locally from the host session archive — which roles get used, and which keep dropping the ball, at a glance.
|
|
25
|
+
- **Config export & import, with an undo**: download `dsh-paoding.config.yml` from the panel's More menu for migration or backup; imports are validated first, and overwriting the whole config (workspaces included) asks for confirmation. Every write first rotates three automatic backups, and "Restore backup" puts one back after a confirming dialog — a mistake never means digging through files.
|
|
25
26
|
- **Config over HTTP**: list, create, update, and delete presets through the four `/api/paoding/presets` endpoints, served in-process by the DSH web service and callable over loopback; they ride the panel's Save & Apply generation pipeline and share its write lock, so scripts and automation tools can reshape the roster without opening a browser.
|
|
26
27
|
- **Panel in English and Chinese**: every UI string ships in both languages, auto-detected (explicit choice first, then Chinese signals — browser language, host page language, Chinese time zones — outrank English ones, since the Electron shell pins navigator to en-US regardless of the OS), switchable from the More menu and remembered.
|
|
27
28
|
- **Notified of new releases, one-click upgrade in the panel**: the panel compares your local version against the latest npm registry publish (npmmirror and GitHub release as successive fallbacks) and points to the release page when a newer one is out. The Upgrade button swaps in the new version in place (profile auto-detected): regular profiles go through `dsh plugin update dsh-paoding`, while the Electron-owned desktop profile — which the dsh CLI guards against — gets a direct `pnpm add dsh-paoding@<version>` run in the profile directory, falling back to `corepack pnpm` when no bare pnpm is on PATH; a DSH restart applies it, and the orchestrator preset regenerates itself against the new version on startup. A dev checkout in link: form cannot be upgraded in place — the panel tells you how to switch back to the registry version. If the check fails (offline, rate-limited), a subdued "version check failed · retry" row stays in the header (full causes and proxy hints in its tooltip) without popping anything up.
|
|
@@ -95,9 +96,9 @@ Writes go through the same generation pipeline and write lock as the panel's Sav
|
|
|
95
96
|
| Document | Contents |
|
|
96
97
|
|---|---|
|
|
97
98
|
| [Architecture](docs/architecture_en.md) | Why it is designed this way — overview, the cost ledger, roles and tools, mapping to DSH's native mechanisms, token governance, known limits. |
|
|
98
|
-
| [Installation](docs/installation_en.md) | The single official channel (`dsh plugin add`), version support and the dual preset landing (DSH 0.1.5 – 0.2.1), first-install automation and the version marker, upgrading, dev-checkout install, host patch detection, the Paoding Config panel, uninstalling, troubleshooting. |
|
|
99
|
+
| [Installation](docs/installation_en.md) | The single official channel (`dsh plugin add`), version support and the dual preset landing (DSH 0.1.5 – 0.2.1), first-install automation and the version marker, upgrading, dev-checkout install, host patch detection, the Paoding Config panel, uninstalling (one `dsh-paoding uninstall` command), troubleshooting (doctor with `--fix`). |
|
|
99
100
|
| [Orchestration](docs/orchestration_en.md) | Orchestration overview, how failures surface and the three recovery layers, one-shot vs continuable, context isolation. |
|
|
100
|
-
| [Configuration](docs/configuration_en.md) | The full key reference, tool-entry wildcards, tuning built-in roles, main-agent tools and skills, custom roles, per-role models, per-role session and start modes, scenario templates, config export/import, health-check hints, the HTTP API. |
|
|
101
|
+
| [Configuration](docs/configuration_en.md) | The full key reference, tool-entry wildcards, tuning built-in roles, main-agent tools and skills, custom roles, per-role models, per-role session and start modes, scenario templates, config export/import and backup-rollback, health-check hints, the HTTP API. |
|
|
101
102
|
|
|
102
103
|
## Contributing
|
|
103
104
|
|
package/bin/dsh-paoding.mjs
CHANGED
|
@@ -15,16 +15,27 @@ const REFUSE =
|
|
|
15
15
|
const usage = `dsh-paoding 安装快捷方式(等价于 dsh plugin --profile <name> add dsh-paoding@<version>)
|
|
16
16
|
|
|
17
17
|
用法:npx dsh-paoding@latest [--profile <name>]
|
|
18
|
-
npx dsh-paoding@latest doctor [--profile <name>] [--config <file>]
|
|
18
|
+
npx dsh-paoding@latest doctor [--profile <name>] [--config <file>] [--fix] [--yes]
|
|
19
|
+
npx dsh-paoding@latest uninstall [--purge] [--yes] [--config <file>]
|
|
19
20
|
|
|
20
21
|
子命令:
|
|
21
|
-
doctor
|
|
22
|
+
doctor 本机安装体检(默认只读):配置文件 / 预设轨道 / 托管声明行 /
|
|
22
23
|
孤儿工作区预设 / 预设漂移 / 版本标记,结尾给汇总;
|
|
23
|
-
有错误级发现时退出码 1
|
|
24
|
+
有错误级发现时退出码 1。--fix 对其中可安全自动修的两类动手
|
|
25
|
+
(孤儿预设目录、孤儿/过期声明行;写盘前备份 .bak-1),其余
|
|
26
|
+
发现只给处理建议,输出逐项标注「已修 / 需手动」。
|
|
27
|
+
uninstall 清理庖丁写进宿主目录的东西:cordis.patch.yml 托管声明块、
|
|
28
|
+
.agent-presets 下的 orchestrator* 预设目录、.generator-version
|
|
29
|
+
标记。默认保留配置文件及其备份(用户数据),--purge 才连配置
|
|
30
|
+
一起删;不碰插件包自身(包本体用 dsh plugin remove 卸载)。
|
|
31
|
+
非交互终端(非 TTY)下没带 --yes 只列计划不执行,退出码 2。
|
|
24
32
|
|
|
25
33
|
选项:
|
|
26
34
|
--profile <name> 插件装入的 profile,默认 web(dsh web 的默认 profile)
|
|
27
|
-
--config <file>
|
|
35
|
+
--config <file> 配置文件路径(doctor / uninstall 子命令使用)
|
|
36
|
+
--purge uninstall 连配置文件及其备份一起删(默认保留)
|
|
37
|
+
--yes 跳过逐类确认直接执行(uninstall / doctor --fix)
|
|
38
|
+
--fix doctor 体检后自动修可安全处理的问题
|
|
28
39
|
--help 显示本帮助
|
|
29
40
|
--version 显示包版本
|
|
30
41
|
|
|
@@ -36,17 +47,18 @@ const { version } = JSON.parse(readFileSync(new URL('../package.json', import.me
|
|
|
36
47
|
|
|
37
48
|
const argv = process.argv.slice(2);
|
|
38
49
|
|
|
39
|
-
// doctor 子命令:包不再携带独立 CLI,但 tools/
|
|
40
|
-
|
|
41
|
-
// --config
|
|
42
|
-
//
|
|
50
|
+
// doctor / uninstall 子命令:包不再携带独立 CLI,但 tools/ 随包发布
|
|
51
|
+
//(package.json files),逻辑本体在 tools/lib/cli.mjs——这里 dynamic import
|
|
52
|
+
// 转发(--profile / --config / --fix / --purge / --yes 等参数原样透传,由它
|
|
53
|
+
// 自己的 parseArgs 解析),退出码语义:成功 0,有 error 级发现或清理失败 1,
|
|
54
|
+
// 非 TTY 无 --yes 的防呆拒做 2。放在参数循环之前:子命令的参数不用本入口的
|
|
43
55
|
// profile 解析兜底。
|
|
44
|
-
if (argv.includes('doctor')) {
|
|
56
|
+
if (argv.includes('doctor') || argv.includes('uninstall')) {
|
|
45
57
|
try {
|
|
46
58
|
const { main } = await import('../tools/lib/cli.mjs');
|
|
47
59
|
process.exit((await main({ argv })) ?? 0);
|
|
48
60
|
} catch (err) {
|
|
49
|
-
console.error(
|
|
61
|
+
console.error(`子命令运行失败:${err?.message ?? err}`);
|
|
50
62
|
process.exit(1);
|
|
51
63
|
}
|
|
52
64
|
}
|
package/docs/architecture.md
CHANGED
|
@@ -58,6 +58,7 @@ dsh-paoding(中文品牌「庖丁」,取庖丁解牛之意)是 DSH(DeepS
|
|
|
58
58
|
│ │ │ │
|
|
59
59
|
▼ ▼ ▼ ▼
|
|
60
60
|
web_search read/read_image read/read_image glob/grep/read/
|
|
61
|
+
web_fetch
|
|
61
62
|
mcp__tavily__* glob/grep/bash/ write/edit/ read_image/bash/
|
|
62
63
|
(5 个) skill/ glob/grep/bash/ ask_user_question/
|
|
63
64
|
glob/grep/read web_search skill/web_search todo_write/
|
|
@@ -78,7 +79,7 @@ dsh-paoding(中文品牌「庖丁」,取庖丁解牛之意)是 DSH(DeepS
|
|
|
78
79
|
|---|---|---|---|
|
|
79
80
|
| 单体(现状,未裁剪) | 60 工具全量 | **~16.2k** | 每请求固定注入 |
|
|
80
81
|
| 编排主 agent | 21 项白名单(∩ 注册面) | **~5.5k** | ↓66%;内部搜索零委派延迟 |
|
|
81
|
-
| search_external 子 agent |
|
|
82
|
+
| search_external 子 agent | 11 项 allow | ~3.0k | 仅实际联网调研时才产生 |
|
|
82
83
|
| design 子 agent | 12 项 allow | ~3.3k | 仅实际委派设计时才产生 |
|
|
83
84
|
| implement 子 agent | 17 项 allow | ~3.8k | 仅实际委派实现时才产生 |
|
|
84
85
|
| search_internal_deep 子 agent | 10 项 allow | 未单独估算 | 仅实际委派全仓深搜时才产生 |
|
|
@@ -123,7 +124,7 @@ dsh-paoding(中文品牌「庖丁」,取庖丁解牛之意)是 DSH(DeepS
|
|
|
123
124
|
**host 工具不在白名单常量内硬编码**:`mcp__*` 与插件工具(codegraph / memory_search / mnemon_* 等)
|
|
124
125
|
是"检测期事实"——主 agent 需要时经配置文件 `$DSH_HOME/dsh-paoding.config.yml` 的 `main_agent_extra`
|
|
125
126
|
勾选,生成层按运行时检测把仍启用的注入 restrict 的 `config.allow`,停用即自动清除(详见
|
|
126
|
-
[docs/configuration.md](configuration.md))。因此主 agent 的默认面**不包含** `web_search`、全部
|
|
127
|
+
[docs/configuration.md](configuration.md))。因此主 agent 的默认面**不包含** `web_search` / `web_fetch`、全部
|
|
127
128
|
`mcp__tavily__*`、`write` / `edit` / `str_replace_editor`、`skill`、`workflow`、`ralph` 及未过滤的
|
|
128
129
|
`subagent` / `subagent_fork`——这些要么属于角色子 agent,要么成本被刻意清零。
|
|
129
130
|
|
|
@@ -142,7 +143,7 @@ dsh-paoding(中文品牌「庖丁」,取庖丁解牛之意)是 DSH(DeepS
|
|
|
142
143
|
|
|
143
144
|
| 委派工具 | 实例 ID | persona 一句话职责 | 加载成本 |
|
|
144
145
|
|---|---|---|---|
|
|
145
|
-
| `search_external` | `delegation-search-external` | 只做联网调研(web_search + tavily),绝不改文件;返回结构化研究摘要(发现、来源、待答问题) | ~3.0k,仅委派时 |
|
|
146
|
+
| `search_external` | `delegation-search-external` | 只做联网调研(web_search + web_fetch + tavily),绝不改文件;返回结构化研究摘要(发现、来源、待答问题) | ~3.0k,仅委派时 |
|
|
146
147
|
| `design` | `delegation-design` | 产出 UI/UX 设计、线框与前端 spec,可用 skill 工具加载设计技能(frontend-design、html-ppt);先读参考再交付 spec,不写最终代码 | ~3.3k,仅委派时 |
|
|
147
148
|
| `implement` | `delegation-implement` | 写与改代码:先读上下文 → 精准修改 → 验证(build/test/grep);不改架构 | ~3.8k,仅委派时 |
|
|
148
149
|
| `search_internal_deep` | `delegation-search-internal-deep` | 只做仓库探索:不改文件、不联网;处理主 agent 上下文装不下的任务(全仓 grep dump、超页大文件通读、跨目录符号/定义追踪),只回浓缩摘要 | 未单独估算,仅委派时 |
|
|
@@ -157,12 +158,12 @@ dsh-paoding(中文品牌「庖丁」,取庖丁解牛之意)是 DSH(DeepS
|
|
|
157
158
|
**不做**库存对账:手写进去、两头都不占的名字不会被剔除,会静默落盘、运行时以 unknown tools 拒创建
|
|
158
159
|
(与下方该角色的 codegraph 注同一口径),见 [docs/configuration.md](configuration.md))。
|
|
159
160
|
|
|
160
|
-
**`search_external`(外部调研,
|
|
161
|
+
**`search_external`(外部调研,11 项)**
|
|
161
162
|
|
|
162
163
|
| 字段 | 值 |
|
|
163
164
|
|---|---|
|
|
164
165
|
| persona 职责 | 只做联网调研并返回结构化研究摘要(发现、来源、待答问题);绝不修改文件 |
|
|
165
|
-
| toolFilter.allow | `web_search`、`mcp__tavily__tavily_search`、`mcp__tavily__tavily_crawl`、`mcp__tavily__tavily_extract`、`mcp__tavily__tavily_map`、`mcp__tavily__tavily_research`、`glob`、`grep`、`read`、`ask_user_question` |
|
|
166
|
+
| toolFilter.allow | `web_search`、`web_fetch`、`mcp__tavily__tavily_search`、`mcp__tavily__tavily_crawl`、`mcp__tavily__tavily_extract`、`mcp__tavily__tavily_map`、`mcp__tavily__tavily_research`、`glob`、`grep`、`read`、`ask_user_question` |
|
|
166
167
|
| 加载成本 | ~3.0k tokens,仅实际联网调研时发生 |
|
|
167
168
|
|
|
168
169
|
**`design`(设计,12 项)**
|
package/docs/architecture_en.md
CHANGED
|
@@ -70,6 +70,7 @@ allow lists are in the "Roles & tool surfaces" section below):
|
|
|
70
70
|
│ │ │ │
|
|
71
71
|
▼ ▼ ▼ ▼
|
|
72
72
|
web_search read/read_image read/read_image glob/grep/read
|
|
73
|
+
web_fetch
|
|
73
74
|
mcp__tavily__* glob/grep/bash write/edit read_image/bash
|
|
74
75
|
(5 tools) skill/web_search glob/grep/bash ask_user_question
|
|
75
76
|
glob/grep/read ask_user_question skill/web_search todo_write
|
|
@@ -90,8 +91,8 @@ In the diagram:
|
|
|
90
91
|
ask_user_question / get_goal / create_goal / update_goal / exit_plan_mode / job_output / job_list /
|
|
91
92
|
job_kill);
|
|
92
93
|
- Four arrows fan out to the **role sub-agents**, each created on demand (cold path). search_external
|
|
93
|
-
carries web_search, the five `mcp__tavily__*` tools, plus glob/grep/read and ask_user_question,
|
|
94
|
-
write/edit; design carries read/read_image/glob/grep/bash/skill/web_search plus coordination tools;
|
|
94
|
+
carries web_search, web_fetch, the five `mcp__tavily__*` tools, plus glob/grep/read and ask_user_question,
|
|
95
|
+
with no write/edit; design carries read/read_image/glob/grep/bash/skill/web_search plus coordination tools;
|
|
95
96
|
implement carries read/read_image/write/edit/glob/grep/bash/skill/web_search plus coordination and
|
|
96
97
|
goal tools;
|
|
97
98
|
search_internal_deep carries the full read-only internal-search surface (glob/grep/read/read_image/bash
|
|
@@ -107,7 +108,7 @@ measured calibration; figures are order-of-magnitude estimates):
|
|
|
107
108
|
|---|---|---|---|
|
|
108
109
|
| Monolithic (status quo, untrimmed) | All 60 tools | **~16.2k** | Paid in full on every request |
|
|
109
110
|
| Orchestrator main agent | 21-entry whitelist (∩ registry) | **~5.5k** | ↓66%; zero delegation latency for internal search |
|
|
110
|
-
| search_external sub-agent |
|
|
111
|
+
| search_external sub-agent | 11 allowed entries | ~3.0k | Paid only when web research actually runs |
|
|
111
112
|
| design sub-agent | 12 allowed entries | ~3.3k | Paid only when a design task is delegated |
|
|
112
113
|
| implement sub-agent | 17 allowed entries | ~3.8k | Paid only when an implementation task is delegated |
|
|
113
114
|
| search_internal_deep sub-agent | 10 allowed entries | not separately estimated | Paid only when a deep repo search is delegated |
|
|
@@ -160,7 +161,7 @@ memory_search / mnemon_* etc.) are "install-time facts" — when the main agent
|
|
|
160
161
|
`main_agent_extra` in the configuration file `$DSH_HOME/dsh-paoding.config.yml`, the generator injects the
|
|
161
162
|
still-enabled ones into the restrict `config.allow` based on runtime detection, and disabled ones are
|
|
162
163
|
dropped automatically (see [docs/configuration_en.md](configuration_en.md)). The main agent's default surface
|
|
163
|
-
therefore excludes `web_search`, every `mcp__tavily__*`, `write` / `edit` / `str_replace_editor`, `skill`,
|
|
164
|
+
therefore excludes `web_search` / `web_fetch`, every `mcp__tavily__*`, `write` / `edit` / `str_replace_editor`, `skill`,
|
|
164
165
|
`workflow`, `ralph`, and the unfiltered `subagent` / `subagent_fork` — either because they belong to role
|
|
165
166
|
sub-agents or because their cost is deliberately zeroed out.
|
|
166
167
|
|
|
@@ -184,7 +185,7 @@ For example, a `ppt` agent carrying the `html-ppt` skill gives slide-making its
|
|
|
184
185
|
|
|
185
186
|
| Delegation tool | Instance ID | Persona in one sentence | Load cost |
|
|
186
187
|
|---|---|---|---|
|
|
187
|
-
| `search_external` | `delegation-search-external` | Web research only (web_search + tavily), never modifies files; returns a structured research summary (findings, sources, open questions) | ~3.0k, only when delegated |
|
|
188
|
+
| `search_external` | `delegation-search-external` | Web research only (web_search + web_fetch + tavily), never modifies files; returns a structured research summary (findings, sources, open questions) | ~3.0k, only when delegated |
|
|
188
189
|
| `design` | `delegation-design` | Produces UI/UX designs, wireframes and frontend specs; may load design skills (frontend-design, html-ppt) via the skill tool; reads reference material first, delivers a spec, does not implement final code | ~3.3k, only when delegated |
|
|
189
190
|
| `implement` | `delegation-implement` | Writes and edits code: read surrounding context → surgical change → verify (build/test/grep); does not redesign architecture | ~3.8k, only when delegated |
|
|
190
191
|
| `search_internal_deep` | `delegation-search-internal-deep` | Repository exploration only: never modifies files, never uses the network; handles tasks too heavy for the main agent's context (whole-repo grep dumps, full-file reads beyond a page, cross-directory symbol/definition tracking); returns condensed summaries only | not separately estimated, only when delegated |
|
|
@@ -213,12 +214,12 @@ on disk silently, and fail at runtime with unknown tools at child creation — s
|
|
|
213
214
|
note for that role below; see
|
|
214
215
|
[docs/configuration_en.md](configuration_en.md)).
|
|
215
216
|
|
|
216
|
-
**`search_external` (external research,
|
|
217
|
+
**`search_external` (external research, 11 entries)**
|
|
217
218
|
|
|
218
219
|
| Field | Value |
|
|
219
220
|
|---|---|
|
|
220
221
|
| Persona job | Web research only, returning a structured research summary (findings, sources, open questions); never modifies files |
|
|
221
|
-
| toolFilter.allow | `web_search`, `mcp__tavily__tavily_search`, `mcp__tavily__tavily_crawl`, `mcp__tavily__tavily_extract`, `mcp__tavily__tavily_map`, `mcp__tavily__tavily_research`, `glob`, `grep`, `read`, `ask_user_question` |
|
|
222
|
+
| toolFilter.allow | `web_search`, `web_fetch`, `mcp__tavily__tavily_search`, `mcp__tavily__tavily_crawl`, `mcp__tavily__tavily_extract`, `mcp__tavily__tavily_map`, `mcp__tavily__tavily_research`, `glob`, `grep`, `read`, `ask_user_question` |
|
|
222
223
|
| Load cost | ~3.0k tokens, incurred only when web research actually runs |
|
|
223
224
|
|
|
224
225
|
**`design` (design, 12 entries)**
|
package/docs/configuration.md
CHANGED
|
@@ -73,6 +73,7 @@ roles: # toolName -> { persona?, tools[] }
|
|
|
73
73
|
You are the external-research agent. Web research only — never modify files.
|
|
74
74
|
tools:
|
|
75
75
|
- web_search
|
|
76
|
+
- web_fetch
|
|
76
77
|
- mcp__tavily__tavily_search
|
|
77
78
|
- mcp__tavily__tavily_crawl
|
|
78
79
|
- mcp__tavily__tavily_extract
|
|
@@ -138,11 +139,14 @@ skills: # skill -> 分配给的角色(写进角色 persona 的
|
|
|
138
139
|
search_external:
|
|
139
140
|
tools:
|
|
140
141
|
- web_search
|
|
142
|
+
- web_fetch
|
|
141
143
|
- mcp__tavily__tavily_* # 生成时展开为 search/crawl/extract/map/research(以实际检测为准)
|
|
142
144
|
```
|
|
143
145
|
|
|
144
146
|
`main_agent_extra` 与自定义角色的 `tools` 同样支持。配置文件里模式条目原样存取(配置面板回显不受影响),只有生成的 preset 里落的是展开后的具体名。
|
|
145
147
|
|
|
148
|
+
> 宿主 0.2.1-rc.2 起可在 **设置 → 网页搜索** 开启 DeepSeek Search / Fetch API:`web_search` / `web_fetch` 的名字不变,后方 provider 自动切换到官方新后端——无需改动庖丁配置,角色 allow 里的这两个名字照常生效。
|
|
149
|
+
|
|
146
150
|
示例(替换 `implement` 的 persona 与 tools):下方 tools 与静态默认一致——注意它不含 `str_replace_editor`(原因见 8.2)。显式写出 tools 等于固定意图:将来静态源怎么改都不再影响本角色:
|
|
147
151
|
|
|
148
152
|
```yaml
|
|
@@ -350,7 +354,7 @@ fork 的语义(如实说明):
|
|
|
350
354
|
| 内部搜索(热路径) | `glob` `grep` `read` `read_image` `bash` |
|
|
351
355
|
| 协调 | `todo_write` `ask_user_question` `get_goal` `create_goal` `update_goal` `exit_plan_mode` `job_output` `job_list` `job_kill` |
|
|
352
356
|
|
|
353
|
-
对照说明:`web_search`、全部 `mcp__tavily__*`、`write` / `edit` / `str_replace_editor`、`skill`、`workflow`、`ralph`、未过滤的 `subagent` 委派等**刻意不在**主 agent 面上(host 工具如 codegraph / `memory_search` / mnemon 同理不硬编码进源码,需要时用 `main_agent_extra` 勾选,见 3.2)。另外 `restrict.mjs` 在注册层对主 agent deny 了 `skill`(目录注入守卫查的是注册面而非模型可见面),主 agent 的技能目录注入随之归零。
|
|
357
|
+
对照说明:`web_search` / `web_fetch`、全部 `mcp__tavily__*`、`write` / `edit` / `str_replace_editor`、`skill`、`workflow`、`ralph`、未过滤的 `subagent` 委派等**刻意不在**主 agent 面上(host 工具如 codegraph / `memory_search` / mnemon 同理不硬编码进源码,需要时用 `main_agent_extra` 勾选,见 3.2)。另外 `restrict.mjs` 在注册层对主 agent deny 了 `skill`(目录注入守卫查的是注册面而非模型可见面),主 agent 的技能目录注入随之归零。
|
|
354
358
|
|
|
355
359
|
### 3.2 追加工具:main_agent_extra
|
|
356
360
|
|
|
@@ -735,6 +739,8 @@ workspaces:
|
|
|
735
739
|
- 落盘即改 mtime,面板的检测状态缓存按对账自动失效,视图随后按新配置重建。
|
|
736
740
|
- 与「保存并应用」共用同一把写盘互斥闸:应用进行中导入(或反过来)会收到 409,稍后重试即可。
|
|
737
741
|
|
|
742
|
+
**备份与恢复**:凡是往配置文件写盘的动作(保存并应用、导入、恢复备份)都会先把当前文件轮换备份三份——`dsh-paoding.config.yml.bak-1`(最新)到 `.bak-3`,逐份后移、最旧的淘汰;备份与配置文件同目录,首次保存前没有旧值就不备份。回滚走「更多」→「恢复备份…」:列出各备份的生成时间与大小,二次确认后整份覆盖回当前配置(恢复前当前文件还会再自动备份一份,连按恢复也能原路退回);恢复同样先验格式(解析不出顶层映射的备份拒收),共用写盘互斥闸。没有面板时,手动把 `.bak-N` 拷回主文件名即可。
|
|
743
|
+
|
|
738
744
|
## 12. 检查提示(体检)
|
|
739
745
|
|
|
740
746
|
预览或应用后,若服务端体检发现问题,预览区上方会出现一张**检查提示**卡:逐条列出示意,红(error)/ 琥珀(warn)/ 中性(info)三色分级,悬停可见检查项代号(排障用)。没有问题就没有这张卡,零占位。
|
|
@@ -751,6 +757,8 @@ workspaces:
|
|
|
751
757
|
|
|
752
758
|
作废口径:**预览**产生的提示随配置草稿的任何改动一并作废(与预览同一逻辑);**应用**产生的提示描述的是已落盘结果,保留到下一次预览或应用。应用失败时错误 toast 照旧,同时卡片给出每条失败原因;应用成功但存在 warn/error 级提示时,成功 toast 会换成琥珀档「有 N 条检查提示,见下方」。
|
|
753
759
|
|
|
760
|
+
体检之外,预览还带两样「看得见」的东西:一是**本次变更**——相对上次保存配置的逐项明细(角色增删、各角色工具与 persona、专用模型、启动方式、后台续跑、主 agent 工具增删、`roles_remove` 与 `main_agent_extra` 通道),没有任何改动就一行「与上次保存的配置一致」;二是**工具面瘦身统计**——主 agent 当前 allow 数对照单体全量数的百分比,页头常驻一份(按已保存配置),预览区再示一份(按当前未保存配置),保存前后各看各的。
|
|
761
|
+
|
|
754
762
|
## 13. HTTP 接口
|
|
755
763
|
|
|
756
764
|
插件的 Web 后端随 DSH Web 服务同进程挂载在 `/api/paoding/*` 前缀下(回环地址 + 端口随部署,信任围栏与面板一致),面板能做的配置读写,脚本与自动化工具也能照做。预设对象的完整 CRUD 四条:
|
package/docs/configuration_en.md
CHANGED
|
@@ -73,6 +73,7 @@ roles: # toolName -> { persona?, tools[] }
|
|
|
73
73
|
You are the external-research agent. Web research only — never modify files.
|
|
74
74
|
tools:
|
|
75
75
|
- web_search
|
|
76
|
+
- web_fetch
|
|
76
77
|
- mcp__tavily__tavily_search
|
|
77
78
|
- mcp__tavily__tavily_crawl
|
|
78
79
|
- mcp__tavily__tavily_extract
|
|
@@ -138,11 +139,14 @@ Of the four built-in delegation roles, the installer (the `ROLES` constant) mana
|
|
|
138
139
|
search_external:
|
|
139
140
|
tools:
|
|
140
141
|
- web_search
|
|
142
|
+
- web_fetch
|
|
141
143
|
- mcp__tavily__tavily_* # expanded at generation to search/crawl/extract/map/research (per actual detection)
|
|
142
144
|
```
|
|
143
145
|
|
|
144
146
|
`main_agent_extra` and custom-role `tools` support them too. Pattern entries are stored and read back verbatim in the config file (the config panel renders them fine); only the generated preset contains the expanded concrete names.
|
|
145
147
|
|
|
148
|
+
> Host 0.2.1-rc.2 and later can enable the DeepSeek Search / Fetch API under **Settings → Web Search**: `web_search` / `web_fetch` keep their names while the provider behind them switches to the official new backend — no 庖丁 (Paoding) config change needed, and both names in a role's allow list keep working as-is.
|
|
149
|
+
|
|
146
150
|
Example — replacing `implement`'s persona and tools. The `tools` below match the static default — note that it does **not** contain `str_replace_editor` (why: see 8.2). Writing `tools` out explicitly freezes the intent: later changes to the static source no longer affect this role:
|
|
147
151
|
|
|
148
152
|
```yaml
|
|
@@ -350,7 +354,7 @@ The `MAIN_AGENT_ALLOW` constant in `restrict.mjs` is the **base** (21 names) tha
|
|
|
350
354
|
| Internal search (hot path) | `glob` `grep` `read` `read_image` `bash` |
|
|
351
355
|
| Coordination | `todo_write` `ask_user_question` `get_goal` `create_goal` `update_goal` `exit_plan_mode` `job_output` `job_list` `job_kill` |
|
|
352
356
|
|
|
353
|
-
For orientation: `web_search`, every `mcp__tavily__*`, `write` / `edit` / `str_replace_editor`, `skill`, `workflow`, `ralph`, and the unfiltered `subagent` delegation are **deliberately absent** from the main-agent surface (host tools such as codegraph / `memory_search` / mnemon are likewise not hard-coded into the source — opt them in via `main_agent_extra`, see 3.2). `restrict.mjs` also denies `skill` at the registry level for the main agent (the catalog-injection guard checks registry visibility, not the model-facing list), which brings the main agent's skill-catalog token tax to zero.
|
|
357
|
+
For orientation: `web_search` / `web_fetch`, every `mcp__tavily__*`, `write` / `edit` / `str_replace_editor`, `skill`, `workflow`, `ralph`, and the unfiltered `subagent` delegation are **deliberately absent** from the main-agent surface (host tools such as codegraph / `memory_search` / mnemon are likewise not hard-coded into the source — opt them in via `main_agent_extra`, see 3.2). `restrict.mjs` also denies `skill` at the registry level for the main agent (the catalog-injection guard checks registry visibility, not the model-facing list), which brings the main agent's skill-catalog token tax to zero.
|
|
354
358
|
|
|
355
359
|
### 3.2 Appending tools: main_agent_extra
|
|
356
360
|
|
|
@@ -747,6 +751,8 @@ The header "More" menu offers export and import of the whole config file (the §
|
|
|
747
751
|
- Writing changes the file's mtime, so the panel's detection-state cache invalidates automatically through the existing reconciliation, and the view rebuilds from the new config.
|
|
748
752
|
- Import shares the same in-flight write gate as "save & apply": applying during an import (or the reverse) answers 409 — retry shortly.
|
|
749
753
|
|
|
754
|
+
**Backups and restore**: every action that writes the config file (save & apply, import, restore) first rotates the current file through three backups — `dsh-paoding.config.yml.bak-1` (newest) to `.bak-3`, each shifting one slot and the oldest falling off; backups live next to the config file, and a first-ever save with no previous file backs up nothing. Rollback runs through "More" → "Restore backup…": each backup is listed with its time and size, one confirming dialog puts it back in place (the current file is backed up once more first, so even a mistaken restore can be walked back); the restore validates the backup too (a backup that parses to a non-mapping is rejected) and shares the write gate. Without the panel, copy a `.bak-N` back over the main filename by hand.
|
|
755
|
+
|
|
750
756
|
## 12. Check messages (health review)
|
|
751
757
|
|
|
752
758
|
After a preview or an apply, if the server-side health review finds problems, a **check messages** card appears above the preview area: one row per finding, color-coded red (error) / amber (warn) / neutral (info), with the check code available on hover for troubleshooting. No findings — no card, zero footprint.
|
|
@@ -763,6 +769,8 @@ Entries come from the structured health review (`tools/lib/health.mjs`); codes a
|
|
|
763
769
|
|
|
764
770
|
Invalidation scope: messages from a **preview** are discarded together with the draft on any config edit (same rule as the preview itself); messages from an **apply** describe what has already been written and survive until the next preview or apply. When an apply fails, the error toast stays as usual and the card lists every reason; when an apply succeeds but warn/error-level findings exist, the success toast switches to the amber variant "N check messages, see below".
|
|
765
771
|
|
|
772
|
+
Beside the checks, a preview carries two more pieces of visibility. One is **changes since the last save** — an itemized diff against the saved config (roles added/removed, each role's tools and persona, dedicated model, start mode, background continuation, main-agent tool changes, the `roles_remove` and `main_agent_extra` channels); with nothing changed it collapses to a single "identical to the last saved config" line. The other is the **tool-surface stat** — the main agent's current allow count against the monolithic total as a percentage: one permanent line in the header (from the saved config) and one in the preview (from the unsaved config), one for each side of a save.
|
|
773
|
+
|
|
766
774
|
## 13. HTTP API
|
|
767
775
|
|
|
768
776
|
The plugin's web backend is mounted under the `/api/paoding/*` prefix inside the DSH web server itself (loopback address + port per your deployment; the same trust fence as the panel). Anything the panel can do to the config, scripts and automation can do too. Full CRUD for preset objects:
|
package/docs/installation.md
CHANGED
|
@@ -191,22 +191,30 @@ patch 与配置文件用 **`yaml` 包**解析——通过 `createRequire` 从 `$
|
|
|
191
191
|
|
|
192
192
|
### 数据接口与安全
|
|
193
193
|
|
|
194
|
-
面板数据走**同源 `/api/paoding/*`**:Node 侧注册前缀路由——`GET /api/paoding/state`(带缓存的检测状态)、`GET /api/paoding/version`(最新版检测,版本/更新卡的数据源)、`GET /api/paoding/models`(宿主模型运行时的模型清单)、`GET` + `POST /api/paoding/workspaces`(工作区列表 / 添加工作区)、`POST /api/paoding/rescan`(强制重检测,含 MCP 握手)、`POST /api/paoding/preview`(不写盘生成)、`POST /api/paoding/apply`(安装并保存配置)、`POST /api/paoding/upgrade`(就地升级:普通 profile 走 `dsh plugin update`,desktop profile 直跑 `pnpm add`,pnpm 按「裸 pnpm → `corepack pnpm` → PNPM_HOME 落位」候选链解析)、`GET /api/paoding/config/export`(配置文件原文导出,下载/备份用)、`POST /api/paoding/config/import`(整份导入:先验格式、与「保存并应用」共用写盘闸)、`GET /api/paoding/client.css`(面板样式静态下发)——复用 `tools/` 的检测与生成管线(`plugins/paoding-config-ui/api-core.mjs`)。路由自带**浏览器信任围栏**:Host 必须回环或落在 `webRuntime.trustedHosts`,并拒绝 cross-site 请求(复刻 DSH `/api` 网关围栏语义,因为 `/api/paoding` 前缀更长会命中本插件而绕开网关)。面板**没有独立服务端/端口**:DSH Web 端口只监听 `127.0.0.1`,不对外网暴露。
|
|
194
|
+
面板数据走**同源 `/api/paoding/*`**:Node 侧注册前缀路由——`GET /api/paoding/state`(带缓存的检测状态)、`GET /api/paoding/version`(最新版检测,版本/更新卡的数据源)、`GET /api/paoding/models`(宿主模型运行时的模型清单)、`GET` + `POST /api/paoding/workspaces`(工作区列表 / 添加工作区)、`POST /api/paoding/rescan`(强制重检测,含 MCP 握手)、`POST /api/paoding/preview`(不写盘生成)、`POST /api/paoding/apply`(安装并保存配置)、`POST /api/paoding/upgrade`(就地升级:普通 profile 走 `dsh plugin update`,desktop profile 直跑 `pnpm add`,pnpm 按「裸 pnpm → `corepack pnpm` → PNPM_HOME 落位」候选链解析)、`GET /api/paoding/config/export`(配置文件原文导出,下载/备份用)、`POST /api/paoding/config/import`(整份导入:先验格式、与「保存并应用」共用写盘闸)、`GET /api/paoding/config/backups`(自动备份清单)、`POST /api/paoding/config/restore`(恢复备份:文件名白名单防穿越,先验可解析再覆盖)、`GET /api/paoding/stats`(委派效果统计:冷读会话存档聚合,days 窗口与 project 过滤)、`GET /api/paoding/client.css`(面板样式静态下发)——复用 `tools/` 的检测与生成管线(`plugins/paoding-config-ui/api-core.mjs`)。路由自带**浏览器信任围栏**:Host 必须回环或落在 `webRuntime.trustedHosts`,并拒绝 cross-site 请求(复刻 DSH `/api` 网关围栏语义,因为 `/api/paoding` 前缀更长会命中本插件而绕开网关)。面板**没有独立服务端/端口**:DSH Web 端口只监听 `127.0.0.1`,不对外网暴露。
|
|
195
195
|
|
|
196
196
|
### 面板能力
|
|
197
197
|
|
|
198
|
-
- **状态与操作**:页头是标题 + 版本/更新卡(新版就地提示与一键升级)+
|
|
199
|
-
- **Agent 工具分配卡片**:主 agent 一张固定卡(基础工具取消勾选 = 加入 `main_agent_remove` 从主 agent 剔除;MCP / 插件工具勾选 = 加入 `main_agent_extra`;技能「read 按需」与「内联全文」两组勾选;另有「人设追加」编辑区,可改、清空、恢复默认)+ `search_external` / `design` / `implement` 三张内置角色卡 + 任意自定义角色卡(带删除按钮);每张角色卡把工具按「基础工具 / MCP 工具 /
|
|
198
|
+
- **状态与操作**:页头是标题 + 版本/更新卡(新版就地提示与一键升级)+ 副标题,副标题下一行常驻主 agent 工具面瘦身统计(当前 allow 数 / 单体全量数与瘦身百分比,配完第一次能看到省了多少),正文直接就是工作区与角色卡,没有单独的检测摘要与 chips 区;操作按钮「**保存并应用**」「预览生成」「重新检测」固定在面板底部悬浮操作坞(sticky bottom),滚动任意位置都可直接点击。
|
|
199
|
+
- **Agent 工具分配卡片**:主 agent 一张固定卡(基础工具取消勾选 = 加入 `main_agent_remove` 从主 agent 剔除;MCP / 插件工具勾选 = 加入 `main_agent_extra`;技能「read 按需」与「内联全文」两组勾选;另有「人设追加」编辑区,可改、清空、恢复默认)+ `search_external` / `design` / `implement` 三张内置角色卡 + 任意自定义角色卡(带删除按钮);每张角色卡把工具按「基础工具 / MCP 工具 / 插件工具」三组呈现、可逐项勾选(任一组超过 8 项时组顶出现筛选框,输入即滤),并可编辑 persona。底部「新建自定义 agent 角色」。
|
|
200
200
|
- **技能分配**:每个 skill 一行,勾选分配给哪些 agent(写入对应 persona 的 `Available skills` 软引导;角色技能软引导,主 agent 技能另有 read 按需/内联两组)。
|
|
201
|
-
- **预览生成**:不写盘生成 `agent.cordis.yml`,显示每个角色 allow 的 intent → kept
|
|
201
|
+
- **预览生成**:不写盘生成 `agent.cordis.yml`,显示每个角色 allow 的 intent → kept 计数与生成全文;同时列「本次变更」——相对上次保存配置的逐项明细(角色增删、各角色工具与 persona、专用模型、启动方式、后台续跑、主 agent 工具增删),无改动时一行带过;瘦身统计在这里按当前未保存配置另示一行。
|
|
202
202
|
- **保存并应用**:确认后写入 preset(覆盖 `$DSH_HOME/.agent-presets/orchestrator`)并按宿主版本同步登记——≤ 0.1.6 目录扫描即生效,≥ 0.1.7 同步维护 `$DSH_HOME/cordis.patch.yml` 里的声明行托管块(见第 2 节)——再把当前分配保存到 `$DSH_HOME/dsh-paoding.config.yml`;应用成功后提示重启 DSH 或新建会话生效(检测到 patch 比生成结果新时提示重启后生效)。打开面板时会加载既有配置文件作为当前值——手编过的选择直接可见、可改。
|
|
203
203
|
- **场景模板**:页头三档切换(轻量:只留实现角色;调研:只留检索角色;全开:全员到齐、主 agent 额外工具带满检测库存),一键换「班底」;只动 `roles_remove` 与 `main_agent_extra`,各角色精调过的工具面、persona、模型、启动方式分毫不动,切回即原样复原。
|
|
204
204
|
- **检查提示卡**:每次「预览生成 / 保存并应用」自动过一遍体检(配置了未挂载的工具、零工具角色、查无此名的模型、预设落后于配置),分级提示以卡片形式贴在页头下方,处理完再保存不迟。
|
|
205
|
-
-
|
|
205
|
+
- **备份与回滚**:保存、导入、恢复配置前都会自动把当前配置轮换备份三份(`config.yml.bak-1..3`,新压旧);「更多」→「恢复备份…」列时间与大小、二次确认后回退,恢复前当前配置还会再自动备份一份——误操作有后悔药。
|
|
206
|
+
- **委派效果统计**:页头「委派效果」卡按角色统计被委派的调用数、平均耗时与失败数(近 30 天,`days` 参数可调)。数据来自宿主会话存档的冷读——经宿主 `sessionPersistence` 服务逐会话抽摘要、本地聚合,不出机、不带负载;失败记的是子会话零轮次或轮次中断(spawn 后即死、中途终止两种形态)。宿主缺会话服务时整卡不渲染。
|
|
207
|
+
- **「更多」菜单**:配置导出(下载 `dsh-paoding.config.yml` 原文)/ 导入(先验格式,整份覆盖含工作区段,需二次确认)/ 恢复备份(见上条)与面板语言切换(中英自动识别、手动选择优先并记住)。
|
|
206
208
|
|
|
207
209
|
## 7. 卸载
|
|
208
210
|
|
|
209
|
-
|
|
211
|
+
先用一条命令清掉庖丁写进宿主目录的东西(托管声明块、`orchestrator*` 预设目录、版本标记;配置文件默认保留,`--purge` 才连配置与备份一起删;非交互终端需加 `--yes`):
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
npx dsh-paoding@latest uninstall
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
包本体再按 profile 摘掉,三条命令删得干干净净:
|
|
210
218
|
|
|
211
219
|
```bash
|
|
212
220
|
dsh plugin --profile web remove dsh-paoding
|
|
@@ -216,7 +224,7 @@ rm -rf "${DSH_HOME:-$HOME/.dsh}/.agent-presets"/orchestrator-*
|
|
|
216
224
|
|
|
217
225
|
第一条摘掉插件与侧栏面板(只影响指定 profile),第二条删掉编排预设目录,第三条清掉按工作区配置时生成的各工作区预设目录(`orchestrator-<目录名>`;没用过按工作区配置就没有这类目录,通配不命中、无害)——基础 `orchestrator` 目录已由上一条命令删掉,不含在这个通配里。配置文件 `~/.dsh/dsh-paoding.config.yml` 不随之上删——留着或删掉都不影响 DSH 其它配置,重装时首装自动化会再次按它应用。
|
|
218
226
|
|
|
219
|
-
|
|
227
|
+
(走了上面的 `uninstall` 就免了这一步和下一眼的托管块手删——它已一并清掉。)宿主为 DSH ≥ 0.1.7 时若手动删目录,再多看一眼:`$DSH_HOME/cordis.patch.yml` 里可能还留着 dsh-paoding 托管块(起止标记注释包着 `- insert:` 声明行)。预设目录删掉后,块内声明行就成了指向已删目录的悬空引用,请把整个托管块(从 `# --- dsh-paoding presets (auto-generated; do not edit) ---` 起始行到 end 标记行)一并删去——块外内容不受影响。
|
|
220
228
|
|
|
221
229
|
卸载不影响 host 的其它内容(MCP、插件、会话等),与 DSH 源码零耦合;之后新建会话时「编排模式 (Orchestrator)」不再出现在预设选择器里。
|
|
222
230
|
|
|
@@ -232,6 +240,8 @@ npx dsh-paoding@latest doctor # 或仓库内:node tools/install.mjs d
|
|
|
232
240
|
|
|
233
241
|
doctor 不改任何文件,逐项检查并给出 `✔ 正常 / ⚠ 警告 / ✘ 错误 / – 跳过` 四档结论:配置文件能否解析、预设安装轨道与宿主版本是否匹配、托管声明行有无孤儿行或损坏块、`.agent-presets/orchestrator-*` 有没有配置里已不引用的孤儿目录、已装预设与当前配置的再生成结果有无漂移、`.generator-version` 版本标记是否对得上。结尾有汇总;出现 ✘ 时退出码为 1,⚠ 与 – 不影响使用(跳过多见于全新机器,属正常)。`--config` / `--profile` 与安装时同义。
|
|
234
242
|
|
|
243
|
+
`doctor --fix` 会在这份诊断之后自动修两类可安全处理的问题——孤儿 `orchestrator-*` 预设目录、托管块里的孤儿/过期声明行(写盘前自动备份 `.bak-1`),其余发现只给处理建议不代做(预设漂移就提示跑 `--auto` 重新生成);输出逐项标注「已修 / 需手动」。非交互终端下 `--fix` 与 `uninstall` 都要显式 `--yes` 才落盘,否则只列计划、退出码 2。
|
|
244
|
+
|
|
235
245
|
面板侧也有同源的保存时体检:每次「预览生成 / 保存并应用」的响应都带 `warnings` 字段(配置了未挂载工具、零工具角色、角色专用模型不在模型目录、预设落后于配置等),按条目提示处理即可,不用等运行时报错。
|
|
236
246
|
|
|
237
247
|
**pnpm 缺失**
|
package/docs/installation_en.md
CHANGED
|
@@ -191,22 +191,30 @@ If you'd rather not hand-edit `dsh-paoding.config.yml`, open the **庖丁配置
|
|
|
191
191
|
|
|
192
192
|
### Data interface and security
|
|
193
193
|
|
|
194
|
-
Panel data goes over the **same-origin `/api/paoding/*`**: the Node side registers prefix routes — `GET /api/paoding/state` (cached detection state), `GET /api/paoding/version` (latest-version check, the data source of the version/update card), `GET /api/paoding/models` (model list from the host LLM runtime), `GET` + `POST /api/paoding/workspaces` (list / add workspaces), `POST /api/paoding/rescan` (forced re-detection, MCP handshakes included), `POST /api/paoding/preview` (generate without writing), `POST /api/paoding/apply` (install and save config), `POST /api/paoding/upgrade` (in-place upgrade: `dsh plugin update` for regular profiles, a direct `pnpm add` for the desktop profile — pnpm is resolved through a candidate chain: bare `pnpm` → `corepack pnpm` → PNPM_HOME locations), `GET /api/paoding/config/export` (raw config file for download/backup), `POST /api/paoding/config/import` (whole-file import: validated first, shares the apply write mutex), `GET /api/paoding/client.css` (statically served panel stylesheet) — reusing the detection/generation pipeline in `tools/` (`plugins/paoding-config-ui/api-core.mjs`). The routes carry a **browser trust fence**: the Host must be loopback or listed in `webRuntime.trustedHosts`, and cross-site requests are rejected (mirroring DSH's `/api` gateway fence semantics, since the longer `/api/paoding` prefix would otherwise hit this plugin and bypass the gateway). The panel has **no separate server or port**: the DSH Web port listens on `127.0.0.1` only and is never exposed to the outside.
|
|
194
|
+
Panel data goes over the **same-origin `/api/paoding/*`**: the Node side registers prefix routes — `GET /api/paoding/state` (cached detection state), `GET /api/paoding/version` (latest-version check, the data source of the version/update card), `GET /api/paoding/models` (model list from the host LLM runtime), `GET` + `POST /api/paoding/workspaces` (list / add workspaces), `POST /api/paoding/rescan` (forced re-detection, MCP handshakes included), `POST /api/paoding/preview` (generate without writing), `POST /api/paoding/apply` (install and save config), `POST /api/paoding/upgrade` (in-place upgrade: `dsh plugin update` for regular profiles, a direct `pnpm add` for the desktop profile — pnpm is resolved through a candidate chain: bare `pnpm` → `corepack pnpm` → PNPM_HOME locations), `GET /api/paoding/config/export` (raw config file for download/backup), `POST /api/paoding/config/import` (whole-file import: validated first, shares the apply write mutex), `GET /api/paoding/config/backups` (automatic backup list), `POST /api/paoding/config/restore` (restore a backup: filename whitelist against path traversal, validated for parseability before overwriting), `GET /api/paoding/stats` (delegation stats: cold-read aggregation over the session archive, with a days window and project filter), `GET /api/paoding/client.css` (statically served panel stylesheet) — reusing the detection/generation pipeline in `tools/` (`plugins/paoding-config-ui/api-core.mjs`). The routes carry a **browser trust fence**: the Host must be loopback or listed in `webRuntime.trustedHosts`, and cross-site requests are rejected (mirroring DSH's `/api` gateway fence semantics, since the longer `/api/paoding` prefix would otherwise hit this plugin and bypass the gateway). The panel has **no separate server or port**: the DSH Web port listens on `127.0.0.1` only and is never exposed to the outside.
|
|
195
195
|
|
|
196
196
|
### Panel capabilities
|
|
197
197
|
|
|
198
|
-
- **State and actions**: the page header is a title + version/update card (in-place new-version notice and one-click upgrade) + subtitle, and the body goes straight to the workspace and role cards with no separate detection-summary/chips section; the action buttons「**保存并应用**」(Save & Apply), Preview, and Rescan sit in a sticky bottom dock, clickable from any scroll position.
|
|
199
|
-
- **Agent tool-assignment cards**: one fixed card for the main agent (unchecking a base tool adds it to `main_agent_remove`, dropping it from the main agent; checking an MCP / plugin tool adds it to `main_agent_extra`; skills in two groups, "read on demand" and "inline full text"; plus a "persona extra" editor — edit, clear, or restore the default) + three built-in role cards (`search_external` / `design` / `implement`) + any number of custom role cards (with a delete button); every role card presents its tools in three groups — base / MCP / plugin — with per-item checkboxes, and the persona is editable. "Create a custom agent role" at the bottom.
|
|
198
|
+
- **State and actions**: the page header is a title + version/update card (in-place new-version notice and one-click upgrade) + subtitle, with a permanent main-agent tool-surface line under the subtitle (current allow count vs the monolithic total, plus the slimming percentage — the first visible payoff of configuring), and the body goes straight to the workspace and role cards with no separate detection-summary/chips section; the action buttons「**保存并应用**」(Save & Apply), Preview, and Rescan sit in a sticky bottom dock, clickable from any scroll position.
|
|
199
|
+
- **Agent tool-assignment cards**: one fixed card for the main agent (unchecking a base tool adds it to `main_agent_remove`, dropping it from the main agent; checking an MCP / plugin tool adds it to `main_agent_extra`; skills in two groups, "read on demand" and "inline full text"; plus a "persona extra" editor — edit, clear, or restore the default) + three built-in role cards (`search_external` / `design` / `implement`) + any number of custom role cards (with a delete button); every role card presents its tools in three groups — base / MCP / plugin — with per-item checkboxes (any group over 8 items grows a filter box on top; type to narrow), and the persona is editable. "Create a custom agent role" at the bottom.
|
|
200
200
|
- **Skill assignment**: one row per skill, check which agents it goes to (written into the matching personas as `Available skills` soft guidance; role skills are soft guidance, main-agent skills have the read-on-demand/inline groups).
|
|
201
|
-
- **Preview**: generates `agent.cordis.yml` without writing, showing each role's intent → kept counts plus the full generated text.
|
|
201
|
+
- **Preview**: generates `agent.cordis.yml` without writing, showing each role's intent → kept counts plus the full generated text; it also lists "changes since the last save" — an itemized diff (roles added/removed, each role's tools and persona, dedicated model, start mode, background continuation, main-agent tool changes) reduced to a single line when nothing changed; the tool-surface stat appears here too, computed from the unsaved config.
|
|
202
202
|
- **Save & Apply**: after confirmation, writes the preset (overwriting `$DSH_HOME/.agent-presets/orchestrator`) and registers it per host generation — on ≤ 0.1.6 the directory scan picks it up as-is, on ≥ 0.1.7 the declaration managed block in `$DSH_HOME/cordis.patch.yml` is maintained in the same pass (see §2) — then saves the current assignments to `$DSH_HOME/dsh-paoding.config.yml`; success asks you to restart DSH or start a new session (and flags when a patch is newer than the generated output). Opening the panel loads the existing config file as the current values — hand-edited choices are visible and editable right away.
|
|
203
203
|
- **Scenario templates**: three one-click presets in the header (Lite: implement role only; Research: search roles only; Full: everyone on deck with the main agent carrying the whole detected inventory) swap the roster — they only touch `roles_remove` and `main_agent_extra`; each role's hand-tuned tools, persona, model, and start mode stay untouched and restore as-is when you switch back.
|
|
204
204
|
- **Health-check card**: every Preview / Save & Apply runs a check pass (tools configured but not mounted, zero-tool roles, unknown model names, a preset lagging behind the config); findings show as a severity-tagged card under the header so you can fix them before saving.
|
|
205
|
-
- **
|
|
205
|
+
- **Backups and rollback**: every write to the config (save & apply, import, restore) first rotates the current file through three backups — `config.yml.bak-1` (newest) through `.bak-3`; "More" → "Restore backup…" lists each backup's time and size and, after a confirming dialog, puts it back (the current file is backed up once more before the restore, so even a wrong restore can be undone).
|
|
206
|
+
- **Delegation stats**: the "Delegation" card in the header counts, per role, delegations, average duration, and failures (last 30 days, adjustable via `days`). The data is a cold read of the host session archive — summaries drawn per session through the host `sessionPersistence` service and aggregated locally; nothing leaves the machine and no payloads are read. A failure means the child session ran zero turns or was interrupted mid-turn (died right after spawn, or cut off). When the host lacks the session service the card simply doesn't render.
|
|
207
|
+
- **"More" menu**: config export (download the raw `dsh-paoding.config.yml`) / import (validated first; overwrites the whole file, workspaces included, with confirmation) / restore backup (see above) and the panel language toggle (English/Chinese auto-detected, manual choice wins and is remembered).
|
|
206
208
|
|
|
207
209
|
## 7. Uninstalling
|
|
208
210
|
|
|
209
|
-
|
|
211
|
+
One command first clears what dsh-paoding wrote into the host directory (the managed declaration block, the `orchestrator*` preset directories, the version marker; the config file is kept unless `--purge`; non-interactive terminals need `--yes`):
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
npx dsh-paoding@latest uninstall
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Then lift the package itself off the profile with three commands:Three commands, and it's gone cleanly:
|
|
210
218
|
|
|
211
219
|
```bash
|
|
212
220
|
dsh plugin --profile web remove dsh-paoding
|
package/docs/orchestration.md
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
dsh-paoding 把 DSH 从「单体 agent 全量加载工具」改造成「主 agent 编排 + 角色子 agent 分工」。分工遵循任务纹理:
|
|
11
11
|
|
|
12
12
|
- **热路径——内部文件问题不委派。** 找代码、查引用、读文件这类问题由主 agent 自己用只读工具解决:`glob` / `grep` / `read` / `read_image` / `bash` 全部在主 agent 白名单内,零委派往返延迟。persona 文案里的 `codegraph` 是 host MCP 工具,仅在安装期检测到 codegraph 服务器并经 `main_agent_extra` 注入后才真正可用(详见[配置](configuration.md)与[安装](installation.md))。
|
|
13
|
-
- **冷路径——只干自己那活的角色子 agent。** 外部调研委派 `search_external`(只带 `web_search` + tavily 五工具 + 本地只读)、UI/前端设计委派 `design`(读参考 + 设计技能 + 出 spec,不写最终代码)、代码实现委派 `implement`(读上下文 → 精准修改 → 验证)、超大仓库全量探索委派 `search_internal_deep`(第四角色,2026-09 加入,见下节与[架构](architecture.md))。每个子 agent 只在真正被委派的那一次才加载工具面(按需加载)。
|
|
13
|
+
- **冷路径——只干自己那活的角色子 agent。** 外部调研委派 `search_external`(只带 `web_search` / `web_fetch` + tavily 五工具 + 本地只读)、UI/前端设计委派 `design`(读参考 + 设计技能 + 出 spec,不写最终代码)、代码实现委派 `implement`(读上下文 → 精准修改 → 验证)、超大仓库全量探索委派 `search_internal_deep`(第四角色,2026-09 加入,见下节与[架构](architecture.md))。每个子 agent 只在真正被委派的那一次才加载工具面(按需加载)。
|
|
14
14
|
- **运行中指挥。** 子 agent 运行期间,主 agent 可用 `send_message` 追加指示、`list_agents` 查看状态、`interrupt_agent` 叫停(三者由 `dsh-tool-subagent-control` 注册,属「子 agent 管理」工具面)。
|
|
15
15
|
- **完成后只集成摘要。** 主 agent 从不把子 agent 的完整上下文倒进自己的上下文——它只收一份摘要(见第 5 节「上下文隔离」)。
|
|
16
16
|
|
|
@@ -22,7 +22,7 @@ dsh-paoding 把 DSH 从「单体 agent 全量加载工具」改造成「主 agen
|
|
|
22
22
|
| 子 agent 管理 | `send_message` / `list_agents` / `interrupt_agent` |
|
|
23
23
|
| 内部搜索(热路径) | `glob` / `grep` / `read` / `read_image` / `bash` |
|
|
24
24
|
| 协调 | `todo_write` / `ask_user_question` / `get_goal` / `create_goal` / `update_goal` / `exit_plan_mode` / `job_output` / `job_list` / `job_kill` |
|
|
25
|
-
| 主 agent 刻意看不到(节选,全文见 `restrict.mjs` 头注释) | `web_search`、`mcp__tavily__*`、`write` / `edit` / `str_replace_editor`、`skill`、`workflow`、`ralph`、`ssh_*`、`mcp__tablepro__*`、`describe_image`、裸 `subagent` / `subagent_fork` |
|
|
25
|
+
| 主 agent 刻意看不到(节选,全文见 `restrict.mjs` 头注释) | `web_search` / `web_fetch`、`mcp__tavily__*`、`write` / `edit` / `str_replace_editor`、`skill`、`workflow`、`ralph`、`ssh_*`、`mcp__tablepro__*`、`describe_image`、裸 `subagent` / `subagent_fork` |
|
|
26
26
|
|
|
27
27
|
每请求工具开销(估算,随注册面浮动):主 agent 全量 ~16.2k tokens → 白名单后 ~5.5k;`search_external` ~3.0k / `design` ~3.3k / `implement` ~3.8k,仅在真正委派时发生(数值来源:`agent.cordis.yml` 头部注释)。
|
|
28
28
|
|
package/docs/orchestration_en.md
CHANGED
|
@@ -10,7 +10,7 @@ Orchestration is the core of dsh-paoding: the main agent (the orchestrator) deco
|
|
|
10
10
|
dsh-paoding turns DSH from "a single agent that loads every tool" into "a main agent that orchestrates plus role agents that specialize". The split follows the texture of the task:
|
|
11
11
|
|
|
12
12
|
- **Hot path — internal file questions are never delegated.** Finding code, chasing references, and reading files are solved by the main agent itself with its read-only tools: `glob` / `grep` / `read` / `read_image` / `bash` are all on the main-agent allow list, so there is zero delegation round-trip latency. `codegraph` in the persona copy is a host MCP tool: it is only actually available when the install-time detection finds the codegraph server and it is injected through `main_agent_extra` (see [Configuration](configuration_en.md) and [Installation](installation_en.md)).
|
|
13
|
-
- **Cold path — role agents that carry only their own tools.** External research goes to `search_external` (only `web_search` + the five tavily tools + local reads); UI/frontend design goes to `design` (reads references, loads design skills, produces specs, never writes final code); code implementation goes to `implement` (read context → surgical change → verify); whole-repo deep exploration goes to `search_internal_deep` (a fourth role added 2026-09, see next section and [Architecture](architecture_en.md)). Each subagent is paid for only the run in which it is actually used (pay-per-use).
|
|
13
|
+
- **Cold path — role agents that carry only their own tools.** External research goes to `search_external` (only `web_search` / `web_fetch` + the five tavily tools + local reads); UI/frontend design goes to `design` (reads references, loads design skills, produces specs, never writes final code); code implementation goes to `implement` (read context → surgical change → verify); whole-repo deep exploration goes to `search_internal_deep` (a fourth role added 2026-09, see next section and [Architecture](architecture_en.md)). Each subagent is paid for only the run in which it is actually used (pay-per-use).
|
|
14
14
|
- **Directing a running child.** While a subagent runs, the main agent can append instructions with `send_message`, inspect status with `list_agents`, and stop it with `interrupt_agent` (all three are registered by `dsh-tool-subagent-control` and belong to the "child management" surface).
|
|
15
15
|
- **Integrate summaries only.** The main agent never dumps a child's full context into its own — it receives one summary (see section 5, Context isolation).
|
|
16
16
|
|
|
@@ -22,7 +22,7 @@ The main agent's model-facing surface is narrowed by `restrict.mjs` on the `syst
|
|
|
22
22
|
| Child management | `send_message` / `list_agents` / `interrupt_agent` |
|
|
23
23
|
| Internal search (hot path) | `glob` / `grep` / `read` / `read_image` / `bash` |
|
|
24
24
|
| Coordination | `todo_write` / `ask_user_question` / `get_goal` / `create_goal` / `update_goal` / `exit_plan_mode` / `job_output` / `job_list` / `job_kill` |
|
|
25
|
-
| Deliberately hidden from the main agent (excerpt; full list in the `restrict.mjs` header comment) | `web_search`, `mcp__tavily__*`, `write` / `edit` / `str_replace_editor`, `skill`, `workflow`, `ralph`, `ssh_*`, `mcp__tablepro__*`, `describe_image`, bare `subagent` / `subagent_fork` |
|
|
25
|
+
| Deliberately hidden from the main agent (excerpt; full list in the `restrict.mjs` header comment) | `web_search` / `web_fetch`, `mcp__tavily__*`, `write` / `edit` / `str_replace_editor`, `skill`, `workflow`, `ralph`, `ssh_*`, `mcp__tablepro__*`, `describe_image`, bare `subagent` / `subagent_fork` |
|
|
26
26
|
|
|
27
27
|
Per-request tool tax (estimates; they float with the registered surface): full monolithic main agent ~16.2k tokens → ~5.5k after the allow list; `search_external` ~3.0k / `design` ~3.3k / `implement` ~3.8k, incurred only when actually delegated (figures from the header comment of `agent.cordis.yml`).
|
|
28
28
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-paoding",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.6",
|
|
4
4
|
"description": "庖丁 — DSH (DeepSeek Harness) 编排模式安装器:host 感知的角色工具过滤 + Web 设置页可视化配置器",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
"cordis.patch.yml"
|
|
21
21
|
],
|
|
22
22
|
"engines": {
|
|
23
|
-
"node": ">=18"
|
|
23
|
+
"node": ">=18",
|
|
24
|
+
"dsh": ">=0.1.5 <0.3"
|
|
24
25
|
},
|
|
25
26
|
"peerDependencies": {
|
|
26
27
|
"@deepseek-ai/dsh": ">=0.1.5"
|