fix: address cubic review issues - abort handling, error metadata, logger binding

This commit is contained in:
YeonGyu-Kim
2026-03-16 15:18:41 +09:00
parent 40f25fb07d
commit ed92a05e59
3 changed files with 16 additions and 6 deletions

View File

@@ -65,6 +65,7 @@ export function createOmoRunner(options: CreateOmoRunnerOptions): OmoRunner {
onError, onError,
} = options } = options
let connectionPromise: Promise<ServerConnection> | null = null let connectionPromise: Promise<ServerConnection> | null = null
let connectionController: AbortController | null = null
let closed = false let closed = false
let activeRun: Promise<unknown> | null = null let activeRun: Promise<unknown> | null = null
@@ -78,11 +79,11 @@ export function createOmoRunner(options: CreateOmoRunnerOptions): OmoRunner {
throw new Error("Runner is closed") throw new Error("Runner is closed")
} }
if (connectionPromise === null) { if (connectionPromise === null) {
const controller = new AbortController() connectionController = new AbortController()
connectionPromise = createServerConnection({ connectionPromise = createServerConnection({
port, port,
attach, attach,
signal: controller.signal, signal: connectionController.signal,
logger: silentLogger, logger: silentLogger,
}) })
} }
@@ -178,9 +179,11 @@ export function createOmoRunner(options: CreateOmoRunnerOptions): OmoRunner {
}, },
async close() { async close() {
closed = true closed = true
connectionController?.abort()
const connection = await connectionPromise const connection = await connectionPromise
connection?.cleanup() connection?.cleanup()
connectionPromise = null connectionPromise = null
connectionController = null
}, },
} }
} }

View File

@@ -95,11 +95,18 @@ export async function executeRunSession(
const resolvedModel = resolveRunModel(model) const resolvedModel = resolveRunModel(model)
const abortController = new AbortController() const abortController = new AbortController()
const startTime = Date.now() const startTime = Date.now()
let resolvedSessionId: string | undefined
// Check if signal was already aborted before setting up listener
if (signal?.aborted) {
abortController.abort()
}
const forwardAbort = () => abortController.abort() const forwardAbort = () => abortController.abort()
signal?.addEventListener("abort", forwardAbort, { once: true }) signal?.addEventListener("abort", forwardAbort, { once: true })
try { try {
const resolvedSessionId = await resolveSession({ resolvedSessionId = await resolveSession({
client, client,
sessionId, sessionId,
directory, directory,
@@ -182,12 +189,12 @@ export async function executeRunSession(
const serialized = serializeError(error) const serialized = serializeError(error)
await eventObserver?.onEvent?.({ await eventObserver?.onEvent?.({
type: "session.error", type: "session.error",
sessionId: sessionId ?? "", sessionId: resolvedSessionId ?? sessionId ?? "",
error: serialized, error: serialized,
}) })
await eventObserver?.onError?.({ await eventObserver?.onError?.({
type: "session.error", type: "session.error",
sessionId: sessionId ?? "", sessionId: resolvedSessionId ?? sessionId ?? "",
error: serialized, error: serialized,
}) })
throw error throw error

View File

@@ -26,7 +26,7 @@ async function startServer(options: {
logger?: RunLogger logger?: RunLogger
}): Promise<ServerConnection> { }): Promise<ServerConnection> {
const { signal, port, logger } = options const { signal, port, logger } = options
const log = logger?.log ?? console.log const log = logger?.log?.bind(logger) ?? console.log
const { client, server } = await withWorkingOpencodePath(() => const { client, server } = await withWorkingOpencodePath(() =>
createOpencode({ signal, port, hostname: "127.0.0.1" }), createOpencode({ signal, port, hostname: "127.0.0.1" }),
) )