Skip to content

emrg: GUI main.js rewire to ConnManager — P2 per-session connections (GUI multi-session rant P2) - #629

Merged
argszero merged 1 commit into
masterfrom
feature/gui-p2-main-rewire
Aug 10, 2026
Merged

emrg: GUI main.js rewire to ConnManager — P2 per-session connections (GUI multi-session rant P2)#629
argszero merged 1 commit into
masterfrom
feature/gui-p2-main-rewire

Conversation

@argszero

Copy link
Copy Markdown
Owner

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 use skipStart (never spawn)
  • open(sid, projectPath, { resume })resume:false for 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 reused
  • onOpen / onRecovered hooks — main.js attaches the sid-tagged renderer event bridge (incl. recoverAll reopen paths) and refreshes UI state after recovery
  • close() marks _intentionalClose — intentional close (switch-away/delete) suppresses the renderer disconnect banner and never triggers restart detection
  • Single-connection backoff (P2 acceptance): when one of N connections drops (not all), an independent backoff retry re-opens just that session; close/recoverAll cancels pending retries

daemon_client.js

  • G65 own-stream lock moved into each DaemonClient instance (ownStream / ownStreamRequestId set by sendTask(stream:true), released on own done / timeout / session-busy error / own cancelled / disconnect) — multi-session independent locks

main.js

  • Removed global client / ownStream / ownStreamRequestId / deltaBuf state; all IPC handlers route through activeConn() / requireConn() / openSession()
  • emrg:sendMessage auto-opens the session connection (resume:false) on first message
  • emrg:switchSession opens via connManager (G106 passive-delete recovery kept), closes the previous session's connection (single-session: one active conn)
  • emrg:cancel targets the active connection and releases its lock
  • Restart recovery: session drops → connManager recoverAll → onRecovered → sessions/pong/status refresh; daemon-level retry backoff kept for the no-session-open case (G41 reworked)
  • Events forwarded to renderer with sid (backward-compatible; renderer ignores extra field)

Tests

  • daemon_client 37→43 (+6 ownStream: set-on-send, own-done release vs broadcast-done hold, timeout release, session-busy release, cancelled release, disconnect release)
  • conn-manager 8→17 (+9: ensureDaemon reuse, open with resume:false, failed-open closes conn, onOpen hook incl. recoverAll, onRecovered hook, intentional-close no-restart, stale-conn reopen, single-conn backoff)
  • GUI 127→142 (43 dc + 17 cm + 22 + 32 + 15 + 7 + 3 + 3); 680 pytest green (doc-count guard); node --check clean

@argszero argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ 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.

@pm25coder

Copy link
Copy Markdown
Contributor

Tested this PR on Windows (local checkout of feature/gui-p2-main-rewire @ c14e7a8):

@argszero argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ 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 argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ 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.

@argszero
argszero merged commit 2840017 into master Aug 10, 2026
1 check passed
@pm25coder

Copy link
Copy Markdown
Contributor

Post-merge verification on master 2840017 (fast-forward from 4f70a79):

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants