




















@@ -61,16 +61,19 @@ function shouldRetryFreshCliSessionAfterFailover(params: {
6161error: FailoverError;
6262hasHistoryPrompt: boolean;
6363}): boolean {
64-// These reasons can mean only the resumed CLI session is bad. Auth, billing,
65-// rate-limit, and provider/config errors should clear stale state but surface.
6664if (!params.hasHistoryPrompt) {
6765return false;
6866}
69-return (
70-params.error.reason === "session_expired" ||
71-(params.error.reason === "unknown" && params.error.code === "cli_unknown_empty_failure") ||
72-(params.error.reason === "timeout" && params.error.code === "cli_no_output_timeout")
73-);
67+switch (params.error.reason) {
68+case "session_expired":
69+return true;
70+case "unknown":
71+return params.error.code === "cli_unknown_empty_failure";
72+case "timeout":
73+return params.error.code === "cli_no_output_timeout";
74+default:
75+return false;
76+}
7477}
75787679export async function isCliBindingFlushed(
@@ -666,7 +669,6 @@ export async function runPreparedCliAgent(
666669};
667670};
668671669-// Try with the provided CLI session ID first
670672try {
671673await bootstrapHarnessContextEngine({
672674hadSessionFile: context.hadSessionFile,
@@ -686,6 +688,35 @@ export async function runPreparedCliAgent(
686688config: params.config,
687689})
688690 : [];
691+const finishCliAttempt = async (
692+result: Awaited<ReturnType<typeof executeCliAttempt>>,
693+fallbackCliSessionId?: string,
694+) => {
695+const { output, lastAssistant } = result;
696+const assistantText = output.text.trim();
697+const effectiveCliSessionId = output.sessionId ?? fallbackCliSessionId;
698+await finalizeCliContextEngineTurn({
699+ context,
700+historyMessages: context.contextEngine ? contextEngineHistoryMessages : historyMessages,
701+ assistantText,
702+ output,
703+});
704+const bindingFlushOk = await isCliBindingFlushed(
705+effectiveCliSessionId,
706+params.provider,
707+context.cwd ?? context.workspaceDir,
708+);
709+await runCliAgentEndHook(params, {
710+event: {
711+messages: buildAgentEndMessages(lastAssistant),
712+success: true,
713+durationMs: Date.now() - context.started,
714+},
715+ctx: hookContext,
716+ hookRunner,
717+});
718+return buildCliRunResult({ output, effectiveCliSessionId, bindingFlushOk });
719+};
689720690721if (hasBeforeAgentRunHooks && hookRunner) {
691722let beforeRunResult:
@@ -747,32 +778,10 @@ export async function runPreparedCliAgent(
747778 hookRunner,
748779});
749780try {
750-const { output, lastAssistant } = await executeCliAttempt(
781+return await finishCliAttempt(
782+await executeCliAttempt(context.reusableCliSession.sessionId),
751783context.reusableCliSession.sessionId,
752784);
753-const assistantText = output.text.trim();
754-const effectiveCliSessionId = output.sessionId ?? context.reusableCliSession.sessionId;
755-await finalizeCliContextEngineTurn({
756- context,
757-historyMessages: context.contextEngine ? contextEngineHistoryMessages : historyMessages,
758- assistantText,
759- output,
760-});
761-const bindingFlushOk = await isCliBindingFlushed(
762-effectiveCliSessionId,
763-params.provider,
764-context.cwd ?? context.workspaceDir,
765-);
766-await runCliAgentEndHook(params, {
767-event: {
768-messages: buildAgentEndMessages(lastAssistant),
769-success: true,
770-durationMs: Date.now() - context.started,
771-},
772-ctx: hookContext,
773- hookRunner,
774-});
775-return buildCliRunResult({ output, effectiveCliSessionId, bindingFlushOk });
776785} catch (err) {
777786if (isFailoverError(err)) {
778787const retryableSessionId = context.reusableCliSession.sessionId;
@@ -802,32 +811,7 @@ export async function runPreparedCliAgent(
802811cliBackendLog.warn(
803812`cli session recovery retry: provider=${params.provider} reason=${err.reason} sessionKey=${params.sessionKey}`,
804813);
805-const { output, lastAssistant } = await executeCliAttempt(undefined, retryTimeoutMs);
806-const assistantText = output.text.trim();
807-const effectiveCliSessionId = output.sessionId;
808-await finalizeCliContextEngineTurn({
809- context,
810-historyMessages: context.contextEngine
811- ? contextEngineHistoryMessages
812- : historyMessages,
813- assistantText,
814- output,
815-});
816-const bindingFlushOk = await isCliBindingFlushed(
817-effectiveCliSessionId,
818-params.provider,
819-context.cwd ?? context.workspaceDir,
820-);
821-await runCliAgentEndHook(params, {
822-event: {
823-messages: buildAgentEndMessages(lastAssistant),
824-success: true,
825-durationMs: Date.now() - context.started,
826-},
827-ctx: hookContext,
828- hookRunner,
829-});
830-return buildCliRunResult({ output, effectiveCliSessionId, bindingFlushOk });
814+return await finishCliAttempt(await executeCliAttempt(undefined, retryTimeoutMs));
831815} catch (retryErr) {
832816const retryMessage = formatErrorMessage(retryErr);
833817await runCliAgentEndHook(params, {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。