β¨ feat(tasks): unified Tasks routes, detail polish & CC Agent streaming#14109
Conversation
Completed tasks crowd the homepage card list and bury the ones that still need attention; extract sort/limit into a testable helper so the filter lives in one place. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
β¦ subagent thread toggle While a subagent is running (args parsed, tool_result not back) the CC Agent tool fell back to the generic εζ°ε葨 dump. Surface the instruction markdown and, once the executor has created the subagent Thread, the open/close subtopic button β so the user can jump into the live conversation instead of waiting for the summary. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Codecov Reportβ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## canary #14109 +/- ##
========================================
Coverage 67.33% 67.34%
========================================
Files 2155 2157 +2
Lines 184805 184890 +85
Branches 18303 19094 +791
========================================
+ Hits 124433 124506 +73
- Misses 60247 60259 +12
Partials 125 125
Flags with carried forward coverage won't be shown. Click here to find out more.
π New features to boost your workflow:
|
There was a problem hiding this comment.
π‘ Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b68cadbd3e
βΉοΈ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with π.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| export const getVisibleTaskCardTasks = (tasks: TaskListItem[]) => | ||
| tasks.filter((task) => task.status !== 'completed'); |
There was a problem hiding this comment.
Filter non-completed tasks in the fetch, not after truncation
getVisibleTaskCardTasks filters out completed items only after the list has already been fetched and paginated, which can hide active work. useFetchTaskList requests taskService.list({ assigneeAgentId }) without statuses/limit, and the backend defaults to limit=50 sorted by createdAt (src/server/routers/lambda/task.ts list schema), so if the newest 50 are completed while older backlog/running tasks still exist, this card becomes empty and disappears even though unresolved tasks remain. The status filter should be applied in the query (or fetch enough rows) so unfinished tasks are not dropped by pagination.
Useful? React with πΒ / π.
β¦ menu - Wire up /tasks as a top-level home sidebar item (gated on enableAgentTask) and register route metadata for Electron tab title - Render a dashed UserRound placeholder when a task has no assignee, and add a search input + arrow-key navigation to the agent picker popover - Wrap task list rows in a ContextMenuTrigger with status/priority submenus, copy id/link, and delete-with-confirm Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
β¦nt-scoped pages
Removes the per-agent `/agent/:aid/tasks` list and detail routes in favor of a
single cross-agent surface (`/tasks` list/kanban + `/task/:taskId` detail).
Kanban board now fetches across all agents via `useFetchTaskGroupList({ allAgents })`,
fixing the blank board on the `/tasks` route.
UI polish shipped alongside:
- Hidden kanban columns panel persists to global status, pinned to the right with
a swim-lane background to match other columns.
- Breadcrumb chevron margins tightened; separator, ancestors, and task detail
crumbs share the same compact styling.
- TaskDetailAssignee renders a clickable "Unassigned" placeholder when no agent
is set, so the selector is always reachable.
- Run button stays clickable without an assignee; falls back to the inbox agent
on click so users get a working default.
- Breadcrumb drops the per-agent tasks link; nav inside agents removes the now
dangling Tasks tab since `/tasks` is a top-level sidebar entry.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
β¦ooter Hides completed/canceled tasks by default in the list view with a Linear-style "N tasks hidden by display options Β· Show" footer and a toggle in the display-options popover. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
β¦p origin Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
β¦ webhook Consolidate workflow routes behind a single Hono app mounted at the catch-all /api/workflows/[[...route]], with per-domain sub-apps. New workflow segments now only need a folder under src/server/workflows-hono/ plus one app.route(...) line in the root β no new Next.js route files. Also implements /api/workflows/task/on-topic-complete, which task.run registers as the onComplete webhook. The handler wires the payload into TaskLifecycleService.onTopicComplete; task.run now also includes taskIdentifier in the webhook body so the handler skips a DB lookup. LOBE-6659 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Mount AgentTaskManager conversation alongside the task detail route and sync the task's assignee agent into chat store so the right panel talks to the correct agent - Reverse activities timeline to newest-first and float the comment input on top with a card-styled container and guiding placeholder copy - Redesign TopicCard with a live status icon, meta row, and dropdown actions (open run / copy id); introduce shared TopicStatusIcon with animated running state - Swap task status palette: running uses warning+CircleDot, paused uses info+Hand; show numeric shortcut extras on context menu status/priority items alongside the checkmark for the current value - Refresh hidden-columns panel to panel-open/close icons and inline the count beside the header - Drop fixed min height on create-task inline editor; tighten activity row padding - Fix Flexbox import in useTaskItemContextMenu (react-layout-kit β @lobehub/ui) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Task list does not save anything, but it reused the global taskSaveStatus from detail page β after editing a task, switching back to the list would still show "latest version loaded". Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Status is already expressed by the colored TopicStatusIcon next to the title. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
) * π₯ feat(tasks): drop per-agent /agent/:aid/tasks routes again PR #13887 reintroduced the per-agent Tasks surface (sidebar entry, route files, agentId-scoped breadcrumb/list/board, /agent/:aid/tasks/:taskId navigation) that #14109 had removed in favor of unified /tasks and /task/:id. Restore the unified-only model: drop the agent sidebar Tasks nav item, delete the agent-scoped route files, strip agent-tasks blocks from both desktopRouter configs, and revert the agentId props and per-agent navigate paths in AgentTasksPage / KanbanBoard / Breadcrumb / TaskDetailPage. Preserves #14137's canceled kanban column. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π fix(agent): redirect any agent sub-route before opening new topic handleNewTopic only checked /profile and /channel, so on /agent/:aid/page, /agent/:aid/cron/:cronId or other sub-routes the redirect was skipped and mutate() opened a new topic on a non-chat screen β looking ineffective to the user. Match useTopicNavigation's pattern: derive an agent base path from params (with topicId when present) and treat anything longer than that as a sub-route, so adding new sub-routes never re-introduces this gap. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π fix(agent): always push agent chat route before opening new topic The previous fix conditioned the redirect on isInAgentSubRoute, which left the URL untouched on /agent/:aid/:topicId β opening a new topic while the URL still pointed at the previous one. Drop the conditional and always push /agent/:aid: it covers every sub-route (/profile, /channel, /page, /cron/:cronId, β¦) and strips any stale :topicId so the URL matches the freshly opened topic. Restores Nav.test.tsx. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
β¦ng (#14109) * β¨ feat: polish task list id and date display * β¨ feat: hide completed tasks from agent task card list Completed tasks crowd the homepage card list and bury the ones that still need attention; extract sort/limit into a testable helper so the filter lives in one place. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * β¨ feat(claude-code): render Agent tool streaming with instruction and subagent thread toggle While a subagent is running (args parsed, tool_result not back) the CC Agent tool fell back to the generic εζ°ε葨 dump. Surface the instruction markdown and, once the executor has created the subagent Thread, the open/close subtopic button β so the user can jump into the live conversation instead of waiting for the summary. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * β¨ feat(tasks): add /tasks sidebar entry and Linear-style item context menu - Wire up /tasks as a top-level home sidebar item (gated on enableAgentTask) and register route metadata for Electron tab title - Render a dashed UserRound placeholder when a task has no assignee, and add a search input + arrow-key navigation to the agent picker popover - Wrap task list rows in a ContextMenuTrigger with status/priority submenus, copy id/link, and delete-with-confirm Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * β¨ feat(tasks): unify task routes under /tasks and /task/:id, drop agent-scoped pages Removes the per-agent `/agent/:aid/tasks` list and detail routes in favor of a single cross-agent surface (`/tasks` list/kanban + `/task/:taskId` detail). Kanban board now fetches across all agents via `useFetchTaskGroupList({ allAgents })`, fixing the blank board on the `/tasks` route. UI polish shipped alongside: - Hidden kanban columns panel persists to global status, pinned to the right with a swim-lane background to match other columns. - Breadcrumb chevron margins tightened; separator, ancestors, and task detail crumbs share the same compact styling. - TaskDetailAssignee renders a clickable "Unassigned" placeholder when no agent is set, so the selector is always reachable. - Run button stays clickable without an assignee; falls back to the inbox agent on click so users get a working default. - Breadcrumb drops the per-agent tasks link; nav inside agents removes the now dangling Tasks tab since `/tasks` is a top-level sidebar entry. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * β¨ feat(tasks): hide completed & canceled tasks by default with Show footer Hides completed/canceled tasks by default in the list view with a Linear-style "N tasks hidden by display options Β· Show" footer and a toggle in the display-options popover. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * β¨ feat(tasks): add copy id/link actions to task detail header, use app origin Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π₯ refactor(tasks): drop agentId plumbing from unified task detail route Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π style(tasks): float topic chat drawer with read-only messages Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π style(tasks): inline subtasks add button and run button loading state Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * β¨ feat(workflows): unify hono scaffold and add task on-topic-complete webhook Consolidate workflow routes behind a single Hono app mounted at the catch-all /api/workflows/[[...route]], with per-domain sub-apps. New workflow segments now only need a folder under src/server/workflows-hono/ plus one app.route(...) line in the root β no new Next.js route files. Also implements /api/workflows/task/on-topic-complete, which task.run registers as the onComplete webhook. The handler wires the payload into TaskLifecycleService.onTopicComplete; task.run now also includes taskIdentifier in the webhook body so the handler skips a DB lookup. LOBE-6659 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π style(tasks): align subtasks header pill with add button on same row Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * β¨ feat(tasks): add AgentTaskManager side panel and polish task detail - Mount AgentTaskManager conversation alongside the task detail route and sync the task's assignee agent into chat store so the right panel talks to the correct agent - Reverse activities timeline to newest-first and float the comment input on top with a card-styled container and guiding placeholder copy - Redesign TopicCard with a live status icon, meta row, and dropdown actions (open run / copy id); introduce shared TopicStatusIcon with animated running state - Swap task status palette: running uses warning+CircleDot, paused uses info+Hand; show numeric shortcut extras on context menu status/priority items alongside the checkmark for the current value - Refresh hidden-columns panel to panel-open/close icons and inline the count beside the header - Drop fixed min height on create-task inline editor; tighten activity row padding - Fix Flexbox import in useTaskItemContextMenu (react-layout-kit β @lobehub/ui) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π style(tasks): show topic status icon in chat drawer title Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π fix(tasks): drop stale AutoSaveHint on task list page Task list does not save anything, but it reused the global taskSaveStatus from detail page β after editing a task, switching back to the list would still show "latest version loaded". Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π style(tasks): drop redundant status tag in topic chat drawer title Status is already expressed by the colored TopicStatusIcon next to the title. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π style(tasks): add tooltip hint for unassigned assignee Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π style(tasks): polish topic chat drawer border and spacing Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π style(tasks): show check before shortcut in context menu extra Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
) * π₯ feat(tasks): drop per-agent /agent/:aid/tasks routes again PR #13887 reintroduced the per-agent Tasks surface (sidebar entry, route files, agentId-scoped breadcrumb/list/board, /agent/:aid/tasks/:taskId navigation) that #14109 had removed in favor of unified /tasks and /task/:id. Restore the unified-only model: drop the agent sidebar Tasks nav item, delete the agent-scoped route files, strip agent-tasks blocks from both desktopRouter configs, and revert the agentId props and per-agent navigate paths in AgentTasksPage / KanbanBoard / Breadcrumb / TaskDetailPage. Preserves #14137's canceled kanban column. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π fix(agent): redirect any agent sub-route before opening new topic handleNewTopic only checked /profile and /channel, so on /agent/:aid/page, /agent/:aid/cron/:cronId or other sub-routes the redirect was skipped and mutate() opened a new topic on a non-chat screen β looking ineffective to the user. Match useTopicNavigation's pattern: derive an agent base path from params (with topicId when present) and treat anything longer than that as a sub-route, so adding new sub-routes never re-introduces this gap. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * π fix(agent): always push agent chat route before opening new topic The previous fix conditioned the redirect on isInAgentSubRoute, which left the URL untouched on /agent/:aid/:topicId β opening a new topic while the URL still pointed at the previous one. Drop the conditional and always push /agent/:aid: it covers every sub-route (/profile, /channel, /page, /cron/:cronId, β¦) and strips any stale :topicId so the URL matches the freshly opened topic. Restores Nav.test.tsx. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
π» Change Type
π Related Issue
N/A
π Description of Change
Two themes in this branch.
A. Unified Tasks page (cross-agent)
Replace the agent-scoped
/agent/:aid/taskspages with a single cross-agent surface at/tasks(list) +/task/:taskId(detail), and polish the detail UI./tasks(list) and/task/:taskId(detail) registered in bothdesktopRouter.config*; legacyagent/tasksremoved; sidebar gets a top-level Tasks entry.formatTaskItemDatehelper driven bydiscover:time.format*keys; completed & canceled tasks hidden by default behind a footer Show n toggle; Linear-style right-click context menu (useTaskItemContextMenu) with copy id / copy link / open in board view.APP_URLorigin so links resolve outside the local instanceagentIdplumbing throughTaskDetailPage/ route params, since the unified route doesn't need itisStartingstate shows a loading button between click and status flip (covers the lag before the server flips status)MessageItem disableEditing,ChatList disableActionsBar)B. Claude Code Agent tool β streaming render
While a CC subagent is running, the Agent tool used to fall back to the generic εζ°ε葨 arg dump. Register a dedicated streaming component that shows the instruction markdown plus β once the executor has created the subagent Thread β an open/close subtopic toggle so the user can jump into the live conversation instead of waiting for the summary.
Wiring:
packages/builtin-tool-claude-code/src/client/Streaming/Agent/index.tsxβ the rendererpackages/builtin-tool-claude-code/src/client/Streaming/index.tsβ exposesClaudeCodeStreamingspackages/builtin-tools/src/streamings.tsβ registers it underClaudeCodeIdentifierπ§ͺ How to Test
Unit tests:
formatTaskItemDate.test.tsβ date format branching (today / this year / other year)taskCardListDisplay.test.tsβ completed filter + sort + limitManual (desktop SPA):
π Additional Information
Known gap (out of scope, separate follow-up PR): tasks can remain stuck in
runningstatus after the agent completes. Two issues found while testing this branch:TaskLifecycleService.onTopicCompleteonly branches onreason === 'done' | 'error'βmax_steps/cost_limit/waiting_for_human/interruptedfall through with no status update.src/server/routers/lambda/task.tsdeclares webhook URL/api/workflows/task/on-topic-complete, but no route handler exists undersrc/app/(backend)/api/workflows/task/. In queue mode (isQueueAgentRuntimeEnabled) the local handler is skipped and the webhook 404 is silently swallowed, so the task lifecycle never finalizes.Will be fixed in a follow-up PR.
π€ Generated with Claude Code