Skip to content

taOStalk s1: ToolCallBlock + StatusBlock/question renderers (cards 5+6) - #2275

Merged
jaylfc merged 2 commits into
devfrom
exec/tsk-3lkyq2
Aug 4, 2026
Merged

taOStalk s1: ToolCallBlock + StatusBlock/question renderers (cards 5+6)#2275
jaylfc merged 2 commits into
devfrom
exec/tsk-3lkyq2

Conversation

@jaylfc

@jaylfc jaylfc commented Aug 3, 2026

Copy link
Copy Markdown
Owner

CARD TITLE (intent, not commit subject): taOStalk s1: ToolCallBlock + StatusBlock/question renderers (cards 5+6)

Autonomous build of board card tsk-3lkyq2.

Files:
docs/agent-manual/11-files-api.md | 35 --------
docs/agent-manual/index.md | 1 -
docs/design/taosgo-mesh-join-foundation.md | 8 +-
docs/taos-agent-manual.md | 35 --------
tests/test_agent_manual_compiled.py | 2 +-
tinyagentos/taosnet/mesh.py | 3 +-
tinyagentos/taosnet/mesh_credentials.py | 3 +-
14 files changed, 330 insertions(+), 102 deletions(-)


Summary by Gitar

  • Components:
    • Added ToolCallBlock component to render tool call content blocks with status indicators and previews
    • Added StatusBlock component to render status and question content blocks with reply hints
  • MessagesApp:
    • Integrated ToolCallBlock and StatusBlock into renderContentBlock dispatch logic
    • Added QuestionContentBlock type definition and updated exports
  • Tests:
    • Added test suites for ToolCallBlock, StatusBlock, and updated render helper tests

This will update automatically on new commits.

Summary by CodeRabbit

  • New Features

    • Added dedicated displays for tool activity, including tool names, inputs, statuses, results, and errors.
    • Added styled status and question messages with contextual hints and metadata.
    • Improved message rendering for tool calls, statuses, and questions.
  • Bug Fixes

    • Unknown message types now retain a clear fallback display.
  • Tests

    • Added coverage for tool-call states, status messages, questions, result previews, and fallback behavior.

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@jaylfc, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 36 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 4c6a1994-971e-45af-8efd-ae436eb1797a

📥 Commits

Reviewing files that changed from the base of the PR and between 3e06de6 and 14f4cc5.

📒 Files selected for processing (7)
  • CHANGELOG.md
  • desktop/src/apps/MessagesApp.tsx
  • desktop/src/apps/chat/__tests__/render-helpers.test.tsx
  • desktop/src/components/StatusBlock.tsx
  • desktop/src/components/ToolCallBlock.tsx
  • desktop/src/components/__tests__/StatusBlock.test.tsx
  • desktop/src/components/__tests__/ToolCallBlock.test.tsx
📝 Walkthrough

Walkthrough

The PR adds public question content types and dedicated ToolCallBlock and StatusBlock renderers. MessagesApp dispatches tool-call, status, and question blocks to these components. Tests cover renderer output and fallback behavior.

Changes

Content block rendering

Layer / File(s) Summary
Renderer components and content contracts
desktop/src/apps/MessagesApp.tsx, desktop/src/components/StatusBlock.tsx, desktop/src/components/ToolCallBlock.tsx, desktop/src/components/__tests__/*
The content model exports tool-call, status, and question shapes. StatusBlock renders status and question variants. ToolCallBlock renders inputs, results, and status indicators. Component tests cover these states.
Content dispatch and fallback coverage
desktop/src/apps/MessagesApp.tsx, desktop/src/apps/chat/__tests__/render-helpers.test.tsx
renderContent routes tool-call, status, and question blocks to dedicated components. Text, thinking, and unknown kinds retain fallback handling. Tests verify the dispatch and fallback cases.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

  • jaylfc/taOS#2153: Introduced the content block types and dispatcher extended by this PR.
  • jaylfc/taOS#2154: Added the ContentBlock and renderContent foundations used by this PR.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the added ToolCallBlock and StatusBlock/question renderers, which match the primary changes in the pull request.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 2
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch exec/tsk-3lkyq2

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@gitar-bot

gitar-bot Bot commented Aug 3, 2026

Copy link
Copy Markdown

Gitar is working

Gitar

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

taOStalk: add ToolCallBlock and StatusBlock/question renderers

✨ Enhancement 🧪 Tests 🕐 40+ Minutes

Grey Divider

AI Description

• Render tool_call, status, and new question content blocks with dedicated UI cards.
• Introduce compact ToolCall and muted Status/Question block components for taOStalk sessions.
• Add focused unit tests to lock in renderer dispatch and visual/status semantics.
Diagram

graph TD
  A["MessagesApp.tsx: renderContentBlock"] --> B["ToolCallBlock.tsx"] --> T1["ToolCallBlock.test.tsx"]
  A --> C["StatusBlock.tsx"] --> T2["StatusBlock.test.tsx"] --> T3["render-helpers.test.tsx"]
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Renderer registry map instead of switch
  • ➕ Easier to extend: add a renderer without modifying a central switch
  • ➕ Can co-locate renderers with block components
  • ➖ Adds indirection and typing complexity for a small number of block kinds
  • ➖ Harder to see supported kinds at a glance
2. Dedicated QuestionBlock component (instead of StatusBlock variant)
  • ➕ Keeps semantics separated as question behavior evolves (options, interactions)
  • ➕ Avoids coupling question styling logic to status rendering
  • ➖ More files/components to maintain for a currently passive UI
  • ➖ Potential duplication of shared layout/styling

Recommendation: Current approach is a good fit for slice/card-driven delivery: a simple dispatcher plus dedicated components. Reusing StatusBlock for passive questions is pragmatic for s1 and keeps the UI minimal; consider splitting into a QuestionBlock only if/when options become interactive or require distinct layout.

Files changed (6) +323 / -18

Enhancement (3) +157 / -9
MessagesApp.tsxDispatch tool/status/question blocks to dedicated card components +28/-9

Dispatch tool/status/question blocks to dedicated card components

• Exports ToolCallContentBlock and StatusContentBlock types for component reuse, introduces a new QuestionContentBlock kind, and updates the content-block dispatcher to render tool/status/question via ToolCallBlock and StatusBlock. Text/thinking remain on the fallback path per the slice seam.

desktop/src/apps/MessagesApp.tsx

StatusBlock.tsxIntroduce StatusBlock with question variant styling +35/-0

Introduce StatusBlock with question variant styling

• Adds a small, muted line renderer for status blocks and a question variant that adds an accent border and a passive 'reply below' hint. Exposes data attributes to make behavior testable and stable.

desktop/src/components/StatusBlock.tsx

ToolCallBlock.tsxIntroduce ToolCallBlock card with status indicator and previews +94/-0

Introduce ToolCallBlock card with status indicator and previews

• Adds a compact Card-based renderer for tool calls showing tool name, input preview, and a status icon (spinner/check/alert). Optionally renders a terminal result preview once status is done/error, with error tinting.

desktop/src/components/ToolCallBlock.tsx

Tests (3) +166 / -9
render-helpers.test.tsxAdd dispatcher tests for tool_call/status/question rendering +31/-9

Add dispatcher tests for tool_call/status/question rendering

• Extends renderContent tests to assert that tool_call uses ToolCallBlock, status uses StatusBlock, and question routes through StatusBlock with the question variant hint. Adjusts unknown-kind coverage to use a truly unrecognized kind.

desktop/src/apps/chat/tests/render-helpers.test.tsx

StatusBlock.test.tsxUnit tests for status vs question rendering semantics +49/-0

Unit tests for status vs question rendering semantics

• Adds tests verifying the muted status line, absence/presence of question accent styling, and that question options remain passive (no interactive controls rendered).

desktop/src/components/tests/StatusBlock.test.tsx

ToolCallBlock.test.tsxUnit tests for ToolCallBlock status and preview behavior +86/-0

Unit tests for ToolCallBlock status and preview behavior

• Adds tests covering card presence, status indicator per state, input preview rendering, result preview gating to terminal states, and error tinting for error results.

desktop/src/components/tests/ToolCallBlock.test.tsx

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
desktop/src/apps/MessagesApp.tsx (1)

265-286: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Merge the status and question cases.

Both cases render <StatusBlock> and differ only in the cast type. Combine them with a fallthrough and reuse the exported StatusLikeBlock type from StatusBlock.tsx to avoid duplicating the cast logic.

♻️ Proposed refactor
-    case "status":
-      return (
-        <StatusBlock block={block as StatusContentBlock} key={`block-${index}`} />
-      );
-    case "question":
-      return (
-        <StatusBlock block={block as QuestionContentBlock} key={`block-${index}`} />
-      );
+    case "status":
+    case "question":
+      return (
+        <StatusBlock
+          block={block as StatusContentBlock | QuestionContentBlock}
+          key={`block-${index}`}
+        />
+      );
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@desktop/src/apps/MessagesApp.tsx` around lines 265 - 286, Merge the “status”
and “question” branches in renderContentBlock into one fallthrough case, and
cast the block once using the exported StatusLikeBlock type from StatusBlock.tsx
before passing it to StatusBlock. Preserve the existing key and rendering
behavior.
desktop/src/components/StatusBlock.tsx (1)

13-33: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Neither renderer announces status changes to assistive technology. StatusBlock and ToolCallBlock both render state transitions (status text, question prompts, tool-call icon changes) as plain markup with no live region. It is unconfirmed whether MessagesApp's parent message list already wraps updates in a live region.

  • desktop/src/components/StatusBlock.tsx#L13-L33: add role="status" and aria-live="polite" to the wrapping div so status and, in particular, "question" prompts are announced when they appear.
  • desktop/src/components/ToolCallBlock.tsx#L61-L94: add role="status" and aria-live="polite" around StatusIndicator (or its parent Card) so transitions between running, done, and error are announced.

Confirm first whether an ancestor component already provides a live region for the message list; if so, this may already be covered and no change is needed.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@desktop/src/components/StatusBlock.tsx` around lines 13 - 33, Check whether
MessagesApp or an ancestor already provides a live region for these message
updates; if so, make no changes. Otherwise, add role="status" and
aria-live="polite" to the StatusBlock wrapper in
desktop/src/components/StatusBlock.tsx:13-33, and apply the same announcement
attributes around StatusIndicator or its parent Card in
desktop/src/components/ToolCallBlock.tsx:61-94 so status transitions are
announced.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@desktop/src/apps/MessagesApp.tsx`:
- Around line 265-286: Merge the “status” and “question” branches in
renderContentBlock into one fallthrough case, and cast the block once using the
exported StatusLikeBlock type from StatusBlock.tsx before passing it to
StatusBlock. Preserve the existing key and rendering behavior.

In `@desktop/src/components/StatusBlock.tsx`:
- Around line 13-33: Check whether MessagesApp or an ancestor already provides a
live region for these message updates; if so, make no changes. Otherwise, add
role="status" and aria-live="polite" to the StatusBlock wrapper in
desktop/src/components/StatusBlock.tsx:13-33, and apply the same announcement
attributes around StatusIndicator or its parent Card in
desktop/src/components/ToolCallBlock.tsx:61-94 so status transitions are
announced.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: c1fceb9e-3f4d-46d9-8060-8d940c45a68c

📥 Commits

Reviewing files that changed from the base of the PR and between 21b0824 and 3e06de6.

📒 Files selected for processing (6)
  • desktop/src/apps/MessagesApp.tsx
  • desktop/src/apps/chat/__tests__/render-helpers.test.tsx
  • desktop/src/components/StatusBlock.tsx
  • desktop/src/components/ToolCallBlock.tsx
  • desktop/src/components/__tests__/StatusBlock.test.tsx
  • desktop/src/components/__tests__/ToolCallBlock.test.tsx

@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (2) 📘 Rule violations (0) 📜 Skill insights (0)

Context used
✅ Compliance rules (platform): 35 rules

Grey Divider


Remediation recommended

1. Unchecked block payloads 🐞 Bug ☼ Reliability
Description
renderContentBlock dispatches to ToolCallBlock/StatusBlock based only on block.kind and then
type-casts, so malformed/legacy blocks with kind:"tool_call"|"status"|"question" can render as
empty/undefined UI instead of hitting the explicit unsupported-block fallback. Because chat messages
accept/persist arbitrary content_blocks JSON, the UI cannot assume required fields (e.g.,
status, name, text) or enum values are valid at runtime.
Code

desktop/src/apps/MessagesApp.tsx[R273-276]

    case "tool_call":
+      return (
+        <ToolCallBlock block={block as ToolCallContentBlock} key={`block-${index}`} />
+      );
Relevance

●●● Strong

Team often accepts runtime hardening/guarding against malformed payloads and unsafe casts (e.g., PRs
#307, #303).

PR-#307
PR-#303
PR-#266

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The PR-added dispatcher uses casts when routing by kind, so runtime payloads that match kind but
not the expected shape will still be rendered by the specialized components. Those components assume
fields like status/name/text exist, and StatusIndicator has no default branch for unexpected
status strings. The backend route and message store show content_blocks is accepted from request
bodies and stored as JSON without schema enforcement, making malformed shapes reachable in practice.

desktop/src/apps/MessagesApp.tsx[271-293]
desktop/src/components/ToolCallBlock.tsx[15-18]
desktop/src/components/ToolCallBlock.tsx[61-94]
tinyagentos/routes/chat.py[367-381]
tinyagentos/chat/message_store.py[448-473]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`renderContentBlock()` switches on `block.kind` and then casts to `ToolCallContentBlock` / `StatusContentBlock` / `QuestionContentBlock` without runtime validation. Since `content_blocks` is persisted/echoed as arbitrary JSON, malformed blocks with a recognized `kind` can bypass the unsupported fallback and render with missing fields (e.g. blank text, missing status indicator).

### Issue Context
- Dedicated renderers were added for `tool_call`, `status`, and `question`.
- Backend accepts and stores `content_blocks` without schema validation, so shape/enum mismatches can occur (legacy messages, external clients, bugs upstream).

### Fix Focus Areas
- desktop/src/apps/MessagesApp.tsx[271-293]
- desktop/src/components/ToolCallBlock.tsx[15-18]
- desktop/src/components/ToolCallBlock.tsx[61-94]
- tinyagentos/routes/chat.py[367-381]
- tinyagentos/chat/message_store.py[448-473]

### Suggested fix approach
1. Add runtime type guards (or a small zod-style validator if already used in the repo) for each supported block kind:
  - `isToolCallBlock(x): x is ToolCallContentBlock` (checks `call_id`, `name`, `status` in {running,done,error})
  - `isStatusBlock(x): x is StatusContentBlock` (checks `text` is string)
  - `isQuestionBlock(x): x is QuestionContentBlock` (checks `text` is string; `options` optional string[])
2. In `renderContentBlock`, only dispatch to the dedicated component if the guard passes; otherwise render the unsupported fallback (ideally including the kind + a “malformed payload” hint).
3. In `ToolCallBlock.StatusIndicator`, add a `default` branch that renders a neutral indicator (or a small `?`/warning icon) and consider showing the raw status string so unknown statuses are visible/debuggable.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Informational

2. Brittle icon-class assertions 🐞 Bug ⚙ Maintainability
Description
ToolCallBlock unit tests assert lucide-generated CSS class names (e.g. .lucide-check,
.lucide-triangle-alert), which are implementation details and can break on icon/library renames
without a UI regression. The component already exposes stable semantic hooks
(data-status-indicator and aria-label) that the tests can assert instead.
Code

desktop/src/components/tests/ToolCallBlock.test.tsx[R28-32]

+    const card = container.querySelector('[data-tool-call="true"]');
+    expect(card?.getAttribute("data-status")).toBe("running");
+    expect(card?.querySelector(".animate-spin")).not.toBeNull();
+    expect(card?.querySelector(".lucide-check")).toBeNull();
+  });
Relevance

● Weak

Repo has merged tests asserting lucide icon CSS classes (e.g., .lucide-sunset, .lucide-moon) in
PR #481.

PR-#481

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The tests explicitly query for lucide’s generated classnames, while the component renders stable
data-status-indicator and aria-label attributes that can be asserted without coupling to icon
implementation details.

desktop/src/components/tests/ToolCallBlock.test.tsx[26-47]
desktop/src/components/ToolCallBlock.tsx[65-91]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The ToolCallBlock tests currently depend on lucide’s internal CSS class naming (and animation classnames). These are not part of the component’s contract and can change across lucide updates.

### Issue Context
`ToolCallBlock` already renders stable attributes suitable for tests:
- `data-status-indicator="true"`
- `aria-label="running" | "done" | "error"`

### Fix Focus Areas
- desktop/src/components/__tests__/ToolCallBlock.test.tsx[26-47]
- desktop/src/components/ToolCallBlock.tsx[65-91]

### Suggested fix approach
- Replace `.lucide-*` assertions with queries like:
 - `card?.querySelector('[data-status-indicator="true"][aria-label="running"]')`
 - `...aria-label="done"`
 - `...aria-label="error"`
- If you want to assert the spinner specifically, consider adding a dedicated `data-testid` for the spinner/icon rather than checking `.animate-spin`.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

To customize comments, go to the Qodo configuration screen, or learn more in the docs.

Qodo Logo

Comment on lines 273 to +276
case "tool_call":
return (
<ToolCallBlock block={block as ToolCallContentBlock} key={`block-${index}`} />
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

1. Unchecked block payloads 🐞 Bug ☼ Reliability

renderContentBlock dispatches to ToolCallBlock/StatusBlock based only on block.kind and then
type-casts, so malformed/legacy blocks with kind:"tool_call"|"status"|"question" can render as
empty/undefined UI instead of hitting the explicit unsupported-block fallback. Because chat messages
accept/persist arbitrary content_blocks JSON, the UI cannot assume required fields (e.g.,
status, name, text) or enum values are valid at runtime.
Agent Prompt
### Issue description
`renderContentBlock()` switches on `block.kind` and then casts to `ToolCallContentBlock` / `StatusContentBlock` / `QuestionContentBlock` without runtime validation. Since `content_blocks` is persisted/echoed as arbitrary JSON, malformed blocks with a recognized `kind` can bypass the unsupported fallback and render with missing fields (e.g. blank text, missing status indicator).

### Issue Context
- Dedicated renderers were added for `tool_call`, `status`, and `question`.
- Backend accepts and stores `content_blocks` without schema validation, so shape/enum mismatches can occur (legacy messages, external clients, bugs upstream).

### Fix Focus Areas
- desktop/src/apps/MessagesApp.tsx[271-293]
- desktop/src/components/ToolCallBlock.tsx[15-18]
- desktop/src/components/ToolCallBlock.tsx[61-94]
- tinyagentos/routes/chat.py[367-381]
- tinyagentos/chat/message_store.py[448-473]

### Suggested fix approach
1. Add runtime type guards (or a small zod-style validator if already used in the repo) for each supported block kind:
   - `isToolCallBlock(x): x is ToolCallContentBlock` (checks `call_id`, `name`, `status` in {running,done,error})
   - `isStatusBlock(x): x is StatusContentBlock` (checks `text` is string)
   - `isQuestionBlock(x): x is QuestionContentBlock` (checks `text` is string; `options` optional string[])
2. In `renderContentBlock`, only dispatch to the dedicated component if the guard passes; otherwise render the unsupported fallback (ideally including the kind + a “malformed payload” hint).
3. In `ToolCallBlock.StatusIndicator`, add a `default` branch that renders a neutral indicator (or a small `?`/warning icon) and consider showing the raw status string so unknown statuses are visible/debuggable.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@jaylfc

jaylfc commented Aug 4, 2026

Copy link
Copy Markdown
Owner Author

nemotron-super review

VERDICT: PASS
No blocking issues found.

Automated first-pass review by the nemotron-super lane. The lead still reviews before merge.

@jaylfc

jaylfc commented Aug 4, 2026

Copy link
Copy Markdown
Owner Author

Reviewed at 3e06de6; changelog added by me at 42f5aab.

VERIFIED:

  • Replay check: one commit, base 20h stale but it merges CLEANLY onto current dev (trial-merged locally, rc=0), and the files are the card's own work - real new components ToolCallBlock.tsx and StatusBlock.tsx, not a replay.
  • Tests exercise real code: they import { ToolCallBlock } from ../ToolCallBlock and the shared block types from MessagesApp. 28/28 pass locally across the three touched test files.
  • ToolCallBlock carries a proper ARIA disclosure contract (5 aria/role attributes).
  • StatusBlock has NO aria attributes and that is CORRECT, not a gap: it renders plain text, which screen readers read natively; the accent border is decorative and the question variant's meaning is carried by the visible 'reply below' text rather than by colour alone. Checked before flagging.

SEQUENCING NOTE: this and #2282 both edit MessagesApp.tsx's renderContent dispatch and render-helpers.test.tsx. Both are armed; whichever lands second will likely need a rebase rather than merging clean. That is expected, not a defect - I am watching for the conflict transition and will rebase the loser.

dependency-audit red is the fleet-wide cryptography CVE issue (tsk-4kifi6 / dec-26leeh), not this PR, and is not a required check on dev.

Auto-merge armed on green.

@jaylfc
jaylfc enabled auto-merge (squash) August 4, 2026 07:01
<AlertTriangle size={12} className="text-red-400" />
</span>
);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Missing default branch in StatusIndicator switch

If a malformed block reaches this component with an unexpected status value, the switch falls through and the function returns undefined, causing the status indicator to render nothing.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

Comment thread CHANGELOG.md
raise review-request notifications through the store (and therefore through
SSE and web push) instead of a raw database insert (#2280).
- Chat renders `tool_call` and `status` content blocks: tool calls as a
collapsible detail with an ARIA disclosure contract, status (and the

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SUGGESTION: "collapsible detail" is inaccurate

ToolCallBlock is a static card with truncated content, not a collapsible element. Consider rephrasing to match the actual implementation.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

@kilo-code-bot

kilo-code-bot Bot commented Aug 4, 2026

Copy link
Copy Markdown

Code Review Summary

Status: 2 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 1
SUGGESTION 1
Issue Details (click to expand)

WARNING

File Line Issue
desktop/src/components/ToolCallBlock.tsx 93 Missing default branch in StatusIndicator switch

SUGGESTION

File Line Issue
CHANGELOG.md 16 "collapsible detail" is inaccurate
Files Reviewed (7 files)
  • desktop/src/apps/MessagesApp.tsx
  • desktop/src/apps/chat/__tests__/render-helpers.test.tsx
  • desktop/src/components/StatusBlock.tsx
  • desktop/src/components/ToolCallBlock.tsx
  • desktop/src/components/__tests__/StatusBlock.test.tsx
  • desktop/src/components/__tests__/ToolCallBlock.test.tsx
  • CHANGELOG.md

Fix these issues in Kilo Cloud


Reviewed by step-3.7-flash · Input: 123.1K · Output: 23.8K · Cached: 684.3K

@jaylfc
jaylfc merged commit e24df72 into dev Aug 4, 2026
18 of 19 checks passed
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