fix(sisyphus-task): use SDK session.messages API for parent agent lookup

Background task notifications were showing 'build' agent instead of the
actual parent agent (e.g., 'Sisyphus'). The hook-injected message storage
only contains limited info; the actual agent name is in the SDK session.

Changes:
- Add getParentAgentFromSdk() to query SDK messages API
- Look up agent from SDK first, fallback to hook-injected messages
- Ensures background tasks correctly preserve parent agent context
This commit is contained in:
YeonGyu-Kim 2026-01-09 00:06:56 +09:00
parent 14c54c1941
commit a64e1f6100

View File

@ -38,6 +38,19 @@ function getMessageDir(sessionID: string): string | null {
return null return null
} }
async function getParentAgentFromSdk(client: OpencodeClient, sessionID: string): Promise<string | undefined> {
try {
const messagesResp = await client.session.messages({ path: { id: sessionID } })
const messages = (messagesResp.data ?? []) as Array<{ info?: { agent?: string } }>
for (let i = messages.length - 1; i >= 0; i--) {
if (messages[i].info?.agent) {
return messages[i].info?.agent
}
}
} catch {}
return undefined
}
function formatDuration(start: Date, end?: Date): string { function formatDuration(start: Date, end?: Date): string {
const duration = (end ?? new Date()).getTime() - start.getTime() const duration = (end ?? new Date()).getTime() - start.getTime()
const seconds = Math.floor(duration / 1000) const seconds = Math.floor(duration / 1000)
@ -144,13 +157,14 @@ export function createSisyphusTask(options: SisyphusTaskToolOptions): ToolDefini
skillContent = Array.from(resolved.values()).join("\n\n") skillContent = Array.from(resolved.values()).join("\n\n")
} }
const sdkParentAgent = await getParentAgentFromSdk(client, ctx.sessionID)
const messageDir = getMessageDir(ctx.sessionID) const messageDir = getMessageDir(ctx.sessionID)
const prevMessage = messageDir ? findNearestMessageWithFields(messageDir) : null const prevMessage = messageDir ? findNearestMessageWithFields(messageDir) : null
const parentAgent = sdkParentAgent ?? prevMessage?.agent
const parentModel = prevMessage?.model?.providerID && prevMessage?.model?.modelID const parentModel = prevMessage?.model?.providerID && prevMessage?.model?.modelID
? { providerID: prevMessage.model.providerID, modelID: prevMessage.model.modelID } ? { providerID: prevMessage.model.providerID, modelID: prevMessage.model.modelID }
: undefined : undefined
// Handle resume case first
if (args.resume) { if (args.resume) {
if (runInBackground) { if (runInBackground) {
try { try {
@ -160,7 +174,7 @@ export function createSisyphusTask(options: SisyphusTaskToolOptions): ToolDefini
parentSessionID: ctx.sessionID, parentSessionID: ctx.sessionID,
parentMessageID: ctx.messageID, parentMessageID: ctx.messageID,
parentModel, parentModel,
parentAgent: prevMessage?.agent, parentAgent,
}) })
ctx.metadata?.({ ctx.metadata?.({
@ -327,7 +341,7 @@ ${textContent || "(No text output)"}`
parentSessionID: ctx.sessionID, parentSessionID: ctx.sessionID,
parentMessageID: ctx.messageID, parentMessageID: ctx.messageID,
parentModel, parentModel,
parentAgent: prevMessage?.agent, parentAgent,
model: categoryModel, model: categoryModel,
skills: args.skills, skills: args.skills,
skillContent: systemContent, skillContent: systemContent,