Files
oh-my-opencode/src/tools/call-omo-agent/completion-poller.ts
T
2026-04-04 02:02:12 +09:00

66 lines
2.0 KiB
TypeScript

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<string, unknown> }) => void
},
ctx: PluginInput
): Promise<void> {
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<string, { type: string }>)
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<unknown>, {
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.")
}
}