Any engine fix: The chat will not take input because something holds it

The session is held, so the composer is locked

Two writers on one transcript forks it, so a chat attached to a live process refuses input rather than interleaving. What happens next depends entirely on what is holding it.

not a terminal, refusing takeover
Printed by Termdeck.

Diagnosis

What it actually is

An idle terminal can be taken over

This is the ordinary case and it is allowed. The terminal is asked to release, it writes its transcript tail, and the browser continues the same chat with nothing lost.

A terminal in the middle of a turn cannot

Taking the session away mid-turn would cut the work in half. The refusal says so, and the wait is usually seconds rather than minutes.

Another client is refused outright rather than evicted

A desktop app or an SDK process holding the session gets no takeover, because nothing can promise it will write a clean tail the way a CLI does.

A holder that vanished leaves the lock behind

A process that died without releasing keeps the session attached until that is noticed. This is the one case the forced override exists for.

Check

Confirm it before you fix it

Run thisWhat a good answer looks like
ps -eo pid,etime,cmd | grep "[c]laude"Every Claude Code process with its age. The holder is usually the oldest, and its start time says which window it belongs to.
ps -eo pid,etime,cmd | grep "[c]odex"The same question for Codex, whose app-server can outlive the terminal that started it and hold on quietly.

Every command here has been run on a real machine. Termdeck answers the same questions for every machine you have connected, without opening a terminal on any of them.

Fix

Cheapest thing first

1. Let an idle terminal go

Take over from the machine card. The CLI is asked to stop, it writes its tail, and the chat continues in the browser.

2. Wait out a turn rather than forcing it

A mid-turn refusal clears by itself when the turn ends. Forcing it there is how a transcript ends mid-sentence.

3. Force a takeover only when the holder is gone

The override is for a lock with nothing behind it. It is recorded when used, because it is the one action on this page that can lose work.

Not this

What will not help

Editing the transcript to unlock it

The lock is a live process rather than a field in a file. Editing the transcript risks the history and leaves the holder exactly where it was.

FAQ

The chat will not take input because something holds it, answered

Why can a browser take over a terminal but not another app?

A CLI is asked to release and writes a clean tail. Another client offers no such guarantee, so it is refused instead of evicted.

Does taking over lose anything?

From an idle terminal, no. The session continues with the same history in the browser.

What if the process holding it is already dead?

That is what the forced takeover is for, and it is logged because a mistake there costs work.