Feat/group task orchestration - #100
Conversation
- Fix TaskBoard flash on stream completion (show until API data loads) - Add ARIA attributes (role=progressbar, aria-valuenow, region labels) - Add section heading with ClipboardList icon to TaskBoard - Move pulse-border keyframe from inline style to index.css - Memoize API-loaded task board (MemoizedApiTaskBoard component) - Fix tasksCompleted inflation (exclude VERIFIED from completed set) - Fix SSE parser default event type (null instead of group_start) - Protect shared initialState Sets/Maps from accidental mutation - Add missing i18n keys (emptyState, unassigned) to all 11 locales - Use CSS custom properties for theme-aware animation colors
- Add 22 tests for TaskBoard component (empty state, columns, progress bar, priorities, verification, accessibility) - Add 6 tests for SSE hook task events (task_plan_created, task_verified, in-progress tracking, completion, reset, phase guard)
…trings - Fix fragile task-to-agent matching: prefer agentId over displayName with graceful fallback (use-group-discussion-stream.ts, groups.ts) - Add console.warn to all 9 silent catch blocks in SSE event handlers - Replace hardcoded strings with t() calls: LIVE indicator, HTML toggle, flow step labels, entry type labels, Group/Mod badges, lifecycle policies, task count interpolation (3 component files) - Add dotColor field to STYLE_THEME, removing brittle .replace() hack - Add 40+ new i18n keys across groups.* namespace (entryType, flow, lifecycle) to all 11 locale files
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 Walkthrough<review_stack_artifact> WalkthroughAdds task-force discussion contracts, streaming state, task board rendering, configuration UI, localized labels, and test fixtures for the new task plan and verification flow. ChangesTask-force discussion flow
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Pull request overview
Adds first-class support for the new TASK_FORCE group discussion style, including SSE-driven task orchestration state, a kanban-style Task Board in the transcript UI, and broader i18n coverage for group-related labels and entry types.
Changes:
- Introduces TASK_FORCE style across API types, UI theming, phase/entry mappings, and group state handling.
- Adds a Task Board component and wires it into the discussion transcript for both streaming and API-loaded conversations.
- Extends SSE stream state + tests to track task plan creation, execution progress, completion, and verification.
Reviewed changes
Copilot reviewed 25 out of 25 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| src/lib/api/groups.ts | Extends group API types (TASK_FORCE, new phases/entry types, task models) and SSE payload/event definitions. |
| src/hooks/use-group-discussion-stream.ts | Tracks task plan + verification + inferred execution progress during SSE streaming. |
| src/hooks/tests/use-group-discussion-stream.test.ts | Adds coverage for new SSE payload fields and task tracking behavior. |
| src/components/groups/task-board.tsx | New Task Board UI (columns, cards, progress bar) driven by SSE/API-derived task state. |
| src/components/groups/tests/task-board.test.tsx | Adds extensive component tests for Task Board rendering and status bucketing. |
| src/components/groups/discussion-transcript.tsx | Integrates Task Board into transcript (streaming + API-loaded) and updates style theming/flow i18n. |
| src/components/groups/agent-response-card.tsx | Adds TASK_FORCE entry styling/icons and translates entry-type labels. |
| src/components/groups/phase-header.tsx | Adds icons for PLAN/EXECUTE/VERIFY phases. |
| src/components/groups/group-config-panel.tsx | Displays pre-configured tasks + dynamic agent settings and adds i18n wrapping for some labels. |
| src/pages/group-wizard.tsx | Adds TASK_FORCE style color mapping in the wizard. |
| src/pages/group-detail.tsx | Adds UI color mapping for the new AWAITING_APPROVAL state. |
| src/test/mocks/handlers.ts | Updates MSW mock group conversation objects with newly required task/dynamic-agent fields. |
| src/components/groups/tests/discussion-transcript.test.tsx | Updates transcript test fixtures with newly required conversation/stream fields. |
| src/index.css | Adds keyframes for Task Board “active card” pulse border animation. |
| src/i18n/locales/en.json | Adds group/task-board translation keys (styles, phases, entry types, task board labels). |
| src/i18n/locales/de.json | Propagates new group/task-board translation keys. |
| src/i18n/locales/fr.json | Propagates new group/task-board translation keys. |
| src/i18n/locales/es.json | Propagates new group/task-board translation keys. |
| src/i18n/locales/ar.json | Propagates new group/task-board translation keys. |
| src/i18n/locales/zh.json | Propagates new group/task-board translation keys. |
| src/i18n/locales/th.json | Propagates new group/task-board translation keys. |
| src/i18n/locales/pt.json | Propagates new group/task-board translation keys. |
| src/i18n/locales/ko.json | Propagates new group/task-board translation keys. |
| src/i18n/locales/ja.json | Propagates new group/task-board translation keys. |
| src/i18n/locales/hi.json | Propagates new group/task-board translation keys. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…n dynamic agent limits - Pass done/total to taskBoard.progress t() call (fixes raw placeholder) - Pass done/total to aria-label on progress bar (accessibility fix) - Use task.subject+idx as stable React key instead of array index - Wrap dynamic agent max strings in t() with interpolation - Add dynamicMax/dynamicMaxPerTask i18n keys to all 11 locales
There was a problem hiding this comment.
Actionable comments posted: 11
🧹 Nitpick comments (3)
src/lib/api/groups.ts (1)
481-482: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueRedundant yield condition.
Since the left operand
eventTypealready gates the branch,(eventData || eventType)is always truthy and can be dropped — this is equivalent toif (eventType). Simplifying matches the stated intent ("only yield events with an explicitevent:type").♻️ Suggested simplification
- // Only yield events with an explicit event: type (skip bare data-only chunks) - if (eventType && (eventData || eventType)) { + // Only yield events with an explicit event: type (skip bare data-only chunks) + if (eventType) {🤖 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 `@src/lib/api/groups.ts` around lines 481 - 482, The yield guard in groups parsing is redundant because `eventType` already decides the branch, so simplify the condition in the event-stream handling logic to check only for an explicit `event:` type. Update the `eventType` conditional in the relevant parser block so it matches the intent of only yielding typed events and removes the unnecessary `eventData || eventType` part.src/hooks/use-group-discussion-stream.ts (1)
327-341: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueRedundant identity mapping over
payload.tasks.The
maponly spreads each task and re-assignsassignedAgentIdto itself, producing an equivalent array. You can storepayload.tasksdirectly (the element shape already matchestaskPlan).♻️ Suggested simplification
- setState((s) => ({ - ...s, - taskPlan: payload.tasks.map((t) => ({ - ...t, - assignedAgentId: t.assignedAgentId, - })), - })); + setState((s) => ({ + ...s, + taskPlan: payload.tasks, + }));🤖 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 `@src/hooks/use-group-discussion-stream.ts` around lines 327 - 341, The task_plan_created handler in useGroupDiscussionStream is doing a redundant identity map over payload.tasks by spreading each task and reassigning assignedAgentId to itself. Simplify the state update by storing payload.tasks directly in taskPlan, keeping the existing JSON.parse and console.warn error handling intact.src/components/groups/__tests__/task-board.test.tsx (1)
137-141: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winPrefer
data-testidhooks over class-name / DOM-structure assertions.These assertions couple the tests to Tailwind class names and DOM shape:
querySelector(".animate-spin"),feedbackEl.className.toMatch(/emerald/)//destructive/, and.parentElementtraversal. A styling refactor (e.g. the gradient/class fix flagged intask-board.tsx) would break these tests without any behavior change. Consider exposing intent via stabledata-testids (e.g. atask-board-spinnerand atask-card-feedbackwith adata-passedattribute) and asserting on those instead.As per path instructions: "Assert on
data-testidattributes in unit tests instead of relying on rendered text or DOM structure".Also applies to: 181-184, 209-213
🤖 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 `@src/components/groups/__tests__/task-board.test.tsx` around lines 137 - 141, The task-board tests are asserting on Tailwind classes and DOM structure instead of stable test hooks, which makes them brittle. Update the affected checks in task-board.test.tsx to use explicit data-testid or other intent-revealing attributes exposed by the task board and task card components, and replace the .animate-spin, className regex, and parentElement-based assertions with direct assertions against those stable hooks. Use the existing task-board-progress test target plus new identifiers like task-board-spinner and task-card-feedback (or equivalent symbols added in the components) so the tests verify behavior without depending on styling or layout.Source: Path instructions
🤖 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.
Inline comments:
In `@src/components/groups/task-board.tsx`:
- Around line 238-241: The progress fill in the task board uses an outdated
Tailwind background utility, so update the gradient class on the inline progress
bar div in task-board.tsx from bg-gradient-to-r to bg-linear-to-r. Locate the
element by the width style using pct in the task board component and keep the
rest of the gradient and sizing classes unchanged.
In `@src/i18n/locales/ar.json`:
- Around line 1392-1469: The new task-force UI strings in ar.json are still
English, so the Arabic locale is incomplete. Replace the added
task-board/task-force values in the ar locale with proper Arabic translations,
using the same keys and structure already present in the locale object. Make
sure the keys from the new block, including task-state, lifecycle,
dynamic-agent, and taskBoard entries, are localized consistently with the rest
of the file.
In `@src/i18n/locales/de.json`:
- Around line 1394-1469: The German locale entries for the new task-force UI are
still using English text, so translate the newly added strings in the locale
object that contains state, flow, lifecycle, and taskBoard labels. Update the
matching keys in the German JSON to proper German values, using the existing
translation structure and symbols like entryType, flow, lifecycle, and taskBoard
as anchors. Also make sure these keys stay aligned with the base English locale
and are propagated consistently across the other locale files added for the same
feature set.
In `@src/i18n/locales/es.json`:
- Around line 1393-1469: The new task-force and task-board strings in the
Spanish locale are still English, so update the affected keys in the locale
object (including entryType, flow, lifecycle, taskBoard, and related labels) to
proper Spanish translations instead of copying the source text. Use the existing
i18n key names in es.json as the reference point, and make sure any newly added
keys are kept consistent with en.json and the other locale files so the UI does
not render mixed-language copy.
In `@src/i18n/locales/fr.json`:
- Around line 1393-1453: The new task-force localization entries are still using
English placeholders in the French locale, so update the added groups.* and
taskBoard.* keys in fr.json to proper French translations. Mirror the same key
set added in en.json across the locale object where these strings live, using
the existing translation patterns in related sections like flow and lifecycle as
a guide.
In `@src/i18n/locales/hi.json`:
- Around line 1392-1453: The Hindi locale block still contains English
placeholders for the new task-force flow, so translate the newly added keys to
Hindi in hi.json and keep the wording consistent with the existing locale style.
Update the full set of symbols in this section, including maxRounds,
styleTaskForce, phasePlan/phaseExecute/phaseVerify, dynamicAgents and related
dynamic* labels, entryType, flow, lifecycle, and the dynamicMax strings, so the
locale matches the new keys added in en.json.
In `@src/i18n/locales/ja.json`:
- Around line 1392-1453: The Japanese locale update is incomplete: new
flow-related keys added in en.json are still using English placeholders in the
ja.json translation block. Update the corresponding entries in the ja.json
locale object for the task-force labels, phases, flow names, and task-board copy
so they are properly localized and match the existing key structure used by the
locale files.
In `@src/i18n/locales/ko.json`:
- Around line 1392-1453: The new Korean locale entries are still left in
English, so update the newly added translation keys for the task-force UI to
match the rest of the locale file. Propagate the `groups` and `taskBoard`
strings from `en.json` into the Korean locale and translate them consistently
with the existing `entryType`, `flow`, and `lifecycle` sections so `ko.json`
stays aligned with the other locale files.
In `@src/i18n/locales/pt.json`:
- Around line 1392-1453: The Portuguese locale bundle is still using English
strings for the new task-force UI, so mirror the new keys from the en.json
update into the pt.json translation object. Update the affected task-force
labels and board/status strings in the locale structure that contains maxRounds,
preConfiguredTasks, entryType, flow, lifecycle, and the dynamicMax fields,
keeping the same key names and nesting.
In `@src/i18n/locales/th.json`:
- Around line 1392-1453: The new task-board and flow keys in th.json are still
using English placeholders, so replace them with real Thai translations for the
same locale keys added in en.json. Update the matching entries under entryType,
flow, lifecycle, and the related task-board strings (such as maxRounds,
dynamicAgents, preConfiguredTasksCount, dynamicMax, and dynamicMaxPerTask) so
Thai users see localized copy. Keep the key structure and names unchanged to
match the other locale files and the source strings.
In `@src/i18n/locales/zh.json`:
- Around line 1392-1469: The new task-force/task-board localization strings in
zh.json are still in English, so update those keys with proper Chinese
translations and keep the key set aligned with the rest of the locales. Use the
task-board/configuration entries in the same JSON block (for example maxRounds,
styleTaskForce, phaseExecute, taskBoard.title, taskBoard.emptyTitle) as the
reference set, and ensure any new i18n keys were first added to en.json before
mirroring them across all locale files.
---
Nitpick comments:
In `@src/components/groups/__tests__/task-board.test.tsx`:
- Around line 137-141: The task-board tests are asserting on Tailwind classes
and DOM structure instead of stable test hooks, which makes them brittle. Update
the affected checks in task-board.test.tsx to use explicit data-testid or other
intent-revealing attributes exposed by the task board and task card components,
and replace the .animate-spin, className regex, and parentElement-based
assertions with direct assertions against those stable hooks. Use the existing
task-board-progress test target plus new identifiers like task-board-spinner and
task-card-feedback (or equivalent symbols added in the components) so the tests
verify behavior without depending on styling or layout.
In `@src/hooks/use-group-discussion-stream.ts`:
- Around line 327-341: The task_plan_created handler in useGroupDiscussionStream
is doing a redundant identity map over payload.tasks by spreading each task and
reassigning assignedAgentId to itself. Simplify the state update by storing
payload.tasks directly in taskPlan, keeping the existing JSON.parse and
console.warn error handling intact.
In `@src/lib/api/groups.ts`:
- Around line 481-482: The yield guard in groups parsing is redundant because
`eventType` already decides the branch, so simplify the condition in the
event-stream handling logic to check only for an explicit `event:` type. Update
the `eventType` conditional in the relevant parser block so it matches the
intent of only yielding typed events and removes the unnecessary `eventData ||
eventType` part.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 8069c759-baae-4498-bbaa-a1f31a36b931
📒 Files selected for processing (25)
src/components/groups/__tests__/discussion-transcript.test.tsxsrc/components/groups/__tests__/task-board.test.tsxsrc/components/groups/agent-response-card.tsxsrc/components/groups/discussion-transcript.tsxsrc/components/groups/group-config-panel.tsxsrc/components/groups/phase-header.tsxsrc/components/groups/task-board.tsxsrc/hooks/__tests__/use-group-discussion-stream.test.tssrc/hooks/use-group-discussion-stream.tssrc/i18n/locales/ar.jsonsrc/i18n/locales/de.jsonsrc/i18n/locales/en.jsonsrc/i18n/locales/es.jsonsrc/i18n/locales/fr.jsonsrc/i18n/locales/hi.jsonsrc/i18n/locales/ja.jsonsrc/i18n/locales/ko.jsonsrc/i18n/locales/pt.jsonsrc/i18n/locales/th.jsonsrc/i18n/locales/zh.jsonsrc/index.csssrc/lib/api/groups.tssrc/pages/group-detail.tsxsrc/pages/group-wizard.tsxsrc/test/mocks/handlers.ts
…ogic, translate all locales - Replace bg-gradient-to-r with bg-linear-to-r (Tailwind v4 syntax) - Simplify redundant yield condition in SSE parser (groups.ts) - Remove identity mapping in task_plan_created handler - Translate all groups.* and taskBoard.* keys for 10 locales: de, fr, es, pt, ar, zh, ja, ko, th, hi
… label fix - Normalise CRLF to LF in SSE parser so \r\n\r\n boundaries are detected - Support both groupConversationId and conversationId in group_start payload for backwards compatibility with older backends - Fix DELPHI flow label: 'Anonymous' → 'Anonymous Sharing' to match the groups.flow.AnonymousSharing i18n key
- Groups overview card: show member preview chips with Bot/Group icons - Groups overview table: replace ID/Version columns with Style/Members - Table rows: fully clickable with keyboard accessibility (Enter/Space) - Conversation sidebar: new entry appears immediately on stream start (invalidate on IN_PROGRESS, not just COMPLETED) - Conversation sidebar: show LIVE badge with pulse indicator on streaming - State labels: human-friendly translated text instead of raw enums (e.g. 'In Progress' not 'IN_PROGRESS') - Accessibility: aria-label, aria-live, aria-current, role=list/listitem, tabIndex, keyboard navigation, aria-hidden on icons - i18n: add styleColumn, membersColumn, memberOverflow, defaultLabel, liveDiscussion, state.* keys to all 11 locales - Tests: 79 new/updated tests across 3 files (group-card, groups, group-detail)
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (3)
src/pages/__tests__/groups.test.tsx (1)
131-137: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winSwitch these table-view assertions to stable testids.
The new coverage is still tied to localized text and DOM shape (
getByText("Style"), role/class checks, direct querying). That makes the tests fragile as copy and presentation evolve. Please preferdata-testid-based assertions for the new headers and row metadata. As per coding guidelines,Assert on \data-testid` attributes in unit tests instead of relying on rendered text or DOM structure`.Also applies to: 465-623
🤖 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 `@src/pages/__tests__/groups.test.tsx` around lines 131 - 137, The new group table assertions in groups.test.tsx are still relying on rendered text and DOM structure, which makes them brittle. Update the coverage around the table headers and row metadata to use stable data-testid-based queries/assertions instead of getByText and role/class-based checks. Keep the existing test intent, but locate the affected cases in the new table-view coverage and switch them to the relevant testid hooks so they remain stable as copy and markup change.Source: Coding guidelines
src/pages/__tests__/group-detail.test.tsx (1)
207-207: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAvoid asserting localized copy and Tailwind classes for conversation state.
These checks are now coupled to English labels (
"Completed","In Progress","Failed") and presentation classes liketext-destructive/rounded-full. Please assert through the existing state testids instead, and expose a stable data attribute if you need to verify the mapped state value. As per coding guidelines,Assert on \data-testid` attributes in unit tests instead of relying on rendered text or DOM structure`.Also applies to: 308-381
🤖 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 `@src/pages/__tests__/group-detail.test.tsx` at line 207, The conversation state tests are asserting localized labels and Tailwind styling, which makes them brittle and tied to presentation. Update the group detail tests to use the existing state testids instead of matching text like “Completed”, “In Progress”, or “Failed”, and avoid checking classes such as text-destructive or rounded-full. If the mapped state value still needs verification, add a stable data attribute on the relevant state-rendering element and assert against that in the affected tests in group-detail.test.tsx.Source: Coding guidelines
src/components/groups/__tests__/group-card.test.tsx (1)
137-259: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winPrefer testid-based assertions for these new cases.
These additions are mostly pinned to translated copy and raw DOM structure (
getByText,querySelector("svg"), link traversal), which will churn on locale or markup-only changes. Please anchor them to explicitdata-testidhooks instead. As per coding guidelines,Assert on \data-testid` attributes in unit tests instead of relying on rendered text or DOM structure`.🤖 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 `@src/components/groups/__tests__/group-card.test.tsx` around lines 137 - 259, The new GroupCard tests are too coupled to translated text and raw DOM structure, so switch them to explicit data-testid-based assertions. Update the cases in GroupCard’s test suite to target existing or added testid hooks for style badges, member chips, overflow text, the group name link, and relative time instead of getByText, closest("a"), or querySelector("svg"). Keep the assertions anchored to stable symbols like GroupCard, renderWithProviders, and the member/list elements via data-testid.Source: Coding guidelines
🤖 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.
Inline comments:
In `@src/pages/groups.tsx`:
- Around line 197-208: The row-level navigation in the groups table is still
handling Enter/Space from nested controls, so keyboard interaction on the inner
Link and duplicate/delete buttons can trigger row navigation. Update the row
onKeyDown handler and the nested control handlers in the groups row markup to
ignore events originating from interactive descendants, matching the existing
stopPropagation behavior used by onClick. Use the row wrapper and the nested
Link/button elements in the group row render paths to keep keyboard activation
scoped to the intended control.
---
Nitpick comments:
In `@src/components/groups/__tests__/group-card.test.tsx`:
- Around line 137-259: The new GroupCard tests are too coupled to translated
text and raw DOM structure, so switch them to explicit data-testid-based
assertions. Update the cases in GroupCard’s test suite to target existing or
added testid hooks for style badges, member chips, overflow text, the group name
link, and relative time instead of getByText, closest("a"), or
querySelector("svg"). Keep the assertions anchored to stable symbols like
GroupCard, renderWithProviders, and the member/list elements via data-testid.
In `@src/pages/__tests__/group-detail.test.tsx`:
- Line 207: The conversation state tests are asserting localized labels and
Tailwind styling, which makes them brittle and tied to presentation. Update the
group detail tests to use the existing state testids instead of matching text
like “Completed”, “In Progress”, or “Failed”, and avoid checking classes such as
text-destructive or rounded-full. If the mapped state value still needs
verification, add a stable data attribute on the relevant state-rendering
element and assert against that in the affected tests in group-detail.test.tsx.
In `@src/pages/__tests__/groups.test.tsx`:
- Around line 131-137: The new group table assertions in groups.test.tsx are
still relying on rendered text and DOM structure, which makes them brittle.
Update the coverage around the table headers and row metadata to use stable
data-testid-based queries/assertions instead of getByText and role/class-based
checks. Keep the existing test intent, but locate the affected cases in the new
table-view coverage and switch them to the relevant testid hooks so they remain
stable as copy and markup change.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 285377f9-1a89-4dc7-a744-b81be79d3a41
📒 Files selected for processing (20)
src/components/groups/__tests__/group-card.test.tsxsrc/components/groups/discussion-transcript.tsxsrc/components/groups/group-card.tsxsrc/hooks/use-group-discussion-stream.tssrc/i18n/locales/ar.jsonsrc/i18n/locales/de.jsonsrc/i18n/locales/en.jsonsrc/i18n/locales/es.jsonsrc/i18n/locales/fr.jsonsrc/i18n/locales/hi.jsonsrc/i18n/locales/ja.jsonsrc/i18n/locales/ko.jsonsrc/i18n/locales/pt.jsonsrc/i18n/locales/th.jsonsrc/i18n/locales/zh.jsonsrc/lib/api/groups.tssrc/pages/__tests__/group-detail.test.tsxsrc/pages/__tests__/groups.test.tsxsrc/pages/group-detail.tsxsrc/pages/groups.tsx
🚧 Files skipped from review as they are similar to previous changes (14)
- src/i18n/locales/ja.json
- src/i18n/locales/en.json
- src/i18n/locales/ar.json
- src/i18n/locales/de.json
- src/i18n/locales/th.json
- src/i18n/locales/ko.json
- src/i18n/locales/es.json
- src/i18n/locales/hi.json
- src/i18n/locales/fr.json
- src/i18n/locales/pt.json
- src/i18n/locales/zh.json
- src/hooks/use-group-discussion-stream.ts
- src/components/groups/discussion-transcript.tsx
- src/lib/api/groups.ts
- Add Task Force preset to group-templates.ts (🎯 icon, TASK_FORCE style) - Roles: Project Lead, Researcher, Implementer, Quality Assurance - Add i18n keys (taskForce, taskForceDesc, 4 role names) to all 11 locales - Wizard now shows 6 templates instead of 5
- Add aria-label to card context menu button - Add aria-label to table duplicate/delete buttons - Add aria-label to conversation sidebar delete button - Use members.length for table count (consistent with card view)
- Expand from 3 to 8 mock groups covering all 6 discussion styles - Each group has unique members, roles, and realistic descriptions - Groups grp7 and grp8 include GROUP-type members (nested groups) - Per-group conversation history (1-3 conversations each, varied states) - Add TASK_FORCE to styles mock endpoint - GET handler now returns per-ID config instead of single hardcoded response - Fix empty-state tests with server.use override
- Extract DEFAULT_STATE constant so fallback is a definite type - Removes undefined possibility from Record<string, T> indexed access - Remove debug console.log from MSW handlers
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 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.
Inline comments:
In `@src/lib/group-templates.ts`:
- Around line 107-116: The task-force template strings in groupTemplates are
using bare t(...) lookups, so missing locale entries will show raw keys in the
UI. Update the task-force block in the group template definition to use inline
fallback values for the name, description, and each role label, keeping the
existing translation keys but providing readable defaults when translations are
absent.
In `@src/test/mocks/handlers.ts`:
- Around line 2081-2083: The mock handlers are falling back to default data for
unknown group IDs, which hides invalid route params in tests. Update the
relevant handler logic in handlers.ts around the group config lookup and the
group list lookup so they validate the requested id against the available mock
keys and return an explicit 404 response when the id is not found, instead of
defaulting to grp1 or an empty array.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 76f124cd-6f9d-4084-97fc-489e5021bbac
📒 Files selected for processing (17)
src/components/groups/group-card.tsxsrc/i18n/locales/ar.jsonsrc/i18n/locales/de.jsonsrc/i18n/locales/en.jsonsrc/i18n/locales/es.jsonsrc/i18n/locales/fr.jsonsrc/i18n/locales/hi.jsonsrc/i18n/locales/ja.jsonsrc/i18n/locales/ko.jsonsrc/i18n/locales/pt.jsonsrc/i18n/locales/th.jsonsrc/i18n/locales/zh.jsonsrc/lib/group-templates.tssrc/pages/__tests__/group-detail.test.tsxsrc/pages/group-detail.tsxsrc/pages/groups.tsxsrc/test/mocks/handlers.ts
✅ Files skipped from review due to trivial changes (2)
- src/i18n/locales/hi.json
- src/i18n/locales/es.json
🚧 Files skipped from review as they are similar to previous changes (7)
- src/pages/tests/group-detail.test.tsx
- src/components/groups/group-card.tsx
- src/i18n/locales/de.json
- src/pages/group-detail.tsx
- src/i18n/locales/th.json
- src/i18n/locales/pt.json
- src/pages/groups.tsx
| name: t("groupTemplates.taskForce"), | ||
| description: t("groupTemplates.taskForceDesc"), | ||
| icon: "🎯", | ||
| style: "TASK_FORCE", | ||
| maxRounds: 1, | ||
| roles: [ | ||
| { displayName: t("groupTemplates.roles.projectLead"), role: "Lead" }, | ||
| { displayName: t("groupTemplates.roles.researcher"), role: "Research" }, | ||
| { displayName: t("groupTemplates.roles.implementer"), role: "Implementation" }, | ||
| { displayName: t("groupTemplates.roles.qualityAssurance"), role: "QA" }, |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Inspect the target file around the changed block
FILE="src/lib/group-templates.ts"
nl -ba "$FILE" | sed -n '90,130p'
# Look for i18n usage patterns with fallbacks in the repo
rg -n 't\("([^"]+)",\s*"[^"]+"\)' src --glob '*.{ts,tsx}' | sed -n '1,120p'
# Look for bare t(...) calls in similar files for context
rg -n 't\("([^"]+)"\)' src/lib --glob '*.{ts,tsx}' | sed -n '1,160p'Repository: labsai/EDDI-Manager
Length of output: 197
🏁 Script executed:
#!/bin/bash
set -euo pipefail
FILE="src/lib/group-templates.ts"
# Show the relevant section with portable line numbering
sed -n '90,130p' "$FILE" | cat -n
# Show all i18n calls in this file
rg -n 't\("' "$FILE"
# Show nearby uses of t(...) in related code for fallback style
rg -n 't\(".*?",\s*".*?"\)' src --glob '*.{ts,tsx}' | sed -n '1,120p'Repository: labsai/EDDI-Manager
Length of output: 17180
Add inline fallbacks to the new group-template translations. The task-force block adds bare t(...) calls for the template name, description, and role labels; missing locale entries will surface raw keys in the UI.
🤖 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 `@src/lib/group-templates.ts` around lines 107 - 116, The task-force template
strings in groupTemplates are using bare t(...) lookups, so missing locale
entries will show raw keys in the UI. Update the task-force block in the group
template definition to use inline fallback values for the name, description, and
each role label, keeping the existing translation keys but providing readable
defaults when translations are absent.
Source: Coding guidelines
| const id = params.id as string; | ||
| const config = groupConfigs[id] ?? groupConfigs.grp1; | ||
| return HttpResponse.json(config); |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Return 404s for unknown mock IDs.
Line 2082 falls back to grp1, and Line 2151 falls back to []. That makes bad route params look valid in tests, so wiring bugs can slip through unnoticed. Prefer an explicit 404 for unknown group ids.
Suggested fix
http.get("*/groupstore/groups/:id", ({ params }) => {
const groupConfigs: Record<string, object> = {
// ...
};
const id = params.id as string;
- const config = groupConfigs[id] ?? groupConfigs.grp1;
- return HttpResponse.json(config);
+ const config = groupConfigs[id];
+ if (!config) {
+ return HttpResponse.json({ error: `Unknown group id: ${id}` }, { status: 404 });
+ }
+ return HttpResponse.json(config);
});
http.get("*/groups/:groupId/conversations", ({ params }) => {
const now = Date.now();
const groupConversations: Record<string, object[]> = {
// ...
};
const id = params.groupId as string;
- return HttpResponse.json(groupConversations[id] ?? []);
+ const conversations = groupConversations[id];
+ if (!conversations) {
+ return HttpResponse.json({ error: `Unknown group id: ${id}` }, { status: 404 });
+ }
+ return HttpResponse.json(conversations);
}),Also applies to: 2150-2151
🤖 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 `@src/test/mocks/handlers.ts` around lines 2081 - 2083, The mock handlers are
falling back to default data for unknown group IDs, which hides invalid route
params in tests. Update the relevant handler logic in handlers.ts around the
group config lookup and the group list lookup so they validate the requested id
against the available mock keys and return an explicit 404 response when the id
is not found, instead of defaulting to grp1 or an empty array.
- Sort by Name (alphabetical), Style, Members (count), Modified (date) - Default sort: Modified descending (newest first) - Clickable column headers with ArrowUp/ArrowDown/ArrowUpDown indicators - Full aria-sort and aria-label accessibility - Follows agents page pattern (useMemo sort + toggleSort callback) - Sorting also applies to card view ordering
- Detect JSON array task plans in PLAN entries and render as a numbered task list with subject, description, assignee, and priority badge instead of showing raw JSON - Move Task Board from inline (after all phases) to the top of the scroll area for better visibility and context - Add ListOrdered and User2 icons for task plan formatting
- Task card: subject wraps to 2 lines (line-clamp-2) instead of truncating - Task card: show description when available (line-clamp-2) - Task card: show displayName or full assignedTo (CSS truncate for overflow) - Task Board: collapsible toggle (chevron) with localStorage persistence - Task Board: progress bar always visible when collapsed - Groups sort: persist sortField + sortDir to localStorage across navigation - Add description and displayName to Task interface
- Generalize tryParseTaskPlan → tryParseStructuredItems - Detect JSON arrays on PLAN, VERIFICATION, and TASK_RESULT entries - Verification items show ✅/❌ icons with pass/fail coloring + feedback - Plan items show numbered badges with assignee + priority - Eliminates raw JSON display for all moderator structured outputs
- Previously only checked PLAN/VERIFICATION/TASK_RESULT entries - Now tries to parse structured JSON from ANY entry content - If content is a JSON array with 'subject' fields, render as cards - Catches all edge cases regardless of backend type values
- Center expand icon vertically in input textarea (inset-y-0 my-auto) - Add pb-4 bottom padding to Delete Group button section - Add PanelLeftClose/PanelLeftOpen toggle for discussions sidebar - Follows same pattern as config panel toggle
…utput) - Extract JSON array from anywhere in content (not just start) - 3-tier fallback: standard parse → collapse whitespace → escape newlines in strings - Handles unescaped newlines in string values from LLM output - Handles JSON embedded within wrapper text - Remove debug logging
…ovements - Add collapsible Advanced Protocol Settings to creation wizard (timeout, retries, failure/unavailable policies, maxTurns) - Add style-specific info hints for all 8 styles (ROUND_TABLE, DEBATE, DEVIL_ADVOCATE, PEER_REVIEW, DELPHI, TASK_FORCE, CUSTOM) - Enable CUSTOM style in wizard (previously filtered out) - Pass all protocol settings to ReviewStep with dynamic rendering - Reset protocol state in resetAndClose and selectTemplate - Config panel: show maxTurns, speakingOrder badges, enhanced phase flow with turn order icons and context scope labels - Config panel: show allowedModels and inheritParentModel in dynamic agents section - Format raw enum values as human-friendly labels (Skip vs SKIP) - Add requiresApproval field to DiscussionPhase TS type - Fix lifecycle policy i18n keys to match actual TS enum values - Add 20+ i18n keys to en.json - Add aria-label to close button for accessibility
- taskBoard: showMore, showLess (2 keys) - groupWizard: 19 protocol/hint keys (advancedSettings, agentTimeout, maxRetries, policies, style hints, protocolSummary) - groups.lifecycle: replace stale DISCUSSION_SCOPED/PERSISTENT with KEEP_DEPLOYED/UNDEPLOY_ONLY/AGENT_DECIDES - groups: 9 config panel keys (protocolMaxTurns, speakingOrderTooltip, allowedModels, inheritParentModel, enabled/disabled, turnOrderSequential/Parallel, requiresApproval) Locales: ar, de, es, fr, hi, ja, ko, pt, th, zh
| const turnLabel = phase.turnOrder === "PARALLEL" | ||
| ? t("groups.turnOrderParallel", "parallel") | ||
| : t("groups.turnOrderSequential", "sequential"); | ||
| const scopeLabel = CONTEXT_SCOPE_LABELS[phase.contextScope] || phase.contextScope.toLowerCase(); |
| <InfoRow label={t("groups.protocolOnFailure", "On Failure")} value={config.protocol.onAgentFailure.charAt(0) + config.protocol.onAgentFailure.slice(1).toLowerCase()} /> | ||
| <InfoRow label={t("groups.protocolMaxRetries", "Max Retries")} value={String(config.protocol.maxRetries)} /> | ||
| <InfoRow label={t("groups.protocolUnavailable", "Unavailable")} value={config.protocol.onMemberUnavailable} /> | ||
| <InfoRow label={t("groups.protocolUnavailable", "Unavailable")} value={config.protocol.onMemberUnavailable.charAt(0) + config.protocol.onMemberUnavailable.slice(1).toLowerCase()} /> |
| </div> | ||
| <div className="grid grid-cols-2 gap-x-4 gap-y-1 text-[10px]"> | ||
| <span className="text-muted-foreground">{t("groupWizard.onAgentFailure", "On Agent Failure")}</span> | ||
| <span className="font-medium">{onAgentFailure.toLowerCase().replace(/_/g, " ")}</span> |
| <span className="text-muted-foreground">{t("groupWizard.maxRetries", "Max Retries")}</span> | ||
| <span className="font-medium">{maxRetries}</span> | ||
| <span className="text-muted-foreground">{t("groupWizard.onMemberUnavailable", "On Member Unavailable")}</span> | ||
| <span className="font-medium">{onMemberUnavailable.toLowerCase().replace(/_/g, " ")}</span> |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 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.
Inline comments:
In `@src/components/groups/agent-response-card.tsx`:
- Line 244: The item-count text in AgentResponseCard is hardcoded in English, so
localize it with an i18n call instead of using the inline ternary in
agent-response-card.tsx. Update the structuredItems length label in the
AgentResponseCard render path to use t(...) with an inline fallback and
pluralized forms, and add the corresponding translation key with _one/_other
variants so the label is translatable across locales.
- Around line 156-157: Gate the structured-item parsing in AgentResponseCard to
task-style entries only, since the current tryParseStructuredItems call can
misclassify OPINION and ARGUMENT messages that merely contain a JSON array with
a subject field. Update the parsing flow in agent-response-card.tsx around the
structuredItems logic to check the entry type before attempting structured
parsing, and only fall back to rendering the raw body for non-task entries so
the original message content is preserved.
In `@src/lib/__tests__/group-templates.test.ts`:
- Around line 49-50: The inline count breakdown in group-templates.test is
inconsistent with the assertion: the documented totals for advisory, code, risk,
forecast, debate, and task-force add up to 34, not 35. Update the comment beside
the expect(spyT).toHaveBeenCalledTimes assertion so it matches the actual call
count, or, if the test behavior is wrong, adjust the assertion to match the real
total; use the existing expect(spyT) call and the listed terms to verify the
correct count.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: a0e62ab2-9473-458b-ac58-dc3747568383
📒 Files selected for processing (22)
src/components/groups/__tests__/group-config-panel.test.tsxsrc/components/groups/agent-response-card.tsxsrc/components/groups/create-group-dialog.tsxsrc/components/groups/discussion-input.tsxsrc/components/groups/discussion-transcript.tsxsrc/components/groups/group-config-panel.tsxsrc/components/groups/task-board.tsxsrc/i18n/locales/ar.jsonsrc/i18n/locales/de.jsonsrc/i18n/locales/en.jsonsrc/i18n/locales/es.jsonsrc/i18n/locales/fr.jsonsrc/i18n/locales/hi.jsonsrc/i18n/locales/ja.jsonsrc/i18n/locales/ko.jsonsrc/i18n/locales/pt.jsonsrc/i18n/locales/th.jsonsrc/i18n/locales/zh.jsonsrc/lib/__tests__/group-templates.test.tssrc/lib/api/groups.tssrc/pages/group-detail.tsxsrc/pages/groups.tsx
✅ Files skipped from review due to trivial changes (3)
- src/components/groups/discussion-input.tsx
- src/i18n/locales/de.json
- src/i18n/locales/pt.json
🚧 Files skipped from review as they are similar to previous changes (5)
- src/i18n/locales/fr.json
- src/i18n/locales/ja.json
- src/components/groups/group-config-panel.tsx
- src/lib/api/groups.ts
- src/components/groups/discussion-transcript.tsx
| // Try parsing as structured JSON array — check both raw and unwrapped content (no type gate) | ||
| const structuredItems = tryParseStructuredItems(entry.content) ?? tryParseStructuredItems(parsedContent); |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n## File outline\n'
ast-grep outline src/components/groups/agent-response-card.tsx --view expanded || true
printf '\n## Relevant slices\n'
nl -ba src/components/groups/agent-response-card.tsx | sed -n '1,260p'
printf '\n## Search for parser and type gates\n'
rg -n "tryParseStructuredItems|isPlan|isVerification|isTaskResult|entry\.type|OPINION|ARGUMENT|structuredItems" src/components/groups/agent-response-card.tsx src -g '!**/*.map' || trueRepository: labsai/EDDI-Manager
Length of output: 1365
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n## agent-response-card.tsx around parser and render logic\n'
sed -n '90,240p' src/components/groups/agent-response-card.tsx | cat -n
printf '\n## usage search\n'
rg -n "tryParseStructuredItems\\(|structuredItems|isPlan|isVerification|isTaskResult|entry\\.type" src/components/groups/agent-response-card.tsx src -g '!**/*.map' || trueRepository: labsai/EDDI-Manager
Length of output: 12539
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n## TranscriptEntryType and entry-type definitions\n'
rg -n "type TranscriptEntryType|interface TranscriptEntry|enum .*TranscriptEntryType|OPINION|ARGUMENT" src -g '!**/*.map' || true
printf '\n## AgentResponseCard usages\n'
rg -n "AgentResponseCard" src -g '!**/*.map' || trueRepository: labsai/EDDI-Manager
Length of output: 11939
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n## agent-response-card tests around structured items\n'
sed -n '1,240p' src/components/groups/__tests__/agent-response-card.test.tsx | cat -n
printf '\n## discussion-transcript usage around AgentResponseCard\n'
sed -n '390,460p' src/components/groups/discussion-transcript.tsx | cat -nRepository: labsai/EDDI-Manager
Length of output: 10702
Gate structured-item parsing to task-style entries. AgentResponseCard also renders OPINION and ARGUMENT messages, so any ordinary response that happens to contain a JSON array with a subject field will be shown as a structured list and its original body will be dropped. src/components/groups/agent-response-card.tsx:156-157
🤖 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 `@src/components/groups/agent-response-card.tsx` around lines 156 - 157, Gate
the structured-item parsing in AgentResponseCard to task-style entries only,
since the current tryParseStructuredItems call can misclassify OPINION and
ARGUMENT messages that merely contain a JSON array with a subject field. Update
the parsing flow in agent-response-card.tsx around the structuredItems logic to
check the entry type before attempting structured parsing, and only fall back to
rendering the raw body for non-task entries so the original message content is
preserved.
- Fix invalid Tailwind h-4.5/w-4.5 classes → h-4/w-4 on verdict icons - Route 'item'/'items' through t() instead of hardcoded English - Route context scope labels through t() with i18n keys - Route protocol policy values through translated groupWizard.policy* keys in both config panel and wizard review step - Add groups.contextScope.* and groups.item/items i18n keys - Propagate all new keys to all 10 non-English locales - Bump version to 6.2.0
- Task plan descriptions and verification feedback now clamp to 2 lines with a 'show more/less' toggle for text >100 chars - Uses new ExpandableText helper component in agent-response-card
UX improvements: - Panel toggle buttons moved from header into respective panel headers (close icon in each panel's header bar) - When a panel is hidden, a slim re-open strip appears at the edge - Config panel now has a 'Configuration' header with close button Delete improvements: - Add 'Delete Group Only' button (keeps member agents) - Existing 'Delete Group + All Agents' retained as destructive option - Confirmation dialog adapts message based on which delete was chosen - Uses existing useDeleteGroup hook for group-only deletion Also: - Pre-configured tasks now render as structured items in PLAN entries instead of just showing 'Pre-configured task plan: N tasks' - Add show more/less toggle for moderator structured item descriptions - Add i18n keys for new UI labels
- Add i18n quality gate to AGENTS.md: keys must be propagated to all 11 locales in the same commit, never as a follow-up - Propagate 7 new keys to all 10 non-English locales: configuration, deleteGroupOnly, deleteGroupOnlySuccess, deleteGroupOnlyWarning, deleteGroupAndAgents, deleteWithMembersSuccess, deleteWithMembersWarning
Review fixes: - Add title tooltips on every truncated/clamped text across all group components (config panel, task board, response card, group card) - Standardize showMore/showLess to common.* i18n namespace - Guard assignedTo truncation (no ellipsis on short strings) - Disable delete buttons while mutations are in flight - Add aria-label on re-open strip buttons for accessibility - Add 4 missing i18n keys (hideDiscussions, showDiscussions, hideConfig, showConfig) and propagate to all 11 locales
Remove ugly side strip buttons that appeared when panels were hidden. Re-open buttons now appear in the top header bar (only when their panel is hidden), keeping the layout clean.
| // 3. Fallback: sanitize newlines (LLMs sometimes produce unescaped newlines in strings) | ||
| // Collapse all whitespace runs (newlines + spaces) into single spaces | ||
| try { | ||
| const sanitized = jsonStr.replace(/\s+/g, " "); | ||
| return validateStructuredArray(JSON.parse(sanitized)); | ||
| } catch { /* continue to fallback */ } | ||
|
|
||
| // 4. Last resort: try to repair by escaping newlines within JSON strings | ||
| try { |
The backend's group descriptor endpoint may return lastModifiedOn: 0 or omit it entirely, causing formatRelativeTime to show 'just now' for all groups. Fixes: - formatRelativeTime now returns '—' for 0, NaN, or undefined - getEnrichedGroupDescriptors falls back to config.lastModified (ISO string) when descriptor.lastModifiedOn is 0 - Add edge-case unit tests for invalid timestamps
- Add aria-label to both panel close buttons (accessibility) - Remove broad whitespace-collapse JSON fallback that could mutate string values; targeted newline-escaping is sufficient - Fix template test comment (task-force has 4 roles, not 3)
4752edd to
d5499c1
Compare
Root cause: the EDDI backend's group descriptor endpoint does not populate createdOn or lastModifiedOn fields (they're null in MongoDB). Fixes: - Fall back to createdOn when lastModifiedOn is missing - Guard title tooltips against 'Invalid Date' for undefined timestamps - Fix sort to use createdOn fallback to avoid NaN comparison
8c95e08 to
a11080d
Compare
This pull request introduces support for the new "TASK_FORCE" discussion style, including UI theming, a dynamic task board, and improved handling of task-related transcript entries. It also enhances internationalization by wrapping various labels and UI strings with translation functions, and improves the visual cues for discussion progress and agent responses.
TASK_FORCE Style and Task Board Integration
STYLE_THEME), flow steps, and phase mapping. [1] [2] [3] [4] [5] [6] [7] [8] [9]TaskBoardcomponent into theDiscussionTranscriptfor "TASK_FORCE" discussions, displaying during streaming and when loaded from the API. Includes a memoized wrapper for API-loaded data. [1] [2]taskPlan,taskVerifications,tasksInProgress,tasksCompleted,taskList). [1] [2] [3]Transcript Entry and Agent Response Enhancements
AgentResponseCardto show custom icons for plan and verification entries, and to support translation of entry type labels. [1] [2]Internationalization Improvements
t()), including state labels, live indicator, HTML toggle, and flow steps. [1] [2] [3] [4] [5]Visual and Theming Updates
dotColorproperty toSTYLE_THEMEfor consistent progress indicator coloring across discussion styles. Updated progress indicators to use this property. [1] [2] [3] [4] [5] [6] [7] [8]These changes collectively enable a richer and more flexible group discussion experience, especially for collaborative, task-oriented workflows.
Summary by CodeRabbit
New Features
Bug Fixes
Tests