3ff3a53c75
* feat(web): structured renderers for Kandev MCP tool calls Replaces the raw-JSON dump in the chat for every Kandev MCP tool with a per-tool structured view. Adds 20 renderers — list (workspaces, workflows, workflow-steps, tasks, related, agents, executor-profiles, task-documents), task actions (create/update/move/message), plan + document (get/create/update/ delete plan, get/write document, conversation), and ask_user_question. Dispatcher in message-renderer.tsx scans tool name on metadata.title, comment.content and normalized.generic.name (the ACP normalizer's "name" field is the *category*, often "other", not the tool name). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(web): address review feedback on kandev tool renderers - ask_user_question: accept both keyed-object and positional-array responses shapes (replaces pickObject which silently discarded arrays). - get_task_conversation: derive the "more not shown" footer from the backend's absolute total so paginated responses don't hide pages, and guard the leading SummaryDot when both taskId and sessionId are absent. - IdChip: drop unused label prop and the stale label="..." callsites. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(web): consistency follow-ups on kandev renderers - Guard the leading SummaryDot in GetTaskPlanRenderer and UpdateTaskPlanRenderer the same way GetTaskConversationRenderer does. - ListTaskDocumentsRenderer reads `total` from the result like the other list renderers, so a paginated document list doesn't understate. - Add a regression test for the positional-array `responses` branch in matchAnswerForQuestion. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(web): guard MoveTaskRenderer SummaryDot Same orphan-dot fix as the other renderers — only render the dot when both flanking IdChips are present. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(web): final review nits on kandev renderers - ask_user_question: use shortId() for the pending_id hint instead of hand-rolled slice (handles short ids correctly). - list-renderers: add a stable index fallback to every map() key when id/name/title are all absent, so React reconciliation stays stable on malformed payloads. - MoveTaskRenderer: extend hasExpandableContent to cover workflow/step rows so they remain accessible without task/prompt data. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Kandev Agent <agent@kandev.dev> Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>