|
|
@@ -254,17 +254,21 @@ export namespace SessionPrompt {
|
|
|
return s[sessionID].abort.signal
|
|
|
}
|
|
|
|
|
|
- export function cancel(sessionID: string) {
|
|
|
+ export function cancel(sessionID: string, reason: SessionStatus.IdleReason = "aborted") {
|
|
|
log.info("cancel", { sessionID })
|
|
|
+ const idle = () => {
|
|
|
+ if (SessionStatus.get(sessionID).type === "idle") return
|
|
|
+ SessionStatus.set(sessionID, { type: "idle", reason })
|
|
|
+ }
|
|
|
const s = state()
|
|
|
const match = s[sessionID]
|
|
|
if (!match) {
|
|
|
- SessionStatus.set(sessionID, { type: "idle" })
|
|
|
+ idle()
|
|
|
return
|
|
|
}
|
|
|
match.abort.abort()
|
|
|
delete s[sessionID]
|
|
|
- SessionStatus.set(sessionID, { type: "idle" })
|
|
|
+ idle()
|
|
|
return
|
|
|
}
|
|
|
|
|
|
@@ -283,7 +287,8 @@ export namespace SessionPrompt {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
- using _ = defer(() => cancel(sessionID))
|
|
|
+ let reason: SessionStatus.IdleReason = "completed"
|
|
|
+ using _ = defer(() => cancel(sessionID, reason))
|
|
|
|
|
|
// Structured output state
|
|
|
// Note: On session resumption, state is reset but outputFormat is preserved
|
|
|
@@ -295,7 +300,10 @@ export namespace SessionPrompt {
|
|
|
while (true) {
|
|
|
SessionStatus.set(sessionID, { type: "busy" })
|
|
|
log.info("loop", { step, sessionID })
|
|
|
- if (abort.aborted) break
|
|
|
+ if (abort.aborted) {
|
|
|
+ reason = "aborted"
|
|
|
+ break
|
|
|
+ }
|
|
|
let msgs = await MessageV2.filterCompacted(MessageV2.stream(sessionID))
|
|
|
|
|
|
let lastUser: MessageV2.User | undefined
|
|
|
@@ -536,7 +544,10 @@ export namespace SessionPrompt {
|
|
|
auto: task.auto,
|
|
|
overflow: task.overflow,
|
|
|
})
|
|
|
- if (result === "stop") break
|
|
|
+ if (result === "stop") {
|
|
|
+ reason = abort.aborted ? "aborted" : "completed"
|
|
|
+ break
|
|
|
+ }
|
|
|
continue
|
|
|
}
|
|
|
|
|
|
@@ -698,11 +709,19 @@ export namespace SessionPrompt {
|
|
|
retries: 0,
|
|
|
}).toObject()
|
|
|
await Session.updateMessage(processor.message)
|
|
|
+ reason = "error"
|
|
|
break
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (result === "stop") break
|
|
|
+ if (result === "stop") {
|
|
|
+ if (processor.message.error?.name === "MessageAbortedError") {
|
|
|
+ reason = "aborted"
|
|
|
+ } else if (processor.message.error) {
|
|
|
+ reason = "error"
|
|
|
+ }
|
|
|
+ break
|
|
|
+ }
|
|
|
if (result === "compact") {
|
|
|
await SessionCompaction.create({
|
|
|
sessionID,
|