- Create or modify focused hooks only under existing `apps/ui/src/features/*`
- Create or modify focused hooks only under existing `apps/ui/src/features/*`
-[]**Step 1: 拆出纯 props 组装**
-[x]**Step 1: 拆出纯 props 组装**
Move only pure prop-building logic from `App.tsx` into focused helpers or hooks when all inputs are already available.
Move only pure prop-building logic from `App.tsx` into focused helpers or hooks when all inputs are already available.
...
@@ -274,7 +274,12 @@
...
@@ -274,7 +274,12 @@
- No IPC calls move across ownership boundaries in this step.
- No IPC calls move across ownership boundaries in this step.
-`App.tsx` line count decreases, but line count is not the success metric; clearer ownership is.
-`App.tsx` line count decreases, but line count is not the success metric; clearer ownership is.
-[]**Step 2: Keep high-risk flows in place**
Progress note:
- Completed on 2026-05-25 by grouping `ConversationWorkspaceView` props into focused `status`, `emptyState`, `messages`, `composer`, and `actions` objects.
- IPC calls, stream lifecycle, composer submit/cancel, session actions, startup overlay actions, and smoke hooks remain in `App.tsx`.
-[x]**Step 2: Keep high-risk flows in place**
Do not move these during this phase:
Do not move these during this phase:
...
@@ -289,7 +294,11 @@
...
@@ -289,7 +294,11 @@
- Existing smoke tests do not need selector or action rewrites.
- Existing smoke tests do not need selector or action rewrites.
-[]**Step 3: Reduce oversized component props**
Progress note:
- Confirmed during the prop grouping pass; no smoke contract or high-risk flow was moved.
-[x]**Step 3: Reduce oversized component props**
For `ConversationWorkspaceView`, group related props into typed objects only when ownership is obvious:
For `ConversationWorkspaceView`, group related props into typed objects only when ownership is obvious: