feat(v0.1): codex-stdio emit codex-rollout-storage-mounted + session-store-evicted upgrade
PR C 收尾:codex-stdio.ts 加 observability + new failureKind 升级路径 - 启动时读 env(不是 process.env)发出 codex-rollout-storage-mounted 事件: pvcName / pvcNamespace / mountPath / codexRolloutSubdir / valuesPrinted=false - thread/resume 失败 + 'no rollout found for thread id' 消息 + AGENTRUN_SESSION_PVC_NAME 已设 → 升级为 session-store-evicted,区别于 thread-resume-failed - isNoRolloutFoundMessage helper 隔离匹配逻辑 - 4 新 selftest case: codex-stdio-session-storage-mounted(事件存在 + 字段对齐) codex-stdio-session-storage-evicted(failureKind 升级) codex-stdio-session-storage-subdir(AGENTRUN_CODEX_ROLLOUT_SUBDIR 配置生效) codex-stdio-session-storage-no-secret-leak(事件不泄露) PR C 全部完成:runner Job 直接挂载 PVC + codex-stdio observability + session-store-evicted 升级 + 5 新 selftest(1 runner + 4 codex)
This commit is contained in:
@@ -478,6 +478,13 @@ async function runCodexStdioTurnWithSession(options: CodexStdioTurnOptions, sess
|
||||
};
|
||||
|
||||
const willResumeThread = Boolean(options.threadId);
|
||||
const sessionPvcName = env.AGENTRUN_SESSION_PVC_NAME?.trim() || null;
|
||||
const sessionPvcNamespace = env.AGENTRUN_SESSION_PVC_NAMESPACE?.trim() || null;
|
||||
const sessionPvcMountPath = env.AGENTRUN_SESSION_PVC_MOUNT_PATH?.trim() || null;
|
||||
const codexRolloutSubdirEnv = env.AGENTRUN_CODEX_ROLLOUT_SUBDIR?.trim() || null;
|
||||
if (sessionPvcName && sessionPvcNamespace && sessionPvcMountPath) {
|
||||
emitEvent({ type: "backend_status", payload: { phase: "codex-rollout-storage-mounted", pvcName: sessionPvcName, pvcNamespace: sessionPvcNamespace, mountPath: sessionPvcMountPath, codexRolloutSubdir: codexRolloutSubdirEnv ?? "sessions", valuesPrinted: false } });
|
||||
}
|
||||
if (options.threadId) {
|
||||
try {
|
||||
const threadResponse = requireResponseRecord(await client.request("thread/resume", withOptionalModel({ threadId: options.threadId, cwd: options.cwd, approvalPolicy: options.approvalPolicy, sandbox: options.sandbox }, options.model), requestTimeoutMs), "thread/resume");
|
||||
@@ -485,6 +492,14 @@ async function runCodexStdioTurnWithSession(options: CodexStdioTurnOptions, sess
|
||||
emitEvent({ type: "backend_status", payload: { phase: "thread/resume:completed", threadId } });
|
||||
} catch (error) {
|
||||
const failure = normalizeFailure(error);
|
||||
if (sessionPvcName && isNoRolloutFoundMessage(failure.message)) {
|
||||
throw new CodexStdioFailure(
|
||||
"session-store-evicted",
|
||||
`codex app-server thread/resume reported no rollout found for PVC-backed session; session storage was likely evicted`,
|
||||
"thread/resume",
|
||||
{ requestedThreadId: options.threadId, pvcName: sessionPvcName, pvcNamespace: sessionPvcNamespace, pvcMountPath: sessionPvcMountPath, originalFailureKind: failure.failureKind, originalPhase: failure.phase, originalDetails: redactJson(failure.details), valuesPrinted: false },
|
||||
);
|
||||
}
|
||||
throw threadResumeFailure(options.threadId, failure);
|
||||
}
|
||||
} else {
|
||||
@@ -1033,6 +1048,10 @@ function threadResumeFailure(threadId: string, error: CodexStdioFailure): CodexS
|
||||
);
|
||||
}
|
||||
|
||||
function isNoRolloutFoundMessage(message: string): boolean {
|
||||
return /no rollout found for thread id/i.test(message);
|
||||
}
|
||||
|
||||
function classifyCodexErrorRecord(error: JsonRecord, fallback: FailureKind): FailureKind {
|
||||
const parts: string[] = [];
|
||||
if (typeof error.message === "string") parts.push(error.message);
|
||||
|
||||
Reference in New Issue
Block a user