This wrapper exists because a bare repeated Tool field cannot tell apart
"not sending a tools update" from "clearing all tools": an unset repeated
field and an empty repeated field look identical on the wire. Wrapping the
list in a message adds a presence bit, so the two cases become: - tools
field unset: no update; keep the previously provided tools. - tools field
set (even with an empty list): replace the current tools with the provided
list, which may be empty to clear all tools.
A wrapper around the list of tools.
This wrapper exists because a bare
repeated Toolfield cannot tell apart "not sending a tools update" from "clearing all tools": an unset repeated field and an empty repeated field look identical on the wire. Wrapping the list in a message adds a presence bit, so the two cases become: -toolsfield unset: no update; keep the previously provided tools. -toolsfield set (even with an empty list): replace the current tools with the provided list, which may be empty to clear all tools.