feat: add controlled codex thread rollback

This commit is contained in:
AI Bot
2026-06-03 13:30:24 +08:00
parent 13201e6aee
commit 7a30c2a8d9
11 changed files with 421 additions and 2 deletions

View File

@@ -62,6 +62,15 @@ function resolvePrompt(task) {
return String(task?.executionPrompt || task?.requestText || "").trim();
}
function isThreadRollbackTask(task) {
return task?.intentCategory === "thread_rollback" || task?.taskType === "thread_rollback";
}
function resolveRollbackNumTurns(task) {
const numeric = Number(task?.rollbackNumTurns ?? 1);
return Number.isFinite(numeric) && numeric >= 1 ? Math.floor(numeric) : undefined;
}
function normalizeTimeoutMs(value) {
const numeric = Number(value);
return Number.isFinite(numeric) && numeric > 0 ? Math.floor(numeric) : 120_000;
@@ -3088,6 +3097,28 @@ export async function executeCodexAppServerTask(runnerConfig, task) {
if (!threadId) {
throw new Error("CODEX_APP_SERVER_THREAD_ID_MISSING");
}
if (isThreadRollbackTask(task)) {
const numTurns = resolveRollbackNumTurns(task);
if (!numTurns) {
throw new Error("CODEX_APP_SERVER_ROLLBACK_NUM_TURNS_INVALID");
}
await request("thread/rollback", { threadId, numTurns });
return {
status: "completed",
replyBody: `已回滚 Codex 线程最近 ${numTurns} 轮。注意:这只回滚线程历史,不会自动还原本地文件变更。`,
threadId,
turnControl: "rollback",
rollback: {
numTurns,
},
cwd,
transport: runnerConfig.transport,
executionProgress: progressCollector.snapshot(),
canFallbackToCli: false,
};
}
const interThreadBroker = await maybeInjectInterThreadContext({
request,
task,