Skip to content

Commit 9209301

Browse files
authored
fix(processor): handle abort signal during cleanup (#11) (#41)
- Add abort check after retry sleep to prevent infinite loop - Check abort before and after snapshot patch - Log warning when cleanup interrupted mid-loop - Move completed time inside abort check - Add logging for aborted sleep
1 parent f5403bd commit 9209301

1 file changed

Lines changed: 33 additions & 21 deletions

File tree

‎packages/opencode/src/session/processor.ts‎

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,12 @@ export namespace SessionProcessor {
363363
message: retry,
364364
next: Date.now() + delay,
365365
})
366-
await SessionRetry.sleep(delay, input.abort).catch(() => {})
366+
await SessionRetry.sleep(delay, input.abort).catch((err) => {
367+
if (err?.name === "AbortError") {
368+
log.info("Sleep aborted, checking signal before retry")
369+
}
370+
})
371+
if (input.abort.aborted) break
367372
continue
368373
}
369374
input.assistantMessage.error = error
@@ -377,22 +382,21 @@ export namespace SessionProcessor {
377382
// and wrap in catch to prevent unhandled promise rejections
378383
const aborted = input.abort.aborted
379384
if (snapshot && !aborted) {
380-
await Snapshot.patch(snapshot)
381-
.then(async (patch) => {
382-
if (patch.files.length) {
383-
await Session.updatePart({
384-
id: Identifier.ascending("part"),
385-
messageID: input.assistantMessage.id,
386-
sessionID: input.sessionID,
387-
type: "patch",
388-
hash: patch.hash,
389-
files: patch.files,
390-
})
391-
}
392-
})
393-
.catch((err) => {
394-
log.error("cleanup patch failed", { error: err })
395-
})
385+
try {
386+
const patch = await Snapshot.patch(snapshot)
387+
if (patch.files.length && !input.abort.aborted) {
388+
await Session.updatePart({
389+
id: Identifier.ascending("part"),
390+
messageID: input.assistantMessage.id,
391+
sessionID: input.sessionID,
392+
type: "patch",
393+
hash: patch.hash,
394+
files: patch.files,
395+
})
396+
}
397+
} catch (err) {
398+
log.error("cleanup patch failed", { error: err })
399+
}
396400
snapshot = undefined
397401
}
398402

@@ -401,6 +405,10 @@ export namespace SessionProcessor {
401405
await MessageV2.parts(input.assistantMessage.id)
402406
.then(async (parts) => {
403407
for (const part of parts) {
408+
if (input.abort.aborted) {
409+
log.warn("Cleanup interrupted by abort - partial tool state")
410+
break
411+
}
404412
if (part.type === "tool" && part.state.status !== "completed" && part.state.status !== "error") {
405413
await Session.updatePart({
406414
...part,
@@ -424,10 +432,14 @@ export namespace SessionProcessor {
424432
})
425433
}
426434

427-
input.assistantMessage.time.completed = Date.now()
428-
await Session.updateMessage(input.assistantMessage).catch((err) => {
429-
log.error("cleanup message update failed", { error: err })
430-
})
435+
if (!input.abort.aborted) {
436+
try {
437+
input.assistantMessage.time.completed = Date.now()
438+
await Session.updateMessage(input.assistantMessage)
439+
} catch (err) {
440+
log.error("cleanup message update failed", { error: err })
441+
}
442+
}
431443
if (needsCompaction) return "compact"
432444
if (blocked) return "stop"
433445
if (input.assistantMessage.error) return "stop"

0 commit comments

Comments
 (0)