Releases: MenachemBarak/AgentCLISessionManager
Releases · MenachemBarak/AgentCLISessionManager
v1.3.3
Fixed
- Update/restart no longer sends "SOFTWARE RESTARTED" ping or types
--resumeinto sessions whose PTY survived in the daemon; the backend
already sendsreattached: truein thereadyframe — the frontend
now respects it (#127) - STREAMING / THINKING / IDLE badges now auto-clear within 30 s when a
Claude process exits, without requiring a manual rescan; stale PID
markers are swept on a 30-second background timer (#127) - Session activity badges: "STREAMING" (<3 s output), "THINKING" (<15 s),
"IDLE" (<5 min), no badge (>5 min) — replaces the misleading "ACTIVE"
text that showed on all long-running sessions (#127)
v1.3.2
Fixed
- Terminal paste (Ctrl+V) no longer fires twice and no longer triggers a
browser clipboard-read permission popup; xterm.js's native textarea paste
handler is now the sole path (#126) - Box-drawing and other ambiguous-width characters (e.g.
──────) now render
correctly; vendored@xterm/addon-unicode11@0.9.0and activated Unicode 11
width tables on startup (#126)
v1.3.1
Fixed
- Auto-update no longer leaves the app un-launchable after swap: when
AgentManager-Daemon.exeis absent (e.g. after a legacy-path auto-update
from v1.2.x), the UI now falls back to in-process mode instead of timing
out 15 s then exiting silently (#125) - Auto-update now downloads and installs
AgentManager-Daemon.exealongside
the UI exe so daemon mode is available after the first update that includes
it (#125)
v1.3.0
Added
- Daemon keepalive (ADR-18 Phases 8–10): running PTY sessions now survive
UI updates. The UI window closes and restarts whileAgentManager-Daemon.exe
keeps all PTYs alive; on relaunch each pane reattaches to its previous PTY
and replays the ring-buffer scrollback (#122) POST /api/update/apply-ui-only— swaps only the UI exe, leaving the
daemon (and all PTYs) running during an updateAgentManager-Daemon.exeshipped as a separate release asset built by
pyinstaller-daemon.specDaemonDisconnectedBannerin the UI: warns and offers reconnect when the
daemon is unreachable- Daemon mode is now on by default (
AGENTMANAGER_DAEMON=0to opt out)
Fixed
onPtyReadyfeedback loop: writingptyIdback into spawn no longer
re-triggers the WS effect, which was silently destroying PTYs under
Phase-5 rules and breaking split-pane, shell-wrap, and auto-resume tests
v1.2.19
Added
- Clipboard integration: Ctrl+C copies selected text in transcript pane;
Ctrl+C with an xterm selection copies to clipboard without sending SIGINT
to the PTY; Ctrl+V pastes clipboard text into the PTY (#121)
Fixed
- Vendored all CDN dependencies (xterm.js, addon-fit, addon-web-links) so
the app boots correctly in offline / airgapped environments (#113)
v1.2.17
Fixed — closing a pane no longer tears down the whole tab (#98)
- Discovered while adding e2e coverage for close-pane-btn (previously
zero coverage). Reproduced deterministically: open terminal → split
→ close → the whole tab vanished instead of collapsing to the
sibling. - Root cause: the v1.2.15/v1.2.16 portal refactor imperatively moves
each TerminalPane's wrapper div into its matching tile-pane-slot
via appendChild. When React later unmounts the component on close,
its cleanup does removeChild on the wrapper's original React-
managed parent. Since the wrapper had been moved into the slot,
the removeChild call threw NotFoundError. React propagated the
error and unmounted the entire sibling subtree → tab "closed
itself". - Fix: capture the wrapper's original parent on first mount; in a
useLayoutEffect cleanup (synchronous during commit, before React's
DOM mutation phase) restore the wrapper there whenever it has
drifted. React's removeChild then finds it and cleans up cleanly. - Regression test
close-pane.spec.tscovers split-close + only-pane
close + asserts noremoveChildpageerror.
Tests (T-63 audit)
row-action-buttons.spec.ts— 'In viewer' click spawns shell-wrap
tab with correct_autoResume.sessionId(#99).row-action-external-modes.spec.ts— 'New tab' / 'Split' POST
/api/openwith the rightmodeand session id (#100).tile-divider-drag.spec.ts— root-divider drag persists a non-
defaulttree.ratio(#101).
v1.2.16
Fixed — blank pane caused by pane-id collisions (#96)
- User-reported: a freshly-installed v1.2.15 rendered one terminal tab
completely blank. Root-caused from the persisted layout state —
pane ids collided both across tabs (term-1 and term-4 both had
pane-2) and within a single tree (term-1 had two panes called
pane-1). The v1.2.15 portal refactor useddocument.querySelector
for slot lookup which returned the wrong tab's hidden slot, AND
React's flatkey={p.id}map collapsed duplicate keys so one slot
stayed empty. - Fix:
terminal-pane.jsxscopes slot lookup to the owning tab div via
.closest('[data-terminal-tab]').terminal-splits.jsxaddsbumpPaneSeqPastTree(prevents future
collisions) anddedupePaneIds(heals already-corrupted state).app.jsxcalls both on rehydrate and re-persists the healed
layout so the next boot starts clean.
- Regression test
pane-id-collisions.spec.tscovers both collision
classes end-to-end.
Added — rescan button surfaces ghost-marker count (#94)
- Follow-up UX for v1.2.15's PID-reuse fix. Clicking Rescan now shows
transient feedback next to the button:cleaned N stale(accent color) when ghosts were removedno ghosts(grey) when everything was already clean
- Backend already returned
staleActiveMarkersRemoved; the UI was
throwing it away.
Tests
v1.2.15
Fixed — splitting a pane no longer restarts its terminals (#86)
- TileTree's inline
<TerminalPane>was remounted on every tree
restructure (leaf → split-with-two-children), closing its xterm- WebSocket and killing the backend PTY. Long-running agents
died on every split. Fix: render all TerminalPanes flat at tab
level, keyed by pane.id, with each imperatively appendChild'ing
its wrapper into a matchingdata-pane-slotdiv. React's
reconciler never sees the pane move → xterm + WS + PTY preserved.
Validated against the Tabby (70.7k⭐) and Zellij (31.9k⭐) pane
architectures, both of which decouple ownership from layout the
same way.
- WebSocket and killing the backend PTY. Long-running agents
Fixed — resume-menu auto-pick (#87)
\x1b[B\r(down-arrow + Enter) kept getting eaten by Ink-TUI's
bracketed-paste detector even split across two frames, so users
landed in 'Resume from summary' instead of 'Resume full session
as-is'. Switched to a single-digit2keystroke — Ink's select
component accepts that as a one-keystroke pick, nothing for the
paste detector to swallow. Also extended sid extraction to
include the v1.1.0+ shell-wrap shape so the auto-pick actually
fires for those tabs.
Fixed — ghost-active sessions after closing external PowerShell (#88)
- Closing a PowerShell that was hosting
claudefreed its PID, and
Windows often handed that PID to an unrelated process seconds
later. Ourpsutil.pid_exists(pid)check returned True for the
new owner and the marker stayed "active" forever, even after
explicit Rescan. Fix: cross-checkpsutil.Process(pid).create_time()
against the marker's recordedstartedAt(±3 s tolerance). PID
reuse → mismatch → treat as stale → exclude from active set AND
delete on rescan. Legacy markers withoutstartedAtkeep the
old pid_exists-only behavior.
Fixed — red E2E on main (msg-copy timeout) (#85)
- Playwright worker cross-test pollution: a prior test left a
terminal tab active in the persisted layout, and the msg-copy
test's session-row click updatesselectedIdwithout switching
activeIdback to'transcript'. The test now explicitly
clicks the Transcript tab before asserting on transcript DOM.
Added — 'Open in manager' for active-unmanaged sessions (#89)
- Active sessions started outside AgentManager (a
claudein a
raw PowerShell window, etc.) now expose an 'Open in manager'
action in the left-pane list. Clicking spawns a shell-wrap tab
runningclaude --resume <sid>in the session's cwd. The button
disappears once the session is already represented by a tab to
prevent duplicate spawns.
v1.2.14
Added — (press /) hint in search placeholder
- Inline hint in the left-pane search placeholder so the
/
keyboard shortcut for focus-search is discoverable without
opening the?help overlay.
v1.2.13
Added — DAEMON chip in the title bar when opt-in daemon mode is active
- Users running with
AGENTMANAGER_DAEMON=1now see a small amber
DAEMONchip next to the version in the title bar. Closes the
invisibility gap where legacy mode and daemon mode looked
identical in the UI even though they use different process
architectures under the hood.