Task 2: Preset-driven subagent tool

- Replace chain mode with preset-driven single and parallel modes
- Schema: require per-task preset; remove top-level required model
- Tool: resolve presets via discoverSubagentPresets(), normalize models, resolve effective model per run, pass preset meta
- Update tests and remove chain test
This commit is contained in:
pi
2026-04-12 11:59:07 +01:00
parent 87fc22c0ce
commit 8e2c7e49e0
3 changed files with 18 additions and 116 deletions

View File

@@ -11,39 +11,30 @@ function createTaskModelSchema(availableModels: readonly string[]) {
export function createTaskItemSchema(availableModels: readonly string[]) {
return Type.Object({
preset: Type.String({ description: "Subagent preset name to use for this task" }),
task: Type.String({ description: "Task to delegate to the child agent" }),
model: createTaskModelSchema(availableModels),
cwd: Type.Optional(Type.String({ description: "Optional working directory override" })),
});
}
export function createChainItemSchema(availableModels: readonly string[]) {
return Type.Object({
task: Type.String({ description: "Task with optional {previous} placeholder" }),
model: createTaskModelSchema(availableModels),
cwd: Type.Optional(Type.String({ description: "Optional working directory override" })),
});
}
export const TaskItemSchema = createTaskItemSchema([]);
export const ChainItemSchema = createChainItemSchema([]);
export function createSubagentParamsSchema(availableModels: readonly string[]) {
return Type.Object({
// Single mode: provide preset + task
preset: Type.Optional(Type.String({ description: "Subagent preset name to use in single mode" })),
task: Type.Optional(Type.String({ description: "Single-mode delegated task" })),
model: StringEnum(availableModels, {
description: "Required top-level child model. Must be one of the currently available models.",
}),
// Parallel mode: provide tasks array where each item names its own preset
tasks: Type.Optional(Type.Array(createTaskItemSchema(availableModels), { description: "Parallel tasks" })),
chain: Type.Optional(Type.Array(createChainItemSchema(availableModels), { description: "Sequential tasks" })),
cwd: Type.Optional(Type.String({ description: "Single-mode working directory override" })),
});
}
export const SubagentParamsSchema = createSubagentParamsSchema([]);
export type TaskItem = Static<typeof TaskItemSchema>;
export type ChainItem = Static<typeof ChainItemSchema>;
export type SubagentParams = Static<typeof SubagentParamsSchema>;
export interface SubagentRunResult {
@@ -66,6 +57,6 @@ export interface SubagentRunResult {
}
export interface SubagentToolDetails {
mode: "single" | "parallel" | "chain";
mode: "single" | "parallel";
results: SubagentRunResult[];
}