dsh-plugin-subagent-director 0.5.0-beta.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -1
- package/README.md +20 -2
- package/lib/client/index.js +2 -2
- package/lib/client/locales.js +2 -2
- package/lib/client/locales.js.map +1 -1
- package/package.json +1 -1
- package/lib/close-subagent.d.ts +0 -72
- package/lib/close-subagent.d.ts.map +0 -1
- package/lib/close-subagent.js +0 -74
- package/lib/close-subagent.js.map +0 -1
- package/lib/default-route.d.ts +0 -46
- package/lib/default-route.d.ts.map +0 -1
- package/lib/default-route.js +0 -56
- package/lib/default-route.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,7 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
本项目的所有显著变更都会记录在此文件中。格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循 [SemVer](https://semver.org/lang/zh-CN/)。
|
|
4
4
|
|
|
5
|
-
## [
|
|
5
|
+
## [0.5.0] - 2026-09-04
|
|
6
|
+
|
|
7
|
+
### 变更
|
|
8
|
+
|
|
9
|
+
- **设置页开头说明补充模型选择约束(beta.2)**:`sectionIntro` 增加一行
|
|
10
|
+
「只能选择插件-插件配置-Subagent池里的提供商-模型」(中英双语),设置页打开
|
|
11
|
+
即明确可选 provider/model 仅来自官方 Subagent 插件配置的模型池。
|
|
6
12
|
|
|
7
13
|
### 修复
|
|
8
14
|
|
package/README.md
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
<p align="center">
|
|
6
6
|
<img alt="npm version" src="https://img.shields.io/npm/v/dsh-plugin-subagent-director?label=npm">
|
|
7
7
|
<img alt="license" src="https://img.shields.io/npm/l/dsh-plugin-subagent-director">
|
|
8
|
-
<img alt="DeepSeek Harness" src="https://img.shields.io/badge/DeepSeek%20Harness-0.1.
|
|
8
|
+
<img alt="DeepSeek Harness" src="https://img.shields.io/badge/DeepSeek%20Harness-0.1.2--alpha.4-blue">
|
|
9
9
|
<img alt="Awesome DSH Plugin" src="https://awesome-dsh-plugin.com/badge.svg">
|
|
10
10
|
</p>
|
|
11
11
|
|
|
12
|
-
[English](#english) · [特性](#特性) · [快速开始](#快速开始) · [角色模板](#角色模板) · [术语](#术语) · [开发](#开发) · [FAQ](#faq)
|
|
12
|
+
[English](#english) · [特性](#特性) · [官方选择器适配](#与官方子代理选择器的适配) · [快速开始](#快速开始) · [角色模板](#角色模板) · [术语](#术语) · [开发](#开发) · [FAQ](#faq)
|
|
13
13
|
|
|
14
14
|
---
|
|
15
15
|
|
|
@@ -33,6 +33,22 @@
|
|
|
33
33
|
- **可观测性** —— 打开子代理会话时,composer 下方显示其实际运行的供应商/模型
|
|
34
34
|
(从会话 `request/header` 记录读取真实路由;读不到时优雅降级);
|
|
35
35
|
|
|
36
|
+
## 与官方子代理选择器的适配
|
|
37
|
+
|
|
38
|
+
> **兼容性**:v0.5.0 支持 DSH **0.1.2-alpha.4+**(`alpha4-probe` + real-cordis 探针 278/278 通过,实测 alpha.4/alpha.5 依赖集)。旧版 DSH(0.1.0-rc.6 及更早)请使用最后兼容的 npm 版本 **0.4.0**。
|
|
39
|
+
|
|
40
|
+
DSH alpha.4 起,官方内置 subagent 的模型选择收敛到 `subagent-model-selection` 设置段(`allowedModels` 授权列表)。本插件 v0.5.0 完全适配该机制:
|
|
41
|
+
|
|
42
|
+
- **只从授权列表选择** —— `route-resolver` 把 provider/model 约束在官方
|
|
43
|
+
`subagent-model-selection.allowedModels` 内:显式传入未授权路由为**硬错误**;
|
|
44
|
+
插件默认层 / 角色绑定层的未授权路由被**丢弃并回退继承主代理**;
|
|
45
|
+
- **不再双重写模型路由** —— 移除 rc 时代的 `applyDefaultRoute` 补丁缝,插件与
|
|
46
|
+
官方选择器不会各自覆盖同一条路由(设置面板可选的 provider/model 即官方
|
|
47
|
+
「插件-插件配置-Subagent池」里的选项);
|
|
48
|
+
- **客户端半同步移植** —— 移除 rc 时代对 `@deepseek-ai/dsh-client-runtime/client`
|
|
49
|
+
的全部引用(alpha.4/alpha.5 宿主均不携带该包),dock 读数改读 alpha.4 会话
|
|
50
|
+
`request/header` 记录,设置页在 alpha.4/alpha.5 宿主均可正常加载。
|
|
51
|
+
|
|
36
52
|
## 快速开始
|
|
37
53
|
|
|
38
54
|
### 安装
|
|
@@ -209,4 +225,6 @@ DSH 的 Web API 只向白名单内的 settings 命名空间开放读写。本插
|
|
|
209
225
|
- **Release continuable children** — a model-facing `close_subagent(subagent_id)` tool plus a "Release subagent" button in the subagent session header, freeing resident children through the core `drainContinuableChildren` API;
|
|
210
226
|
- **Observability** — the addressed subagent’s actual provider/model shown under the composer, read from the session’s `request/header` records (graceful degradation when no run is recorded yet).
|
|
211
227
|
|
|
228
|
+
**Official subagent selector adaptation (v0.5.0+)** — since DSH alpha.4 the built-in subagent constrains model selection to the official `subagent-model-selection` allowlist (`allowedModels`). v0.5.0 aligns with it: routes are selected only from the allowlist (unauthorized explicit routes hard-fail; unauthorized default/role routes are dropped and fall back to inheritance), the rc-era `applyDefaultRoute` patch seam is removed (no double-writing of model routes with the official selector), and the client half no longer references the rc-era `dsh-client-runtime` package. **Compatibility**: v0.5.0 targets DSH **0.1.2-alpha.4+**; for older DSH releases use npm version **0.4.0**.
|
|
229
|
+
|
|
212
230
|
**Install** — `dsh plugin --profile <name> add dsh-plugin-subagent-director` mounts the main and bridge entries automatically from the package's bundle patch (`cordis.patch.yml`); optionally override the main entry's config in your profile's cordis.patch.yml (see the Chinese section above). License: MIT.
|
package/lib/client/index.js
CHANGED
|
@@ -35,7 +35,7 @@ window.__ModuleLoader__.load({
|
|
|
35
35
|
/** English dictionary ($subagentDirector). */
|
|
36
36
|
const en = {
|
|
37
37
|
"nav": "Subagent Director",
|
|
38
|
-
"sectionIntro": "Choose the LLM provider and model each subagent uses, and define role templates that bind a model and persona to a delegation.",
|
|
38
|
+
"sectionIntro": "Choose the LLM provider and model each subagent uses, and define role templates that bind a model and persona to a delegation. Only providers/models from the Subagent pool in plugin config (Plugins → Plugin Config → Subagent) can be selected.",
|
|
39
39
|
"defaultsHeading": "Default model",
|
|
40
40
|
"defaultsHint": "Used when a call or role does not name a provider/model.",
|
|
41
41
|
"noAllowedModels": "No authorized models yet. Select models in the official Subagent model-selection list (plugin settings → Subagent); picks here are limited to that list.",
|
|
@@ -106,7 +106,7 @@ window.__ModuleLoader__.load({
|
|
|
106
106
|
/** Chinese dictionary. */
|
|
107
107
|
const zh = {
|
|
108
108
|
"nav": "子代理导演",
|
|
109
|
-
"sectionIntro": "为每个子代理选择 LLM 供应商与模型,并以角色模板把模型与 persona
|
|
109
|
+
"sectionIntro": "为每个子代理选择 LLM 供应商与模型,并以角色模板把模型与 persona 绑定到每次委派。只能选择插件-插件配置-Subagent池里的提供商-模型。",
|
|
110
110
|
"defaultsHeading": "默认模型",
|
|
111
111
|
"defaultsHint": "当某次调用或角色未指定供应商/模型时使用。",
|
|
112
112
|
"noAllowedModels": "尚未配置已授权的模型。请先在官方 Subagent 模型选择列表(插件设置 → Subagent)中选择模型;此处只能从该列表中选择。",
|
package/lib/client/locales.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
/** English dictionary ($subagentDirector). */
|
|
8
8
|
export const en = {
|
|
9
9
|
"nav": "Subagent Director",
|
|
10
|
-
"sectionIntro": "Choose the LLM provider and model each subagent uses, and define role templates that bind a model and persona to a delegation.",
|
|
10
|
+
"sectionIntro": "Choose the LLM provider and model each subagent uses, and define role templates that bind a model and persona to a delegation. Only providers/models from the Subagent pool in plugin config (Plugins \u2192 Plugin Config \u2192 Subagent) can be selected.",
|
|
11
11
|
"defaultsHeading": "Default model",
|
|
12
12
|
"defaultsHint": "Used when a call or role does not name a provider/model.",
|
|
13
13
|
"noAllowedModels": "No authorized models yet. Select models in the official Subagent model-selection list (plugin settings \u2192 Subagent); picks here are limited to that list.",
|
|
@@ -78,7 +78,7 @@ export const en = {
|
|
|
78
78
|
/** Chinese dictionary. */
|
|
79
79
|
export const zh = {
|
|
80
80
|
"nav": "子代理导演",
|
|
81
|
-
"sectionIntro": "为每个子代理选择 LLM 供应商与模型,并以角色模板把模型与 persona
|
|
81
|
+
"sectionIntro": "为每个子代理选择 LLM 供应商与模型,并以角色模板把模型与 persona 绑定到每次委派。只能选择插件-插件配置-Subagent池里的提供商-模型。",
|
|
82
82
|
"defaultsHeading": "默认模型",
|
|
83
83
|
"defaultsHint": "当某次调用或角色未指定供应商/模型时使用。",
|
|
84
84
|
"noAllowedModels": "尚未配置已授权的模型。请先在官方 Subagent 模型选择列表(插件设置 → Subagent)中选择模型;此处只能从该列表中选择。",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locales.js","sourceRoot":"","sources":["../../src/client/locales.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyEH,8CAA8C;AAC9C,MAAM,CAAC,MAAM,EAAE,GAAwC;IACrD,KAAK,EAAE,mBAAmB;IAC1B,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"locales.js","sourceRoot":"","sources":["../../src/client/locales.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-plugin-subagent-director",
|
|
3
|
-
"version": "0.5.0
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Subagent Director: choose an LLM provider/model for each subagent (call args > role binding > plugin default > inherit parent) and plan main-agent/subagent responsibilities with role templates, plus a settings UI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
package/lib/close-subagent.d.ts
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* close_subagent lifecycle tool (issue #1).
|
|
3
|
-
*
|
|
4
|
-
* A model-facing tool that lets the calling agent close/release one resident
|
|
5
|
-
* continuable subagent it started: a thin adapter over
|
|
6
|
-
* ctx.subagents.drainContinuableChildren(parent, [subagent_id]), mirroring how
|
|
7
|
-
* the core's interrupt_agent adapts ctx.subagents.interrupt() (see
|
|
8
|
-
* @deepseek-ai/dsh-tool-subagent-control). Lifecycle authority stays with the
|
|
9
|
-
* subagent service — the tool only forwards the exact calling agent as the
|
|
10
|
-
* parent and performs no routing of its own.
|
|
11
|
-
*
|
|
12
|
-
* Semantics (documented by drainContinuableChildren): absent targets and a
|
|
13
|
-
* manager-less composition are accepted no-ops; a resident child owned by a
|
|
14
|
-
* different parent is rejected with a SubagentError `UNAUTHORIZED`. Unlike
|
|
15
|
-
* interrupt_agent this is teardown: the released child no longer stays
|
|
16
|
-
* resident and cannot be resumed with send_message afterwards, so its memory
|
|
17
|
-
* and session context are freed before the parent session ends.
|
|
18
|
-
*
|
|
19
|
-
* The tool is registered unconditionally (like the core control tools) —
|
|
20
|
-
* drainContinuableChildren is a no-op in one-shot compositions — and
|
|
21
|
-
* registerCloseSubagent guards against duplicate registration so several
|
|
22
|
-
* plugin instances (distinct toolName) share one close_subagent.
|
|
23
|
-
*/
|
|
24
|
-
import type { Context } from '@deepseek-ai/cordis';
|
|
25
|
-
import { type ToolDefinition } from '@deepseek-ai/dsh-tools';
|
|
26
|
-
/** The canonical model-visible tool name (mirrors interrupt_agent naming). */
|
|
27
|
-
export declare const CLOSE_SUBAGENT_TOOL_NAME = "close_subagent";
|
|
28
|
-
/** The model-facing arguments: the durable id of the continuable child to release. */
|
|
29
|
-
export interface CloseSubagentArgs {
|
|
30
|
-
/** The subagent id returned when the background subagent was started. */
|
|
31
|
-
subagent_id: string;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Build the model-facing parameter schema. Exposed as a pure function so unit
|
|
35
|
-
* tests can assert the model-visible shape without a live context. The literal
|
|
36
|
-
* return type (via `satisfies`) lets defineTool infer the validated args shape.
|
|
37
|
-
*/
|
|
38
|
-
export declare function createCloseSubagentParameters(): {
|
|
39
|
-
subagent_id: {
|
|
40
|
-
type: "string";
|
|
41
|
-
required: true;
|
|
42
|
-
description: string;
|
|
43
|
-
};
|
|
44
|
-
};
|
|
45
|
-
/** The model-facing output schema: a closed object confirming the release. */
|
|
46
|
-
export declare function createCloseSubagentOutputSchema(): {
|
|
47
|
-
type: "object";
|
|
48
|
-
additionalProperties: false;
|
|
49
|
-
properties: {
|
|
50
|
-
closed: {
|
|
51
|
-
type: "boolean";
|
|
52
|
-
required: true;
|
|
53
|
-
};
|
|
54
|
-
};
|
|
55
|
-
};
|
|
56
|
-
/** Pure renderer for a close_subagent result (extracted for unit testing). */
|
|
57
|
-
export declare function renderCloseResult(args: CloseSubagentArgs, _value: unknown): string;
|
|
58
|
-
/**
|
|
59
|
-
* Create the close_subagent ToolDefinition for one mounted context. execute
|
|
60
|
-
* releases the named resident continuable direct child of the exact calling
|
|
61
|
-
* agent via ctx.subagents.drainContinuableChildren; the service authorizes the
|
|
62
|
-
* exact live caller, so the tool adds no authority of its own.
|
|
63
|
-
*/
|
|
64
|
-
export declare function createCloseSubagentTool(ctx: Context): ToolDefinition;
|
|
65
|
-
/**
|
|
66
|
-
* Register close_subagent once per context. Returns the registry disposer, or
|
|
67
|
-
* undefined when a tool with the same name is already registered (a second
|
|
68
|
-
* plugin instance with a distinct delegation toolName must not double-register
|
|
69
|
-
* the shared control tool).
|
|
70
|
-
*/
|
|
71
|
-
export declare function registerCloseSubagent(ctx: Context): (() => void) | undefined;
|
|
72
|
-
//# sourceMappingURL=close-subagent.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"close-subagent.d.ts","sourceRoot":"","sources":["../src/close-subagent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAwC,KAAK,cAAc,EAAwB,MAAM,wBAAwB,CAAC;AAEzH,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,mBAAmB,CAAC;AAKzD,sFAAsF;AACtF,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B;;;;;;EAQ5C;AAED,8EAA8E;AAC9E,wBAAgB,+BAA+B;;;;;;;;;EAQ9C;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAElF;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CAqBpE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAG5E"}
|
package/lib/close-subagent.js
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { SessionId } from '@deepseek-ai/dsh-session';
|
|
2
|
-
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
3
|
-
/** The canonical model-visible tool name (mirrors interrupt_agent naming). */
|
|
4
|
-
export const CLOSE_SUBAGENT_TOOL_NAME = 'close_subagent';
|
|
5
|
-
/** The canonical error prefix used across structured failures (FR-8.1 convention). */
|
|
6
|
-
const ERROR_PREFIX = 'subagent-director:';
|
|
7
|
-
/**
|
|
8
|
-
* Build the model-facing parameter schema. Exposed as a pure function so unit
|
|
9
|
-
* tests can assert the model-visible shape without a live context. The literal
|
|
10
|
-
* return type (via `satisfies`) lets defineTool infer the validated args shape.
|
|
11
|
-
*/
|
|
12
|
-
export function createCloseSubagentParameters() {
|
|
13
|
-
return {
|
|
14
|
-
subagent_id: {
|
|
15
|
-
type: 'string',
|
|
16
|
-
required: true,
|
|
17
|
-
description: 'The subagent id returned when the background subagent was started (see list_agents for resident ids).',
|
|
18
|
-
},
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
/** The model-facing output schema: a closed object confirming the release. */
|
|
22
|
-
export function createCloseSubagentOutputSchema() {
|
|
23
|
-
return {
|
|
24
|
-
type: 'object',
|
|
25
|
-
additionalProperties: false,
|
|
26
|
-
properties: {
|
|
27
|
-
closed: { type: 'boolean', required: true },
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
/** Pure renderer for a close_subagent result (extracted for unit testing). */
|
|
32
|
-
export function renderCloseResult(args, _value) {
|
|
33
|
-
return `closed subagent ${args.subagent_id}`;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Create the close_subagent ToolDefinition for one mounted context. execute
|
|
37
|
-
* releases the named resident continuable direct child of the exact calling
|
|
38
|
-
* agent via ctx.subagents.drainContinuableChildren; the service authorizes the
|
|
39
|
-
* exact live caller, so the tool adds no authority of its own.
|
|
40
|
-
*/
|
|
41
|
-
export function createCloseSubagentTool(ctx) {
|
|
42
|
-
return defineTool({
|
|
43
|
-
name: CLOSE_SUBAGENT_TOOL_NAME,
|
|
44
|
-
description: 'Close/release a resident continuable subagent by its subagent id, freeing its memory and session context. ' +
|
|
45
|
-
'The target must be a direct continuable child of the exact calling agent: absent or already-released ids are accepted no-ops, ' +
|
|
46
|
-
'and a resident child owned by another parent is rejected. ' +
|
|
47
|
-
'This is teardown, not interrupt — the released child no longer stays resident and cannot be resumed with `send_message` afterwards. ' +
|
|
48
|
-
'Use `list_agents` to see which subagents are still resident.',
|
|
49
|
-
parameters: createCloseSubagentParameters(),
|
|
50
|
-
output: {
|
|
51
|
-
schema: createCloseSubagentOutputSchema(),
|
|
52
|
-
render: (args, value) => [{ type: 'text', text: renderCloseResult(args, value) }],
|
|
53
|
-
},
|
|
54
|
-
async execute(args, exec) {
|
|
55
|
-
const parent = exec.agent;
|
|
56
|
-
if (!parent)
|
|
57
|
-
throw new Error(`${ERROR_PREFIX} close_subagent requires a calling agent (exec.agent was undefined)`);
|
|
58
|
-
await ctx.subagents.drainContinuableChildren(parent, [SessionId(args.subagent_id)]);
|
|
59
|
-
return { closed: true };
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Register close_subagent once per context. Returns the registry disposer, or
|
|
65
|
-
* undefined when a tool with the same name is already registered (a second
|
|
66
|
-
* plugin instance with a distinct delegation toolName must not double-register
|
|
67
|
-
* the shared control tool).
|
|
68
|
-
*/
|
|
69
|
-
export function registerCloseSubagent(ctx) {
|
|
70
|
-
if (ctx.tools.get(CLOSE_SUBAGENT_TOOL_NAME) !== undefined)
|
|
71
|
-
return undefined;
|
|
72
|
-
return ctx.tools.register(createCloseSubagentTool(ctx));
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=close-subagent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"close-subagent.js","sourceRoot":"","sources":["../src/close-subagent.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,UAAU,EAAuE,MAAM,wBAAwB,CAAC;AAEzH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,wBAAwB,GAAG,gBAAgB,CAAC;AAEzD,sFAAsF;AACtF,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAQ1C;;;;GAIG;AACH,MAAM,UAAU,6BAA6B;IAC3C,OAAO;QACL,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,uGAAuG;SACrH;KAC4B,CAAC;AAClC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,+BAA+B;IAC7C,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,oBAAoB,EAAE,KAAK;QAC3B,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;SAC5C;KACwB,CAAC;AAC9B,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,iBAAiB,CAAC,IAAuB,EAAE,MAAe;IACxE,OAAO,mBAAmB,IAAI,CAAC,WAAW,EAAE,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAY;IAClD,OAAO,UAAU,CAAC;QAChB,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EACT,4GAA4G;YAC5G,gIAAgI;YAChI,4DAA4D;YAC5D,sIAAsI;YACtI,8DAA8D;QAChE,UAAU,EAAE,6BAA6B,EAAE;QAC3C,MAAM,EAAE;YACN,MAAM,EAAE,+BAA+B,EAAE;YACzC,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,CAAC,IAAyB,EAAE,KAAK,CAAC,EAAE,CAAC;SACvG;QACD,KAAK,CAAC,OAAO,CAAC,IAAuB,EAAE,IAAI;YACzC,MAAM,MAAM,GAAsB,IAAI,CAAC,KAAK,CAAC;YAC7C,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,YAAY,qEAAqE,CAAC,CAAC;YACnH,MAAM,GAAG,CAAC,SAAS,CAAC,wBAAwB,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YACpF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAY;IAChD,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5E,OAAO,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,CAAC"}
|
package/lib/default-route.d.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default route seam (design: 默认模型兜底).
|
|
3
|
-
*
|
|
4
|
-
* Makes the plugin's configured `defaultProvider`/`defaultModel` apply to ANY
|
|
5
|
-
* subagent start that did not carry an explicit `agentOptions` — including
|
|
6
|
-
* starts initiated by the built-in `subagent` / `subagent_fork` tools, not just
|
|
7
|
-
* the plugin's own `subagent_role`. This closes the gap where the model picks
|
|
8
|
-
* the built-in tool and the configured defaults never take effect.
|
|
9
|
-
*
|
|
10
|
-
* Layering: explicit `agentOptions` (even partial) always wins; the seam is a
|
|
11
|
-
* best-effort default. An un-routable default provider falls back to
|
|
12
|
-
* inheritance and never throws, so a bad default cannot break built-in
|
|
13
|
-
* delegation; the strict `fallbackOnInvalid` error semantics remain the
|
|
14
|
-
* property of `subagent_role`'s explicit path (route-resolver.ts).
|
|
15
|
-
*/
|
|
16
|
-
import type { AgentOptions } from '@deepseek-ai/dsh-agent';
|
|
17
|
-
import type { ContinuableStart, ContinuableStartSpec, SubagentRun, SubagentStartRequest } from '@deepseek-ai/dsh-subagent';
|
|
18
|
-
import type { SubagentDirectorSettings } from './route-resolver.js';
|
|
19
|
-
export interface SeamResolveInput {
|
|
20
|
-
agentOptions?: AgentOptions;
|
|
21
|
-
settings: SubagentDirectorSettings;
|
|
22
|
-
isRoutable?: (provider: string) => boolean;
|
|
23
|
-
}
|
|
24
|
-
export declare function resolveSeamAgentOptions(input: SeamResolveInput): Pick<AgentOptions, 'provider' | 'model'> | undefined;
|
|
25
|
-
/** The subset of the subagent service the seam wraps. */
|
|
26
|
-
export interface SubagentsSeam {
|
|
27
|
-
start(name: string, request: SubagentStartRequest): Promise<SubagentRun>;
|
|
28
|
-
startContinuable(spec: ContinuableStartSpec): Promise<ContinuableStart>;
|
|
29
|
-
}
|
|
30
|
-
/** Structural context the seam needs; keeps the wrapper unit-testable. */
|
|
31
|
-
export interface DefaultRouteSeamContext {
|
|
32
|
-
get(name: string): unknown;
|
|
33
|
-
logger: {
|
|
34
|
-
info(message: string): void;
|
|
35
|
-
warn(message: string): void;
|
|
36
|
-
};
|
|
37
|
-
subagents: SubagentsSeam;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Wrap `ctx.subagents.start` / `startContinuable` so a subagent start without
|
|
41
|
-
* explicit `agentOptions` receives the configured defaults. Returns a disposer
|
|
42
|
-
* that restores the original methods (registered via `ctx.effect` by the
|
|
43
|
-
* caller, so it runs when the plugin fiber unloads).
|
|
44
|
-
*/
|
|
45
|
-
export declare function applyDefaultRouteSeam(ctx: DefaultRouteSeamContext, getSettings: () => SubagentDirectorSettings): () => void;
|
|
46
|
-
//# sourceMappingURL=default-route.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"default-route.d.ts","sourceRoot":"","sources":["../src/default-route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACpB,WAAW,EACX,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,QAAQ,EAAE,wBAAwB,CAAC;IACnC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CAC5C;AAMD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,SAAS,CAUrH;AAED,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACzE,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACzE;AAED,0EAA0E;AAC1E,MAAM,WAAW,uBAAuB;IACtC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,MAAM,EAAE;QAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACrE,SAAS,EAAE,aAAa,CAAC;CAC1B;AAQD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,uBAAuB,EAC5B,WAAW,EAAE,MAAM,wBAAwB,GAC1C,MAAM,IAAI,CAmCZ"}
|
package/lib/default-route.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
function isEmpty(value) {
|
|
2
|
-
return value === undefined || value === '';
|
|
3
|
-
}
|
|
4
|
-
export function resolveSeamAgentOptions(input) {
|
|
5
|
-
const { agentOptions, settings, isRoutable } = input;
|
|
6
|
-
if (agentOptions !== undefined && (agentOptions.provider !== undefined || agentOptions.model !== undefined)) {
|
|
7
|
-
return undefined;
|
|
8
|
-
}
|
|
9
|
-
const provider = settings.defaultProvider;
|
|
10
|
-
const model = settings.defaultModel;
|
|
11
|
-
if (isEmpty(provider) || isEmpty(model))
|
|
12
|
-
return undefined;
|
|
13
|
-
if (isRoutable !== undefined && !isRoutable(provider))
|
|
14
|
-
return undefined;
|
|
15
|
-
return { provider, model };
|
|
16
|
-
}
|
|
17
|
-
function makeIsRoutable(ctx) {
|
|
18
|
-
const llm = ctx.get('llm');
|
|
19
|
-
if (llm === undefined)
|
|
20
|
-
return undefined;
|
|
21
|
-
return (provider) => llm.listProviders().some((entry) => entry.id === provider);
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Wrap `ctx.subagents.start` / `startContinuable` so a subagent start without
|
|
25
|
-
* explicit `agentOptions` receives the configured defaults. Returns a disposer
|
|
26
|
-
* that restores the original methods (registered via `ctx.effect` by the
|
|
27
|
-
* caller, so it runs when the plugin fiber unloads).
|
|
28
|
-
*/
|
|
29
|
-
export function applyDefaultRouteSeam(ctx, getSettings) {
|
|
30
|
-
const subagents = ctx.subagents;
|
|
31
|
-
const originalStart = subagents.start;
|
|
32
|
-
const originalStartContinuable = subagents.startContinuable;
|
|
33
|
-
const isRoutable = makeIsRoutable(ctx);
|
|
34
|
-
const resolve = (request) => resolveSeamAgentOptions({ agentOptions: request.agentOptions, settings: getSettings(), isRoutable });
|
|
35
|
-
subagents.start = (name, request) => {
|
|
36
|
-
const agentOptions = resolve(request);
|
|
37
|
-
if (agentOptions !== undefined) {
|
|
38
|
-
ctx.logger.info(`[subagent-director] default route seam: applying ${agentOptions.provider}/${agentOptions.model} to ${name} subagent`);
|
|
39
|
-
return originalStart.call(subagents, name, { ...request, agentOptions });
|
|
40
|
-
}
|
|
41
|
-
return originalStart.call(subagents, name, request);
|
|
42
|
-
};
|
|
43
|
-
subagents.startContinuable = (spec) => {
|
|
44
|
-
const agentOptions = resolve(spec.request);
|
|
45
|
-
if (agentOptions !== undefined) {
|
|
46
|
-
ctx.logger.info(`[subagent-director] default route seam: applying ${agentOptions.provider}/${agentOptions.model} to continuable subagent`);
|
|
47
|
-
return originalStartContinuable.call(subagents, { ...spec, request: { ...spec.request, agentOptions } });
|
|
48
|
-
}
|
|
49
|
-
return originalStartContinuable.call(subagents, spec);
|
|
50
|
-
};
|
|
51
|
-
return () => {
|
|
52
|
-
subagents.start = originalStart;
|
|
53
|
-
subagents.startContinuable = originalStartContinuable;
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=default-route.js.map
|
package/lib/default-route.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"default-route.js","sourceRoot":"","sources":["../src/default-route.ts"],"names":[],"mappings":"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"}
|