DAY 01작업 1일째
5시간 사용량을 세션별 몫으로 나눴다
계정 전체 퍼센트만 나오는 사용량을 비용 장부로 세션마다 나누고, 창이 바뀌면 기준점을 다시 잡게 했다.
총량으로는 범인을 못 찾는다
Claude Code가 알려 주는 사용량은 계정 전체의 5시간 창 퍼센트뿐이다. 사용량이 빨리 차오를 때 알고 싶은 건 총량이 아니라 이번 5시간 동안 어느 세션이 많이 썼느냐였다. 그래서 세션 목록에 세션마다 이번 창에서 쓴 비중을 띄우기로 했다.
조건이 두 가지 있었다. 5시간 창이 초기화되면 세션별 몫도 같이 0부터 다시 세야 하고, 캐시에서 읽은 토큰은 훨씬 싸니 그 차이를 반영해야 했다.
토큰 수 대신 비용 장부를 쓴다
토큰 수를 직접 더하면 캐시 읽기, 캐시 쓰기, 모델별 단가를 전부 따로 계산해야 한다. 엔진이 이미 /cost에서 보여 주는 비용 장부(cost.usd)는 모델별 단가와 캐시 단가를 반영해 쌓인 값이라 이걸 그대로 쓰기로 했다.
장부는 세션이 시작된 뒤 계속 쌓이기만 한다. 이번 창에서 쓴 양을 구하려면 창이 시작될 때의 장부 값을 기준점으로 잡아 두고 빼야 한다. 창이 바뀐 건 5시간 한도의 리셋 시각(resetsAt)이 바뀐 걸로 알아낸다.
const isNewWindow =
!!resetsAt && !!prev.resetsAt && Math.abs(Date.parse(resetsAt) - Date.parse(prev.resetsAt)) > WINDOW_SLACK_MS
if (isNewWindow) {
// 리셋 직전에 본 장부 값이 새 창의 출발점이다.
return { ...prev, resetsAt, baseUsd: prev.lastUsd, isPartial: false, lastUsd: usd }
}
플러그인이 세션 중간에 처음 붙은 경우에는 그 전에 쓴 양을 창 안팎으로 나눌 수 없다. 이때는 지금까지 쓴 걸 전부 이번 창 몫으로 치고 isPartial 표시를 남겨, 화면에 ≈ 대신 ≥를 붙인다.
퍼센트로 바꾸는 계산
플러그인은 비용만 내보내고, 퍼센트로 바꾸는 건 모든 세션을 아는 위젯이 한다.
세션 몫 = 5시간 사용량(%) × 이 세션의 이번 창 비용 / 이번 창의 모든 세션 비용 합
세션들의 리셋 시각이 같은 것끼리만 더해서, 이전 창에 머물러 있는 세션 값이 섞이지 않게 했다.
감수한 것
계정 사용량을 세션 비용 비율로 나눈 추정치다. 웹이나 다른 기기에서 쓴 양은 어느 세션 장부에도 없어서 세션 몫의 합이 실제 퍼센트와 어긋날 수 있다. 그래서 숫자 앞에 항상 ≈를 붙여 정확한 값이 아니라는 걸 드러냈다.