Folders and their sessions

Two folders in the sidebar: the folder tidewatch with a branch sign, 2 behind, 7 open issues and 2 open pull requests, five sessions under it with their branch names; the three open ones also say what their agent did last, like Last: Ran npm run build, and two of them have a red dot; below it the folder harbor-site with one session
two folders and their sessions. The bars on the left are the lights: green for a turn that is done, grey for a closed session. The red dots mark two sessions that need you. The 2 by the branch sign means tidewatch is two steps behind the shared copy it came from (origin). The 7 and the 2 after it are its open issues and pull requests.

Run a few agents for a week and you have dozens of old chats in many folders. Which one fixed the login bug? Which one is waiting for you right now? Koloft puts every folder in one list, with its sessions under it. You click a row to go back to it.

Where the list comes from

Koloft runs four agents: Claude Code, Codex, Meta's Muse Code and Google's Antigravity CLI (agy, the one that took over from Gemini CLI; CLI means command-line tool). Each already keeps every session in its own files. Koloft reads the chats from there and keeps only a short list of which ones belong to Koloft. Add a folder with ⇧⌘O and its sessions show up under it. Where this page says Claude and Codex, what Muse and Antigravity do is on the accounts, remote and agents pages.

A session you started in a plain terminal is not listed by itself. To bring it back, right-click the folder and pick Restore session….

Start and resume

Every row has a light on its left. The colour says what the session is doing.

light what it means
orange the agent is working
amber it needs your OK
green its turn is done
green with ↻ N its turn is done, but N things it started still run in the background. The light breathes while they run. Hover the mark to see them.
dim green done a while ago, nothing new; a sleeping session looks the same
grey closed

An open row can have one more short line under it, about what the agent is doing:

Before the agent has done or asked anything, there is no such line. Claude, Codex, Muse and Antigravity all do this, on your Mac and on a remote folder.

Red dots

Keep running

The tidewatch sessions; the row Fix tide times near midnight has a small pin before its name
the pin on a row marked Keep running

Some sessions should always be there, like a helper you talk to all day. Right-click the row and pick Keep running. A tick shows it is on, and a small pin sits on the row. The session never goes to sleep, and each time Koloft opens it starts again in the background, even if you had closed its tab. It does not pull you over to it.

If its worktree has changed, the session stays closed and Koloft says “…” needs you — its worktree changed. Click it to resume. If its folder is gone: Could not start “…” — its folder is gone. If it crashes while Koloft is open, Koloft does not start it again.

Find any session

All of this works for every agent, and for a session on a remote folder, which is listed with its machine's name and resumes there.

A tab is not a session

The tab is the terminal the agent runs in. The session is the chat inside it. Some things swap the chat but keep the tab: /clear, a resume, or a restart (⇧⌘R). The Workbench belongs to the tab, so your open files, web pages and shell stay put.

Worktree sessions

Two agents in one folder can step on each other's files. ⇧⌘N starts a session in its own git worktree, a second copy of the repo on its own branch.

Two worktrees often want the same port for the server a project runs while you work on it. So every session in a worktree gets KOLOFT_PORT_OFFSET, a number from 1 to 99 that is always the same for one worktree name. A project can add it to its base port, like PORT=$((3000 + KOLOFT_PORT_OFFSET)). Claude Code, Codex and Claude Code on a remote folder all get it.

A new worktree has none of the files git ignores, such as .env. List the ones you want in a .worktreeinclude file at the root of the repo, and they are copied into each worktree. Claude Code copies them into the worktrees it makes. Koloft copies them into every worktree it makes: for a Codex, Muse or Antigravity session, for a pull request, and when it rebuilds the worktree of a resumed Claude session. This works on a remote folder too.

Sessions an agent starts

An agent can start sessions of its own, with koloft session new (see agents, which also says how each one gets its name). Each one hangs under the session that started it, set in a little, with a thin line down its left. A session that one of those starts hangs one level deeper. The row is there from the moment it reads Starting….

The folder tidewatch: the session Add storm alerts endpoint with two sessions set in under it, Update the API docs and Write the storm alert tests, and under the second of those, one level deeper, Check the test fixtures; below them all, Fix tide times near midnight on its own
one session started two, and one of those started one more

A row with sessions under it gets a small arrow on the right. Click it to fold them away. Folded, the row shows a red count of the hidden sessions that need you, the way a folded folder does, and a grey count of all the hidden ones. Click the arrow again to see them.

The same folder with Add storm alerts endpoint folded: a red 2 and a grey 3 at the right of its name, and the arrow now points right
folded: 2 of the 3 sessions inside need you

The sidebar

The first row of the list is your butler, Alfred · Butler, above every folder. When the session tab you are looking at goes away, Koloft shows the butler, unless that session ended before it ever started.

When the Mac is busy (macOS says memory is tight, or the processors have been very busy for half a minute), each open session's row also shows about how much memory it and the programs it started use on your Mac, like ≈1.2 GB. For a session on another machine, only what runs on your Mac is counted. Nothing waits or is held back: it is only there so you can see which session is heavy.

Drag a folder's name up or down to reorder the list. The number keys 1 to 9 in the ⌘N folder picker follow the new order.

⌘B, or the button right of the window's traffic lights, hides the whole sidebar; the button then shows how many sessions are calling you. Press it again and the sidebar comes back as wide as it was. It stays hidden after a restart, if you left it hidden.

Right-click a folder

Right-click a session

The row Add storm alerts endpoint with its right-click menu open: Reveal in Finder, Copy session ID, Keep running, Close
the menu of a running session

The git panel

Hover a folder's branch sign and its git panel opens.

The git panel under the tidewatch folder: main · origin/main, fetched just now, 2 behind, 0 ahead, a note that Koloft only pulls into a clean tree, Pull · fast-forward greyed out, Fetch now, and GitHub · tidewatch-labs/tidewatch with two rows you can click, 7 open issues and 2 open pull requests
the git panel. Pull is greyed out here, and the panel says why: Koloft only pulls into a clean tree.

Koloft fetches by itself every five minutes, so the numbers stay fresh. Switch off Auto-fetch git remotes in Settings ▸ Appearance to stop that; Fetch now still works.

Under it, Auto-pull the default branch (off at first; greyed out while Auto-fetch is off) lets Koloft pull by itself. After each background fetch, a folder that Pull would allow (see above) is pulled, and a small message names the folder, the branch and how many commits came in. It waits while a session in that checkout is mid-task (working, stopped at a permission prompt, or in a state Koloft cannot see) and tries again on the next fetch. Claude Code and Codex sessions count the same way; a remote folder is never pulled.

If you click Pull while a session in that checkout is mid-task, Koloft first asks Pull into main?, because the pull would change files under that session. Worktree sessions are not affected.

On a remote folder the panel works too, on the machine itself: the behind number (every five minutes, and when the machine connects), Fetch now and Pull · fast-forward. When the machine cannot reach origin, the panel says can't reach origin from <machine> — check its network or credentials. While the machine is not connected, Fetch now and Pull are greyed out and the last counts stay. The GitHub part and the Account part work as above.

Open sessions hear what changed

When a fetch finds that origin's main branch has moved, say because a pull request was merged, Koloft tells every open session in that repository, whichever agent runs it, that sits on another branch and does not have those commits yet. The fetch is Koloft's own (every five minutes, while Auto-fetch is on) or Fetch now. Your butler is not told, nor is a session on the main branch itself: the behind number, Pull and Auto-pull serve it. Commits that came in while Koloft was closed are not announced either. The message reads: (From Koloft:) origin/main moved from … to …, with 2 new commits: "…", "…". … When those commits touch files the session itself had changed, it names them, and it ends by saying that nobody asks the session to merge or rebase: what to do is the agent's call.

When two open sessions of one repository write the same file, each is told: The session "…" changed files you changed too: …. If both sit in the same folder, the message says to read the file again before editing it; if they sit in two worktrees, it says the two branches may conflict when both reach main. Only files the agent wrote through its own tools count, not ones a shell command wrote, and only writes made while the session was open in Koloft; each file is named once per pair of sessions.

Koloft never starts a turn for it. A session at work gets the message after its next tool call, or, if it was about to stop, just before it stops: it reads it and then stops, without anyone prompting it. A session that was waiting for you gets it with its next prompt, from you or anyone else, so it keeps its red dot, and no reply to the message alone fills its conversation. This holds for every agent, here or on a machine. You do not see the message in the terminal; the agent does. An Antigravity session sees it for the rest of that turn only.

Next page → The Workbench