Skip to content

Commit bc57de3

Browse files
committed
fix(cli): drain run JSON events before exit
1 parent 2ecb6d8 commit bc57de3

2 files changed

Lines changed: 40 additions & 33 deletions

File tree

packages/opencode/src/cli/cmd/run.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,7 @@ export const RunCommand = effectCmd({
719719
}
720720
}
721721
}
722+
return error
722723
}
723724
const cwd = args.attach ? (directory ?? sess.directory ?? (await current(sdk))) : (directory ?? root)
724725
const client = args.attach ? attachSDK(cwd) : sdk
@@ -730,10 +731,7 @@ export const RunCommand = effectCmd({
730731

731732
if (!args.interactive) {
732733
const events = await client.event.subscribe()
733-
loop(client, events).catch((e) => {
734-
console.error(e)
735-
process.exit(1)
736-
})
734+
const completed = loop(client, events)
737735

738736
if (args.command) {
739737
await client.session.command({
@@ -744,6 +742,8 @@ export const RunCommand = effectCmd({
744742
arguments: message,
745743
variant: args.variant,
746744
})
745+
const error = await completed
746+
if (error) process.exitCode = 1
747747
return
748748
}
749749

@@ -755,6 +755,8 @@ export const RunCommand = effectCmd({
755755
variant: args.variant,
756756
parts: [...files, { type: "text", text: message }],
757757
})
758+
const error = await completed
759+
if (error) process.exitCode = 1
758760
return
759761
}
760762

packages/opencode/src/session/processor.ts

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,38 @@ export const layer: Layer.Layer<
365365
}
366366
})
367367

368+
const finishText = Effect.fn("SessionProcessor.finishText")(function* (
369+
providerMetadata?: Extract<StreamEvent, { type: "text-end" }>["providerMetadata"],
370+
) {
371+
if (!ctx.currentText) return
372+
// oxlint-disable-next-line no-self-assign -- reactivity trigger
373+
ctx.currentText.text = ctx.currentText.text
374+
ctx.currentText.text = (yield* plugin.trigger(
375+
"experimental.text.complete",
376+
{
377+
sessionID: ctx.sessionID,
378+
messageID: ctx.assistantMessage.id,
379+
partID: ctx.currentText.id,
380+
},
381+
{ text: ctx.currentText.text },
382+
)).text
383+
if (!ctx.assistantMessage.summary) {
384+
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
385+
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
386+
yield* sync.run(SessionEvent.Text.Ended.Sync, {
387+
sessionID: ctx.sessionID,
388+
text: ctx.currentText.text,
389+
timestamp: DateTime.makeUnsafe(Date.now()),
390+
})
391+
}
392+
}
393+
const end = Date.now()
394+
ctx.currentText.time = { start: ctx.currentText.time?.start ?? end, end }
395+
if (providerMetadata) ctx.currentText.metadata = providerMetadata
396+
yield* session.updatePart(ctx.currentText)
397+
ctx.currentText = undefined
398+
})
399+
368400
const handleEvent = Effect.fnUntraced(function* (value: StreamEvent) {
369401
switch (value.type) {
370402
case "request-start":
@@ -696,38 +728,11 @@ export const layer: Layer.Layer<
696728
return
697729

698730
case "text-end":
699-
if (!ctx.currentText) return
700-
// oxlint-disable-next-line no-self-assign -- reactivity trigger
701-
ctx.currentText.text = ctx.currentText.text
702-
ctx.currentText.text = (yield* plugin.trigger(
703-
"experimental.text.complete",
704-
{
705-
sessionID: ctx.sessionID,
706-
messageID: ctx.assistantMessage.id,
707-
partID: ctx.currentText.id,
708-
},
709-
{ text: ctx.currentText.text },
710-
)).text
711-
if (!ctx.assistantMessage.summary) {
712-
// TODO(v2): Temporary dual-write while migrating session messages to v2 events.
713-
if (Flag.OPENCODE_EXPERIMENTAL_EVENT_SYSTEM) {
714-
yield* sync.run(SessionEvent.Text.Ended.Sync, {
715-
sessionID: ctx.sessionID,
716-
text: ctx.currentText.text,
717-
timestamp: DateTime.makeUnsafe(Date.now()),
718-
})
719-
}
720-
}
721-
{
722-
const end = Date.now()
723-
ctx.currentText.time = { start: ctx.currentText.time?.start ?? end, end }
724-
}
725-
if (value.providerMetadata) ctx.currentText.metadata = value.providerMetadata
726-
yield* session.updatePart(ctx.currentText)
727-
ctx.currentText = undefined
731+
yield* finishText(value.providerMetadata)
728732
return
729733

730734
case "request-finish":
735+
yield* finishText()
731736
if (!ctx.assistantMessage.finish) yield* finishStep(value)
732737
return
733738
}

0 commit comments

Comments
 (0)