Coding agents are good at keeping their own history and bad at everything around it. asm reads the stores they keep for themselves, lists every session in one place, lets you reply to the ones you can still talk to, and carries a conversation from one agent into another.
curl -fsSL https://raw.githubusercontent.com/samishal1998/agent-sessions-manager/main/install.sh | sh
Single self-contained binary · Linux and macOS · x86_64 and arm64
Each agent invented its own on-disk format and its own idea of what a session is. None of them can see the others, so there is no list, no search, and no way back into a conversation you started somewhere else.
Append-only JSONL per session, in a directory named by a lossy encoding of your working directory. Five sidecar locations across two roots.
~/.claude/projects/…/<uuid>.jsonlOne SQLite database for everything, with a live write-ahead log — copy it wrong and you silently read stale data.
~/.local/share/opencode/opencode.dbA whole-conversation JSON snapshot rewritten on every turn, alongside a journal and a backup of the previous state.
~/.jcode/sessions/session_<name>.jsonA rollout JSONL per session, plus a row in a SQLite index that its own picker reads — and rollouts on disk the index has never adopted.
~/.codex/sessions/…/rollout-<uuid>.jsonlOne SQLite database per conversation, every step a protobuf blob against a schema nobody publishes.
~/.gemini/antigravity-cli/conversations/<uuid>.dbSessions from every agent, grouped by the repository they belong to, with the disk each one costs.
$ asm list AGENT ID TITLE PROJECT BRANCH UPDATED SIZE STATUS antigravity 3f6bfd66 Dashboard chart accessibility pass ~/code/atlas-web 1d ago 253 KB idle codex 01a020c4-71bd Audit the bundle for duplicate dependencies ~/code/atlas-web main 2d ago 1.5 KB idle codex 01a020ab-9a2c Add a regression test for the pool leak ~/code/mercury main 3d ago 2.2 KB idle jcode calm-meridian Benchmark the new pool against the old one ~/code/mercury 4d ago 777 B idle claude-code 4c0d9a71 Rewrite the auth guard tests ~/code/atlas-web main 5d ago 1.2 KB idle claude-code b21e6f04 Port the retry middleware onto tower::Layer ~/code/mercury-tls tls-rewrite 6d ago 2.5 KB idle opencode ses_71bc Design the billing webhook retry schema ~/code/atlas-web 6d ago 1.3 KB idle jcode bright-canyon Draft the incident postmortem ~/code/notes 7d ago 845 B idle claude-code 7f3a1c88 Trace the connection-pool leak under load ~/code/mercury main 9d ago 4.2 KB idle opencode ses_9d2a Migrate the dashboard build to Vite 7 ~/code/atlas-web 9d ago 927 B archived $ asm projects PROJECT AGENTS SESSIONS SIZE WORKTREES UPDATED ~/code/mercury claude-code, codex, jcode 4 9.6 KB 2/2 3d ago ~/code/atlas-web antigravity, claude-code, codex, … 5 257 KB 1d ago ~/code/notes jcode 1 845 B 7d ago
asm serve puts the same verbs behind a mouse — filters, full-text search,
a transcript panel that renders reasoning and tool calls, and a checkbox on every row
for when one at a time is not enough.

Everything runs locally. Nothing is uploaded anywhere.
Select a set; the bar acts on all of it.
Open a transcript and answer it. The turn runs in the agent that owns the session — its model, its tools, its permissions — and streams back as it happens.
Marked in flight until the agent writes it to the session.
Checked against each agent: the same session id, the same transcript growing. A reply cannot end up stranded in a copy you are not looking at.
Closing the panel or pressing Stop kills the agent process. A turn nobody is watching does not keep spending tokens and editing files.
If another terminal is driving that session right now, asm says so instead of offering a box. Two writers into one conversation is not something any of these CLIs promise to handle.
One set of verbs, applied to whichever agent happens to own the session.
Every session from every agent in one table, with title, project, branch, model, size and whether it is running right now.
One index across every transcript, whatever wrote it, with highlighted snippets and the message each hit came from.
Not directories. A repository's worktrees and subdirectories are one project, so a session started in a checkout is not a separate thing.
Retitle a session you can no longer identify. Move one after you renamed the directory. Archive what you are done with, and bring it back.
Carry a conversation from one agent to another as a native session the target's own picker lists and its own resume opens.
Tick a set in either UI and archive, import, move, export or delete the lot. Every one is attempted, so a single failure cannot strand the rest, and what did not work is listed per session.
asm send, c in the terminal UI, or the composer in the browser. The reply streams in, and what asm does not recognise is shown rather than swallowed.
Every destructive verb writes a backup first, and refuses outright on a session whose process is still alive.
The flagship. asm import converts through a documented, versioned
intermediate representation and writes a native session in
the target — not an export file, but a real session the target lists and resumes.
$ asm import 36405fad --to opencode Imported as opencode:ses_7bdfed0f167b6c50. Loss report: 2 of 3 messages converted 1 opaque reasoning block dropped (provider-bound; summaries only) conversation re-attributed to openai/gpt-5.6-sol Resume with: opencode -s ses_7bdfed0f167b6c50

The same operations wherever you are: a CLI that pipes, a terminal UI where every verb is a keystroke, and a local web UI that works down to a phone.
asm doctorVerified means a real session was changed, then the agent's own CLI still listed and resumed it. Codex and Antigravity are read-only on purpose: neither ships a command to write through, and the alternative is a raw write to a schema that keeps moving.
| Claude Code | OpenCode | jcode | Codex | Antigravity | |
|---|---|---|---|---|---|
| List, show, search | ✓ | ✓ | ✓ | ✓ | ✓ |
| Resume natively | ✓ | ✓ | ✓ | ✓ | ✓ |
| Reply to a session | ✓ | ✓ | — | ✓ | ✓ |
| Export to IR | ✓ | ✓ | ✓ | ✓ | ✓ |
| Rename | ✓ | ✓ | ✓ | — | — |
| Archive · unarchive | ✓ | ✓ | ✓ | — | — |
| Delete, with backup | ✓ | ✓ | ✓ | — | — |
| Move to another project | ✓ | ✓ | — | — | — |
| Import into | ✓ | ✓ | — | — | — |
| tested against | 2.1.234 | 1.17.18 | 0.78.0 | 0.148.0 | 1.1.16 |
One binary, no runtime. SQLite is bundled and the web UI is embedded.
Downloads the build for your platform, checks it against the release's
SHA256SUMS, and installs to ~/.local/bin. A bad
download stops before anything is written.
curl -fsSL https://raw.githubusercontent.com/samishal1998/agent-sessions-manager/main/install.sh | sh
Needs a recent stable Rust, and Bun or Node to build the embedded web assets first.
git clone https://github.com/samishal1998/agent-sessions-manager cd agent-sessions-manager/crates/asm-web/frontend bun install && bun run build && cd - cargo build --release
No need to run the installer again. asm update checks the
latest release, verifies the download, and replaces the binary in place;
a bad download leaves the working one alone.
asm update --check # is there a newer one? asm update # install it
| Variable | Effect |
|---|---|
| ASM_VERSION | Install a specific tag instead of the latest release. |
| ASM_INSTALL_DIR | Where the binary goes. Defaults to ~/.local/bin. |
| ASM_BASE_URL | Fetch the assets from a mirror or a local directory instead of GitHub. |
asm edits stores that other programs own. The rules that follow from that are not optional.
Every mutation checks whether the owning process is still running, and refuses if it is.
Destructive verbs write a copy first. Delete backs up the transcript and its sidecars together.
Nothing leaves your machine. The web UI binds to loopback and refuses cross-origin mutations.
Search is a derived cache that can be deleted and rebuilt. The agents' own files stay the source of truth.