From 39b6bef6e081598953a2ad666db9c33d85255adb Mon Sep 17 00:00:00 2001 From: Amr Gharbeia Date: Wed, 6 May 2026 10:46:44 -0400 Subject: [PATCH] fix: connect-daemon retry + user-friendly feedback - connect-daemon: retry up to 3 times with 3s backoff instead of single 10s attempt. Shows 'Connecting...' while retrying. - Failed attempts show attempt count and error detail. - After all retries exhausted: shows TIP to start daemon first. - Connection status bar already shows Connected/Disconnected. - passepartout tui already auto-starts daemon if port 9105 is closed. TUI integration: 7/7 pass. --- lisp/gateway-tui-main.lisp | 31 ++++++++++++++++++++++--------- org/gateway-tui-main.org | 31 ++++++++++++++++++++++--------- 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/lisp/gateway-tui-main.lisp b/lisp/gateway-tui-main.lisp index 2ab33a4..876e730 100644 --- a/lisp/gateway-tui-main.lisp +++ b/lisp/gateway-tui-main.lisp @@ -197,15 +197,28 @@ (sleep 0.5))))) (defun connect-daemon (&optional (host "127.0.0.1") (port 9105)) - (handler-case - (let ((s (usocket:socket-connect host port :timeout 10))) - (setf (st :stream) (usocket:socket-stream s) (st :connected) t) - (bt:make-thread (lambda () (reader-loop (st :stream))) :name "tui-reader") - (add-msg :system "* Connected *") - t) - (error (c) - (add-msg :system (format nil "* Connection failed: ~a *" c)) - nil))) + (add-msg :system "* Connecting to daemon... *") + (loop for attempt from 1 to 3 + for backoff = 0 then 3 + do (sleep backoff) + (handler-case + (let ((s (usocket:socket-connect host port :timeout 5))) + (setf (st :stream) (usocket:socket-stream s) + (st :connected) t) + (bt:make-thread (lambda () (reader-loop (st :stream))) + :name "tui-reader") + (add-msg :system (format nil "* Connected v~a *" "0.2.0")) + (return-from connect-daemon t)) + (usocket:connection-refused-error (c) + (when (= attempt 3) + (add-msg :system (format nil "* No daemon on port ~a after ~a attempts *" + port attempt)))) + (error (c) + (add-msg :system (format nil "* Connection attempt ~a failed: ~a *" + attempt c)) + (when (= attempt 3) + (add-msg :system "* TIP: run 'passepartout daemon' first *"))))) + nil) (defun disconnect-daemon () (when (st :stream) diff --git a/org/gateway-tui-main.org b/org/gateway-tui-main.org index 8e722be..6065e48 100644 --- a/org/gateway-tui-main.org +++ b/org/gateway-tui-main.org @@ -231,15 +231,28 @@ Event handlers + daemon I/O + main loop. ** Connection #+begin_src lisp (defun connect-daemon (&optional (host "127.0.0.1") (port 9105)) - (handler-case - (let ((s (usocket:socket-connect host port :timeout 10))) - (setf (st :stream) (usocket:socket-stream s) (st :connected) t) - (bt:make-thread (lambda () (reader-loop (st :stream))) :name "tui-reader") - (add-msg :system "* Connected *") - t) - (error (c) - (add-msg :system (format nil "* Connection failed: ~a *" c)) - nil))) + (add-msg :system "* Connecting to daemon... *") + (loop for attempt from 1 to 3 + for backoff = 0 then 3 + do (sleep backoff) + (handler-case + (let ((s (usocket:socket-connect host port :timeout 5))) + (setf (st :stream) (usocket:socket-stream s) + (st :connected) t) + (bt:make-thread (lambda () (reader-loop (st :stream))) + :name "tui-reader") + (add-msg :system (format nil "* Connected v~a *" "0.2.0")) + (return-from connect-daemon t)) + (usocket:connection-refused-error (c) + (when (= attempt 3) + (add-msg :system (format nil "* No daemon on port ~a after ~a attempts *" + port attempt)))) + (error (c) + (add-msg :system (format nil "* Connection attempt ~a failed: ~a *" + attempt c)) + (when (= attempt 3) + (add-msg :system "* TIP: run 'passepartout daemon' first *"))))) + nil) (defun disconnect-daemon () (when (st :stream)