diff --git a/CHANGELOG.md b/CHANGELOG.md index 125070b8..542fa4b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,11 @@ All notable changes to GoClaw are documented here. For full documentation, see [ ### Added +- **Task detail dialog shows the full task UUID with one-click copy** — the + short identifier (`T-015-cc8e`) carries only the last four hex characters of + the UUID, while the agent-facing `team_tasks` tool and RPCs take the full + UUID, so a human had no way to name a task to the lead from the dashboard. + - **Behavior UX sidecar delivery overrides** — Adds sidecar-generated Quick Acknowledgement and Intermediate Replies with provider/model, timeout, token, and char caps. Effective config resolves Channel > Agent > Workspace, with diff --git a/ui/web/src/i18n/locales/en/teams.json b/ui/web/src/i18n/locales/en/teams.json index 08fbc844..74ef3a2d 100644 --- a/ui/web/src/i18n/locales/en/teams.json +++ b/ui/web/src/i18n/locales/en/teams.json @@ -117,7 +117,9 @@ "followupCountMax": "Reminders sent: {{count}}/{{max}}", "followupNext": "Next reminder:", "followupDone": "All reminders sent", - "download": "Download" + "download": "Download", + "copyId": "Copy task ID", + "copied": "Copied" }, "delete": "Delete", "deleteConfirm": "Delete this task? This cannot be undone.", diff --git a/ui/web/src/i18n/locales/ko/teams.json b/ui/web/src/i18n/locales/ko/teams.json index b3d1b29b..bc13f11f 100644 --- a/ui/web/src/i18n/locales/ko/teams.json +++ b/ui/web/src/i18n/locales/ko/teams.json @@ -117,7 +117,9 @@ "followupCountMax": "알림 발송: {{count}}/{{max}}회", "followupNext": "다음 알림:", "followupDone": "모든 알림 발송됨", - "download": "다운로드" + "download": "다운로드", + "copyId": "작업 ID 복사", + "copied": "복사됨" }, "delete": "삭제", "deleteConfirm": "이 태스크를 삭제하시겠습니까? 취소할 수 없습니다.", diff --git a/ui/web/src/i18n/locales/ru/teams.json b/ui/web/src/i18n/locales/ru/teams.json index 273d8768..7e7f4af3 100644 --- a/ui/web/src/i18n/locales/ru/teams.json +++ b/ui/web/src/i18n/locales/ru/teams.json @@ -117,7 +117,9 @@ "followupCountMax": "Отправлено напоминаний: {{count}}/{{max}}", "followupNext": "Следующее напоминание:", "followupDone": "Все напоминания отправлены", - "download": "Скачать" + "download": "Скачать", + "copyId": "Скопировать ID задачи", + "copied": "Скопировано" }, "delete": "Удалить", "deleteConfirm": "Удалить эту задачу? Это действие нельзя отменить.", diff --git a/ui/web/src/i18n/locales/vi/teams.json b/ui/web/src/i18n/locales/vi/teams.json index 9eaeb63a..30d0734d 100644 --- a/ui/web/src/i18n/locales/vi/teams.json +++ b/ui/web/src/i18n/locales/vi/teams.json @@ -117,7 +117,9 @@ "followupCountMax": "Đã nhắc: {{count}}/{{max}} lần", "followupNext": "Nhắc tiếp:", "followupDone": "Đã nhắc hết", - "download": "Tải xuống" + "download": "Tải xuống", + "copyId": "Sao chép ID tác vụ", + "copied": "Đã sao chép" }, "delete": "Xoá", "deleteConfirm": "Xoá task này? Không thể hoàn tác.", diff --git a/ui/web/src/i18n/locales/zh/teams.json b/ui/web/src/i18n/locales/zh/teams.json index d260355e..4053e309 100644 --- a/ui/web/src/i18n/locales/zh/teams.json +++ b/ui/web/src/i18n/locales/zh/teams.json @@ -117,7 +117,9 @@ "followupCountMax": "已提醒:{{count}}/{{max}} 次", "followupNext": "下次提醒:", "followupDone": "已全部提醒", - "download": "下载" + "download": "下载", + "copyId": "复制任务 ID", + "copied": "已复制" }, "delete": "删除", "deleteConfirm": "删除此任务?此操作无法撤消。", diff --git a/ui/web/src/pages/teams/task-sections/task-detail-dialog.tsx b/ui/web/src/pages/teams/task-sections/task-detail-dialog.tsx index 957d7b24..3e3e33f0 100644 --- a/ui/web/src/pages/teams/task-sections/task-detail-dialog.tsx +++ b/ui/web/src/pages/teams/task-sections/task-detail-dialog.tsx @@ -7,7 +7,7 @@ import { Button } from "@/components/ui/button"; import { Separator } from "@/components/ui/separator"; import { ConfirmDialog } from "@/components/shared/confirm-dialog"; import { - Trash2, ArrowUp, ArrowDown, ArrowRight, AlertTriangle, + Trash2, ArrowUp, ArrowDown, ArrowRight, AlertTriangle, Copy, Check, } from "lucide-react"; import { useTranslation } from "react-i18next"; import { formatDate } from "@/lib/format"; @@ -41,6 +41,42 @@ function priorityLabel(priority?: number) { return priority != null ? (PRIORITY_CONFIG[priority]?.label ?? String(priority)) : "\u2014"; } +/* ── Task UUID with copy ──────────────────────────────────────── */ + +// The short identifier (T-015-cc8e) carries only the last four hex chars of +// the UUID, while every agent-facing tool (team_tasks get/retry/cancel, comments) +// takes the full UUID. Show it in full and make it one click to copy so a +// human can hand the exact task to the lead in chat. +function TaskIdCopy({ id, label, copiedLabel }: { id: string; label: string; copiedLabel: string }) { + const [copied, setCopied] = useState(false); + useEffect(() => { + if (!copied) return; + const timer = setTimeout(() => setCopied(false), 1500); + return () => clearTimeout(timer); + }, [copied]); + + const copy = async () => { + try { + await navigator.clipboard.writeText(id); + setCopied(true); + } catch { /* clipboard unavailable (insecure context) — the text is still selectable */ } + }; + + return ( + + ); +} + /* ── Metadata item ────────────────────────────────────────────── */ function MetaItem({ label, children }: { label: string; children: React.ReactNode }) { @@ -129,6 +165,7 @@ export function TaskDetailDialog({ {task.status.replace(/_/g, " ")} + {task.subject}