chore: import upstream snapshot with attribution

This commit is contained in:
wehub-resource-sync
2026-07-13 12:58:18 +08:00
commit 6d5d58c1a9
18293 changed files with 3502153 additions and 0 deletions
@@ -0,0 +1,62 @@
# QA: Agentic Chat — AG2
## Prerequisites
- Demo is deployed and accessible
- Agent backend is healthy (check /api/health)
## Test Steps
### 1. Basic Functionality
- [ ] Navigate to the agentic-chat demo page
- [ ] Verify the chat interface loads with a text input placeholder "Type a message"
- [ ] Verify the background container (`data-testid="background-container"`) is visible
- [ ] Verify the default background color is the theme default (rgb(250, 250, 249))
- [ ] Send a basic message (e.g. "Hello")
- [ ] Verify the agent responds with a text message
### 2. Feature-Specific Checks
#### Suggestions
- [ ] Verify "Change background" suggestion button is visible
- [ ] Verify "Generate sonnet" suggestion button is visible
- [ ] Click the "Change background" suggestion
- [ ] Verify the suggestion either populates the input or sends the message
#### Background Change (useFrontendTool)
- [ ] Ask "Change the background to a sunset gradient"
- [ ] Verify the background container style changes from the default
- [ ] Verify the change_background tool returns a success status
#### Weather Render Tool (useRenderTool)
- [ ] Type "What's the weather in Tokyo?"
- [ ] Verify loading state shows "Loading weather..." (`data-testid="weather-info-loading"`)
- [ ] Verify WeatherCard renders (`data-testid="weather-info"`) with:
- [ ] City name displayed
- [ ] Temperature in degrees C
- [ ] Humidity percentage
- [ ] Wind speed in mph
- [ ] Conditions text
#### Agent Context
- [ ] Verify the agent knows the user's name is "Bob" (provided via useAgentContext)
- [ ] Ask "What is my name?" and verify the agent responds with "Bob"
### 3. Error Handling
- [ ] Send an empty message (should be handled gracefully)
- [ ] Verify no console errors during normal usage
- [ ] Send a very long message and verify no UI breakage
## Expected Results
- Chat loads within 3 seconds
- Agent responds within 10 seconds
- Background changes are instant after tool execution
- Weather card renders with all data fields populated
- No UI errors or broken layouts
@@ -0,0 +1,11 @@
# QA: Chat Customization (CSS) — AG2
- [ ] Navigate to /demos/chat-customization-css
- [ ] Verify scoped theme applied — `.chat-css-demo-scope` wrapper has hot-pink accents
- [ ] Send a message — verify user bubble is hot-pink gradient, assistant bubble is amber monospace
- [ ] Input border is dashed pink
- [ ] No theme leak to other pages
## Expected Results
- All CSS overrides visible, scoped to this demo
@@ -0,0 +1,12 @@
# QA: Chat Slots — AG2
- [ ] Navigate to /demos/chat-slots
- [ ] Verify custom welcome screen visible (`data-testid="custom-welcome-screen"`)
- [ ] Verify "Custom Slot" badge
- [ ] Send a message (or click a suggestion)
- [ ] Verify custom assistant message wrapper (`data-testid="custom-assistant-message"`) renders
- [ ] Verify custom disclaimer (`data-testid="custom-disclaimer"`) renders
## Expected Results
- All three slot overrides render and are visible
@@ -0,0 +1,11 @@
# QA: Frontend Tools (Async) — AG2
- [ ] Navigate to /demos/frontend-tools-async
- [ ] Click "Find project-planning notes"
- [ ] Verify NotesCard loading state ("Querying local notes DB...")
- [ ] After ~500ms, verify matches render (notes-list)
- [ ] Verify agent summarizes the notes in the next assistant bubble
## Expected Results
- Async frontend-tool handler waits and returns data to the agent
@@ -0,0 +1,10 @@
# QA: Frontend Tools — AG2
- [ ] Navigate to /demos/frontend-tools
- [ ] Click "Change background" suggestion
- [ ] Verify background updates via client-side handler
- [ ] Verify success message in chat
## Expected Results
- useFrontendTool handler runs on the client; agent uses the return value
@@ -0,0 +1,62 @@
# QA: Agentic Generative UI — AG2
## Prerequisites
- Demo is deployed and accessible
- Agent backend is healthy (check /api/health)
## Test Steps
### 1. Basic Functionality
- [ ] Navigate to the gen-ui-agent demo page
- [ ] Verify the chat interface loads in a centered full-height layout
- [ ] Verify the chat input placeholder "Type a message" is visible
- [ ] Send a basic message
- [ ] Verify the agent responds
### 2. Feature-Specific Checks
#### Suggestions
- [ ] Verify "Simple plan" suggestion button is visible (plan to go to Mars in 5 steps)
- [ ] Verify "Complex plan" suggestion button is visible (plan to make pizza in 10 steps)
#### Task Progress Tracker (useAgent with state streaming)
- [ ] Click "Simple plan" suggestion or type "Build a plan to go to Mars in 5 steps"
- [ ] Verify the TaskProgress component renders (`data-testid="task-progress"`)
- [ ] Verify the progress bar appears with a gradient fill
- [ ] Verify step items appear with descriptions (`data-testid="task-step-text"`)
- [ ] Verify the "N/N Complete" counter updates as steps complete
- [ ] Verify completed steps show:
- Green background gradient
- Check icon
- Green text color
- [ ] Verify the current pending step shows:
- Blue/purple background gradient
- Spinner icon with "Processing..." text
- Pulsing animation
- [ ] Verify future pending steps show:
- Gray background
- Clock icon
- Muted text color
#### Complex Plan
- [ ] Type "Plan to make pizza in 10 steps"
- [ ] Verify 10 steps appear in the progress tracker
- [ ] Verify progress bar width increases as steps complete
### 3. Error Handling
- [ ] Send an empty message (should be handled gracefully)
- [ ] Verify no console errors during normal usage
## Expected Results
- Chat loads within 3 seconds
- Agent responds within 10 seconds
- Task progress tracker shows live step completion
- Progress bar animates smoothly
- No UI errors or broken layouts
@@ -0,0 +1,59 @@
# QA: Tool-Based Generative UI — AG2
## Prerequisites
- Demo is deployed and accessible
- Agent backend is healthy (check /api/health)
## Test Steps
### 1. Basic Functionality
- [ ] Navigate to the gen-ui-tool-based demo page
- [ ] Verify the CopilotSidebar opens by default with title "Haiku Generator"
- [ ] Verify a placeholder haiku card is displayed on the main area
- [ ] Send a basic message via the sidebar
- [ ] Verify the agent responds
### 2. Feature-Specific Checks
#### Suggestions
- [ ] Verify "Nature Haiku" suggestion button is visible
- [ ] Verify "Ocean Haiku" suggestion button is visible
- [ ] Verify "Spring Haiku" suggestion button is visible
#### Haiku Generation (useFrontendTool)
- [ ] Click the "Nature Haiku" suggestion or type "Write me a haiku about nature"
- [ ] Verify a HaikuCard renders (`data-testid="haiku-card"`) with:
- [ ] Three Japanese text lines (`data-testid="haiku-japanese-line"`)
- [ ] Three English translation lines (`data-testid="haiku-english-line"`)
- [ ] A background gradient style applied to the card
- [ ] Verify the Japanese text contains actual Japanese characters (not Latin)
- [ ] Verify the English lines are a readable English translation
#### Image Display
- [ ] After haiku generation, verify an image renders (`data-testid="haiku-image"`) if the agent provides an image_name
- [ ] Verify the image src points to /images/ with a valid filename from the predefined list
#### Multiple Haikus
- [ ] Generate a second haiku (e.g. "Ocean Haiku")
- [ ] Verify the new haiku card appears at the top
- [ ] Verify the previous haiku card is still visible below
- [ ] Verify the initial placeholder haiku is removed
### 3. Error Handling
- [ ] Send an empty message (should be handled gracefully)
- [ ] Verify no console errors during normal usage
## Expected Results
- Sidebar loads within 3 seconds
- Agent responds and generates haiku within 10 seconds
- Haiku cards display with Japanese and English text
- Generated haikus stack with newest on top
- No UI errors or broken layouts
@@ -0,0 +1,13 @@
# QA: Headless Chat (Simple) — AG2
- [ ] Navigate to /demos/headless-simple
- [ ] Verify "Headless Chat (Simple)" heading
- [ ] Type "show a card about cats"
- [ ] Click Send
- [ ] Verify user bubble appears
- [ ] Verify assistant replies, `ShowCard` renders (title + body)
## Expected Results
- Custom chat UI works (not pre-built CopilotChat)
- useComponent registration wired via copilotkit.runAgent
@@ -0,0 +1,12 @@
# QA: In-App HITL — AG2
- [ ] Navigate to /demos/hitl-in-app
- [ ] Verify tickets panel on left, chat on right
- [ ] Click suggestion "Approve refund for #12345"
- [ ] Verify approval dialog modal appears (`data-testid="approval-dialog"`) OUTSIDE the chat
- [ ] Click Approve
- [ ] Verify dialog closes and agent acknowledges approval in chat
## Expected Results
- App-level modal routes through async useFrontendTool Promise
@@ -0,0 +1,57 @@
# QA: Human in the Loop — AG2
## Prerequisites
- Demo is deployed and accessible
- Agent backend is healthy (check /api/health)
## Test Steps
### 1. Basic Functionality
- [ ] Navigate to the HITL demo page (`/demos/hitl`) > _Note: the URL path `/demos/hitl` is intentionally shorter than the feature id `hitl-in-chat`._
- [ ] Verify the chat interface loads in a centered max-w-4xl container
- [ ] Verify the chat input placeholder "Type a message" is visible
- [ ] Send a basic message
- [ ] Verify the agent responds
### 2. Feature-Specific Checks
#### Suggestions
- [ ] Verify "Simple plan" suggestion button is visible
- [ ] Verify "Complex plan" suggestion button is visible
- [ ] Click the "Simple plan" suggestion
- [ ] Verify it triggers a message about planning a trip to Mars in 5 steps
#### Step Selection and Approval
The HITL demo renders a single StepSelector card regardless of whether
the underlying flow uses an interrupt hook or a frontend HITL tool. The
framework-specific hook name is an implementation detail covered in each
package's demo source; QA below validates the user-visible card behavior.
- [ ] Send "Plan a trip to Mars in 5 steps"
- [ ] Verify the StepSelector card appears (`data-testid="select-steps"`)
- [ ] Verify step items are displayed with checkboxes (`data-testid="step-item"`)
- [ ] Verify step text is visible (`data-testid="step-text"`)
- [ ] Verify the selected count display shows "N/N selected"
- [ ] Toggle a step checkbox off and verify the count decreases
- [ ] Toggle it back on and verify the count increases
- [ ] Click "Perform Steps (N)" / "Confirm (N)" button
- [ ] Verify the agent continues processing after confirmation
- [ ] In a new conversation, trigger the same flow and click "Reject" (where present)
- [ ] Verify the card reflects the decision (Accepted / Rejected) and buttons disable
### 3. Error Handling
- [ ] Send an empty message (should be handled gracefully)
- [ ] Verify no console errors during normal usage
## Expected Results
- Chat loads within 3 seconds
- Agent responds within 10 seconds
- Step selector renders with toggleable checkboxes
- Accept/Reject flow completes without errors
- No UI errors or broken layouts
@@ -0,0 +1,12 @@
# QA: Pre-Built Popup — AG2
- [ ] Navigate to /demos/prebuilt-popup
- [ ] Verify floating launcher visible
- [ ] Popup opens by default
- [ ] Send "Say hi from the popup"
- [ ] Verify agent responds
## Expected Results
- Popup opens as overlay
- Agent replies inside the popup window
@@ -0,0 +1,20 @@
# QA: Pre-Built Sidebar — AG2
## Prerequisites
- Demo is deployed and accessible
- Agent backend is healthy (check /api/health)
## Test Steps
- [ ] Navigate to /demos/prebuilt-sidebar
- [ ] Verify main content renders ("Sidebar demo — click the launcher")
- [ ] Verify sidebar launcher button visible
- [ ] Verify sidebar is open by default
- [ ] Send "Say hi"
- [ ] Verify agent responds
## Expected Results
- Sidebar toggles via launcher
- Agent replies inside the sidebar
@@ -0,0 +1,12 @@
# QA: Readonly State (Agent Context) — AG2
- [ ] Navigate to /demos/readonly-state-agent-context
- [ ] Verify context card (`data-testid="context-card"`)
- [ ] Change name in `data-testid="ctx-name"` input
- [ ] Toggle an activity checkbox
- [ ] Send "Who am I?"
- [ ] Verify agent reflects the context (name, timezone, activities)
## Expected Results
- useAgentContext values visibly propagate into agent's replies
@@ -0,0 +1,10 @@
# QA: Reasoning (Default Render) — AG2
- [ ] Navigate to /demos/reasoning-default-render
- [ ] Send "Think step-by-step: what is 17 \* 23?"
- [ ] Verify a reasoning card appears above the final answer (default CopilotChatReasoningMessage)
- [ ] Card is collapsible
## Expected Results
- Built-in reasoning UI renders without a custom slot
@@ -0,0 +1,69 @@
# QA: Shared State (Read + Write) — AG2
## Prerequisites
- Demo is deployed and accessible at `/demos/shared-state-read-write`
- Agent backend is healthy (check `/api/copilotkit` GET → `agent_status: reachable`)
- Backend has `OPENAI_API_KEY` set
- The `shared-state-read-write` agent is mounted at `/shared-state-read-write` on
the FastAPI server (see `src/agent_server.py`)
## Test Steps
### 1. Page renders with the two cards and chat
- [ ] Navigate to `/demos/shared-state-read-write`
- [ ] Sidebar shows the **Preferences** card (`data-testid="preferences-card"`)
- [ ] Sidebar shows the **Agent notes** card (`data-testid="notes-card"`) with the
empty state copy "No notes yet. Ask the agent to remember something."
- [ ] Right-hand pane shows `<CopilotChat />` with the placeholder
"Chat with the agent..."
- [ ] The "Shared state" panel inside the preferences card shows JSON with
`name: ""`, `tone: "casual"`, `language: "English"`, `interests: []`
### 2. UI -> agent (write)
- [ ] Type a name (e.g. `Atai`) into the **Name** input. The "Shared state"
JSON inside the card updates immediately to reflect the new name.
- [ ] Change **Tone** to `playful`. JSON updates.
- [ ] Change **Language** to `Spanish`. JSON updates.
- [ ] Toggle 2-3 interests (e.g. `Cooking`, `Tech`). JSON updates and the
buttons show the selected style.
- [ ] In the chat, send: **"Greet me in one sentence."**
- [ ] The agent's reply addresses the user by name in a playful tone, in
Spanish (i.e. it actually used the preferences). It must NOT just
echo the JSON.
### 3. agent -> UI (read)
- [ ] In the chat, send: **"Remember that I prefer morning meetings and that
I don't eat dairy."**
- [ ] The **Agent notes** card transitions from the empty state to a
bulleted list with at least 2 entries (`data-testid="note-item"`),
reflecting the two facts above. The list updates in real time
while/after the agent finishes its turn.
- [ ] In the chat, send: **"Also remember I work in Pacific time."**
- [ ] The notes list now has at least 3 entries (the agent passed the FULL
list to `set_notes`, not just the new one).
### 4. Round-trip + Clear
- [ ] Click the **Clear** button on the notes card.
- [ ] The notes card returns to the empty state immediately.
- [ ] In the chat, send: **"What do you remember about me?"**
- [ ] The agent reports it has no remembered notes (because the UI cleared
them via `agent.setState`), confirming the UI's write-back was
visible to the agent on its next turn.
### 5. Error handling
- [ ] Send an empty message → handled gracefully (no crash, no broken UI).
- [ ] No console errors during normal usage.
## Expected Results
- Page loads in < 3 seconds.
- Preferences edits propagate to agent state instantly.
- Agent replies adapt visibly to preferences (name, tone, language).
- Notes card reflects every `set_notes` call from the agent.
- Clearing notes from the UI is reflected on the agent's next turn.
@@ -0,0 +1,75 @@
# QA: Shared State (Reading) — AG2
## Prerequisites
- Demo is deployed and accessible
- Agent backend is healthy (check /api/health)
## Test Steps
### 1. Basic Functionality
- [ ] Navigate to the shared-state-read demo page
- [ ] Verify the recipe card form loads (`data-testid="recipe-card"`)
- [ ] Verify the CopilotSidebar opens by default with title "AI Recipe Assistant"
- [ ] Send a message via the sidebar
- [ ] Verify the agent responds
### 2. Feature-Specific Checks
#### Initial Recipe State
- [ ] Verify the recipe title input shows "Make Your Recipe"
- [ ] Verify the cooking time dropdown defaults to "45 min"
- [ ] Verify the skill level dropdown defaults to "Intermediate"
- [ ] Verify the default ingredients are displayed:
- [ ] Carrots (3 large, grated) with carrot emoji
- [ ] All-Purpose Flour (2 cups) with wheat emoji
- [ ] Verify the default instruction is displayed: "Preheat oven to 350 F"
#### Suggestions
- [ ] Verify "Create Italian recipe" suggestion is visible
- [ ] Verify "Make it healthier" suggestion is visible
- [ ] Verify "Suggest variations" suggestion is visible
#### Recipe Editing (Local State)
- [ ] Edit the recipe title and verify it updates
- [ ] Change the skill level dropdown and verify it updates
- [ ] Change the cooking time dropdown and verify it updates
- [ ] Toggle a dietary preference checkbox (e.g. "Vegetarian") and verify it's checked
- [ ] Click "+ Add Ingredient" (`data-testid="add-ingredient-button"`) and verify a new empty row appears
- [ ] Edit an ingredient name and amount
- [ ] Remove an ingredient by clicking the "x" button
- [ ] Click "+ Add Step" and verify a new instruction row appears
- [ ] Edit an instruction and verify it saves
- [ ] Remove an instruction by clicking the "x" button
#### AI-Powered Recipe Updates (useAgent with shared state)
- [ ] Click "Create Italian recipe" suggestion
- [ ] Verify the agent updates the recipe title, ingredients, and instructions
- [ ] Verify the ping indicator appears on changed sections
- [ ] Verify the "Improve with AI" button (`data-testid="improve-button"`) changes to "Please Wait..." while loading
- [ ] Click "Improve with AI" and verify the recipe is enhanced
#### Agent Reads Frontend State
- [ ] Edit the recipe (change title, add ingredients)
- [ ] Ask the agent "What recipe am I making?"
- [ ] Verify the agent's response references the current recipe state
### 3. Error Handling
- [ ] Send an empty message (should be handled gracefully)
- [ ] Verify no console errors during normal usage
- [ ] Verify the "Improve with AI" button is disabled while loading
## Expected Results
- Recipe card and sidebar load within 3 seconds
- Agent responds within 10 seconds
- Recipe state syncs bidirectionally between UI and agent
- Ping indicators highlight changed sections
- No UI errors or broken layouts
@@ -0,0 +1,41 @@
# QA: State Streaming — AG2
## Prerequisites
- Demo is deployed and accessible
- Agent backend is healthy (check /api/health)
## Test Steps
### 1. Basic Functionality
- [ ] Navigate to the shared-state-streaming demo page
- [ ] Verify the chat interface loads with title "State Streaming"
- [ ] Verify the chat input placeholder "Type a message..." is visible
- [ ] Send a basic message (e.g. "Hello! What can you do?")
- [ ] Verify the agent responds
### 2. Feature-Specific Checks
#### Suggestions
- [ ] Verify "Get started" suggestion button is visible
#### Note: Stub Demo
> **Status: Stub** — This demo is currently a stub (TODO: implement)
- [ ] Verify the basic CopilotChat loads and accepts messages
- [ ] Verify the agent responds to messages
- [ ] No custom UI components are expected beyond the chat interface
### 3. Error Handling
- [ ] Send an empty message (should be handled gracefully)
- [ ] Verify no console errors during normal usage
## Expected Results
- Chat loads within 3 seconds
- Agent responds within 10 seconds
- No UI errors or broken layouts
@@ -0,0 +1,41 @@
# QA: Shared State (Writing) — AG2
## Prerequisites
- Demo is deployed and accessible
- Agent backend is healthy (check /api/health)
## Test Steps
### 1. Basic Functionality
- [ ] Navigate to the shared-state-write demo page
- [ ] Verify the chat interface loads with title "Shared State (Writing)"
- [ ] Verify the chat input placeholder "Type a message..." is visible
- [ ] Send a basic message (e.g. "Hello! What can you do?")
- [ ] Verify the agent responds
### 2. Feature-Specific Checks
#### Suggestions
- [ ] Verify "Get started" suggestion button is visible
#### Note: Stub Demo
> **Status: Stub** — This demo is currently a stub (TODO: implement)
- [ ] Verify the basic CopilotChat loads and accepts messages
- [ ] Verify the agent responds to messages
- [ ] No custom UI components are expected beyond the chat interface
### 3. Error Handling
- [ ] Send an empty message (should be handled gracefully)
- [ ] Verify no console errors during normal usage
## Expected Results
- Chat loads within 3 seconds
- Agent responds within 10 seconds
- No UI errors or broken layouts
+74
View File
@@ -0,0 +1,74 @@
# QA: Sub-Agents — AG2
## Prerequisites
- Demo is deployed and accessible at `/demos/subagents`
- Agent backend is healthy (check `/api/copilotkit` GET → `agent_status: reachable`)
- Backend has `OPENAI_API_KEY` set
- The `subagents` supervisor is mounted at `/subagents` on the FastAPI
server (see `src/agent_server.py`)
## Test Steps
### 1. Page renders with delegation log + chat
- [ ] Navigate to `/demos/subagents`
- [ ] Left pane shows the **Delegation log** panel
(`data-testid="delegation-log"`)
- [ ] Header reads "Sub-agent delegations" with a counter
`data-testid="delegation-count"` showing `0 calls`
- [ ] Empty-state copy: "Ask the supervisor to complete a task. Every
sub-agent it calls will appear here."
- [ ] Right pane shows the chat with placeholder
"Give the supervisor a task..."
### 2. Single delegation chain
- [ ] Click suggestion **"Write a blog post"** (or send the equivalent
message).
- [ ] While the supervisor runs, the badge
`data-testid="supervisor-running"` ("Supervisor running") appears in
the header.
- [ ] As the supervisor delegates, entries appear in the log
(`data-testid="delegation-entry"`). Expect at least 3 entries — one
`Research`, one `Writing`, one `Critique` — in that order.
- [ ] Each entry shows:
- A `#N` index, a colored badge with the sub-agent name + emoji.
- A `Task: ...` line summarizing what was delegated.
- A `result` block containing the sub-agent's output (real LLM text,
not placeholders).
- [ ] Counter updates to `3 calls` (or more if the supervisor iterated).
### 3. Independent delegations
- [ ] Reload the page (state resets).
- [ ] Send: **"Research what causes the northern lights."**
- [ ] At least 1 `Research` delegation appears with a bulleted list of
facts in the result.
- [ ] Send: **"Now write a paragraph aimed at a 10-year-old, using those
facts."**
- [ ] A `Writing` delegation appears with a polished paragraph in the
result.
- [ ] Send: **"Critique that paragraph."**
- [ ] A `Critique` delegation appears with 2-3 actionable critiques.
### 4. Supervisor reply hygiene
- [ ] After each chain, the supervisor's chat reply is short — it
summarizes rather than re-pasting the full sub-agent output (which
already lives in the delegation log).
- [ ] The "Supervisor running" badge disappears once the run is complete.
### 5. Error handling
- [ ] Send a very short message (e.g. "Hi"). The supervisor responds
gracefully (it may not delegate for a trivial greeting).
- [ ] No console errors during normal usage.
## Expected Results
- Page loads in < 3 seconds.
- Each user request that's non-trivial produces at least one delegation
entry.
- The delegation log grows live during the run, not just at the end.
- Sub-agent results are real LLM outputs (not stubbed strings).
@@ -0,0 +1,10 @@
# QA: Tool Rendering (Custom Catch-all) — AG2
- [ ] Navigate to /demos/tool-rendering-custom-catchall
- [ ] Click "Weather in SF"
- [ ] Verify custom catch-all card renders (`data-testid="custom-catchall-card"`)
- [ ] Status progresses through streaming / running / done
## Expected Results
- The single custom wildcard renderer paints every tool call
@@ -0,0 +1,10 @@
# QA: Tool Rendering (Default Catch-all) — AG2
- [ ] Navigate to /demos/tool-rendering-default-catchall
- [ ] Click "Weather in SF" suggestion
- [ ] Verify DefaultToolCallRenderer fires — tool name visible, Running → Done
- [ ] Expand arguments / result
## Expected Results
- Out-of-box default tool-call card renders without custom config
@@ -0,0 +1,61 @@
# QA: Tool Rendering — AG2
## Prerequisites
- Demo is deployed and accessible
- Agent backend is healthy (check /api/health)
## Test Steps
### 1. Basic Functionality
- [ ] Navigate to the tool-rendering demo page
- [ ] Verify the chat interface loads in a centered full-height layout
- [ ] Verify the chat input placeholder "Type a message" is visible
- [ ] Send a basic message
- [ ] Verify the agent responds
### 2. Feature-Specific Checks
#### Suggestions
- [ ] Verify "Weather in San Francisco" suggestion button is visible
- [ ] Verify "Weather in New York" suggestion button is visible
- [ ] Verify "Weather in Tokyo" suggestion button is visible
- [ ] Click a weather suggestion and verify it populates the input or sends the message
#### Weather Card Rendering (useRenderTool)
- [ ] Type "What's the weather in San Francisco?"
- [ ] Verify loading state shows "Retrieving weather..." with a spinner
- [ ] Verify the WeatherCard renders (`data-testid="weather-card"`) with:
- [ ] City name displayed (`data-testid="weather-city"`)
- [ ] Temperature in both Celsius and Fahrenheit
- [ ] Humidity percentage (`data-testid="weather-humidity"`)
- [ ] Wind speed in mph (`data-testid="weather-wind"`)
- [ ] Feels-like temperature (`data-testid="weather-feels-like"`)
- [ ] Conditions text with appropriate weather icon (sun/rain/cloud)
- [ ] Verify the card background color matches the weather condition theme:
- Clear/Sunny: #667eea (blue-purple)
- Rain/Storm: #4A5568 (dark gray)
- Cloudy: #718096 (medium gray)
- Snow: #63B3ED (light blue)
#### Multiple Weather Queries
- [ ] Ask about weather in a second city
- [ ] Verify a second WeatherCard renders without breaking the first
- [ ] Verify each card shows the correct city name
### 3. Error Handling
- [ ] Send an empty message (should be handled gracefully)
- [ ] Verify no console errors during normal usage
## Expected Results
- Chat loads within 3 seconds
- Agent responds within 10 seconds
- Weather cards render with all data fields populated
- Weather icon and theme color match the conditions
- No UI errors or broken layouts