485ed50b26
Project CI / AI game creator shell Rust smoke (push) Has been cancelled
Project CI / AI game creator shell Rust crates (push) Has been cancelled
Project CI / Backend tests (push) Has been cancelled
Project CI / Native shell tests (push) Has been cancelled
Project CI / Frontend tests (push) Has been cancelled
Project CI / Repository checks (push) Has been cancelled
Project CI / AI game creator shell web tests (push) Has been cancelled
Project CI / AI game creator shell Rust shard 2/4 (push) Has been cancelled
Project CI / AI game creator shell Rust shard 1/4 (push) Has been cancelled
Project CI / AI game creator shell Rust shard 3/4 (push) Has been cancelled
Project CI / AI game creator shell Rust shard 4/4 (push) Has been cancelled
## 背景 净月潭案例(2026-09-19 21:53 → 09-20 01:26,3 小时 33 分)的问题不是模型慢,而是环境未就绪、验收靠模型自述、预算只约束单个工具入口、工具调用被 SDK 全局串行闸门卡住。本 PR 落地确认后的七项交付效率合同,并把捆绑 Codex 升到当前 npm latest。 ## 结果 - 新建 Web 游戏在正式生成前由宿主自动预检:捆绑 Node/npm、真实 Vite 构建、受限浏览器桌面/移动截图;失败不启动生成或付费素材。 - 首个副作用前冻结交付合同,宿主保存权威证据与预算;证据齐全后先封口、排空并取得执行器完整退出证明,再产出交付报告,模型回复不再当作验收。 - 原生 shell、内置浏览器与托管命令、第三方 MCP 共用同一执行许可和累计执行时间;`validation.maxRuns` 改为执行/返修批次语义,另设 `maxTurnSeconds` 墙钟上限。 - 所有工具可并发:移除 SDK 全局串行的 `apply_patch`/`update_plan` 注册,改由宿主 `agc_apply_patch`(官方 parser + 当前回合写许可 + 受控进程树 + 短项目事务)和 `agc_update_plan` 提供等价能力;真实请求目录里已无串行注册,长 MCP 与补丁/计划实测在同一响应内重叠。 - 付费提交与本地写入绑定原回合原租约:容量与同动作锁等待可取消,封口、取消或预算耗尽后零新增提交;已越过提交边界的请求保留 operation ID 走 GET 对账,不自动重放。 - 新增请求与工具分段计时、有界并行批读和首轮上下文预取,未知耗时不补零。 - 捆绑 Codex 0.147.0 → 0.155.1:固定版本收敛到 `build_support/codex_bundle.rs` 单一声明,vendor 解析源码按 `rust-v0.155.1` 逐字节重取并更新 UPSTREAM 证据,适配 0.155 统一 exec(`exec_command`/`write_stdin`);macOS 侧车最小系统版本仍为 15.0。 ## 验证 - 生产 CLI → 捆绑 Codex 0.155.1 → 本地 Responses/MCP 夹具 9/9:补丁、完成收尾、批次、只读/可写 MCP 并发、原生命令并发、原生资源并发、统一 exec 会话、期限终止(真实重叠 775 / 764 / 999 ms)。 - 真实模型目录 2/2;vendor 上游库 111 项;宿主定向与回归 106 项;真实 Windows 进程与取消 21 项;Node 侧门禁 52 项。 - 发行载荷:artifact-only 重建 NSIS,解包验证侧车清单 `codex-cli 0.155.1`、6 个组件哈希、打包后 `bin/codex.exe --version`、Node 运行时 2130 文件与双端 PNG、`--environment-check` ready。 - `check-config`、TypeScript、编码(4991 文件)、文档索引、`git diff --check`、`cargo fmt --check` 全部通过。 ## 未覆盖 - 真实陶泥儿登录态 Provider 生成尚未执行(本机 `--llm-status` 返回 `authentication-required`)。 - macOS 侧车只在本机做静态 Mach-O 与清单解析,未在 macOS 上跑 `check-macos-bundle.mjs`。 - 全仓库聚合套件在本机仍因负载敏感的后台 mock-provider 用例而红,与本次改动无关:改动前的旧二进制同样失败,换单线程后相关用例 3/3 通过。 --------- Co-authored-by: kdletters <61648117+kdletters@users.noreply.github.com> Reviewed-on: http://192.168.35.82/git/GenarrativeAI/Genarrative/pulls/439
76 lines
3.3 KiB
Rust
76 lines
3.3 KiB
Rust
mod client;
|
|
mod dispatch;
|
|
mod endpoint;
|
|
mod project_owner;
|
|
mod protocol;
|
|
mod server;
|
|
mod state;
|
|
|
|
#[allow(unused_imports)]
|
|
pub(crate) use client::{
|
|
attach_external_agent_runner_gui_owner, cancel_external_agent_runner_goal,
|
|
clear_external_agent_runner_platform_session, compact_external_agent_runner_context,
|
|
configure_external_agent_runner, configure_external_agent_runner_read_only,
|
|
continue_external_agent_runner_action, ensure_external_agent_runner_started,
|
|
ensure_external_agent_runner_started_for_gui, hold_external_agent_runner_gui_participant_lock,
|
|
install_external_agent_runner_platform_session,
|
|
interrupt_external_agent_runner_provider_for_steer_decision, notify_external_agent_runner,
|
|
pause_external_agent_runner, read_external_agent_runner_status,
|
|
require_external_agent_runner_configured_for_cli_runtime_write,
|
|
require_external_agent_runner_for_cli_runtime_write, resume_external_agent_runner,
|
|
shutdown_external_agent_runner, shutdown_external_agent_runner_for_client_exit,
|
|
shutdown_external_agent_runner_for_gui_exit, shutdown_external_agent_runner_if_idle,
|
|
steer_external_agent_runner, wake_external_agent_runner_pending,
|
|
wake_external_agent_runner_pending_for_run,
|
|
};
|
|
pub(crate) use client::{
|
|
call_external_managed_editor, disconnect_external_managed_editor,
|
|
disconnect_external_managed_editor_project, mark_external_editor_uncertain,
|
|
};
|
|
pub(crate) use endpoint::external_agent_runner_process_start_identity;
|
|
#[cfg(windows)]
|
|
pub(crate) use endpoint::validate_windows_regular_file_handle;
|
|
pub(crate) use endpoint::{external_agent_runner_enabled, external_agent_runner_is_server_process};
|
|
#[allow(unused_imports)]
|
|
pub(crate) use protocol::{ExternalAgentRunnerStatus, EXTERNAL_AGENT_RUNNER_PROTOCOL_VERSION};
|
|
pub(crate) use server::{
|
|
bind_loopback_listener_with_linux_fallback, run_external_agent_runner_server,
|
|
};
|
|
|
|
#[cfg(test)]
|
|
pub(crate) fn simulate_external_agent_runner_cross_boot_owner_claim_for_test(
|
|
root: &std::path::Path,
|
|
config_dir: &std::path::Path,
|
|
previous_boot_id: &str,
|
|
current_boot_id: &str,
|
|
) -> Result<(std::path::PathBuf, Option<String>), String> {
|
|
let previous = project_owner::acquire_external_agent_runner_project_execution_owner(
|
|
root,
|
|
previous_boot_id,
|
|
protocol::EXTERNAL_AGENT_RUNNER_PROTOCOL_VERSION,
|
|
)?;
|
|
drop(previous);
|
|
let state = state::ExternalAgentRunnerServerState::new(
|
|
config_dir.join(protocol::EXTERNAL_AGENT_RUNNER_ENDPOINT_FILE_NAME),
|
|
protocol::ExternalAgentRunnerEndpoint {
|
|
protocol_version: protocol::EXTERNAL_AGENT_RUNNER_PROTOCOL_VERSION,
|
|
pid: std::process::id(),
|
|
boot_id: current_boot_id.to_string(),
|
|
port: 41009,
|
|
token: "owner-provider-token-owner-provider-token".to_string(),
|
|
heartbeat_at: 1_725_000_000_000,
|
|
executable_fingerprint: Some("a".repeat(64)),
|
|
process_start_identity: None,
|
|
},
|
|
);
|
|
let claim = state.claim_project_execution_owner(root)?;
|
|
let result = (claim.root, claim.recovered_from_boot_id);
|
|
let second = state.claim_project_execution_owner(root)?;
|
|
if second.recovered_from_boot_id.is_some() {
|
|
return Err("同 boot execution owner 重入重复触发恢复".to_string());
|
|
}
|
|
Ok(result)
|
|
}
|
|
#[cfg(test)]
|
|
mod tests;
|