Context: Self-hosted ChatKit (Agents SDK + Node backend). Widgets (Live Activity, Change Summary) vanish after reload; widget buttons frequently no-op mid-turn.
Findings:
-
Primary blocker : The hosted ChatKit widget often fails to render historical items when the backend is self-hosted, even though the API returns full thread data. This likely explains why widgets disappear on reload despite being stored.
-
Button reliability: Widget onAction callbacks frequently never fire while a response is streaming. Fallback click-capture is required but still doesn’t fix it. Self-hosted setup is brittle and frustrating to configure (API prefixes, client_secret flow, HTTPS, etc.).
-
Backend persistence path: The Node backend now persists widgets correctly (type widget, IDs, metadata) and reconstructs them with object: ‘chatkit.thread_item’ and numeric created_at.
Repro (self-hosted):
-
Start a ChatKit session, trigger an MCP tool so Live Activity/Change Summary widgets appear.
-
Refresh the page or reopen the thread.
-
Observe: thread history data is returned, but widgets and other history items do not render; widget buttons often no-op during streaming.