1c354d18bb
ChatBox.SendMessage reads bytes from ValidateMessage so Encoding.UTF8.GetBytes runs once per send. ValidateMessage takes an injectable sanitiser so xUnit can exercise the length-equality gate without ClientStructs game memory. CompactInputSubmitter and CompactInputHistoryNavigator lift the deterministic parts of ChatInputBar's pop-out submit and history-up/down callback into POCO helpers under HellionChat/_Helpers/. The ImGui buffer splice (DeleteChars/InsertChars) stays at the call site because it needs the live callback data. Behavior is identical to the previous inline implementation; tests in the local Build Suite repo pin the contracts.