-
{task.description || 'Background task'}
-
+
{task.description || 'Background task'}
+
{task.taskType ?? 'task'} · {task.status ? (task.summary ?? task.status) : 'running…'}
- {running &&
}
+ {running &&
}
@@ -147,7 +158,10 @@ const TaskPanel = ({ task, onClose }: TaskPanelProps) => {
const el = ev.currentTarget;
pinnedRef.current = el.scrollHeight - el.scrollTop - el.clientHeight < 40;
}}
- className="max-h-64 overflow-y-auto border-t border-duck-dark/10 px-2 py-1.5"
+ // The composer is `shrink-0` and the transcript above it is `flex-1 min-h-0`, so every pixel this
+ // panel takes comes out of the transcript — a flat max-h-64 could leave almost no conversation
+ // visible in a short panel. Capped against the viewport as well as in absolute terms.
+ className="max-h-[min(16rem,25vh)] overflow-y-auto border-t border-border px-2 py-1.5"
>
@@ -167,8 +181,10 @@ const TaskBody = ({ detail, isLoading }: TaskBodyProps) => {
if (detail.kind === 'log') {
return (
<>
- {detail.truncated &&
… earlier output trimmed
}
-
+ {detail.truncated && … earlier output trimmed
}
+ {/* The terminal look is deliberate and stays; break-words rather than break-all, which split
+ words mid-character and made paths unreadable. */}
+
{detail.text || '(no output yet)'}
>
@@ -179,4 +195,6 @@ const TaskBody = ({ detail, isLoading }: TaskBodyProps) => {
return ;
};
-const Placeholder = ({ text }: { text: string }) => {text}
;
+const Placeholder = ({ text }: { text: string }) => (
+ {text}
+);
diff --git a/src/workspaces/officerdev/src/apps/Chat/components/CopyButton.tsx b/src/workspaces/officerdev/src/apps/Chat/components/CopyButton.tsx
index 46e3f863..2029b174 100644
--- a/src/workspaces/officerdev/src/apps/Chat/components/CopyButton.tsx
+++ b/src/workspaces/officerdev/src/apps/Chat/components/CopyButton.tsx
@@ -19,7 +19,7 @@ export const CopyButton = ({ text, className = '' }: CopyButtonProps) => {