Terminal:
- cache font variants + single reusable brush in render hot path;
resolve cell colors once per cell; dispose GDI resources
- scrollback: List+RemoveRange -> O(1) ring buffer
- follow new output only when already at bottom (no more yank-to-bottom
while reading history)
- alt-screen mouse wheel -> arrow keys (vim/htop scroll)
- answer DSR (ESC[5n/6n) and DA (ESC[c) queries so TUIs no longer hang
- remove dead code in OnKeyPress
Encoding correctness (garbled CJK across chunk boundaries):
- stateful UTF-8 Decoder in TTLInterpreter.OnData, SerialBridgeServer
rx forwarding, and SessionLogger.Write
Sessions:
- ShellChannel: free proc-thread attribute list, close hProcess,
notify '[ETTerms] shell process exited' in the tab
- SshChannel: surface ErrorOccurred / ShellStream.Closed in the tab;
Write no longer throws into the UI thread on a dead connection
PDU:
- new shared ETTerms.PduCore project replaces the two drifted copies of
PduController (GUI + PduMcp); logging via injected delegates
- batched SNMP GET (GetAllPortsStatus): 12-port poll is 3 UDP
round-trips instead of 36 (StatusView polling + pdu_status tool)
Scripting:
- cap TTL receive buffer at 1MB; skip re-scan in wait when buffer
length unchanged
- merge ScriptRunner.RunAsync/RunGroupAsync; new TtlScript helper
dedups script picking + group-command checks (3 copies -> 1)
Misc:
- ConnectionStore: parse LastUsedUtc with InvariantCulture/RoundtripKind
- version 0.4.0; About changelog; CLAUDE.md notes (intentional group
barrier behavior, SSH.NET reflection resize caveat)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>