Skip to content

fix(cli): Preserve document-order index for orphaned tool calls#604

Merged
JeanMertz merged 2 commits intomainfrom
prr172
May 6, 2026
Merged

fix(cli): Preserve document-order index for orphaned tool calls#604
JeanMertz merged 2 commits intomainfrom
prr172

Conversation

@JeanMertz
Copy link
Copy Markdown
Collaborator

When build_execution_plan encountered a ToolCallRequest with no matching pending entry, it pushed the request into orphaned as a bare ToolCallRequest. The caller in turn_loop then synthesized an error response and assigned it an index of approved.len() + pre_resolved.len() — effectively appending it at the end regardless of where the request appeared in the stream.

Because commit_tool_responses sorts responses by index before persisting them, this caused any orphaned response to land after all non-orphaned responses, breaking document order in the stored conversation.

The fix threads the document-order index through the orphaned path: orphaned is now Vec<(usize, ToolCallRequest)> and build_execution_plan populates the index from the same loop counter used for PlanItem. The turn_loop destructs the pair and uses the carried index directly when building the pre_resolved entry, removing the incorrect append-to-end calculation entirely.

Also removes two stale references to internal Bear notes from code comments.

JeanMertz added 2 commits May 6, 2026 11:29
Three related rendering bugs are addressed in `TurnView` and the
`TurnCoordinator`:

1. **Unclosed structured fences.** A conversation ending on a
   `ChatResponse::Structured` would print an opening ` ```json ` with no
   matching close. `flush()` only drained the chat sub-renderer; the
   structured renderer was left open. Content boundaries (`begin_turn`,
   `render_user_request`, `render_chat_response`, `enter_tool_call`,
   `reconfigure`) now each call `structured.flush()` before proceeding,
   and the top-level `flush()` (formerly `flush_all()`) closes both
   renderers. The old `flush()` (chat-only) is removed; `flush_all()` is
   renamed to `flush()`.

2. **Missing assistant header after Continue-before-first-chunk.**
   `reset_for_continuation` unconditionally set
   `assistant_header_rendered = true`, so if the user interrupted before
   any chunk arrived the flag was forced on and the resumed output had
   no `── jp …` boundary. The flag is now left as-is; if no header had
   been emitted yet it stays `false` and the next assistant event
   renders one normally.

3. **Missing user header on Reply interrupt (live vs replay gap).** When
   the user replied mid-stream, the new `ChatRequest` was pushed to the
   conversation but never rendered in live mode, so the terminal showed
   no `── alice …` boundary. `coordinator.rs` now calls
   `view.render_user_request()` before pushing the event, matching what
   replay emits.

Signed-off-by: Jean Mertz <git@jeanmertz.com>
When `build_execution_plan` encountered a `ToolCallRequest` with no
matching pending entry, it pushed the request into `orphaned` as a bare
`ToolCallRequest`. The caller in `turn_loop` then synthesized an error
response and assigned it an index of `approved.len() +
pre_resolved.len()` — effectively appending it at the end regardless of
where the request appeared in the stream.

Because `commit_tool_responses` sorts responses by index before
persisting them, this caused any orphaned response to land after all
non-orphaned responses, breaking document order in the stored
conversation.

The fix threads the document-order index through the orphaned path:
`orphaned` is now `Vec<(usize, ToolCallRequest)>` and
`build_execution_plan` populates the index from the same loop counter
used for `PlanItem`. The `turn_loop` destructs the pair and uses the
carried index directly when building the `pre_resolved` entry, removing
the incorrect append-to-end calculation entirely.

Also removes two stale references to internal Bear notes from code
comments.

Signed-off-by: Jean Mertz <git@jeanmertz.com>
Base automatically changed from prr171 to main May 6, 2026 13:06
@JeanMertz JeanMertz merged commit 3dfe708 into main May 6, 2026
13 checks passed
@JeanMertz JeanMertz deleted the prr172 branch May 6, 2026 13:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant