summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSpoon <[email protected]>2025-12-17 02:28:09 +0100
committerGitHub <[email protected]>2025-12-16 19:28:09 -0600
commitb8a8fb0de67e4e1759a5f301135177937f7122e3 (patch)
tree6b442b9e4fe995a602e836f1ab09ed6a808fb932
parenta6a8f41fd382ce49f538d31b8c3a01ef98e6c0a0 (diff)
downloadopencode-b8a8fb0de67e4e1759a5f301135177937f7122e3.tar.gz
opencode-b8a8fb0de67e4e1759a5f301135177937f7122e3.zip
plugin(hook): add task tool execution hooks and command context tracking (#5642)
-rw-r--r--packages/opencode/src/session/message-v2.ts1
-rw-r--r--packages/opencode/src/session/prompt.ts63
-rw-r--r--packages/opencode/src/tool/task.ts1
-rw-r--r--packages/sdk/js/src/v2/gen/types.gen.ts2
4 files changed, 45 insertions, 22 deletions
diff --git a/packages/opencode/src/session/message-v2.ts b/packages/opencode/src/session/message-v2.ts
index 76162c797..4781b0c47 100644
--- a/packages/opencode/src/session/message-v2.ts
+++ b/packages/opencode/src/session/message-v2.ts
@@ -160,6 +160,7 @@ export namespace MessageV2 {
prompt: z.string(),
description: z.string(),
agent: z.string(),
+ command: z.string().optional(),
})
export type SubtaskPart = z.infer<typeof SubtaskPart>
diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts
index 4ae7469a3..ef379cb57 100644
--- a/packages/opencode/src/session/prompt.ts
+++ b/packages/opencode/src/session/prompt.ts
@@ -325,42 +325,60 @@ export namespace SessionPrompt {
prompt: task.prompt,
description: task.description,
subagent_type: task.agent,
+ command: task.command,
},
time: {
start: Date.now(),
},
},
})) as MessageV2.ToolPart
+ const taskArgs = {
+ prompt: task.prompt,
+ description: task.description,
+ subagent_type: task.agent,
+ command: task.command,
+ }
+ await Plugin.trigger(
+ "tool.execute.before",
+ {
+ tool: "task",
+ sessionID,
+ callID: part.id,
+ },
+ { args: taskArgs },
+ )
let executionError: Error | undefined
const result = await taskTool
- .execute(
- {
- prompt: task.prompt,
- description: task.description,
- subagent_type: task.agent,
- },
- {
- agent: task.agent,
- messageID: assistantMessage.id,
- sessionID: sessionID,
- abort,
- async metadata(input) {
- await Session.updatePart({
- ...part,
- type: "tool",
- state: {
- ...part.state,
- ...input,
- },
- } satisfies MessageV2.ToolPart)
- },
+ .execute(taskArgs, {
+ agent: task.agent,
+ messageID: assistantMessage.id,
+ sessionID: sessionID,
+ abort,
+ async metadata(input) {
+ await Session.updatePart({
+ ...part,
+ type: "tool",
+ state: {
+ ...part.state,
+ ...input,
+ },
+ } satisfies MessageV2.ToolPart)
},
- )
+ })
.catch((error) => {
executionError = error
log.error("subtask execution failed", { error, agent: task.agent, description: task.description })
return undefined
})
+ await Plugin.trigger(
+ "tool.execute.after",
+ {
+ tool: "task",
+ sessionID,
+ callID: part.id,
+ },
+ result,
+ )
assistantMessage.finish = "tool-calls"
assistantMessage.time.completed = Date.now()
await Session.updateMessage(assistantMessage)
@@ -1323,6 +1341,7 @@ export namespace SessionPrompt {
type: "subtask" as const,
agent: agent.name,
description: command.description ?? "",
+ command: input.command,
// TODO: how can we make task tool accept a more complex input?
prompt: await resolvePromptParts(template).then((x) => x.find((y) => y.type === "text")?.text ?? ""),
},
diff --git a/packages/opencode/src/tool/task.ts b/packages/opencode/src/tool/task.ts
index fdbae41dd..bc93f497a 100644
--- a/packages/opencode/src/tool/task.ts
+++ b/packages/opencode/src/tool/task.ts
@@ -26,6 +26,7 @@ export const TaskTool = Tool.define("task", async () => {
prompt: z.string().describe("The task for the agent to perform"),
subagent_type: z.string().describe("The type of specialized agent to use for this task"),
session_id: z.string().describe("Existing Task session to continue").optional(),
+ command: z.string().describe("The command that triggered this task").optional(),
}),
async execute(params, ctx) {
const agent = await Agent.get(params.subagent_type)
diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts
index ca8d25fd5..00f209c6d 100644
--- a/packages/sdk/js/src/v2/gen/types.gen.ts
+++ b/packages/sdk/js/src/v2/gen/types.gen.ts
@@ -417,6 +417,7 @@ export type Part =
prompt: string
description: string
agent: string
+ command?: string
}
| ReasoningPart
| FilePart
@@ -1600,6 +1601,7 @@ export type SubtaskPartInput = {
prompt: string
description: string
agent: string
+ command?: string
}
export type Command = {