AI 工程

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 相處的方式:

  1. codex queue --resume:從另一個終端或腳本把訊息塞進某個 session 的佇列,必要時順便把它叫醒。
  2. Transcript 鍵盤選取+搜尋:不用滑鼠,用 Vim 手感在對話紀錄裡移動、搜尋、選取、複製。
  3. 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 queue --resume 的運作流程:找 thread、透過 app-server 排入佇列、依 thread 狀態決定是否 resume

運作原理

從 codex-rs/cli/src/queue_cmd.rs 和 codex-rs/tui/src/session_queue_commands.rs 看,流程是這樣:

  1. 找 thread:--thread 接受 session 的 UUID,或「精確的 session 名稱」。用名稱時只會在 active session 裡找,找不到會回 No active session found matching '...'。
  2. 找到共用的 app-server:預設走本機的 app-server daemon;加 --remote 就送到你指定的遠端伺服器。
  3. 排入佇列:呼叫 app-server 的 thread/queue/add,成功後印出 Queued message <id> for thread <thread_id>.。
  4. (有 --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。

Codex transcript 鍵盤選取速查:進入方式、移動、選取、搜尋、複製按鍵

進入方式

  • Ctrl+T:打開 transcript overlay(預設的 open_transcript)。
  • Ctrl+X 然後 [:直接進入鍵盤選取模式。這是新的 tui.keymap.global.select_transcript,預設綁在 leader [,而 leader 鍵預設是 Ctrl+X。
  • F3:在完整 transcript 裡搜尋(find_transcript 預設值)。

如果你原本已經有滑鼠選取,進入選取模式時會沿用那段選取,再用鍵盤微調兩端,不用重選。

按鍵一覽(從 select_mode.rs 整理)

移動

  • h j k l 或方向鍵:字元/行
  • w b e:下一個字開頭/上一個字開頭/字尾(可以跨對話項目)
  • 0、Home/$、End:行首/行尾
  • PageUp、Ctrl+B/PageDown、Ctrl+F:整頁
  • Ctrl+U/Ctrl+D:半頁
  • g/G:跳到最開頭/最底

選取

  • v 或 Space:開始以字元為單位選取
  • V:整行選取
  • o:把游標換到選取的另一端,用來調整起點

搜尋

  • /:開啟 Find
  • Enter:游標跳到符合處;如果正在選取,選取範圍會一路延伸過去
  • n:往較舊的訊息找下一個;Shift+n:往較新的找
  • 空白查詢直接按 Enter:重用上一次的搜尋
  • 新搜尋按取消:游標、選取和上一次搜尋都會還原

複製與離開

  • y:複製選取內容
  • Enter(不在搜尋中):複製後關閉選取
  • Esc:有選取時先清掉選取,再按一次才離開;q:直接離開

實戰組合技

把錯誤訊息精準貼回 prompt:

  1. Ctrl+X [ 進選取模式
  2. / 輸入 error[E 或 FAILED,Enter 跳過去
  3. V 整行選取,j 往下多選幾行
  4. y 複製,q 離開
  5. 在 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 只做四件事:

  1. 有效設定:config 能不能正常載入(也會回報載入耗時,設定警告照樣保留)
  2. 網路環境:proxy 等網路相關環境變數讀不讀得到
  3. Provider HTTP 可達性:目前使用的 provider 端點能不能用 HTTP 連到
  4. 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.0 tag 的原始碼,不是我自己的實測紀錄。終端模擬器、tmux 或 SSH 可能攔截 Ctrl+X 之類的組合鍵,第一次用請先在無害的 session 試一下。
  • codex queue 依賴本機 daemon 或遠端 app-server。如果你一直用 --no-daemon 跑,queue 不能用。
  • thread_unload_delay_secs 的預設值變了。你的工作流如果依賴「thread 一直掛著」,升級後要嘛加 --resume,要嘛把設定改回 1800。
  • Release notes 裡沒有任何效能數字,本文也不提供。

給工程團隊的落地清單

  1. 升級到 0.166.0,跑一次 codex doctor --network-only。在公司網路下把結果存起來,當作「正常狀態」的基準,下次出事拿來比對。
  2. 幫長任務的 session 取好名字,再寫一個小腳本包住 codex queue --thread <name> --message ... --resume,接到 CI 失敗或 PR review 的 hook。
  3. 決定團隊的 thread_unload_delay_secs:資源吃緊就維持 60 秒並一律加 --resume;常用多終端協作就調高。
  4. 花五分鐘練 transcript 選取:Ctrl+X [ → / → V → y。熟了之後,把 agent 輸出精準餵回去的速度會快很多,prompt 也會更乾淨。
  5. 把 doctor 的 JSON 報告當成開 issue 的標配附件。網路問題的來回溝通可以少一大半。

來源

整理:DataAgent · Coding Agent 實戰教學

發表迴響

%d 位部落客按了讚: