Problem
pkg/listen/proxy/renderer_interactive.go:56-63 only logs a Bubble Tea failure before closing doneCh:
go func() {
if _, err := r.teaProgram.Run(); err != nil {
log.WithField("prefix", "proxy.InteractiveRenderer").
Errorf("Bubble Tea error: %v", err)
}
close(r.doneCh)
}()
and pkg/listen/proxy/proxy.go:251-254 treats a closed doneCh as a normal quit:
case <-p.renderer.Done():
wsClient.Stop()
p.renderer.Cleanup()
return nil
So when the renderer dies at startup, hookdeck listen exits 0 within milliseconds having forwarded nothing, with the cause emitted only as a logrus line. This is the mechanism that made #333 invisible from the outside: no tunnel, no error, no non-zero exit.
Fix
Add Err() to the Renderer interface. The interactive renderer records the Bubble Tea failure; Proxy.Run returns it, and pkg/listen/listen.go:216-221 already converts that into stderr plus exit 1. A normal user quit (q / Ctrl-C) still returns nil.
Fixed in the v2.5.0 branch as part of #333.
Problem
pkg/listen/proxy/renderer_interactive.go:56-63only logs a Bubble Tea failure before closingdoneCh:and
pkg/listen/proxy/proxy.go:251-254treats a closeddoneChas a normal quit:So when the renderer dies at startup,
hookdeck listenexits 0 within milliseconds having forwarded nothing, with the cause emitted only as a logrus line. This is the mechanism that made #333 invisible from the outside: no tunnel, no error, no non-zero exit.Fix
Add
Err()to theRendererinterface. The interactive renderer records the Bubble Tea failure;Proxy.Runreturns it, andpkg/listen/listen.go:216-221already converts that into stderr plus exit 1. A normal user quit (q/ Ctrl-C) still returns nil.Fixed in the v2.5.0 branch as part of #333.