fix: defer terminal turn status effects
This commit is contained in:
@@ -1222,7 +1222,7 @@ async function resolveCodeAgentTurnStatusSnapshot(traceId, options) {
|
||||
turnRefreshSatisfiedByResultSync = synced.eventsRefreshed === true || synced.resultSynced === true || synced.terminalRefreshSkipped === true;
|
||||
if (result && !canAccessOwnedResult(result, options.actor)) return forbiddenTurnSnapshot(traceId);
|
||||
if (result && isTraceCommandTerminalStatus(result.status)) {
|
||||
await recordCodeAgentTerminalTurnStatusEffects({ payload: result, params: result, options });
|
||||
scheduleCodeAgentTerminalTurnStatusEffects({ payload: result, params: result, options });
|
||||
}
|
||||
} catch (error) {
|
||||
resultPollError = error;
|
||||
@@ -1263,7 +1263,7 @@ async function resolveCodeAgentTurnStatusSnapshot(traceId, options) {
|
||||
agentRunResult = synced.result ?? agentRunResult;
|
||||
}
|
||||
if (isTraceCommandTerminalStatus(agentRunResult?.status)) {
|
||||
await recordCodeAgentTerminalTurnStatusEffects({ payload: agentRunResult, params: agentRunResult, options, preserveLastTraceId: true });
|
||||
scheduleCodeAgentTerminalTurnStatusEffects({ payload: agentRunResult, params: agentRunResult, options, preserveLastTraceId: true });
|
||||
}
|
||||
} catch (error) {
|
||||
refreshError = error;
|
||||
@@ -1788,20 +1788,64 @@ async function recordCodeAgentTerminalTurnStatusEffects({ payload = {}, params =
|
||||
const ownerSettled = !ownerRequired || Boolean(owner);
|
||||
const effects = {
|
||||
recorded: billingSettled && ownerSettled,
|
||||
pending: false,
|
||||
billingSettled,
|
||||
ownerSettled,
|
||||
preserveLastTraceId: Boolean(preserveLastTraceId),
|
||||
recordedAt: new Date().toISOString(),
|
||||
valuesPrinted: false
|
||||
};
|
||||
if (effects.recorded) {
|
||||
payload.turnStatusTerminalEffects = effects;
|
||||
const traceId = safeTraceId(payload.traceId ?? params.traceId);
|
||||
if (traceId) options.codeAgentChatResults?.set?.(traceId, payload);
|
||||
}
|
||||
payload.turnStatusTerminalEffects = effects;
|
||||
const traceId = safeTraceId(payload.traceId ?? params.traceId);
|
||||
if (traceId) options.codeAgentChatResults?.set?.(traceId, payload);
|
||||
return effects;
|
||||
}
|
||||
|
||||
function scheduleCodeAgentTerminalTurnStatusEffects({ payload = {}, params = {}, options = {}, preserveLastTraceId = false } = {}) {
|
||||
if (!payload || typeof payload !== "object" || !isTraceCommandTerminalStatus(payload.status)) return null;
|
||||
const existing = payload.turnStatusTerminalEffects;
|
||||
if (existing?.recorded === true || existing?.pending === true) return existing;
|
||||
const traceId = safeTraceId(payload.traceId ?? params.traceId);
|
||||
const pending = {
|
||||
recorded: false,
|
||||
pending: true,
|
||||
billingSettled: false,
|
||||
ownerSettled: false,
|
||||
preserveLastTraceId: Boolean(preserveLastTraceId),
|
||||
scheduledAt: new Date().toISOString(),
|
||||
valuesPrinted: false
|
||||
};
|
||||
payload.turnStatusTerminalEffects = pending;
|
||||
if (traceId) options.codeAgentChatResults?.set?.(traceId, payload);
|
||||
setImmediate(() => {
|
||||
void recordCodeAgentTerminalTurnStatusEffects({ payload, params, options, preserveLastTraceId }).catch((error) => {
|
||||
const failed = {
|
||||
recorded: false,
|
||||
pending: false,
|
||||
billingSettled: false,
|
||||
ownerSettled: false,
|
||||
preserveLastTraceId: Boolean(preserveLastTraceId),
|
||||
errorCode: error?.code ?? "terminal_turn_status_effects_failed",
|
||||
recordedAt: new Date().toISOString(),
|
||||
valuesPrinted: false
|
||||
};
|
||||
payload.turnStatusTerminalEffects = failed;
|
||||
if (traceId) {
|
||||
options.codeAgentChatResults?.set?.(traceId, payload);
|
||||
(options.traceStore ?? defaultCodeAgentTraceStore).append(traceId, {
|
||||
type: "turn-status",
|
||||
status: "degraded",
|
||||
label: "turn-status:terminal-effects-failed",
|
||||
errorCode: failed.errorCode,
|
||||
message: error?.message ?? "Terminal turn status side effects failed and will retry on the next poll.",
|
||||
valuesPrinted: false
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
return pending;
|
||||
}
|
||||
|
||||
function codeAgentTerminalBillingSettled({ payload = {}, params = {}, options = {}, billing = null } = {}) {
|
||||
const reservation = params.userBillingReservation ?? payload.userBillingReservation;
|
||||
const reservationId = typeof reservation?.reservationId === "string" ? reservation.reservationId : "";
|
||||
|
||||
Reference in New Issue
Block a user