Merge pull request #2467 from code-yeongyu/fix/spawn-sdk-error-fail-closed

fix(background-agent): handle SDK error response in spawn lineage lookup
This commit is contained in:
YeonGyu-Kim
2026-03-11 21:57:30 +09:00
committed by GitHub
2 changed files with 54 additions and 2 deletions

View File

@@ -0,0 +1,44 @@
import { describe, expect, test } from "bun:test"
import type { OpencodeClient } from "./constants"
import { resolveSubagentSpawnContext } from "./subagent-spawn-limits"
function createMockClient(sessionGet: OpencodeClient["session"]["get"]): OpencodeClient {
return {
session: {
get: sessionGet,
},
} as OpencodeClient
}
describe("resolveSubagentSpawnContext", () => {
describe("#given session.get returns an SDK error response", () => {
test("throws a fail-closed spawn blocked error", async () => {
// given
const client = createMockClient(async () => ({
error: "lookup failed",
data: undefined,
}))
// when
const result = resolveSubagentSpawnContext(client, "parent-session")
// then
await expect(result).rejects.toThrow(/background_task\.maxDescendants cannot be enforced safely.*lookup failed/)
})
})
describe("#given session.get returns no session data", () => {
test("throws a fail-closed spawn blocked error", async () => {
// given
const client = createMockClient(async () => ({
data: undefined,
}))
// when
const result = resolveSubagentSpawnContext(client, "parent-session")
// then
await expect(result).rejects.toThrow(/background_task\.maxDescendants cannot be enforced safely.*No session data returned/)
})
})
})

View File

@@ -36,10 +36,18 @@ export async function resolveSubagentSpawnContext(
let nextParentSessionID: string | undefined
try {
const session = await client.session.get({
const response = await client.session.get({
path: { id: currentSessionID },
})
nextParentSessionID = session.data?.parentID
if (response.error) {
throw new Error(String(response.error))
}
if (!response.data) {
throw new Error("No session data returned")
}
nextParentSessionID = response.data.parentID
} catch (error) {
const reason = error instanceof Error ? error.message : String(error)
throw new Error(