@@ -19,6 +19,7 @@ export interface SessionsState {
1919 filteredRuns : ProductionRun [ ] ;
2020 selected : ProductionRun | null ;
2121 annotations : Annotation [ ] ;
22+ quickSearch : string ;
2223 repoSearch : string ;
2324 sourceFilter : string ;
2425 rangeFilter : "24h" | "7d" | "30d" | "all" ;
@@ -42,6 +43,7 @@ export interface SessionsState {
4243 toolCallId ?: string ,
4344 ) => void ;
4445 handleTurnToggle : ( turnId : string ) => void ;
46+ setQuickSearch : ( v : string ) => void ;
4547 setRepoSearch : ( v : string ) => void ;
4648 setSourceFilter : ( v : string ) => void ;
4749 setRangeFilter : ( v : "24h" | "7d" | "30d" | "all" ) => void ;
@@ -67,6 +69,9 @@ export function useSessionsState(): SessionsState {
6769 const [ showSessionAnnotationForm , setShowSessionAnnotationForm ] =
6870 useState ( false ) ;
6971 const [ loading , setLoading ] = useState ( true ) ;
72+ const [ quickSearch , setQuickSearch ] = useState (
73+ searchParams . get ( "q" ) || "" ,
74+ ) ;
7075 const [ repoSearch , setRepoSearch ] = useState (
7176 searchParams . get ( "repo" ) || "" ,
7277 ) ;
@@ -166,6 +171,7 @@ export function useSessionsState(): SessionsState {
166171 ) ;
167172
168173 useEffect ( ( ) => {
174+ setQuickSearch ( searchParams . get ( "q" ) || "" ) ;
169175 setRepoSearch ( searchParams . get ( "repo" ) || "" ) ;
170176 setSourceFilter ( searchParams . get ( "source" ) || "all" ) ;
171177 setRangeFilter (
@@ -176,12 +182,13 @@ export function useSessionsState(): SessionsState {
176182
177183 useEffect ( ( ) => {
178184 const nextParams = new URLSearchParams ( ) ;
185+ if ( quickSearch ) nextParams . set ( "q" , quickSearch ) ;
179186 if ( repoSearch ) nextParams . set ( "repo" , repoSearch ) ;
180187 if ( sourceFilter !== "all" ) nextParams . set ( "source" , sourceFilter ) ;
181188 if ( rangeFilter !== "all" ) nextParams . set ( "range" , rangeFilter ) ;
182189 if ( dayFilter ) nextParams . set ( "day" , dayFilter ) ;
183190 setSearchParams ( nextParams , { replace : true } ) ;
184- } , [ dayFilter , repoSearch , rangeFilter , setSearchParams , sourceFilter ] ) ;
191+ } , [ dayFilter , quickSearch , repoSearch , rangeFilter , setSearchParams , sourceFilter ] ) ;
185192
186193 useEffect ( ( ) => {
187194 if ( parsed . turns . length === 0 ) {
@@ -211,12 +218,23 @@ export function useSessionsState(): SessionsState {
211218 const rangeStart = getRangeStart ( rangeFilter ) ;
212219 if ( rangeStart && new Date ( r . timestamp ) . getTime ( ) < rangeStart )
213220 return false ;
221+ if ( quickSearch ) {
222+ const q = quickSearch . toLowerCase ( ) ;
223+ const matches =
224+ r . id . toLowerCase ( ) . includes ( q ) ||
225+ r . repo . toLowerCase ( ) . includes ( q ) ||
226+ ( r . source || "" ) . toLowerCase ( ) . includes ( q ) ||
227+ ( r . model || "" ) . toLowerCase ( ) . includes ( q ) ||
228+ ( r . user_prompt_preview || "" ) . toLowerCase ( ) . includes ( q ) ;
229+ if ( ! matches ) return false ;
230+ }
214231 return true ;
215232 } ) ,
216- [ runs , dayFilter , repoSearch , rangeFilter , sourceFilter ] ,
233+ [ runs , dayFilter , quickSearch , repoSearch , rangeFilter , sourceFilter ] ,
217234 ) ;
218235
219236 const clearFilters = ( ) => {
237+ setQuickSearch ( "" ) ;
220238 setRepoSearch ( "" ) ;
221239 setSourceFilter ( "all" ) ;
222240 setRangeFilter ( "all" ) ;
@@ -229,6 +247,7 @@ export function useSessionsState(): SessionsState {
229247 filteredRuns,
230248 selected,
231249 annotations,
250+ quickSearch,
232251 repoSearch,
233252 sourceFilter,
234253 rangeFilter,
@@ -248,6 +267,7 @@ export function useSessionsState(): SessionsState {
248267 loadDetail,
249268 handleAnnotate,
250269 handleTurnToggle,
270+ setQuickSearch,
251271 setRepoSearch,
252272 setSourceFilter,
253273 setRangeFilter,
0 commit comments