Codex CLI 在 Windows 一直跳視窗?CLI 升級了,背景 daemon 卻還是舊版
目錄7 個章節
最近在 Windows Terminal 用 Codex CLI,它只要一執行命令或工具,就瘋狂一直跳 pwsh 出來,PowerShell 視窗一個接一個跳出來又閃掉。
我先等了一個禮拜,想說官方應該很快會修。這一個禮拜 CLI 更新了 3 個版本,跳窗一點都沒改善(後來才知道,CLI 更新再多次都沒用)。
只好自己去 GitHub 翻 issue,找到 #44768 跟我一模一樣的症狀,官方在 0.159.2 已經修掉了。可是我的 CLI 是 0.160.1,照理說早就包含這個修正…
最後才查出來:CLI 是新版,但在背景實際做事的 daemon 還停在 0.159.0。把 daemon 同步到新版之後,視窗就不再跳了。
TL;DR 症狀:Windows 上的 Codex CLI 一跑命令,就狂開 PowerShell 視窗。 原因:CLI 已經是 0.160.1,共享 daemon 卻還是沒有修正的 0.159.0。 解法:執行
codex app-server daemon update --from-cli,把 daemon 同步成目前的 CLI 版本。 急著用的話,先用codex --no-daemon繞過 daemon。
為什麼升級 Codex CLI 還是一直跳窗?
因為 CLI 跟背景的 daemon 是分開管理的兩個套件,CLI 升級了,daemon 不會跟著升。
我的狀況是:npm 裝的 CLI 已經是 0.160.1,daemon 自己的套件目錄卻還是 0.159.0。平常直接打 codex 啟動時,工作會交給這個舊 daemon 去做。
所以畫面上看到的是新版,實際叫 PowerShell 出來的還是舊版。
#44768 把原因講得很清楚:Windows 上的共享 daemon 在啟動 hooks、shell 這些子程序時,有些路徑少帶了 CREATE_NO_WINDOW,Windows 就幫它開了一個看得到的 console 視窗。
講白一點,Codex 在背景叫 PowerShell 做事,卻沒跟 Windows 說”這個不用開視窗”,所以每叫一次命令,就可能跳一次。
官方在 0.159.2 的 release notes 寫了這個修正:Windows 上的背景程序和 sandbox 命令,不會再閃出 console 視窗。問題是,這個修正要 daemon 是新版才有用。
daemon 是什麼?
daemon 是在背景持續待命的服務程序,不顯示畫面,等別的程式丟工作過來再處理。這是軟體圈的通用名稱,不是 Codex 才有。
用工控的分工來比喻:CLI 像操作面板,讓你下指令、看結果;daemon 像背景待命的控制服務,接收要求再去協調執行(只是比喻,daemon 可沒有 PLC 的即時控制能力)。
在 Codex 裡分成三層。你打 codex 看到的是 CLI,負責收輸入、顯示結果。背景的共享 daemon 就是 app-server,負責處理工作階段和工具執行。真的要跑命令時,再叫 PowerShell 這類子程序出來做事。
跳出來的視窗,就是這些子程序。
兩種啟動方式差在這裡:
一般啟動 codex:
你 → CLI 操作介面 → 共享 daemon → 執行工具/命令 → 回傳結果
使用 codex --no-daemon:
你 → CLI 操作介面與內嵌服務 → 執行工具/命令 → 回傳結果
--no-daemon 是讓這次的 CLI 繞過共享 daemon,改用內嵌服務。它不會刪掉 daemon,也不是把所有背景處理都關掉。這兩種模式在官方 changelog 都有寫。
我怎麼查出 daemon 版本不對?
先講我自己判斷錯的地方。
看到 issue 說 0.159.2 修好了,我去看 codex --version,顯示 codex-cli 0.160.1,就認定”我應該早就有修正了”(現在回頭看,這份信心完全看錯地方)。
前面那一個禮拜,我也叫 Codex 查過,它查不出原因。等 CLI 更新到 0.160.1,我把 #44768 丟給它,這次換 Codex 自己查自己的背景服務,總算抓到了😆
我的環境
| 項目 | 處理前 | 處理後 |
|---|---|---|
| 作業系統 | Windows 11 家用版 23H2(組建 22631.6199) | 同左 |
| 終端機 | Windows Terminal 1.24.12741.0 + PowerShell 7 | 同左 |
| CLI | npm 安裝的 @openai/codex 0.160.1 | 0.160.1(沒動) |
| daemon 套件 | 0.159.0 | 0.160.1 |
| 執行中的 daemon | 0.159.0 的 release 目錄 | local-… 目錄,跟 current 指向一致 |
| Codex home | %USERPROFILE%\.codex | 同左 |
先用 --no-daemon 繞過 daemon
codex --no-daemon
用這個模式跑原本會跳窗的工作,看起來有效,視窗不跳了。
這代表跳窗跟共享 daemon 那條路有關。但光靠這個測試,還不知道是哪一個子程序在搞鬼。
再唯讀檢查本機的版本
Codex 在不改任何東西的前提下,查到這 6 件事:
-
npm 的
@openai/codex/package.json版本是 0.160.1。 -
執行中的 daemon,路徑是:
%USERPROFILE%\.codex\packages\app-server-daemon\releases\0.159.0-x86_64-pc-windows-msvc\bin\codex.exe -
daemon 的命令列包含:
app-server --listen unix:// --managed-daemon -
packages\app-server-daemon\current\codex-package.json寫的版本是 0.159.0。 -
current是一個 Junction(Windows 的資料夾連結,類似捷徑),還指向 0.159.0 的 release 目錄。 -
auto-update-version的內容也是0.159.0-x86_64-pc-windows-msvc。
所以處理前的實際架構長這樣:
一般啟動:CLI 0.160.1 → 共享 daemon 0.159.0 → 執行命令
繞過服務:CLI 0.160.1 + --no-daemon → 使用內嵌服務執行
換句話說,CLI 更新再多次,背景那個 daemon 也不會跟著動…
Codex 也看了 config.toml,裡面沒有刻意把 daemon 鎖在 0.159.0 的設定。至於它當初為什麼沒自己更新,這次沒查出來。
怎麼把 daemon 同步到新版?
Codex 用本機 CLI 的 --help 查到,官方有一個同步指令:
codex app-server daemon update --from-cli
--from-cli 的說明是 “Copy and pin this CLI package”,意思是把目前這份 CLI 套件複製一份給 daemon,並讓 daemon 固定用它。
我的 CLI 是 0.160.1,所以跑完之後,daemon 也會是 0.160.1。
⚠️ 這個指令會更新 daemon 套件,可能中斷 daemon 正在處理的工作。
先讓其他 Codex 工作跑完,再執行。
我跑完這行,再用一般的 codex 啟動,PowerShell 視窗就沒有再狂跳了。
終於安靜了。
當時沒留下完整的指令輸出,所以事後又請 Codex 唯讀核對一次:
current\codex-package.json的version已經是 0.160.1current改指向releases\local-…-x86_64-pc-windows-msvc- 執行中 daemon 的執行檔路徑,跟
current指的目錄一致
local-… 是從 CLI 同步過來時產生的目錄名稱,光看名字看不出版本,要看 codex-package.json 裡的 metadata 才準。
下次又跳窗,要照什麼順序查?
重點只有一個:不要只看 codex --version,CLI 跟 daemon 要分開確認。
-
分別確認 CLI 和 daemon 的版本:
codex --version codex app-server daemon version輸出看不出來的話,可以唯讀打開 daemon 的 metadata:
Get-Content -LiteralPath "$env:USERPROFILE\.codex\packages\app-server-daemon\current\codex-package.json"這只能證明
current是哪個版本。要確認正在跑的服務,還要核對程序的執行檔路徑,跟current指的目錄是不是同一個。 -
用
codex --no-daemon開一個新的工作階段,跑原本會跳窗的工作。跳窗消失的話,就優先懷疑 daemon 的版本,跟它叫子程序的方式。 -
先讓其他 Codex 工作跑完,再執行
codex app-server daemon update --from-cli,看清楚指令的提示再確認。 -
再跑一次
codex app-server daemon version,然後用一般的codex啟動(不帶--no-daemon),跑原本會跳窗的工作。確認版本對了、命令跑得完、視窗不再跳。
第 3 步同步的目標,是”你當下用的那份 CLI”,不一定是 0.160.1。
另外,--from-cli 是固定版本,不是從此自動跟著 npm 的 CLI 升級。下次升級 CLI,記得再看一次 daemon 要不要重新同步。
更新失敗或更新後怪怪的怎麼辦?
先用 codex --no-daemon 讓工作能繼續。我實測這招有效,但它只是繞過 daemon,不會把 daemon 的版本退回去。
如果更新時噴 Access denied、exit code 1 這類錯誤,把完整輸出留下來。GitHub 上有類似的 Windows daemon 更新失敗回報(#50285),但症狀像,不代表原因一樣,不要直接套。
也不要手動改 auto-update-version 的文字,或把 current 隨便指到某個有執行檔的目錄。daemon 要的是完整套件跟配套資源,不是只有一個 exe。
想切回 0.159.0 的話
處理前,本機還留著完整的 0.159.0 release,Codex 也用 --help 確認過舊版支援 update --from-cli。只要這份套件還在,理論上可以用舊版的執行檔反向同步(對,就是理論上,我沒跑過):
& "$env:USERPROFILE\.codex\packages\app-server-daemon\releases\0.159.0-x86_64-pc-windows-msvc\bin\codex.exe" app-server daemon update --from-cli
⚠️ 這個降版操作沒有實際執行過,也沒有驗證過。
執行前先確認舊套件還完整、目前的工作都跑完,並備份這兩個資料夾:
%USERPROFILE%\.codex\packages\app-server-daemon
%USERPROFILE%\.codex\app-server-daemon
切回舊版可能把跳窗問題一起帶回來,也不等於還原所有歷史狀態跟資料。
這算 Codex 的 bug,還是我設定錯?
跳窗本身是 Codex 的 bug,但我更新了 3 次 CLI 都沒用,是因為 daemon 沒跟上。
| 判斷項目 | 我的結論 |
|---|---|
| 背景程序開出不必要的視窗 | OpenAI 已經確認並修掉的程式問題 |
| CLI 跟 daemon 版本不一致 | 直接查證過:0.160.1 對 0.159.0 |
| 我有沒有刻意鎖住舊 daemon | 查過的設定裡沒看到 |
| 舊 daemon 為什麼沒更新 | 還不知道,不能直接怪權限、網路或更新器 |
| 處理結果 | daemon 同步到 0.160.1,視窗不再跳 |
另外,#49760 回報 PowerShell 解析器還有另一條會跳窗的路徑。如果你版本都對了還是在跳,可以往這邊查,不過這不是我這次確認過的原因。
我的看法是:在 Windows 用 Codex CLI,每次升級完都順手跑一次 codex app-server daemon version。 只看 codex --version 會被騙,我就是這樣白等了一個禮拜。
至於舊 daemon 當初為什麼沒跟著自動更新,我還沒研究出來(也懶得研究,之後又有問題再說)。
常見問題
Q:codex --no-daemon 會把 daemon 刪掉嗎?
A:不會。它只是讓這次的 CLI 繞過共享 daemon,改用內嵌服務,daemon 本身還在。
Q:跑過 update --from-cli 之後,daemon 會自動跟著 CLI 升級嗎?
A:不會。--from-cli 是把當下的 CLI 套件複製一份並固定下來,之後升級 CLI,要再確認 daemon 需不需要重新同步。
Q:怎麼確認 Codex daemon 現在是哪個版本?
A:執行 codex app-server daemon version。想看更細,可以打開 %USERPROFILE%\.codex\packages\app-server-daemon\current\codex-package.json,看裡面的 version。
Q:CLI 跟 daemon 版本都一致了,還是一直跳窗怎麼辦? A:可以看 #49760,它回報 PowerShell 解析器還有另一條跳窗路徑。我這次沒遇到,所以沒辦法確認是不是同一個原因。