fix(chat): clear Responding state + multi-camera grab_frame#98
Merged
Conversation
- Fix React StrictMode bug: mountedRef.current was permanently false after StrictMode's double-invoke cleanup, so setStreaming(false) in the finally block was silently skipped. Reset mountedRef.current=true in effect setup; drop the guard entirely (React 18 safe no-op). - Fix SSE generator hang: parseSseStream now accepts AbortSignal and races every reader.read() against it. Calling ctrl.abort() on done/ error immediately unblocks any pending read so generator.return() can complete and the outer finally runs. - Fix labeled-break no-op: break inside switch only exits the switch, not the for-await. Changed to sseLoop: label + break sseLoop. - Fix Stop button: ctrl.abort() now reliably interrupts the in-flight reader.read() via the abort promise race. - grab_frame: remove specific camera name examples from tool schema (biased LLM toward tapo-terrace). System prompt now instructs agent to call grab_frame for ALL camera nodes when no specific camera is named by the user. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Qodo reviews are paused for this user.Troubleshooting steps vary by plan Learn more → On a Teams plan? Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center? |
4 tasks
… in Dashboard.tsx SortableTimeseriesCard.tsx and TimeseriesView.tsx were never committed; CI failed with TS2307 (module not found) and TS7006 (implicit any on onTopicChange callback parameter). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6 tasks
edgarriba
added a commit
that referenced
this pull request
May 19, 2026
Ships 10 commits worth of features and fixes since v0.0.13: Features - agent: grab_frame tool + Gemini Vision provider + image-in-chat (#96) - dashboard: Chat tab with HTTP+SSE agent gateway (#91) - agent: client-side turn cancellation via Zenoh cancel topic (#94, #95) - chat: multi-provider login status, 404 on unknown agent, Claude OAuth risk warning (#93) - mcp: 'bubbaloop mcp --token' prints bearer token for .mcp.json (#90) Fixes - agent: grab_frame reads binary JPEG payload + JSON metadata attachment from camera nodes (#99) - chat: clear Responding state after multi-camera grab_frame (#98) - mcp: eliminate token race between gateway and agent runtime (#89) Chores - dashboard: remove LibraryView component (#92, replaced by Chat tab) Docs - Comprehensive sync across README, CHANGELOG (backfilled v0.0.8 to v0.0.13), CLAUDE.md, ARCHITECTURE.md, ROADMAP.md, concept/reference/ dashboard docs to match the new feature surface (#100) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
mountedRef.current— removed the guard (React 18 makessetStateon unmounted components a safe no-op)ctrl.abort()ondone/errorSSE events to unblock the pendingreader.read()insideparseSseStream; addedAbortSignalsupport toparseSseStreamsoreader.read()races against the signalgrab_frametool description (they biased the model); updatedprompt.rsto explicitly mandate callinggrab_framefor ALL camera nodes when the user asks genericallysse.tscomments for clarityTest plan
grab_framefor every camera in inventory, not just onecargo checkpasses🤖 Generated with Claude Code