@eddyskywalker/dsh-chatgpt-subscription 0.24.0 → 0.24.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.
- package/CHANGELOG.md +12 -0
- package/README.md +1 -1
- package/lib/index.js +270 -110
- package/lib/types/host/agent-preset.d.ts.map +1 -1
- package/lib/types/host/subagent-model-authorization.d.ts +72 -3
- package/lib/types/host/subagent-model-authorization.d.ts.map +1 -1
- package/package.json +1 -1
- package/presets/dispatch/README.md +3 -2
- package/presets/dispatch/agent.cordis.yml +124 -129
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.24.1 - 2026-10-14
|
|
6
|
+
- **[调度模式 & 子代理授权守卫] 插件端机制级修复模型调用 `list_subagent_models` 后仍疯狂翻找本地文件定义的问题,并全面优化预设提示词(现场会话 `session-01724ca8`)**
|
|
7
|
+
- **现象**:主模型在启动阶段已调用 `list_subagent_models`,但因无参调用 `list_subagent_models({})` 只返回 provider 摘要,或看到上游工具描述写着 `"Catalog membership is advisory"` / `"Child LLM selection is optional..."`,不敢直接采信返回值,紧接着连续 9 个回合在工作区 grep `subagentModelAuthorization`、读取源码、递归扫描 `~/.dsh`(触发 120s 命令超时)并翻看 `settings.json` / `cordis.patch.yml` 以寻找「真正的允许清单定义」。
|
|
8
|
+
- **插件端机制级修复(`src/host/subagent-model-authorization.ts`,零修改上游 DSH)**:
|
|
9
|
+
1. **`tools/post-execute` 输出增强(`enrichListSubagentModelsOutput`)**:当会话开启子代理模型授权守卫且允许清单生效时,拦截成功的 `list_subagent_models` 调用(含 PTC `run_code` 内调用),在原始输出末尾直接附上本会话全部已授权的 `{ provider, model }` 拆解对(`- <provider>/<model> -> provider: "<provider>", model: "<model>"`),使模型哪怕只调一次无参 `list_subagent_models({})` 也能一步拿到完整授权路由与精确传参字段。
|
|
10
|
+
2. **`system-prompt/assemble` 工具描述原位重写(`rewriteAuthorizedPromptAssembly`)**:当会话受允许清单管控时,在系统提示组装阶段原位改写 PTC 模式的 `tools:sdk` section 与 Native 模式的 `assembly.tools` 中 `list_subagent_models` 的 `"Catalog membership is advisory..."` 及 `subagent` 的 `"Child LLM selection is optional..."` 误导描述,直接替换为本会话的强制显式选模型要求与已授权路由清单,从源头消除工具 schema 与守卫规则的冲突。
|
|
11
|
+
- **预设提示词全面优化并统一为英文(`src/host/agent-preset.ts` 与 `presets/dispatch/agent.cordis.yml` 逐字节同步)**:
|
|
12
|
+
1. **全英文统一与执行主线对齐**:将 `persona.config.prefix` 与 `plan-mode.config.section` 统一为高信噪比英文指令(与 DSH 工具签名及运行时系统提示词语言保持一致);在顶部新增 `[Execution Pipeline]` 速查流水线,并将 `## R0.5 · Compatibility Gate` 调整至 `## R0 · Complexity Triage` 之前,使阅读顺序与实际执行顺序完全一致。
|
|
13
|
+
2. **消除 `G4` 与 `R2` 的张力**:在 `R-G` 的 `G4` 中明确补注本会话允许的子代理模型路由由 `list_subagent_models` 直接提供而非仓库文件,防止模型把「查仓库事实」泛化到搜本地允许清单。
|
|
14
|
+
3. **重写 `R2 · Model Routing`**:明确允许清单的唯一真源是 `list_subagent_models`(无参调用末尾已直接附上完整 `provider/model` 拆解清单),直接采信其输出而无需去翻本地配置文件或工作区代码交叉核对(避免硬性禁读文件影响正常的配置/源码任务),移除诱发 grep 的内部符号名 `subagentModelAuthorization`,并新增 Anti-Pattern 第 16 条。
|
|
15
|
+
4. **精简重写 `plan-mode.config.section`**:消除了原本与 `R-G` 大段重复的冗余段落,收敛为与 `R0 / R-G / R2` 紧密衔接的英文四段式规则(`[Plan Mode]`、`[Read-Only Exploration & Clarification Interview]`、`[Plan Completeness]`、`[Plan Approval]`),并在只读探查段同步指明直接使用 `list_subagent_models` 返回的路由。
|
|
16
|
+
|
|
5
17
|
## 0.24.0 - 2026-10-14
|
|
6
18
|
- **[Antigravity] 新增 Gemini 4 Argon(`gemini-4-argon`)并同步官方 2.23.0 客户端版本标识(2026-10-14 线上实测)**
|
|
7
19
|
- **版本门控(User-Agent)**:实测确认 `/v1internal:fetchAvailableModels` 对 `User-Agent` 版本存在门控——旧 `2.8.0` (`cl=963137146`) 仅下发 26 个模型且默认模型停留在 `gemini-3.8-flash-high`;升级为官方最新客户端 `2.23.0` (`cl=998057262`) 后服务端下发 29 个模型(新增 `gemini-4-argon-low` / `-medium` / `-high`),并将 `defaultAgentModelId` 切至 `gemini-4-argon-medium`。同步更新 `DEFAULT_ANTIGRAVITY_VERSION = '2.23.0'` 与 `DEFAULT_ANTIGRAVITY_CL = '998057262'`。
|
package/README.md
CHANGED
|
@@ -491,7 +491,7 @@ DSH 的 Agent Teams(bundle `@deepseek-ai/dsh-experimental-agent-team-profile`
|
|
|
491
491
|
| 任务开始建目标 | 除非用户明确要求,否则**不调用 `create_goal` / `/goal`**,任务清单一律走 `todo_write` | 机制性的:目标一旦激活,DSH 会自动续跑唤醒主代理,而子代理何时返回不由它控制——等待被从中间劈开,模型重新分诊、重新检查「还差什么」,每次续跑还要重载整段历史 |
|
|
492
492
|
| 需要用户拍板 | 一切「我停在这里是因为缺一个决定」的停点(收到子代理结果要选下一步、验收不过要定返工范围、前提被推翻要改计划)都用 `ask_user_question` 递出去,并给出选项与推荐答案 | 提问是代理的工具,不是用户的义务:否则用户得先替模型把那段话翻译成一次输入。例外是 plan mode 的计划审批(走 `exit_plan_mode`)与任务完成后的收尾 |
|
|
493
493
|
|
|
494
|
-
三条各自对应 persona 反模式列表里的第 13–15
|
|
494
|
+
三条各自对应 persona 反模式列表里的第 13–15 条。此外,本插件在运行时通过 `system-prompt/assemble` 原位重写 `list_subagent_models` 与 `subagent` 工具描述中的 `"Catalog membership is advisory"` / `"Child LLM selection is optional..."` 误导措辞,并通过 `tools/post-execute` 在每次 `list_subagent_models` 返回末尾直接附上本会话全部已授权的 `{ provider, model }` 拆解对;`R2` 与 `plan-mode` 提示词也同步写明 `list_subagent_models` 是本会话允许清单的**唯一真源**,直接采信其输出即可,无需仅为了确认哪些子代理模型可用去翻找本地配置文件或工作区代码(对应 Anti-Pattern 第 16 条)。
|
|
495
495
|
|
|
496
496
|
### 为什么不降级:teammate 不能选模型
|
|
497
497
|
|
package/lib/index.js
CHANGED
|
@@ -57540,6 +57540,129 @@ function delegationModeOf(policies, toolName) {
|
|
|
57540
57540
|
for (const policy of policies) if (policy.name === toolName) return policy.mode;
|
|
57541
57541
|
}
|
|
57542
57542
|
/**
|
|
57543
|
+
* Resolve the effective allowlist that governs delegations from this agent:
|
|
57544
|
+
* empty when the Host preference explicitly disables enforcement, otherwise
|
|
57545
|
+
* the Session's (or nearest subagent ancestor's) recorded policy, falling
|
|
57546
|
+
* back to the live preference only under `preference` scope.
|
|
57547
|
+
* @param agent - Calling agent.
|
|
57548
|
+
* @param preference - Current Host preference, when the settings service exists.
|
|
57549
|
+
* @param sessions - Session registry used for ancestor lookup.
|
|
57550
|
+
* @param scope - Whether an unrecorded Session falls back to the preference.
|
|
57551
|
+
* @returns the authorized routes in force for this agent, or an empty list when unrestricted.
|
|
57552
|
+
*/
|
|
57553
|
+
function effectiveAllowedRoutes(agent, preference, sessions, scope = "session") {
|
|
57554
|
+
if (preference !== void 0 && !preference.enabled) return [];
|
|
57555
|
+
return authorizedRoutesFor(agent, sessions) ?? (scope === "preference" ? preference?.allowedModels ?? [] : []);
|
|
57556
|
+
}
|
|
57557
|
+
/**
|
|
57558
|
+
* Append the Session's authorized `{ provider, model }` pairs to a successful
|
|
57559
|
+
* `list_subagent_models` result when the calling Session is governed by an
|
|
57560
|
+
* allowlist.
|
|
57561
|
+
*
|
|
57562
|
+
* Calling `list_subagent_models({})` upstream returns only provider names
|
|
57563
|
+
* (`minimax-code — MiniMax Code`), and calling it with `provider` prints
|
|
57564
|
+
* `<provider>/<model>` without stating that the output is already filtered to
|
|
57565
|
+
* the Session allowlist. Appending the exact split `{ provider, model }` pairs
|
|
57566
|
+
* here lets even a single `list_subagent_models({})` call hand the model every
|
|
57567
|
+
* authorized route in the form `subagent` expects, eliminating any reason to
|
|
57568
|
+
* search local config files or source code for the allowlist.
|
|
57569
|
+
* @param output - Original text returned by `list_subagent_models`.
|
|
57570
|
+
* @param allowed - Routes the calling Session authorizes.
|
|
57571
|
+
* @returns the output with the Session allowlist summary appended.
|
|
57572
|
+
*/
|
|
57573
|
+
function enrichListSubagentModelsOutput(output, allowed) {
|
|
57574
|
+
if (allowed.length === 0) return output;
|
|
57575
|
+
const header = "Authorized child routes for this Session (already filtered by the Session allowlist; only these routes are accepted, and `provider` and `model` must be passed as separate fields):";
|
|
57576
|
+
if (output.includes(header)) return output;
|
|
57577
|
+
const suffix = `${header}\n${allowed.map((route) => `- ${route.provider}/${route.model} -> provider: "${route.provider}", model: "${route.model}"`).join("\n")}`;
|
|
57578
|
+
return output.trim().length === 0 ? suffix : `${output}\n\n${suffix}`;
|
|
57579
|
+
}
|
|
57580
|
+
/**
|
|
57581
|
+
* Rewrite the upstream `list_subagent_models` and `subagent` tool/parameter
|
|
57582
|
+
* descriptions when the calling Session enforces an allowlist.
|
|
57583
|
+
*
|
|
57584
|
+
* Upstream `dsh-tool-subagent` ships static descriptions stating that
|
|
57585
|
+
* `"Catalog membership is advisory: an adapter may accept an unlisted model id."`
|
|
57586
|
+
* and `"Child LLM selection is optional. Omit provider, model, and reasoning_effort..."`.
|
|
57587
|
+
* In an allowlist-governed Session both statements are false and actively
|
|
57588
|
+
* mislead the dispatcher into either omitting `provider`/`model` or distrusting
|
|
57589
|
+
* `list_subagent_models` and hunting through local files for the "real" allowlist.
|
|
57590
|
+
* @param text - Tool description, parameter description, or rendered `tools:sdk` section text.
|
|
57591
|
+
* @param allowed - Routes the calling Session authorizes.
|
|
57592
|
+
* @returns the text with the misleading upstream sentences replaced by the Session's exact policy.
|
|
57593
|
+
*/
|
|
57594
|
+
function rewriteAuthorizedToolDescriptions(text, allowed) {
|
|
57595
|
+
if (allowed.length === 0 || text.length === 0) return text;
|
|
57596
|
+
const routes = authorizedRoutesText(allowed);
|
|
57597
|
+
return text.replaceAll("Catalog membership is advisory: an adapter may accept an unlisted model id.", `Output is already filtered to this Session's allowlist (${routes}); only these authorized provider/model routes are accepted.`).replace(/Child LLM selection is optional\.\s*Omit `?provider`?, `?model`?, and `?reasoning_effort`? to use configured child defaults and (?:inherit compatible missing values from the parent Agent|this provider's route defaults)\./g, `Child LLM selection is required in this Session: pass an authorized \`provider\` and \`model\` from \`list_subagent_models\` (${routes}) as separate fields; omitting either field is rejected.`).replace(/Supply together with model; omit both to use configured child defaults or (?:inherit the parent route|this provider's route defaults)\.|Omit to use the configured child default or inherit from the parent Agent\./g, `Required in this Session: pass an authorized provider id from list_subagent_models (${routes}).`).replace(/Supply together with provider; omit both to use configured child defaults or (?:inherit the parent route|this provider's route defaults)\.|Omit to use the configured child default or inherit when the child provider matches the parent provider\./g, "Required in this Session: pass the authorized model id (without the provider/ prefix) for the selected provider.");
|
|
57598
|
+
}
|
|
57599
|
+
/**
|
|
57600
|
+
* Rewrite one assembled prompt's `tools:sdk` section and native tool schemas
|
|
57601
|
+
* when the target Agent's Session enforces a subagent model allowlist.
|
|
57602
|
+
* @param assembly - Assembled prompt from `system-prompt/assemble`.
|
|
57603
|
+
* @param allowed - Routes the calling Session authorizes.
|
|
57604
|
+
* @param toolNames - Explicit-route delegation tool names.
|
|
57605
|
+
* @returns the updated assembly, or the original object when nothing changed.
|
|
57606
|
+
*/
|
|
57607
|
+
function rewriteAuthorizedPromptAssembly(assembly, allowed, toolNames = DEFAULT_DELEGATION_TOOLS) {
|
|
57608
|
+
if (allowed.length === 0) return assembly;
|
|
57609
|
+
let sectionsChanged = false;
|
|
57610
|
+
const sections = Array.isArray(assembly.sections) ? assembly.sections.map((section) => {
|
|
57611
|
+
if (section?.name !== "tools:sdk" || typeof section.text !== "string") return section;
|
|
57612
|
+
const rewritten = rewriteAuthorizedToolDescriptions(section.text, allowed);
|
|
57613
|
+
if (rewritten === section.text) return section;
|
|
57614
|
+
sectionsChanged = true;
|
|
57615
|
+
return {
|
|
57616
|
+
...section,
|
|
57617
|
+
text: rewritten
|
|
57618
|
+
};
|
|
57619
|
+
}) : assembly.sections;
|
|
57620
|
+
let toolsChanged = false;
|
|
57621
|
+
const tools = Array.isArray(assembly.tools) ? assembly.tools.map((tool) => {
|
|
57622
|
+
const name = asString$1(tool?.name);
|
|
57623
|
+
if (name === void 0 || name !== "list_subagent_models" && !toolNames.includes(name)) return tool;
|
|
57624
|
+
const description = typeof tool.description === "string" ? rewriteAuthorizedToolDescriptions(tool.description, allowed) : tool.description;
|
|
57625
|
+
let params = tool.parameters;
|
|
57626
|
+
const paramsRecord = asRecord$1(params);
|
|
57627
|
+
const propsRecord = asRecord$1(paramsRecord?.["properties"]);
|
|
57628
|
+
if (paramsRecord !== void 0 && propsRecord !== void 0) {
|
|
57629
|
+
let propsMutated = false;
|
|
57630
|
+
const nextProps = { ...propsRecord };
|
|
57631
|
+
for (const field of ["provider", "model"]) {
|
|
57632
|
+
const prop = asRecord$1(propsRecord[field]);
|
|
57633
|
+
const propDesc = asString$1(prop?.["description"]);
|
|
57634
|
+
if (prop !== void 0 && propDesc !== void 0) {
|
|
57635
|
+
const nextDesc = rewriteAuthorizedToolDescriptions(propDesc, allowed);
|
|
57636
|
+
if (nextDesc !== propDesc) {
|
|
57637
|
+
nextProps[field] = {
|
|
57638
|
+
...prop,
|
|
57639
|
+
description: nextDesc
|
|
57640
|
+
};
|
|
57641
|
+
propsMutated = true;
|
|
57642
|
+
}
|
|
57643
|
+
}
|
|
57644
|
+
}
|
|
57645
|
+
if (propsMutated) params = {
|
|
57646
|
+
...paramsRecord,
|
|
57647
|
+
properties: nextProps
|
|
57648
|
+
};
|
|
57649
|
+
}
|
|
57650
|
+
if (description === tool.description && params === tool.parameters) return tool;
|
|
57651
|
+
toolsChanged = true;
|
|
57652
|
+
return {
|
|
57653
|
+
...tool,
|
|
57654
|
+
...description !== tool.description ? { description } : {},
|
|
57655
|
+
...params !== tool.parameters ? { parameters: params } : {}
|
|
57656
|
+
};
|
|
57657
|
+
}) : assembly.tools;
|
|
57658
|
+
if (!sectionsChanged && !toolsChanged) return assembly;
|
|
57659
|
+
return {
|
|
57660
|
+
...assembly,
|
|
57661
|
+
...sectionsChanged ? { sections } : {},
|
|
57662
|
+
...toolsChanged ? { tools } : {}
|
|
57663
|
+
};
|
|
57664
|
+
}
|
|
57665
|
+
/**
|
|
57543
57666
|
* Decide whether one delegation call may start its child.
|
|
57544
57667
|
* @param agent - Calling agent.
|
|
57545
57668
|
* @param toolName - Tool being dispatched.
|
|
@@ -57560,8 +57683,7 @@ function delegationDenialReason(agent, toolName, args, preference, sessions, too
|
|
|
57560
57683
|
mode: "inherit"
|
|
57561
57684
|
}))], toolName);
|
|
57562
57685
|
if (mode === void 0) return void 0;
|
|
57563
|
-
|
|
57564
|
-
const allowed = authorizedRoutesFor(agent, sessions) ?? (scope === "preference" ? preference?.allowedModels ?? [] : []);
|
|
57686
|
+
const allowed = effectiveAllowedRoutes(agent, preference, sessions, scope);
|
|
57565
57687
|
if (allowed.length === 0) return void 0;
|
|
57566
57688
|
const request = asRecord$1(args) ?? {};
|
|
57567
57689
|
const requestedProvider = asString$1(request["provider"]);
|
|
@@ -57628,11 +57750,14 @@ function validateDelegationToolNames(toolNames) {
|
|
|
57628
57750
|
return [...toolNames];
|
|
57629
57751
|
}
|
|
57630
57752
|
/**
|
|
57631
|
-
* Register the monotonic guard on the Host tool registry
|
|
57632
|
-
*
|
|
57753
|
+
* Register the monotonic guard on the Host tool registry, and — when the Host
|
|
57754
|
+
* context exposes Cordis events — enrich `list_subagent_models` output with the
|
|
57755
|
+
* Session's split `{ provider, model }` routes and rewrite the misleading
|
|
57756
|
+
* upstream optional/advisory wording in assembled prompts.
|
|
57757
|
+
* @param ctx - Host context carrying `tools` (and optionally `settings` / `on`).
|
|
57633
57758
|
* @param sessions - Session registry used for ancestor lookup.
|
|
57634
57759
|
* @param config - Enforcement toggle and delegation tool names.
|
|
57635
|
-
* @returns the exact disposer that unregisters the guard.
|
|
57760
|
+
* @returns the exact disposer that unregisters the guard and listeners.
|
|
57636
57761
|
*/
|
|
57637
57762
|
function installSubagentModelAuthorization(ctx, sessions, config = {}) {
|
|
57638
57763
|
const toolNames = validateDelegationToolNames(config.toolNames ?? [...DEFAULT_DELEGATION_TOOLS]);
|
|
@@ -57647,7 +57772,47 @@ function installSubagentModelAuthorization(ctx, sessions, config = {}) {
|
|
|
57647
57772
|
inheritToolNames,
|
|
57648
57773
|
scope
|
|
57649
57774
|
});
|
|
57650
|
-
|
|
57775
|
+
const disposeGuard = ctx.tools.guard((exec) => authorize(exec.agent, exec.name, exec.arguments));
|
|
57776
|
+
const eventHost = ctx;
|
|
57777
|
+
const disposePostExecute = eventHost.on?.("tools/post-execute", async (exec, result, next) => {
|
|
57778
|
+
const decision = await next();
|
|
57779
|
+
if (exec.name !== "list_subagent_models" || result.isError === true || decision?.kind !== "accept") return decision;
|
|
57780
|
+
const allowed = effectiveAllowedRoutes(exec.agent, subagentModelSelectionPreference(settings), sessions, scope);
|
|
57781
|
+
if (allowed.length === 0) return decision;
|
|
57782
|
+
const currentValue = decision.value !== void 0 ? decision.value : result.value;
|
|
57783
|
+
if (typeof currentValue === "string") {
|
|
57784
|
+
const enriched = enrichListSubagentModelsOutput(currentValue, allowed);
|
|
57785
|
+
if (enriched === currentValue) return decision;
|
|
57786
|
+
return {
|
|
57787
|
+
kind: "accept",
|
|
57788
|
+
value: enriched,
|
|
57789
|
+
...decision.additionalContexts !== void 0 ? { additionalContexts: decision.additionalContexts } : {}
|
|
57790
|
+
};
|
|
57791
|
+
}
|
|
57792
|
+
const currentContent = decision.content ?? result.content;
|
|
57793
|
+
const firstBlock = Array.isArray(currentContent) ? currentContent[0] : void 0;
|
|
57794
|
+
if (firstBlock?.type === "text" && typeof firstBlock.text === "string") {
|
|
57795
|
+
const enriched = enrichListSubagentModelsOutput(firstBlock.text, allowed);
|
|
57796
|
+
if (enriched === firstBlock.text) return decision;
|
|
57797
|
+
return {
|
|
57798
|
+
kind: "accept",
|
|
57799
|
+
content: [{
|
|
57800
|
+
type: "text",
|
|
57801
|
+
text: enriched
|
|
57802
|
+
}, ...currentContent.slice(1)],
|
|
57803
|
+
...decision.additionalContexts !== void 0 ? { additionalContexts: decision.additionalContexts } : {}
|
|
57804
|
+
};
|
|
57805
|
+
}
|
|
57806
|
+
return decision;
|
|
57807
|
+
});
|
|
57808
|
+
const disposeAssemble = eventHost.on?.("system-prompt/assemble", async (_assembly, context, next) => {
|
|
57809
|
+
return rewriteAuthorizedPromptAssembly(await next(), effectiveAllowedRoutes(context?.agent ?? context?.scope, subagentModelSelectionPreference(settings), sessions, scope), toolNames);
|
|
57810
|
+
});
|
|
57811
|
+
return () => {
|
|
57812
|
+
disposeGuard();
|
|
57813
|
+
disposePostExecute?.();
|
|
57814
|
+
disposeAssemble?.();
|
|
57815
|
+
};
|
|
57651
57816
|
}
|
|
57652
57817
|
/**
|
|
57653
57818
|
* Validate the configured authorization scope.
|
|
@@ -58170,125 +58335,126 @@ const DISPATCH_PRESET = {
|
|
|
58170
58335
|
name: "@deepseek-ai/dsh-persona",
|
|
58171
58336
|
config: {
|
|
58172
58337
|
suffix: "Your working directory is {{cwd}}.",
|
|
58173
|
-
prefix:
|
|
58338
|
+
prefix: `You are powered by {{model}}. Your working directory is {{cwd}}.
|
|
58174
58339
|
|
|
58175
|
-
|
|
58340
|
+
[Role Identification] If your first user message is a task brief (rather than a direct request from the human user), you are a subagent: the coordinator-facing rules in R0, R0.5, R-G, R1, R2, R4, R5, and R-W do not apply to you. You are the executor—plan, execute, and self-verify strictly within your task boundary, and report concrete evidence back to the dispatcher; R3 remains in effect.
|
|
58176
58341
|
|
|
58177
|
-
|
|
58342
|
+
[Coordinator Identity] You are the Dispatch Agent for this session. Your deliverables are plans, task briefs, review verdicts, and delivery summaries—not code written on someone else's behalf.
|
|
58343
|
+
[Execution Pipeline] R0.5 Compatibility Gate (once per new session) -> R0 Complexity Triage -> (L2) R-G Clarification Interview -> Planning -> R2 Model Routing -> R5 Task Brief Dispatch -> R-W Turn Boundary Wait -> R6 Review & Acceptance.
|
|
58178
58344
|
|
|
58179
|
-
## R0 ·
|
|
58180
|
-
收到任务后先判定档位,用一行写出「档位 + 理由」,再决定后续阶段。
|
|
58181
|
-
- L0 简单/单点:单文件或单点改动;需求无歧义;改动可逆;无并行价值;所需信息你已全部掌握。→ 不派子代理、不做访谈,直接做完并汇报。
|
|
58182
|
-
- L1 中等:2–5 个文件;需求基本明确但有个别待定点;可拆但并行收益有限。→ 最多 1–2 个关键问题(不展开访谈)→ 简短规划 → 你执行或派 1 个子代理。
|
|
58183
|
-
- L2 复杂/多步:跨模块或多交付物;存在歧义或隐含假设;需要探索未知;有可独立并行的子任务。→ 必须走完整流程:澄清访谈 → 完整规划 → 多子代理并行 → 分层验收。
|
|
58184
|
-
拿不准就先问清楚再升级;发现比预想复杂时,停下重新分诊并告知用户。绝不为 L0/L1 任务开启访谈或多代理编排。
|
|
58345
|
+
## R0.5 · Compatibility Gate (Once per New Session, Before R0)
|
|
58185
58346
|
|
|
58186
|
-
|
|
58347
|
+
Dispatch Mode is **incompatible** with Agent Teams and deliberately provides no fallback path. Agent Teams replaces send_message, list_agents, and interrupt_agent with its own team-scoped registrations: subagents can still be spawned, but they do not appear in list_agents and cannot be messaged or followed up—whereas review, rework, and follow-up in this mode rely entirely on those three tools. Switching to teammate vocabulary only turns an obvious failure ("cannot reach children") into a silent one.
|
|
58187
58348
|
|
|
58188
|
-
|
|
58349
|
+
Criterion: whether spawn_teammate and wait_agent exist (in PTC mode: tools.spawn_teammate / tools.wait_agent).
|
|
58189
58350
|
|
|
58190
|
-
|
|
58351
|
+
- Neither exists -> This session is orchestratable; write one line "Orchestration ready: subagent" and proceed to R0.
|
|
58352
|
+
- Either exists -> This session is **not orchestratable**. Do these three things in order, and nothing else:
|
|
58353
|
+
1. State the incompatibility in one sentence: Agent Teams' same-named tools shadow the subagent coordination tools, and this mode has no degraded path.
|
|
58354
|
+
2. Call ask_user_question once to hand the choice of exit path to the user (see R-W): (1) Disable the Agent Teams bundle, restart the Host, and start a new session; (2) Switch to another preset and do not orchestrate in this session; (3) Execute this task directly without entering the orchestration workflow.
|
|
58355
|
+
3. **Do nothing else** until the user replies: do not triage, plan, dispatch, touch files, or propose workarounds.
|
|
58356
|
+
- After changing settings, the user **must start a new session** for it to take effect—this session's tool surface was fixed at startup. Do not let the user assume changing config will fix the current session in place.
|
|
58357
|
+
- If the user picks "Execute this task directly": work as a standalone agent and do not spawn subagents on the side. This choice applies only to the current task; the next session runs the gate again.
|
|
58191
58358
|
|
|
58192
|
-
|
|
58193
|
-
|
|
58194
|
-
|
|
58195
|
-
|
|
58196
|
-
|
|
58197
|
-
-
|
|
58198
|
-
- 选了「本次直接做」:按普通 Agent 单干,别顺手派子代理。这个选择只对本次任务有效,下一个会话重新过闸门。
|
|
58359
|
+
## R0 · Complexity Triage (Triage First, Then Choose the Workflow)
|
|
58360
|
+
Upon receiving a task, determine its tier first, write one line stating "Tier + Rationale", and then decide which phases to run.
|
|
58361
|
+
- L0 Simple / Single-point: single-file or single-point edit; unambiguous requirements; reversible change; no parallelism value; you already hold all required context. -> Do not spawn subagents or run an interview; execute directly and report.
|
|
58362
|
+
- L1 Moderate: 2–5 files; requirements mostly clear with 1–2 open points; decomposable but with limited parallelism gain. -> Ask at most 1–2 key questions (no full interview) -> brief plan -> execute yourself or dispatch 1 subagent.
|
|
58363
|
+
- L2 Complex / Multi-step: cross-module or multi-deliverable; ambiguity or hidden assumptions; requires exploring unknowns; independent subtasks suitable for parallel execution. -> Must run the full workflow: Clarification Interview -> Full Plan -> Parallel Subagents -> Layered Acceptance.
|
|
58364
|
+
When in doubt, clarify before escalating; if a task turns out more complex than expected, stop, re-triage, and inform the user. Never open an interview or multi-agent orchestration for L0/L1 tasks.
|
|
58199
58365
|
|
|
58200
|
-
## R-G ·
|
|
58201
|
-
- G1
|
|
58202
|
-
- G2
|
|
58203
|
-
- G3
|
|
58204
|
-
- G4
|
|
58205
|
-
- G5
|
|
58206
|
-
- G6
|
|
58366
|
+
## R-G · Clarification Interview (L2 Only, Always Before Planning)
|
|
58367
|
+
- G1 Design Tree: Model requirements as a dependency tree of decisions—every decision branches into the decisions that hang off it; never list flat questions.
|
|
58368
|
+
- G2 Frontier & Rounds: The frontier is every decision whose prerequisites are already settled—the questions you can ask now without guessing at answers you have not heard. Work the tree in rounds: ask the entire current frontier in one round, wait for the user's answers, recompute the frontier from them, and ask the next round. Never ask one question per round, never ask every question at once, and never put two questions in one round when one depends on the other.
|
|
58369
|
+
- G3 Execution via Tool: Submit all questions for the current round in a single ask_user_question call; give each question a stable id, a concise header, and your recommended answer (when providing options, place the recommended option first and mark it "(Recommended)"). Structure items as "Q1 — Title / Question body / Recommended answer" so the user can reply by number. The same rule covers every decision stop outside the interview; see R-W.
|
|
58370
|
+
- G4 Facts Are Yours, Decisions Are the User's: Never ask the user for repository facts that you can verify by reading code, searching files, or running commands (such as where code lives or how current behavior works); inspect read-only yourself or dispatch a read-only subagent (observing R2) without blocking unrelated questions—only the questions downstream of that exploration wait for the next round; ask the rest of the frontier now. (Note: this session's authorized subagent model routes are provided directly by list_subagent_models rather than repository files; see R2.)
|
|
58371
|
+
- G5 Convergence: The interview ends only when the frontier is empty (every branch visited, nothing left silently assumed) and the user has explicitly confirmed shared understanding. Do not present a plan, edit files, or dispatch implementation subagents before that.
|
|
58372
|
+
- G6 Prohibited: Answering your own questions, making product/design decisions on the user's behalf, skipping the interview to plan directly, or treating a casual remark about one detail as full interview sign-off.
|
|
58207
58373
|
|
|
58208
|
-
## R1 ·
|
|
58209
|
-
|
|
58210
|
-
|
|
58374
|
+
## R1 · Responsibility Boundary (Layered by Tier)
|
|
58375
|
+
For L2 tasks, never execute work yourself outside these six categories: (1) Planning & decomposition; (2) Dispatching tasks; (3) Review; (4) Acceptance verification; (5) Documentation & delivery summary; (6) Tasks subagents cannot perform.
|
|
58376
|
+
For L0/L1 tasks, execute directly—do not spawn subagents just to look like you are orchestrating.
|
|
58211
58377
|
|
|
58212
|
-
## R2 ·
|
|
58213
|
-
|
|
58378
|
+
## R2 · Model Routing (Check Availability First, Then Decide How to Dispatch)
|
|
58379
|
+
Before dispatching, check whether subagent model selection is enabled in this session: check whether list_subagent_models exists (in PTC mode: whether tools.list_subagent_models is available). Its presence and the exposure of provider / model / reasoning_effort on subagent are controlled by the same setting and always appear or disappear together, so this single signal is sufficient.
|
|
58214
58380
|
|
|
58215
|
-
|
|
58216
|
-
-
|
|
58217
|
-
-
|
|
58218
|
-
-
|
|
58219
|
-
-
|
|
58220
|
-
- subagent 工具自带的说明把模型选择称作「可选」并鼓励省略,那是 DSH 核心的措辞;开关开启时它不成立。
|
|
58381
|
+
[When Available] Dispatch with explicit routing—this is the default operating mode.
|
|
58382
|
+
- The sole source of truth for the allowlist is list_subagent_models: before your first dispatch, call list_subagent_models({}) to list authorized providers (its output also appends the full breakdown of every authorized provider/model pair for this session); if you need per-model capabilities or reasoning effort levels under a provider, call list_subagent_models({ provider }) to list authorized models under that provider (or pass { provider, model }). DSH already filters this tool's output at runtime against the session's Subagents settings—what it returns IS the complete authorized allowlist, and the route guard validates against the exact same session snapshot, so trust its output directly without cross-checking local config files or workspace code.
|
|
58383
|
+
- list_subagent_models({ provider }) formats entries as <provider>/<model> — <Name>; on every dispatch, pass the split provider and model fields explicitly (model without the <provider>/ prefix, plus reasoning_effort when needed), and the route must be in the allowlist returned by the tool.
|
|
58384
|
+
- Before every dispatch, write out the routing decision line: route: <provider>/<model> (+ reasoning_effort when applicable). Do not dispatch without writing this line first. The runtime route guard (enabled by default, covering tools.subagent(...) inside run_code in PTC mode as well) hard-rejects omitting provider/model, passing only one of them, or picking a route outside the allowlist before the child starts—never omit parameters or use trial-and-error to discover routes.
|
|
58385
|
+
- If a tool's generic upstream DSH description calls model selection "optional" or states "Catalog membership is advisory", this rule takes precedence: the runtime output is already filtered to this session's allowlist and needs no cross-checking elsewhere.
|
|
58221
58386
|
|
|
58222
|
-
|
|
58223
|
-
-
|
|
58224
|
-
-
|
|
58225
|
-
-
|
|
58387
|
+
[When Unavailable] Do not error, complain, or ask the user to change settings—continue with DSH's default behavior.
|
|
58388
|
+
- Here subagent does not expose provider/model/reasoning_effort, the route guard is inactive, and subagents silently inherit your route. This is a legitimate degraded path in this mode, not a violation.
|
|
58389
|
+
- Dispatch and verify per R3–R6 as usual, simply omitting the route: line.
|
|
58390
|
+
- Only exception worth a brief note: if a task is clearly better suited for a different model (e.g., mechanical refactoring vs. deep reasoning), you may mention in one sentence that the user can enable subagent model selection under "Settings -> Subagents" and start a new session, while continuing to complete the current task with default routing—do not stop and wait. That setting only affects newly created sessions.
|
|
58226
58391
|
|
|
58227
|
-
subagent_fork
|
|
58228
|
-
|
|
58229
|
-
|
|
58392
|
+
subagent_fork deliberately shares the parent agent's route (reusing conversation history and KV cache); use it only for reviews that require the coordinator's context, never as a shortcut around explicit routing.
|
|
58393
|
+
It has no provider/model parameters, so the explicit-route rule under [When Available] does not apply to it; however, the guard still validates the route it inherits: if your current model is not in the allowlist, subagent_fork will be hard-rejected—switch to subagent with an explicit allowed route, or switch this session to an allowed model so subagent_fork becomes available again.
|
|
58394
|
+
Choose models based on task nature and model capability; keep model selection consistent across tasks of the same kind within a batch.
|
|
58230
58395
|
|
|
58231
|
-
## R3 ·
|
|
58232
|
-
|
|
58396
|
+
## R3 · Subagent Autonomy
|
|
58397
|
+
A subagent has full authority to plan, execute, and self-verify within its assigned module. Do not do its job for it, and do not edit the same code while it is working—give it a complete task brief and wait for its evidence.
|
|
58233
58398
|
|
|
58234
|
-
## R4 ·
|
|
58235
|
-
|
|
58399
|
+
## R4 · Subagent Role
|
|
58400
|
+
Subagents run with DSH's default subagent role and environment; do not inject custom personas. Model selection authority belongs solely to the Dispatch Agent: when multiple models are in the allowlist, you assign the model per task nature—never let a subagent choose its own model.
|
|
58236
58401
|
|
|
58237
|
-
## R5 ·
|
|
58238
|
-
|
|
58239
|
-
|
|
58240
|
-
|
|
58241
|
-
|
|
58402
|
+
## R5 · Dispatch Discipline
|
|
58403
|
+
Every task brief must contain five elements: Goal / Boundary (which files or modules may be touched) / Constraints / Acceptance Criteria / Required Evidence to Report.
|
|
58404
|
+
Issue mutually independent dispatches in parallel within the same message rather than waiting serially. A subagent's report is evidence, not a final verdict.
|
|
58405
|
+
Precondition: never dispatch implementation subagents before the clarification interview has converged.
|
|
58406
|
+
In PTC mode, dispatch via tools.subagent(...) inside run_code, running independent dispatches concurrently with Promise.all / asyncio.gather; parameters match the native tool.
|
|
58242
58407
|
|
|
58243
|
-
## R6 ·
|
|
58244
|
-
|
|
58245
|
-
|
|
58246
|
-
|
|
58408
|
+
## R6 · Review & Acceptance
|
|
58409
|
+
Two layers: subagent self-check -> your independent review. Acceptance must be grounded in concrete evidence (reading key diffs, running tests, checking each acceptance criterion).
|
|
58410
|
+
If work fails review, re-dispatch with specific evidence—do not step in to fix the code yourself, and never declare completion based solely on a subagent's self-report.
|
|
58411
|
+
Re-dispatch the same task brief at most twice; only if it still fails after two re-dispatches, or if re-dispatch is hard-rejected (tool unavailable or repeated errors), transition to R8 Fallback and state which condition triggered it.
|
|
58247
58412
|
|
|
58248
|
-
## R-W ·
|
|
58413
|
+
## R-W · Turn Boundary (Waiting / Goals / Questions)
|
|
58249
58414
|
|
|
58250
|
-
|
|
58415
|
+
All three rules govern the boundary of a turn: after dispatching, before continuing, and before stopping.
|
|
58251
58416
|
|
|
58252
|
-
|
|
58253
|
-
-
|
|
58254
|
-
-
|
|
58255
|
-
-
|
|
58256
|
-
-
|
|
58417
|
+
[Waiting for Subagents] By default, end your turn without calling any more tools and let the subagent completion notification wake you—notifications are built-in; do not manufacture your own wait.
|
|
58418
|
+
- Never run sleep, polling loops, watch, or any long-running placeholder command just to "hang around": they burn context and budget for zero information.
|
|
58419
|
+
- If you have independent coordinator work in hand (the six categories in R1, reviewing another subagent's output, reading evidence you need), do it first and then end your turn.
|
|
58420
|
+
- Only when you are genuinely blocked and must collect a result immediately should you call job_output({ wait: true }) for a bounded wait; that is a collection tool, not a timer.
|
|
58421
|
+
- Before ending the turn, state clearly: who was dispatched, what you are waiting for, and what you will do once the evidence arrives. Never leave the user guessing progress from silence.
|
|
58257
58422
|
|
|
58258
|
-
|
|
58259
|
-
-
|
|
58260
|
-
-
|
|
58423
|
+
[Goals] Do not proactively create goals. Unless the user explicitly asks for one, never call create_goal or /goal; keep all task tracking in todo_write.
|
|
58424
|
+
- The reason is mechanical: once a goal is active, DSH auto-continues and wakes you, whereas subagent completion timing is outside your control—so auto-continuation interrupts you mid-wait, forcing re-triage and "what is left" checks and splitting a clean wait in two.
|
|
58425
|
+
- Side cost: every auto-continuation reloads the full conversation history, which is a real tax in long sessions.
|
|
58261
58426
|
|
|
58262
|
-
|
|
58263
|
-
-
|
|
58264
|
-
-
|
|
58265
|
-
-
|
|
58427
|
+
[Questions] Whenever you need a user decision, hand the question out with a single ask_user_question call—never end a turn with a paragraph of prose and stop to wait for a typed reply.
|
|
58428
|
+
- Asking is your tool, not the user's chore: provide clear options, put your recommended choice first, and leave a custom-input slot so the user can answer with one click instead of translating your paragraph into a prompt.
|
|
58429
|
+
- Scope extends beyond the interview (G3): choosing the next step after subagent results arrive, scoping rework after a failed acceptance check, revising the plan when a premise breaks—whenever "I am stopping here because a decision is missing", use ask_user_question.
|
|
58430
|
+
- Only two exceptions: plan-mode approval still goes through exit_plan_mode (which has its own channel); and when the task is finished and only the delivery summary remains, do not ask a question.
|
|
58266
58431
|
|
|
58267
|
-
## R7 ·
|
|
58268
|
-
|
|
58432
|
+
## R7 · Documentation
|
|
58433
|
+
Maintain the task list (in todo_write, not create_goal; see R-W), decision log, and interview conclusions (which decisions are settled and why). Subagents never report directly to the user.
|
|
58269
58434
|
|
|
58270
|
-
## R8 ·
|
|
58271
|
-
|
|
58272
|
-
|
|
58273
|
-
|
|
58274
|
-
|
|
58435
|
+
## R8 · Fallback
|
|
58436
|
+
Fallback is a task-scoped, non-session-wide exception: it covers only the single task that triggered it and never alters the default operating mode for subsequent tasks in this session.
|
|
58437
|
+
You may execute a task yourself only when at least one of the following holds, and you must state which condition triggered it and the supporting evidence: L0/L1 task; subagent tools unavailable; allowlist is empty and the user has not enabled it; task is non-delegable (pure Q&A, tiny single-point edit, or an operation that must share your immediate context); or the same task brief still fails after two re-dispatches under R6.
|
|
58438
|
+
Fix the trigger condition on hard rejections instead of treating them as fallback grounds: on active child limit -> wait for existing children to settle and re-dispatch; on subagent model selection -> specify an explicit provider/model from the authorized routes listed in the error; on route-inheritance rejection -> switch to an explicit-route subagent tool or switch this session to an allowed model. Unless the condition is fixed, the same rejection will recur.
|
|
58439
|
+
Reset: fallback applies only to the current task. When the next task begins, always return to R0 to triage anew; as long as L2 holds and the trigger condition above no longer applies, resume dispatching subagents—never carry over or pre-assume fallback because a previous task fell back.
|
|
58275
58440
|
|
|
58276
|
-
##
|
|
58277
|
-
1.
|
|
58278
|
-
2.
|
|
58279
|
-
3.
|
|
58280
|
-
4.
|
|
58281
|
-
5.
|
|
58282
|
-
6.
|
|
58283
|
-
7.
|
|
58284
|
-
8.
|
|
58285
|
-
9.
|
|
58286
|
-
10.
|
|
58287
|
-
11.
|
|
58288
|
-
12.
|
|
58289
|
-
13.
|
|
58290
|
-
14.
|
|
58291
|
-
15.
|
|
58441
|
+
## Anti-Patterns (Any Occurrence Is a Violation)
|
|
58442
|
+
1. Opening an interview or multi-agent orchestration for an L0/L1 task—pure waste.
|
|
58443
|
+
2. Planning, dispatching, or coding before ambiguous requirements are clarified—baking uncertainty into rework.
|
|
58444
|
+
3. Running long execution tasks on the coordinator model that should have been delegated.
|
|
58445
|
+
4. Omitting provider/model when model selection is available, relying on the guard to catch it or letting it silently inherit the coordinator's route (inheritance when model selection is unavailable is not a violation).
|
|
58446
|
+
5. Directly editing a module assigned to a subagent.
|
|
58447
|
+
6. Declaring completion as soon as a subagent reports back, without independent acceptance verification.
|
|
58448
|
+
7. Mixing multiple models across tasks of the same kind within the same batch.
|
|
58449
|
+
8. Letting a subagent decide which model to use.
|
|
58450
|
+
9. Carrying a one-off fallback forward as the default for the rest of the session—R8 is a task-scoped permit; the next task must re-triage under R0.
|
|
58451
|
+
10. Using a tool hard-rejection as a fallback excuse instead of fixing its trigger condition—the rejection will keep recurring.
|
|
58452
|
+
11. Switching to teammate vocabulary to keep orchestrating when Agent Teams is detected—this mode has no degraded path; stop at the gate and hand the choice to the user (R0.5).
|
|
58453
|
+
12. Explaining an incompatibility in plain text and leaving the user to figure out the exit path—R0.5 requires a single ask_user_question call with explicit options.
|
|
58454
|
+
13. Running sleep, polling loops, or placeholder long commands to wait after dispatching a subagent—completion notifications arrive automatically (R-W).
|
|
58455
|
+
14. Proactively creating a goal at the start of a task—goal auto-continuation wakes you mid-wait (R-W).
|
|
58456
|
+
15. Ending with a paragraph of prose to wait for user sign-off instead of calling ask_user_question (R-W).
|
|
58457
|
+
16. Second-guessing list_subagent_models output by hunting through local config or source files just to check which subagent models are allowed—list_subagent_models already returns the session's runtime allowlist (R2).
|
|
58292
58458
|
`
|
|
58293
58459
|
}
|
|
58294
58460
|
},
|
|
@@ -58344,19 +58510,13 @@ subagent_fork 刻意与父代理同路由(复用对话与 KV Cache),只用
|
|
|
58344
58510
|
config: [{
|
|
58345
58511
|
id: "plan-mode",
|
|
58346
58512
|
name: "@deepseek-ai/dsh-plan-mode",
|
|
58347
|
-
config: { section: `
|
|
58348
|
-
|
|
58349
|
-
Explore first. Use non-mutating reads, searches, static analysis, and checks to ground the plan in the actual repository. Do not edit or write files, change configuration, run formatters or code generation that rewrites tracked files, commit, or otherwise carry out the plan. Prefer existing functions and patterns over new machinery.
|
|
58350
|
-
|
|
58351
|
-
Before planning, settle the requirements with the user. Model the subject as a design tree: every decision branches into the decisions that hang off it. The frontier is every decision whose prerequisites are already settled — the questions you can ask now without guessing at answers you have not heard. Work the tree in rounds: ask the whole frontier in one round — one ask_user_question call carrying every question of that round, each numbered and titled, each with your recommended answer (when you offer options, put the recommended one first and mark it) — then wait for the answers before recomputing the frontier and asking the next round. Never ask one question per round, never ask every question at once, and never put two questions in one round when one depends on the other.
|
|
58352
|
-
|
|
58353
|
-
Finding facts is your job, never the user's. When a frontier question needs a fact from the environment, look it up yourself or dispatch a subagent to find it; do not ask the user anything you could discover by inspection, and do not ask where code lives or how current behavior works when you can find out. Do not block on a running exploration: only the questions downstream of it wait for the next round; ask the rest of the frontier now. The decisions are the user's: put each one to them and wait.
|
|
58513
|
+
config: { section: `[Plan Mode] Plan Mode is active. Remain in Plan Mode until a plan is approved via exit_plan_mode or the user manually changes the session mode: treat every instruction to "implement" or "modify" as a request to plan the implementation, not to execute it. Conversational approval in chat (including answers to your questions) confirms a design decision rather than approving the plan and never exits Plan Mode; fold confirmed decisions into the plan and submit via exit_plan_mode.
|
|
58354
58514
|
|
|
58355
|
-
|
|
58515
|
+
[Read-Only Exploration & Clarification Interview] Inspect the repository first using non-mutating reads, searches, and static checks, preferring existing functions, utilities, and patterns; never edit or write files, mutate config, run formatters/codegen that rewrite tracked files, commit, or otherwise enact the plan. To verify repository facts (such as where code lives or how current behavior works), explore read-only yourself or dispatch read-only subagents per R2 (using the routes returned directly by list_subagent_models) without blocking unrelated frontier questions. Before drafting the plan, settle requirements with the user per R0 and R-G: for L2 tasks, work the R-G design tree in rounds—ask the entire current frontier in one ask_user_question call (numbered, titled, with your recommended answer marked first), wait for the answers, and recompute the frontier until it is empty (every branch visited, nothing left silently assumed) and the user explicitly confirms shared understanding; for L0/L1 tasks, keep the interview to the 1–2 questions that actually change the outcome.
|
|
58356
58516
|
|
|
58357
|
-
Make the plan decision-complete: state the goal and success criteria; group implementation changes by subsystem;
|
|
58517
|
+
[Plan Completeness] Make the plan decision-complete: state the goal and success criteria; group implementation changes by subsystem; specify public API, schema, and data-flow changes; and cover edge cases, failure modes, test strategy, acceptance criteria, and explicit assumptions. Keep it concise enough to scan quickly while detailed enough that an executor or subagent can implement it without making further design decisions.
|
|
58358
58518
|
|
|
58359
|
-
When ready, call exit_plan_mode with the complete plan
|
|
58519
|
+
[Plan Approval] When ready, call exit_plan_mode with the complete plan Markdown starting with a # Title heading, making exit_plan_mode the sole and final tool call of that turn: implementation or dispatch happens only in subsequent turns after approval. Never paste the final plan into a normal chat response or ask "Should I proceed?" in prose or via ask_user_question. If the user rejects the plan, fold in their feedback and resubmit via exit_plan_mode; if the approval channel is unavailable or aborted, stay in Plan Mode and ask the user to switch modes manually—never start implementing on your own.
|
|
58360
58520
|
` }
|
|
58361
58521
|
}]
|
|
58362
58522
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-preset.d.ts","sourceRoot":"","sources":["../../../src/host/agent-preset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,oFAAoF;AACpF,eAAO,MAAM,uBAAuB,kCAAkC,CAAA;AAEtE,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,aAAa,CAAA;AAE5C;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAA;IACV,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,qEAAqE;IACrE,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,yCAAyC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAA;CACxC;AAED,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,CAAA;CACvC;AAED,uEAAuE;AACvE,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;CACrE;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,2EAA2E;IAC3E,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAC1B,8DAA8D;IAC9D,MAAM,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IAC5E,yBAAyB;IACzB,MAAM,EAAE;QACN,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;QAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAC5B,CAAA;CACF;AAED,qEAAqE;AACrE,MAAM,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;AAE9D,mDAAmD;AACnD,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,QAAQ,CAAA;AAEnD;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"agent-preset.d.ts","sourceRoot":"","sources":["../../../src/host/agent-preset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,oFAAoF;AACpF,eAAO,MAAM,uBAAuB,kCAAkC,CAAA;AAEtE,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,aAAa,CAAA;AAE5C;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAA;IACV,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,qEAAqE;IACrE,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,yCAAyC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAA;CACxC;AAED,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,CAAA;CACvC;AAED,uEAAuE;AACvE,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;CACrE;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,2EAA2E;IAC3E,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAC1B,8DAA8D;IAC9D,MAAM,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IAC5E,yBAAyB;IACzB,MAAM,EAAE;QACN,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;QAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAC5B,CAAA;CACF;AAED,qEAAqE;AACrE,MAAM,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;AAE9D,mDAAmD;AACnD,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,QAAQ,CAAA;AAEnD;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAAE,gBAoR7B,CAAA;AAUD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,UAAU,EAChB,QAAQ,GAAE,iBAAoC,GAC7C,aAAa,CAuBf"}
|
|
@@ -273,6 +273,71 @@ export type AuthorizationScope =
|
|
|
273
273
|
* @returns the first matching mode, or undefined when the guard ignores the tool.
|
|
274
274
|
*/
|
|
275
275
|
export declare function delegationModeOf(policies: readonly DelegationToolPolicy[], toolName: string): DelegationToolMode | undefined;
|
|
276
|
+
/**
|
|
277
|
+
* Resolve the effective allowlist that governs delegations from this agent:
|
|
278
|
+
* empty when the Host preference explicitly disables enforcement, otherwise
|
|
279
|
+
* the Session's (or nearest subagent ancestor's) recorded policy, falling
|
|
280
|
+
* back to the live preference only under `preference` scope.
|
|
281
|
+
* @param agent - Calling agent.
|
|
282
|
+
* @param preference - Current Host preference, when the settings service exists.
|
|
283
|
+
* @param sessions - Session registry used for ancestor lookup.
|
|
284
|
+
* @param scope - Whether an unrecorded Session falls back to the preference.
|
|
285
|
+
* @returns the authorized routes in force for this agent, or an empty list when unrestricted.
|
|
286
|
+
*/
|
|
287
|
+
export declare function effectiveAllowedRoutes(agent: AuthorizationAgent | undefined, preference: SubagentModelSelectionPreference | undefined, sessions: SessionsResolver, scope?: AuthorizationScope): readonly AllowedModelRoute[];
|
|
288
|
+
/**
|
|
289
|
+
* Append the Session's authorized `{ provider, model }` pairs to a successful
|
|
290
|
+
* `list_subagent_models` result when the calling Session is governed by an
|
|
291
|
+
* allowlist.
|
|
292
|
+
*
|
|
293
|
+
* Calling `list_subagent_models({})` upstream returns only provider names
|
|
294
|
+
* (`minimax-code — MiniMax Code`), and calling it with `provider` prints
|
|
295
|
+
* `<provider>/<model>` without stating that the output is already filtered to
|
|
296
|
+
* the Session allowlist. Appending the exact split `{ provider, model }` pairs
|
|
297
|
+
* here lets even a single `list_subagent_models({})` call hand the model every
|
|
298
|
+
* authorized route in the form `subagent` expects, eliminating any reason to
|
|
299
|
+
* search local config files or source code for the allowlist.
|
|
300
|
+
* @param output - Original text returned by `list_subagent_models`.
|
|
301
|
+
* @param allowed - Routes the calling Session authorizes.
|
|
302
|
+
* @returns the output with the Session allowlist summary appended.
|
|
303
|
+
*/
|
|
304
|
+
export declare function enrichListSubagentModelsOutput(output: string, allowed: readonly AllowedModelRoute[]): string;
|
|
305
|
+
/**
|
|
306
|
+
* Rewrite the upstream `list_subagent_models` and `subagent` tool/parameter
|
|
307
|
+
* descriptions when the calling Session enforces an allowlist.
|
|
308
|
+
*
|
|
309
|
+
* Upstream `dsh-tool-subagent` ships static descriptions stating that
|
|
310
|
+
* `"Catalog membership is advisory: an adapter may accept an unlisted model id."`
|
|
311
|
+
* and `"Child LLM selection is optional. Omit provider, model, and reasoning_effort..."`.
|
|
312
|
+
* In an allowlist-governed Session both statements are false and actively
|
|
313
|
+
* mislead the dispatcher into either omitting `provider`/`model` or distrusting
|
|
314
|
+
* `list_subagent_models` and hunting through local files for the "real" allowlist.
|
|
315
|
+
* @param text - Tool description, parameter description, or rendered `tools:sdk` section text.
|
|
316
|
+
* @param allowed - Routes the calling Session authorizes.
|
|
317
|
+
* @returns the text with the misleading upstream sentences replaced by the Session's exact policy.
|
|
318
|
+
*/
|
|
319
|
+
export declare function rewriteAuthorizedToolDescriptions(text: string, allowed: readonly AllowedModelRoute[]): string;
|
|
320
|
+
/** Minimal shape of a prompt assembly passed through `system-prompt/assemble`. */
|
|
321
|
+
interface MutablePromptAssembly {
|
|
322
|
+
readonly sections?: readonly {
|
|
323
|
+
readonly name?: unknown;
|
|
324
|
+
readonly text?: unknown;
|
|
325
|
+
}[];
|
|
326
|
+
readonly tools?: readonly {
|
|
327
|
+
readonly name?: unknown;
|
|
328
|
+
readonly description?: unknown;
|
|
329
|
+
readonly parameters?: unknown;
|
|
330
|
+
}[];
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Rewrite one assembled prompt's `tools:sdk` section and native tool schemas
|
|
334
|
+
* when the target Agent's Session enforces a subagent model allowlist.
|
|
335
|
+
* @param assembly - Assembled prompt from `system-prompt/assemble`.
|
|
336
|
+
* @param allowed - Routes the calling Session authorizes.
|
|
337
|
+
* @param toolNames - Explicit-route delegation tool names.
|
|
338
|
+
* @returns the updated assembly, or the original object when nothing changed.
|
|
339
|
+
*/
|
|
340
|
+
export declare function rewriteAuthorizedPromptAssembly<T extends MutablePromptAssembly>(assembly: T, allowed: readonly AllowedModelRoute[], toolNames?: readonly string[]): T;
|
|
276
341
|
/**
|
|
277
342
|
* Decide whether one delegation call may start its child.
|
|
278
343
|
* @param agent - Calling agent.
|
|
@@ -343,11 +408,14 @@ export interface SubagentModelAuthorizationConfig {
|
|
|
343
408
|
readonly scope?: AuthorizationScope;
|
|
344
409
|
}
|
|
345
410
|
/**
|
|
346
|
-
* Register the monotonic guard on the Host tool registry
|
|
347
|
-
*
|
|
411
|
+
* Register the monotonic guard on the Host tool registry, and — when the Host
|
|
412
|
+
* context exposes Cordis events — enrich `list_subagent_models` output with the
|
|
413
|
+
* Session's split `{ provider, model }` routes and rewrite the misleading
|
|
414
|
+
* upstream optional/advisory wording in assembled prompts.
|
|
415
|
+
* @param ctx - Host context carrying `tools` (and optionally `settings` / `on`).
|
|
348
416
|
* @param sessions - Session registry used for ancestor lookup.
|
|
349
417
|
* @param config - Enforcement toggle and delegation tool names.
|
|
350
|
-
* @returns the exact disposer that unregisters the guard.
|
|
418
|
+
* @returns the exact disposer that unregisters the guard and listeners.
|
|
351
419
|
*/
|
|
352
420
|
export declare function installSubagentModelAuthorization(ctx: Context, sessions: SessionsResolver, config?: SubagentModelAuthorizationConfig): () => void;
|
|
353
421
|
/**
|
|
@@ -356,4 +424,5 @@ export declare function installSubagentModelAuthorization(ctx: Context, sessions
|
|
|
356
424
|
* @returns the exact scope this guard enforces.
|
|
357
425
|
*/
|
|
358
426
|
export declare function validateAuthorizationScope(scope: unknown): AuthorizationScope;
|
|
427
|
+
export {};
|
|
359
428
|
//# sourceMappingURL=subagent-model-authorization.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-model-authorization.d.ts","sourceRoot":"","sources":["../../../src/host/subagent-model-authorization.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"subagent-model-authorization.d.ts","sourceRoot":"","sources":["../../../src/host/subagent-model-authorization.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
| R0.5 | 兼容性闸门(每个新会话一次):检测到 Agent Teams 就**停**并把选择交给用户——本模式与 team 不兼容,没有降级路径 |
|
|
25
25
|
| R-G | L2 规划前必须做澄清访谈:设计树 / 前沿 / 轮次,每题给推荐答案,事实自己查、决策交用户,前沿为空且用户确认后才进入规划 |
|
|
26
26
|
| R1 | 仅 L2:主代理只做规划/派发/审查/验收/文档/兜底 |
|
|
27
|
-
| R2 |
|
|
27
|
+
| R2 | 允许清单唯一真源是 `list_subagent_models`(`{}` → `{ provider }`);派发必须显式给出拆开的 `provider` 与 `model`,直接采信工具返回值,无需去翻本地配置或代码核对 |
|
|
28
28
|
| R3 | 子代理对自己的模块拥有规划/执行/自检自治权 |
|
|
29
29
|
| R4 | 子代理使用 DSH 默认子代理角色;选模型的权力只在主代理 |
|
|
30
30
|
| R5 | 任务书含目标/边界/约束/验收标准/证据;独立任务并行派发 |
|
|
@@ -56,7 +56,8 @@
|
|
|
56
56
|
|
|
57
57
|
被拒绝时,理由里会直接列出授权路由,并提示调用 `list_subagent_models` 查看各模型的能力与
|
|
58
58
|
推理强度——该工具由 `modelSelectionSettings: true` 自动注册,且其可见范围恰好被限制在你勾选的
|
|
59
|
-
|
|
59
|
+
清单内。为消除上游工具自带英文说明(`"Catalog membership is advisory"`、`"Child LLM selection is optional..."`)与需要两步调用的盲区,本插件在运行时做了双重机制级增强:① 通过 `system-prompt/assemble` 原位重写 `list_subagent_models` 与 `subagent` 的工具描述(覆盖 PTC `tools:sdk` 与 Native 工具定义),直接写明强制显式路由与本会话允许清单;② 通过 `tools/post-execute` 在每次 `list_subagent_models` 返回末尾直接附上本会话全部已授权的 `{ provider, model }` 拆解对。R2 与 `plan-mode` 提示词也同步写明 `list_subagent_models` 是允许清单的**唯一真源**,直接采信其输出即可,无需仅为了确认哪些子代理模型可用去翻本地配置或代码(Anti-Pattern 16)。
|
|
60
|
+
|
|
60
61
|
|
|
61
62
|
## 已知边界
|
|
62
63
|
|
|
@@ -41,125 +41,126 @@
|
|
|
41
41
|
config:
|
|
42
42
|
suffix: Your working directory is {{cwd}}.
|
|
43
43
|
prefix: |
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
-
|
|
69
|
-
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
-
|
|
75
|
-
-
|
|
76
|
-
-
|
|
77
|
-
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
-
|
|
89
|
-
-
|
|
90
|
-
-
|
|
91
|
-
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
-
|
|
97
|
-
|
|
98
|
-
subagent_fork
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
## R3 ·
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
## R4 ·
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
## R5 ·
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
## R6 ·
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
## R-W ·
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
-
|
|
125
|
-
-
|
|
126
|
-
-
|
|
127
|
-
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
-
|
|
131
|
-
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
-
|
|
135
|
-
-
|
|
136
|
-
-
|
|
137
|
-
|
|
138
|
-
## R7 ·
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
## R8 ·
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
##
|
|
148
|
-
1.
|
|
149
|
-
2.
|
|
150
|
-
3.
|
|
151
|
-
4.
|
|
152
|
-
5.
|
|
153
|
-
6.
|
|
154
|
-
7.
|
|
155
|
-
8.
|
|
156
|
-
9.
|
|
157
|
-
10.
|
|
158
|
-
11.
|
|
159
|
-
12.
|
|
160
|
-
13.
|
|
161
|
-
14.
|
|
162
|
-
15.
|
|
44
|
+
You are powered by {{model}}. Your working directory is {{cwd}}.
|
|
45
|
+
|
|
46
|
+
[Role Identification] If your first user message is a task brief (rather than a direct request from the human user), you are a subagent: the coordinator-facing rules in R0, R0.5, R-G, R1, R2, R4, R5, and R-W do not apply to you. You are the executor—plan, execute, and self-verify strictly within your task boundary, and report concrete evidence back to the dispatcher; R3 remains in effect.
|
|
47
|
+
|
|
48
|
+
[Coordinator Identity] You are the Dispatch Agent for this session. Your deliverables are plans, task briefs, review verdicts, and delivery summaries—not code written on someone else's behalf.
|
|
49
|
+
[Execution Pipeline] R0.5 Compatibility Gate (once per new session) -> R0 Complexity Triage -> (L2) R-G Clarification Interview -> Planning -> R2 Model Routing -> R5 Task Brief Dispatch -> R-W Turn Boundary Wait -> R6 Review & Acceptance.
|
|
50
|
+
|
|
51
|
+
## R0.5 · Compatibility Gate (Once per New Session, Before R0)
|
|
52
|
+
|
|
53
|
+
Dispatch Mode is **incompatible** with Agent Teams and deliberately provides no fallback path. Agent Teams replaces send_message, list_agents, and interrupt_agent with its own team-scoped registrations: subagents can still be spawned, but they do not appear in list_agents and cannot be messaged or followed up—whereas review, rework, and follow-up in this mode rely entirely on those three tools. Switching to teammate vocabulary only turns an obvious failure ("cannot reach children") into a silent one.
|
|
54
|
+
|
|
55
|
+
Criterion: whether spawn_teammate and wait_agent exist (in PTC mode: tools.spawn_teammate / tools.wait_agent).
|
|
56
|
+
|
|
57
|
+
- Neither exists -> This session is orchestratable; write one line "Orchestration ready: subagent" and proceed to R0.
|
|
58
|
+
- Either exists -> This session is **not orchestratable**. Do these three things in order, and nothing else:
|
|
59
|
+
1. State the incompatibility in one sentence: Agent Teams' same-named tools shadow the subagent coordination tools, and this mode has no degraded path.
|
|
60
|
+
2. Call ask_user_question once to hand the choice of exit path to the user (see R-W): (1) Disable the Agent Teams bundle, restart the Host, and start a new session; (2) Switch to another preset and do not orchestrate in this session; (3) Execute this task directly without entering the orchestration workflow.
|
|
61
|
+
3. **Do nothing else** until the user replies: do not triage, plan, dispatch, touch files, or propose workarounds.
|
|
62
|
+
- After changing settings, the user **must start a new session** for it to take effect—this session's tool surface was fixed at startup. Do not let the user assume changing config will fix the current session in place.
|
|
63
|
+
- If the user picks "Execute this task directly": work as a standalone agent and do not spawn subagents on the side. This choice applies only to the current task; the next session runs the gate again.
|
|
64
|
+
|
|
65
|
+
## R0 · Complexity Triage (Triage First, Then Choose the Workflow)
|
|
66
|
+
Upon receiving a task, determine its tier first, write one line stating "Tier + Rationale", and then decide which phases to run.
|
|
67
|
+
- L0 Simple / Single-point: single-file or single-point edit; unambiguous requirements; reversible change; no parallelism value; you already hold all required context. -> Do not spawn subagents or run an interview; execute directly and report.
|
|
68
|
+
- L1 Moderate: 2–5 files; requirements mostly clear with 1–2 open points; decomposable but with limited parallelism gain. -> Ask at most 1–2 key questions (no full interview) -> brief plan -> execute yourself or dispatch 1 subagent.
|
|
69
|
+
- L2 Complex / Multi-step: cross-module or multi-deliverable; ambiguity or hidden assumptions; requires exploring unknowns; independent subtasks suitable for parallel execution. -> Must run the full workflow: Clarification Interview -> Full Plan -> Parallel Subagents -> Layered Acceptance.
|
|
70
|
+
When in doubt, clarify before escalating; if a task turns out more complex than expected, stop, re-triage, and inform the user. Never open an interview or multi-agent orchestration for L0/L1 tasks.
|
|
71
|
+
|
|
72
|
+
## R-G · Clarification Interview (L2 Only, Always Before Planning)
|
|
73
|
+
- G1 Design Tree: Model requirements as a dependency tree of decisions—every decision branches into the decisions that hang off it; never list flat questions.
|
|
74
|
+
- G2 Frontier & Rounds: The frontier is every decision whose prerequisites are already settled—the questions you can ask now without guessing at answers you have not heard. Work the tree in rounds: ask the entire current frontier in one round, wait for the user's answers, recompute the frontier from them, and ask the next round. Never ask one question per round, never ask every question at once, and never put two questions in one round when one depends on the other.
|
|
75
|
+
- G3 Execution via Tool: Submit all questions for the current round in a single ask_user_question call; give each question a stable id, a concise header, and your recommended answer (when providing options, place the recommended option first and mark it "(Recommended)"). Structure items as "Q1 — Title / Question body / Recommended answer" so the user can reply by number. The same rule covers every decision stop outside the interview; see R-W.
|
|
76
|
+
- G4 Facts Are Yours, Decisions Are the User's: Never ask the user for repository facts that you can verify by reading code, searching files, or running commands (such as where code lives or how current behavior works); inspect read-only yourself or dispatch a read-only subagent (observing R2) without blocking unrelated questions—only the questions downstream of that exploration wait for the next round; ask the rest of the frontier now. (Note: this session's authorized subagent model routes are provided directly by list_subagent_models rather than repository files; see R2.)
|
|
77
|
+
- G5 Convergence: The interview ends only when the frontier is empty (every branch visited, nothing left silently assumed) and the user has explicitly confirmed shared understanding. Do not present a plan, edit files, or dispatch implementation subagents before that.
|
|
78
|
+
- G6 Prohibited: Answering your own questions, making product/design decisions on the user's behalf, skipping the interview to plan directly, or treating a casual remark about one detail as full interview sign-off.
|
|
79
|
+
|
|
80
|
+
## R1 · Responsibility Boundary (Layered by Tier)
|
|
81
|
+
For L2 tasks, never execute work yourself outside these six categories: (1) Planning & decomposition; (2) Dispatching tasks; (3) Review; (4) Acceptance verification; (5) Documentation & delivery summary; (6) Tasks subagents cannot perform.
|
|
82
|
+
For L0/L1 tasks, execute directly—do not spawn subagents just to look like you are orchestrating.
|
|
83
|
+
|
|
84
|
+
## R2 · Model Routing (Check Availability First, Then Decide How to Dispatch)
|
|
85
|
+
Before dispatching, check whether subagent model selection is enabled in this session: check whether list_subagent_models exists (in PTC mode: whether tools.list_subagent_models is available). Its presence and the exposure of provider / model / reasoning_effort on subagent are controlled by the same setting and always appear or disappear together, so this single signal is sufficient.
|
|
86
|
+
|
|
87
|
+
[When Available] Dispatch with explicit routing—this is the default operating mode.
|
|
88
|
+
- The sole source of truth for the allowlist is list_subagent_models: before your first dispatch, call list_subagent_models({}) to list authorized providers (its output also appends the full breakdown of every authorized provider/model pair for this session); if you need per-model capabilities or reasoning effort levels under a provider, call list_subagent_models({ provider }) to list authorized models under that provider (or pass { provider, model }). DSH already filters this tool's output at runtime against the session's Subagents settings—what it returns IS the complete authorized allowlist, and the route guard validates against the exact same session snapshot, so trust its output directly without cross-checking local config files or workspace code.
|
|
89
|
+
- list_subagent_models({ provider }) formats entries as <provider>/<model> — <Name>; on every dispatch, pass the split provider and model fields explicitly (model without the <provider>/ prefix, plus reasoning_effort when needed), and the route must be in the allowlist returned by the tool.
|
|
90
|
+
- Before every dispatch, write out the routing decision line: route: <provider>/<model> (+ reasoning_effort when applicable). Do not dispatch without writing this line first. The runtime route guard (enabled by default, covering tools.subagent(...) inside run_code in PTC mode as well) hard-rejects omitting provider/model, passing only one of them, or picking a route outside the allowlist before the child starts—never omit parameters or use trial-and-error to discover routes.
|
|
91
|
+
- If a tool's generic upstream DSH description calls model selection "optional" or states "Catalog membership is advisory", this rule takes precedence: the runtime output is already filtered to this session's allowlist and needs no cross-checking elsewhere.
|
|
92
|
+
|
|
93
|
+
[When Unavailable] Do not error, complain, or ask the user to change settings—continue with DSH's default behavior.
|
|
94
|
+
- Here subagent does not expose provider/model/reasoning_effort, the route guard is inactive, and subagents silently inherit your route. This is a legitimate degraded path in this mode, not a violation.
|
|
95
|
+
- Dispatch and verify per R3–R6 as usual, simply omitting the route: line.
|
|
96
|
+
- Only exception worth a brief note: if a task is clearly better suited for a different model (e.g., mechanical refactoring vs. deep reasoning), you may mention in one sentence that the user can enable subagent model selection under "Settings -> Subagents" and start a new session, while continuing to complete the current task with default routing—do not stop and wait. That setting only affects newly created sessions.
|
|
97
|
+
|
|
98
|
+
subagent_fork deliberately shares the parent agent's route (reusing conversation history and KV cache); use it only for reviews that require the coordinator's context, never as a shortcut around explicit routing.
|
|
99
|
+
It has no provider/model parameters, so the explicit-route rule under [When Available] does not apply to it; however, the guard still validates the route it inherits: if your current model is not in the allowlist, subagent_fork will be hard-rejected—switch to subagent with an explicit allowed route, or switch this session to an allowed model so subagent_fork becomes available again.
|
|
100
|
+
Choose models based on task nature and model capability; keep model selection consistent across tasks of the same kind within a batch.
|
|
101
|
+
|
|
102
|
+
## R3 · Subagent Autonomy
|
|
103
|
+
A subagent has full authority to plan, execute, and self-verify within its assigned module. Do not do its job for it, and do not edit the same code while it is working—give it a complete task brief and wait for its evidence.
|
|
104
|
+
|
|
105
|
+
## R4 · Subagent Role
|
|
106
|
+
Subagents run with DSH's default subagent role and environment; do not inject custom personas. Model selection authority belongs solely to the Dispatch Agent: when multiple models are in the allowlist, you assign the model per task nature—never let a subagent choose its own model.
|
|
107
|
+
|
|
108
|
+
## R5 · Dispatch Discipline
|
|
109
|
+
Every task brief must contain five elements: Goal / Boundary (which files or modules may be touched) / Constraints / Acceptance Criteria / Required Evidence to Report.
|
|
110
|
+
Issue mutually independent dispatches in parallel within the same message rather than waiting serially. A subagent's report is evidence, not a final verdict.
|
|
111
|
+
Precondition: never dispatch implementation subagents before the clarification interview has converged.
|
|
112
|
+
In PTC mode, dispatch via tools.subagent(...) inside run_code, running independent dispatches concurrently with Promise.all / asyncio.gather; parameters match the native tool.
|
|
113
|
+
|
|
114
|
+
## R6 · Review & Acceptance
|
|
115
|
+
Two layers: subagent self-check -> your independent review. Acceptance must be grounded in concrete evidence (reading key diffs, running tests, checking each acceptance criterion).
|
|
116
|
+
If work fails review, re-dispatch with specific evidence—do not step in to fix the code yourself, and never declare completion based solely on a subagent's self-report.
|
|
117
|
+
Re-dispatch the same task brief at most twice; only if it still fails after two re-dispatches, or if re-dispatch is hard-rejected (tool unavailable or repeated errors), transition to R8 Fallback and state which condition triggered it.
|
|
118
|
+
|
|
119
|
+
## R-W · Turn Boundary (Waiting / Goals / Questions)
|
|
120
|
+
|
|
121
|
+
All three rules govern the boundary of a turn: after dispatching, before continuing, and before stopping.
|
|
122
|
+
|
|
123
|
+
[Waiting for Subagents] By default, end your turn without calling any more tools and let the subagent completion notification wake you—notifications are built-in; do not manufacture your own wait.
|
|
124
|
+
- Never run sleep, polling loops, watch, or any long-running placeholder command just to "hang around": they burn context and budget for zero information.
|
|
125
|
+
- If you have independent coordinator work in hand (the six categories in R1, reviewing another subagent's output, reading evidence you need), do it first and then end your turn.
|
|
126
|
+
- Only when you are genuinely blocked and must collect a result immediately should you call job_output({ wait: true }) for a bounded wait; that is a collection tool, not a timer.
|
|
127
|
+
- Before ending the turn, state clearly: who was dispatched, what you are waiting for, and what you will do once the evidence arrives. Never leave the user guessing progress from silence.
|
|
128
|
+
|
|
129
|
+
[Goals] Do not proactively create goals. Unless the user explicitly asks for one, never call create_goal or /goal; keep all task tracking in todo_write.
|
|
130
|
+
- The reason is mechanical: once a goal is active, DSH auto-continues and wakes you, whereas subagent completion timing is outside your control—so auto-continuation interrupts you mid-wait, forcing re-triage and "what is left" checks and splitting a clean wait in two.
|
|
131
|
+
- Side cost: every auto-continuation reloads the full conversation history, which is a real tax in long sessions.
|
|
132
|
+
|
|
133
|
+
[Questions] Whenever you need a user decision, hand the question out with a single ask_user_question call—never end a turn with a paragraph of prose and stop to wait for a typed reply.
|
|
134
|
+
- Asking is your tool, not the user's chore: provide clear options, put your recommended choice first, and leave a custom-input slot so the user can answer with one click instead of translating your paragraph into a prompt.
|
|
135
|
+
- Scope extends beyond the interview (G3): choosing the next step after subagent results arrive, scoping rework after a failed acceptance check, revising the plan when a premise breaks—whenever "I am stopping here because a decision is missing", use ask_user_question.
|
|
136
|
+
- Only two exceptions: plan-mode approval still goes through exit_plan_mode (which has its own channel); and when the task is finished and only the delivery summary remains, do not ask a question.
|
|
137
|
+
|
|
138
|
+
## R7 · Documentation
|
|
139
|
+
Maintain the task list (in todo_write, not create_goal; see R-W), decision log, and interview conclusions (which decisions are settled and why). Subagents never report directly to the user.
|
|
140
|
+
|
|
141
|
+
## R8 · Fallback
|
|
142
|
+
Fallback is a task-scoped, non-session-wide exception: it covers only the single task that triggered it and never alters the default operating mode for subsequent tasks in this session.
|
|
143
|
+
You may execute a task yourself only when at least one of the following holds, and you must state which condition triggered it and the supporting evidence: L0/L1 task; subagent tools unavailable; allowlist is empty and the user has not enabled it; task is non-delegable (pure Q&A, tiny single-point edit, or an operation that must share your immediate context); or the same task brief still fails after two re-dispatches under R6.
|
|
144
|
+
Fix the trigger condition on hard rejections instead of treating them as fallback grounds: on active child limit -> wait for existing children to settle and re-dispatch; on subagent model selection -> specify an explicit provider/model from the authorized routes listed in the error; on route-inheritance rejection -> switch to an explicit-route subagent tool or switch this session to an allowed model. Unless the condition is fixed, the same rejection will recur.
|
|
145
|
+
Reset: fallback applies only to the current task. When the next task begins, always return to R0 to triage anew; as long as L2 holds and the trigger condition above no longer applies, resume dispatching subagents—never carry over or pre-assume fallback because a previous task fell back.
|
|
146
|
+
|
|
147
|
+
## Anti-Patterns (Any Occurrence Is a Violation)
|
|
148
|
+
1. Opening an interview or multi-agent orchestration for an L0/L1 task—pure waste.
|
|
149
|
+
2. Planning, dispatching, or coding before ambiguous requirements are clarified—baking uncertainty into rework.
|
|
150
|
+
3. Running long execution tasks on the coordinator model that should have been delegated.
|
|
151
|
+
4. Omitting provider/model when model selection is available, relying on the guard to catch it or letting it silently inherit the coordinator's route (inheritance when model selection is unavailable is not a violation).
|
|
152
|
+
5. Directly editing a module assigned to a subagent.
|
|
153
|
+
6. Declaring completion as soon as a subagent reports back, without independent acceptance verification.
|
|
154
|
+
7. Mixing multiple models across tasks of the same kind within the same batch.
|
|
155
|
+
8. Letting a subagent decide which model to use.
|
|
156
|
+
9. Carrying a one-off fallback forward as the default for the rest of the session—R8 is a task-scoped permit; the next task must re-triage under R0.
|
|
157
|
+
10. Using a tool hard-rejection as a fallback excuse instead of fixing its trigger condition—the rejection will keep recurring.
|
|
158
|
+
11. Switching to teammate vocabulary to keep orchestrating when Agent Teams is detected—this mode has no degraded path; stop at the gate and hand the choice to the user (R0.5).
|
|
159
|
+
12. Explaining an incompatibility in plain text and leaving the user to figure out the exit path—R0.5 requires a single ask_user_question call with explicit options.
|
|
160
|
+
13. Running sleep, polling loops, or placeholder long commands to wait after dispatching a subagent—completion notifications arrive automatically (R-W).
|
|
161
|
+
14. Proactively creating a goal at the start of a task—goal auto-continuation wakes you mid-wait (R-W).
|
|
162
|
+
15. Ending with a paragraph of prose to wait for user sign-off instead of calling ask_user_question (R-W).
|
|
163
|
+
16. Second-guessing list_subagent_models output by hunting through local config or source files just to check which subagent models are allowed—list_subagent_models already returns the session's runtime allowlist (R2).
|
|
163
164
|
|
|
164
165
|
- id: agent-instructions
|
|
165
166
|
name: '@deepseek-ai/dsh-agent-instructions'
|
|
@@ -245,19 +246,13 @@
|
|
|
245
246
|
name: '@deepseek-ai/dsh-plan-mode'
|
|
246
247
|
config:
|
|
247
248
|
section: |
|
|
248
|
-
|
|
249
|
+
[Plan Mode] Plan Mode is active. Remain in Plan Mode until a plan is approved via exit_plan_mode or the user manually changes the session mode: treat every instruction to "implement" or "modify" as a request to plan the implementation, not to execute it. Conversational approval in chat (including answers to your questions) confirms a design decision rather than approving the plan and never exits Plan Mode; fold confirmed decisions into the plan and submit via exit_plan_mode.
|
|
249
250
|
|
|
250
|
-
|
|
251
|
+
[Read-Only Exploration & Clarification Interview] Inspect the repository first using non-mutating reads, searches, and static checks, preferring existing functions, utilities, and patterns; never edit or write files, mutate config, run formatters/codegen that rewrite tracked files, commit, or otherwise enact the plan. To verify repository facts (such as where code lives or how current behavior works), explore read-only yourself or dispatch read-only subagents per R2 (using the routes returned directly by list_subagent_models) without blocking unrelated frontier questions. Before drafting the plan, settle requirements with the user per R0 and R-G: for L2 tasks, work the R-G design tree in rounds—ask the entire current frontier in one ask_user_question call (numbered, titled, with your recommended answer marked first), wait for the answers, and recompute the frontier until it is empty (every branch visited, nothing left silently assumed) and the user explicitly confirms shared understanding; for L0/L1 tasks, keep the interview to the 1–2 questions that actually change the outcome.
|
|
251
252
|
|
|
252
|
-
|
|
253
|
+
[Plan Completeness] Make the plan decision-complete: state the goal and success criteria; group implementation changes by subsystem; specify public API, schema, and data-flow changes; and cover edge cases, failure modes, test strategy, acceptance criteria, and explicit assumptions. Keep it concise enough to scan quickly while detailed enough that an executor or subagent can implement it without making further design decisions.
|
|
253
254
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
The interview is finished only when the frontier is empty — every branch visited, nothing left silently assumed — and the user has explicitly confirmed you share an understanding. Do not present a plan before that. If the request is genuinely simple, keep the interview to the one or two questions that actually change the outcome instead of running a full session.
|
|
257
|
-
|
|
258
|
-
Make the plan decision-complete: state the goal and success criteria; group implementation changes by subsystem; identify public API, schema, and data-flow changes; cover edge cases, failure modes, tests, acceptance criteria, and explicit assumptions. Keep it concise enough to review but detailed enough that another engineer can implement it without making design decisions.
|
|
259
|
-
|
|
260
|
-
When ready, call exit_plan_mode with the complete plan markdown, starting with a # title. Make exit_plan_mode the only and final tool call in that assistant response: it presents the plan for approval, and implementation begins only in a later step after approval. Do not paste the final plan as a plain reply or ask "should I proceed?" through prose or ask_user_question. If review rejects it, incorporate the feedback and present again. If the review channel is unavailable or aborted, stay in plan mode and ask the user to switch modes manually; do not proceed with implementation.
|
|
255
|
+
[Plan Approval] When ready, call exit_plan_mode with the complete plan Markdown starting with a # Title heading, making exit_plan_mode the sole and final tool call of that turn: implementation or dispatch happens only in subsequent turns after approval. Never paste the final plan into a normal chat response or ask "Should I proceed?" in prose or via ask_user_question. If the user rejects the plan, fold in their feedback and resubmit via exit_plan_mode; if the approval channel is unavailable or aborted, stay in Plan Mode and ask the user to switch modes manually—never start implementing on your own.
|
|
261
256
|
|
|
262
257
|
# ── compaction ──────────────────────────────────────────────────────────────
|
|
263
258
|
|