11import { computed , onMounted , ref , watch } from 'vue'
2- import { useRoute , useRouter } from 'vue-router'
2+ import { useRoute , useRouter , type LocationQuery } from 'vue-router'
33import { api , type AgentUsage , type ToolCall , type ToolCallFilters , type ToolStat } from '../../api'
4+ import {
5+ copyStringRouteQuery ,
6+ dateTimeInputToQueryIso ,
7+ routeDateTimeInputValue ,
8+ setRouteQueryValue ,
9+ stringRouteQueryValue
10+ } from '../routeQuery'
411import { invokedCommand , isShellToolName } from './shellTool'
512
613export const DEFAULT_SORT = 'recent'
@@ -22,12 +29,12 @@ export function useToolCallExplorer(mode: ToolCallExplorerMode) {
2229 const agents = ref < AgentUsage [ ] > ( [ ] )
2330 const toolCalls = ref < ToolCall [ ] > ( [ ] )
2431 const commandOptions = ref < ShellCommandStat [ ] > ( [ ] )
25- const toolFilter = ref < string | undefined > ( routeStringQuery ( route , ' tool' ) )
26- const commandFilter = ref < string | undefined > ( mode === 'shell' ? routeStringQuery ( route , ' command' ) : undefined )
27- const agentFilter = ref < string | undefined > ( routeStringQuery ( route , ' agent' ) )
28- const fromFilter = ref ( routeDateTimeQuery ( route , 'from' ) )
29- const toFilter = ref ( routeDateTimeQuery ( route , 'to' ) )
30- const sortFilter = ref < ToolCallSort > ( routeSortQuery ( route ) )
32+ const toolFilter = ref < string | undefined > ( stringRouteQueryValue ( route . query . tool ) )
33+ const commandFilter = ref < string | undefined > ( mode === 'shell' ? stringRouteQueryValue ( route . query . command ) : undefined )
34+ const agentFilter = ref < string | undefined > ( stringRouteQueryValue ( route . query . agent ) )
35+ const fromFilter = ref ( routeDateTimeInputValue ( route . query , 'from' ) )
36+ const toFilter = ref ( routeDateTimeInputValue ( route . query , 'to' ) )
37+ const sortFilter = ref < ToolCallSort > ( routeSortQuery ( route . query ) )
3138 const selectedToolCall = ref < ToolCall | null > ( null )
3239 const routePath = mode === 'shell' ? '/tools/shell' : '/tools/calls'
3340 const availableTools = computed ( ( ) => ( mode === 'shell' ? tools . value . filter ( ( item ) => isShellToolName ( item . toolName ) ) : tools . value ) )
@@ -86,8 +93,8 @@ export function useToolCallExplorer(mode: ToolCallExplorerMode) {
8693 return {
8794 tool : mode === 'all' ? toolFilter . value : undefined ,
8895 agent : agentFilter . value ,
89- from : toQueryDateTime ( fromFilter . value ) ,
90- to : toQueryDateTime ( toFilter . value , 'end' ) ,
96+ from : dateTimeInputToQueryIso ( fromFilter . value ) ,
97+ to : dateTimeInputToQueryIso ( toFilter . value , 'end' ) ,
9198 sort : sortFilter . value === DEFAULT_SORT ? undefined : sortFilter . value ,
9299 limit : TOOL_CALL_LIMIT
93100 }
@@ -111,16 +118,13 @@ export function useToolCallExplorer(mode: ToolCallExplorerMode) {
111118 }
112119
113120 function currentRouteQuery ( ) {
114- const query : Record < string , string > = { }
115- for ( const [ key , value ] of Object . entries ( route . query ) ) {
116- if ( typeof value === 'string' ) query [ key ] = value
117- }
118- setQueryValue ( query , 'tool' , toolFilter . value )
119- setQueryValue ( query , 'command' , mode === 'shell' ? commandFilter . value : undefined )
120- setQueryValue ( query , 'agent' , agentFilter . value )
121- setQueryValue ( query , 'from' , fromFilter . value || undefined )
122- setQueryValue ( query , 'to' , toFilter . value || undefined )
123- setQueryValue ( query , 'sort' , sortFilter . value === DEFAULT_SORT ? undefined : sortFilter . value )
121+ const query = copyStringRouteQuery ( route . query )
122+ setRouteQueryValue ( query , 'tool' , toolFilter . value )
123+ setRouteQueryValue ( query , 'command' , mode === 'shell' ? commandFilter . value : undefined )
124+ setRouteQueryValue ( query , 'agent' , agentFilter . value )
125+ setRouteQueryValue ( query , 'from' , fromFilter . value || undefined )
126+ setRouteQueryValue ( query , 'to' , toFilter . value || undefined )
127+ setRouteQueryValue ( query , 'sort' , sortFilter . value === DEFAULT_SORT ? undefined : sortFilter . value )
124128 return query
125129 }
126130
@@ -140,12 +144,12 @@ export function useToolCallExplorer(mode: ToolCallExplorerMode) {
140144 }
141145
142146 function syncFiltersFromRoute ( ) {
143- toolFilter . value = routeStringQuery ( route , ' tool' )
144- commandFilter . value = mode === 'shell' ? routeStringQuery ( route , ' command' ) : undefined
145- agentFilter . value = routeStringQuery ( route , ' agent' )
146- fromFilter . value = routeDateTimeQuery ( route , 'from' )
147- toFilter . value = routeDateTimeQuery ( route , 'to' )
148- sortFilter . value = routeSortQuery ( route )
147+ toolFilter . value = stringRouteQueryValue ( route . query . tool )
148+ commandFilter . value = mode === 'shell' ? stringRouteQueryValue ( route . query . command ) : undefined
149+ agentFilter . value = stringRouteQueryValue ( route . query . agent )
150+ fromFilter . value = routeDateTimeInputValue ( route . query , 'from' )
151+ toFilter . value = routeDateTimeInputValue ( route . query , 'to' )
152+ sortFilter . value = routeSortQuery ( route . query )
149153 }
150154
151155 function resetFilters ( ) {
@@ -245,41 +249,8 @@ function timestampMs(value?: string) {
245249 return Number . isNaN ( parsed ) ? 0 : parsed
246250}
247251
248- function routeStringQuery ( route : ReturnType < typeof useRoute > , key : string ) {
249- const value = route . query [ key ]
250- return typeof value === 'string' && value ? value : undefined
251- }
252-
253- function routeDateTimeQuery ( route : ReturnType < typeof useRoute > , key : string ) {
254- const value = routeStringQuery ( route , key )
255- if ( ! value ) return ''
256- return value . endsWith ( 'Z' ) ? toLocalDateTimeInputValue ( value ) : value
257- }
258-
259- function routeSortQuery ( route : ReturnType < typeof useRoute > ) : ToolCallSort {
260- const value = routeStringQuery ( route , 'sort' )
252+ function routeSortQuery ( query : LocationQuery ) : ToolCallSort {
253+ const value = stringRouteQueryValue ( query . sort )
261254 if ( value === 'duration_desc' || value === 'duration_asc' ) return value
262255 return DEFAULT_SORT
263256}
264-
265- function toLocalDateTimeInputValue ( value : string ) {
266- const date = new Date ( value )
267- if ( Number . isNaN ( date . getTime ( ) ) ) return value
268- const pad = ( part : number ) => String ( part ) . padStart ( 2 , '0' )
269- return `${ date . getFullYear ( ) } -${ pad ( date . getMonth ( ) + 1 ) } -${ pad ( date . getDate ( ) ) } T${ pad ( date . getHours ( ) ) } :${ pad ( date . getMinutes ( ) ) } `
270- }
271-
272- function toQueryDateTime ( value : string , boundary : 'start' | 'end' = 'start' ) {
273- if ( ! value ) return undefined
274- const date = new Date ( value )
275- if ( Number . isNaN ( date . getTime ( ) ) ) return undefined
276- if ( boundary === 'end' && / ^ \d { 4 } - \d { 2 } - \d { 2 } T \d { 2 } : \d { 2 } $ / . test ( value ) ) {
277- date . setSeconds ( 59 , 999 )
278- }
279- return date . toISOString ( )
280- }
281-
282- function setQueryValue ( query : Record < string , string > , key : string , value ?: string ) {
283- if ( value ) query [ key ] = value
284- else delete query [ key ]
285- }
0 commit comments