@aalis/plugin-subtask 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +659 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# @aalis/plugin-subtask
|
|
2
|
+
|
|
3
|
+
子任务能力。注册 `subtask` 工具组(create_subtask / check_subtask / send_to_subtask / delete_subtask / wait_subtasks),并通过 agent 中间件实现父/子会话的上下文注入与自动完成。
|
|
4
|
+
|
|
5
|
+
详见 [docs/plugins/plugin-subtask.md](../../docs/plugins/plugin-subtask.md)。
|
|
6
|
+
|
|
7
|
+
## 安装
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pnpm add @aalis/plugin-subtask
|
|
11
|
+
```
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ConfigSchema, Context } from '@aalis/core';
|
|
2
|
+
import '@aalis/plugin-agent-api';
|
|
3
|
+
import '@aalis/plugin-tools-api';
|
|
4
|
+
export declare const name = "@aalis/plugin-subtask";
|
|
5
|
+
export declare const displayName = "\u5B50\u4EFB\u52A1";
|
|
6
|
+
export declare const subsystem = "session";
|
|
7
|
+
export declare const inject: {
|
|
8
|
+
optional: string[];
|
|
9
|
+
};
|
|
10
|
+
export declare const configSchema: ConfigSchema;
|
|
11
|
+
export declare function apply(ctx: Context, config: Record<string, unknown>): void;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAKzD,OAAO,yBAAyB,CAAC;AACjC,OAAO,yBAAyB,CAAC;AAqBjC,eAAO,MAAM,IAAI,0BAA0B,CAAC;AAC5C,eAAO,MAAM,WAAW,uBAAQ,CAAC;AACjC,eAAO,MAAM,SAAS,YAAY,CAAC;AACnC,eAAO,MAAM,MAAM;;CAElB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,YAgB1B,CAAC;AAsBF,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAsoBzE"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,659 @@
|
|
|
1
|
+
import { useToolService } from '@aalis/plugin-tools-api';
|
|
2
|
+
import '@aalis/plugin-agent-api';
|
|
3
|
+
import '@aalis/plugin-tools-api';
|
|
4
|
+
// =====================================================================
|
|
5
|
+
// plugin-subtask —— 派发并行子会话(独立 sessionId 的子 agent)
|
|
6
|
+
//
|
|
7
|
+
// 与相邻插件的职责区分(不冲突,可组合):
|
|
8
|
+
// - plugin-workflow:声明式 DAG,编排可被回放/版本化的多步流程
|
|
9
|
+
// - plugin-todo-list:单会话内的"步骤列表",给 agent 自己规划用
|
|
10
|
+
// - plugin-subtask :跨会话的并行子 agent,适合「拆分独立调研任务」
|
|
11
|
+
// - plugin-skills :可加载的提示词模板,正交,可在子任务里继续使用
|
|
12
|
+
//
|
|
13
|
+
// 推荐协作模式:
|
|
14
|
+
// 1. 父会话 manage_todo_list 列出大步骤
|
|
15
|
+
// 2. 对独立可并行的子任务 create_subtask × N(可指定轻量 model 省 token)
|
|
16
|
+
// 3. wait_subtasks 阻塞等待
|
|
17
|
+
// 4. 父会话整合 → manage_todo_list 标记完成
|
|
18
|
+
// 子会话内可自行再用 manage_todo_list / load_skill / workflow_run 等工具。
|
|
19
|
+
// =====================================================================
|
|
20
|
+
// ===== 插件元数据 =====
|
|
21
|
+
export const name = '@aalis/plugin-subtask';
|
|
22
|
+
export const displayName = '子任务';
|
|
23
|
+
export const subsystem = 'session';
|
|
24
|
+
export const inject = {
|
|
25
|
+
optional: ['session-manager', 'message-archive'],
|
|
26
|
+
};
|
|
27
|
+
export const configSchema = {
|
|
28
|
+
enabled: { type: 'boolean', label: '启用子任务工具', default: true },
|
|
29
|
+
pollIntervalMs: { type: 'number', label: '等待轮询间隔 (ms)', default: 3000 },
|
|
30
|
+
maxWaitMs: { type: 'number', label: '单次等待最大时长 (ms)', default: 300000 },
|
|
31
|
+
defaultProvider: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
label: '子任务默认 LLM provider',
|
|
34
|
+
default: '',
|
|
35
|
+
description: '不填则继承父会话。建议填轻量本地模型(如 ollama)让子任务跑在更便宜的模型上,节省 token',
|
|
36
|
+
},
|
|
37
|
+
defaultModel: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
label: '子任务默认模型名',
|
|
40
|
+
default: '',
|
|
41
|
+
description: '与 defaultProvider 配套。例如 qwen3:8b、deepseek-chat。两个都不填则继承父会话模型。',
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
function resolveConfig(raw) {
|
|
45
|
+
return {
|
|
46
|
+
enabled: raw.enabled !== false,
|
|
47
|
+
pollIntervalMs: Number(raw.pollIntervalMs) || 3000,
|
|
48
|
+
maxWaitMs: Number(raw.maxWaitMs) || 300000,
|
|
49
|
+
defaultProvider: String(raw.defaultProvider ?? '').trim(),
|
|
50
|
+
defaultModel: String(raw.defaultModel ?? '').trim(),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// ===== 插件入口 =====
|
|
54
|
+
export function apply(ctx, config) {
|
|
55
|
+
const cfg = resolveConfig(config);
|
|
56
|
+
if (!cfg.enabled)
|
|
57
|
+
return;
|
|
58
|
+
// 注册工具分组
|
|
59
|
+
useToolService(ctx).registerGroup({
|
|
60
|
+
name: 'subtask',
|
|
61
|
+
label: '子任务管理',
|
|
62
|
+
description: '创建、管理和协调子任务会话,支持并行执行',
|
|
63
|
+
});
|
|
64
|
+
// ---- create_subtask ----
|
|
65
|
+
useToolService(ctx).register({
|
|
66
|
+
groups: ['subtask'],
|
|
67
|
+
definition: {
|
|
68
|
+
type: 'function',
|
|
69
|
+
function: {
|
|
70
|
+
name: 'create_subtask',
|
|
71
|
+
description: [
|
|
72
|
+
'创建一个子任务会话并异步派发任务。子任务将在独立会话中并行执行,不阻塞当前会话。',
|
|
73
|
+
'返回子任务 ID,后续可用 check_subtask 查询状态或 wait_subtasks 等待完成。',
|
|
74
|
+
'你可以连续调用多次 create_subtask 来创建多个并行子任务。',
|
|
75
|
+
'',
|
|
76
|
+
'【重要协作规范】',
|
|
77
|
+
'1. 创建子任务前,先用 manage_todo_list 列出计划,包含"创建子任务"和"等待子任务完成"两步',
|
|
78
|
+
'2. 共享文档协作:如果多个子任务需要操作同一个文档(如 PPT、Word、Excel),先在主会话中创建文档拿到 docId,然后在 task 中明确告知子任务该 docId——子任务会直接操作同一文档,无需各自创建',
|
|
79
|
+
'3. task 描述中应包含:(a) 具体任务内容 (b) 需要使用的共享资源 ID(如 docId)(c) 子任务负责的范围(如"负责第3-4张幻灯片")',
|
|
80
|
+
'4. 创建完所有子任务后,必须立即调用 wait_subtasks 等待结果,不要在未等待的情况下继续主任务',
|
|
81
|
+
'5. 子任务无法调用 create_subtask(不可嵌套);保持 save 操作在主会话中执行',
|
|
82
|
+
'',
|
|
83
|
+
'【模型选择】可选 provider+model 参数为子任务指定更便宜/轻量的模型:',
|
|
84
|
+
'- 适合轻量模型的任务:语法检查、格式转换、摄取信息、翻译、简单总结、文档快速审阅',
|
|
85
|
+
'- 依然需要父同模型的任务:复杂推理、多步规划、代码生成、独立决策',
|
|
86
|
+
'- 不填则使用插件默认子任务模型,都未配置则继承父会话',
|
|
87
|
+
].join('\n'),
|
|
88
|
+
parameters: {
|
|
89
|
+
type: 'object',
|
|
90
|
+
properties: {
|
|
91
|
+
task: {
|
|
92
|
+
type: 'string',
|
|
93
|
+
description: '要派发给子任务的详细任务描述/指令',
|
|
94
|
+
},
|
|
95
|
+
name: {
|
|
96
|
+
type: 'string',
|
|
97
|
+
description: '子任务显示名称(可选,默认自动生成)',
|
|
98
|
+
},
|
|
99
|
+
provider: {
|
|
100
|
+
type: 'string',
|
|
101
|
+
description: '可选:为子任务指定 LLM provider(如 ollama 、 deepseek)。与 model 配套使用,二者同填才会生效。',
|
|
102
|
+
},
|
|
103
|
+
model: {
|
|
104
|
+
type: 'string',
|
|
105
|
+
description: '可选:为子任务指定 model 名称(如 qwen3:8b、deepseek-chat)。二者同填才会生效;未填则使用插件默认或父会话模型。',
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
required: ['task'],
|
|
109
|
+
additionalProperties: false,
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
handler: async (args, callCtx) => {
|
|
114
|
+
const sm = ctx.getService('session-manager');
|
|
115
|
+
if (!sm)
|
|
116
|
+
return JSON.stringify({ error: 'session-manager 服务不可用' });
|
|
117
|
+
const task = String(args.task || '');
|
|
118
|
+
if (!task)
|
|
119
|
+
return JSON.stringify({ error: '缺少任务描述' });
|
|
120
|
+
const parentId = callCtx.sessionId;
|
|
121
|
+
// 防止子任务嵌套创建子任务
|
|
122
|
+
const parentSession = sm.getSession(parentId);
|
|
123
|
+
if (parentSession?.parentId) {
|
|
124
|
+
return JSON.stringify({ error: '子任务中不能再创建子任务。请直接完成当前任务,由父会话负责任务拆分和协调。' });
|
|
125
|
+
}
|
|
126
|
+
const taskName = args.name
|
|
127
|
+
? String(args.name)
|
|
128
|
+
: `子任务 ${new Date().toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' })}`;
|
|
129
|
+
try {
|
|
130
|
+
// 子会话复制父会话的 resolved config
|
|
131
|
+
const inheritedConfig = sm.resolveConfig(parentId, callCtx.platform);
|
|
132
|
+
// 模型优先级:工具参数 > 插件默认 > 父会话继承
|
|
133
|
+
// 仅当 provider 和 model 同时提供才覆盖,避免半填产生歧义
|
|
134
|
+
const argProvider = String(args.provider ?? '').trim();
|
|
135
|
+
const argModel = String(args.model ?? '').trim();
|
|
136
|
+
let llmOverride;
|
|
137
|
+
if (argProvider && argModel) {
|
|
138
|
+
llmOverride = { provider: argProvider, model: argModel };
|
|
139
|
+
}
|
|
140
|
+
else if (cfg.defaultProvider && cfg.defaultModel) {
|
|
141
|
+
llmOverride = { provider: cfg.defaultProvider, model: cfg.defaultModel };
|
|
142
|
+
}
|
|
143
|
+
const childConfig = llmOverride ? { ...inheritedConfig, llm: llmOverride } : { ...inheritedConfig };
|
|
144
|
+
// 创建子会话(存储 platform 用于后续自动触发)
|
|
145
|
+
const child = await sm.createChildSession(parentId, {
|
|
146
|
+
name: taskName,
|
|
147
|
+
createdBy: 'agent',
|
|
148
|
+
inputContext: task,
|
|
149
|
+
config: childConfig,
|
|
150
|
+
metadata: { platform: callCtx.platform || 'internal', title: taskName },
|
|
151
|
+
});
|
|
152
|
+
// 异步派发任务消息,触发 agent 处理(不等待完成)
|
|
153
|
+
ctx
|
|
154
|
+
.emit('inbound:message', {
|
|
155
|
+
content: task,
|
|
156
|
+
sessionId: child.id,
|
|
157
|
+
platform: callCtx.platform || 'internal',
|
|
158
|
+
userId: `parent:${parentId}`,
|
|
159
|
+
nickname: undefined,
|
|
160
|
+
})
|
|
161
|
+
.catch(err => {
|
|
162
|
+
ctx.logger.warn(`子任务消息派发失败 (${child.id}):`, err);
|
|
163
|
+
});
|
|
164
|
+
return JSON.stringify({
|
|
165
|
+
subtaskId: child.id,
|
|
166
|
+
name: taskName,
|
|
167
|
+
status: 'active',
|
|
168
|
+
message: `子任务 "${taskName}" 已创建并开始执行`,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
return JSON.stringify({ error: `创建子任务失败: ${err instanceof Error ? err.message : String(err)}` });
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
// ---- check_subtask ----
|
|
177
|
+
useToolService(ctx).register({
|
|
178
|
+
groups: ['subtask'],
|
|
179
|
+
definition: {
|
|
180
|
+
type: 'function',
|
|
181
|
+
function: {
|
|
182
|
+
name: 'check_subtask',
|
|
183
|
+
description: [
|
|
184
|
+
'查询一个或多个子任务的当前状态和结果。',
|
|
185
|
+
'返回每个子任务的状态(active=进行中, completed=已完成, error=出错)、结果摘要等。',
|
|
186
|
+
'如果有子任务状态为 error,可使用 send_to_subtask 重新发送指令让其重试。',
|
|
187
|
+
].join('\n'),
|
|
188
|
+
parameters: {
|
|
189
|
+
type: 'object',
|
|
190
|
+
properties: {
|
|
191
|
+
subtask_ids: {
|
|
192
|
+
type: 'array',
|
|
193
|
+
items: { type: 'string' },
|
|
194
|
+
description: '要查询的子任务 ID 列表',
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
required: ['subtask_ids'],
|
|
198
|
+
additionalProperties: false,
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
handler: async (args) => {
|
|
203
|
+
const sm = ctx.getService('session-manager');
|
|
204
|
+
if (!sm)
|
|
205
|
+
return JSON.stringify({ error: 'session-manager 服务不可用' });
|
|
206
|
+
const ids = args.subtask_ids || [];
|
|
207
|
+
if (ids.length === 0) {
|
|
208
|
+
return JSON.stringify({
|
|
209
|
+
error: '缺少 subtask_ids 参数。正确用法: { "subtask_ids": ["<子任务ID1>", "<子任务ID2>"] }',
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
const results = ids.map(id => {
|
|
213
|
+
const session = sm.getSession(id);
|
|
214
|
+
if (!session)
|
|
215
|
+
return { id, error: '会话不存在' };
|
|
216
|
+
const statusLabel = session.status === 'active'
|
|
217
|
+
? '进行中'
|
|
218
|
+
: session.status === 'completed'
|
|
219
|
+
? '已完成'
|
|
220
|
+
: session.status === 'error'
|
|
221
|
+
? '出错'
|
|
222
|
+
: session.status;
|
|
223
|
+
return {
|
|
224
|
+
id,
|
|
225
|
+
name: session.name,
|
|
226
|
+
status: session.status,
|
|
227
|
+
statusLabel,
|
|
228
|
+
result: session.result || null,
|
|
229
|
+
inputContext: session.inputContext || null,
|
|
230
|
+
};
|
|
231
|
+
});
|
|
232
|
+
const summary = {
|
|
233
|
+
total: results.length,
|
|
234
|
+
active: results.filter(r => !('error' in r) && r.status === 'active').length,
|
|
235
|
+
completed: results.filter(r => !('error' in r) && r.status === 'completed').length,
|
|
236
|
+
errored: results.filter(r => !('error' in r) && r.status === 'error').length,
|
|
237
|
+
};
|
|
238
|
+
return JSON.stringify({ summary, subtasks: results });
|
|
239
|
+
},
|
|
240
|
+
});
|
|
241
|
+
// ---- send_to_subtask ----
|
|
242
|
+
useToolService(ctx).register({
|
|
243
|
+
groups: ['subtask'],
|
|
244
|
+
definition: {
|
|
245
|
+
type: 'function',
|
|
246
|
+
function: {
|
|
247
|
+
name: 'send_to_subtask',
|
|
248
|
+
description: [
|
|
249
|
+
'向子任务会话发送追加消息(追问、补充指令等)。',
|
|
250
|
+
'消息将作为父会话用户身份注入子任务,触发子任务 agent 继续处理。',
|
|
251
|
+
'子任务如已完成,将被重新激活为 active 状态。',
|
|
252
|
+
].join('\n'),
|
|
253
|
+
parameters: {
|
|
254
|
+
type: 'object',
|
|
255
|
+
properties: {
|
|
256
|
+
subtask_id: {
|
|
257
|
+
type: 'string',
|
|
258
|
+
description: '子任务会话 ID',
|
|
259
|
+
},
|
|
260
|
+
message: {
|
|
261
|
+
type: 'string',
|
|
262
|
+
description: '要发送给子任务的消息内容',
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
required: ['subtask_id', 'message'],
|
|
266
|
+
additionalProperties: false,
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
},
|
|
270
|
+
handler: async (args, callCtx) => {
|
|
271
|
+
const sm = ctx.getService('session-manager');
|
|
272
|
+
if (!sm)
|
|
273
|
+
return JSON.stringify({ error: 'session-manager 服务不可用' });
|
|
274
|
+
const subtaskId = String(args.subtask_id || '');
|
|
275
|
+
const message = String(args.message || '');
|
|
276
|
+
if (!subtaskId || !message)
|
|
277
|
+
return JSON.stringify({ error: '缺少子任务 ID 或消息内容' });
|
|
278
|
+
const session = sm.getSession(subtaskId);
|
|
279
|
+
if (!session)
|
|
280
|
+
return JSON.stringify({ error: `子任务不存在: ${subtaskId}` });
|
|
281
|
+
// 如果子任务已完成,重新激活
|
|
282
|
+
if (session.status === 'completed') {
|
|
283
|
+
await sm.updateSession(subtaskId, { status: 'active' });
|
|
284
|
+
}
|
|
285
|
+
// 派发消息
|
|
286
|
+
ctx
|
|
287
|
+
.emit('inbound:message', {
|
|
288
|
+
content: message,
|
|
289
|
+
sessionId: subtaskId,
|
|
290
|
+
platform: callCtx.platform || 'internal',
|
|
291
|
+
userId: `parent:${callCtx.sessionId}`,
|
|
292
|
+
nickname: undefined,
|
|
293
|
+
})
|
|
294
|
+
.catch(err => {
|
|
295
|
+
ctx.logger.warn(`向子任务发送消息失败 (${subtaskId}):`, err);
|
|
296
|
+
});
|
|
297
|
+
return JSON.stringify({
|
|
298
|
+
subtaskId,
|
|
299
|
+
sent: true,
|
|
300
|
+
message: `消息已发送到子任务 "${session.name}"`,
|
|
301
|
+
});
|
|
302
|
+
},
|
|
303
|
+
});
|
|
304
|
+
// ---- delete_subtask ----
|
|
305
|
+
useToolService(ctx).register({
|
|
306
|
+
groups: ['subtask'],
|
|
307
|
+
definition: {
|
|
308
|
+
type: 'function',
|
|
309
|
+
function: {
|
|
310
|
+
name: 'delete_subtask',
|
|
311
|
+
description: [
|
|
312
|
+
'删除指定的子任务会话及其所有子会话(递归删除)。',
|
|
313
|
+
'只能删除当前会话的直接或间接子任务,不能删除根会话或其他会话的子任务。',
|
|
314
|
+
'删除后会话的消息历史也会被一并清除。',
|
|
315
|
+
].join('\n'),
|
|
316
|
+
parameters: {
|
|
317
|
+
type: 'object',
|
|
318
|
+
properties: {
|
|
319
|
+
subtask_id: {
|
|
320
|
+
type: 'string',
|
|
321
|
+
description: '要删除的子任务 ID',
|
|
322
|
+
},
|
|
323
|
+
},
|
|
324
|
+
required: ['subtask_id'],
|
|
325
|
+
additionalProperties: false,
|
|
326
|
+
},
|
|
327
|
+
},
|
|
328
|
+
},
|
|
329
|
+
handler: async (args, callCtx) => {
|
|
330
|
+
const sm = ctx.getService('session-manager');
|
|
331
|
+
if (!sm)
|
|
332
|
+
return JSON.stringify({ error: 'session-manager 服务不可用' });
|
|
333
|
+
const subtaskId = String(args.subtask_id || '').trim();
|
|
334
|
+
if (!subtaskId)
|
|
335
|
+
return JSON.stringify({ error: '缺少子任务 ID' });
|
|
336
|
+
const session = sm.getSession(subtaskId);
|
|
337
|
+
if (!session)
|
|
338
|
+
return JSON.stringify({ error: `会话不存在: ${subtaskId}`, notFound: true });
|
|
339
|
+
// 安全检查:只能删除当前会话的子任务
|
|
340
|
+
if (session.parentId !== callCtx.sessionId) {
|
|
341
|
+
return JSON.stringify({
|
|
342
|
+
error: `无权删除该会话。当前会话 (${callCtx.sessionId}) 不是该会话的父会话 (parentId=${session.parentId})。`,
|
|
343
|
+
denied: true,
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
try {
|
|
347
|
+
const name = session.name;
|
|
348
|
+
await sm.deleteSession(subtaskId);
|
|
349
|
+
return JSON.stringify({
|
|
350
|
+
subtaskId,
|
|
351
|
+
name,
|
|
352
|
+
deleted: true,
|
|
353
|
+
message: `子任务 "${name}" (${subtaskId}) 已删除`,
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
catch (err) {
|
|
357
|
+
return JSON.stringify({ error: `删除失败: ${err instanceof Error ? err.message : String(err)}` });
|
|
358
|
+
}
|
|
359
|
+
},
|
|
360
|
+
});
|
|
361
|
+
// ---- wait_subtasks ----
|
|
362
|
+
useToolService(ctx).register({
|
|
363
|
+
groups: ['subtask'],
|
|
364
|
+
definition: {
|
|
365
|
+
type: 'function',
|
|
366
|
+
function: {
|
|
367
|
+
name: 'wait_subtasks',
|
|
368
|
+
description: [
|
|
369
|
+
'等待指定的子任务全部完成。阻塞直到所有子任务完成或超时。',
|
|
370
|
+
'返回每个子任务的状态和结果摘要。超时后仍返回当前状态(部分可能未完成)。',
|
|
371
|
+
'',
|
|
372
|
+
'【必须调用】创建子任务后,必须调用此工具等待所有子任务完成。',
|
|
373
|
+
'不等待就继续主任务会导致:子任务结果丢失、文档内容不完整、最终输出质量差。',
|
|
374
|
+
'调用后请检查返回的 allCompleted 字段和每个子任务的 result,确认所有子任务均成功完成。',
|
|
375
|
+
'如有子任务失败或超时,可使用 send_to_subtask 补充指令后再次等待。',
|
|
376
|
+
].join('\n'),
|
|
377
|
+
parameters: {
|
|
378
|
+
type: 'object',
|
|
379
|
+
properties: {
|
|
380
|
+
subtask_ids: {
|
|
381
|
+
type: 'array',
|
|
382
|
+
items: { type: 'string' },
|
|
383
|
+
description: '要等待的子任务 ID 列表',
|
|
384
|
+
},
|
|
385
|
+
timeout_seconds: {
|
|
386
|
+
type: 'number',
|
|
387
|
+
description: '超时时间(秒),默认 120',
|
|
388
|
+
},
|
|
389
|
+
},
|
|
390
|
+
required: ['subtask_ids'],
|
|
391
|
+
additionalProperties: false,
|
|
392
|
+
},
|
|
393
|
+
},
|
|
394
|
+
},
|
|
395
|
+
handler: async (args, _callCtx) => {
|
|
396
|
+
const sm = ctx.getService('session-manager');
|
|
397
|
+
if (!sm)
|
|
398
|
+
return JSON.stringify({ error: 'session-manager 服务不可用' });
|
|
399
|
+
const ids = args.subtask_ids || [];
|
|
400
|
+
if (ids.length === 0) {
|
|
401
|
+
return JSON.stringify({
|
|
402
|
+
error: '缺少 subtask_ids 参数。正确用法: { "subtask_ids": ["<子任务ID1>", "<子任务ID2>"] }',
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
const timeoutSec = Number(args.timeout_seconds) || cfg.maxWaitMs / 1000;
|
|
406
|
+
const timeoutMs = Math.min(timeoutSec * 1000, cfg.maxWaitMs);
|
|
407
|
+
// 先检查是否已经全部完成(避免不必要的等待)
|
|
408
|
+
const isTerminal = (id) => {
|
|
409
|
+
const s = sm.getSession(id);
|
|
410
|
+
return !s || s.status === 'completed' || s.status === 'error';
|
|
411
|
+
};
|
|
412
|
+
if (!ids.every(isTerminal)) {
|
|
413
|
+
// 使用事件驱动 + 超时,替代轮询
|
|
414
|
+
await new Promise(resolve => {
|
|
415
|
+
const pending = new Set(ids.filter(id => !isTerminal(id)));
|
|
416
|
+
if (pending.size === 0) {
|
|
417
|
+
resolve();
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
const cleanup = () => {
|
|
421
|
+
clearTimeout(timer);
|
|
422
|
+
disposeCompleted();
|
|
423
|
+
disposeUpdated();
|
|
424
|
+
};
|
|
425
|
+
// 监听 session:completed 事件
|
|
426
|
+
const disposeCompleted = ctx.on('session:completed', (session) => {
|
|
427
|
+
pending.delete(session.id);
|
|
428
|
+
if (pending.size === 0) {
|
|
429
|
+
cleanup();
|
|
430
|
+
resolve();
|
|
431
|
+
}
|
|
432
|
+
});
|
|
433
|
+
// 兜底:也监听 session:updated 以防状态通过 updateSession 变更
|
|
434
|
+
const disposeUpdated = ctx.on('session:updated', (session) => {
|
|
435
|
+
if ((session.status === 'completed' || session.status === 'error') && pending.has(session.id)) {
|
|
436
|
+
pending.delete(session.id);
|
|
437
|
+
if (pending.size === 0) {
|
|
438
|
+
cleanup();
|
|
439
|
+
resolve();
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
// 超时保护
|
|
444
|
+
const timer = setTimeout(() => {
|
|
445
|
+
cleanup();
|
|
446
|
+
resolve();
|
|
447
|
+
}, timeoutMs);
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
// 收集结果
|
|
451
|
+
const results = ids.map(id => {
|
|
452
|
+
const session = sm.getSession(id);
|
|
453
|
+
if (!session)
|
|
454
|
+
return { id, error: '会话不存在' };
|
|
455
|
+
return {
|
|
456
|
+
id,
|
|
457
|
+
name: session.name,
|
|
458
|
+
status: session.status,
|
|
459
|
+
inputContext: session.inputContext || null,
|
|
460
|
+
result: session.result || null,
|
|
461
|
+
completed: session.status === 'completed',
|
|
462
|
+
};
|
|
463
|
+
});
|
|
464
|
+
const allCompleted = results.every(r => 'completed' in r && r.completed);
|
|
465
|
+
const timedOut = !allCompleted;
|
|
466
|
+
return JSON.stringify({
|
|
467
|
+
allCompleted,
|
|
468
|
+
timedOut,
|
|
469
|
+
subtasks: results,
|
|
470
|
+
});
|
|
471
|
+
},
|
|
472
|
+
});
|
|
473
|
+
// ---- 子任务的系统提示增强 ----
|
|
474
|
+
// 当 agent 处理子任务消息时,在系统提示中注入子任务上下文
|
|
475
|
+
const SUBTASK_CONTEXT_MARKER = '--- 子任务上下文 ---';
|
|
476
|
+
const PARENT_CONTEXT_MARKER = '--- 活跃子任务提醒 ---';
|
|
477
|
+
ctx.middleware('agent:llm:before', async (data, next) => {
|
|
478
|
+
const sm = ctx.getService('session-manager');
|
|
479
|
+
if (!sm) {
|
|
480
|
+
await next();
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
const sessionId = data.sessionId;
|
|
484
|
+
if (!sessionId) {
|
|
485
|
+
await next();
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
const session = sm.getSession(sessionId);
|
|
489
|
+
const messages = data.messages;
|
|
490
|
+
if (!messages || messages.length === 0) {
|
|
491
|
+
await next();
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
// 找到第一个 system 消息
|
|
495
|
+
const sysMsg = messages.find(m => m.role === 'system');
|
|
496
|
+
if (!sysMsg || typeof sysMsg.content !== 'string') {
|
|
497
|
+
await next();
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
// ---- 子任务侧:注入子任务上下文 ----
|
|
501
|
+
if (session?.parentId) {
|
|
502
|
+
// 幂等检查:避免多轮工具调用中重复注入
|
|
503
|
+
if (!sysMsg.content.includes(SUBTASK_CONTEXT_MARKER)) {
|
|
504
|
+
const subtaskContext = [
|
|
505
|
+
`\n\n--- 子任务上下文 ---`,
|
|
506
|
+
`你正在一个子任务会话中执行独立任务。`,
|
|
507
|
+
`子任务名称: ${session.name}`,
|
|
508
|
+
session.inputContext ? `任务指令: ${session.inputContext}` : '',
|
|
509
|
+
'',
|
|
510
|
+
'回答规则:',
|
|
511
|
+
'- 像普通对话一样正常回答问题或完成任务即可',
|
|
512
|
+
'- 系统会自动将你的最终回复作为任务结果报告给父会话',
|
|
513
|
+
'- 请给出完整、有价值的回答,因为你的回复内容将直接成为子任务结果',
|
|
514
|
+
'',
|
|
515
|
+
'共享资源规则:',
|
|
516
|
+
'- 如果任务指令中包含 docId(如 doc-xxxxxxxx),直接使用该 ID 操作文档,不要创建新文档',
|
|
517
|
+
'- 严格只操作你负责的范围(如指定的幻灯片编号、工作表等),不要越界修改其他部分',
|
|
518
|
+
'- 完成后请在回复中汇报你做了什么(如添加了哪些幻灯片、内容摘要等),方便父会话整合',
|
|
519
|
+
'- 不要调用 save 操作——由父会话统一保存',
|
|
520
|
+
'--- 子任务上下文结束 ---',
|
|
521
|
+
]
|
|
522
|
+
.filter(Boolean)
|
|
523
|
+
.join('\n');
|
|
524
|
+
sysMsg.content += subtaskContext;
|
|
525
|
+
const prevContributions = sysMsg.metadata?._tokenContributions ?? {};
|
|
526
|
+
sysMsg.metadata = {
|
|
527
|
+
...sysMsg.metadata,
|
|
528
|
+
_tokenContributions: { ...prevContributions, subtask: subtaskContext.length },
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
// ---- 父会话侧:注入活跃子任务提醒 ----
|
|
533
|
+
if (!session?.parentId && session) {
|
|
534
|
+
// 检查是否有子任务
|
|
535
|
+
const children = session.children;
|
|
536
|
+
if (children && children.length > 0) {
|
|
537
|
+
// 收集活跃/已完成/出错的子任务信息
|
|
538
|
+
const activeChildren = [];
|
|
539
|
+
const completedChildren = [];
|
|
540
|
+
const errorChildren = [];
|
|
541
|
+
for (const childId of children) {
|
|
542
|
+
const child = sm.getSession(childId);
|
|
543
|
+
if (!child)
|
|
544
|
+
continue;
|
|
545
|
+
if (child.status === 'active') {
|
|
546
|
+
activeChildren.push(` - [进行中] ${child.name} (ID: ${childId})`);
|
|
547
|
+
}
|
|
548
|
+
else if (child.status === 'completed') {
|
|
549
|
+
const resultPreview = child.result ?? '(无结果)';
|
|
550
|
+
completedChildren.push(` - [已完成] ${child.name} (ID: ${childId}): ${resultPreview}`);
|
|
551
|
+
}
|
|
552
|
+
else if (child.status === 'error') {
|
|
553
|
+
const resultPreview = child.result ?? '(无错误详情)';
|
|
554
|
+
errorChildren.push(` - [出错] ${child.name} (ID: ${childId}): ${resultPreview}`);
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
// 只有存在需要关注的子任务时才注入
|
|
558
|
+
if (activeChildren.length > 0 || completedChildren.length > 0 || errorChildren.length > 0) {
|
|
559
|
+
// 幂等:移除旧的提醒(每轮重新注入最新状态)
|
|
560
|
+
const content = sysMsg.content;
|
|
561
|
+
const markerStart = content.indexOf(`\n\n${PARENT_CONTEXT_MARKER}`);
|
|
562
|
+
if (markerStart !== -1) {
|
|
563
|
+
const markerEnd = content.indexOf('--- 活跃子任务提醒结束 ---', markerStart);
|
|
564
|
+
if (markerEnd !== -1) {
|
|
565
|
+
sysMsg.content =
|
|
566
|
+
content.slice(0, markerStart) + content.slice(markerEnd + '--- 活跃子任务提醒结束 ---'.length);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
const lines = [`\n\n${PARENT_CONTEXT_MARKER}`];
|
|
570
|
+
if (activeChildren.length > 0) {
|
|
571
|
+
lines.push(`⚠️ 你有 ${activeChildren.length} 个子任务正在执行:`);
|
|
572
|
+
lines.push(...activeChildren);
|
|
573
|
+
lines.push('');
|
|
574
|
+
lines.push('你必须调用 wait_subtasks 等待这些子任务完成后再继续。不要忽略进行中的子任务。');
|
|
575
|
+
}
|
|
576
|
+
if (errorChildren.length > 0) {
|
|
577
|
+
lines.push(`❌ 以下子任务执行出错:`);
|
|
578
|
+
lines.push(...errorChildren);
|
|
579
|
+
lines.push('');
|
|
580
|
+
lines.push('可使用 send_to_subtask 向出错的子任务发送修正指令让其重试,或使用 check_subtask 查看详细状态。');
|
|
581
|
+
}
|
|
582
|
+
if (completedChildren.length > 0) {
|
|
583
|
+
lines.push(`以下子任务已完成,请检查结果:`);
|
|
584
|
+
lines.push(...completedChildren);
|
|
585
|
+
}
|
|
586
|
+
lines.push('--- 活跃子任务提醒结束 ---');
|
|
587
|
+
const parentContext = lines.join('\n');
|
|
588
|
+
sysMsg.content += parentContext;
|
|
589
|
+
const prevContributions = sysMsg.metadata?._tokenContributions ?? {};
|
|
590
|
+
sysMsg.metadata = {
|
|
591
|
+
...sysMsg.metadata,
|
|
592
|
+
_tokenContributions: {
|
|
593
|
+
...prevContributions,
|
|
594
|
+
subtask: (prevContributions.subtask ?? 0) + parentContext.length,
|
|
595
|
+
},
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
await next();
|
|
601
|
+
});
|
|
602
|
+
// ---- 子任务自动完成 ----
|
|
603
|
+
// 当子任务 agent 正常回复后,自动将回复内容作为结果完成会话
|
|
604
|
+
// 同时在子会话历史中合成一条 tool call 记录,展示"报告给父会话"的流程
|
|
605
|
+
ctx.middleware('agent:turn:after', async (data, next) => {
|
|
606
|
+
await next();
|
|
607
|
+
// 仅在本轮真正产生回复时回报父会话;silent / aborted 不应触发自动完成
|
|
608
|
+
if (data.outcome !== 'replied')
|
|
609
|
+
return;
|
|
610
|
+
const sm = ctx.getService('session-manager');
|
|
611
|
+
if (!sm)
|
|
612
|
+
return;
|
|
613
|
+
const session = sm.getSession(data.sessionId);
|
|
614
|
+
if (!session?.parentId)
|
|
615
|
+
return; // 非子任务
|
|
616
|
+
if (session.status === 'completed' || session.status === 'error')
|
|
617
|
+
return; // 已完成
|
|
618
|
+
const result = data.reply;
|
|
619
|
+
if (!result || result.trim().length === 0)
|
|
620
|
+
return;
|
|
621
|
+
try {
|
|
622
|
+
// 在子会话历史中合成 tool call 记录,展示报告流程
|
|
623
|
+
const archive = ctx.getService('message-archive');
|
|
624
|
+
if (archive) {
|
|
625
|
+
const syntheticToolCallId = `report-${Date.now()}`;
|
|
626
|
+
// 合成 assistant 消息(含 tool_calls)
|
|
627
|
+
await archive.saveMessage(data.sessionId, {
|
|
628
|
+
role: 'assistant',
|
|
629
|
+
content: null,
|
|
630
|
+
toolCalls: [
|
|
631
|
+
{
|
|
632
|
+
id: syntheticToolCallId,
|
|
633
|
+
type: 'function',
|
|
634
|
+
function: {
|
|
635
|
+
name: 'report_to_parent',
|
|
636
|
+
arguments: JSON.stringify({ result: result.trim() }),
|
|
637
|
+
},
|
|
638
|
+
},
|
|
639
|
+
],
|
|
640
|
+
timestamp: Date.now(),
|
|
641
|
+
});
|
|
642
|
+
// 合成 tool 结果消息
|
|
643
|
+
await archive.saveMessage(data.sessionId, {
|
|
644
|
+
role: 'tool',
|
|
645
|
+
content: JSON.stringify({ success: true, message: '结果已报告给父会话' }),
|
|
646
|
+
toolCallId: syntheticToolCallId,
|
|
647
|
+
timestamp: Date.now(),
|
|
648
|
+
});
|
|
649
|
+
}
|
|
650
|
+
await sm.completeSession(data.sessionId, result.trim());
|
|
651
|
+
ctx.logger.info(`子任务自动完成: ${session.name} (${data.sessionId})`);
|
|
652
|
+
}
|
|
653
|
+
catch (err) {
|
|
654
|
+
ctx.logger.warn(`子任务自动完成失败 (${data.sessionId}):`, err);
|
|
655
|
+
}
|
|
656
|
+
});
|
|
657
|
+
ctx.logger.info('子任务工具已注册');
|
|
658
|
+
}
|
|
659
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aalis/plugin-subtask",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"aalis-plugin"
|
|
7
|
+
],
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"types": "dist/index.d.ts",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@aalis/plugin-agent-api": "^0.1.0",
|
|
15
|
+
"@aalis/plugin-tools-api": "^0.1.0"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@types/node": "^22.0.0",
|
|
19
|
+
"typescript": "^5.7.0",
|
|
20
|
+
"@aalis/plugin-message-archive-api": "0.1.0",
|
|
21
|
+
"@aalis/core": "0.1.0",
|
|
22
|
+
"@aalis/plugin-session-manager-api": "0.1.0",
|
|
23
|
+
"@aalis/plugin-message-api": "0.1.0"
|
|
24
|
+
},
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"@aalis/core": "^0.1.0"
|
|
27
|
+
},
|
|
28
|
+
"aalis": {
|
|
29
|
+
"service": {
|
|
30
|
+
"optional": [
|
|
31
|
+
"session-manager",
|
|
32
|
+
"message-archive"
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsc",
|
|
38
|
+
"dev": "tsc --watch"
|
|
39
|
+
}
|
|
40
|
+
}
|