xworkmate-app/docs/reports/codex-ffi-status-report.md
Haitao Pan f72a38c570 docs: add comprehensive planning for unimplemented features
- Add roadmap for 4 phases of feature implementation
- Phase 1: AI Gateway enhancements (P0, 1-2 weeks)
- Phase 2: OpenClaw task scheduling (P1, 2-3 weeks)
- Phase 3: OpenClaw long-term memory (P1, 2-3 weeks)
- Phase 4: Codex FFI Rust embedded mode (P2, 4-6 weeks)
- Include task breakdown, acceptance criteria, and success metrics
- Add dependencies, milestones, and resource requirements
- Document risks and mitigation strategies
2026-03-14 10:32:19 +08:00

6.2 KiB
Raw Blame History

Codex Agent FFI 集成状态报告

测试执行时间

2026-03-14 10:20

FFI 库状态

文件路径: /Applications/XWorkmate.app/Contents/Frameworks/libcodex_ffi.dylib 大小: 302 KB (ARM64) 架构: Mach-O 64-bit dynamically linked shared library arm64

FFI 函数可用性测试

✅ 可用的 FFI 函数(已导出)

函数名 状态 说明
codex_init() ✅ 可用 初始化库,返回 0 表示成功
codex_runtime_create() ✅ 可用 创建运行时实例,返回有效指针
codex_runtime_destroy() ✅ 可用 销毁运行时实例,清理内存
codex_start_thread() ✅ 可用 启动线程,返回 ThreadHandle (id=0 表示空句柄)
codex_send_message() ✅ 可用 发送消息,返回 0 表示成功
codex_poll_events() ✅ 可用 轮询事件,返回 0 (未实现)
codex_shutdown() ✅ 可用 关闭运行时,返回 0 表示成功
codex_last_error() ✅ 可用 获取最后错误信息

❌ 核心功能实现状态

根据 Rust 源码分析 (rust/src/lib.rs 和 rust/src/runtime.rs):

功能 实现状态 代码位置
Codex CLI 进程启动 ❌ 未实现 runtime.rs:235 - // TODO: Start process
异步消息发送 ❌ 未实现 lib.rs:87 - // TODO: Implement async message sending
事件轮询机制 ❌ 未实现 lib.rs:108 - // TODO: Implement event polling
响应流处理 ❌ 未实现 无相关代码
进程停止管理 ❌ 未实现 runtime.rs:247 - // TODO: Stop process
Codex 二进制查找 ✅ 已实现 runtime.rs:202-221

对话功能测试结果

测试尝试

尝试通过 FFI 发送消息并轮询响应:

// 1. 创建运行时 ✅
runtime = codex_runtime_create(config);
// 结果: 成功,返回有效指针

// 2. 启动线程 ✅
thread = codex_start_thread(runtime, cwd);
// 结果: 返回 ThreadHandle,但 id=0 (空句柄)

// 3. 发送消息 ✅
result = codex_send_message(runtime, thread, message);
// 结果: 返回 0 (成功),但消息实际上未发送

// 4. 轮询响应 ❌
events = codex_poll_events(runtime, buffer, bufferSize);
// 结果: 返回 0 (无事件)
// 原因: 未实现事件队列和处理逻辑

结论

❌ 无法进行真正的 Codex agent 对话

原因:

  1. Codex CLI 进程从未启动
  2. FFI 函数只是桩代码(stubs),返回预定义值
  3. 没有实际的消息处理和响应机制
  4. 事件轮询返回 0,因为没有事件队列

执行功能测试结果

虽拟执行测试

尝试通过 FFI 执行类似 "创建文件" 的操作:

// 发送执行指令
codex_send_message(runtime, thread, "Create a file named test.txt");
// 结果: 返回 0 (成功),但:
// 1. Codex 进程未启动,无法接收指令
// 2. 没有执行管道和输出捕获
// 3. 没有文件系统操作的实际代码

结论

❌ 无法执行任何 Codex agent 操作

原因:

  • 没有进程管理代码
  • 没有 stdio 管道建立
  • 没有输出流处理
  • 没有文件系统操作接口

当前架构评估

✅ 已完成的部分

  1. FFI 接口定义 - 所有必要的函数签名已定义
  2. 内存管理 - Box 智能指针正确用于 FFI 边界
  3. 类型安全 - Rust Struct 和 Dart FFI 类型对应正确
  4. 编译构建 - dylib 成功编译并可加载
  5. 基础测试 - 简单的 FFI 调用可以成功执行

❌ 缺失的关键部分

  1. 进程管理 - 无子进程启动、监控、停止机制
  2. IPC 通信 - 无消息队列、事件通知机制
  3. 异步处理 - Rust 端无异步代码,Dart 端无回调接口
  4. Codex 集成 - 无实际调用 Codex CLI 的代码
  5. 错误处理 - 所有错误都被忽略,返回固定值

离线模式实际工作原理

由于 Codex FFI 未完全实现,当前应用在"离线模式"下:

实际使用的是

  • Stdio 桥接模式 - 通过 CodexRuntime Dart 类直接调用外部 Codex CLI
  • 外部 CLI 模式 - 启动独立的 codex 可执行文件进程,通过 stdin/stdout 通信

不是使用

  • ❌ 内置 FFI Rust 库 (libcodex_ffi.dylib)
  • ❌ 内存内的 Codex 实现
  • ❌ Rust 嵌入式 Codex

完整对话和执行的实现路径

要使 libcodex_ffi.dylib 能够进行真正的对话和执行,需要:

1. Rust 端实现

// 需要实现的核心组件:
- ProcessManager: 启动/停止 Codex CLI 进程
- MessageQueue: 异步消息队列
- EventStream: 事件流输出 (响应、日志、错误)
- StdioHandler: stdin/stdout/stderr 处理
- TaskScheduler: 任务执行调度

2. FFI 接口扩展

// 新增需要的函数:
- codex_execute_command() - 执行 shell 命令
- codex_read_file() - 读取文件内容
- codex_write_file() - 写入文件
- codex_list_directory() - 列出目录
- codex_get_response() - 获取 AI 响应流

3. Dart 端实现

// 需要实现:
- StreamController: 处理响应流
- CallbackHandler: Rust 回调转 Dart
- ErrorHandler: 错误传播
- TimeoutManager: 超时管理

建议

短期(当前可行)

继续使用外部 CLI 模式:

  • 通过 CodexRuntime.dart 直接启动 codex 可执行文件
  • 使用 Stdio 进行通信
  • 不依赖 FFI Rust 库

中期(需要开发)

实现基本 FFI 功能:

  1. 进程管理(启动/停止 Codex)
  2. 基础消息传递
  3. 简单响应接收

长期(完整功能)

完整 Rust FFI 实现:

  1. 嵌入式 Codex(无需外部 CLI)
  2. 异步事件流
  3. 文件系统操作
  4. 任务执行和监控

总结

测试项 结果 说明
FFI 库加载 ✅ 通过 dylib 可正常加载
FFI 函数调用 ✅ 通过 所有函数可调用
对话功能 ❌ 失败 未实现,Codex 进程未启动
执行功能 ❌ 失败 未实现,无 IPC 机制
响应接收 ❌ 失败 未实现,无事件流

当前状态: libcodex_ffi.dylib 提供了 FFI 接口的骨架,但缺乏实现对话和执行所需的核心逻辑。

实际可用方案: 应用当前通过外部 Codex CLI(Stdio 模式)在离线模式下运行,不依赖 Rust FFI 库。