TrafficMonitor AI Usage 플러그인이 WSL2 에서 멈추는 두 가지 이유
Codex 값은 세션 jsonl 경로가 WSL 안에만 있어서, Claude 값은 헬퍼가 PowerShell 5.1 에서 DPAPI 복호화에 실패해서 멈춘다. 원인이 완전히 독립적이라 따로 고쳐야 한다.
Windows 작업표시줄에 TrafficMonitor 를 띄워두고 TrafficMonitorAIUsageLimits 플러그인(v0.3.11)으로 AI CLI 사용량을 보고 있었다. Codex CLI 와 Claude Code 는 둘 다 WSL2 Ubuntu 안에서 돌리고, 플러그인은 Windows 네이티브다.
어느 날 숫자가 멈췄다. 하나가 아니라 넷 다.
플러그인이 보여주는 값은 네 개인데 라벨이 헷갈린다. C5h / C7d 가 Claude, X5h / X7d 가 Codex 다. C 는 Claude, X 는 Codex 로 외우면 된다.
증상
X5h가 35% 같은 특정 값에 고정되고 갱신이 멈춤C5h/C7d도 멈춤. 헬퍼 상태가request_failed- 다 고친 뒤에도 TrafficMonitor 숫자가 로컬 statusline 이나
codex status와 안 맞음
세 번째 항목은 버그가 아니었다. 뒤에서 따로 다룬다.
원인이 두 개다
플러그인의 두 값은 데이터 소스가 완전히 다르다. 플러그인의 PRIVACY.md 에 명시되어 있다. 하나를 고쳐도 다른 하나는 그대로라 “고쳤는데 왜 안 되지”에 빠지기 쉽다.
Codex(X) — 읽는 경로가 Windows 쪽이다
플러그인이 읽는 위치는 기본값이 %USERPROFILE%\.codex\sessions\**\*.jsonl 이고, CODEX_HOME 환경변수가 있으면 CODEX_HOME\sessions\** 로 바뀐다.
WSL 안에서 Codex 를 돌리면 실제 세션 파일은 여기에만 쌓인다.
\\wsl.localhost\Ubuntu\home\<user>\.codex\sessions\
Windows 쪽 C:\Users\<user>\.codex 는 비어 있거나 예전 상태 그대로다. 플러그인이 읽을 게 없으니 마지막으로 읽었던 값에 고정된다. 갱신이 “느린” 게 아니라 아예 입력이 없는 상태다.
Claude(C) — 파일이 아니라 웹 스크랩이다
Claude 값은 로컬 파일에서 오지 않는다. 번들 헬퍼(claude-web-helper.ps1 → helper/claude-web-helper/index.mjs)가 브라우저 쿠키로 claude.ai 를 스크랩해서 가져온다. 로컬 ~/.claude 디렉터리와 무관하다는 뜻이고, 그래서 CLI 가 보여주는 숫자와 출처가 다르다.
전용 브라우저 프로필이 없으면 Local State not found 가 뜬다. 로그인이 필요하다는 신호다. 그런데 로그인을 해도 다음이 나왔다.
Claude helper failed: Failed to run PowerShell for Chromium DPAPI decryption
여기가 핵심 함정이다. 헬퍼의 runPowerShell() 은 Chromium 쿠키 마스터키를 DPAPI 로 푼다.
[System.Security.Cryptography.ProtectedData]::Unprotect(...)
그리고 실행기 후보를 ['pwsh', 'powershell.exe'] 순서로 시도한다. 문제는 이 스크립트가 Add-Type -AssemblyName System.Security 없이 저 타입을 호출한다는 것이다.
pwsh(PowerShell 7)가 설치돼 있으면ProtectedData가 기본 제공이라 통과한다.pwsh가 없으면powershell.exe(Windows PowerShell 5.1)로 폴백한다.- 5.1 은
System.Security어셈블리를 기본 로드하지 않는다. 타입을 못 찾고 비정상 종료한다.
처음에는 WSL interop 문제로 오진했다. 네이티브 PowerShell 창에서 직접 실행해도 같은 에러가 나서 interop 과 무관하다는 걸 확인했다.
해결
Codex — CODEX_HOME 을 WSL UNC 경로로
[Environment]::SetEnvironmentVariable("CODEX_HOME","\\wsl.localhost\Ubuntu\home\<user>\.codex","User")
setx CODEX_HOME ... 를 쓰지 않는 이유가 있다. WSL interop 으로 PowerShell 을 부르면 cwd 가 UNC 경로(\\wsl.localhost\...)가 되는데, setx 는 여기서 자주 실패한다.
UNC 경로는 지원되지 않습니다.
[Environment]::SetEnvironmentVariable 은 cwd 와 무관하게 동작하고 WM_SETTINGCHANGE 브로드캐스트도 해준다.
백슬래시 개수를 조심해야 한다. zsh 의 큰따옴표 안에서는 \\ 가 \ 하나로 먹힌다. zsh 작은따옴표 + PowerShell 큰따옴표 조합으로 넘겨야 두 개가 살아남는다. 넣고 나서 반드시 되읽어 확인한다.
[Environment]::GetEnvironmentVariable("CODEX_HOME","User")
# \\wsl.localhost\... — 백슬래시가 앞에 2개인지 본다
Claude — PowerShell 7 설치 후 로그인
winget install --id Microsoft.PowerShell --source winget --accept-source-agreements --accept-package-agreements
설치 후 PowerShell 창을 닫고 새로 연다. pwsh 가 PATH 에 올라와야 헬퍼의 node 프로세스가 찾는다.
pwsh -v # 7.x 확인
$h = "C:\Users\<user>\...\plugins\ClaudeUsagePlugin\claude-web-helper.ps1"
& $h login # 브라우저에서 claude.ai 로그인 완료 후 그 창을 닫는다 (쿠키 flush)
& $h once # "Claude helper updated ...claude-web-usage.json" 이면 성공
로그인 후 창을 닫는 단계를 건너뛰면 쿠키가 디스크에 flush 되지 않아 헬퍼가 여전히 못 읽는다.
index.mjs 안의 PowerShell 스크립트 앞에 Add-Type -AssemblyName System.Security; 한 줄을 넣으면 5.1 로도 동작한다. 다만 제3자 플러그인 파일이라 업데이트 때 덮어써진다. pwsh 설치가 정석이다.
적용 — TrafficMonitor 재시작
트레이에서 종료하고 시작 메뉴에서 다시 실행한다. 새 CODEX_HOME 을 상속받고, 워처를 pwsh 가 있는 PATH 로 다시 띄우기 위해서다.
interop 으로 재실행하면 안 된다. WSL 쪽에서 start 로 띄우면 환경변수가 제대로 상속되지 않는다. 반드시 네이티브(트레이 / 시작 메뉴)로 재실행한다.
워처가 관리자 권한 TrafficMonitor 의 자식 프로세스인 경우, 비관리자 셸에서 stop 을 시도하면 “액세스가 거부되었습니다”가 뜬다. 이때도 답은 TrafficMonitor 재시작이다.
숫자가 다른 건 버그가 아니다
다 고친 뒤에도 값이 다른 도구와 안 맞는다. 이건 정상이고, 이유를 알아두면 헛수고를 줄인다.
| 값 | 실제 출처 |
|---|---|
C (Claude) |
claude.ai 웹 사용량 — 헬퍼가 로그인한 계정 기준 |
| 로컬 statusline | 로컬 Claude Code CLI 사용량 |
X (Codex) |
rollout 파일의 rate_limits — 마지막 세션 계정 기준 |
계정을 여러 개 돌려 쓰면 숫자가 갈린다. 통합 플랜이면 대략 맞는다. 실측으로는 로컬 48/33 에 웹 50/33 이 나왔다.
Codex 쪽에는 라벨 함정이 하나 더 있다. 플랜마다 보고하는 윈도우가 다르다.
plus— 5시간(300분) + 7일(10080분)go— 30일(43200분)만 보고
플러그인은 primary 윈도우를 무조건 “5h” 로 라벨링한다. go 플랜이면 30일치가 X5h 자리에 표시된다. 숫자는 맞는데 라벨이 거짓말을 하는 셈이다.
결국 이 플러그인은 “마지막 활동 슬라이스”를 보여주는 도구다. 다른 미터와 1:1 로 맞추려 들면 안 맞는 게 맞다.
정리
WSL 에서 CLI 를 돌리고 Windows 에서 그 상태를 보는 구성은 경계를 두 번 넘는다. 파일 경로 경계와 자격 증명 경계다. 이 플러그인은 Codex 에서 전자에, Claude 에서 후자에 걸렸다. 증상이 똑같이 “숫자가 멈춤”으로 보여도 원인이 붙어 있지 않으니, 하나씩 끊어서 확인하는 게 빠르다.