Skip to content

Releases: MenachemBarak/AgentCLISessionManager

v1.3.3

02 May 12:26

Choose a tag to compare

Fixed

  • Update/restart no longer sends "SOFTWARE RESTARTED" ping or types
    --resume into sessions whose PTY survived in the daemon; the backend
    already sends reattached: true in the ready frame — 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

02 May 11:28

Choose a tag to compare

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.0 and activated Unicode 11
    width tables on startup (#126)

v1.3.1

29 Apr 21:28

Choose a tag to compare

Fixed

  • Auto-update no longer leaves the app un-launchable after swap: when
    AgentManager-Daemon.exe is 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.exe alongside
    the UI exe so daemon mode is available after the first update that includes
    it (#125)

v1.3.0

29 Apr 17:33

Choose a tag to compare

Added

  • Daemon keepalive (ADR-18 Phases 8–10): running PTY sessions now survive
    UI updates. The UI window closes and restarts while AgentManager-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 update
  • AgentManager-Daemon.exe shipped as a separate release asset built by
    pyinstaller-daemon.spec
  • DaemonDisconnectedBanner in the UI: warns and offers reconnect when the
    daemon is unreachable
  • Daemon mode is now on by default (AGENTMANAGER_DAEMON=0 to opt out)

Fixed

  • onPtyReady feedback loop: writing ptyId back 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

29 Apr 12:39

Choose a tag to compare

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

24 Apr 23:42
32892e6

Choose a tag to compare

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.ts covers split-close + only-pane
    close + asserts no removeChild pageerror.

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/open with the right mode and session id (#100).
  • tile-divider-drag.spec.ts — root-divider drag persists a non-
    default tree.ratio (#101).

v1.2.16

24 Apr 19:20
c3a9f8a

Choose a tag to compare

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 used document.querySelector
    for slot lookup which returned the wrong tab's hidden slot, AND
    React's flat key={p.id} map collapsed duplicate keys so one slot
    stayed empty.
  • Fix:
    • terminal-pane.jsx scopes slot lookup to the owning tab div via
      .closest('[data-terminal-tab]').
    • terminal-splits.jsx adds bumpPaneSeqPastTree (prevents future
      collisions) and dedupePaneIds (heals already-corrupted state).
    • app.jsx calls both on rehydrate and re-persists the healed
      layout so the next boot starts clean.
  • Regression test pane-id-collisions.spec.ts covers 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 removed
    • no ghosts (grey) when everything was already clean
  • Backend already returned staleActiveMarkersRemoved; the UI was
    throwing it away.

Tests

  • msg-copy.spec.ts + shell-wrap-runtime.spec.ts now seed empty
    layout in beforeEach to prevent cross-test pollution from leaking
    into Playwright frame interception (#91, #92).
  • Docs: README pipx install line bumped from stale v0.7.1 to
    v1.2.15; CHANGELOG compare-link corrected (#93).

v1.2.15

24 Apr 16:30
24c99dd

Choose a tag to compare

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 matching data-pane-slot div. 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.

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-digit 2 keystroke — 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 claude freed its PID, and
    Windows often handed that PID to an unrelated process seconds
    later. Our psutil.pid_exists(pid) check returned True for the
    new owner and the marker stayed "active" forever, even after
    explicit Rescan. Fix: cross-check psutil.Process(pid).create_time()
    against the marker's recorded startedAt (±3 s tolerance). PID
    reuse → mismatch → treat as stale → exclude from active set AND
    delete on rescan. Legacy markers without startedAt keep 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 updates selectedId without switching
    activeId back 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 claude in a
    raw PowerShell window, etc.) now expose an 'Open in manager'
    action in the left-pane list. Clicking spawns a shell-wrap tab
    running claude --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

24 Apr 06:53

Choose a tag to compare

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

24 Apr 06:45

Choose a tag to compare

Added — DAEMON chip in the title bar when opt-in daemon mode is active

  • Users running with AGENTMANAGER_DAEMON=1 now see a small amber
    DAEMON chip 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.