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>
New ETTerms.PduMcp stdio MCP server lets AI agents (Kiro/Claude CLI)
control SNMP PDU outlets directly. Unlike serial, SNMP is non-exclusive
so it talks to the PDU directly without bridging through the GUI.
Tools: pdu_connect / pdu_list / pdu_set_port / pdu_get_port / pdu_status
/ pdu_power_cycle / pdu_disconnect.
- McpRegistrar now registers both etterms-serial and etterms-pdu in one click
- Settings -> AI MCP shows both server paths
- publish target (PublishMcpServers) bundles both MCP servers
- bump version to 0.3.0, update About changelog, ARCHITECTURE.md, CLAUDE.md
Phase 9 (AI integration) complete -- AI agents can send/receive serial
while the user watches live in the GUI, with the GUI as sole COM-port owner.
- ETTerms.SerialMcp: stdio MCP server (net8.0 + ModelContextProtocol SDK)
exposing serial_list / serial_attach / serial_write / serial_read
(waitFor + timeoutMs) / serial_detach; forwards over named pipe.
- GUI SerialBridgeServer (pipe etterms-serial) + SerialBridge endpoint;
SessionPage.WriteFromAi echoes MCP-sourced TX tagged [AI] (magenta).
- App icon: window title bar / taskbar / exe now use Choco_256x256.ico
(embedded via AppAssets); title bar shows ETTerms Version vX.Y.Z.
- About page: large Choco icon (Zoom, no crop).
- Docs: ARCHITECTURE.md + CLAUDE.md mark Phase 9 done; docs/serial-mcp-guide.md.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>