dsh-subagent-profile 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +16 -57
  2. package/README.zh.md +16 -57
  3. package/index.mjs +97 -122
  4. package/lib/client.js +631 -88
  5. package/lib/core/cleanup.mjs +33 -0
  6. package/lib/core/data-maintenance.mjs +139 -0
  7. package/lib/core/decision-trace.mjs +20 -1
  8. package/lib/core/delegation.mjs +16 -0
  9. package/lib/core/dispatch-gates.mjs +122 -9
  10. package/lib/core/dispatch-schema.mjs +45 -7
  11. package/lib/core/dispatch-tool.mjs +30 -46
  12. package/lib/core/evolution-advice.mjs +31 -10
  13. package/lib/core/evolution-assets.mjs +13 -0
  14. package/lib/core/evolution-canary.mjs +427 -0
  15. package/lib/core/evolution-draft.mjs +21 -0
  16. package/lib/core/evolution-engine.mjs +176 -31
  17. package/lib/core/evolution-generate.mjs +7 -23
  18. package/lib/core/evolution-lag.mjs +78 -0
  19. package/lib/core/evolution-ledger.mjs +4 -1
  20. package/lib/core/evolution-routes.mjs +157 -16
  21. package/lib/core/http-routes.mjs +22 -7
  22. package/lib/core/model-policy.mjs +104 -0
  23. package/lib/core/presets-sync.mjs +24 -2
  24. package/lib/core/profile-directory.mjs +17 -0
  25. package/lib/core/profile-provider.mjs +7 -2
  26. package/lib/core/profiles-query.mjs +178 -0
  27. package/lib/core/profiles-store.mjs +40 -6
  28. package/lib/core/pure.mjs +1 -1
  29. package/lib/core/reminder-store.mjs +37 -3
  30. package/lib/core/snapshots.mjs +148 -0
  31. package/package.json +2 -2
  32. package/presets/orchestrator-v2/NOTICE +7 -0
  33. package/presets/{orchestrator → orchestrator-v2}/agent.cordis.yml +78 -7
  34. package/presets/orchestrator-v2/custom-bash.mjs +213 -0
  35. package/presets/orchestrator-v2/preset.yml +2 -0
  36. package/presets/orchestrator-v2/tool-bootstrap.mjs +620 -0
  37. package/presets/orchestrator/preset.yml +0 -2
package/README.md CHANGED
@@ -19,13 +19,15 @@ For [DeepSeek Harness](https://github.com/deepseek-ai/dsh) (DSH).
19
19
 
20
20
  | | Built-in `subagent` | `dsh-subagent-profile` |
21
21
  |---|---|---|
22
- | Per-subtask model / preset | same brain for every subtask | ✅ pick per subtask |
22
+ | Per-subtask model / preset | optional `provider` / `model` / `reasoning_effort` (after enabling model selection) | ✅ one profile bundles preset + model + effort + tool scope + budget; overridable per call |
23
23
  | Reusable named setups | ❌ | ✅ profiles |
24
24
  | Tool-scope narrowing | ❌ | ✅ whitelist ∩ parent, `run_code` always removed |
25
25
  | Safety checks | ❌ | ✅ whitelist / cost / intersection / approval / budget, all recorded |
26
26
  | Cost visibility | ❌ | ✅ per-dispatch estimate + savings comparison |
27
- | Decision ledger | ❌ | ✅ full trace: request vs. effective, gates, execution, settlement |
27
+ | Decision ledger | ❌ | ✅ full trace: request vs. effective, checks, execution, settlement |
28
28
  | GUI management | ❌ | ✅ settings page + per-session ledger tab |
29
+ | Performance-based suggestions | ❌ | ✅ confirm to apply, undo anytime |
30
+ | Official model-selection interplay | ✅ enforced natively once enabled | ✅ dispatch follows the same whitelist (out-of-range routes are rejected) |
29
31
 
30
32
  ## Installation
31
33
 
@@ -34,7 +36,7 @@ dsh plugin --profile web add dsh-subagent-profile # published package
34
36
  dsh plugin --profile web add ./dsh-subagent-profile # from a local checkout
35
37
  ```
36
38
 
37
- Restart `dsh web`. This is a standard **bundle plugin**: it provides the `dispatch` tool, the profile provider, the `subagent-profiles` service, the `/subagent-profiles/*` loopback management routes, the settings page (「子 Agent 方案」), the per-session ledger tab, and the `dispatch` tool-call card in the web GUI. On startup it also **self-installs an agent preset** — **`orchestrator`** (「编排者模式」) — pick it in the new-session preset picker. The sync is idempotent and re-runs on every startup, so upgrading the plugin updates the preset.
39
+ Restart `dsh web`. This is a standard **bundle plugin**: it provides the `dispatch` tool, the profile provider, the `subagent-profiles` service, the `/subagent-profiles/*` loopback management routes, the settings page (「子 Agent 方案」), the per-session ledger tab, and the `dispatch` tool-call card in the web GUI. On startup it also **self-installs an agent preset** — **`orchestrator-v2`** (「编排者模式 V2」) — pick it in the new-session preset picker. The sync is idempotent and re-runs on every startup, so upgrading the plugin updates the preset.
38
40
 
39
41
  ## Usage
40
42
 
@@ -95,14 +97,16 @@ Delegation never lets a subagent gain more power than you already have — this
95
97
  - `summaries.json` — aggregated per-profile statistics (versioned, rebuilt on corruption).
96
98
  - `adopted-state.json` — adoption verdict state for child results (cross-restart).
97
99
  - `reminders.json` — reminder store (one reminder = one audit record).
98
- - `~/.dsh/.agent-presets/orchestrator/` — the self-installed `orchestrator` agent preset (synced from the bundled `presets/orchestrator/` on every startup).
100
+ - `~/.dsh/.agent-presets/orchestrator-v2/` — the self-installed `orchestrator-v2` agent preset (synced from the bundled `presets/orchestrator-v2/` on every startup).
99
101
 
100
- `DSH_HOME` is respected and defaults to `~/.dsh`. Uninstalling the plugin removes the data files above and the self-installed `orchestrator` preset directory (other plugins' presets are left untouched); re-installing or re-launching re-syncs the preset and regenerates the data files.
102
+ `DSH_HOME` is respected and defaults to `~/.dsh`. Uninstalling the plugin removes the data files above and the self-installed `orchestrator-v2` preset directory (other plugins' presets are left untouched); re-installing or re-launching re-syncs the preset and regenerates the data files.
101
103
 
102
104
  ## Known limitations
103
105
 
104
106
  - **Background dispatch** requires `@deepseek-ai/dsh-jobs` and `@deepseek-ai/dsh-tool-jobs` to be loaded; otherwise it fails with "dispatch: 后台派发不可用:缺少 jobs 服务".
105
107
  - **Continuable mode** goes through the DSH standard composition path, so the `preset` swap and `reasoningEffort` are ignored (the child inherits the parent preset at the default reasoning effort).
108
+ - **Continuable follow-ups** are delivered through the official `send_message` channel (the plugin drives the child via the official child handle).
109
+ - **Official model selection is a web-line feature**: the session policy for the built-in subagent tools ships with the web app and is not available in headless deployments. In production it is off by default and must be enabled before it takes effect.
106
110
  - **Who decides the child's final tool set depends on the mode**:
107
111
  - Continuable: narrowed by this plugin up front — the child's `allow` = (parent tool set − `run_code` − `deny`) ∩ `allow`. Assumption: continuable inherits the parent preset, so the child's tool set ≈ the parent's; if dsh's behavior changes so the two differ (e.g. a future preset swap composing a different tool set), tool narrowing fails with a hard error (conservatively safe — never silently granting more), to be replaced with a true parent ∩ child intersection once dsh provides an official seam.
108
112
  - One-shot: decided by dsh; the plugin cannot read the final restricted result and the card reports "tools are finally granted by the system".
@@ -112,58 +116,13 @@ Delegation never lets a subagent gain more power than you already have — this
112
116
 
113
117
  ```
114
118
  dsh-subagent-profile/
115
- ├── index.mjs # host side: the plugin itself (dispatch tool, profile provider, service, HTTP routes)
119
+ ├── index.mjs # plugin entry: dispatch tool, profile provider, services, HTTP routes
116
120
  ├── lib/
117
- │ ├── client.js # browser side: settings page + ledger + dispatch tool-call card
118
- │ └── core/ # host-side modules (lightweight layering)
119
- ├── pure.mjs # dependency-free pure functions (sanitize / prune / guard math — unit-tested)
120
- ├── shims.mjs # the single @deepseek-ai import facade (guards fail loud, helpers degrade softly)
121
- │ ├── catalog.mjs # tool-name → zh / category tables (zero-dep)
122
- │ ├── catalog-cache.mjs # process-shared catalog snapshot (models / presets / tools, TTL cache)
123
- │ ├── cost-guard.mjs # runtime capability checks (provider / model / reasoning effort)
124
- │ ├── cost-evidence.mjs # counterfactual savings evidence (token-saving proof)
125
- │ ├── prices.mjs # per-dispatch price table (average-based placeholder)
126
- │ ├── decision-trace.mjs # decision trace (checks / effective / settled) + failure ledger
127
- │ ├── delegation.mjs # background one-shot settling + child usage collection
128
- │ ├── dispatch-gates.mjs # pre-dispatch safety checks (whitelist / cost / intersection / budget)
129
- │ ├── dispatch-guard.mjs # concurrency + per-parent token budget guard
130
- │ ├── dispatch-schema.mjs # dispatch tool input/output schema declarations
131
- │ ├── dispatch-tool.mjs # dispatch tool factory (defineTool + execute + syncTool)
132
- │ ├── draft-gates.mjs # draft profile gates (three checks)
133
- │ ├── drafts-store.mjs # draft profile persistence
134
- │ ├── escape.mjs # escape-hatch allow store
135
- │ ├── evolution-ledger.mjs # decision ledger (jsonl) + governance audit
136
- │ ├── evolution-summary.mjs # aggregate statistics (per-profile, capability/budget axes)
137
- │ ├── evolution-advice.mjs # read-only dispatch suggestion generation
138
- │ ├── adoption-tracker.mjs # child-result adoption verdict tracking (cross-restart)
139
- │ ├── adoption-reminder.mjs # adoption-verdict reminder generation
140
- │ ├── reminder-store.mjs # reminder store + audit-coupled records
141
- │ ├── background-ledger.mjs # background job ledger (in-memory, resets on restart)
142
- │ ├── http-routes.mjs # settings loopback HTTP routes
143
- │ ├── intersection.mjs # tool-intersection pure core
144
- │ ├── presets-sync.mjs # bundled preset self-install (hash-gated sync)
145
- │ ├── profile-provider.mjs # the `profile` subagent provider
146
- │ ├── profile-directory.mjs # read-only profile directory (for the model)
147
- │ ├── profiles-store.mjs # profile registry store + switch persistence
148
- │ └── whitelist.mjs # system-trust preset whitelist
149
- ├── presets/orchestrator/ # bundled "orchestrator" agent preset (self-installed, synced on every startup)
150
- ├── cordis.patch.yml # bundle patch: inserts the plugin row into the host composition
151
- ├── .gitea/workflows/ci.yml # bare-CI (Gitea Actions; needs an Act runner on the server)
152
- ├── package.json # metadata, files whitelist, exports (test / test:bare / preflight scripts)
153
- ├── scripts/
154
- │ ├── preflight.mjs # preflight: preset-tree reconciliation + no hardcoded version badge (zero-dep)
155
- │ └── leak-scan.mjs # public-release gate: scans all history + worktree for sensitive patterns
156
- ├── docs/
157
- │ └── screenshots/ # README screenshots
158
- ├── test/ # host-side tests (node:test, zero extra deps; 438 cases)
159
- │ ├── README.md / README.zh.md # test directory guide (EN/ZH) — two-tier split explained
160
- │ ├── harness/ctx.mjs # fake Cordis ctx + ~/.dsh isolation
161
- │ ├── pure / input-schema / catalog-integrity.test.mjs # bare tier (import-free, runs in bare CI)
162
- │ └── *.test.mjs # junction tier (local only): characterization / facade / gating / persist / recycle /
163
- │ # cost-guard / continuable-guard / decision-trace / dispatch-guard / escape-hatch /
164
- │ # evolution-* / csrf / label-preset-sync / percall-spec / trust-label / audit-meta / …
165
- ├── README.md / README.zh.md # this document (EN/ZH)
166
- └── LICENSE
121
+ │ ├── client.js # browser side: settings page, per-session ledger, dispatch tool-call card
122
+ │ └── core/ # host-side modules by domain: gates, ledger, evolution, profiles, query, sync
123
+ ├── presets/ # bundled agent presets (e.g. orchestrator-v2)
124
+ ├── test/ # node:test suite (pure and junction tiers)
125
+ └── docs/ # screenshots
167
126
  ```
168
127
 
169
128
  ## Contributing
@@ -174,7 +133,7 @@ If this plugin has been useful to you, please give it a ⭐ on GitHub — it hel
174
133
 
175
134
  ## Credits
176
135
 
177
- The bundled `orchestrator` agent preset was inspired by [dsh-liangshen](https://github.com/zhu1090093659/dsh-web-ui/tree/main/packages/dsh-liangshen) (梁神模式) from [dsh-web-ui](https://github.com/zhu1090093659/dsh-web-ui), licensed under Apache-2.0. Thanks to its author for the great work.
136
+ The bundled `orchestrator-v2` agent preset was inspired by [dsh-liangshen](https://github.com/zhu1090093659/dsh-web-ui/tree/main/packages/dsh-liangshen) (梁神模式) from [dsh-web-ui](https://github.com/zhu1090093659/dsh-web-ui), licensed under Apache-2.0. Thanks to its author for the great work.
178
137
 
179
138
  ## License
180
139
 
package/README.zh.md CHANGED
@@ -19,13 +19,15 @@
19
19
 
20
20
  | | 内置 `subagent` | `dsh-subagent-profile` |
21
21
  |---|---|---|
22
- | 按子任务选模型/预设 | 每个子任务同一个「大脑」 | ✅ 按任务逐个指定 |
22
+ | 按子任务选模型/预设 | 可选 `provider` / `model` / `reasoning_effort`(需先启用模型选择) | ✅ 方案级 profile:预设+模型+推理强度+工具范围+预算一捆,per-call 可覆盖 |
23
23
  | 可复用的命名方案 | ❌ | ✅ 方案(profile) |
24
24
  | 工具范围收敛 | ❌ | ✅ 白名单 ∩ 父会话,`run_code` 恒移除 |
25
25
  | 派发前安全检查 | ❌ | ✅ 白名单/成本/交集/审批/预算,全程记录 |
26
26
  | 成本可见 | ❌ | ✅ 每次派发的成本估算 + 节省对照 |
27
- | 派发决策台账 | ❌ | ✅ 请求vs生效、检查结果、执行、结算全留痕 |
27
+ | 派发决策台账 | ❌ | ✅ 请求 vs 生效、检查结果、执行、结算全留痕 |
28
28
  | 界面管理 | ❌ | ✅ 设置页 + 会话内台账标签页 |
29
+ | 基于表现的改进建议 | ❌ | ✅ 确认后应用 · 随时撤销 |
30
+ | 官方模型选择联动 | ✅ 启用后由官方工具自身校验 | ✅ 官方启用后派发遵循同一白名单(越界路由直接拒绝) |
29
31
 
30
32
  ## 安装
31
33
 
@@ -34,7 +36,7 @@ dsh plugin --profile web add dsh-subagent-profile # 发布包
34
36
  dsh plugin --profile web add ./dsh-subagent-profile # 本地源码
35
37
  ```
36
38
 
37
- 重启 `dsh web`。这是一个标准的 **bundle 插件**:提供 `dispatch` 工具、方案提供者、`subagent-profiles` 服务、`/subagent-profiles/*` 回环管理路由、设置页(「子 Agent 方案」)、会话内派发决策台账标签页,以及 web 界面中的 `dispatch` 工具卡片。启动时还会**自动安装一个 agent 预设**——**`orchestrator`**(「编排者模式」)——在新会话的预设选择器里选用。同步是幂等的且每次启动重跑,升级插件即更新预设。
39
+ 重启 `dsh web`。这是一个标准的 **bundle 插件**:提供 `dispatch` 工具、方案提供者、`subagent-profiles` 服务、`/subagent-profiles/*` 回环管理路由、设置页(「子 Agent 方案」)、会话内派发决策台账标签页,以及 web 界面中的 `dispatch` 工具卡片。启动时还会**自动安装一个 agent 预设**——**`orchestrator-v2`**(「编排者模式 V2」)——在新会话的预设选择器里选用。同步是幂等的且每次启动重跑,升级插件即更新预设。
38
40
 
39
41
  ## 使用
40
42
 
@@ -95,14 +97,16 @@ dispatch(
95
97
  - `summaries.json` —— 按方案聚合的统计(带版本号,损坏自动重建)。
96
98
  - `adopted-state.json` —— 子结果采纳判定状态(跨重启)。
97
99
  - `reminders.json` —— 提醒存储(一条提醒 = 一条审计记录)。
98
- - `~/.dsh/.agent-presets/orchestrator/` —— 自动安装的 `orchestrator` 预设(每次启动从内置 `presets/orchestrator/` 同步)。
100
+ - `~/.dsh/.agent-presets/orchestrator-v2/` —— 自动安装的 `orchestrator-v2` 预设(每次启动从内置 `presets/orchestrator-v2/` 同步)。
99
101
 
100
- 尊重 `DSH_HOME` 环境变量(默认 `~/.dsh`)。卸载插件会移除上述数据文件与自动安装的 `orchestrator` 预设目录(其他插件的预设不动);重装或重启会重新同步预设并重建数据文件。
102
+ 尊重 `DSH_HOME` 环境变量(默认 `~/.dsh`)。卸载插件会移除上述数据文件与自动安装的 `orchestrator-v2` 预设目录(其他插件的预设不动);重装或重启会重新同步预设并重建数据文件。
101
103
 
102
104
  ## 已知限制
103
105
 
104
106
  - **后台派发**需要 `@deepseek-ai/dsh-jobs` 与 `@deepseek-ai/dsh-tool-jobs` 已加载;否则报「dispatch: 后台派发不可用:缺少 jobs 服务」。
105
107
  - **持久(continuable)模式**走 DSH 标准组合路径,`preset` 换用与 `reasoningEffort` 会被忽略(子代理继承父预设与默认推理强度)。
108
+ - **持久模式的后续轮次走官方 `send_message`**(插件通过官方子代理句柄驱动后续对话)。
109
+ - **官方模型选择是 web 线功能**:内置 subagent 工具的会话策略随 web 应用提供,headless 部署没有;生产默认未启用,需手动开启后才会生效。
106
110
  - **子代理的最终工具集由谁决定,取决于模式**:
107
111
  - 持久(continuable)模式:由本插件预先收敛——子代理 `allow` =(父工具集 − `run_code` − `deny`)∩ `allow`。前提假设:持久模式沿用父会话预设,故子工具集与父会话基本一致;一旦 dsh 的行为变化导致两者不同(如未来支持预设换用后组合出不同工具集),工具收敛会**直接报错拒绝**(保守安全,绝不静默放行),待 dsh 官方提供相应接口后替换为真正的父 ∩ 子交集。
108
112
  - 一次性模式:由 dsh 决定,插件读不到最终受限结果;卡片显示「工具由系统最终授予」。
@@ -112,58 +116,13 @@ dispatch(
112
116
 
113
117
  ```
114
118
  dsh-subagent-profile/
115
- ├── index.mjs # 宿主侧:插件本体(dispatch 工具、方案提供者、服务、HTTP 路由)
119
+ ├── index.mjs # 插件入口:dispatch 工具、方案提供方、服务与 HTTP 路由
116
120
  ├── lib/
117
- │ ├── client.js # 浏览器侧:设置页 + 台账 + dispatch 工具卡片
118
- │ └── core/ # 宿主侧模块(轻量分层)
119
- ├── pure.mjs # 零依赖纯函数(清洗/剪枝/护栏数学——单测覆盖)
120
- ├── shims.mjs # 唯一的 @deepseek-ai 导入门面(护栏大声失败,辅助软降级)
121
- │ ├── catalog.mjs # 工具名 → 中文/分类表(零依赖)
122
- │ ├── catalog-cache.mjs # 进程共享目录快照(模型/预设/工具,TTL 缓存)
123
- │ ├── cost-guard.mjs # 运行时能力检查(提供方/模型/推理强度)
124
- │ ├── cost-evidence.mjs # 省 token 反事实对照证据
125
- │ ├── prices.mjs # 每次派发单价表(当前为均价占位)
126
- │ ├── decision-trace.mjs # 决策轨迹(检查/生效/结算)+ 失败台账
127
- │ ├── delegation.mjs # 后台一次性结算 + 子用量采集
128
- │ ├── dispatch-gates.mjs # 派发前安全检查(白名单/成本/交集/预算)
129
- │ ├── dispatch-guard.mjs # 并发 + 每父会话 token 预算护栏
130
- │ ├── dispatch-schema.mjs # dispatch 工具输入/输出 schema 声明
131
- │ ├── dispatch-tool.mjs # dispatch 工具工厂(defineTool + execute + syncTool)
132
- │ ├── draft-gates.mjs # 草稿方案三道闸
133
- │ ├── drafts-store.mjs # 草稿方案持久化
134
- │ ├── escape.mjs # 逃生舱放行存储
135
- │ ├── evolution-ledger.mjs # 派发决策台账(jsonl)+ 治理审计
136
- │ ├── evolution-summary.mjs # 聚合统计(按方案,能力/预算双轴)
137
- │ ├── evolution-advice.mjs # 只读派发建议生成
138
- │ ├── adoption-tracker.mjs # 子结果采纳判定跟踪(跨重启)
139
- │ ├── adoption-reminder.mjs # 采纳判定提醒生成
140
- │ ├── reminder-store.mjs # 提醒存储 + 审计耦合记录
141
- │ ├── background-ledger.mjs # 后台任务台账(内存态,重启即失)
142
- │ ├── http-routes.mjs # 设置回环 HTTP 路由
143
- │ ├── intersection.mjs # 工具交集纯核心
144
- │ ├── presets-sync.mjs # 内置预设自动安装(哈希门控同步)
145
- │ ├── profile-provider.mjs # `profile` 子代理提供者
146
- │ ├── profile-directory.mjs # 只读方案目录(供模型参考)
147
- │ ├── profiles-store.mjs # 方案注册表存储 + 开关持久化
148
- │ └── whitelist.mjs # system-trust 预设白名单
149
- ├── presets/orchestrator/ # 内置「orchestrator」预设(自动安装,每次启动同步)
150
- ├── cordis.patch.yml # bundle patch:把插件行插入宿主组合
151
- ├── .gitea/workflows/ci.yml # bare-CI(Gitea Actions;需服务器上的 Act runner)
152
- ├── package.json # 元数据、files 白名单、exports(test / test:bare / preflight 脚本)
153
- ├── scripts/
154
- │ ├── preflight.mjs # 预检:预设树一致 + 无硬编码版本徽章(零依赖)
155
- │ └── leak-scan.mjs # 公开发布门:扫描全历史与工作区的敏感模式
156
- ├── docs/
157
- │ └── screenshots/ # README 截图
158
- ├── test/ # 宿主侧测试(node:test,零额外依赖;438 用例)
159
- │ ├── README.md / README.zh.md # 测试目录指南(中英)——两层拆分说明
160
- │ ├── harness/ctx.mjs # 假 Cordis ctx + ~/.dsh 隔离
161
- │ ├── pure / input-schema / catalog-integrity.test.mjs # bare 层(免导入,bare CI 可跑)
162
- │ └── *.test.mjs # junction 层(仅本地):characterization / facade / gating / persist / recycle /
163
- │ # cost-guard / continuable-guard / decision-trace / dispatch-guard / escape-hatch /
164
- │ # evolution-* / csrf / label-preset-sync / percall-spec / trust-label / audit-meta / …
165
- ├── README.md / README.zh.md # 本文档(英/中)
166
- └── LICENSE
121
+ │ ├── client.js # 浏览器端:设置页、每会话台账、派发工具调用卡片
122
+ │ └── core/ # 宿主端核心模块(按域:闸门、台账、自进化、方案、查询、同步)
123
+ ├── presets/ # 内置 Agent 预设(如 orchestrator-v2)
124
+ ├── test/ # node:test 测试套件(纯函数层 + 接线层)
125
+ └── docs/ # 截图
167
126
  ```
168
127
 
169
128
  ## 贡献
@@ -174,7 +133,7 @@ dsh-subagent-profile/
174
133
 
175
134
  ## 致谢
176
135
 
177
- 内置的 `orchestrator` 预设灵感来自 [dsh-web-ui](https://github.com/zhu1090093659/dsh-web-ui) 的 [dsh-liangshen](https://github.com/zhu1090093659/dsh-web-ui/tree/main/packages/dsh-liangshen)(梁神模式),Apache-2.0 许可。感谢作者。
136
+ 内置的 `orchestrator-v2` 预设灵感来自 [dsh-web-ui](https://github.com/zhu1090093659/dsh-web-ui) 的 [dsh-liangshen](https://github.com/zhu1090093659/dsh-web-ui/tree/main/packages/dsh-liangshen)(梁神模式),Apache-2.0 许可。感谢作者。
178
137
 
179
138
  ## 许可
180
139