💄 style(tasks): polish kanban columns, status labels, priority hotkeys#14137
Merged
Conversation
|
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 #14137 +/- ##
===========================================
- Coverage 86.12% 67.53% -18.60%
===========================================
Files 610 2192 +1582
Lines 51406 188781 +137375
Branches 8689 19560 +10871
===========================================
+ Hits 44273 127488 +83215
- Misses 7005 61165 +54160
Partials 128 128
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Task activity rows rendered "Untitled" while the topic was still running because the activity builder read `handoff.title` (populated post-summary) and fell back straight to a hardcoded constant. Join `topics` in `findWithHandoff` and fall through `handoff.title → topics.title → Untitled` so running topics show the task name instead of "Untitled". Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…low fold default
Replace WorkflowCollapse.defaultStreamingExpanded (bool) with
defaultWorkflowExpandLevel ('collapsed' | 'semi' | 'full'), threaded
through MessageItem → AssistantGroup → Group → WorkflowCollapse and
exposed on ChatList (applies to the default item renderer only).
When set, pins both the initial state and post-completion reset so
'full' keeps tool-call groups expanded across streaming → complete;
pending intervention still forces expansion.
Apply 'full' in the task detail TopicChatDrawer so viewers see all
tool details by default. Migrate the Onboarding caller from
defaultWorkflowExpanded={false} to defaultWorkflowExpandLevel='collapsed'.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
SWR's function-form refreshInterval is evaluated on effect mount and after each timer fires. When the first call runs with cache.data=undefined, our function returned 0 — so no timer was ever scheduled, and polling never started even after the fetch populated the cache. Drive polling from a reactive zustand selector instead, so refreshInterval is a stable number that flips once the task/topic status is known. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
"Paused" read like the task was stopped by the user. The actual semantic is "agent has finished a run and is waiting for user to review and nudge it next" — so rename the label in STATUS_META and the matching i18n keys (status.paused and the kanban column needsInput). Also promote paused into USER_SELECTABLE_STATUSES so users can explicitly park a task back into this state from the context menu. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Expose a dedicated "Canceled" column in the kanban board so canceled tasks no longer blend into the done column. Defaults to hidden (alongside done) to keep the board compact, and maps the new column key through COLUMN_STATUS_ICON plus the i18n table that KanbanColumn already referenced but was missing an entry for.
- Use colorTextSecondary (brighter than colorTextDescription) for non-urgent priority icons so they read against the row background. - Add a static label string to PRIORITY_META so callers can pass it as the i18n defaultValue instead of an empty string — prevents unlocalised UI when a translation is missing mid-rollout. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The task context menu already supported number shortcuts to switch status. Extend that to priority: when the user hovers the Priority submenu, pressing 1–5 picks the corresponding priority level. A ref tracks which submenu is active (defaults to Status on open) so the keydown handler knows which list to index into. Also pick up meta.label as the i18n defaultValue for priority entries, matching the new PRIORITY_META field so missing translations fall back to readable text instead of an empty string. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The vertical collapsed header was getting noisy with "Hidden · 2" style duplication — the count is already implied by the expanded tooltip, and the vertical orientation makes the trailing number crowd the icon. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Surface the 1–N keyboard shortcuts next to each status/priority entry, with a check icon on the currently selected value. Extract the render into a shared menuExtra helper so TaskStatusTag and TaskPriorityTag share the same pattern instead of each inlining its own layout. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
8d92cca to
b70317e
Compare
5 tasks
arvinxx
added a commit
that referenced
this pull request
Apr 25, 2026
) * 🔥 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>
Innei
pushed a commit
that referenced
this pull request
Apr 25, 2026
* 💄 style(claude-code): polish ToolSearch inspector tag
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* 🐛 fix(tasks): preserve topic title when handoff is missing
Task activity rows rendered "Untitled" while the topic was still running
because the activity builder read `handoff.title` (populated post-summary)
and fell back straight to a hardcoded constant. Join `topics` in
`findWithHandoff` and fall through `handoff.title → topics.title → Untitled`
so running topics show the task name instead of "Untitled".
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ✨ feat(conversation): add defaultWorkflowExpandLevel to control workflow fold default
Replace WorkflowCollapse.defaultStreamingExpanded (bool) with
defaultWorkflowExpandLevel ('collapsed' | 'semi' | 'full'), threaded
through MessageItem → AssistantGroup → Group → WorkflowCollapse and
exposed on ChatList (applies to the default item renderer only).
When set, pins both the initial state and post-completion reset so
'full' keeps tool-call groups expanded across streaming → complete;
pending intervention still forces expansion.
Apply 'full' in the task detail TopicChatDrawer so viewers see all
tool details by default. Migrate the Onboarding caller from
defaultWorkflowExpanded={false} to defaultWorkflowExpandLevel='collapsed'.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* 🐛 fix(tasks): restart detail polling after data arrives
SWR's function-form refreshInterval is evaluated on effect mount and after each
timer fires. When the first call runs with cache.data=undefined, our function
returned 0 — so no timer was ever scheduled, and polling never started even
after the fetch populated the cache. Drive polling from a reactive zustand
selector instead, so refreshInterval is a stable number that flips once the
task/topic status is known.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* 💄 style(tasks): rename paused label to "Pending review"
"Paused" read like the task was stopped by the user. The actual semantic is
"agent has finished a run and is waiting for user to review and nudge it next" —
so rename the label in STATUS_META and the matching i18n keys (status.paused
and the kanban column needsInput). Also promote paused into USER_SELECTABLE_STATUSES
so users can explicitly park a task back into this state from the context menu.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ✨ feat(tasks): add canceled kanban column
Expose a dedicated "Canceled" column in the kanban board so canceled tasks no
longer blend into the done column. Defaults to hidden (alongside done) to keep
the board compact, and maps the new column key through COLUMN_STATUS_ICON plus
the i18n table that KanbanColumn already referenced but was missing an entry
for.
* 💄 style(tasks): brighten priority icon and add label fallback
- Use colorTextSecondary (brighter than colorTextDescription) for non-urgent
priority icons so they read against the row background.
- Add a static label string to PRIORITY_META so callers can pass it as the
i18n defaultValue instead of an empty string — prevents unlocalised UI when
a translation is missing mid-rollout.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ✨ feat(tasks): route 1–N hotkeys to hovered status/priority submenu
The task context menu already supported number shortcuts to switch status. Extend
that to priority: when the user hovers the Priority submenu, pressing 1–5 picks
the corresponding priority level. A ref tracks which submenu is active (defaults
to Status on open) so the keydown handler knows which list to index into.
Also pick up meta.label as the i18n defaultValue for priority entries, matching
the new PRIORITY_META field so missing translations fall back to readable text
instead of an empty string.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* 💄 style(tasks): drop column count from collapsed hidden panel header
The vertical collapsed header was getting noisy with "Hidden · 2" style
duplication — the count is already implied by the expanded tooltip, and the
vertical orientation makes the trailing number crowd the icon.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* 💄 style(tasks): show hotkey hint and check in status/priority menu
Surface the 1–N keyboard shortcuts next to each status/priority entry, with a
check icon on the currently selected value. Extract the render into a shared
menuExtra helper so TaskStatusTag and TaskPriorityTag share the same pattern
instead of each inlining its own layout.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Innei
pushed a commit
that referenced
this pull request
Apr 25, 2026
) * 🔥 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
💻 Change Type
🔀 Description of Change
Two small changes:
Fix — Task activity shows "Untitled" for running topics
Task activity rows were rendering
Untitledfor in-progress topics. Root cause: the activity builder readstaskTopics.handoff.title, which is populated only after a topic completes (LLM-generated summary). Until then it fell through to a hardcodedUntitledconstant, so newly-started tasks always showedUntitledin the activity list — confusing users after clicking "Start task".The fix adds a middle layer to the fallback chain:
TaskTopicModel.findWithHandoffnow left-joins thetopicstable to returntitlealongsidehandoff. This also repairsbuildTaskPromptinsrc/server/routers/lambda/task.ts:226, which already expectedt.titlebut never received it.TaskServiceactivity builder useshandoff?.title || t.title || UNTITLED_TOPIC_TITLEso running topics show the task name (e.g.小说) and completed topics still show the LLM summary.Style — ToolSearch inspector tag polish
Tag in the Claude Code ToolSearch inspector is now a pill (fully-rounded, slightly more padding) to read more as a chip.
🧪 How to Test
Manual steps:
小说).小说) instead ofUntitled.Verified:
src/server/services/task/index.test.ts— 21/21 passedpackages/database/src/models/__tests__/taskTopic.test.ts— 8/8 passedbun run type-check— clean (one pre-existing.next/dev/typeserror unrelated)📸 Screenshots / Videos
Untitled #1 · 3s小说 #1 · 3sUntitledif summary unavailable🤖 Generated with Claude Code