It reuses car_state_source.py, prompt_builder.py, and granite_client.py unchanged -- only the input/output layer differs from the CLI version, and Granite calls run on a background thread so the ...