diff --git a/apps/desktop/src/ui/Sidebar.tsx b/apps/desktop/src/ui/Sidebar.tsx index eb2b5b014..1ece71ae4 100644 --- a/apps/desktop/src/ui/Sidebar.tsx +++ b/apps/desktop/src/ui/Sidebar.tsx @@ -23,6 +23,7 @@ import { CircleAlert, CircleCheck, CircleDashed, + CircleDot, Clock, CloudUpload, Copy, @@ -313,35 +314,27 @@ function ThreadMenuItems({ onClear?.(); }} > - Mark {n} Unread + Mark {n} Unread ); } + // Most used first (pin, rename, unread, snooze), then the thread's state and what it changed, + // then the worktree's own actions; the occasional tools sit under More, and Trash last. return ( <> - {status !== "review" && ( - void setThreadStatus(session.id, "review")}> - Mark for Review - - )} - {status === "done" ? ( - void setThreadStatus(session.id, "idle")}> - Unsettle - - ) : ( - settleThread(session.id)}> - Settle - - )} - {status === "review" && ( - void setThreadStatus(session.id, "idle")}> - Clear Status + togglePin(session.id)}> + {pinned ? : } + {pinned ? "Unpin" : "Pin"} + + {!remote && ( + + Rename… )} - {statusMissing && ( -
Kept by the app: {statusMissing}
- )} + markUnread(session.id)}> + Mark Unread + {snoozed ? ( snoozeThread(session.id, null)}> Unsnooze @@ -375,49 +368,37 @@ function ThreadMenuItems({ )} - {!remote && ( - setView({ kind: "review", threadId: session.id })}> - Review Changes + + {status === "done" ? ( + void setThreadStatus(session.id, "idle")}> + Unsettle + + ) : ( + settleThread(session.id)}> + Settle )} - setAutoCompactForThread(session.id, autoCompactOff)}> - {autoCompactOff ? "Turn On Auto-compact" : "Turn Off Auto-compact"} - - markUnread(session.id)}> - Mark Unread - - - togglePin(session.id)}> - {pinned ? : } - {pinned ? "Unpin" : "Pin"} - - {!remote && ( - - Rename… + {status !== "review" && ( + void setThreadStatus(session.id, "review")}> + Mark for Review )} - void repairThread(session.id)}> - Repair Thread - - copyThreadLink(session.id)}> - Copy link - - copyText(session.id, "Thread ID copied")}> - Copy Thread ID - + {status === "review" && ( + void setThreadStatus(session.id, "idle")}> + Clear Status + + )} + {statusMissing && ( +
Kept by the app: {statusMissing}
+ )} {!remote && ( - - void openThreadLog(session.id).catch((e) => - toast(`Could not open the thread log: ${errorText(e)}`, "error"), - ) - } - > - Open Thread Log + setView({ kind: "review", threadId: session.id })}> + Review Changes )} + copyThreadLink(session.id)}> + Copy Link + {worktree && ( <> @@ -443,6 +424,46 @@ function ThreadMenuItems({ )} )} + + {/* What a thread needs now and then, not every day: kept one level down so the menu leads + with what is used. */} + + + More + + + + + setAutoCompactForThread(session.id, autoCompactOff)}> + {autoCompactOff ? "Turn On Auto-compact" : "Turn Off Auto-compact"} + + copyText(session.id, "Thread ID copied")}> + Copy Thread ID + + {!remote && ( + + void openThreadLog(session.id).catch((e) => + toast(`Could not open the thread log: ${errorText(e)}`, "error"), + ) + } + > + Open Thread Log + + )} + void repairThread(session.id)}> + Repair Thread + + + + {!remote && ( <>