fix(opencode): preserve variant for delegated tasks (#30630)

This commit is contained in:
Aiden Cline
2026-06-03 17:43:47 -05:00
committed by GitHub
parent d3d4335509
commit ee74dd83f5
2 changed files with 6 additions and 0 deletions

View File

@@ -172,6 +172,7 @@ export const TaskTool = Tool.define(
Effect.orDie, Effect.orDie,
) )
if (msg.info.role !== "assistant") return yield* Effect.fail(new Error("Not an assistant message")) if (msg.info.role !== "assistant") return yield* Effect.fail(new Error("Not an assistant message"))
const variant = msg.info.variant
const model = next.model ?? { const model = next.model ?? {
modelID: msg.info.modelID, modelID: msg.info.modelID,
@@ -201,6 +202,7 @@ export const TaskTool = Tool.define(
modelID: model.modelID, modelID: model.modelID,
providerID: model.providerID, providerID: model.providerID,
}, },
variant: next.model ? undefined : variant,
agent: next.name, agent: next.name,
tools: { tools: {
...(next.permission.some((rule) => rule.permission === "todowrite") ? {} : { todowrite: false }), ...(next.permission.some((rule) => rule.permission === "todowrite") ? {} : { todowrite: false }),
@@ -221,6 +223,7 @@ export const TaskTool = Tool.define(
.prompt({ .prompt({
sessionID: ctx.sessionID, sessionID: ctx.sessionID,
agent: currentParent.agent ?? ctx.agent, agent: currentParent.agent ?? ctx.agent,
variant,
parts: [ parts: [
{ {
type: "text", type: "text",

View File

@@ -81,6 +81,7 @@ const seed = Effect.fn("TaskToolTest.seed")(function* (title = "Pinned") {
tokens: { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } }, tokens: { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } },
modelID: ref.modelID, modelID: ref.modelID,
providerID: ref.providerID, providerID: ref.providerID,
variant: "xhigh",
time: { created: Date.now() }, time: { created: Date.now() },
} }
yield* session.updateMessage(assistant) yield* session.updateMessage(assistant)
@@ -242,6 +243,7 @@ describe("tool.task", () => {
expect(result.metadata.sessionId).toBe(child.id) expect(result.metadata.sessionId).toBe(child.id)
expect(result.output).toContain(`<task id="${child.id}" state="completed">`) expect(result.output).toContain(`<task id="${child.id}" state="completed">`)
expect(seen?.sessionID).toBe(child.id) expect(seen?.sessionID).toBe(child.id)
expect(seen?.variant).toBe("xhigh")
}), }),
) )
@@ -586,6 +588,7 @@ describe("tool.task", () => {
expect(waited.info?.status).toBe("completed") expect(waited.info?.status).toBe("completed")
expect(waited.info?.output).toBe("second done") expect(waited.info?.output).toBe("second done")
const notification = yield* Effect.promise(() => injected.promise) const notification = yield* Effect.promise(() => injected.promise)
expect(notification.variant).toBe("xhigh")
expect(notification.parts[0]?.type).toBe("text") expect(notification.parts[0]?.type).toBe("text")
if (notification.parts[0]?.type === "text") expect(notification.parts[0].text).toContain("second done") if (notification.parts[0]?.type === "text") expect(notification.parts[0].text).toContain("second done")
}), }),