diff --git a/.changeset/fn-7386-activity-expand.md b/.changeset/fn-7386-activity-expand.md
new file mode 100644
index 0000000000..4d0cc1783e
--- /dev/null
+++ b/.changeset/fn-7386-activity-expand.md
@@ -0,0 +1,7 @@
+---
+"@runfusion/fusion": patch
+---
+
+summary: Fix Activity expand controls so Live and Feed overlay content and Raw has one fullscreen button.
+category: fix
+dev: Updates task-detail Activity Live/Feed overlay controls and keeps Raw on AgentLogViewer fullscreen.
diff --git a/packages/dashboard/app/components/AgentLogViewer.css b/packages/dashboard/app/components/AgentLogViewer.css
index 60de50ad46..a14bd70218 100644
--- a/packages/dashboard/app/components/AgentLogViewer.css
+++ b/packages/dashboard/app/components/AgentLogViewer.css
@@ -42,6 +42,12 @@
background: var(--text-muted);
}
+.agent-log-empty-header {
+ display: flex;
+ justify-content: flex-end;
+ padding: var(--space-sm) var(--space-md) 0;
+}
+
.agent-log-loading,
.agent-log-empty {
display: flex;
diff --git a/packages/dashboard/app/components/AgentLogViewer.tsx b/packages/dashboard/app/components/AgentLogViewer.tsx
index 0b052b67c9..bb50d6cbb8 100644
--- a/packages/dashboard/app/components/AgentLogViewer.tsx
+++ b/packages/dashboard/app/components/AgentLogViewer.tsx
@@ -451,6 +451,18 @@ export function AgentLogViewer({
const hasValidatorOverride = validatorModel?.provider && validatorModel?.modelId;
const hasPlanningOverride = planningModel?.provider && planningModel?.modelId;
+ const fullscreenToggle = (
+
+ );
+
const modelProviders = useMemo(() => {
const providers: Array<{ role: string; provider: string; modelId?: string }> = [];
if (hasExecutorOverride) {
@@ -486,7 +498,11 @@ export function AgentLogViewer({
if (loading && entries.length === 0) {
return (
-
+
+ {/* FNXC:TaskDetailActivity 2026-07-01-00:00: Activity → Raw owns one fullscreen affordance through AgentLogViewer even while logs are loading, because TaskDetailModal intentionally omits its Activity-level expand button on Raw to avoid duplicate controls. */}
+
+
{fullscreenToggle}
+
{t("agentLog.loading", "Loading agent logs…")}
);
@@ -494,7 +510,11 @@ export function AgentLogViewer({
if (entries.length === 0) {
return (
-
+
+ {/* FNXC:TaskDetailActivity 2026-07-01-00:00: Empty Raw logs still expose the single AgentLogViewer fullscreen button so Raw never needs the duplicate Activity expand toggle. */}
+
{modelHeaderExpanded && (
diff --git a/packages/dashboard/app/components/TaskChatTab.tsx b/packages/dashboard/app/components/TaskChatTab.tsx
index d5d9f2b8af..c706f59a15 100644
--- a/packages/dashboard/app/components/TaskChatTab.tsx
+++ b/packages/dashboard/app/components/TaskChatTab.tsx
@@ -874,7 +874,7 @@ export function TaskChatTab({ task, projectId, active, addToast, onTaskUpdated,
aria-pressed={expanded}
data-testid="task-chat-expand-toggle"
>
- {/* FNXC:TaskDetailActivity 2026-06-30-23:55: The legacy TaskChatTab expand affordance now uses Activity-wide copy when a caller still renders it; TaskDetailModal owns the visible Activity-level toggle across Live, Feed, and Raw Logs. */}
+ {/* FNXC:TaskDetailActivity 2026-07-01-00:00: TaskDetailModal passes Activity-expanded state into Live so this existing chat overlay remains the single Live expand affordance without adding a separate toolbar row. */}
{expanded ? : }
) : null}
diff --git a/packages/dashboard/app/components/TaskDetailModal.css b/packages/dashboard/app/components/TaskDetailModal.css
index f6160409f4..51ef5acebc 100644
--- a/packages/dashboard/app/components/TaskDetailModal.css
+++ b/packages/dashboard/app/components/TaskDetailModal.css
@@ -2564,14 +2564,15 @@ The Activity view menu is portaled to the document body and fixed-positioned bec
font-weight: 600;
}
-.activity-toolbar {
- display: flex;
- align-items: flex-start;
- justify-content: flex-end;
- gap: var(--space-sm);
- margin-bottom: var(--space-md);
+.detail-activity {
+ position: relative;
+ padding-inline-end: calc(var(--space-2xl) + var(--space-md));
}
+/*
+FNXC:TaskDetailActivity 2026-07-01-00:00:
+Live and Feed Activity expansion overlays the content instead of reserving a toolbar row. Feed keeps enough tokenized inline padding that the fixed affordance does not cover log text; Raw uses AgentLogViewer's fullscreen button and does not render this Activity toggle.
+*/
.activity-expand-toggle {
flex: 0 0 auto;
min-inline-size: var(--space-2xl);
@@ -2579,6 +2580,16 @@ The Activity view menu is portaled to the document body and fixed-positioned bec
padding: 0;
}
+.activity-expand-toggle--overlay {
+ position: absolute;
+ top: var(--space-md);
+ right: var(--space-md);
+ z-index: 3;
+ background: var(--surface);
+ border-color: var(--border);
+ box-shadow: var(--shadow-sm);
+}
+
.detail-log-loading {
display: flex;
align-items: center;
@@ -2592,19 +2603,24 @@ The Activity view menu is portaled to the document body and fixed-positioned bec
}
@media (max-width: 768px) {
- .activity-toolbar {
- align-items: stretch;
- }
-
.activity-view-menu {
max-inline-size: calc(100vw - (var(--space-md) * 2));
}
+ .detail-activity {
+ padding-inline-end: calc(var(--space-2xl) + var(--space-lg));
+ }
+
.activity-expand-toggle {
min-inline-size: calc(var(--space-2xl) + var(--space-sm));
min-block-size: calc(var(--space-2xl) + var(--space-sm));
}
+ .activity-expand-toggle--overlay {
+ top: var(--space-sm);
+ right: var(--space-sm);
+ }
+
.detail-log-loading {
min-height: calc(var(--space-2xl) + var(--space-lg));
}
diff --git a/packages/dashboard/app/components/TaskDetailModal.tsx b/packages/dashboard/app/components/TaskDetailModal.tsx
index 07f35da5f1..8a386c8094 100644
--- a/packages/dashboard/app/components/TaskDetailModal.tsx
+++ b/packages/dashboard/app/components/TaskDetailModal.tsx
@@ -3666,20 +3666,11 @@ export function TaskDetailContent({
The first Activity segment is user-facing Live but keeps the legacy `current` segment id. Activity expansion is segment-wide, so the same reachable toggle must remain present on Live, Feed, and Raw without fetching Raw outside the Raw segment.
FNXC:TaskDetailActivity 2026-06-30-23:59:
- The Activity tab in the top-level tab strip is now the view dropdown for Live, Feed, and Raw. The in-panel Activity view select was removed so Activity expansion remains the only toolbar affordance inside the panel while legacy routing and Raw-only fetching keep their stable ids (`chat`, `current`, `feed`, `raw-logs`).
+ The Activity tab in the top-level tab strip is now the view dropdown for Live, Feed, and Raw. The in-panel Activity view select was removed so Activity expansion remains the only Activity-level affordance inside the panel while legacy routing and Raw-only fetching keep their stable ids (`chat`, `current`, `feed`, `raw-logs`).
+
+ FNXC:TaskDetailActivity 2026-07-01-00:00:
+ Activity expansion must not reserve a standalone toolbar row. Live uses TaskChatTab's anchored overlay button, Feed renders the same Activity toggle over its feed panel, and Raw keeps AgentLogViewer's fullscreen control so only one Raw expand affordance is reachable.
*/}
-