@@ -11,25 +11,16 @@ const props = defineProps<{
1111 sessionId? : string ;
1212}>();
1313
14- type MenuView = ' root' | ' tools ' | ' skills' | ' plugins' ;
15- type SessionCapabilities = { tools ? : string []; mcpServers? : string [] };
14+ type MenuView = ' root' | ' skills' | ' plugins' ;
15+ type SessionCapabilities = { mcpServers? : string [] };
1616
1717const { t } = useI18n ();
1818const client = usePythinkerWebClient ();
1919const triggerRef = ref <HTMLButtonElement | null >(null );
2020const open = ref (false );
2121const view = ref <MenuView >(' root' );
22- const selectedTools = ref <string []>([]);
2322const selectedMcpServers = ref <string []>([]);
2423
25- const tools = computed (() => {
26- const sessionId = props .sessionId ;
27- return sessionId ? client .toolsBySession .value [sessionId ] ?? [] : [];
28- });
29- const toolsLoading = computed (() => {
30- const sessionId = props .sessionId ;
31- return sessionId ? client .toolsLoadingBySession .value [sessionId ] === true : false ;
32- });
3324const skills = computed (() =>
3425 props .sessionId === client .activeSessionId .value ? client .skills .value : [],
3526);
@@ -47,14 +38,12 @@ const capabilities = computed<SessionCapabilities>(() =>
4738 : {},
4839);
4940
50- const showTools = computed (() => toolsLoading .value || tools .value .length > 0 );
5141const showSkills = computed (() => skillsLoading .value || skills .value .length > 0 );
5242const showMcp = computed (() => connectorsLoading .value || connectors .value .length > 0 );
5343const showPlugins = computed (() => pluginsLoading .value || plugins .value .length > 0 );
5444
5545const drilldownTitle = computed (() => {
5646 switch (view .value ) {
57- case ' tools' : return t (' capabilityMenu.tools.title' );
5847 case ' skills' : return t (' capabilityMenu.skills.title' );
5948 case ' plugins' : return t (' capabilityMenu.plugins.title' );
6049 case ' root' : return ' ' ;
@@ -63,32 +52,27 @@ const drilldownTitle = computed(() => {
6352
6453const drilldownCount = computed (() => {
6554 switch (view .value ) {
66- case ' tools' : return selectedTools .value .length ;
6755 case ' skills' : return skills .value .length ;
6856 case ' plugins' : return plugins .value .length ;
6957 case ' root' : return 0 ;
7058 }
7159});
7260
7361function syncSelection(): void {
74- selectedTools .value = capabilities .value .tools !== undefined
75- ? [... capabilities .value .tools ]
76- : tools .value .map ((tool ) => tool .name );
7762 selectedMcpServers .value = capabilities .value .mcpServers !== undefined
7863 ? [... capabilities .value .mcpServers ]
7964 : connectors .value .map ((server ) => server .id );
8065}
8166
8267watch (
83- [() => props .sessionId , tools , connectors , capabilities ],
68+ [() => props .sessionId , connectors , capabilities ],
8469 syncSelection ,
8570 { immediate: true },
8671);
8772
8873watch (
89- [tools , toolsLoading , skills , skillsLoading , plugins , pluginsLoading ],
74+ [skills , skillsLoading , plugins , pluginsLoading ],
9075 () => {
91- if (view .value === ' tools' && ! toolsLoading .value && tools .value .length === 0 ) view .value = ' root' ;
9276 if (view .value === ' skills' && ! skillsLoading .value && skills .value .length === 0 ) view .value = ' root' ;
9377 if (view .value === ' plugins' && ! pluginsLoading .value && plugins .value .length === 0 ) view .value = ' root' ;
9478 },
@@ -140,15 +124,6 @@ function queueWrite(field: CapabilityField, selection: Ref<string[]>, previous:
140124 return write ;
141125}
142126
143- function setToolEnabled(name : string , enabled : boolean ): Promise <void > {
144- const previous = [... selectedTools .value ];
145- const next = new Set (previous );
146- if (enabled ) next .add (name );
147- else next .delete (name );
148- selectedTools .value = [... next ];
149- return queueWrite (' tools' , selectedTools , previous );
150- }
151-
152127function setMcpServerEnabled(id : string , enabled : boolean ): Promise <void > {
153128 const previous = [... selectedMcpServers .value ];
154129 const next = new Set (previous );
@@ -189,13 +164,6 @@ function setPluginEnabled(id: string, enabled: boolean): void {
189164 <div class =" capability-viewport" >
190165 <div class =" capability-track" :class =" { 'is-drilled': view !== 'root' }" >
191166 <div class =" capability-view" >
192- <MenuRow v-if =" showTools " :count =" selectedTools .length " @click =" view = ' tools' " >
193- <template #label >{{ t('capabilityMenu.tools.title') }}</template >
194- <template #trailing >
195- <svg class =" chevron" viewBox =" 0 0 16 16" fill =" none" stroke =" currentColor" stroke-width =" 1.5" stroke-linecap =" round" stroke-linejoin =" round" aria-hidden =" true" ><path d =" m6 3 5 5-5 5" /></svg >
196- </template >
197- </MenuRow >
198-
199167 <MenuRow v-if =" showSkills " :count =" skills .length " @click =" view = ' skills' " >
200168 <template #label >{{ t('capabilityMenu.skills.title') }}</template >
201169 <template #trailing >
@@ -247,34 +215,7 @@ function setPluginEnabled(id: string, enabled: boolean): void {
247215 <template #label >{{ drilldownTitle || t('capabilityMenu.back') }}</template >
248216 </MenuRow >
249217
250- <template v-if =" view === ' tools' " >
251- <p class =" capability-caption" >{{ t('capabilityMenu.tools.caption') }}</p >
252- <div v-if =" toolsLoading" class =" capability-loading" >
253- <ActivitySpinner :label =" t (' capabilityMenu.loading' )" />
254- </div >
255- <template v-else >
256- <MenuRow
257- v-for =" tool in tools "
258- :key =" tool .name "
259- class="capability-row"
260- :selected =" selectedTools .includes (tool .name )"
261- :title =" tool .description "
262- @click =" void setToolEnabled (tool .name , ! selectedTools .includes (tool .name ))"
263- >
264- <template #label >{{ tool.name }}</template >
265- <template #trailing >
266- <SwitchToggle
267- :model-value =" selectedTools .includes (tool .name )"
268- :aria-label =" t (' capabilityMenu.tools.toggle' , { name: tool .name })"
269- @click .stop
270- @update :model-value =" void setToolEnabled (tool .name , $event )"
271- />
272- </template >
273- </MenuRow >
274- </template >
275- </template >
276-
277- <template v-else-if =" view === ' skills' " >
218+ <template v-if =" view === ' skills' " >
278219 <p class =" capability-caption" >{{ t('capabilityMenu.skills.caption') }}</p >
279220 <div v-if =" skillsLoading" class =" capability-loading" >
280221 <ActivitySpinner :label =" t (' capabilityMenu.loading' )" />
0 commit comments