1- import { useCallback , useMemo , useState } from 'react' ;
1+ import { useCallback , useEffect , useMemo , useState } from 'react' ;
22
33import Image from 'next/image' ;
44import { useRouter } from 'next/navigation' ;
@@ -74,6 +74,7 @@ export function TaskSidebar({
7474 onSelectTask,
7575} : TaskSidebarProps ) {
7676 const { agentexClient } = useAgentexClient ( ) ;
77+
7778 const { data : tasks = [ ] , isLoading : isLoadingTasks } = useTasks (
7879 agentexClient ,
7980 selectedAgentName ? { agentName : selectedAgentName } : undefined
@@ -99,6 +100,22 @@ export function TaskSidebar({
99100 setIsCollapsed ( prev => ! prev ) ;
100101 } , [ ] ) ;
101102
103+ // Global keyboard shortcut: cmd + k for new chat
104+ useEffect ( ( ) => {
105+ const handleKeyDown = ( event : KeyboardEvent ) => {
106+ if ( ( event . metaKey || event . ctrlKey ) && event . key === 'k' ) {
107+ event . preventDefault ( ) ;
108+ handleNewChat ( ) ;
109+ }
110+ } ;
111+
112+ window . addEventListener ( 'keydown' , handleKeyDown ) ;
113+
114+ return ( ) => {
115+ window . removeEventListener ( 'keydown' , handleKeyDown ) ;
116+ } ;
117+ } , [ handleNewChat ] ) ;
118+
102119 return (
103120 < ResizableSidebar
104121 side = "left"
@@ -208,10 +225,15 @@ function SidebarHeader({
208225 < Button
209226 onClick = { handleNewChat }
210227 variant = "ghost"
211- className = "text-sidebar-foreground flex items-center justify-start gap-2"
228+ className = "text-sidebar-foreground flex items-center justify-between gap-2"
212229 >
213- < SquarePen className = "size-5" />
214- New Chat
230+ < div className = "flex items-center gap-2" >
231+ < SquarePen className = "size-5" />
232+ New Chat
233+ </ div >
234+ < kbd className = "bg-muted text-muted-foreground pointer-events-none inline-flex h-5 items-center gap-1 rounded border px-1.5 font-mono text-[10px] font-medium opacity-100 select-none" >
235+ < span className = "text-xs/snug" > ⌘</ span > K
236+ </ kbd >
215237 </ Button >
216238 </ div >
217239 ) ;
0 commit comments