export * as SubagentCompletion from "./subagent-completion.js" import { Effect } from "effect" import type { Job } from "../job.js" import type { Session } from "../session.js" import type { SessionMessage } from "./message.js" export const NO_TEXT = "Subagent completed without a text response." export function text(message: SessionMessage.Info | undefined) { if (message?.type !== "assistant") return NO_TEXT return ( message.content .filter((part) => part.type === "text") .map((part) => part.text) .join("") || NO_TEXT ) } export const deliver = Effect.fnUntraced(function* ( sessions: Pick, jobs: Pick, input: Pick & { recovery: Extract resume?: boolean }, ) { if (input.status === "running") return const recovery = input.recovery const text = input.status === "completed" ? (input.output ?? NO_TEXT) : input.status === "error" ? (input.error ?? "Subagent failed") : "Subagent cancelled" yield* sessions.synthetic({ ...(input.notificationID ? { id: input.notificationID } : {}), sessionID: recovery.parentSessionID, ...(input.resume === false ? { resume: false } : {}), description: recovery.description, text: `\n${text}\n`, metadata: { source: "subagent", childID: recovery.childSessionID, agent: recovery.agent, state: input.status }, }) if (input.notificationID) yield* jobs.completeBackground(input.notificationID) })