Codex CLI 0.166.0 實戰:queue –resume 從外面餵 agent、transcript 鍵盤搜尋選取、doctor –network-only 專查網路
OpenAI 在 2026-10-29 釋出了 Codex CLI 的 rust-v0.166.0。這版的 release notes 很長,光 changelog 就超過兩百個 PR,大部分是 Guardian 審查器搬家、Bazel 改成從原始碼編 V8 這類內部工程,一般使用者感覺不到。
不過裡面有三個東西,會直接改變你每天跟 Codex 相處的方式:
codex queue --resume:從另一個終端或腳本把訊息塞進某個 session 的佇列,必要時順便把它叫醒。- Transcript 鍵盤選取+搜尋:不用滑鼠,用 Vim 手感在對話紀錄裡移動、搜尋、選取、複製。
codex doctor --network-only:只做網路相關的診斷,公司 proxy、VPN、WebSocket 出問題時特別好用。
這篇不逐條翻譯 changelog,而是把這三個功能的機制拆開來講,告訴你怎麼用、什麼時候該用、有哪些坑。內容來自 release notes、對應 PR 的說明與 rust-v0.166.0 這個 tag 的原始碼;我沒有在自己的環境逐一跑過,文中會標出「從原始碼看」和「值得實測」的地方。
本文大綱
先升級,再確認版本
npm install -g @openai/codex@latest # 或你原本的安裝方式(brew、standalone)
codex --version # 確認是 0.166.0 以上
順帶一提,這版的 #57513(作者 bolinfest)把 npm wrapper 改成用 execve 直接換成原生 binary。從 npm 裝的人,啟動時少一層 Node 行程,訊號處理也更直接。
一、codex queue --resume:從外面餵 agent 下一步
它要解決什麼
用 coding agent 久了,你會遇到這種情境:Codex 正在 A 終端跑一個重構,你在 B 終端看 CI,發現還有一件事要它順便做。以前只能切回 A,等它停下來再打字。或者你寫了一個 shell 腳本、git hook,想在某個事件發生時把一句話丟給指定的 session。
codex queue 就是為這個設計的:把訊息排進某個 thread 的佇列,輪到時 agent 會接著處理。0.166.0 新增的 --resume(PR #57232,作者 etraut-openai)補上最後一塊:如果那個 thread 已經被卸載,排完訊息後順手把它叫醒。

運作原理
從 codex-rs/cli/src/queue_cmd.rs 和 codex-rs/tui/src/session_queue_commands.rs 看,流程是這樣:
- 找 thread:
--thread接受 session 的 UUID,或「精確的 session 名稱」。用名稱時只會在 active session 裡找,找不到會回No active session found matching '...'。 - 找到共用的 app-server:預設走本機的 app-server daemon;加
--remote就送到你指定的遠端伺服器。 - 排入佇列:呼叫 app-server 的
thread/queue/add,成功後印出Queued message <id> for thread <thread_id>.。 - (有
--resume才做)檢查 thread 狀態:- 已經載入、正在跑:不動它,讓它照常跑,輪到時自然會讀到佇列訊息。
- 已卸載:呼叫
thread/resume把它載回來,開始消化佇列。 - resume 失敗:只在 stderr 印出
Warning: message was queued, but could not resume thread ...,指令本身仍然成功,訊息也還在佇列裡。
第 4 步的設計很實際:「排進去」和「叫醒」是兩件事,叫醒失敗不該讓你以為訊息沒送到。PR 說明還提到,檢查狀態時只讀 thread status,所以遠端 metadata 裡出現另一個作業系統的路徑也不會出錯,這是為了 Windows 用戶端排到 Linux 遠端這類情境。
為什麼這版特別需要 --resume
同一個版本裡有一個容易被忽略的預設值變更:#57242(作者 jif-oai)把 thread_unload_delay_secs 的預設從 1800 秒降到 60 秒。意思是 app-server 上的 thread 只要一分鐘沒有訂閱者、也沒有活動,就可能被卸載。
以前 thread 會在記憶體裡掛半小時,你排完訊息通常它還醒著。現在一分鐘就可能被收掉,沒有 --resume,訊息就會躺在佇列裡等下一次有人打開那個 session。這兩個變更放在一起看,意圖很清楚:伺服器更積極回收資源,由呼叫端決定要不要叫醒。
如果你偏好舊行為,可以在 ~/.codex/config.toml 改回去:
# 改回舊預設:thread 閒置 30 分鐘才卸載
thread_unload_delay_secs = 1800
PR 的測試也涵蓋了 0(立刻卸載)這個值。
怎麼用:三個可以直接抄的招式
招式 1:在另一個終端追加指示
codex queue --thread refactor-auth \
--message "跑完測試後,順便把 lint 警告修掉,但不要動 public API" \
--resume
session 名稱要先取好才好用。用名稱比用 UUID 好記,也比較不會在腳本裡寫死。
招式 2:CI 失敗時自動把錯誤丟給 agent
#!/usr/bin/env bash
# ci-fail-to-codex.sh
LOG_TAIL=$(tail -n 40 ci.log)
codex queue --thread "$CODEX_THREAD" \
--message "CI 失敗了,以下是最後 40 行 log。先判斷是測試本身不穩還是程式真的壞了,再決定要不要改:
$LOG_TAIL" \
--resume
prompt 技巧:明確要它先判斷再動手。從外部自動丟進去的訊息,你人不在旁邊盯,最怕 agent 看到紅字就開始亂改測試。
招式 3:送到遠端的 app-server
codex queue --remote <你的遠端 endpoint> \
--thread nightly-migration \
--message "繼續處理下一批 table" --resume
會被擋下的參數(#57273)
同版的 #57273 把 codex queue 不支援的參數都改成明確報錯,省得你以為設定生效了:
| 你這樣下 | 結果 |
|---|---|
--model gpt-xxx 或 -c model=... |
報錯:佇列訊息一律用 thread 自己的模型 |
--image |
報錯:不支援圖片附件 |
不帶 --message,直接把 prompt 當位置參數 |
報錯:請用 --message |
--cd 搭配 --remote |
報錯;本機啟動時 --cd 可以用 |
--no-daemon(沒有 --remote) |
報錯:queue 必須找到共用的伺服器,避免另起一個伺服器寫入 |
還有一個從原始碼看到的限制:如果你帶了設定覆寫,導致 Codex 想啟動內嵌的 app-server,但本機其實已經有 daemon 在跑,它會拒絕並提示「移除設定覆寫或改用 --remote」。理由一樣:同一個 thread 不能有兩個伺服器在寫。
適用與不適用
- 適合:長時間任務的追加指示、CI/hook 觸發的後續處理、多個終端協作同一個 session。
- 不適合:需要換模型的任務(會被擋)、需要附圖的任務、你希望「立刻插隊打斷」的情境。queue 是排隊,不是中斷。
- 值得實測的點:agent 正在跑一個長 turn 時,佇列訊息會在什麼時間點被讀進去?release notes 沒寫細節,建議先用無害的任務試一次再接進自動化。
二、Transcript 鍵盤選取與搜尋:把 agent 的輸出精準抓出來
它要解決什麼
agent 吐出一大段 log、diff 或錯誤訊息,你只想複製其中三行貼回下一個 prompt。在終端裡用滑鼠選,常常會選到框線、行號,或者一捲動選取就跑掉。
0.166.0 由 fcoury-oai 提交的 #57221~#57224 四個 PR,把 transcript 做成一個可以用鍵盤操作的檢視器,手感接近 Vim 的 visual mode。

進入方式
Ctrl+T:打開 transcript overlay(預設的open_transcript)。Ctrl+X然後[:直接進入鍵盤選取模式。這是新的tui.keymap.global.select_transcript,預設綁在leader [,而 leader 鍵預設是Ctrl+X。F3:在完整 transcript 裡搜尋(find_transcript預設值)。
如果你原本已經有滑鼠選取,進入選取模式時會沿用那段選取,再用鍵盤微調兩端,不用重選。
按鍵一覽(從 select_mode.rs 整理)
移動
hjkl或方向鍵:字元/行wbe:下一個字開頭/上一個字開頭/字尾(可以跨對話項目)0、Home/$、End:行首/行尾PageUp、Ctrl+B/PageDown、Ctrl+F:整頁Ctrl+U/Ctrl+D:半頁g/G:跳到最開頭/最底
選取
v或Space:開始以字元為單位選取V:整行選取o:把游標換到選取的另一端,用來調整起點
搜尋
/:開啟 FindEnter:游標跳到符合處;如果正在選取,選取範圍會一路延伸過去n:往較舊的訊息找下一個;Shift+n:往較新的找- 空白查詢直接按
Enter:重用上一次的搜尋 - 新搜尋按取消:游標、選取和上一次搜尋都會還原
複製與離開
y:複製選取內容Enter(不在搜尋中):複製後關閉選取Esc:有選取時先清掉選取,再按一次才離開;q:直接離開
實戰組合技
把錯誤訊息精準貼回 prompt:
Ctrl+X[進選取模式/輸入error[E或FAILED,Enter跳過去V整行選取,j往下多選幾行y複製,q離開- 在 composer 貼上,接一句:「只看這段錯誤,先說明原因,不要改其他檔案」
從長 diff 裡抓出某個函式: / 搜函式名稱 → Enter → v 開始選 → 再 / 搜下一個函式名稱 → Enter。選取會一路延伸到那裡,再按 y。
這個「搜尋會延伸選取」的設計,是整組功能裡最省時間的地方。
改鍵
如果 Ctrl+X 跟你的終端或 tmux 衝突,可以在 config.toml 自己綁:
[tui.keymap.global]
select_transcript = "ctrl-x ctrl-s" # 兩段式組合鍵
# 或者 select_transcript = "leader s"
從 leader_defaults.rs 看,隱含的 leader [ 只會綁在「沒被佔用」的組合上。你明確設定(包括明確取消綁定)一律優先,衝突時隱含預設會自動讓位。
一個貼心的修正
#57224 處理了一個很煩的 bug:按住 Enter 離開選取模式時,重複的按鍵事件會流進 composer,把你預先寫好的草稿直接送出。現在離開時會吃掉持續按住的按鍵,composer 要重新按一次才會送出或排入佇列。
三、codex doctor --network-only:只查網路,不查別的
它要解決什麼
在公司網路下用 coding agent,最常見的問題不是模型,而是連線:proxy 設錯、TLS 被中間人憑證攔截、WebSocket 升級被防火牆擋掉。完整的 codex doctor 會連資料庫、MCP server 一起掃,輸出很長,也比較慢。
#57606(作者 dob-oai)新增的 --network-only 只做四件事:
- 有效設定:config 能不能正常載入(也會回報載入耗時,設定警告照樣保留)
- 網路環境:proxy 等網路相關環境變數讀不讀得到
- Provider HTTP 可達性:目前使用的 provider 端點能不能用 HTTP 連到
- Responses WebSocket:WebSocket 握手能不能成功(provider 沒啟用時會標示為不適用)
資料庫、MCP 掃描這些無關的項目都會跳過。
輸出長什麼樣
從 PR 附的測試 snapshot 看,正常的輸出大致如下:
Codex Doctor
Configuration
[ok] config loaded
Connectivity
[ok] network network-related environment looks readable
[ok] websocket Responses WebSocket is not enabled for the active provider
[ok] reachability active provider endpoints are reachable over HTTP
4 ok | 0 warn | 0 fail ok
安全設計:設定壞了就不亂猜
一個值得注意的細節:如果 config 載入失敗,--network-only 會回報經過遮蔽的錯誤,然後停止,不會拿猜的目標去發探測請求。snapshot 顯示它會指出出錯的檔案、行號、欄位,並註明 effective network configuration is unavailable。
這很合理:你的 config 可能本來就設了公司內部的 base URL,設定讀不到就改打預設端點,等於測了一條你根本不會走的路,結果只會誤導。
同版的 #57597 也強化了 WebSocket 探測:升級成功後即使後續讀取失敗,也會保留升級的證據;TLS 錯誤和一般 I/O 錯誤會分開回報;URL、伺服器錯誤訊息、close reason 這類可能含敏感值的內容都會遮蔽掉。
怎麼用
# 人看的版本
codex doctor --network-only
# 要貼給 IT 或開 issue:JSON 報告(官方說明為已遮蔽)
codex doctor --network-only --json > codex-net.json
# 想看被截斷的完整清單
codex doctor --network-only --all
# 在沒有顏色的 CI log 裡跑
codex doctor --network-only --ascii --no-color
排查順序建議:
config失敗:先修config.toml,輸出會給行號。reachability失敗:查HTTPS_PROXY/NO_PROXY、公司 CA。reachability通但websocket失敗:多半是 proxy 或防火牆不讓 WebSocket 升級,拿 JSON 報告找 IT 最快。
把 --json 的輸出直接丟給 Codex 也行:「這是 doctor 的網路診斷,判斷問題比較可能在本機設定、公司 proxy 還是 provider 端,列出我該依序檢查的三件事。」不過要先自己看一眼,確認裡面沒有不想外流的內部主機名。遮蔽是官方的設計目標,但貼出去前自己檢查還是好習慣。
其他值得知道的修正
- resume/fork 保留你已確認的權限設定(#57227,charliemarsh-oai):以前從某段歷史 resume 或 fork,可能套到過時的 approval/permission 設定,現在會優先採用 thread 已接受的設定。常用 fork 開分支試做的人,權限不會莫名其妙變回去。
- resume/fork 後不再提早 compaction(#57839,andrewgu-oai):PR 說明指出,resume 或 fork 會遺失「token 用量已含 reasoning」的旗標,導致 reasoning 被重複計算、太早觸發自動壓縮。現在這個旗標會跟著存檔。如果你覺得長 session resume 後 context 很快就被壓縮掉,這版值得升級。
- safety block 會解釋原因,並提供較安全的改寫選項(#57363、#57365,etraut-openai):目前針對生物與資安兩類政策。選了改寫後,會在被擋的那一輪之前開一個 fork 送出,原本的草稿和模型設定都保留。建議的改寫會過濾掉可能觸發指令、skill、app 或 plugin 的內容。
- 模型目錄新增 GPT-6.1 Terra(#57293):包含內建、Vertex AI 和 Amazon Bedrock 的目錄。release notes 只寫了「加入目錄」,沒有效能數字,這裡不做推測。
- TUI 斷線恢復更穩(#57820),離線時
/quit、/exit也能正常退出。
限制與誠實聲明
- 本文的按鍵、參數和行為都來自 PR 說明與
rust-v0.166.0tag 的原始碼,不是我自己的實測紀錄。終端模擬器、tmux 或 SSH 可能攔截Ctrl+X之類的組合鍵,第一次用請先在無害的 session 試一下。 codex queue依賴本機 daemon 或遠端 app-server。如果你一直用--no-daemon跑,queue 不能用。thread_unload_delay_secs的預設值變了。你的工作流如果依賴「thread 一直掛著」,升級後要嘛加--resume,要嘛把設定改回 1800。- Release notes 裡沒有任何效能數字,本文也不提供。
給工程團隊的落地清單
- 升級到 0.166.0,跑一次
codex doctor --network-only。在公司網路下把結果存起來,當作「正常狀態」的基準,下次出事拿來比對。 - 幫長任務的 session 取好名字,再寫一個小腳本包住
codex queue --thread <name> --message ... --resume,接到 CI 失敗或 PR review 的 hook。 - 決定團隊的
thread_unload_delay_secs:資源吃緊就維持 60 秒並一律加--resume;常用多終端協作就調高。 - 花五分鐘練 transcript 選取:
Ctrl+X [→/→V→y。熟了之後,把 agent 輸出精準餵回去的速度會快很多,prompt 也會更乾淨。 - 把 doctor 的 JSON 報告當成開 issue 的標配附件。網路問題的來回溝通可以少一大半。
來源
- Release:openai/codex
rust-v0.166.0release notes(2026-10-29)https://github.com/openai/codex/releases/tag/rust-v0.166.0 - PR #57232 Add optional thread resumption to
codex queue(etraut-openai)https://github.com/openai/codex/pull/57232 - PR #57273 Reject unsupported options for
codex queue(etraut-openai)https://github.com/openai/codex/pull/57273 - PR #57242 Reduce the default thread unload delay to one minute(jif-oai)https://github.com/openai/codex/pull/57242
- PR #57221~#57224 Transcript 鍵盤選取、Find 整合、overlay 與輸入路由(fcoury-oai)https://github.com/openai/codex/pull/57221
- PR #57606 Add
codex doctor --network-only(dob-oai)https://github.com/openai/codex/pull/57606 - PR #57597 Preserve WebSocket probe evidence and redact diagnostic details(dob-oai)https://github.com/openai/codex/pull/57597
- PR #57227、#57839、#57363、#57365 https://github.com/openai/codex/compare/rust-v0.165.0…rust-v0.166.0
- 原始碼:
codex-rs/cli/src/queue_cmd.rs、codex-rs/tui/src/session_queue_commands.rs、codex-rs/tui/src/transcript_view/select_mode.rs、codex-rs/tui/src/keymap/leader.rs(tagrust-v0.166.0)
整理:DataAgent · Coding Agent 實戰教學


