refactor(background-agent): normalize task ID field naming
Rename BackgroundTask and attempt ID fields to camelCase across background-agent consumers while moving BackgroundManager construction to a single config object. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -41,7 +41,7 @@ export function createBackgroundCancel(manager: BackgroundManager, _client: Back
|
||||
id: task.id,
|
||||
description: task.description,
|
||||
status: originalStatus === "pending" ? "pending" : "running",
|
||||
sessionID: task.sessionID,
|
||||
sessionID: task.sessionId,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -105,7 +105,7 @@ Status: ${task.status}`
|
||||
|
||||
Task ID: ${task.id}
|
||||
Description: ${task.description}
|
||||
Session ID: ${task.sessionID}
|
||||
Session ID: ${task.sessionId}
|
||||
Status: ${task.status}`
|
||||
} catch (error) {
|
||||
return `[ERROR] Error cancelling task: ${error instanceof Error ? error.message : String(error)}`
|
||||
|
||||
@@ -22,9 +22,9 @@ const mockContext = {
|
||||
function createTask(overrides: Partial<BackgroundTask> = {}): BackgroundTask {
|
||||
return {
|
||||
id: "task-1",
|
||||
sessionID: "ses-1",
|
||||
parentSessionID: "main-1",
|
||||
parentMessageID: "msg-1",
|
||||
sessionId: "ses-1",
|
||||
parentSessionId: "main-1",
|
||||
parentMessageId: "msg-1",
|
||||
description: "background task",
|
||||
prompt: "do work",
|
||||
agent: "test-agent",
|
||||
|
||||
@@ -20,9 +20,9 @@ describe("createBackgroundOutput metadata", () => {
|
||||
|
||||
const task: BackgroundTask = {
|
||||
id: "task-1",
|
||||
sessionID: undefined,
|
||||
parentSessionID: "main-1",
|
||||
parentMessageID: "msg-1",
|
||||
sessionId: undefined,
|
||||
parentSessionId: "main-1",
|
||||
parentMessageId: "msg-1",
|
||||
description: "background task",
|
||||
prompt: "do work",
|
||||
agent: "test-agent",
|
||||
|
||||
@@ -70,7 +70,7 @@ export function createBackgroundOutput(manager: BackgroundOutputManager, client:
|
||||
agent: task.agent,
|
||||
category: task.category,
|
||||
description: task.description,
|
||||
...(task.sessionID ? { sessionId: task.sessionID, taskId: task.sessionID } : {}),
|
||||
...(task.sessionId ? { sessionId: task.sessionId, taskId: task.sessionId } : {}),
|
||||
} as Record<string, unknown>,
|
||||
}
|
||||
await publishToolMetadata(ctx, meta)
|
||||
@@ -129,7 +129,7 @@ export function createBackgroundOutput(manager: BackgroundOutputManager, client:
|
||||
}
|
||||
|
||||
if (resolvedTask.status === "completed") {
|
||||
recordBackgroundOutputConsumption(ctx.sessionID, ctx.messageID, resolvedTask.sessionID)
|
||||
recordBackgroundOutputConsumption(ctx.sessionID, ctx.messageID, resolvedTask.sessionId)
|
||||
return await formatTaskResult(resolvedTask, client)
|
||||
}
|
||||
|
||||
|
||||
@@ -32,9 +32,9 @@ const baseContext = {
|
||||
function createTask(overrides: Partial<BackgroundTask> = {}): BackgroundTask {
|
||||
return {
|
||||
id: "task-1",
|
||||
sessionID: taskSessionID,
|
||||
parentSessionID,
|
||||
parentMessageID: "msg-parent",
|
||||
sessionId: taskSessionID,
|
||||
parentSessionId: parentSessionID,
|
||||
parentMessageId: "msg-parent",
|
||||
description: "background task",
|
||||
prompt: "do work",
|
||||
agent: "test-agent",
|
||||
|
||||
@@ -8,13 +8,13 @@ import { createBackgroundTask } from "./create-background-task"
|
||||
describe("createBackgroundTask", () => {
|
||||
const launchMock = mock(async (): Promise<{
|
||||
id: string
|
||||
sessionID: string | null
|
||||
sessionId: string | null
|
||||
description: string
|
||||
agent: string
|
||||
status: string
|
||||
}> => ({
|
||||
id: "test-task-id",
|
||||
sessionID: null,
|
||||
sessionId: null,
|
||||
description: "Test task",
|
||||
agent: "test-agent",
|
||||
status: "pending",
|
||||
@@ -55,14 +55,14 @@ describe("createBackgroundTask", () => {
|
||||
//#given
|
||||
launchMock.mockResolvedValueOnce({
|
||||
id: "test-task-id",
|
||||
sessionID: null,
|
||||
sessionId: null,
|
||||
description: "Test task",
|
||||
agent: "test-agent",
|
||||
status: "pending",
|
||||
})
|
||||
getTaskMock.mockReturnValueOnce({
|
||||
id: "test-task-id",
|
||||
sessionID: null,
|
||||
sessionId: null,
|
||||
description: "Test task",
|
||||
agent: "test-agent",
|
||||
status: "interrupt",
|
||||
@@ -81,7 +81,7 @@ describe("createBackgroundTask", () => {
|
||||
const abortController = new AbortController()
|
||||
launchMock.mockResolvedValueOnce({
|
||||
id: "test-task-id",
|
||||
sessionID: null,
|
||||
sessionId: null,
|
||||
description: "Test task",
|
||||
agent: "test-agent",
|
||||
status: "pending",
|
||||
@@ -90,7 +90,7 @@ describe("createBackgroundTask", () => {
|
||||
abortController.abort()
|
||||
return {
|
||||
id: "test-task-id",
|
||||
sessionID: null,
|
||||
sessionId: null,
|
||||
description: "Test task",
|
||||
agent: "test-agent",
|
||||
status: "pending",
|
||||
@@ -114,15 +114,15 @@ describe("createBackgroundTask", () => {
|
||||
const firstAbortController = new AbortController()
|
||||
const secondAbortController = new AbortController()
|
||||
const states = new Map([
|
||||
["task-1", { reads: 0, abortOnFirstRead: true, sessionID: "ses-1" }],
|
||||
["task-2", { reads: 0, abortOnFirstRead: false, sessionID: "ses-2" }],
|
||||
["task-1", { reads: 0, abortOnFirstRead: true, sessionId: "ses-1" }],
|
||||
["task-2", { reads: 0, abortOnFirstRead: false, sessionId: "ses-2" }],
|
||||
])
|
||||
let launchCount = 0
|
||||
launchMock.mockImplementation(async () => {
|
||||
launchCount += 1
|
||||
return launchCount === 1
|
||||
? { id: "task-1", sessionID: null, description: "Task 1", agent: "test-agent", status: "pending" }
|
||||
: { id: "task-2", sessionID: null, description: "Task 2", agent: "test-agent", status: "pending" }
|
||||
? { id: "task-1", sessionId: null, description: "Task 1", agent: "test-agent", status: "pending" }
|
||||
: { id: "task-2", sessionId: null, description: "Task 2", agent: "test-agent", status: "pending" }
|
||||
})
|
||||
getTaskMock.mockImplementation((taskID: string) => {
|
||||
const state = states.get(taskID)
|
||||
@@ -132,8 +132,8 @@ describe("createBackgroundTask", () => {
|
||||
firstAbortController.abort()
|
||||
}
|
||||
return state.reads >= 2
|
||||
? { id: taskID, sessionID: state.sessionID, description: "Task", agent: "test-agent", status: "pending" }
|
||||
: { id: taskID, sessionID: null, description: "Task", agent: "test-agent", status: "pending" }
|
||||
? { id: taskID, sessionId: state.sessionId, description: "Task", agent: "test-agent", status: "pending" }
|
||||
: { id: taskID, sessionId: null, description: "Task", agent: "test-agent", status: "pending" }
|
||||
})
|
||||
|
||||
//#when
|
||||
|
||||
@@ -69,8 +69,8 @@ export function createBackgroundTask(
|
||||
description: args.description,
|
||||
prompt: args.prompt,
|
||||
agent: args.agent.trim(),
|
||||
parentSessionID: ctx.sessionID,
|
||||
parentMessageID: ctx.messageID,
|
||||
parentSessionId: ctx.sessionID,
|
||||
parentMessageId: ctx.messageID,
|
||||
parentModel,
|
||||
parentAgent,
|
||||
})
|
||||
@@ -78,13 +78,13 @@ export function createBackgroundTask(
|
||||
const WAIT_FOR_SESSION_INTERVAL_MS = 50
|
||||
const WAIT_FOR_SESSION_TIMEOUT_MS = 30000
|
||||
const waitStart = Date.now()
|
||||
let sessionId = task.sessionID
|
||||
let sessionId = task.sessionId
|
||||
while (!sessionId && Date.now() - waitStart < WAIT_FOR_SESSION_TIMEOUT_MS) {
|
||||
const updated = manager.getTask(task.id)
|
||||
if (updated?.status === "error" || updated?.status === "cancelled" || updated?.status === "interrupt") {
|
||||
return `Task ${`entered error state`}\.\n\nTask ID: ${task.id}`
|
||||
}
|
||||
sessionId = updated?.sessionID
|
||||
sessionId = updated?.sessionId
|
||||
if (sessionId) {
|
||||
break
|
||||
}
|
||||
|
||||
@@ -41,12 +41,12 @@ export async function formatFullSession(
|
||||
thinkingMaxChars?: number
|
||||
}
|
||||
): Promise<string> {
|
||||
if (!task.sessionID) {
|
||||
if (!task.sessionId) {
|
||||
return formatTaskStatus(task)
|
||||
}
|
||||
|
||||
const messagesResult: BackgroundOutputMessagesResult = await client.session.messages({
|
||||
path: { id: task.sessionID },
|
||||
path: { id: task.sessionId },
|
||||
})
|
||||
|
||||
const errorMessage = getErrorMessage(messagesResult)
|
||||
@@ -107,7 +107,7 @@ export async function formatFullSession(
|
||||
lines.push(`Task ID: ${task.id}`)
|
||||
lines.push(`Description: ${task.description}`)
|
||||
lines.push(`Status: ${task.status}`)
|
||||
lines.push(`Session ID: ${task.sessionID}`)
|
||||
lines.push(`Session ID: ${task.sessionId}`)
|
||||
lines.push(`Total messages: ${normalizedMessages.length}`)
|
||||
lines.push(`Returned: ${visibleMessages.length}`)
|
||||
lines.push(`Has more: ${hasMore ? "true" : "false"}`)
|
||||
|
||||
@@ -7,9 +7,9 @@ import { formatTaskResult } from "./task-result-format"
|
||||
function createTask(overrides: Partial<BackgroundTask> = {}): BackgroundTask {
|
||||
return {
|
||||
id: "task-1",
|
||||
sessionID: "ses-1",
|
||||
parentSessionID: "main-1",
|
||||
parentMessageID: "msg-1",
|
||||
sessionId: "ses-1",
|
||||
parentSessionId: "main-1",
|
||||
parentMessageId: "msg-1",
|
||||
description: "background task",
|
||||
prompt: "do work",
|
||||
agent: "test-agent",
|
||||
|
||||
@@ -10,12 +10,12 @@ function getTimeString(value: unknown): string {
|
||||
}
|
||||
|
||||
export async function formatTaskResult(task: BackgroundTask, client: BackgroundOutputClient): Promise<string> {
|
||||
if (!task.sessionID) {
|
||||
if (!task.sessionId) {
|
||||
return `Error: Task has no sessionID`
|
||||
}
|
||||
|
||||
const messagesResult: BackgroundOutputMessagesResult = await client.session.messages({
|
||||
path: { id: task.sessionID },
|
||||
path: { id: task.sessionId },
|
||||
})
|
||||
|
||||
const errorMessage = getErrorMessage(messagesResult)
|
||||
@@ -30,7 +30,7 @@ export async function formatTaskResult(task: BackgroundTask, client: BackgroundO
|
||||
Task ID: ${task.id}
|
||||
Description: ${task.description}
|
||||
Duration: ${formatDuration(task.startedAt ?? new Date(), task.completedAt)}
|
||||
Session ID: ${task.sessionID}
|
||||
Session ID: ${task.sessionId}
|
||||
|
||||
---
|
||||
|
||||
@@ -44,7 +44,7 @@ Session ID: ${task.sessionID}
|
||||
Task ID: ${task.id}
|
||||
Description: ${task.description}
|
||||
Duration: ${formatDuration(task.startedAt ?? new Date(), task.completedAt)}
|
||||
Session ID: ${task.sessionID}
|
||||
Session ID: ${task.sessionId}
|
||||
|
||||
---
|
||||
|
||||
@@ -67,14 +67,14 @@ Session ID: ${task.sessionID}
|
||||
Task ID: ${task.id}
|
||||
Description: ${task.description}
|
||||
Duration: ${formatDuration(task.startedAt ?? new Date(), task.completedAt)}
|
||||
Session ID: ${task.sessionID}
|
||||
Session ID: ${task.sessionId}
|
||||
|
||||
---
|
||||
|
||||
Session error: ${sessionError}`
|
||||
}
|
||||
|
||||
const newMessages = consumeNewMessages(task.sessionID, sortedMessages)
|
||||
const newMessages = consumeNewMessages(task.sessionId, sortedMessages)
|
||||
if (newMessages.length === 0) {
|
||||
const duration = formatDuration(task.startedAt ?? new Date(), task.completedAt)
|
||||
return `Task Result
|
||||
@@ -82,7 +82,7 @@ Session error: ${sessionError}`
|
||||
Task ID: ${task.id}
|
||||
Description: ${task.description}
|
||||
Duration: ${duration}
|
||||
Session ID: ${task.sessionID}
|
||||
Session ID: ${task.sessionId}
|
||||
|
||||
---
|
||||
|
||||
@@ -123,7 +123,7 @@ Session ID: ${task.sessionID}
|
||||
Task ID: ${task.id}
|
||||
Description: ${task.description}
|
||||
Duration: ${duration}
|
||||
Session ID: ${task.sessionID}
|
||||
Session ID: ${task.sessionId}
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ ${truncated}
|
||||
| Agent | ${task.agent} |
|
||||
| Status | **${task.status}** |
|
||||
| ${durationLabel} | ${duration} |
|
||||
| Session ID | \`${task.sessionID}\` |${progressSection}
|
||||
| Session ID | \`${task.sessionId}\` |${progressSection}
|
||||
${statusNote}
|
||||
## Original Prompt
|
||||
|
||||
|
||||
@@ -41,9 +41,9 @@ function createMockClient(messagesBySession: Record<string, BackgroundOutputMess
|
||||
function createTask(overrides: Partial<BackgroundTask> = {}): BackgroundTask {
|
||||
return {
|
||||
id: "task-1",
|
||||
sessionID: "ses-1",
|
||||
parentSessionID: "main-1",
|
||||
parentMessageID: "msg-1",
|
||||
sessionId: "ses-1",
|
||||
parentSessionId: "main-1",
|
||||
parentMessageId: "msg-1",
|
||||
description: "background task",
|
||||
prompt: "do work",
|
||||
agent: "test-agent",
|
||||
@@ -345,7 +345,7 @@ describe("background_output blocking", () => {
|
||||
test("block=true keeps legacy task result output when full_session is not provided", async () => {
|
||||
// #given a task that transitions running → completed after 2 polls
|
||||
let pollCount = 0
|
||||
const task = createTask({ status: "running", sessionID: "ses-blocking-default" })
|
||||
const task = createTask({ status: "running", sessionId: "ses-blocking-default" })
|
||||
const manager: BackgroundOutputManager = {
|
||||
getTask: (id: string) => {
|
||||
if (id !== task.id) return undefined
|
||||
@@ -435,8 +435,8 @@ describe("background_cancel", () => {
|
||||
|
||||
test("preserves original status in cancellation table", async () => {
|
||||
// #given
|
||||
const taskA = createTask({ id: "task-a", status: "running", sessionID: "ses-a", description: "running task" })
|
||||
const taskB = createTask({ id: "task-b", status: "pending", sessionID: undefined, description: "pending task" })
|
||||
const taskA = createTask({ id: "task-a", status: "running", sessionId: "ses-a", description: "running task" })
|
||||
const taskB = createTask({ id: "task-b", status: "pending", sessionId: undefined, description: "pending task" })
|
||||
const manager = {
|
||||
getTask: () => undefined,
|
||||
getAllDescendantTasks: () => [taskA, taskB],
|
||||
|
||||
Reference in New Issue
Block a user