Skip to content

New style - #1175

Merged
qdaxb merged 28 commits into
mainfrom
new_style
May 28, 2026
Merged

qdaxb merged 28 commits into
mainfrom
new_style

Conversation

@qdaxb

@qdaxb qdaxb commented May 27, 2026 •

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features

    • Grouped personal tasks view (paginated) by device/team with richer task metadata
    • Simplified agent editor for streamlined agent creation and editing
  • UI/UX Updates

    • Navigation label changed from "Feed" to "Automation"
    • Task sidebar: improved layout, collapsible group chats, "show more"/"show less" for lists
    • Team editor: bind-mode cards, executor selection, expanded team icon picker
  • Documentation

    • Added spec for the simplified agent editor design

Review Change Stack

@coderabbitai

coderabbitai Bot commented May 27, 2026 •

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It 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 reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds backend grouped personal-tasks endpoint and schemas, enriches tasks with team/device metadata, introduces a simple team editor and save utilities, refactors chat input/toolbar and sidebar/history rendering, updates i18n/test infra, and adds many unit/E2E tests.

Changes

Unified Feature: Simple editor, grouped tasks, and UI refactors

Layer / File(s) Summary
Backend contracts and endpoint
backend/app/schemas/task.py, backend/app/api/endpoints/adapter/tasks.py
Extends TaskLite with team/device fields, adds grouped response models, and exposes GET /lite/personal/grouped.
Backend helpers/queries/tests
backend/app/services/adapters/task_kinds/*, backend/app/services/adapters/task_kinds/query_utils.py, backend/tests/services/*
Batch-enriches team/device metadata, adds build_lite_task_groups, personal-task ID/total queries, and tests for grouping/pagination.
Simple editor components and utils
frontend/src/features/settings/components/team-edit/*
Adds SimpleTeamEditForm, ExecutorModeSelector, TeamBindModeCards, model-select utils, simple-team save builders, and layout helpers.
TeamEditDialog integration
frontend/src/features/settings/components/TeamEditDialog.tsx
Integrates simple-editor state/effects, model/skill loading, executor normalization, and a simple save flow that creates/updates bot+team payloads.
Sidebar/history refactor
frontend/src/features/tasks/components/sidebar/*, frontend/src/features/tasks/contexts/taskContext.tsx
Introduces fixed “More” nav, FixedGroupChatsSection with async loadAllGroupTasks, personal pagination/dedup changes, and task-list expand/collapse (show more/less).
Input controls refactor
frontend/src/features/tasks/components/input/*, selector/*, input/*
Adds AgentSkillSelectorMenu, InputMoreActionsMenu, CodeModeButton, icon-only/menu-item trigger variants, and refactors ChatInputControls layout.
Quick access and message header
frontend/src/features/tasks/components/chat/QuickAccessCards.tsx, .../message/MessageBubble.tsx
Switches quick-create flow to TeamEditDialog and updates AI message header to use team displayName/bot rules.
i18n, Jest, mocks, tests, E2E, docs
frontend/src/i18n/*, frontend/jest.config.ts, frontend/src/__mocks__/*, frontend/e2e/*, docs/*
Locale updates (Automation/more, show more/less), Jest ESM stub for jsPDF, many unit tests for new components/flows, E2E test improvements, and a simple-editor design spec.

Estimated code review effort
🎯 5 (Critical) | ⏱️ ~120+ minutes

Poem

A rabbit taps keys with a gentle thrum,
Groups your tasks by team or from which device they come.
With a simple edit, forms now bloom—
Click, save, whoosh—no clouds of doom.
Sidebars sleek, menus neat—
Hippity-hop, this PR’s a treat! 🐇✨

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch new_style

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 11

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
docs/superpowers/specs/2026-05-27-agent-simple-edit-design.md (1)

1-135: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Move Chinese documentation to docs/zh/ directory.

This Chinese design specification should be placed in docs/zh/ according to the coding guidelines, which state: "Write Chinese docs first in docs/zh/, then create English versions in docs/en/". The current location docs/superpowers/specs/ does not follow this convention and will cause inconsistency in documentation organization.

As per coding guidelines: Write Chinese docs first in docs/zh/, then create English versions in docs/en/

📁 Suggested relocation

Move this file to:

docs/zh/superpowers/specs/2026-05-27-agent-simple-edit-design.md

Then create the English version at:

docs/en/superpowers/specs/2026-05-27-agent-simple-edit-design.md
🤖 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 `@docs/superpowers/specs/2026-05-27-agent-simple-edit-design.md` around lines 1
- 135, The Chinese spec "智能体简洁编辑设计" currently under docs/superpowers/specs
should be moved into the Chinese docs folder and an English counterpart created:
relocate the file named
docs/superpowers/specs/2026-05-27-agent-simple-edit-design.md into
docs/zh/superpowers/specs/2026-05-27-agent-simple-edit-design.md (preserve
frontmatter like sidebar_position) and add a corresponding English file at
docs/en/superpowers/specs/2026-05-27-agent-simple-edit-design.md with the
translated content; also scan for and update any internal links or sidebar
references that pointed to the old path so navigation and sidebars remain
correct.
frontend/src/features/tasks/components/chat/QuickAccessCards.tsx (1)

492-507: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Use a semantic button for the quick-create trigger and add a test id.

Line 492 uses a clickable div for a primary interaction, which is not keyboard-accessible by default and misses the required interactive data-testid.

Suggested fix
-      <div
-        onClick={handleOpenCreateAgent}
+      <button
+        type="button"
+        onClick={handleOpenCreateAgent}
+        data-testid="create-agent-button"
         className="group relative flex flex-col justify-center items-center cursor-pointer transition-all duration-200 border border-dashed border-border bg-base hover:border-primary hover:bg-primary/5 hover:shadow-[0_2px_12px_0_rgba(0,0,0,0.1)]"
         style={{
           width: SMALL_BUTTON_WIDTH,
           height: 78,
           padding: '8px 12px',
           borderRadius: 20,
           flexShrink: 0,
           flexGrow: 0,
         }}
       >
         <SparklesIcon className="w-4 h-4 text-primary mb-1 transition-colors" />
         <span className="text-[10px] font-medium text-text-primary group-hover:text-primary transition-colors text-center leading-tight">
           {t('teams.create_first_team')}
         </span>
-      </div>
+      </button>

As per coding guidelines: Add data-testid attributes to all interactive elements ... and interactive elements should be implemented accessibly.

🤖 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 `@frontend/src/features/tasks/components/chat/QuickAccessCards.tsx` around
lines 492 - 507, Replace the non-semantic clickable div in QuickAccessCards.tsx
with a real <button> element (keep the same className, inline styles, and the
onClick handler handleOpenCreateAgent) and set type="button" so it remains
non-submit; also add an interactive data-testid like
data-testid="quick-create-agent" to that button to satisfy tests and keyboard
accessibility (keep SparklesIcon and the span text as-is inside the button).
🧹 Nitpick comments (3)
backend/app/api/endpoints/adapter/tasks.py (1)

183-205: ⚡ Quick win

Add tracing on the new sync endpoint.

get_personal_task_groups_lite is a newly added sync API handler but isn’t decorated with @trace_sync(), so this path won’t be traced consistently with the guideline.

As per coding guidelines: "Use @trace_async() decorator for tracing entire async functions, @trace_sync() for sync functions, and add_span_event() or set_span_attribute() for telemetry".

🤖 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 `@backend/app/api/endpoints/adapter/tasks.py` around lines 183 - 205, The new
synchronous endpoint function get_personal_task_groups_lite lacks tracing; add
the `@trace_sync`() decorator above its definition and ensure the trace_sync
symbol is imported (or available) in that module so the entire handler is traced
consistently; alternatively, if you prefer manual spans, call add_span_event()
or set_span_attribute() inside get_personal_task_groups_lite at key points, but
the preferred fix is to annotate the function with `@trace_sync`() to match the
tracing guidelines.
frontend/src/features/settings/components/team-edit/simple-team-edit-utils.ts (1)

88-106: Use of shell.shellType strings 'Chat' / 'ClaudeCode' is consistent with the existing frontend contract (88-106)

  • resolveShellForExecutor’s checks for shell.shellType === 'Chat' (simple) and === 'ClaudeCode' (complex) align with other feature logic (e.g., BotEdit.tsx, chatStreamContext.tsx, ThinkingDisplay.tsx) that uses the same literal values.
  • Unit tests construct UnifiedShell objects with shellType: 'Chat' and shellType: 'ClaudeCode' and assert the resolver returns those shells.

Optional: update the misleading inline comment in frontend/src/apis/shells.ts / frontend/src/types/api.ts that lists example shell types without including 'Chat', since 'Chat' is clearly used as a valid shell type in the codebase.

🤖 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
`@frontend/src/features/settings/components/team-edit/simple-team-edit-utils.ts`
around lines 88 - 106, The comment notes that literal shellType checks in
resolveShellForExecutor (function resolveShellForExecutor inspecting
shell.shellType === 'Chat' and === 'ClaudeCode') are correct and used across the
codebase; fix the misleading example comments in the API/type declarations by
updating the example values in the comment(s) in the shells API/type files
(referenced in frontend/src/apis/shells.ts and frontend/src/types/api.ts) to
include 'Chat' (and 'ClaudeCode' if missing) or reword the comment to say the
list is non-exhaustive so it no longer implies those types are invalid; no code
changes to resolveShellForExecutor are needed.
frontend/src/features/tasks/components/sidebar/TaskSidebar.tsx (1)

511-518: ⚡ Quick win

Add data-testid to newly introduced interactive elements.

These new buttons are interactive but don’t include data-testid, which makes E2E targeting inconsistent with the project rule.

As per coding guidelines: “Add data-testid attributes to all interactive elements (buttons, inputs, links, selects, etc.) with naming format {action}-{element-type}”.

Also applies to: 569-574, 632-635

🤖 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 `@frontend/src/features/tasks/components/sidebar/TaskSidebar.tsx` around lines
511 - 518, The new interactive buttons in TaskSidebar.tsx lack data-testid
attributes; add data-testid to each button using the `{action}-{element-type}`
convention (e.g., the button that calls handleNewAgentClick should get
data-testid="new-agent-button"). Locate the other two buttons referenced in the
file (the interactive elements in the blocks around the other diffs) and add
appropriate ids derived from their handler names or visible action (e.g.,
handleNewTaskClick -> "new-task-button", handleAddSomething ->
"add-something-button") so all buttons follow the project testid naming rule.
🤖 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 `@backend/app/services/adapters/task_kinds/helpers.py`:
- Around line 530-538: The current public_team_kinds query uses independent .in_
checks for Kind.name and Kind.namespace which allows cross-pairing; instead
construct paired lookups and filter on the (name, namespace) tuple to only match
exact pairs. Build a list of missing_team_pairs from the refs (e.g. [(name,
namespace), ...] derived from missing_team_names and missing_team_namespaces or
the original refs), then replace the separate Kind.name.in_(...) and
Kind.namespace.in_(...) filters with a single tuple_(Kind.name,
Kind.namespace).in_(missing_team_pairs) in the public_team_kinds query so only
exact (name, namespace) combinations are returned.

In
`@frontend/src/features/settings/components/team-edit/simple-team-edit-save.ts`:
- Around line 40-47: getSimpleBotName currently returns `${teamName.trim()}-bot`
even if teamName is only whitespace, producing `-bot`; update getSimpleBotName
to compute a trimmedTeamName = teamName.trim() and if trimmedBotName is empty
return trimmedTeamName-based fallback only when trimmedTeamName is non-empty,
otherwise return a safe default like 'bot' or 'team-bot' (or throw/validate
upstream), so replace the final return to use trimmedTeamName when present and a
sensible default when it's empty.

In `@frontend/src/features/settings/components/team-edit/SimpleTeamEditForm.tsx`:
- Around line 90-110: Extract the duplicated toModelSelectValue and
parseModelSelectValue helpers into a single utility module that exports both
functions, then replace the local implementations in SimpleTeamEditForm.tsx and
SimpleBotCoreConfigForm.tsx with imports from that module; ensure the exported
functions keep the same signatures and behavior (including the '__none__'
sentinel and default namespace handling) and update import statements in both
components to use the shared helpers.

In `@frontend/src/features/settings/components/TeamEditDialog.tsx`:
- Around line 284-288: The current call to
setBindMode(normalizeSimpleBindMode(formTeam)) forces bind_mode to only
chat|code|task and will overwrite custom modes; instead, check
formTeam.bind_mode and if it exists and is not one of the simple modes
('chat','code','task') preserve it by calling setBindMode(formTeam.bind_mode),
otherwise fall back to setBindMode(normalizeSimpleBindMode(formTeam)); use the
same symbols (formTeam, setBindMode, normalizeSimpleBindMode, bind_mode) and
ensure this branch runs when initializing the dialog (alongside
setMode/setAdvancedOpen) so advanced teams retain their original bind_mode.

In `@frontend/src/features/tasks/components/chat/QuickAccessCards.tsx`:
- Around line 343-361: handleCreateAgentClose currently calls _onRefreshTeams on
every dialog close which triggers unnecessary network calls; change the logic to
only call _onRefreshTeams when a team was actually created
(createdTeamRef.current / createdTeam is non-null). Specifically, inside
handleCreateAgentClose, check if createdTeam is truthy before calling
_onRefreshTeams and before calling onTeamSelect with refreshedTeams, and keep
the existing fallback to onTeamSelect(createdTeam) in the catch block; remove
the unconditional refresh/return path so closing/cancel without creation does
not call _onRefreshTeams.

In `@frontend/src/features/tasks/components/input/InputMoreActionsMenu.tsx`:
- Around line 74-78: The ActionButton inside PopoverTrigger currently also
toggles open via its onClick (ActionButton.onClick -> setOpen), which conflicts
with PopoverTrigger's own state handling; remove the onClick handler (the
setOpen toggle) from ActionButton and rely solely on Popover's onOpenChange to
update open via setOpen so there is a single source of truth (refer to
PopoverTrigger, ActionButton, setOpen, and onOpenChange in the component).

In `@frontend/src/features/tasks/components/selector/TeamSelectorButton.tsx`:
- Around line 165-216: Add data-testid attributes to the two interactive footer
controls in TeamSelectorButton: the quick-create control (the div using
SparklesIcon and handleCreateClick) should get data-testid="quick-create-button"
and the settings control (the div using Cog6ToothIcon and
router.push(paths.settings.team.getHref())) should get
data-testid="settings-button"; place these attributes on the divs that already
have role="button" so E2E tests can reliably target them, keeping existing
onClick/onKeyDown behavior unchanged.
- Line 65: Replace the array namespace usage in TeamSelectorButton by calling
useTranslation with a single feature namespace that matches this feature (e.g.,
useTranslation('tasks')) and ensure the hook is imported from
"`@/hooks/useTranslation`" (not from "react-i18next"); then update any translation
keys in TeamSelectorButton that currently rely on the second namespace to use
prefixed keys like "common:..." or "wizard:..." so cross-namespace lookups
remain explicit while keeping the feature namespace single-valued.

In `@frontend/src/features/tasks/components/sidebar/TaskListSection.tsx`:
- Around line 729-734: The show-more toggle button in TaskListSection uses
`h-8`, which is below the 44×44 touch target; update the button's className on
the element with data-testid="task-list-section-show-more" (inside
TaskListSection component) to use mobile-compliant sizing by replacing `h-8`
with `h-11 min-w-[44px]` while preserving the rest of the classes, attributes,
and the onClick behavior.

In `@frontend/src/features/tasks/components/sidebar/TaskSidebar.tsx`:
- Around line 395-405: The Button components (e.g., the Button with
data-testid="task-sidebar-more-button" that calls openMoreNavigation(menuId))
use small height classes like h-8/h-7 which violate the 44×44 mobile minimum;
update their className to use the recommended sizing (replace h-8 or h-7 with
h-11 and add min-w-[44px]) so each interactive element meets the mobile target,
and apply the same change to the other Button instances mentioned (around the
other occurrences at the same component: the blocks referenced in the review:
569-574 and 1103-1109).

In `@frontend/src/features/tasks/contexts/taskContext.tsx`:
- Around line 272-277: The pagination termination is wrong: change the hasMore
computation so it becomes false when the last loaded page is not full. Replace
the current condition (using flattenTaskHistoryGroups(results[results.length -
1]?.items || []).length > 0) with a check that the length equals the page size
used for loading pages (e.g., flattenTaskHistoryGroups(...).length === pageSize
or === personalTasksPageSize), so hasMore only stays true when the last page is
full; update the hasMore assignment in the same block where results, pagesArr
and allItems are assembled (referencing flattenTaskHistoryGroups and the
hasMore/hasMorePersonalTasks usage).

---

Outside diff comments:
In `@docs/superpowers/specs/2026-05-27-agent-simple-edit-design.md`:
- Around line 1-135: The Chinese spec "智能体简洁编辑设计" currently under
docs/superpowers/specs should be moved into the Chinese docs folder and an
English counterpart created: relocate the file named
docs/superpowers/specs/2026-05-27-agent-simple-edit-design.md into
docs/zh/superpowers/specs/2026-05-27-agent-simple-edit-design.md (preserve
frontmatter like sidebar_position) and add a corresponding English file at
docs/en/superpowers/specs/2026-05-27-agent-simple-edit-design.md with the
translated content; also scan for and update any internal links or sidebar
references that pointed to the old path so navigation and sidebars remain
correct.

In `@frontend/src/features/tasks/components/chat/QuickAccessCards.tsx`:
- Around line 492-507: Replace the non-semantic clickable div in
QuickAccessCards.tsx with a real <button> element (keep the same className,
inline styles, and the onClick handler handleOpenCreateAgent) and set
type="button" so it remains non-submit; also add an interactive data-testid like
data-testid="quick-create-agent" to that button to satisfy tests and keyboard
accessibility (keep SparklesIcon and the span text as-is inside the button).

---

Nitpick comments:
In `@backend/app/api/endpoints/adapter/tasks.py`:
- Around line 183-205: The new synchronous endpoint function
get_personal_task_groups_lite lacks tracing; add the `@trace_sync`() decorator
above its definition and ensure the trace_sync symbol is imported (or available)
in that module so the entire handler is traced consistently; alternatively, if
you prefer manual spans, call add_span_event() or set_span_attribute() inside
get_personal_task_groups_lite at key points, but the preferred fix is to
annotate the function with `@trace_sync`() to match the tracing guidelines.

In
`@frontend/src/features/settings/components/team-edit/simple-team-edit-utils.ts`:
- Around line 88-106: The comment notes that literal shellType checks in
resolveShellForExecutor (function resolveShellForExecutor inspecting
shell.shellType === 'Chat' and === 'ClaudeCode') are correct and used across the
codebase; fix the misleading example comments in the API/type declarations by
updating the example values in the comment(s) in the shells API/type files
(referenced in frontend/src/apis/shells.ts and frontend/src/types/api.ts) to
include 'Chat' (and 'ClaudeCode' if missing) or reword the comment to say the
list is non-exhaustive so it no longer implies those types are invalid; no code
changes to resolveShellForExecutor are needed.

In `@frontend/src/features/tasks/components/sidebar/TaskSidebar.tsx`:
- Around line 511-518: The new interactive buttons in TaskSidebar.tsx lack
data-testid attributes; add data-testid to each button using the
`{action}-{element-type}` convention (e.g., the button that calls
handleNewAgentClick should get data-testid="new-agent-button"). Locate the other
two buttons referenced in the file (the interactive elements in the blocks
around the other diffs) and add appropriate ids derived from their handler names
or visible action (e.g., handleNewTaskClick -> "new-task-button",
handleAddSomething -> "add-something-button") so all buttons follow the project
testid naming rule.
🪄 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: 0d694998-1101-426f-aa4a-32b244301c85

📥 Commits

Reviewing files that changed from the base of the PR and between 221218d and fd82372.

📒 Files selected for processing (65)
  • backend/app/api/endpoints/adapter/tasks.py
  • backend/app/schemas/task.py
  • backend/app/services/adapters/task_kinds/helpers.py
  • backend/app/services/adapters/task_kinds/queries.py
  • backend/tests/services/test_task_lite_batch_loading.py
  • docs/superpowers/specs/2026-05-27-agent-simple-edit-design.md
  • frontend/jest.config.ts
  • frontend/src/__mocks__/jspdf-stub.ts
  • frontend/src/__tests__/features/projects/components/project-sidebar-behavior.test.tsx
  • frontend/src/__tests__/features/settings/components/SimpleTeamEditDialog.test.tsx
  • frontend/src/__tests__/features/settings/components/TeamEditDialog.display-name.test.tsx
  • frontend/src/__tests__/features/settings/components/team-edit/ExecutorModeSelector.test.tsx
  • frontend/src/__tests__/features/settings/components/team-edit/SimpleBotCoreConfigForm.test.tsx
  • frontend/src/__tests__/features/settings/components/team-edit/TeamBindModeCards.test.tsx
  • frontend/src/__tests__/features/settings/components/team-edit/simple-team-edit-save.test.ts
  • frontend/src/__tests__/features/settings/components/team-edit/simple-team-edit-utils.test.ts
  • frontend/src/__tests__/features/tasks/components/chat/QuickAccessCards.test.tsx
  • frontend/src/__tests__/features/tasks/components/chat/context-selector.test.tsx
  • frontend/src/__tests__/features/tasks/components/input/ChatInputControls.toolbar.test.tsx
  • frontend/src/__tests__/features/tasks/components/input/chat-context-visibility.test.tsx
  • frontend/src/__tests__/features/tasks/components/message/MessageBubble.test.tsx
  • frontend/src/__tests__/features/tasks/components/sidebar/TaskListSection.test.tsx
  • frontend/src/__tests__/features/tasks/components/sidebar/TaskSidebar.test.tsx
  • frontend/src/__tests__/features/tasks/contexts/taskContext.group-loading.test.tsx
  • frontend/src/__tests__/i18n/missing-console-keys.test.ts
  • frontend/src/apis/tasks.ts
  • frontend/src/features/projects/components/ProjectSection.tsx
  • frontend/src/features/settings/components/McpConfigSection.tsx
  • frontend/src/features/settings/components/TeamApiCallButton.tsx
  • frontend/src/features/settings/components/TeamEditDialog.tsx
  • frontend/src/features/settings/components/TeamList.tsx
  • frontend/src/features/settings/components/knowledge/KnowledgeBaseMultiSelector.tsx
  • frontend/src/features/settings/components/team-edit/ExecutorModeSelector.tsx
  • frontend/src/features/settings/components/team-edit/SimpleBotCoreConfigForm.tsx
  • frontend/src/features/settings/components/team-edit/SimpleConfigLayout.tsx
  • frontend/src/features/settings/components/team-edit/SimpleTeamEditForm.tsx
  • frontend/src/features/settings/components/team-edit/TeamBindModeCards.tsx
  • frontend/src/features/settings/components/team-edit/index.ts
  • frontend/src/features/settings/components/team-edit/simple-team-edit-save.ts
  • frontend/src/features/settings/components/team-edit/simple-team-edit-utils.ts
  • frontend/src/features/tasks/components/CorrectionModeToggle.tsx
  • frontend/src/features/tasks/components/chat/AddContextButton.tsx
  • frontend/src/features/tasks/components/chat/ChatContextInput.tsx
  • frontend/src/features/tasks/components/chat/ContextSelector.tsx
  • frontend/src/features/tasks/components/chat/QuickAccessCards.tsx
  • frontend/src/features/tasks/components/clarification/ClarificationToggle.tsx
  • frontend/src/features/tasks/components/input/AgentSkillSelectorMenu.tsx
  • frontend/src/features/tasks/components/input/ChatInputControls.tsx
  • frontend/src/features/tasks/components/input/CodeModeButton.tsx
  • frontend/src/features/tasks/components/input/InputMoreActionsMenu.tsx
  • frontend/src/features/tasks/components/message/MessageBubble.tsx
  • frontend/src/features/tasks/components/selector/TeamSelectorButton.tsx
  • frontend/src/features/tasks/components/sidebar/TaskListSection.tsx
  • frontend/src/features/tasks/components/sidebar/TaskSidebar.tsx
  • frontend/src/features/tasks/contexts/taskContext.tsx
  • frontend/src/i18n/locales/en/common.json
  • frontend/src/i18n/locales/en/feed.json
  • frontend/src/i18n/locales/en/settings.json
  • frontend/src/i18n/locales/en/wizard.json
  • frontend/src/i18n/locales/zh-CN/common.json
  • frontend/src/i18n/locales/zh-CN/feed.json
  • frontend/src/i18n/locales/zh-CN/settings.json
  • frontend/src/i18n/locales/zh-CN/wizard.json
  • frontend/src/lib/runtime-config.ts
  • frontend/src/types/api.ts

Comment thread backend/app/services/adapters/task_kinds/helpers.py Outdated
Comment thread frontend/src/features/settings/components/team-edit/SimpleTeamEditForm.tsx Outdated
Comment thread frontend/src/features/settings/components/TeamEditDialog.tsx
Comment thread frontend/src/features/tasks/components/chat/QuickAccessCards.tsx
Comment thread frontend/src/features/tasks/components/selector/TeamSelectorButton.tsx Outdated
Comment thread frontend/src/features/tasks/components/sidebar/TaskListSection.tsx
Comment thread frontend/src/features/tasks/components/sidebar/TaskSidebar.tsx
Comment thread frontend/src/features/tasks/contexts/taskContext.tsx Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (1)
backend/app/services/adapters/task_kinds/queries.py (1)

158-163: set() passed to _filter_personal_tasks is redundant for personal queries
get_personal_task_ids_and_total pulls IDs/count using _PERSONAL_COUNT_SQL / _PERSONAL_IDS_SQL, both of which include k.is_group_chat = 0, so tasks will never contain group tasks; the task.id in all_group_task_ids skip path won’t affect this result. Also, restore_task_order caps ordered_tasks to limit, so max(total_personal, len(ordered_tasks)) appears unnecessary (though harmless).

🤖 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 `@backend/app/services/adapters/task_kinds/queries.py` around lines 158 - 163,
The call to _filter_personal_tasks with an empty set() is redundant because
get_personal_task_ids_and_total already restricts results to personal tasks via
_PERSONAL_COUNT_SQL/_PERSONAL_IDS_SQL, so remove the empty set argument when
calling _filter_personal_tasks (i.e., call self._filter_personal_tasks(tasks,
types) or adjust signature usage accordingly) and simplify the returned total to
use total_personal directly (replace max(total_personal, len(ordered_tasks))
with total_personal) while keeping the restore_task_order and
build_lite_task_list calls unchanged.
🤖 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
`@frontend/src/features/settings/components/team-edit/simple-team-edit-utils.ts`:
- Around line 118-120: The early return when mode === 'custom' skips validation
and lets code/task binds use non-ClaudeCode executors; change the branch in the
function that checks mode to additionally validate the selected custom executor
(the selected custom shell/executor variable used in this file) whenever the
bind mode is 'code' or 'task', and only return { mode, reason: null } if that
selected executor equals the ClaudeCode executor identifier; otherwise return a
validation error reason (or disallow saving) so non-ClaudeCode executors cannot
be used for 'code'/'task' binds.

In `@frontend/src/features/settings/components/TeamList.tsx`:
- Around line 548-560: The device filter button in TeamList.tsx (the button that
sets modeFilter to 'task' and uses CpuChipIcon) is below the required mobile
touch size; update its className to include the mobile minimum sizing by adding
h-11 and min-w-[44px] (e.g., append "h-11 min-w-[44px]" to the existing classes)
so the interactive target meets the 44×44px guideline while preserving the
existing conditional bg/text classes.

---

Nitpick comments:
In `@backend/app/services/adapters/task_kinds/queries.py`:
- Around line 158-163: The call to _filter_personal_tasks with an empty set() is
redundant because get_personal_task_ids_and_total already restricts results to
personal tasks via _PERSONAL_COUNT_SQL/_PERSONAL_IDS_SQL, so remove the empty
set argument when calling _filter_personal_tasks (i.e., call
self._filter_personal_tasks(tasks, types) or adjust signature usage accordingly)
and simplify the returned total to use total_personal directly (replace
max(total_personal, len(ordered_tasks)) with total_personal) while keeping the
restore_task_order and build_lite_task_list calls unchanged.
🪄 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: 3754485f-960b-482c-903e-c3a04b05b094

📥 Commits

Reviewing files that changed from the base of the PR and between fd82372 and 654ea1e.

📒 Files selected for processing (42)
  • backend/app/api/endpoints/adapter/tasks.py
  • backend/app/services/adapters/task_kinds/helpers.py
  • backend/app/services/adapters/task_kinds/queries.py
  • backend/app/services/adapters/task_kinds/query_utils.py
  • backend/tests/services/test_task_group_lite_db_pagination.py
  • backend/tests/services/test_task_lite_batch_loading.py
  • frontend/src/__tests__/features/settings/components/SettingsTabNav.navigation.test.tsx
  • frontend/src/__tests__/features/settings/components/SimpleTeamEditDialog.test.tsx
  • frontend/src/__tests__/features/settings/components/TeamEditDialog.display-name.test.tsx
  • frontend/src/__tests__/features/settings/components/TeamList.mode-filter.test.tsx
  • frontend/src/__tests__/features/settings/components/team-edit/ExecutorModeSelector.test.tsx
  • frontend/src/__tests__/features/settings/components/team-edit/TeamBindModeCards.test.tsx
  • frontend/src/__tests__/features/settings/components/team-edit/simple-team-edit-save.test.ts
  • frontend/src/__tests__/features/settings/components/team-edit/simple-team-edit-utils.test.ts
  • frontend/src/__tests__/features/tasks/components/chat/QuickAccessCards.test.tsx
  • frontend/src/__tests__/features/tasks/components/selector/TeamSelectorButton.test.tsx
  • frontend/src/__tests__/features/tasks/components/selector/team-selector-utils.test.ts
  • frontend/src/__tests__/features/tasks/components/sidebar/TaskListSection.test.tsx
  • frontend/src/__tests__/features/tasks/components/sidebar/TaskSidebar.test.tsx
  • frontend/src/__tests__/features/tasks/contexts/taskContext.group-loading.test.tsx
  • frontend/src/apis/shells.ts
  • frontend/src/features/settings/components/SettingsTabNav.tsx
  • frontend/src/features/settings/components/TeamEditDialog.tsx
  • frontend/src/features/settings/components/TeamList.tsx
  • frontend/src/features/settings/components/team-edit/ExecutorModeSelector.tsx
  • frontend/src/features/settings/components/team-edit/SimpleBotCoreConfigForm.tsx
  • frontend/src/features/settings/components/team-edit/SimpleTeamEditForm.tsx
  • frontend/src/features/settings/components/team-edit/TeamBindModeCards.tsx
  • frontend/src/features/settings/components/team-edit/model-select-utils.ts
  • frontend/src/features/settings/components/team-edit/simple-choice-card-styles.ts
  • frontend/src/features/settings/components/team-edit/simple-team-edit-save.ts
  • frontend/src/features/settings/components/team-edit/simple-team-edit-utils.ts
  • frontend/src/features/tasks/components/chat/QuickAccessCards.tsx
  • frontend/src/features/tasks/components/input/InputMoreActionsMenu.tsx
  • frontend/src/features/tasks/components/selector/TeamSelectorButton.tsx
  • frontend/src/features/tasks/components/selector/team-selector-utils.ts
  • frontend/src/features/tasks/components/sidebar/TaskListSection.tsx
  • frontend/src/features/tasks/components/sidebar/TaskSidebar.tsx
  • frontend/src/features/tasks/contexts/taskContext.tsx
  • frontend/src/i18n/locales/en/settings.json
  • frontend/src/i18n/locales/zh-CN/settings.json
  • frontend/src/types/api.ts
💤 Files with no reviewable changes (1)
  • frontend/src/features/tasks/components/input/InputMoreActionsMenu.tsx
✅ Files skipped from review due to trivial changes (4)
  • frontend/src/apis/shells.ts
  • frontend/src/i18n/locales/en/settings.json
  • frontend/src/features/settings/components/team-edit/simple-choice-card-styles.ts
  • frontend/src/i18n/locales/zh-CN/settings.json
🚧 Files skipped from review as they are similar to previous changes (17)
  • frontend/src/features/settings/components/team-edit/ExecutorModeSelector.tsx
  • backend/app/api/endpoints/adapter/tasks.py
  • frontend/src/tests/features/settings/components/team-edit/simple-team-edit-save.test.ts
  • frontend/src/tests/features/tasks/components/chat/QuickAccessCards.test.tsx
  • frontend/src/tests/features/settings/components/team-edit/simple-team-edit-utils.test.ts
  • frontend/src/tests/features/tasks/components/sidebar/TaskListSection.test.tsx
  • frontend/src/features/tasks/components/selector/TeamSelectorButton.tsx
  • frontend/src/features/settings/components/team-edit/TeamBindModeCards.tsx
  • frontend/src/features/tasks/components/sidebar/TaskListSection.tsx
  • frontend/src/features/settings/components/team-edit/SimpleTeamEditForm.tsx
  • frontend/src/features/settings/components/team-edit/simple-team-edit-save.ts
  • frontend/src/types/api.ts
  • frontend/src/features/tasks/components/chat/QuickAccessCards.tsx
  • frontend/src/features/settings/components/team-edit/SimpleBotCoreConfigForm.tsx
  • frontend/src/features/settings/components/TeamEditDialog.tsx
  • backend/tests/services/test_task_lite_batch_loading.py
  • frontend/src/features/tasks/components/sidebar/TaskSidebar.tsx

Comment on lines +118 to +120
if (mode === 'custom') {
return { mode, reason: null }
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Avoid bypassing ClaudeCode enforcement for custom executor in code/task bind modes.

This branch allows custom to pass without validating the selected custom shell type, so code/task can be saved with a non-ClaudeCode executor.

Suggested fix
-  if (mode === 'custom') {
-    return { mode, reason: null }
-  }
+  if (mode === 'custom') {
+    const customShell = resolveShellForExecutor(shells, 'custom', customShellName)
+    if (isClaudeCodeShell(customShell)) {
+      return { mode, reason: null }
+    }
+
+    const complexShell = resolveShellForExecutor(shells, 'complex')
+    if (complexShell) {
+      return { mode: 'complex', reason: 'requires_claude_code' }
+    }
+
+    return { mode, reason: 'requires_claude_code' }
+  }
🤖 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
`@frontend/src/features/settings/components/team-edit/simple-team-edit-utils.ts`
around lines 118 - 120, The early return when mode === 'custom' skips validation
and lets code/task binds use non-ClaudeCode executors; change the branch in the
function that checks mode to additionally validate the selected custom executor
(the selected custom shell/executor variable used in this file) whenever the
bind mode is 'code' or 'task', and only return { mode, reason: null } if that
selected executor equals the ClaudeCode executor identifier; otherwise return a
validation error reason (or disallow saving) so non-ClaudeCode executors cannot
be used for 'code'/'task' binds.

Comment on lines +548 to +560
<button
type="button"
onClick={() => setModeFilter('task')}
data-testid="team-mode-filter-device"
className={`flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium rounded-md transition-colors ${
modeFilter === 'task'
? 'bg-primary text-white'
: 'bg-muted text-text-secondary hover:text-text-primary hover:bg-hover'
}`}
>
<CpuChipIcon className="w-4 h-4" />
{t('settings:team.list.filterDevice')}
</button>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Increase mobile touch target size for the new device mode button.

The new filter button is smaller than the required minimum interactive size, which can hurt mobile usability.

Suggested fix
- className={`flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium rounded-md transition-colors ${
+ className={`flex h-11 min-w-[44px] items-center gap-1.5 px-3 text-sm font-medium rounded-md transition-colors ${
As per coding guidelines: "All interactive elements on mobile must be at least 44px × 44px - use `h-11 min-w-[44px]` for buttons".
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<button
type="button"
onClick={() => setModeFilter('task')}
data-testid="team-mode-filter-device"
className={`flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium rounded-md transition-colors ${
modeFilter === 'task'
? 'bg-primary text-white'
: 'bg-muted text-text-secondary hover:text-text-primary hover:bg-hover'
}`}
>
<CpuChipIcon className="w-4 h-4" />
{t('settings:team.list.filterDevice')}
</button>
<button
type="button"
onClick={() => setModeFilter('task')}
data-testid="team-mode-filter-device"
className={`flex h-11 min-w-[44px] items-center gap-1.5 px-3 text-sm font-medium rounded-md transition-colors ${
modeFilter === 'task'
? 'bg-primary text-white'
: 'bg-muted text-text-secondary hover:text-text-primary hover:bg-hover'
}`}
>
<CpuChipIcon className="w-4 h-4" />
{t('settings:team.list.filterDevice')}
</button>
🤖 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 `@frontend/src/features/settings/components/TeamList.tsx` around lines 548 -
560, The device filter button in TeamList.tsx (the button that sets modeFilter
to 'task' and uses CpuChipIcon) is below the required mobile touch size; update
its className to include the mobile minimum sizing by adding h-11 and
min-w-[44px] (e.g., append "h-11 min-w-[44px]" to the existing classes) so the
interactive target meets the 44×44px guideline while preserving the existing
conditional bg/text classes.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (2)
frontend/e2e/tests/tasks/chat-image-browser-e2e.spec.ts (2)

342-521: 🏗️ Heavy lift

Split selectTestTeam into smaller strategy helpers.

selectTestTeam is now very large and handles many responsibilities in one function, which makes maintenance and failures harder to reason about.

As per coding guidelines, "Maximum 50 lines per function (preferred) in Python and TypeScript code".

🤖 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 `@frontend/e2e/tests/tasks/chat-image-browser-e2e.spec.ts` around lines 342 -
521, The selectTestTeam function is too large; refactor by extracting each
selection strategy into its own async helper that returns a boolean and is
invoked by a small orchestrator in selectTestTeam. Create helpers named
strategyCurrentAgentSelector(page), strategyQuickAccessCards(page),
strategyTeamSelectorButton(page), strategyTeamSelectorByText(page),
strategyDataTourSelector(page), and strategyDirectTeamCard(page) that
encapsulate the logic for the corresponding blocks (use the existing locators
and dismissOnboardingTour calls), keep screenshot/error handling in
selectTestTeam, and have selectTestTeam call each helper in order and return
true as soon as one returns true or false after all fail. Ensure each helper
preserves the same timeouts, clicks, and waits and only references
TEST_TEAM_NAME and page.

330-335: ⚡ Quick win

Replace fixed sleep with state-based waiting in navigation helper.

Line 334 uses a fixed waitForTimeout(1500), which is brittle under variable CI timing. Waiting for a concrete ready element is more reliable.

Suggested change
 async function gotoChatWithTestTeam(page: Page): Promise<void> {
   await skipOnboardingTour(page)
   await page.goto(`/chat?teamId=${createdTeamId}`)
-  await page.waitForLoadState('domcontentloaded')
-  await page.waitForTimeout(1500)
+  await page.waitForLoadState('networkidle')
+  await expect(page.locator('[data-testid="message-input"]')).toBeVisible({ timeout: 15000 })
 }
🤖 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 `@frontend/e2e/tests/tasks/chat-image-browser-e2e.spec.ts` around lines 330 -
335, In gotoChatWithTestTeam replace the brittle fixed sleep
(page.waitForTimeout(1500)) with a state-based wait: after page.goto and
waitForLoadState('domcontentloaded') wait for a concrete ready element that
indicates the chat UI is usable (for example the chat message list or message
input) using page.waitForSelector('<chat-ready-selector>') or equivalent; update
the function (which calls skipOnboardingTour and uses createdTeamId) to await
that selector so tests proceed only when the chat UI is fully rendered instead
of relying on a timeout.
🤖 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 `@frontend/e2e/tests/tasks/chat-image-browser-e2e.spec.ts`:
- Around line 100-101: Replace the full JSON dump of lastCapturedRequests with a
sanitized summary: in the block that currently calls console.log('Captured
requests:', JSON.stringify(lastCapturedRequests, null, 2)) and then throws
Error('No chat completion request captured by mock model server'), redact or
omit request bodies and headers (especially base64 image data), and log only
non-sensitive metadata such as request counts, endpoints, HTTP methods, status
codes, and truncated body sizes (or first N chars) for lastCapturedRequests;
keep the thrown Error but change its message if needed to reference the
sanitized summary so CI logs do not contain full payloads.

---

Nitpick comments:
In `@frontend/e2e/tests/tasks/chat-image-browser-e2e.spec.ts`:
- Around line 342-521: The selectTestTeam function is too large; refactor by
extracting each selection strategy into its own async helper that returns a
boolean and is invoked by a small orchestrator in selectTestTeam. Create helpers
named strategyCurrentAgentSelector(page), strategyQuickAccessCards(page),
strategyTeamSelectorButton(page), strategyTeamSelectorByText(page),
strategyDataTourSelector(page), and strategyDirectTeamCard(page) that
encapsulate the logic for the corresponding blocks (use the existing locators
and dismissOnboardingTour calls), keep screenshot/error handling in
selectTestTeam, and have selectTestTeam call each helper in order and return
true as soon as one returns true or false after all fail. Ensure each helper
preserves the same timeouts, clicks, and waits and only references
TEST_TEAM_NAME and page.
- Around line 330-335: In gotoChatWithTestTeam replace the brittle fixed sleep
(page.waitForTimeout(1500)) with a state-based wait: after page.goto and
waitForLoadState('domcontentloaded') wait for a concrete ready element that
indicates the chat UI is usable (for example the chat message list or message
input) using page.waitForSelector('<chat-ready-selector>') or equivalent; update
the function (which calls skipOnboardingTour and uses createdTeamId) to await
that selector so tests proceed only when the chat UI is fully rendered instead
of relying on a timeout.
🪄 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: 8ef0331b-5196-4a27-a43d-50bd5695a4d2

📥 Commits

Reviewing files that changed from the base of the PR and between 654ea1e and 534b207.

📒 Files selected for processing (1)
  • frontend/e2e/tests/tasks/chat-image-browser-e2e.spec.ts

Comment on lines +100 to +101
console.log('Captured requests:', JSON.stringify(lastCapturedRequests, null, 2))
throw new Error('No chat completion request captured by mock model server')

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Avoid dumping full captured request payloads to logs.

Line 100 can print full message bodies (including base64 image data and headers), which risks sensitive-data leakage and can flood CI logs on failures.

Suggested change
-  console.log('Captured requests:', JSON.stringify(lastCapturedRequests, null, 2))
+  console.log(
+    'Captured requests summary:',
+    lastCapturedRequests.map(req => ({
+      timestamp: req.timestamp,
+      method: req.method,
+      url: req.url,
+      messageCount: req.body?.messages?.length ?? 0,
+    }))
+  )
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
console.log('Captured requests:', JSON.stringify(lastCapturedRequests, null, 2))
throw new Error('No chat completion request captured by mock model server')
console.log(
'Captured requests summary:',
lastCapturedRequests.map(req => ({
timestamp: req.timestamp,
method: req.method,
url: req.url,
messageCount: req.body?.messages?.length ?? 0,
}))
)
throw new Error('No chat completion request captured by mock model server')
🤖 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 `@frontend/e2e/tests/tasks/chat-image-browser-e2e.spec.ts` around lines 100 -
101, Replace the full JSON dump of lastCapturedRequests with a sanitized
summary: in the block that currently calls console.log('Captured requests:',
JSON.stringify(lastCapturedRequests, null, 2)) and then throws Error('No chat
completion request captured by mock model server'), redact or omit request
bodies and headers (especially base64 image data), and log only non-sensitive
metadata such as request counts, endpoints, HTTP methods, status codes, and
truncated body sizes (or first N chars) for lastCapturedRequests; keep the
thrown Error but change its message if needed to reference the sanitized summary
so CI logs do not contain full payloads.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
frontend/src/features/tasks/contexts/taskContext.tsx (1)

257-262: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Deduplicate newly fetched group tasks against each other before appending.

loadedItems.filter(...) only checks IDs already in previous state. If fetched pages overlap, duplicates inside loadedItems can still be appended.

Proposed patch
      setGroupTasks(prev => {
-        const existingIds = new Set(prev.map(t => t.id))
-        const newItems = loadedItems.filter(t => !existingIds.has(t.id))
+        const existingIds = new Set(prev.map(t => t.id))
+        const newItems = loadedItems.filter(t => {
+          if (existingIds.has(t.id)) return false
+          existingIds.add(t.id)
+          return true
+        })
         return [...prev, ...newItems]
       })
🤖 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 `@frontend/src/features/tasks/contexts/taskContext.tsx` around lines 257 - 262,
The current append logic in setGroupTasks adds loadedItems without deduplicating
among themselves, so duplicates from overlapping fetched pages can be appended;
update the handler that calls setGroupTasks (the block using loadedItems and
loadedPagesToAdd) to first deduplicate loadedItems by id (e.g., build a Set/Map
of seen ids and filter loadedItems to unique ids) and then filter those unique
loadedItems against existingIds before returning [...prev, ...newItems],
ensuring newItems are unique both vs. prev and vs. each other.
🧹 Nitpick comments (1)
frontend/src/features/settings/components/teams/TeamIconPicker.tsx (1)

40-40: ⚡ Quick win

Align data-testid names with the required {action}-{element-type} pattern.

Current IDs are descriptive but not in the mandated format. Please rename them to an action-first pattern for consistency across E2E selectors.

Proposed patch
-          data-testid="team-icon-picker-trigger"
+          data-testid="open-button"
@@
-                  data-testid={`team-icon-option-${iconConfig.id}`}
+                  data-testid={`select-button-${iconConfig.id}`}

As per coding guidelines, "Add data-testid attributes to all interactive elements (buttons, inputs, links, selects, etc.) with naming format {action}-{element-type}".

Also applies to: 71-71

🤖 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 `@frontend/src/features/settings/components/teams/TeamIconPicker.tsx` at line
40, Rename the current data-testid attributes in the TeamIconPicker component to
follow the required "{action}-{element-type}" pattern: locate the data-testid on
the picker trigger in TeamIconPicker and change it to an action-first name
(e.g., "open-button" or "open-picker-button"), and also rename the second
data-testid used for the icon/select control (the attribute around the icon
button/select inside TeamIconPicker) to a matching action-first name (e.g.,
"select-icon-button" or "choose-icon-control"); update any tests or references
that rely on the old test ids to use the new names.
🤖 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 `@frontend/src/features/tasks/components/sidebar/TaskSidebar.tsx`:
- Around line 952-961: The TaskSidebar.tsx file is growing too large; extract
the TaskHistorySection and FixedGroupChatsSection components into their own
modules to keep TaskSidebar small. Create two new files exporting the components
(e.g., TaskHistorySection.tsx and FixedGroupChatsSection.tsx), move the
component definitions and any local helper functions/props types they use into
those files, update imports in TaskSidebar to import TaskHistorySection and
FixedGroupChatsSection, and ensure any shared types or utilities referenced by
both are either re-exported from a common module or imported from their original
locations; run type checks to fix any broken imports or missing props.

---

Outside diff comments:
In `@frontend/src/features/tasks/contexts/taskContext.tsx`:
- Around line 257-262: The current append logic in setGroupTasks adds
loadedItems without deduplicating among themselves, so duplicates from
overlapping fetched pages can be appended; update the handler that calls
setGroupTasks (the block using loadedItems and loadedPagesToAdd) to first
deduplicate loadedItems by id (e.g., build a Set/Map of seen ids and filter
loadedItems to unique ids) and then filter those unique loadedItems against
existingIds before returning [...prev, ...newItems], ensuring newItems are
unique both vs. prev and vs. each other.

---

Nitpick comments:
In `@frontend/src/features/settings/components/teams/TeamIconPicker.tsx`:
- Line 40: Rename the current data-testid attributes in the TeamIconPicker
component to follow the required "{action}-{element-type}" pattern: locate the
data-testid on the picker trigger in TeamIconPicker and change it to an
action-first name (e.g., "open-button" or "open-picker-button"), and also rename
the second data-testid used for the icon/select control (the attribute around
the icon button/select inside TeamIconPicker) to a matching action-first name
(e.g., "select-icon-button" or "choose-icon-control"); update any tests or
references that rely on the old test ids to use the new names.
🪄 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: 39310a19-7751-4adf-9853-ccf43be2fb43

📥 Commits

Reviewing files that changed from the base of the PR and between 534b207 and 03d1199.

⛔ Files ignored due to path filters (1)
  • knowledge_runtime/uv.lock is excluded by !**/*.lock
📒 Files selected for processing (13)
  • frontend/src/__tests__/features/settings/components/SimpleTeamEditDialog.test.tsx
  • frontend/src/__tests__/features/settings/constants/team-icons.test.ts
  • frontend/src/__tests__/features/tasks/components/sidebar/TaskListSection.test.tsx
  • frontend/src/__tests__/features/tasks/components/sidebar/TaskSidebar.test.tsx
  • frontend/src/__tests__/features/tasks/contexts/taskContext.group-loading.test.tsx
  • frontend/src/features/settings/components/team-edit/SimpleTeamEditForm.tsx
  • frontend/src/features/settings/components/teams/TeamIconPicker.tsx
  • frontend/src/features/settings/constants/team-icons.ts
  • frontend/src/features/tasks/components/sidebar/TaskListSection.tsx
  • frontend/src/features/tasks/components/sidebar/TaskSidebar.tsx
  • frontend/src/features/tasks/contexts/taskContext.tsx
  • frontend/src/types/api.ts
  • knowledge_runtime/pyproject.toml
💤 Files with no reviewable changes (1)
  • frontend/src/types/api.ts
🚧 Files skipped from review as they are similar to previous changes (3)
  • frontend/src/tests/features/settings/components/SimpleTeamEditDialog.test.tsx
  • frontend/src/features/tasks/components/sidebar/TaskListSection.tsx
  • frontend/src/features/settings/components/team-edit/SimpleTeamEditForm.tsx

Comment thread frontend/src/features/tasks/components/sidebar/TaskSidebar.tsx Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
.github/workflows/e2e-tests.yml (1)

78-78: ⚡ Quick win

Pin action to a specific commit SHA for supply chain security.

The actions/setup-python@v5 action uses a tag reference rather than a commit SHA. Pinning to a SHA prevents potential supply chain attacks if the tag is moved to malicious code.

🔒 Proposed fix to pin the action
-      - name: Set up Python
-        uses: actions/setup-python@v5
+      - name: Set up Python  
+        uses: actions/setup-python@0b93645e9bc87f85b8e95210b7e0e1c029e0462c # v5.0.0
         with:
           python-version: "3.11"

Note: You can find the commit SHA for v5.0.0 (or latest v5.x) from the actions/setup-python releases page.

As per coding guidelines from static analysis: "action is not pinned to a hash (required by blanket policy)".

🤖 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 @.github/workflows/e2e-tests.yml at line 78, Replace the floating tag
reference to the GitHub Action with a pinned commit SHA: locate the line using
the setup-python action (uses: actions/setup-python@v5) in the workflow and
change it to the corresponding commit SHA for the desired v5 release (e.g.,
uses: actions/setup-python@<commit-sha>) so the workflow references an immutable
commit; obtain the correct SHA from the actions/setup-python releases page and
update the uses entry accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In @.github/workflows/e2e-tests.yml:
- Line 78: Replace the floating tag reference to the GitHub Action with a pinned
commit SHA: locate the line using the setup-python action (uses:
actions/setup-python@v5) in the workflow and change it to the corresponding
commit SHA for the desired v5 release (e.g., uses:
actions/setup-python@<commit-sha>) so the workflow references an immutable
commit; obtain the correct SHA from the actions/setup-python releases page and
update the uses entry accordingly.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 5baadef1-c437-40ef-a9ea-aed630b5bf5f

📥 Commits

Reviewing files that changed from the base of the PR and between 03d1199 and 2cfa875.

📒 Files selected for processing (1)
  • .github/workflows/e2e-tests.yml

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant