Agent live regions and conversation announcements no longer share one property. This patch keeps the 1.6.0 live-surface behavior for hand-authored HTML, corrects the two contracts that disagreed, and hardens the live-region runtime plus the server/browser parity found in the release review.
- Conversation announcements are
announce. Set"off"or"polite"(the default is polite).liveremains the universal endpoint object on every node, including a conversation. A Conversation that still sendsliveas a string is rejected. - A live URL has to be fetchable. In both the browser agent and the PHP renderer,
live.urlmust behttp,https, or a relative path.javascript:,data:,mailto:, and protocol-relative URLs reject the surface instead of being dropped or fetched.SmartWebUI.observeLive()uses the same rule before it requests the endpoint, and a region that fails it is left inactive. - Live regions are more resilient. SSE bursts can no longer apply out of order — application stays serialized until the queue drains — and a fragment that fails to apply reports
smart:live-errorand marks the region stale instead of freezing it silently. A stopped region no longer receives late DOM writes or events, in-flight polls are aborted on stop, an intentionally empty 200 response counts as “nothing changed” instead of an error, offline pauses mark the region.is-live-stalelike failures do, and an invalid endpoint warns once instead of on every tick. Regions observed withobserveLive()survive laterhydrate()calls, andrefresh()explains itself when called on an SSE region. - Browser and server render the same surfaces.
AppHeader.logonow renders in the browser runtime with the same 12–96 px clamp and degrade rule as the PHP renderer. The PHP renderer rejects forbidden property names (html,innerHTML,__proto__, …) at every nesting level, matching the browser, and both sides reject non-nodechildrenentries in validation instead of crashing or silently skipping them.smartwebui.d.tsaddsSmartConversationMessage.streamingandAppHeader’slogo.