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,24 @@
# QA — a2ui-fixed-schema
## Scope
Manual QA checklist for the `a2ui-fixed-schema` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/a2ui-fixed-schema`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `a2ui-fixed-schema` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,44 @@
# QA: A2UI Error Recovery — AWS Strands (Python)
## Prerequisites
- Demo is deployed and accessible at `/demos/a2ui-recovery` on the dashboard host
- Agent backend is healthy; `OPENAI_API_KEY` is set; `AGENT_URL` points at the Strands agent server; the recovery agent is mounted at `AGENT_URL/a2ui-recovery/` (registered as agent name `a2ui-recovery` — see `src/app/api/copilotkit-a2ui-recovery/route.ts` and `src/agent_server.py`)
- Requires `ag_ui_strands` with A2UI recovery (the validate→retry loop + `a2ui_recovery_exhausted` hard-fail envelope run on the adapter's auto-inject path) and the `@copilotkit` A2UI renderer (the `building`/`retrying`/`failed` lifecycle rendering)
- Wiring: the page's provider catalog auto-enables A2UI tool injection; the Strands adapter auto-injects `generate_a2ui`, drives the `render_a2ui` planner, and runs the recovery loop itself (no explicit backend tool, unlike the langgraph/ADK siblings — see `src/agents/recovery_agent.py`)
- Reuses the **declarative-gen-ui** catalog (`catalogId: "declarative-gen-ui-catalog"`) and the Vantage Threads sales context — no new components
## Test Steps
### 1. Basic Functionality
- [ ] Navigate to `/demos/a2ui-recovery`; verify the page renders within 3s and a single `CopilotChat` pane is centered (max-width ~896px, rounded-2xl, full-height)
- [ ] Verify the chat is wired to `runtimeUrl="/api/copilotkit-a2ui-recovery"` and `agent="a2ui-recovery"` (DevTools → Network: sending a message hits that endpoint, not `/api/copilotkit`)
- [ ] Verify both suggestion pills are visible with verbatim titles:
- "Recover a bad render"
- "Show an unrecoverable failure"
### 2. Healing path
- [ ] Click "Recover a bad render" ("Render my Q2 sales dashboard, recovering if the first attempt is malformed.")
- [ ] The inner `render_a2ui` returns **free-form / sloppy** A2UI args (components & data as JSON strings rather than structured arrays). Verify the middleware **heals** them via `parse_and_fix` into a valid surface that paints (no broken surface, no error banner)
- [ ] Verify the **painted** surface is valid: a `declarative-metric` row ("Quarterly Revenue $4.2M", "Win Rate 31%")
- [ ] DevTools → Network: verify the final tool result carries an `a2ui_operations` container (no `a2ui_recovery_exhausted`)
- [ ] Verify the chat reply is one short sentence noting the heal
### 3. Hard-fail (recovery exhausted) path
- [ ] Click "Show an unrecoverable failure" ("Render a dashboard that keeps failing validation so I can see the fallback.")
- [ ] Verify the lifecycle ends in a tasteful `failed` state (NOT a broken/half-rendered surface and NOT a silent drop)
- [ ] DevTools → Network: verify `render_a2ui` was attempted up to the cap (3 attempts, all invalid) and the tool returned an `a2ui_recovery_exhausted` envelope (no `a2ui_operations` painted)
- [ ] Verify the chat reply gracefully explains the fallback (one short sentence)
### 4. Regression / isolation
- [ ] Verify the recovery demo does not affect the declarative-gen-ui or beautiful-chat demos (separate routes/agents)
- [ ] Re-run each pill a second time and verify the same lifecycle
## Notes
- The malformed renders are forced by aimock fixtures (`showcase/aimock/d6/strands/a2ui-recovery.json`): the inner `render_a2ui` call is matched by `userMessage` + `toolName=render_a2ui`. Healing itself is performed live by the toolkit recovery loop inside the Strands adapter.
- AWS-Strands sibling of the langgraph-python `a2ui-recovery` demo. On Strands the recovery loop runs on the adapter's auto-inject path, so no explicit `get_a2ui_tools` wiring is needed.
@@ -0,0 +1,24 @@
# QA — agent-config
## Scope
Manual QA checklist for the `agent-config` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/agent-config`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `agent-config` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,24 @@
# QA — agentic-chat-reasoning
## Scope
Manual QA checklist for the `agentic-chat-reasoning` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/agentic-chat-reasoning`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `agentic-chat-reasoning` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,62 @@
# QA: Agentic Chat — AWS Strands
## 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
+24
View File
@@ -0,0 +1,24 @@
# QA — auth
## Scope
Manual QA checklist for the `auth` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/auth`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `auth` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,36 @@
# QA — byoc-hashbrown
## Scope
Manual QA checklist for the `byoc-hashbrown` demo in the AWS Strands
showcase. The agent emits a hashbrown JSON envelope that `@hashbrownai/react`
progressively parses and renders via the MetricCard / PieChart / BarChart /
DealCard / Markdown catalog.
## Happy path
- [ ] Navigate to `/demos/byoc-hashbrown`.
- [ ] Page renders with header "BYOC: Hashbrown" and no console errors.
- [ ] Suggestion pills appear in the composer (Sales dashboard, Revenue by
category, Expense trend).
- [ ] Click "Sales dashboard" — the assistant replies with a progressively
streaming dashboard that includes at least one metric card, one pie
chart, and one bar chart.
- [ ] Click "Revenue by category" — the assistant replies with a pie chart
with 4+ segments.
- [ ] Click "Expense trend" — the assistant replies with a bar chart.
## Regression
- [ ] The assistant's response is rendered as a visual dashboard (NOT as
raw JSON in a chat bubble).
- [ ] `data-testid="metric-card"`, `data-testid="pie-chart"`, and
`data-testid="bar-chart"` are present on their respective elements.
- [ ] No hydration warnings.
## Known gaps
- The Strands backend uses the shared agent from `agent.py`; the
hashbrown JSON envelope prompt is injected via `useAgentContext` on the
frontend. The canonical prompt lives in `src/agents/byoc_hashbrown.py`
as documentation.
@@ -0,0 +1,33 @@
# QA — byoc-json-render
## Scope
Manual QA checklist for the `byoc-json-render` demo. The agent emits a
`{ root, elements }` JSON spec that `@json-render/react`'s `<Renderer>`
mounts against a Zod-validated catalog.
## Happy path
- [ ] Navigate to `/demos/byoc-json-render`.
- [ ] Page renders, chat composer shows suggestion pills.
- [ ] Click "Sales dashboard" — the assistant replies with a rendered
dashboard (MetricCard + BarChart) rather than raw JSON.
- [ ] Click "Revenue by category" — the assistant replies with a PieChart
with 4 segments.
- [ ] Click "Expense trend" — the assistant replies with a BarChart.
## Regression
- [ ] `data-testid="json-render-root"` is present on the rendered
assistant message wrapper.
- [ ] `data-testid="metric-card"` appears when a MetricCard is the root.
- [ ] Nested children of MetricCard (e.g. the BarChart in the Sales
Dashboard worked example) render — they are NOT silently dropped
(PR #4271 fix).
- [ ] No "useVisibility must be used within a VisibilityProvider" crash
(PR #4271 fix — `<JSONUIProvider>` wraps `<Renderer>`).
## Known gaps
- Uses the shared Strands backend via the prompt injected on the frontend;
canonical prompt lives in `src/agents/byoc_json_render.py`.
@@ -0,0 +1,24 @@
# QA — chat-customization-css
## Scope
Manual QA checklist for the `chat-customization-css` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/chat-customization-css`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `chat-customization-css` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,24 @@
# QA — chat-slots
## Scope
Manual QA checklist for the `chat-slots` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/chat-slots`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `chat-slots` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,24 @@
# QA — declarative-gen-ui
## Scope
Manual QA checklist for the `declarative-gen-ui` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/declarative-gen-ui`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `declarative-gen-ui` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,24 @@
# QA — frontend-tools-async
## Scope
Manual QA checklist for the `frontend-tools-async` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/frontend-tools-async`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `frontend-tools-async` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,24 @@
# QA — frontend-tools
## Scope
Manual QA checklist for the `frontend-tools` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/frontend-tools`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `frontend-tools` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,62 @@
# QA: Agentic Generative UI — AWS Strands
## 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 — AWS Strands
## 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,24 @@
# QA — headless-complete
## Scope
Manual QA checklist for the `headless-complete` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/headless-complete`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `headless-complete` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,24 @@
# QA — headless-simple
## Scope
Manual QA checklist for the `headless-simple` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/headless-simple`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `headless-simple` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,24 @@
# QA — hitl-in-app
## Scope
Manual QA checklist for the `hitl-in-app` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/hitl-in-app`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `hitl-in-app` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,57 @@
# QA: Human in the Loop — AWS Strands
## 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,24 @@
# QA — multimodal
## Scope
Manual QA checklist for the `multimodal` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/multimodal`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `multimodal` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,28 @@
# QA — open-gen-ui-advanced
## Scope
Manual QA for the advanced Open Generative UI demo. Builds on open-gen-ui
by adding `openGenerativeUI.sandboxFunctions` (evaluateExpression,
notifyHost) that the agent-authored iframe can invoke via
`Websandbox.connection.remote.<name>(...)`.
## Happy path
- [ ] Navigate to `/demos/open-gen-ui-advanced`.
- [ ] Composer shows three sandbox-function suggestion pills.
- [ ] Click "Calculator (calls evaluateExpression)" — a calculator mounts
in a sandboxed iframe. Press a few digits and `=` — the display
shows the evaluated result.
- [ ] Click "Ping the host (calls notifyHost)" — a card mounts with a
"Say hi to the host" button. Clicking it shows a host-returned
confirmation with a `receivedAt` timestamp.
## Regression
- [ ] Check the browser console for `[open-gen-ui/advanced]` log lines
proving the sandbox -> host round trip fired.
## Known gaps
- Same Strands backend as the minimal variant.
@@ -0,0 +1,29 @@
# QA — open-gen-ui
## Scope
Manual QA for the minimal Open Generative UI demo. The agent emits a
`generateSandboxedUi` tool call on every turn; the runtime's
OpenGenerativeUIMiddleware converts that into activity events that mount
the authored HTML/CSS in a sandboxed iframe.
## Happy path
- [ ] Navigate to `/demos/open-gen-ui`.
- [ ] Composer shows the four visualization suggestion pills.
- [ ] Click "3D axis visualization (model airplane)" — a sandboxed iframe
mounts showing an airplane cycling through pitch/yaw/roll rotations.
- [ ] Click "How a neural network works" — an iframe mounts showing a
layered network with forward-pass activations.
## Regression
- [ ] The rendered scenes include axis labels, a legend, and a title.
- [ ] No console errors from the sandboxed iframe.
## Known gaps
- Strands backend uses the shared agent; the `generateSandboxedUi`
frontend-registered tool is resolved via ag_ui_strands' frontend-tool
proxy. The design skill prompt lives on the frontend via
`openGenerativeUI.designSkill`.
@@ -0,0 +1,24 @@
# QA — prebuilt-popup
## Scope
Manual QA checklist for the `prebuilt-popup` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/prebuilt-popup`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `prebuilt-popup` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,24 @@
# QA — prebuilt-sidebar
## Scope
Manual QA checklist for the `prebuilt-sidebar` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/prebuilt-sidebar`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `prebuilt-sidebar` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,24 @@
# QA — readonly-state-agent-context
## Scope
Manual QA checklist for the `readonly-state-agent-context` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/readonly-state-agent-context`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `readonly-state-agent-context` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,24 @@
# QA — reasoning-default-render
## Scope
Manual QA checklist for the `reasoning-default-render` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/reasoning-default-render`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `reasoning-default-render` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,61 @@
# QA: Shared State (Read + Write) — AWS Strands
## Prerequisites
- Demo is deployed and accessible at `/demos/shared-state-read-write` on the dashboard host
- Agent backend is healthy (`/api/health`); `OPENAI_API_KEY` is set on Railway; the Strands agent server (`agent_server.py`) is reachable at `AGENT_URL`
## Test Steps
### 1. Basic Functionality
- [ ] Navigate to `/demos/shared-state-read-write`; verify the page renders within 3s with the left sidebar (preferences + notes cards) and the right-side `CopilotChat` pane
- [ ] Verify `data-testid="preferences-card"` is visible with heading "Your preferences"
- [ ] Verify `data-testid="notes-card"` is visible with heading "Agent notes" and empty-state `data-testid="notes-empty"` reading "No notes yet. Ask the agent to remember something."
- [ ] Verify the chat input placeholder is "Chat with the agent..."
- [ ] Verify all 3 suggestion pills are visible with verbatim titles: "Greet me", "Remember something", "Plan a weekend"
- [ ] Send "Hello" and verify an assistant text response appears within 10s
### 2. Feature-Specific Checks
#### UI Writes -> Agent Reads (preferences via `agent.setState`)
- [ ] Type "Atai" into `data-testid="pref-name"`; verify `data-testid="pref-state-json"` updates to include `"name": "Atai"`
- [ ] Change `data-testid="pref-tone"` to `formal`; verify the JSON preview reflects `"tone": "formal"`
- [ ] Change `data-testid="pref-language"` to `Spanish`; verify the JSON preview reflects `"language": "Spanish"`
- [ ] Click the `Cooking` and `Travel` interest pills; verify both show the selected style (border `#BEC2FF`, bg `#BEC2FF1A`) and the JSON preview's `interests` array contains both entries
- [ ] Send "What do you know about me?"; verify within 10s the assistant reply references the name "Atai", a formal tone, Spanish, and the Cooking/Travel interests (the `build_state_prompt` Strands `state_context_builder` injects these into the user message each turn)
- [ ] Click the "Plan a weekend" suggestion; verify the reply is tailored to the selected interests
#### Agent Writes -> UI Reads (notes via `set_notes` tool)
- [ ] Click the "Remember something" suggestion (sends "Remember that I prefer morning meetings and that I don't eat dairy.")
- [ ] Within 15s verify `data-testid="notes-list"` appears in the notes card and contains at least 2 `data-testid="note-item"` entries mentioning "morning meetings" and "dairy"
- [ ] Verify `data-testid="notes-empty"` is no longer rendered
- [ ] Send "Also remember I live in Berlin."; verify within 15s the notes list grows (previous notes preserved, new note added) — confirms the agent passes the FULL updated list per `set_notes` contract and the `state_from_args` hook publishes a full snapshot
#### UI Writes Back to Agent-Authored Slice (clear notes)
- [ ] With notes present, verify `data-testid="notes-clear-button"` is visible
- [ ] Click the Clear button; verify the notes list disappears and `data-testid="notes-empty"` re-renders
- [ ] Ask "What do you remember about me?"; verify the agent no longer cites the cleared notes (state was written back by the UI via `agent.setState({ notes: [] })`)
#### Multi-Turn State Persistence
- [ ] Change tone to `playful` and add the `Music` interest; send "Write me a one-line haiku greeting."; verify the reply is playful and references music
- [ ] Send a follow-up "Do it again in French."; verify the reply remains playful, switches to French, and still acknowledges the music interest — confirms preferences persist across turns without being re-sent
- [ ] Reload the page; verify preferences reset to defaults (`tone: casual`, `language: English`, empty interests, empty name) and notes reset to empty (state is per-session, seeded by the page's `useEffect`)
### 3. Error Handling
- [ ] Attempt to send an empty message; verify it is a no-op (no user bubble, no assistant response)
- [ ] Deselect all interests and clear the name; send "Who am I?"; verify the agent answers without crashing (`build_state_prompt` skips injection when `preferences` is empty)
- [ ] Verify DevTools -> Console shows no uncaught errors during any flow above
## Expected Results
- Page loads within 3 seconds; assistant text response within 10 seconds
- Preferences writes are reflected in `pref-state-json` synchronously on change
- Agent-authored notes appear in `notes-card` within 15 seconds of a "remember" prompt, and the full prior list is preserved on subsequent `set_notes` calls (the `notes_state_from_args` hook returns the FULL updated list as a `StateSnapshotEvent`)
- Clear button round-trips UI -> agent state and the agent loses access to the cleared notes on the next turn
- No UI layout breaks, no uncaught console errors
@@ -0,0 +1,75 @@
# QA: Shared State (Reading) — AWS Strands
## 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 — AWS Strands
## 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) — AWS Strands
## 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
@@ -0,0 +1,54 @@
# QA: Sub-Agents — AWS Strands
## Prerequisites
- Demo is deployed and accessible at `/demos/subagents` on the dashboard host
- Agent backend is healthy (`/api/health`); `OPENAI_API_KEY` is set; the Strands agent server (`agent_server.py`) is reachable at `AGENT_URL`
## Test Steps
### 1. Basic Functionality
- [ ] Navigate to `/demos/subagents`; verify the page renders within 3s with a wide delegation log on the left and a `CopilotChat` pane on the right
- [ ] Verify `data-testid="delegation-log"` is visible with heading "Sub-agent delegations"
- [ ] Verify the empty state reads "Ask the supervisor to complete a task. Every sub-agent it calls will appear here."
- [ ] Verify `data-testid="delegation-count"` reads "0 calls"
- [ ] Verify the chat input placeholder is "Give the supervisor a task..."
- [ ] Verify all 3 suggestion pills are visible: "Write a blog post", "Explain a topic", "Summarize a topic"
### 2. Feature-Specific Checks
#### Supervisor delegates to sub-agents (research → write → critique)
- [ ] Click the "Write a blog post" suggestion (sends a research/write/critique sequence prompt)
- [ ] Within 5s verify `data-testid="supervisor-running"` appears next to the heading with the pulsing indicator
- [ ] Within 60s verify `data-testid="delegation-count"` reads at least "3 calls" and at least 3 `data-testid="delegation-entry"` rows are rendered
- [ ] Verify the first entry has the `🔎 Research` badge, a non-empty `Task:` line, and a result body containing 3-5 bullet points
- [ ] Verify a subsequent entry has the `✍️ Writing` badge with a polished paragraph in the result body
- [ ] Verify a subsequent entry has the `🧐 Critique` badge with 2-3 actionable critiques
- [ ] Verify each entry shows status `completed` (green) once the sub-agent has returned
- [ ] Once the supervisor returns a final assistant text message, verify `supervisor-running` disappears
#### Live updates during the run
- [ ] Click the "Explain a topic" suggestion
- [ ] Verify entries appear ONE-AT-A-TIME (the count climbs from 0 → 1 → 2 → 3 over multiple seconds rather than all appearing at once) — this confirms each sub-agent's `state_from_result` hook emits an independent `StateSnapshotEvent`
- [ ] Verify entry numbers (`#1`, `#2`, `#3`) are sequential and stable
#### Multi-turn persistence
- [ ] After the first run completes, send "Now do the same for solar panels." — verify the delegation log GROWS (existing rows kept; new rows appended); the count should continue from where it left off (e.g. "3 calls" → "6 calls")
### 3. Error Handling
- [ ] Send an empty message — verify it is a no-op
- [ ] Send "Hello" (no task to delegate); verify the supervisor responds with a short text reply and NO new delegation entries are added
- [ ] Verify DevTools -> Console shows no uncaught errors during any flow above
## Expected Results
- Page loads within 3 seconds
- First delegation entry appears within 15s of submitting a task; full research → write → critique loop completes within 60s
- Each sub-agent invocation produces exactly one delegation entry with a non-empty `task` and `result`
- Supervisor's final summary references the work that was delegated
- No UI layout breaks, no uncaught console errors
@@ -0,0 +1,24 @@
# QA — tool-rendering-custom-catchall
## Scope
Manual QA checklist for the `tool-rendering-custom-catchall` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/tool-rendering-custom-catchall`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `tool-rendering-custom-catchall` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,24 @@
# QA — tool-rendering-default-catchall
## Scope
Manual QA checklist for the `tool-rendering-default-catchall` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/tool-rendering-default-catchall`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `tool-rendering-default-catchall` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,24 @@
# QA — tool-rendering-reasoning-chain
## Scope
Manual QA checklist for the `tool-rendering-reasoning-chain` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/tool-rendering-reasoning-chain`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `tool-rendering-reasoning-chain` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.
@@ -0,0 +1,61 @@
# QA: Tool Rendering — AWS Strands
## 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
+24
View File
@@ -0,0 +1,24 @@
# QA — voice
## Scope
Manual QA checklist for the `voice` demo in the AWS Strands showcase. The
Strands package reuses a single shared agent for every demo, so this stub
exists primarily to document the human verification path.
## Happy path
- [ ] Navigate to `/demos/voice`.
- [ ] Verify the page renders without console errors.
- [ ] Exercise the demo's primary interaction (see README for the
LangGraph-Python equivalent demo — same user flow).
## Regression
- [ ] No hydration warnings in the browser console.
- [ ] The shared Strands agent responds with text within a few seconds.
## Known gaps
- Port of the LangGraph-Python `voice` demo; backend differentiation is
collapsed into the shared `src/agents/agent.py`.