修 emit 活动白名单漏项并统一宿主时钟
- runtime_driver/entrypoints.rs:emit 白名单补 host-review / error-feedback——DirectRuntime 实际会传这两个活动,漏项在 debug 构建 panic、release 构建静默丢掉整次进度回填 - runtime_driver/entrypoints.rs:updated_at 改用 direct_now_ms(),删掉内联 Unix-ms 计算,宿主只留一个时钟 - runtime_driver/entrypoints.rs:新增用例钉住 DirectRuntime 传过的全部活动值都在白名单内 - docs:工具调用卡片技术方案「背景与现状」补 superseded 说明,去掉失效的 src/app/types.ts:1090 指针 - 验证:cargo test --bin genarrative-ai-game-creator-shell agent::(930 passed / 0 failed / 5 ignored)、npm run check:encoding、npm run check:doc-index、git diff --check
This commit is contained in:
@@ -93,6 +93,8 @@ impl DirectGameCreatorTurnUpdateEmitter {
|
||||
| "controlled-tool"
|
||||
| "web-search"
|
||||
| "context-compaction"
|
||||
| "host-review"
|
||||
| "error-feedback"
|
||||
| "response-finalization"
|
||||
| "none"
|
||||
)
|
||||
@@ -102,11 +104,7 @@ impl DirectGameCreatorTurnUpdateEmitter {
|
||||
return;
|
||||
}
|
||||
let sequence = self.sequence.fetch_add(1, Ordering::AcqRel) + 1;
|
||||
let updated_at = SystemTime::now()
|
||||
.duration_since(UNIX_EPOCH)
|
||||
.unwrap_or_default()
|
||||
.as_millis()
|
||||
.min(u64::MAX as u128) as u64;
|
||||
let updated_at = crate::agent::direct_now_ms();
|
||||
update_active_turn(
|
||||
&self.thread_id,
|
||||
&self.turn_id,
|
||||
@@ -936,3 +934,33 @@ pub(crate) fn read_game_creator_agent_runtimes_at(
|
||||
.map(|agent_id| read_game_creator_agent_runtime_at(root, &agent_id))
|
||||
.collect()
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
/// DirectRuntime 实际传过的活动值必须都在 `emit` 白名单里:漏一个会在 debug 构建 panic、
|
||||
/// 在 release 构建静默丢掉整次进度回填(首页「运行中的项目」不再随这一轮更新)。
|
||||
#[test]
|
||||
fn emit_accepts_every_activity_the_direct_runtime_passes() {
|
||||
let root = std::env::temp_dir().join("agc-emit-activity-guard");
|
||||
let emitter = DirectGameCreatorTurnUpdateEmitter::new(&root, "turn-guard".to_string());
|
||||
for activity in [
|
||||
"request-accepted",
|
||||
"preparing",
|
||||
"file-read",
|
||||
"file-write",
|
||||
"game-verify",
|
||||
"command-exec",
|
||||
"controlled-tool",
|
||||
"web-search",
|
||||
"context-compaction",
|
||||
"host-review",
|
||||
"error-feedback",
|
||||
"response-finalization",
|
||||
"none",
|
||||
] {
|
||||
emitter.emit("running", Some(activity));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,9 +46,11 @@
|
||||
|
||||
## 背景与现状(2026-09-14 立项时点)
|
||||
|
||||
> 以下记录立项时点的现状,用来解释这次改造的动机;其中「工具调用不留痕」「没有结构化工具调用」等结论都已被后续实现与 2026-09-16 修订取代,**当前状态以文首修订与 ADR 为准**。
|
||||
|
||||
- 数据来源:Codex app-server 会推 `item/started` / `item/completed`,item 里带完整信息(`commandExecution.command`、`fileChange.changes[].path` 等)。
|
||||
- 现状投影:`apps/ai-game-creator-shell/src-tauri/src/agent/codex_app_server.rs` 的 `direct_codex_item_intermediate_text()`(约 791 行)把 item **压成一行中文文本**(`正在执行命令:xxx` / `正在写入文件:xxx`),经 `DirectCodexTurnObservation::IntermediateText` 下发。
|
||||
- 前端事件:`GameCreatorDirectTurnUpdateEvent`(`src/app/types.ts:1090`)只有 `projectPath / turnId / sequence / status / activity / accumulatedText / updatedAt`,**没有结构化工具调用**。
|
||||
- 前端事件:`GameCreatorDirectTurnUpdateEvent`(该事件已随 issue #553 删除)只有 `projectPath / turnId / sequence / status / activity / accumulatedText / updatedAt`,**没有结构化工具调用**。
|
||||
- 历史持久化:`.agent/conversations/project.jsonl` 现在只写 message 条目(实测 61 条全是 message),工具调用不留痕。
|
||||
- 历史回读:`read_direct_project_chat_history_at()`(`direct_project_history.rs:575`)只把 `role ∈ {user, assistant}` 且有文本的条目投影成 `LocalConversationMessageRecord`,**形状上装不下工具调用**。
|
||||
- 结论:要做成卡片必须同时改「采集 → 传输 → 持久化 → 回读 → 渲染」五段,纯前端做不出来。
|
||||
|
||||
Reference in New Issue
Block a user