emrg: GUI main.js rewire to ConnManager — P2 per-session connections (GUI multi-session rant P2) - #629
Conversation
…(GUI multi-session rant 15:07:19)
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle 20260810-162905
Verified locally on the PR head: GUI suite 142/142 (43 daemon_client + 17 conn-manager: per-conn ownStream set/release incl. broadcast-done negative; ensureDaemon daemon-conn reuse; resume:false for new sessions; failed-open conn cleanup; onOpen/onRecovered hooks; intentional-close suppresses disconnect banner + never triggers restart detection; stale-conn close+reopen; single-conn backoff re-opens only the dropped session), 680 pytest green (doc-count guard reads 142 breakdown), node --check clean. Design matches the rant P2: connManager = daemon lifecycle owner, per-session connections, delta batching per connection (#626), restart recovery (#627), single-drop independent backoff.
|
Tested this PR on Windows (local checkout of feature/gui-p2-main-rewire @ c14e7a8): |
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle 20260810-165036
Re-verified on head c14e7a8 (master unchanged since): GUI suite 142/142 (43 daemon_client + 17 conn-manager — per-conn ownStream set/release incl. broadcast-done negative, ensureDaemon daemon-conn reuse, resume:false new-session path, failed-open conn cleanup, onOpen/onRecovered hooks, intentional-close suppresses banner + never triggers restart detection, stale-conn close+reopen, single-conn backoff re-opens only the dropped session), 680 pytest green (doc-count guard 142 breakdown), node --check clean. PR CI 31371726743 SUCCESS.
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle 20260810-164959
Verified independently on the PR head (c14e7a8): GUI suite 142/142 (43 daemon_client: per-conn ownStream set on stream send, own-done release vs broadcast-done negative, timeout release, session-busy release, cancelled release, disconnect release; 17 conn-manager: ensureDaemon daemon-conn reuse, resume:false no-resume, failed-open conn cleanup, onOpen incl. recoverAll reopen path, onRecovered refresh, intentional-close suppresses banner + never triggers restart detection, stale-conn close+reopen, single-conn backoff reopens only the dropped session), 680 pytest green, doc-count guard passes (142 breakdown synced in Agent.md/README/README.cn), node --check clean.
Review notes: main.js now fully routes through ConnManager (activeConn/requireConn/openSession) with per-session ws connections; daemon-level _daemonConn serves non-session commands; G65 own-stream lock is per-connection. Also noticed scheduleReconnect now applies the backoff delay (was hardcoded 1000 — latent bug fixed). Design matches the GUI multi-session rant P2: connManager = daemon lifecycle owner.
…renderer smoke) after #629 merge
…lice 0 entries (#631) Co-authored-by: EMRG Evolution <emrg@argszero.dev>
Summary
Completes P2 of the GUI multi-session rant (2026-08-10T15:07:19) connection-layer rewrite: main.js now routes through the ConnManager (per-session independent websocket connections) instead of a single global DaemonClient. Single-session behavior preserved (P2 acceptance: no regression).
Changes
conn-manager.js
ensureDaemon()keeps a daemon-level connection (_daemonConn) for non-session commands (ping / list_sessions / set_model / github_* / ...); session connections useskipStart(never spawn)open(sid, projectPath, { resume })—resume:falsefor brand-new sessions (daemon implicitly subscribes on first task); failed opens close the half-open connection (no leak); stale (disconnected) entries are closed + reopened instead of reusedonOpen/onRecoveredhooks — main.js attaches the sid-tagged renderer event bridge (incl. recoverAll reopen paths) and refreshes UI state after recoveryclose()marks_intentionalClose— intentional close (switch-away/delete) suppresses the renderer disconnect banner and never triggers restart detectiondaemon_client.js
ownStream/ownStreamRequestIdset bysendTask(stream:true), released on own done / timeout / session-busy error / own cancelled / disconnect) — multi-session independent locksmain.js
client/ownStream/ownStreamRequestId/deltaBufstate; all IPC handlers route throughactiveConn()/requireConn()/openSession()emrg:sendMessageauto-opens the session connection (resume:false) on first messageemrg:switchSessionopens via connManager (G106 passive-delete recovery kept), closes the previous session's connection (single-session: one active conn)emrg:canceltargets the active connection and releases its lockonRecovered→ sessions/pong/status refresh; daemon-level retry backoff kept for the no-session-open case (G41 reworked)sid(backward-compatible; renderer ignores extra field)Tests