diff --git a/docs/chat-chain-changes/2026-11-05-agent-activity-layout.md b/docs/chat-chain-changes/2026-11-05-agent-activity-layout.md
new file mode 100644
index 0000000..2f3cd68
--- /dev/null
+++ b/docs/chat-chain-changes/2026-11-05-agent-activity-layout.md
@@ -0,0 +1,10 @@
+---
+date: 2026-11-05
+pr: pending
+feature: Agent activity layout
+impact: The current agent's thinking state and tool calls appear below its profile header and before its answer. Completed tool calls remain collapsed above the answer; chat events and persistence are unchanged.
+---
+
+The active run uses a temporary display-only assistant row until an answer is
+available. It uses the session profile avatar and does not create an empty
+message bubble or persist a placeholder.
diff --git a/packages/client/src/components/hermes/chat/MessageItem.vue b/packages/client/src/components/hermes/chat/MessageItem.vue
index bf55fff..658e271 100644
--- a/packages/client/src/components/hermes/chat/MessageItem.vue
+++ b/packages/client/src/components/hermes/chat/MessageItem.vue
@@ -35,7 +35,7 @@ const JSON_MAX_KEYS_PER_OBJECT = 50;
const JSON_MAX_ITEMS_PER_ARRAY = 50;
const JSON_TRUNCATED_KEY = "__truncated__";
-const props = defineProps<{ message: Message; highlight?: boolean; headingIdPrefix?: string; showForkAction?: boolean }>();
+const props = defineProps<{ message: Message; highlight?: boolean; headingIdPrefix?: string; showForkAction?: boolean; activityOnly?: boolean }>();
const { t } = useI18n();
const toast = useMessage();
@@ -1021,7 +1021,8 @@ onBeforeUnmount(() => {
/>
{{ assistantProfileName }}
-
+
+
-
-
-
-
+ :activity-only="msg.id === `run-activity-${chatStore.activeSessionId}`"
+ >
+
+
+ {{ t('chat.toolCallsGroup', { count: msg.toolMessages.length }) }}
+
+
+
-
{{ t("chat.thinkingInProgress") }}
{{ formattedThinkingElapsed }}
@@ -696,7 +708,8 @@ defineExpose({
-
+
+