fix: abort embedded prompts on cancel

This commit is contained in:
Peter Steinberger
2026-01-18 05:17:28 +00:00
parent 89c5185f1c
commit 016693a1f5
16 changed files with 128 additions and 44 deletions

View File

@@ -359,6 +359,33 @@ export async function runEmbeddedAttempt(
runAbortController.abort();
void activeSession.abort();
};
const abortable = <T>(promise: Promise<T>): Promise<T> => {
const signal = runAbortController.signal;
if (signal.aborted) {
const err = new Error("aborted");
(err as { name?: string }).name = "AbortError";
return Promise.reject(err);
}
return new Promise<T>((resolve, reject) => {
const onAbort = () => {
const err = new Error("aborted");
(err as { name?: string }).name = "AbortError";
signal.removeEventListener("abort", onAbort);
reject(err);
};
signal.addEventListener("abort", onAbort, { once: true });
promise.then(
(value) => {
signal.removeEventListener("abort", onAbort);
resolve(value);
},
(err) => {
signal.removeEventListener("abort", onAbort);
reject(err);
},
);
});
};
const subscription = subscribeEmbeddedPiSession({
session: activeSession,
@@ -454,7 +481,7 @@ export async function runEmbeddedAttempt(
}
try {
await activeSession.prompt(params.prompt, { images: params.images });
await abortable(activeSession.prompt(params.prompt, { images: params.images }));
} catch (err) {
promptError = err;
} finally {