11<template >
2- <v-dialog
3- v-model =" showDialog"
4- :max-width =" $vuetify.display.smAndDown ? undefined : '760px'"
5- scrollable
6- >
2+ <v-dialog v-model =" showDialog" :max-width =" $vuetify.display.smAndDown ? undefined : '1200px'" scrollable >
73 <v-card class =" persona-form-card" :class =" { 'persona-form-card-mobile': $vuetify.display.smAndDown }" >
8- <v-card-title class =" persona-form-title text-h2" >
4+ <v-card-title class =" persona-form-title text-h2 px-6 pt-6 pl-6 " >
95 {{ editingPersona ? tm('dialog.edit.title') : tm('dialog.create.title') }}
106 </v-card-title >
117
128 <v-card-text class =" persona-form-content" >
139 <!-- 创建位置提示 -->
14- <v-alert
15- v-if =" !editingPersona"
16- type =" info"
17- variant =" tonal"
18- density =" compact"
19- class =" mb-4"
20- icon =" mdi-folder-outline"
21- >
10+ <v-alert v-if =" !editingPersona" type =" info" variant =" tonal" density =" compact" class =" mb-4"
11+ icon =" mdi-folder-outline" >
2212 {{ tm('form.createInFolder', { folder: folderDisplayName }) }}
2313 </v-alert >
2414
2515 <v-form ref =" personaForm" v-model =" formValid" >
26- <v-text-field v-model =" personaForm.persona_id" :label =" tm('form.personaId')"
27- :rules =" personaIdRules" :disabled =" editingPersona" variant =" outlined" density =" comfortable"
28- class =" mb-4" />
29-
30- <v-textarea v-model =" personaForm.system_prompt" :label =" tm('form.systemPrompt')"
31- :rules =" systemPromptRules" variant =" outlined" rows =" 6" class =" mb-4" />
32-
33- <v-expansion-panels v-model =" expandedPanels" multiple >
16+ <v-row class =" persona-form-layout" >
17+ <v-col cols =" 12" md =" 6" class =" persona-basic-col" >
18+ <v-text-field v-model =" personaForm.persona_id" :label =" tm('form.personaId')"
19+ :rules =" personaIdRules" :disabled =" editingPersona" variant =" outlined"
20+ density =" comfortable" class =" mb-4" />
21+
22+ <v-textarea v-model =" personaForm.system_prompt" :label =" tm('form.systemPrompt')"
23+ :rules =" systemPromptRules" variant =" outlined" rows =" 16" class =" mb-4" />
24+ </v-col >
25+
26+ <v-col cols =" 12" md =" 6" class =" persona-panels-col" >
27+ <v-expansion-panels v-model =" expandedPanels" multiple >
3428 <!-- 工具选择面板 -->
3529 <v-expansion-panel value =" tools" >
3630 <v-expansion-panel-title >
6963 <div class =" d-flex flex-wrap ga-2" >
7064 <v-chip v-for =" server in mcpServers" :key =" server.name"
7165 :color =" isServerSelected(server) ? 'primary' : 'default'"
72- :variant =" isServerSelected(server) ? 'flat' : 'outlined'"
73- size = " small " clickable @click =" toggleMcpServer(server)"
66+ :variant =" isServerSelected(server) ? 'flat' : 'outlined'" size = " small "
67+ clickable @click =" toggleMcpServer(server)"
7468 :disabled =" !server.tools || server.tools.length === 0" >
7569 <v-icon start size =" small" >mdi-server</v-icon >
7670 {{ server.name }}
8377
8478 <!-- 工具选择列表 -->
8579 <div v-if =" filteredTools.length > 0" class =" tools-selection" >
86- <v-virtual-scroll :items =" filteredTools" height =" 300" item-height =" 48 " >
80+ <v-virtual-scroll :items =" filteredTools" height =" 300" item-height =" 72 " >
8781 <template v-slot :default =" { item } " >
8882 <v-list-item :key =" item.name" density =" comfortable"
8983 @click =" toggleTool(item.name)" >
9488
9589 <v-list-item-title >
9690 {{ item.name }}
97- <v-chip v-if =" item.mcp_server_name" size =" x-small"
98- color =" secondary" variant =" tonal" class =" ml-2" >
99- {{ item.mcp_server_name }}
91+
92+ <v-chip v-if =" item.origin" size =" x-small" color =" info" class =" mr-2"
93+ variant =" tonal" >
94+ {{ item.origin }}
95+ </v-chip >
96+ <v-chip v-if =" item.origin_name" size =" x-small" color =" info"
97+ variant =" outlined" >
98+ {{ item.origin_name }}
10099 </v-chip >
100+
101101 </v-list-item-title >
102102
103103 <v-list-item-subtitle v-if =" item.description" >
112112 class =" text-center pa-4" >
113113 <v-icon size =" 48" color =" grey-lighten-2" class =" mb-2" >mdi-tools</v-icon >
114114 <p class =" text-body-2 text-medium-emphasis" >{{ tm('form.noToolsAvailable')
115- }}
115+ }}
116116 </p >
117117 </div >
118118
127127 <div v-if =" loadingTools" class =" text-center pa-4" >
128128 <v-progress-circular indeterminate color =" primary" />
129129 <p class =" text-body-2 text-medium-emphasis mt-2" >{{ tm('form.loadingTools')
130- }}
130+ }}
131131 </p >
132132 </div >
133133
143143 </span >
144144 </h4 >
145145 <div v-if =" Array.isArray(personaForm.tools) && personaForm.tools.length > 0"
146- class =" d-flex flex-wrap ga-1" style =" max-height : 100px ; overflow-y : auto ;" >
147- <v-chip v-for =" toolName in personaForm.tools" :key =" toolName"
148- size = " small " color =" primary" variant =" tonal" closable
146+ class =" d-flex flex-wrap ga-1" style =" max-height : 100px ; overflow-y : auto ;" >
147+ <v-chip v-for =" toolName in personaForm.tools" :key =" toolName" size = " small "
148+ color =" primary" variant =" tonal" closable
149149 @click:close =" removeTool(toolName)" >
150150 {{ toolName }}
151151 </v-chip >
209209
210210 <div v-else-if =" !loadingSkills && availableSkills.length === 0"
211211 class =" text-center pa-4" >
212- <v-icon size =" 48" color =" grey-lighten-2" class =" mb-2" >mdi-lightning-bolt</v-icon >
212+ <v-icon size =" 48" color =" grey-lighten-2"
213+ class =" mb-2" >mdi-lightning-bolt</v-icon >
213214 <p class =" text-body-2 text-medium-emphasis" >{{ tm('form.noSkillsAvailable') }}
214215 </p >
215216 </div >
288289 </v-btn >
289290 </v-expansion-panel-text >
290291 </v-expansion-panel >
291- </v-expansion-panels >
292+ </v-expansion-panels >
293+ </v-col >
294+ </v-row >
292295 </v-form >
293296 </v-card-text >
294297
@@ -484,7 +487,7 @@ export default {
484487 };
485488 this .toolSelectValue = ' 0' ;
486489 this .skillSelectValue = ' 0' ;
487- this .expandedPanels = [] ;
490+ this .expandedPanels = this . getDefaultExpandedPanels () ;
488491 },
489492
490493 initFormWithPersona (persona ) {
@@ -499,7 +502,11 @@ export default {
499502 // 根据 tools 的值设置 toolSelectValue
500503 this .toolSelectValue = persona .tools === null ? ' 0' : ' 1' ;
501504 this .skillSelectValue = persona .skills === null ? ' 0' : ' 1' ;
502- this .expandedPanels = [];
505+ this .expandedPanels = this .getDefaultExpandedPanels ();
506+ },
507+
508+ getDefaultExpandedPanels () {
509+ return this .$vuetify .display .smAndDown ? [] : [' tools' , ' skills' , ' dialogs' ];
503510 },
504511
505512 closeDialog () {
@@ -829,6 +836,10 @@ export default {
829836 margin- left: 32px ;
830837}
831838
839+ .persona - form- layout {
840+ align- items: flex- start;
841+ }
842+
832843.tools - selection {
833844 max- height: 300px ;
834845 overflow- y: auto;
@@ -853,6 +864,11 @@ export default {
853864 padding: 16px ! important;
854865 }
855866
867+ .persona - basic- col,
868+ .persona - panels- col {
869+ padding- top: 0 ! important;
870+ }
871+
856872 .persona - form- title {
857873 font- size: 1 .15rem ! important;
858874 padding: 12px 16px ! important;
0 commit comments