Releases: centell/agent-monitor
Release list
agent-monitor 0.5.0
Added since 0.4.0 — it speaks Japanese, and it can tell you what each session is burning.
Two columns for tokens
CTX is how full a session is right now — what its last turn carried in. TOK is what it has
burned since it started, written as freshly burned / everything: the first number leaves out
context replayed from cache, the second counts it. Either number alone misleads whichever you
pick — one measured session read 17.2M one way and 81.9M the other — so both are printed.
● web-client Working Read 4s █▌ RAM 0.8G CTX 512k TOK 640k/ 96M
Both start off. Turning them on widens the row by 25 columns, and a width you have settled into
should not change because you updated; Display has a switch for each.
The sources write down different things. codex keeps a running total in its own transcript, so
reading the tail is enough. Claude Code records only per-turn usage, so the whole transcript has
to be read — which is why TOK has a switch of its own: with it off, nothing is scanned. The app
remembers how far it got and reads only what has been appended since, so that cost is paid once
(0.30s across 66MB of transcripts, measured; every refresh after that was too fast to time).
Subagents count too — they keep transcripts of their own beside the session's, and leaving them
out lost between 1% and a third of a session's tokens.
Nothing is printed as a denominator beside CTX. codex records its context window and Claude Code
does not, and a table of model names to fill that gap would start printing a wrong denominator the
day a new model ships. --json carries all three as contextTokens, freshTokens and
totalTokens, switches or no switches.
Japanese
The interface is English, Korean and Japanese now, following the system language by default.
Columns are placed by measured glyph width rather than by counting cells, so a row holds its
columns whether the names are Latin, Hangul, kana or kanji. The README comes in all three.
Smaller things
- A row that cannot be measured now keeps its column instead of collapsing it. A codex app
thread has no process to measure but does carry tokens, and without this its numbers slid left
out of line with every other row. --demodraws made-up sessions through the real drawing code. The README screenshots are taken
from it, so no real session name appears in any of them.
agent-monitor 0.4.0
Added since 0.3.0 — the list gets a second home, and it says more about what it is showing.
Park the list in a corner
Menu bar → Show panel. A floating window that keeps the session list on screen, so which one
is waiting for me costs a glance instead of a click. The 2/5 stays where it is; on a small
screen you simply leave the panel closed.
Drag it anywhere on its body and the spot is remembered. It sizes itself to its contents but
keeps the corner you parked it in — park it bottom-right and it grows upward as sessions
appear. Clicking it never takes the front, so the editor you were in stays where it was. While the
pointer is over it the list holds still: waiting rows sort to the top, and an unfrozen list would
move the row you were reaching for out from under you.
Right-click the header for the handles — always on top, waiting only, close. Settings has a
new Panel tab for how it looks: backdrop blur or solid at any opacity down to none at all, text
size, row density, and the margin around the list. Everything on that tab touches the panel alone.
Three skins
Simple keeps every row at one weight — this is what you have now. Bold puts the name first
and lets status and metrics fall back. Quiet holds only the rows that need you and sinks the
rest toward the background. They change colour, weight and hierarchy only; nothing moves.
Stop a background session
A background session runs on a pty the daemon made, so no terminal window exists and clicking its
row could never go anywhere. Right-click one in the panel and you can stop it — the rows you
cannot reach and the rows you can now end are exactly the same rows.
It asks the CLI (claude stop) instead of killing the process, so a transcript is not cut
mid-write and claude attach <id> opens the conversation again.
It says why a session is waiting
Hover a row that needs you. A session waiting on approval shows the call it is waiting on
(Bash: pnpm build --filter web); an idle one shows the last thing it said to you. A busy row says
nothing — there is nothing for you to answer yet. The text comes out of the transcript the app was
already reading, and when it is not there nothing is shown rather than a guess. Turn it off in
Display if you would rather not have commands on screen.
Statistics
A new tab, and --stats on the command line: the last 7 days, by hour and by weekday, with a bar
on the share of time two or more sessions were waiting. It samples session counts, waiting time and
memory once a minute and never records conversation content.
Smaller
- Point at the menu bar count and the list opens — no click needed. Off by default; the delay
is yours to choose, down to none. - Appearance — follow the system, or pin the app light or dark.
- A click that cannot go anywhere now says why, in the clicked row for three seconds in the
panel and in a dialog from the menu. It used to be a beep.
Fixed
- A session split across two processes is one row. Claude Code can hand a session to another
process while the terminal window stays with the one it came from, and the two halves then
break in opposite ways: the one holding the window stops updating its status (three and a half
hours of it, measured), and the one doing the work has no window to go to. The app now follows
the handoff recorded in the transcript and joins them, so the live status and the real terminal
land on the same row. Their process trees overlap, so the memory is counted once — 1.56GB → 0.89GB
in the case that found this. - Columns line up in any script. Rows were padded by counting cells — two for Hangul, one for
the rest. On screen that is simply wrong: a Hangul glyph is 1.3993 spaces wide, not two. The same
ten-cell status column spanned 56.36pt to 74.18pt, and the name column drifted by 35.6pt. Columns
are now placed by measured width. An all-Latin list renders exactly where it did before. - The solid panel backdrop follows dark mode. It was baked at whichever appearance it was built
in, and stayed white on a dark screen no matter what.
This build is not signed, so macOS refuses to open it the first time. Right-click the app →
Open, then confirm. If it still refuses: System Settings → Privacy & Security → Open Anyway.
Universal binary (Apple Silicon · Intel).
0.3.0 에서 더해진 것 — 목록에 두 번째 집이 생겼고, 무엇을 보여주고 있는지를 더 말합니다.
목록을 구석에 붙여 두기
메뉴바 → 「상시 창 열기」. 세션 목록을 화면에 띄워 두는 창입니다. 무엇이 나를 기다리나
에 답하는 값이 «누르기» 에서 «흘깃» 으로 내려갑니다. 2/5 는 그대로 있고, 화면이 좁으면
창을 안 열면 그만입니다.
몸통 아무 데나 잡아 끌면 옮겨지고 그 자리를 기억합니다. 내용에 맞춰 크기가 자동으로
맞되 붙여 둔 구석은 그대로 둡니다 — 우하단에 두시면 세션이 늘 때 위로 자랍니다.
눌러도 앞으로 나서지 않으므로 쓰시던 편집기가 그 자리에 남습니다. 마우스를 창 위에 올려
둔 동안에는 목록이 멈춥니다. 대기 줄이 위로 올라오기 때문에, 안 멈추면 손이 내려가는
사이에 누르려던 줄이 다른 줄로 바뀝니다.
머리줄을 우클릭하면 손잡이가 나옵니다 — 항상 위로, 기다리는 것만, 닫기. 생김새는
설정에 새로 생긴 「상시 창」 탭에 있습니다: 바탕의 결(흐림·단색)과 진하기 퍼센트
(0% 면 판이 사라지고 글자만), 글자 크기, 줄 밀도, 목록 둘레의 여백. 이 탭의 손잡이는
창에만 걸립니다 — 메뉴는 달라지지 않습니다.
스킨 셋
심플은 모든 줄을 같은 무게로 둡니다 — 지금 쓰시던 그 모습입니다. 또렷은 이름을
앞세우고 상태와 지표를 뒤로 물립니다. 고요는 손이 필요한 줄만 남기고 나머지를
배경으로 내립니다. 색·굵기·위계만 바뀌고 배치는 하나도 안 움직입니다.
백그라운드 세션 멈추기
백그라운드 세션은 daemon 이 만든 pty 위에서 돌아 터미널 창이 아예 없습니다. 그래서 그 줄은
눌러도 갈 데가 없었습니다. 상시 창에서 우클릭하면 멈출 수 있습니다 — 갈 수 없는 줄과
멈출 수 있는 줄이 정확히 같은 집합입니다.
프로세스를 죽이지 않고 CLI 에게 시킵니다(claude stop). 기록이 적다 만 자리에서 끊기지
않고, claude attach <id> 로 대화를 다시 엽니다.
왜 기다리는지 말합니다
손이 필요한 줄에 마우스를 올려 보세요. 승인을 기다리는 세션은 무엇을 기다리는지
(Bash: pnpm build --filter web), 입력을 기다리는 세션은 마지막으로 한 말을 보여줍니다.
도는 중인 줄은 아무 말도 안 합니다 — 아직 답할 것이 없으니까요. 이미 읽고 있던 기록에서
꺼내는 값이고, 없으면 지어내지 않고 아무것도 안 보입니다. 명령이 화면에 뜨는 게 불편하시면
설정 → 표시에서 끄시면 됩니다.
통계
탭이 하나 생겼고 명령줄에도 --stats 가 생겼습니다. 최근 7일을 시간대별·요일별로 보여주고,
세션 둘 이상이 기다리던 시간 비율에 막대가 붙습니다. 세션 수·대기 시간·메모리를 1분에
한 번 남기며 대화 내용은 남기지 않습니다.
작은 것들
- 메뉴바 숫자에 마우스만 올려도 목록이 열립니다 — 안 눌러도 됩니다. 기본은 꺼짐이고,
머무는 시간은 「즉시」까지 고르실 수 있습니다. - 밝기 — 시스템을 따르거나, 늘 밝게 / 늘 어둡게로 고정합니다.
- 갈 데가 없는 줄을 눌렀을 때 왜 못 갔는지 말합니다. 상시 창에서는 누른 그 줄이 3초 동안
이유로 바뀌고, 메뉴에서는 대화상자로 알립니다. 예전에는 삑 소리뿐이었습니다.
고친 것
- 두 프로세스로 갈린 세션이 한 줄이 됩니다. Claude Code 는 세션을 다른 프로세스에
넘기면서도 터미널 창은 넘겨준 쪽이 계속 쥐고 있습니다. 그러면 양쪽이 정반대로
고장납니다 — 창을 쥔 쪽은 상태 갱신을 멈추고(실측 3시간 반), 일하는 쪽은 갈 창이 없습니다.
이제 기록에 적힌 인계를 따라가 둘을 합칩니다. 살아있는 상태와 진짜 터미널이 한 줄에
모이고, 겹치던 프로세스 트리는 한 번만 세어집니다 — 이 문제를 찾아낸 사례에서
1.56GB → 0.89GB. - 어떤 문자든 칸이 맞습니다. 여태 칸 수로 채웠습니다 — 한글 두 칸, 나머지 한 칸.
화면에서는 그게 그냥 틀린 셈입니다. 한글 한 자는 공백 두 개가 아니라 1.3993 개거든요.
같은 「10칸」 상태 칸이 56.36pt 에서 74.18pt 까지 벌어졌고 이름 칸은 35.6pt 흔들렸습니다.
이제 실제로 그려지는 폭으로 칸을 세웁니다. 영문만 있는 목록은 예전과 같은 자리입니다. - 창의 단색 바탕이 다크 모드를 따라갑니다. 만들어질 때의 밝기로 굳어 있어서, 어두운
화면에서도 흰 판이 그대로 남았습니다.
서명이 없어 macOS 가 처음 한 번은 열기를 거부합니다. 앱을 우클릭 → 열기 로 여시거나,
시스템 설정 → 개인정보 보호 및 보안 → 「그래도 열기」 를 눌러주세요. 한 번이면 됩니다.
유니버설 바이너리(Apple Silicon · Intel).
agent-monitor 0.3.0
Added since 0.2.1 — two changes, both about telling the list what matters to you.
Pin a session
Right-click a row to pin it. A pinned session rises above the others while it is waiting for
you, and carries a tinted background so you can tell which ones you chose.
While a pinned session is working, it keeps its place. There is nothing for you to do there yet,
and lifting it would only push down the rows that do want you.
A pin belongs to the session, not to its directory. One project often has two or three sessions
open at once, and pinning the directory would drag the siblings up with it. A pin lives as long as
its session does — restart the session and you pin it again.
The three metrics are now three switches
Metrics used to be a ladder — off · bar · bar + value · all — so sensible combinations could not
be reached at all. Wanting the number without the bar, or CPU on its own, was simply not
expressible.
Settings → Display now has one switch each: RAM bar, RAM GB, CPU %. The old labels
never said which value "value" meant, or what the rest of "all" was; the new ones use the words the
row itself prints. Your existing choice is carried over, so nothing resets.
Everything else is as in 0.2.1 —
four sources (claude, claude-app, codex, codex-app), click-to-focus for all of them, the
source label style, and a time window for codex app threads.
This build is not signed, so macOS refuses to open it the first time. Right-click the app →
Open, then confirm. If it still refuses: System Settings → Privacy & Security → Open Anyway.
Once is enough. Universal binary (Apple Silicon and Intel).
0.2.1 에서 더해진 것 — 둘 다 「무엇이 지금 중요한지」를 목록에 알려주는 이야기입니다.
세션 고정
줄을 우클릭하면 고정됩니다. 고정한 세션은 손을 기다리는 동안 다른 것들보다 위로 올라오고,
바탕이 옅게 깔려 어느 것을 골라 두었는지 보입니다.
고정한 세션이 도는 중일 때는 자리를 지킵니다. 아직 손댈 일이 없는데 위로 올리면, 정작 부르고 있는
줄을 아래로 밀 뿐이니까요.
핀은 폴더가 아니라 세션에 붙습니다. 한 프로젝트에 세션을 둘셋 띄우는 일이 흔한데, 폴더에 꽂으면
꽂지 않은 것까지 딸려 올라옵니다. 핀은 그 세션이 사는 동안 삽니다 — 세션을 껐다 켜면 다시 꽂으시면
됩니다.
지표 셋이 각각의 스위치가 되었습니다
지표는 사다리였습니다 — 끄기 · 막대 · 막대+숫자 · 전부. 그래서 멀쩡한 조합에 아예 닿을 수가
없었습니다. 「막대는 빼고 숫자만」이나 「CPU만」은 고를 방법이 없었습니다.
이제 설정 → 표시에 스위치가 셋입니다: RAM 막대 · RAM GB · CPU %. 옛 이름은 「숫자」가
무슨 숫자인지, 「전부」의 나머지가 무엇인지 적지 않아 골라 봐야만 알 수 있었습니다. 새 이름은 줄에
실제로 찍히는 말을 그대로 씁니다. 쓰시던 설정은 그대로 옮겨오므로 초기화되지 않습니다.
나머지는 0.2.1 과 같습니다 —
네 출처(claude · claude-app · codex · codex-app), 어느 세션이든 눌러서 이동, 출처 표시
방식, codex 앱 스레드의 시간 창.
서명이 없어 macOS 가 처음 한 번은 열기를 거부합니다. 앱을 우클릭 → 열기 로 여시거나,
시스템 설정 → 개인정보 보호 및 보안 → 「그래도 열기」 를 눌러주세요. 한 번이면 됩니다.
유니버설 바이너리(Apple Silicon · Intel).
agent-monitor 0.2.1
Added since 0.2.0 — you can now choose how each row names its source, in Settings → Display.
| Setting | A terminal session | An in-app session |
|---|---|---|
| App only (default, unchanged) | claude/my-project |
claude-app/my-project |
| Both | claude-cli/my-project |
claude-app/my-project |
| Mark | > claude/my-project |
□ claude-app/my-project |
0.2.0 marked only the app sessions, which left "no suffix means terminal" as something you had to
know. Pick whichever suits you; the default keeps 0.2.0's look. Machine-readable output (--json)
is unaffected — its source field stays the same whatever you pick.
Everything else is as in 0.2.0:
four sources (claude, claude-app, codex, codex-app), click-to-focus for all of them,
and a time window for codex app threads.
This build is not signed, so macOS refuses to open it the first time. Right-click the app →
Open, then confirm. If it still refuses: System Settings → Privacy & Security → Open Anyway.
Once is enough. Universal binary (Apple Silicon and Intel).
0.2.0 에서 더해진 것 — 줄마다 출처를 어떻게 적을지 고를 수 있습니다 (설정 → 표시).
| 설정 | 터미널 세션 | 앱 안의 세션 |
|---|---|---|
| 앱만 (기본, 0.2.0 과 같음) | claude/my-project |
claude-app/my-project |
| 양쪽 다 | claude-cli/my-project |
claude-app/my-project |
| 표식 | > claude/my-project |
□ claude-app/my-project |
0.2.0 은 앱 쪽만 표시해서, 「표시가 없으면 터미널」이라는 걸 알고 있어야 했습니다.
편한 것으로 고르시면 되고, 기본값은 0.2.0 의 모습 그대로입니다.
기계가 읽는 출력(--json)은 무엇을 고르든 바뀌지 않습니다.
나머지는 0.2.0 과 같습니다 —
네 출처(claude · claude-app · codex · codex-app), 어느 세션이든 눌러서 이동,
codex 앱 스레드의 시간 창.
서명이 없어 macOS 가 처음 한 번은 열기를 거부합니다. 앱을 우클릭 → 열기 로 여시거나,
시스템 설정 → 개인정보 보호 및 보안 → 「그래도 열기」 를 눌러주세요. 한 번이면 됩니다.
유니버설 바이너리(Apple Silicon · Intel).
agent-monitor 0.2.0
A macOS menu bar app that shows which of your local agent sessions are waiting on you.
0.1.1 watched terminal Claude Code only. 0.2.0 watches four places.
| Source | Where sessions come from | Status |
|---|---|---|
claude |
Claude Code in a terminal | verbatim, from the session registry |
claude-app |
Claude Code inside the Claude desktop app | estimated from the transcript, marked (est.) |
codex |
codex in a terminal | estimated from the rollout, marked (est.) |
codex-app |
threads in the ChatGPT desktop app | verbatim, read-only from codex's own database |
- Each row says where it came from —
claude/my-project,codex-app/refactor the parser. - Clicking works everywhere. Terminal sessions focus their window; app sessions open through
the app's own deep link. - A time window for codex app threads, in Settings. An app thread cannot be checked for
"still open", so finished ones show only inside the window (default 30 minutes); running ones
always show. Set it to Hidden to leave them out. - Estimated status is always labelled
(est.). Nothing is silently guessed. - Only your own sessions are read, and every database is opened read-only.
This build is not signed, so macOS refuses to open it the first time. Right-click the app →
Open, then confirm. If it still refuses: System Settings → Privacy & Security → Open Anyway.
Once is enough.
Universal binary (Apple Silicon and Intel). See the
README for what it does and where it is limited.
내 로컬 에이전트 세션 중 무엇이 끝나서 나를 기다리는지 보여주는 macOS 메뉴바 앱입니다.
0.1.1 은 터미널 Claude Code 만 봤습니다. 0.2.0 은 네 곳을 봅니다.
| 출처 | 어디서 오는가 | 상태 |
|---|---|---|
claude |
터미널의 Claude Code | 원문 — 세션 등록부에 적힌 그대로 |
claude-app |
Claude 데스크탑 앱 안의 Claude Code | 기록에서 추정 · (추정) 표시 |
codex |
터미널의 codex | rollout 에서 추정 · (추정) 표시 |
codex-app |
ChatGPT 데스크탑 앱의 스레드 | 원문 — codex 자신의 DB 를 읽기 전용으로 |
- 줄마다 어디서 왔는지 적힙니다 —
claude/my-project,codex-app/파서 정리. - 어느 세션이든 눌러서 갈 수 있습니다. 터미널 세션은 그 창으로, 앱 세션은 그 앱의 딥링크로.
- codex 앱 스레드는 시간 창을 설정합니다. 앱 스레드는 「아직 열려 있는가」를 잴 수 없어서,
끝난 것은 창 안(기본 30분)에 있을 때만 보이고 도는 중인 것은 언제나 보입니다.
「안 보임」으로 두면 아예 빠집니다. - 추정한 상태에는 언제나
(추정)이 붙습니다. 조용히 단정하지 않습니다. - 내 세션만 읽고, 모든 DB 는 읽기 전용으로 엽니다.
서명이 없어 macOS 가 처음 한 번은 열기를 거부합니다. 앱을 우클릭 → 열기 로 여시거나,
시스템 설정 → 개인정보 보호 및 보안 → 「그래도 열기」 를 눌러주세요. 한 번이면 됩니다.
agent-monitor 0.1.1
A macOS menu bar app that shows which of your Claude Code sessions are waiting on you.
What changed since 0.1.0 — the app now has an icon. Nothing else. If 0.1.0 works for you,
there is no reason to update beyond no longer seeing a blank placeholder in Finder.
This build is not signed, so macOS refuses to open it the first time. Right-click the app →
Open, then confirm. If it still refuses: System Settings → Privacy & Security → Open Anyway.
Once is enough.
Universal binary (Apple Silicon and Intel). See the
README for what it does and where it is limited.
Claude Code 세션 중 무엇이 끝나서 나를 기다리는지 보여주는 macOS 메뉴바 앱입니다.
0.1.0 에서 달라진 것 — 앱에 아이콘이 생겼습니다. 그것뿐입니다. 0.1.0 이 잘 돌고 있다면
Finder 의 빈 자리가 거슬리지 않는 한 굳이 갈아끼우실 것 없습니다.
서명이 없어 macOS 가 처음 한 번은 열기를 거부합니다. 앱을 우클릭 → 열기 로 여시거나,
시스템 설정 → 개인정보 보호 및 보안 → 「그래도 열기」 를 눌러주세요. 한 번이면 됩니다.
agent-monitor 0.1.0
A macOS menu bar app that shows which of your Claude Code sessions are waiting on you.
This build is not signed, so macOS refuses to open it the first time. Right-click the app →
Open, then confirm. If it still refuses: System Settings → Privacy & Security → Open Anyway.
Once is enough.
Universal binary (Apple Silicon and Intel). See the
README for what it does and where it is limited.
Claude Code 세션 중 무엇이 끝나서 나를 기다리는지 보여주는 macOS 메뉴바 앱입니다.
서명이 없어 macOS 가 처음 한 번은 열기를 거부합니다. 앱을 우클릭 → 열기 로 여시거나,
시스템 설정 → 개인정보 보호 및 보안 → 「그래도 열기」 를 눌러주세요. 한 번이면 됩니다.