import type { PluginInput } from "@opencode-ai/plugin" import { log } from "../../shared" import { normalizeSDKResponse } from "../../shared" export async function waitForCompletion( sessionID: string, toolContext: { sessionID: string messageID: string agent: string abort: AbortSignal metadata?: (input: { title?: string; metadata?: Record }) => void }, ctx: PluginInput ): Promise { log(`[call_omo_agent] Polling for completion...`) const POLL_INTERVAL_MS = 500 const MAX_POLL_TIME_MS = 5 * 60 * 1000 // 5 minutes max const pollStart = Date.now() let lastMsgCount = 0 let stablePolls = 0 const STABILITY_REQUIRED = 3 while (Date.now() - pollStart < MAX_POLL_TIME_MS) { if (toolContext.abort?.aborted) { log(`[call_omo_agent] Aborted by user`) throw new Error("Task aborted.") } await new Promise(resolve => setTimeout(resolve, POLL_INTERVAL_MS)) const statusResult = await ctx.client.session.status() const allStatuses = normalizeSDKResponse(statusResult, {} as Record) const sessionStatus = allStatuses[sessionID] if (sessionStatus && sessionStatus.type !== "idle") { stablePolls = 0 lastMsgCount = 0 continue } const messagesCheck = await ctx.client.session.messages({ path: { id: sessionID } }) const msgs = normalizeSDKResponse(messagesCheck, [] as Array, { preferResponseOnMissingData: true, }) const currentMsgCount = msgs.length if (currentMsgCount > 0 && currentMsgCount === lastMsgCount) { stablePolls++ if (stablePolls >= STABILITY_REQUIRED) { log(`[call_omo_agent] Session complete, ${currentMsgCount} messages`) break } } else { stablePolls = 0 lastMsgCount = currentMsgCount } } if (Date.now() - pollStart >= MAX_POLL_TIME_MS) { log(`[call_omo_agent] Timeout reached`) throw new Error("Agent task timed out after 5 minutes.") } }