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}