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:
44
src/features/background-agent/subagent-spawn-limits.test.ts
Normal file
44
src/features/background-agent/subagent-spawn-limits.test.ts
Normal 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/)
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user