///
import { describe, expect, test } from "bun:test"
import type { ToolContext } from "@opencode-ai/plugin/tool"
import type { BackgroundTask } from "../../features/background-agent"
import type { BackgroundOutputClient, BackgroundOutputManager } from "./clients"
import { createBackgroundOutput } from "./create-background-output"
const projectDir = "/Users/yeongyu/local-workspaces/oh-my-opencode"
const mockContext = {
sessionID: "test-session",
messageID: "test-message",
agent: "test-agent",
directory: projectDir,
worktree: projectDir,
abort: new AbortController().signal,
metadata: () => {},
ask: async () => {},
} as unknown as ToolContext
function createTask(overrides: Partial = {}): BackgroundTask {
return {
id: "task-1",
sessionID: "ses-1",
parentSessionID: "main-1",
parentMessageID: "msg-1",
description: "background task",
prompt: "do work",
agent: "test-agent",
status: "running",
...overrides,
}
}
function createMockClient(): BackgroundOutputClient {
return {
session: {
messages: async () => ({ data: [] }),
},
}
}
describe("createBackgroundOutput block=true polling", () => {
test("returns terminal error output when task fails during blocking wait", async () => {
// #given
let pollCount = 0
const task = createTask({ status: "running" })
const manager: BackgroundOutputManager = {
getTask: (id: string) => {
if (id !== task.id) return undefined
pollCount += 1
if (pollCount >= 2) {
task.status = "error"
task.error = "task failed"
}
return task
},
}
const tool = createBackgroundOutput(manager, createMockClient())
// #when
const output = await tool.execute(
{
task_id: task.id,
block: true,
timeout: 3000,
full_session: false,
},
mockContext
)
// #then
expect(pollCount).toBeGreaterThanOrEqual(2)
expect(output).toContain("Status | **error**")
expect(output).not.toContain("Timed out waiting")
})
test("returns latest output with timeout note when task stays running", async () => {
// #given
let pollCount = 0
const task = createTask({ status: "running" })
const manager: BackgroundOutputManager = {
getTask: (id: string) => {
if (id !== task.id) return undefined
pollCount += 1
return task
},
}
const tool = createBackgroundOutput(manager, createMockClient())
// #when
const output = await tool.execute(
{
task_id: task.id,
block: true,
timeout: 10,
},
mockContext
)
// #then
expect(pollCount).toBeGreaterThanOrEqual(2)
expect(output).toContain("# Full Session Output")
expect(output).toContain("Timed out waiting")
expect(output).toContain("still running")
})
})