返回列表
Codex 伴侣
firmwarecommunityai-passportassistant

Codex 伴侣

将 AI Passport 打造成 Codex 开发伴侣

作者 @bingkina版本 v1.0.1更新 2026/08/232

关于

FoloToy Codex Buddy

FoloToy Codex Buddy 是面向 FoloToy AI Passport 的 ESP32-C3 固件与桌面桥接 方案。它把原本独立的掌上设备变成 Codex 的实体伴侣:当 Codex 思考、执行命令、修改 文件或等待授权时,设备会用状态界面、像素宠物、灯光和声音给出反馈;用户也可以直接用 三个实体按键批准一次、使用 Codex 明确提供的会话级批准,或拒绝操作。

项目希望解决一个很具体的问题:长时间运行 Codex 任务时,用户不必一直盯着终端,也不必 在审批出现时重新切回电脑。AI Passport 负责展示经过压缩的任务信息和承接明确的审批动作, 完整命令、diff 与模型输出仍保留在电脑端。

当前固件基于 ESP-IDF 5.5.3,目标芯片为 ESP32-C3。FoloToy AI Passport 没有 PSRAM,因此界面和 19 种宠物均采用低内存程序化绘制。

演示视频

观看 FoloToy Codex Buddy 演示视频

点击封面前往 YouTube 观看完整演示。

项目组成

             Codex 原生 TUI
                    │ WebSocket JSON-RPC(localhost)
                    ▼
         Codex Buddy 审批代理
              ┌─────┴─────┐
              │           │
      Codex app-server   加密 BLE Nordic UART
                          │
                          ▼
             FoloToy AI Passport(ESP32-C3)
模块作用
ESP32-C3 固件驱动屏幕、按键、电池、音频和 BLE,渲染状态并安全提交审批结果
macOS 桥接器启动本地 app-server 与原生 TUI,透明转发流量并把状态和审批映射到设备协议
Buddy 协议 v2提供能力协商、审批 nonce、结果 ACK、幂等重试和心跳失效保护
主机测试与兼容性工具在没有硬件时验证协议、状态机、队列策略和 Codex schema 兼容性

代理只管理通过它创建或恢复的 Codex thread,不能接管 Codex Desktop 中已经运行的任务。 三类审批请求不会再转发给 TUI,而是只等待设备决策;普通问题、MCP 表单和其他未知服务端 请求仍透明传给原生 TUI。设备也不是通用远程终端:它只展示适合 240×320 屏幕的摘要, 并把实体按键决策返回给对应的审批请求。

核心能力

  • 显示 Ready、Thinking、Working、Approval required、Completed、 Failed 和 Interrupted 等 Codex 状态。
  • UP 批准一次、OK 执行 Codex 明确提供的会话级批准、DOWN 拒绝。
  • 支持 command、file-change、filesystem permission 和 network permission 审批。
  • Codex 风格近黑高对比 UI,状态栏显示 BLE、安全连接、电量和时间。
  • 设备页显示电池百分比和电压,低电量使用颜色与数字共同提示。
  • 审批到达时双音和持续闪屏提醒,任务完成时播放上升音并闪屏。
  • 19 种 4-bit 程序化像素宠物;CODEX 为启动默认宠物,支持七种状态动画。
  • BLE LE Secure Connections、六位码配对、绑定、加密读写和自动重连。
  • 协议 v2 包含 capability negotiation、审批 nonce、结果 ACK 和幂等重试。
  • 30 秒没有有效心跳时清除审批,避免离线或旧连接继续授权。

适用场景

  • 在编译、测试或代码生成任务运行时,把 AI Passport 放在桌面上查看进度。
  • 离开终端窗口后,通过声音和闪屏及时发现新的审批请求或任务完成事件。
  • 演示 Codex 的任务状态、权限边界和人机协作流程。
  • 研究资源受限 ESP32-C3 上的 LVGL、NimBLE、安全配对和可靠消息协议实现。

本项目目前以 macOS 桥接器为主,适合开发和实验使用。固件构建、主机测试和一次实机启动 冒烟检查已有记录;配对重连循环、完整审批流程和 30 分钟稳定性仍需按 docs/validation/ 中的清单在真实设备上完成,不能仅凭编译通过视为 完整硬件验收。

硬件与软件要求

硬件:

  • FoloToy AI Passport(ESP32-C3、8 MB Flash)
  • ST7789P3 240×320 屏幕
  • CW2017 电量计
  • ES8311 音频 Codec
  • 可传输数据的 USB 线

开发环境:

  • ESP-IDF 5.5.3
  • CMake、Ninja 和 ESP-IDF 自带 Python 环境
  • macOS 桥接功能需要 Python 3 和支持 BLE 的 Mac
  • Codex CLI,或包含 Codex 可执行文件的 Codex Desktop

桌面代理只在 127.0.0.1 上创建临时 WebSocket 监听,不向局域网暴露端口。Codex app-server 的 WebSocket/remote TUI 接口目前是实验功能,升级 Codex 后应运行本仓库的 schema 兼容性检查。官方接口说明见 Codex App Server。

获取源码

git clone https://github.com/bingkina/FoloToy-Codex-Buddy.git
cd FoloToy-Codex-Buddy

仓库根目录就是唯一的固件源码目录:其中应直接包含 main/、components/、tests/ 和 sdkconfig.defaults。构建、测试和刷机命令都必须在这个根目录执行,不要从下载目录、 旧副本或其他构建目录刷写。每次刷机前运行 idf.py build,确保写入的是当前源码生成的 最新固件。

刷机教程

交给 Agent 自动刷机

打开 Agent 自动刷机指南

如果使用能访问本机终端和 USB 串口的 Codex 或其他编码 Agent,请让它阅读上述指南, 然后发送:

请按照 docs/AGENT_FLASHING.md 直接帮我刷机并验证启动。
设备已经通过 USB 连接;不要清空设备设置。

Agent 会自行检查 ESP-IDF 版本、识别唯一串口、编译、核验芯片、刷写并检查启动日志; 只有无法唯一确定设备或需要物理操作时才会询问用户。普通网页聊天无法访问本机 USB, 需要在具备本机终端和硬件访问能力的 Agent 环境中执行。

1. 安装并进入 ESP-IDF 5.5.3 环境

请先按照 Espressif ESP32-C3 入门文档 安装 ESP-IDF 5.5.3。每次打开新终端后加载环境:

source /path/to/esp-idf-v5.5.3/export.sh
idf.py --version

idf.py --version 应显示 ESP-IDF v5.5.3。不要使用 Arduino 构建链或其他 ESP-IDF 版本替代。

2. 连接设备并确认串口

使用支持数据传输的 USB 线连接 AI Passport。常见端口示例:

系统端口示例
macOS/dev/cu.usbmodem101
Linux/dev/ttyACM0
WindowsCOM5

macOS 可执行:

ls /dev/cu.usbmodem* /dev/cu.usbserial* 2>/dev/null

Linux 可执行:

ls /dev/ttyACM* /dev/ttyUSB* 2>/dev/null

3. 配置并编译

第一次编译或清理过配置后执行:

idf.py set-target esp32c3
idf.py build

成功后主要生成以下文件:

文件烧录地址用途
build/bootloader/bootloader.bin0x0Bootloader
build/partition_table/partition-table.bin0x8000分区表
build/FoloToy-AI-Passport.bin0x10000主固件

这些是构建产物,不提交到 Git;需要分发固件时应作为 GitHub Release 附件发布。

4. 普通用户:从 GitHub Release 下载预编译固件

不需要修改源码的用户无需安装完整编译环境。请打开项目的 GitHub Releases,下载最新版本中的:

  • FoloToy-Codex-Buddy-merged.bin:首次安装或恢复使用的单文件整包;
  • SHA256SUMS.txt:整包固件的 SHA-256 校验值。

首次刷机请严格按照普通用户从零刷机流程完成工具安装、文件 校验、串口识别、芯片核验、写入和启动检查。

安装独立的 esptool 后,可将整包从 0x0 写入:

python -m pip install esptool
python -m esptool --chip esp32c3 -p PORT -b 460800 \
  --before default_reset --after hard_reset write_flash \
  0x0 FoloToy-Codex-Buddy-merged.bin

把 PORT 换成设备的实际串口。固件仅适用于 FoloToy AI Passport(ESP32-C3、8 MB Flash);不要为其他型号刷入该镜像。公开 Release 面向首次安装或恢复设备;整包会 覆盖 NVS,因而清除设备设置和 BLE 绑定。

5. 开发者推荐方式:直接刷机并查看日志

将下面端口替换为实际端口:

idf.py -p /dev/cu.usbmodem101 flash monitor

Windows 示例:

idf.py -p COM5 flash monitor

串口监视器中出现 Codex Buddy starting,并看到 display、battery、audio、button 和 BLE 初始化完成,即表示启动成功。按 Ctrl+] 退出监视器。

以后只修改代码并重新刷机时,通常直接执行:

idf.py build
idf.py -p /dev/cu.usbmodem101 flash

6. 使用已有 BIN 文件手动刷机

如果已经取得上述三个 BIN 文件,可在 ESP-IDF 环境中执行:

python -m esptool --chip esp32c3 -p /dev/cu.usbmodem101 -b 460800 \
  --before default_reset --after hard_reset write_flash \
  --flash_mode dio --flash_freq 80m --flash_size detect \
  0x0 build/bootloader/bootloader.bin \
  0x8000 build/partition_table/partition-table.bin \
  0x10000 build/FoloToy-AI-Passport.bin

不要只把主固件写到 0x0;主固件的正确地址是 0x10000。

7. 可选:生成单文件整包固件

需要给量产工具或其他用户提供单个文件时,可将三段镜像合并:

python -m esptool --chip esp32c3 merge_bin \
  --flash_mode dio --flash_freq 80m --flash_size 8MB \
  -o build/FoloToy-Codex-Buddy-merged.bin \
  0x0 build/bootloader/bootloader.bin \
  0x8000 build/partition_table/partition-table.bin \
  0x10000 build/FoloToy-AI-Passport.bin

合并文件从 0x0 写入:

python -m esptool --chip esp32c3 -p /dev/cu.usbmodem101 -b 460800 \
  --before default_reset --after hard_reset write_flash \
  0x0 build/FoloToy-Codex-Buddy-merged.bin

也可以在完成 idf.py build 后运行仓库提供的打包脚本:

bash scripts/package_firmware.sh

脚本会在 dist/firmware/ 生成整包和 SHA256SUMS.txt。

8. 发布新版本(维护者)

推送符合 v* 格式的版本标签会触发 Release firmware GitHub Actions 工作流:

git tag v1.0.0
git push origin v1.0.0

工作流使用固定的 ESP-IDF 5.5.3 容器全新构建 ESP32-C3 固件、合并单文件镜像、计算 SHA-256,并将全部文件上传到对应的 GitHub Release。也可以在 GitHub Actions 页面手动 运行该工作流并填写版本标签;预发布标签(例如 v1.0.0-rc.1)会创建 prerelease。

9. 刷机失败排查

  • Serial port not found:更换数据线或 USB 口,并重新确认串口名称。
  • Port is busy:关闭其他串口监视器、IDE 或占用该端口的程序。
  • 一直停在 Connecting...:重新插拔设备;若板卡提供 BOOT 键,可按住 BOOT 后复位, 进入下载模式再试。
  • 配置或依赖异常:执行 idf.py fullclean,再重新运行 idf.py set-target esp32c3 和 idf.py build。
  • 需要彻底清空时可执行 idf.py -p PORT erase-flash。这会删除 NVS、BLE 绑定和所有 设备设置,属于不可恢复操作,之后必须重新刷入完整固件。

首次启动与配对

  1. 启动后设备默认显示 CODEX 宠物,并以 Codex-<MAC 后缀> 广播。
  2. 启动 macOS 桥接器并允许系统蓝牙权限。
  3. 首次连接时,设备显示六位 Secure Connections passkey。
  4. 在 macOS 配对窗口输入该六位数字。
  5. 加密连接建立后,设备开始显示 Codex 状态和审批请求。

BLE RX、TX 和 TX CCCD 均要求经过认证的加密连接。已绑定设备可自动重连;设备设置中 可以执行 Unpair,恢复出厂设置也会清除绑定。

macOS Codex 桥接器

创建独立 Python 环境:

python3 -m venv .venv-codex-buddy
. .venv-codex-buddy/bin/activate
python -m pip install -r tools/macos_codex_buddy/requirements.txt

启动原生 Codex TUI,并把状态和审批请求同步到设备:

python -m tools.macos_codex_buddy.cli tui \
  --cwd /path/to/project

该模式使用仅监听 localhost 的 WebSocket 代理。Codex 原生 TUI 负责输入、Markdown、 历史记录、斜杠命令和 thread 切换;代理只截获命令、文件变更和权限审批,并等待设备端 决策。其他 App Server 请求仍交给 TUI 处理。BLE 意外断开时,代理会拒绝待处理审批、 中断当前 turn 并关闭 TUI,避免在失去实体授权通道后继续等待或误授权。

如需旧版无 TUI 的连续任务模式,可运行:

python -m tools.macos_codex_buddy.cli run \
  --session --use-daemon \
  --cwd /path/to/project \
  --approval-policy untrusted \
  "Run tests"

附近有多台设备时添加 --device Codex-A1B2C3。也可用 --codex PATH 指定 Codex 可执行文件。桥接器只管理通过本地代理创建或恢复的 thread,不能附着到 Codex Desktop 中已经运行的任务。

macOS 用户也可以直接双击 Start Codex Buddy.command,选择工作目录、完成 BLE 配对, 然后进入原生 Codex TUI。

测试

固件主机测试:

cmake -S tests -B build-host
cmake --build build-host
ctest --test-dir build-host --output-on-failure

macOS 桥接器测试与协议兼容性检查:

python -m unittest discover -s tools/macos_codex_buddy/tests -v
python -m tools.macos_codex_buddy.schema_compat

提交前应同时通过主机测试和一次全新的 ESP-IDF 5.5.3 构建。编译成功不能代替实机 验收;完整检查项目见 docs/validation/。

项目结构

components/bsp/                 显示、按键、电池、音频和共享 I2C 板级驱动
main/                           BLE、协议、状态机、设置、UI 和 Codex 宠物
tests/                          无硬件依赖的 C 测试
tools/macos_codex_buddy/        原生 TUI ↔ app-server ↔ BLE 审批代理
tools/windows_buddy_controller/ Windows 控制与协议工具
docs/validation/                构建和实机验收记录

安全与限制

  • 完整命令、diff 和模型输出保留在电脑端,设备只显示适合 240×320 屏幕的摘要。
  • 原生 TUI 代理只监听 localhost;不要把临时监听地址改成非回环地址。
  • 外部输入使用定长缓冲区;未知命令、错误 nonce、过期审批和旧连接事件均失败关闭。
  • 当前不支持触摸、Wi-Fi 控制、GIF/大图集或旁路接管 Codex Desktop。
  • ESP32-C3 没有 PSRAM,修改 LVGL、BLE 或音频缓冲区时需要重新检查内部 RAM。
  • 尚需在真实设备上完成 20 次连接/断开循环和 30 分钟连接稳定性测试。

许可证与归属

项目基于 FoloToy AI Passport 固件结构开发,并保持对公开 Hardware Buddy Nordic UART 协议的兼容。第三方组件的版权和许可证信息见 NOTICE 及各组件目录。

截图

特性

▸Codex 任务状态实时显示
▸像素宠物与声音提醒
▸加密 BLE 通信
▸实体按键审批交互

一键安装

通过 Web Serial API 在浏览器内直接刷写固件到你的 AI Passport

当前浏览器不支持 Web Serial,请使用 Chrome/Edge 89+
发布时间2026/08/22
固件文件
FoloToy-Codex-Buddy-merged.bin1.11 MB
发布说明

FoloToy Codex Buddy:从零开始刷机

本流程面向普通用户,不需要下载源码或安装 ESP-IDF。完成后,FoloToy AI Passport 会运行 Codex Buddy 固件。

0. 开始前确认

准备以下物品:

  • FoloToy AI Passport(ESP32-C3、8 MB Flash);
  • 一根支持数据传输的 USB 线;
  • Windows、macOS 或 Linux 电脑;
  • Python 3.10 或更高版本及网络连接。

**重要:**公开版是从 0x0 写入的完整固件,会清除设备原有设置和 BLE 绑定。只在 首次安装或确定要恢复设备时继续。固件不能用于其他型号。

可选:交给 Agent 自动刷机

如果 Codex 或其他编码 Agent 能访问本机终端和 USB 串口,可以让它自动完成文件下载、 隔离 Python 环境创建、esptool 安装、SHA-256 校验、串口识别、ESP32-C3 核验、刷写和 结果检查。普通网页聊天不能访问本机 USB,无法代替本地 Agent 执行。

将设备通过 USB 连接后,把本发布页面链接和下面的指令一起发送给 Agent:

请阅读这个 GitHub Release 页面的完整刷机说明,并按照其中流程自动下载和刷入当前版本。
设备已经通过支持数据传输的 USB 线连接到电脑。

我允许你在隔离的 Python 虚拟环境中安装 esptool,也已知晓并同意完整固件会清除设备设置
和 BLE 绑定。请自动完成以下工作:
1. 下载 FoloToy-Codex-Buddy-merged.bin 和 SHA256SUMS.txt;
2. 校验 SHA-256,失败时立即停止;
3. 探测串口;只有一个明确匹配的端口时自动选择,无法唯一确定时询问我;
4. 使用 chip-id 核验设备确实是 ESP32-C3,型号不符时立即停止;
5. 从 0x0 写入完整固件,并检查写入校验结果;
6. 确认设备正常重启;无法读取启动状态时明确标记 NOT RUN。

不要执行 erase-flash,不要使用 --force,也不要在校验失败或芯片型号不符时继续。
只有需要连接设备、选择多个候选串口或操作 BOOT/RESET 键时再询问我。

Agent 可以自动处理软件步骤,但以下情况仍需要用户配合:设备尚未连接、存在多个无法区分 的串口、USB 线仅能供电,或设备必须手动按 BOOT/RESET 进入下载模式。

1. 下载两个文件

展开本发布页面底部的 Assets,把下面两个文件下载到同一个文件夹:

  • FoloToy-Codex-Buddy-merged.bin:完整固件;
  • SHA256SUMS.txt:固件校验值。

后续命令都要在这个下载文件夹中运行。可以在终端中使用 cd 进入该文件夹,例如:

cd ~/Downloads

Windows 用户可在文件夹空白处右键选择“在终端中打开”。

2. 安装 Python 和 esptool

如果尚未安装 Python,请从 Python 官网安装 Python 3.10 或更高版本。Windows 安装时勾选 Add python.exe to PATH。

Windows PowerShell:

py --version
py -m pip install --upgrade esptool
py -m esptool version

macOS 或 Linux:

python3 --version
python3 -m pip install --upgrade esptool
python3 -m esptool version

如果最后一条命令能显示 esptool 版本,即表示工具安装成功。

3. 校验下载的固件

Windows PowerShell:

$expected = (Get-Content .\SHA256SUMS.txt).Split()[0]
$actual = (Get-FileHash .\FoloToy-Codex-Buddy-merged.bin -Algorithm SHA256).Hash.ToLower()
if ($actual -eq $expected) { "OK" } else { "FAILED: 请重新下载两个文件" }

macOS:

shasum -a 256 -c SHA256SUMS.txt

Linux:

sha256sum -c SHA256SUMS.txt

只有结果为 OK 时才继续。出现 FAILED 时不要刷机,请删除文件并重新下载。

4. 连接设备并找到串口

使用数据线把 AI Passport 直接连接到电脑。关闭可能占用串口的 Arduino IDE、串口监视器 或其他刷机程序。

Windows PowerShell:

[System.IO.Ports.SerialPort]::GetPortNames()

常见结果为 COM5。也可以在“设备管理器 → 端口”中查看。

macOS:

ls /dev/cu.usbmodem* /dev/cu.usbserial* 2>/dev/null

常见结果为 /dev/cu.usbmodem101。

Linux:

ls /dev/ttyACM* /dev/ttyUSB* 2>/dev/null

常见结果为 /dev/ttyACM0。如果有多个端口,可拔下设备、再次执行命令,再插回设备比较 新增的端口。记住实际端口,下面用 PORT 表示它。

5. 核验芯片型号

先确认连接的是 ESP32-C3,避免刷错设备。把命令中的 PORT 换成上一步的实际端口。

Windows 示例:

py -m esptool --chip esp32c3 --port COM5 chip-id

macOS 示例:

python3 -m esptool --chip esp32c3 --port /dev/cu.usbmodem101 chip-id

Linux 示例:

python3 -m esptool --chip esp32c3 --port /dev/ttyACM0 chip-id

输出必须确认芯片是 ESP32-C3。型号不符时立即停止。

6. 写入固件

确认终端仍位于两个下载文件所在的文件夹,然后执行对应命令。

Windows PowerShell:

py -m esptool --chip esp32c3 --port COM5 --baud 460800 --before default-reset --after hard-reset write-flash 0x0 .\FoloToy-Codex-Buddy-merged.bin

macOS:

python3 -m esptool --chip esp32c3 --port /dev/cu.usbmodem101 --baud 460800 \
  --before default-reset --after hard-reset write-flash \
  0x0 FoloToy-Codex-Buddy-merged.bin

Linux:

python3 -m esptool --chip esp32c3 --port /dev/ttyACM0 --baud 460800 \
  --before default-reset --after hard-reset write-flash \
  0x0 FoloToy-Codex-Buddy-merged.bin

刷写期间不要拔线、关闭终端或让电脑休眠。看到数据写入完成、校验成功和硬复位信息,才算 写入完成。

7. 确认启动成功

刷写完成后设备通常会自动重启。确认:

  1. 屏幕点亮并出现 Codex Buddy 界面或 CODEX 宠物;
  2. 设备没有持续黑屏或反复重启;
  3. 电脑蓝牙附近可发现名称以 Codex- 开头的设备。

如果刷写成功但设备仍停留在下载模式,按一下 RESET;没有 RESET 键时,拔下 USB 后重新 插入。首次连接桌面桥接器时,设备会显示六位配对码,需要在 macOS 配对窗口中输入。

8. 常见问题

  • **找不到串口:**确认 USB 线支持数据传输,换一个 USB 口,避免只供电的线和不稳定的 扩展坞。
  • **No module named esptool:**安装与运行必须使用同一个命令;Windows 都使用 py -m, macOS/Linux 都使用 python3 -m。
  • **Permission denied(Linux):**确认当前用户有串口权限,并关闭占用端口的程序。
  • **Failed to connect 或一直 Connecting...:**重新确认端口;仍失败时,按住 BOOT, 按一下 RESET 后松开 BOOT,再重新执行刷机命令。
  • **端口被占用:**关闭串口监视器、Arduino IDE 和其他刷机工具后重试。
  • **写入中途失败:**更换数据线或 USB 口,并把命令中的 --baud 460800 改为 --baud 115200 后重试。
  • **校验失败:**不要继续刷机,重新下载固件和 SHA256SUMS.txt。
  • **刷完黑屏:**重新插拔设备;如果仍无显示,保留完整终端输出并提交 Issue。

不要自行执行 erase-flash。完整固件已经包含所需引导程序和分区表,无需额外擦除。

官方工具参考

版本更新

需要 Chrome/Edge 89+ · 不支持时可查看手动教程

手动安装教程 ↗

项目信息

仓库https://github.com/bingkina/FoloToy-Codex-Buddy
Star2
固件版本v1.0.1
兼容硬件AI Passport v1