Pulls project-manager aeb6325, which fixes the pm-sidebar overlay/marker
leak + render storm that wedged the Emacs daemon (23GB RSS runaway).
The per-terminal reader thread held term_mutex while doing a blocking
write() to the Emacs event pipe. When the display client stopped draining
that pipe -- e.g. an emacsclient suspended inside an Eternal Terminal
session that was slept -- the 64 KiB pipe filled, the reader blocked in
the write holding term_mutex, and the main thread deadlocked waiting for
term_mutex (needed for redisplay / the event filter), wedging the whole
daemon. Reproduced live; draining the pipe was the only recovery.
Carry a local patch (nix/ghostel/event-pipe-nonblocking-flush.patch),
applied to ghostelSrc via pkgs.applyPatches, that:
- flushes events OUTSIDE term_mutex with non-blocking writes, so the
reader never blocks while holding the lock the main loop needs to drain
the pipe, and keeps draining the child PTY while the client is slow;
- backs events with a pooled FIFO of fixed blocks (one form per node, new
src/event_buffer.zig) so the hot path stays allocation-free and the
backlog can be dropped form-aware -- never truncating a form mid-wire,
which would desync Emacs' incremental reader -- when a suspended client
falls far behind;
- restores blocking mode for the reaper's final exit-status write.
Builds clean under zig 0.15.2 (ReleaseFast); EventBuffer unit tests pass.
Runtime suspend repro still pending a daemon running the new module.
Adds the pm-sidebar package (renamed from pm-serve): a toggleable,
point-preserving live agent-session sidebar scoped to the launching
Emacs instance, with RET on a project heading opening the project
dispatch. Bumps the pm flake inputs (flake.lock + lock/flake.lock) to
project-manager c2b7049.
The documented recipe (generate-new-buffer + ghostel--init-buffer) no
longer starts a rendered shell in ghostel 0.36.0 — the buffer comes up
blank and the agent never launches, with no error. Switch the canonical,
background, worktree, and bare-shell spawns to (ghostel t), which creates,
starts, displays, and returns the terminal buffer (honoring a let-bound
ghostel-buffer-name and default-directory). Background spawn now wraps it
in save-window-excursion. Update the API table and tripping hazards.