From 3b477fa4e3ccd84757c22f6f1d943fd74e2bb811 Mon Sep 17 00:00:00 2001 From: David Weedon Date: Tue, 17 Feb 2026 11:17:14 -0600 Subject: [PATCH] Fix diff_widget traversal for single-child nodes --- chatkit/server.py | 9 ++++++--- tests/test_widgets.py | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/chatkit/server.py b/chatkit/server.py index a94764c..a9630a3 100644 --- a/chatkit/server.py +++ b/chatkit/server.py @@ -158,9 +158,12 @@ def recurse(component: WidgetComponent | WidgetRoot): components[component.id] = component if hasattr(component, "children"): - children = getattr(component, "children", None) or [] - for child in children: - recurse(child) + children = getattr(component, "children", None) + if isinstance(children, WidgetComponentBase): + recurse(children) + elif isinstance(children, list): + for child in children: + recurse(child) recurse(component) return components diff --git a/tests/test_widgets.py b/tests/test_widgets.py index f10d53f..3eabfba 100644 --- a/tests/test_widgets.py +++ b/tests/test_widgets.py @@ -113,6 +113,28 @@ ), ["widget.root.updated"], ), + # DynamicWidgetRoot with a single-child object + ( + DynamicWidgetRoot( + type="Card", + children=DynamicWidgetComponent.model_validate({ + "type": "Text", + "id": "text", + "value": "Hello", + "streaming": True, + }), + ), + DynamicWidgetRoot( + type="Card", + children=DynamicWidgetComponent.model_validate({ + "type": "Text", + "id": "text", + "value": "Hello, world!", + "streaming": True, + }), + ), + ["widget.streaming_text.value_delta"], + ), ], ) def test_diff(