diff --git a/README.md b/README.md index 5dae7fb..4426c79 100644 --- a/README.md +++ b/README.md @@ -342,7 +342,7 @@ own front-end settings are separate; see [Configuration](#configuration). `/stats` adds the `max_cost_usd` cap when set; hidden entirely otherwise. - **Live server snapshot** — a 20s heartbeat measures WebSocket round-trip latency and refreshes server uptime, connection count, and streaming state - (the ⚡ badge beside the model); `/server` opens the full cockpit card. + (the » badge beside the model); `/server` opens the full cockpit card. odek ≥ v2.1.0 also pushes `keepalive` so a thinking turn silent for minutes does not lose the socket to an idle proxy. diff --git a/internal/tui/cockpit.go b/internal/tui/cockpit.go index 402033b..b0e2bf6 100644 --- a/internal/tui/cockpit.go +++ b/internal/tui/cockpit.go @@ -112,7 +112,7 @@ func (m *Model) cockpitServerSection() string { // — rendering it here too duplicated it inside the same cockpit. rows := [][2]string{ {"model", orDash(m.model)}, - {"stream", boolDash(m.serverStream, "⚡ live deltas", "buffered")}, + {"stream", boolDash(m.serverStream, "» live deltas", "buffered")}, {"sandbox", boolDash(m.sandbox, "isolated", "host access")}, } if m.srvUptime > 0 { diff --git a/internal/tui/cockpit_test.go b/internal/tui/cockpit_test.go index 30df486..a4b4262 100644 --- a/internal/tui/cockpit_test.go +++ b/internal/tui/cockpit_test.go @@ -29,7 +29,7 @@ func TestCockpitPopover(t *testing.T) { } out := plain(m.View()) for _, want := range []string{"cockpit", "server", "1.24.0", "glm-5.3", - "⚡ live deltas", "1m30s", "2", "34ms", "cost cap", "session"} { + "» live deltas", "1m30s", "2", "34ms", "cost cap", "session"} { if !strings.Contains(out, want) { t.Errorf("cockpit missing %q:\n%s", want, out) } diff --git a/internal/tui/commands.go b/internal/tui/commands.go index 07c06d8..142216f 100644 --- a/internal/tui/commands.go +++ b/internal/tui/commands.go @@ -552,7 +552,7 @@ func (m *Model) statsBody() string { link += th.statsDim.Render(fmt.Sprintf(" · %d ws", m.srvConns)) } if m.serverStream { - link += th.statsDim.Render(" · ⚡ stream") + link += th.statsDim.Render(" · » stream") } rows = append(rows, row{"⇄", th.statsLabel, "link", link}) } diff --git a/internal/tui/spec_v2_test.go b/internal/tui/spec_v2_test.go index cc14297..6f4af25 100644 --- a/internal/tui/spec_v2_test.go +++ b/internal/tui/spec_v2_test.go @@ -89,8 +89,8 @@ func TestServerInfoAndPong(t *testing.T) { if !m.pingSentAt.IsZero() { t.Error("ping clock not reset") } - // The ⚡ badge marks a streaming server in the header. - if !strings.Contains(plain(m.header()), "⚡") { + // The » badge marks a streaming server in the header. + if !strings.Contains(plain(m.header()), "»") { t.Error("header missing stream badge") } } diff --git a/internal/tui/view.go b/internal/tui/view.go index e8f8d45..9c71f2c 100644 --- a/internal/tui/view.go +++ b/internal/tui/view.go @@ -82,10 +82,13 @@ func (m *Model) header() string { if modelName == "" { modelName = "default" } - // The ⚡ badge marks a server streaming token/thinking deltas live (the - // same marker the WebUI's top bar carries). + // The » badge marks a server streaming token/thinking deltas live (the + // same marker the WebUI's top bar carries). "»" replaces the earlier ⚡ + // (U+26A1): that glyph is East-Asian-ambiguous and emoji-presentation- + // capable, so several terminals mis-width or mis-paint it inside styled + // runs — plain "»" is single-cell everywhere. if m.serverStream { - modelName = "⚡ " + modelName + modelName = "» " + modelName } // The left cluster, split around the model name: its truncation budget is