Works with Claude Code · OpenCode · jcode · Codex · Antigravity

Every agent's sessions,
in one inventory

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

Five agents, five incompatible stores

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.

Claude Code

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>.jsonl
OpenCode

One SQLite database for everything, with a live write-ahead log — copy it wrong and you silently read stale data.

~/.local/share/opencode/opencode.db
jcode

A whole-conversation JSON snapshot rewritten on every turn, alongside a journal and a backup of the previous state.

~/.jcode/sessions/session_<name>.json
Codex

A 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>.jsonl
Antigravity

One SQLite database per conversation, every step a protobuf blob against a schema nobody publishes.

~/.gemini/antigravity-cli/conversations/<uuid>.db

One list, whatever wrote it

Sessions from every agent, grouped by the repository they belong to, with the disk each one costs.

asm list
$ 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

And a browser, if you'd rather

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.

The asm web UI: a list of sessions from five agents on the left, and an open transcript on the right showing reasoning, tool calls and results.

Everything runs locally. Nothing is uploaded anywhere.

Three sessions ticked, with a bar above the list offering Archive, Unarchive, Import, Move, Export and Delete for the whole selection.

Select a set; the bar acts on all of it.

Reply to it, don't just read 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.

An open transcript with a composer at the bottom. Below the stored conversation, a block marked IN FLIGHT shows the reply arriving: the message just sent, the agent's first response, and a tool call, with a Stop button beside the composer.

Marked in flight until the agent writes it to the session.

It appends, it does not fork

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.

Stop means stop

Closing the panel or pressing Stop kills the agent process. A turn nobody is watching does not keep spending tokens and editing files.

Never into a live session

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.

What it does

One set of verbs, applied to whichever agent happens to own the session.

List and inspect

Every session from every agent in one table, with title, project, branch, model, size and whether it is running right now.

Full-text search

One index across every transcript, whatever wrote it, with highlighted snippets and the message each hit came from.

Projects are repositories

Not directories. A repository's worktrees and subdirectories are one project, so a session started in a checkout is not a separate thing.

Rename, move, archive

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.

Cross-agent import

Carry a conversation from one agent to another as a native session the target's own picker lists and its own resume opens.

Act on many at once

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.

Send a message back

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.

Backed up, never in the way

Every destructive verb writes a backup first, and refuses outright on a session whose process is still alive.

Move a conversation
between agents

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.

  • Full mode translates the transcript into the target's own records.
  • Seed mode distils it into a handoff document that starts a fresh session — lower fidelity, immune to format churn.
  • A loss report every time. Nothing degrades silently: what could not cross is printed.
  • Idempotent. Target ids are derived from the source, so re-importing is a no-op, not a duplicate.
asm import
$ 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 asm web UI on a narrow phone-sized viewport, with the session list filling the screen.

Three frontends,
one core

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.

resume in the native agent — the TUI steps aside and comes back
rrename · a archive · d delete, confirmed and backed up
mmove to another project · i import · e export
creply to the session, streamed into the pane — esc stops it
ssearch across transcripts · / filter the list
Dstore health — the same report as asm doctor

Agent support

Verified 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 CodeOpenCodejcodeCodexAntigravity
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 against2.1.2341.17.180.78.00.148.01.1.16

Install

One binary, no runtime. SQLite is bundled and the web UI is embedded.

Script

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

From source

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

Updating

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
VariableEffect
ASM_VERSIONInstall a specific tag instead of the latest release.
ASM_INSTALL_DIRWhere the binary goes. Defaults to ~/.local/bin.
ASM_BASE_URLFetch the assets from a mirror or a local directory instead of GitHub.

What it will not do to your data

asm edits stores that other programs own. The rules that follow from that are not optional.

Never touches a live session

Every mutation checks whether the owning process is still running, and refuses if it is.

Backup before every change

Destructive verbs write a copy first. Delete backs up the transcript and its sidecars together.

Local only

Nothing leaves your machine. The web UI binds to loopback and refuses cross-origin mutations.

The index is disposable

Search is a derived cache that can be deleted and rebuilt. The agents' own files stay the source of truth.