Files
OpenResearch/ui
Daniel Kim 33feb2e1ac Don't mint empty reasoning parts; fix tool-group rendering artifacts (v0.1.85) (#136)
* Don't mint empty reasoning parts; fix tool-group rendering artifacts (v0.1.85)

Fable's encrypted thinking streams empty thinking_delta events (payload in
signature_delta) and per-block assistant events with thinking:"" — orx stored
these as invisible empty reasoning parts, which split consecutive tool calls
into single-row groups; an expanded singleton group then painted the identical
tool line twice (summary + row).

- claude.rs: skip empty stream deltas and empty thinking blocks (main loop and
  sub-agent routing) so empty parts are never created
- ChatPanel renderParts: parts that render nothing no longer break a tool run
  (repairs already-stored transcripts)
- ToolGroup: a single-tool group renders its ToolRow directly — no duplicate
  summary line; has-error color parity via styles.css
- test: encrypted_thinking_mints_no_empty_reasoning_parts (captured live from
  the claude CLI)

* Multi-tool group summary is always the count

A running group is always expanded, so a summary echoing the running tool's
line always sat directly above the identical row. 'Used N tools' never
duplicates. Rebuilt ui/dist.

* Review round: shared visibility predicate, sub-agent per-block offset fix, nits

- ChatPanel: extract partIsVisible as the single invisible-part predicate,
  shared by messageHasVisibleContent and renderParts; renderParts now also
  skips resolved permission cards (Codex inlines them into the turn's parts,
  where they split tool runs the same way empty reasoning parts did)
- SubagentTranscript: gate the empty state on rendered output, not raw part
  count, so stored all-invisible transcripts read as empty
- claude.rs: guard empty text blocks like thinking blocks (both loops);
  comment accuracy passes (delta guard scope, cross-layer back-reference,
  ToolGroup doc, CSS child-combinator note)
- apply_subagent_blocks: fix per-block offset semantics — .skip(start) treated
  the cumulative message offset as an index into this event's (single-element)
  array, silently dropping every sub-agent block after a message's first;
  now mirrors the main loop's start+n id shift. Caught by the new
  subagent_empty_thinking_mints_no_child_parts test; also added offset
  assertion comment
2026-07-27 19:56:16 -07:00
..
2026-07-06 20:05:41 -07:00
2026-07-06 20:05:41 -07:00
2026-07-06 20:05:41 -07:00