fix(athena): resolve task output files to project directory instead of process.cwd()

task-output-writer wrote to process.cwd()/.sisyphus/task-outputs/ while
council_finalize read from ctx.directory/.sisyphus/task-outputs/. When
these differ, all output files appear missing.

Fix by passing directory to writeTaskOutput from BackgroundManager, and
adding basePath to council_read. Also removes process.chdir() from tests
that was masking the bug.
This commit is contained in:
ismeth
2026-02-28 11:53:41 +01:00
committed by YeonGyu-Kim
parent aa91c1fb19
commit f5829bf2fb
7 changed files with 27 additions and 33 deletions
+1 -1
View File
@@ -1709,7 +1709,7 @@ export class BackgroundManager {
// Write output to file if requested (before status flip)
if (task.writeOutputToFile) {
const filePath = await writeTaskOutput(task, this.client)
const filePath = await writeTaskOutput(task, this.client, this.directory)
if (filePath) task.outputFilePath = filePath
}
@@ -74,7 +74,7 @@ describe("writeTaskOutput", () => {
])
const task = createMockTask()
const result = await writeTaskOutput(task, client)
const result = await writeTaskOutput(task, client, ".")
expect(result).toBe(`${TEST_OUTPUT_DIR}/bg_test_123.md`)
expect(existsSync(result!)).toBe(true)
@@ -99,7 +99,7 @@ describe("writeTaskOutput", () => {
const client = createMockClient([])
const task = createMockTask({ sessionID: undefined })
const result = await writeTaskOutput(task, client)
const result = await writeTaskOutput(task, client, ".")
expect(result).toBeNull()
expect(existsSync(`${TEST_OUTPUT_DIR}/bg_test_123.md`)).toBe(false)
@@ -111,7 +111,7 @@ describe("writeTaskOutput", () => {
const client = createErrorClient("Session not found")
const task = createMockTask()
const result = await writeTaskOutput(task, client)
const result = await writeTaskOutput(task, client, ".")
expect(result).toBeNull()
expect(existsSync(`${TEST_OUTPUT_DIR}/bg_test_123.md`)).toBe(false)
@@ -123,7 +123,7 @@ describe("writeTaskOutput", () => {
const client = createMockClient([])
const task = createMockTask()
const result = await writeTaskOutput(task, client)
const result = await writeTaskOutput(task, client, ".")
expect(result).toBe(`${TEST_OUTPUT_DIR}/bg_test_123.md`)
expect(existsSync(result!)).toBe(true)
@@ -149,7 +149,7 @@ describe("writeTaskOutput", () => {
])
const task = createMockTask()
const result = await writeTaskOutput(task, client)
const result = await writeTaskOutput(task, client, ".")
expect(result).toBe(`${TEST_OUTPUT_DIR}/bg_test_123.md`)
expect(existsSync(TEST_OUTPUT_DIR)).toBe(true)
@@ -171,7 +171,7 @@ describe("writeTaskOutput", () => {
])
const task = createMockTask()
const result = await writeTaskOutput(task, client)
const result = await writeTaskOutput(task, client, ".")
const content = await readFile(result!, "utf-8")
expect(content).toContain("Let me think about this...")
@@ -195,7 +195,7 @@ describe("writeTaskOutput", () => {
])
const task = createMockTask()
const result = await writeTaskOutput(task, client)
const result = await writeTaskOutput(task, client, ".")
const content = await readFile(result!, "utf-8")
const firstIdx = content.indexOf("First message")
@@ -209,7 +209,7 @@ describe("writeTaskOutput", () => {
const client = createMockClient([])
const task = createMockTask({ completedAt: undefined })
const result = await writeTaskOutput(task, client)
const result = await writeTaskOutput(task, client, ".")
const content = await readFile(result!, "utf-8")
expect(content).toContain("completed_at: unknown")
@@ -1,5 +1,5 @@
import { mkdir, writeFile, rename } from "node:fs/promises"
import { dirname } from "node:path"
import { dirname, join } from "node:path"
import { log } from "../../shared"
import type { BackgroundTask } from "./types"
import type { BackgroundOutputClient } from "../../tools/background-task/clients"
@@ -53,6 +53,7 @@ function formatTranscript(
export async function writeTaskOutput(
task: BackgroundTask,
client: BackgroundOutputClient,
directory: string,
): Promise<string | null> {
if (!task.sessionID) {
return null
@@ -74,7 +75,7 @@ export async function writeTaskOutput(
const transcript = formatTranscript(messages)
const content = `${frontmatter}\n\n${transcript}`
const outputPath = `${OUTPUT_DIR}/${task.id}.md`
const outputPath = join(directory, OUTPUT_DIR, `${task.id}.md`)
const tmpPath = `${outputPath}.tmp`
await mkdir(dirname(outputPath), { recursive: true })