- Shipped
- September 4, 2026 at 5:50 PM UTC
- Author
- Kamo
- Commit
- 8202235
Ending a terminal from the Interaction Center killed the shell and left the window behind, showing a red `closed` status over something that no longer exists. The member's next move was to close it by hand — and if they had put the window away first, the hexhead sat there pointing at nothing. Nothing linked a session id back to a window. Every close in the app names a window id, because every close starts at the window: the X on the chrome, the X on a head, a conversation closing itself from inside. This one starts in a list, where the member has a session id and no way to learn a window id. So `closeTerminal(sessionGuid)` joins `openTerminal` in the same module, and dispatches a new `tool:closeMatching`. The dock resolves it against the store on toolId AND props — never props alone, since `sessionGuid` is also chat's dedupe key and matching on the bare prop would let ending a terminal close a conversation — then routes each hit through the existing `onClose`, so `tool:closed` still fires and the exit animation still runs. A separate event rather than an extension of `tool:close`: that one deliberately no-ops on a detail carrying a toolId and no windowId, and ChatBox depends on it. Teaching it to match on props would quietly turn that no-op into "close every chat window". The head is taken down explicitly. `store.close()` only marks the window exiting and never emits `removeHexhead`, so a window closed while minimized strands its head — the gap HexHeadPopover already works around by hand, and this follows it exactly, `animate: true` included so the head spins away instead of blinking out. An empty match matches nothing, not everything: a caller reaches one by passing an id that came back undefined, and the honest answer to "close the window for `undefined`" is none of them. Closes before the DELETE is sent, for the same reason the row disappears optimistically — ending a terminal is a confirmed act, and a screen that waits for the round trip reads as a button that did nothing. Scoped to the Interaction Center's End button. The identical button in the maximized terminal's navigator is untouched, as is a shell that exits on its own or is ended from another tab: those still leave the window up, honestly reporting `closed`.