From 458e0e2a168419111cffb181b89379e31b3533d2 Mon Sep 17 00:00:00 2001 From: kdletters <61648117+kdletters@users.noreply.github.com> Date: Tue, 6 Oct 2026 14:01:24 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E9=BD=90=E8=BF=9B=E7=A8=8B=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E7=BB=88=E6=AD=A2=E9=80=9A=E9=81=93=E8=AF=8A=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 输出超限、ConPTY 和读取失败时保留终止控制发送错误 --- .../src/process_session/lifecycle.rs | 29 ++++++++++++++++--- docs/project-memory/shared-memory/pitfalls.md | 2 ++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/process_session/lifecycle.rs b/apps/ai-game-creator-shell/src-tauri/src/process_session/lifecycle.rs index 23b7fc096..472f29421 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/process_session/lifecycle.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/process_session/lifecycle.rs @@ -1022,7 +1022,12 @@ fn append_process_output_line(live: &LiveProcessSession, line: &[u8]) -> bool { output.stdin_open = false; live.output_changed.notify_all(); } - let _ = live.control.send(ProcessControl::Terminate); + if let Err(error) = live.control.send(ProcessControl::Terminate) { + app_log!( + "process_session.terminate_after_snapshot_failed processId={} detail={error}", + live.process_id + ); + } } true } @@ -1175,7 +1180,13 @@ fn drain_process_session_output( } live.output_changed.notify_all(); } - let _ = live.control.send(ProcessControl::Terminate); + if let Err(error) = live.control.send(ProcessControl::Terminate) + { + app_log!( + "process_session.terminate_after_conpty_failed processId={} detail={error}", + live.process_id + ); + } return; } conpty_cursor_replied = true; @@ -1255,7 +1266,12 @@ fn drain_process_session_output( output.stdin_open = false; live.output_changed.notify_all(); } - let _ = live.control.send(ProcessControl::OutputLimit); + if let Err(error) = live.control.send(ProcessControl::OutputLimit) { + app_log!( + "process_session.output_limit_control_failed processId={} detail={error}", + live.process_id + ); + } break; } } @@ -1272,7 +1288,12 @@ fn drain_process_session_output( } live.output_changed.notify_all(); } - let _ = live.control.send(ProcessControl::Terminate); + if let Err(error) = live.control.send(ProcessControl::Terminate) { + app_log!( + "process_session.terminate_after_output_read_failed processId={} detail={error}", + live.process_id + ); + } break; } } diff --git a/docs/project-memory/shared-memory/pitfalls.md b/docs/project-memory/shared-memory/pitfalls.md index 268afafcd..9c832253b 100644 --- a/docs/project-memory/shared-memory/pitfalls.md +++ b/docs/project-memory/shared-memory/pitfalls.md @@ -26,6 +26,8 @@ Direct 的 Tauri 进度、活动回合和 manifest 事件不能忽略 `app.emit` 进程会话在状态落盘失败后发送终止控制、关闭时发送 shutdown 的失败也要记录;否则会出现“状态已标记需核对,但目标进程仍活着”而诊断只显示落盘失败的半条事实。 +进程输出超限、ConPTY 握手失败、输出读取失败和快照落盘失败后的终止控制也属于同一条诊断链,控制消息发送失败要带 processId 写入日志,不能只留下业务错误正文。 + ## 2026-10-03 AGC 随包 plugins 的 feature 档位必须与消费方一致,且门禁会因 build.rs 未重跑而假通过 - **现象**:Windows 本机 `npm run check:generated-bindings`(`npm run lint` 链内,`scripts/check-repository-ci.sh` 的 Repository checks 也走它)在 `build.rs:167:29` panic:`插件随包资源校验失败:随包插件存在未声明文件:.../src-tauri/resources/plugins/agc-godot-editor/native/gdextension/bin/win-x64/agc_godot_editor.dll(目标 x86_64-pc-windows-msvc 与当前 feature 组合不允许;请先执行随包资源准备步骤)`;树上换成 `agc-unity-editor/dotnet/publish/win-x64/Agc.Unity.Attach.exe` 时报同一类错。反向还有更隐蔽的形态:门禁 2 秒就 exit 0 说「通过」,但 tree 上其实带着编辑器产物。