# FFI And Rust

## Purpose

`rust/` 目录已退役，下面这份文档仅作为历史记录保留。它描述的是曾经存在的 Codex FFI 草图实现，不代表当前可用能力。

历史上这里的重点是：

- Rust 公开结构体与状态模型
- C ABI 函数签名
- Dart / Flutter 侧应该如何理解这些函数的参数与返回值
- 当前实现仍然是 stub 的地方在哪里

## Crate Layout

| File | Responsibility |
| --- | --- |
| `rust/src/lib.rs` | 对外 `pub use` 与 `#[no_mangle] extern "C"` 导出 |
| `rust/src/runtime.rs` | Rust-native runtime/config/state |
| `rust/src/types.rs` | FFI-safe message/result/event/account/model 结构 |
| `rust/src/error.rs` | `CodexError` 错误类型 |

## `CodexConfig`

- Source: `rust/src/runtime.rs`
- Type: `struct`
- Responsibility:
  C ABI 输入配置，描述 Codex 二进制、工作目录、sandbox/approval policy、model、gateway 和 debug。

### Fields

| Field | Type | Meaning |
| --- | --- | --- |
| `codex_path` | `*const c_char` | Codex 可执行文件路径 |
| `working_directory` | `*const c_char` | 工作目录 |
| `sandbox_mode` | `i32` | `0=read-only`, `1=workspace-write`, `2=danger-full-access` |
| `approval_policy` | `i32` | `0=suggest`, `1=auto-edit`, `2=full-auto` |
| `model` | `*const c_char` | 模型标识 |
| `api_key` | `*const c_char` | gateway API key |
| `gateway_url` | `*const c_char` | gateway URL |
| `debug` | `bool` | debug logging 开关 |

### Returns

| API | Returns | Meaning |
| --- | --- | --- |
| `Default::default()` | `CodexConfig` | 默认 FFI config |
| `to_rust(&self)` | `Result<CodexConfigRust, CodexError>` | 转成 Rust-native 配置 |

## `CodexConfigRust`

- Source: `rust/src/runtime.rs`
- Type: `struct`
- Responsibility:
  Rust-native 配置对象，所有指针型字符串都已经转成 `Option<String>`。

## `ThreadHandle`

- Source: `rust/src/runtime.rs`
- Type: `struct`
- Responsibility:
  作为 C ABI 的 thread opaque handle。

### Fields and Returns

| API | Returns | Meaning |
| --- | --- | --- |
| `id` | `u64` | 线程句柄 ID |
| `new(id)` | `ThreadHandle` | 构造有效句柄 |
| `null()` | `ThreadHandle` | 零值句柄 |
| `is_null()` | `bool` | 判空 |

## `RuntimeState`

- Source: `rust/src/runtime.rs`
- Type: `enum`
- Responsibility:
  Rust runtime 的内部状态机：`Disconnected / Connecting / Connected / Ready / Error`。

## `CodexRuntime`

- Source: `rust/src/runtime.rs`
- Type: `struct`
- Responsibility:
  Rust 侧管理 Codex 进程与错误状态的核心对象。

### Fields

| Field | Type | Meaning |
| --- | --- | --- |
| `config` | `CodexConfigRust` | Rust-native 配置 |
| `state` | `RuntimeState` | 当前状态 |
| `last_error` | `CString` | 最近错误信息 |

### Key Returns

| API | Returns | Meaning |
| --- | --- | --- |
| `new(config: CodexConfig)` | `CodexRuntime` | 由 FFI config 构造 |
| `with_config(config: CodexConfigRust)` | `CodexRuntime` | 由 Rust-native config 构造 |
| `state(&self)` | `RuntimeState` | 当前状态 |
| `set_error(&mut self, message: &str)` | `()` | 更新错误并切 `Error` |
| `find_codex_binary(&self)` | `Option<PathBuf>` | 查找 codex 二进制 |
| `start(&mut self)` | `Result<(), CodexError>` | 启动 runtime |
| `stop(&mut self)` | `Result<(), CodexError>` | 停止 runtime |

### Notes

- 当前 `start/stop` 仍然是 stub 型实现，尚未真正管理外部进程生命周期

## `CodexResult`

- Source: `rust/src/types.rs`
- Type: `struct`
- Responsibility:
  最通用的 FFI-safe 成败返回值。

### Fields

| Field | Type | Meaning |
| --- | --- | --- |
| `success` | `bool` | 是否成功 |
| `error_code` | `i32` | 错误码 |
| `error_message` | `*const c_char` | 错误消息指针 |

### Returns

| API | Returns | Meaning |
| --- | --- | --- |
| `ok()` | `CodexResult` | 成功结果 |
| `err(code, message)` | `CodexResult` | 失败结果 |

## `CodexMessage`

- Source: `rust/src/types.rs`
- Type: `struct`
- Responsibility:
  FFI-safe 消息载体。

### Fields

| Field | Type | Meaning |
| --- | --- | --- |
| `message_type` | `*const c_char` | text/code/tool_call 等类型 |
| `content` | `*const c_char` | 消息文本 |
| `thread_id` | `*const c_char` | thread ID |
| `turn_id` | `*const c_char` | turn ID |

## `CodexEvent`

- Source: `rust/src/types.rs`
- Type: `struct`
- Responsibility:
  FFI-safe 事件载体。

### Fields

| Field | Type | Meaning |
| --- | --- | --- |
| `event_type` | `*const c_char` | started/delta/completed/error |
| `thread_id` | `*const c_char` | thread ID |
| `turn_id` | `*const c_char` | turn ID |
| `data` | `*const c_char` | JSON 负载 |
| `timestamp` | `i64` | Unix millis |

## `CodexError`

- Source: `rust/src/error.rs`
- Type: `enum`
- Responsibility:
  Rust 侧统一错误表示，供 runtime 和 FFI 转换使用。

## Exported FFI Functions

下面这些函数曾定义在 `rust/src/lib.rs`，是 Flutter / Dart 侧的 C ABI 面。

## `codex_init`

- Type: `FFI function`
- Signature role:
  初始化入口，必须先于其它 FFI 调用。

### Parameters and Returns

| Parameters | Returns | Meaning |
| --- | --- | --- |
| none | `i32` | `0` 表示成功 |

## `codex_runtime_create`

- Type: `FFI function`
- Responsibility:
  创建 `CodexRuntime` 并返回原始指针。

### Parameters and Returns

| Parameters | Returns | Meaning |
| --- | --- | --- |
| `config: *const CodexConfig` | `*mut CodexRuntime` | 成功返回 runtime 指针，空指针表示失败 |

### Notes

- 调用方负责后续 `codex_runtime_destroy`

## `codex_runtime_destroy`

- Type: `FFI function`
- Responsibility:
  释放由 `codex_runtime_create` 返回的 runtime 指针。

### Parameters and Returns

| Parameters | Returns | Meaning |
| --- | --- | --- |
| `runtime: *mut CodexRuntime` | `void` | 空指针时 no-op |

## `codex_start_thread`

- Type: `FFI function`
- Responsibility:
  以 `cwd` 启动 thread，目前返回 stub `ThreadHandle::new(0)`。

### Parameters and Returns

| Parameters | Returns | Meaning |
| --- | --- | --- |
| `runtime: *mut CodexRuntime`, `cwd: *const c_char` | `ThreadHandle` | cwd 为空时返回 null handle |

## `codex_send_message`

- Type: `FFI function`
- Responsibility:
  向指定 thread 发送消息，目前仍是 stub。

### Parameters and Returns

| Parameters | Returns | Meaning |
| --- | --- | --- |
| `runtime`, `thread`, `message` | `i32` | `0` 成功，`-1` 表示参数非法 |

## `codex_poll_events`

- Type: `FFI function`
- Responsibility:
  从 runtime 读取事件数组，目前仍返回 `0`。

### Parameters and Returns

| Parameters | Returns | Meaning |
| --- | --- | --- |
| `runtime`, `events`, `max_events` | `usize` | 实际写入事件数量 |

## `codex_shutdown`

- Type: `FFI function`
- Responsibility:
  优雅关闭 runtime，目前仍是 stub。

### Parameters and Returns

| Parameters | Returns | Meaning |
| --- | --- | --- |
| `runtime: *mut CodexRuntime` | `i32` | `0` 成功，空指针返回 `-1` |

## `codex_last_error`

- Type: `FFI function`
- Responsibility:
  返回最近错误的 C 字符串指针。

### Parameters and Returns

| Parameters | Returns | Meaning |
| --- | --- | --- |
| `runtime: *mut CodexRuntime` | `*const c_char` | 指向静态有效到下次 FFI 调用前的错误文本 |

## Dart Integration Notes

- Dart 侧对应阅读顺序：
  1. `lib/runtime/codex_runtime.dart`
  2. `lib/runtime/codex_config_bridge.dart`
  3. `rust/src/lib.rs`
  4. `rust/src/runtime.rs`
  5. `rust/src/types.rs`
- 当前 FFI 面仅停留在结构体/函数签名骨架，消息收发、event polling、thread lifecycle 都未完成
