






















@@ -243,6 +243,7 @@ export async function startOrResumeThread(params: {
243243environmentSelection?: CodexTurnEnvironmentParams[];
244244pluginThreadConfig?: CodexPluginThreadConfigProvider;
245245contextEngineProjection?: CodexContextEngineThreadBootstrapProjection;
246+signal?: AbortSignal;
246247}): Promise<CodexAppServerThreadLifecycleBinding> {
247248// Thread lifecycle spans are useful when profiling startup churn, but normal
248249// turns should not pay Date.now/span-array overhead while resuming threads.
@@ -275,6 +276,22 @@ export async function startOrResumeThread(params: {
275276let preserveExistingBinding = false;
276277let rotatedContextEngineBinding = false;
277278let prebuiltPluginThreadConfig: CodexPluginThreadConfig | undefined;
279+const throwIfAborted = () => {
280+if (!params.signal?.aborted) {
281+return;
282+}
283+const reason = params.signal.reason;
284+if (reason instanceof Error) {
285+throw reason;
286+}
287+const error = new Error(
288+typeof reason === "string" && reason.length > 0
289+ ? reason
290+ : "codex app-server thread lifecycle aborted",
291+);
292+error.name = "AbortError";
293+throw error;
294+};
278295if (binding?.threadId && params.nativeCodeModeEnabled === false) {
279296embeddedAgentLog.debug(
280297"codex app-server native tool surface disabled for turn; starting transient thread",
@@ -446,9 +463,10 @@ export async function startOrResumeThread(params: {
446463);
447464const response = assertCodexThreadResumeResponse(
448465await lifecycleTiming.measure("thread_resume_request", () =>
449-params.client.request("thread/resume", resumeParams),
466+params.client.request("thread/resume", resumeParams, { signal: params.signal }),
450467),
451468);
469+throwIfAborted();
452470const boundAuthProfileId = authProfileId;
453471const fallbackModelProvider = resolveCodexAppServerModelProvider({
454472provider: params.params.provider,
@@ -570,7 +588,7 @@ export async function startOrResumeThread(params: {
570588);
571589const threadStartResponse = await lifecycleTiming.measure("thread_start_request", async () => {
572590try {
573-return await params.client.request("thread/start", startParams);
591+return await params.client.request("thread/start", startParams, { signal: params.signal });
574592} catch (error) {
575593if (error instanceof CodexAppServerRpcError) {
576594throw new CodexThreadStartRequestError(error);
@@ -579,6 +597,7 @@ export async function startOrResumeThread(params: {
579597}
580598});
581599const response = assertCodexThreadStartResponse(threadStartResponse);
600+throwIfAborted();
582601const modelProvider = resolveCodexAppServerModelProvider({
583602provider: params.params.provider,
584603authProfileId: params.params.authProfileId,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。