Sfoglia il codice sorgente

feat(panel): 电脑面板预览顶部下拉切换显示的桌面(本机/远程 Mac/云端/虚拟机)

Samien 1 mese fa
parent
commit
b10bca1543

+ 2 - 2
src/client/components/workspace/ComputerPanel.vue

@@ -8,9 +8,9 @@ import {createUuid} from '@/utils/id'
 import type {WorkspaceAgent} from '@shared/workspace'
 import type {ComputerControlStatus,ComputerFrame,ComputerInput} from '@shared/computerControl'
 import type {JsonValue} from '@shared/types'
-const props=defineProps<{agents:WorkspaceAgent[];embedded?:boolean;standalone?:boolean;autoTake?:boolean;backend?:'desktop'|'cloud'|'vm'}>(),emit=defineEmits<{close:[];changed:[];controlRequest:[]}>()
+const props=defineProps<{agents:WorkspaceAgent[];embedded?:boolean;standalone?:boolean;autoTake?:boolean;backend?:'desktop'|'cloud'|'vm',host?:string}>(),emit=defineEmits<{close:[];changed:[];controlRequest:[]}>()
 const selected=ref(props.agents[0]?.id??''),dialog=ref<HTMLDialogElement>()
-const backend=ref(props.backend),host=ref(''),envTargets=ref<{hosts:DesktopEnvironmentState['hosts'];cloudConfigured:boolean;vmEnabled:boolean}>()
+const backend=ref(props.backend),host=ref(props.host??''),envTargets=ref<{hosts:DesktopEnvironmentState['hosts'];cloudConfigured:boolean;vmEnabled:boolean}>()
 const state=ref<ComputerControlStatus>({mode:'off'}),frame=ref<ComputerFrame>(),ticket=ref<{controlId:string;token:string}>()
 const controlsOpen=ref(false),actualSize=ref(false),browserState=ref<BotBrowserState>()
 const selectedAgent=computed(()=>props.agents.find(agent=>agent.id===selected.value))

File diff suppressed because it is too large
+ 46 - 9
src/client/components/workspace/LocalVmChatPanel.vue


+ 2 - 2
src/client/components/workspace/WorkspaceBotPanel.vue

@@ -6,7 +6,7 @@ import WorkspaceInspectorPanel from './WorkspaceInspectorPanel.vue'
 import WorkspaceRoutinesPanel from './WorkspaceRoutinesPanel.vue'
 import type {WorkspaceAgent} from '@shared/workspace'
 const props=defineProps<{agents:WorkspaceAgent[];conversationId:string;taskId?:string;mode:'computer'|'inspector';isAdmin:boolean;active?:boolean}>()
-const emit=defineEmits<{close:[];changed:[];settings:[];desktop:[agent:WorkspaceAgent,backend?:'desktop'|'cloud'|'vm'];workspace:[agent:WorkspaceAgent]}>()
+const emit=defineEmits<{close:[];changed:[];settings:[];desktop:[agent:WorkspaceAgent,backend?:'desktop'|'cloud'|'vm',host?:string];workspace:[agent:WorkspaceAgent]}>()
 const view=ref<'computer'|'routines'>('computer')
 watch(()=>props.conversationId,()=>{let saved;try{saved=localStorage.getItem('yaoyao-bot-panel:'+props.conversationId)}catch{}view.value=saved==='routines'?'routines':'computer'},{immediate:true})
 watch(view,value=>{try{localStorage.setItem('yaoyao-bot-panel:'+props.conversationId,value)}catch{}})
@@ -15,7 +15,7 @@ watch(view,value=>{try{localStorage.setItem('yaoyao-bot-panel:'+props.conversati
  <aside class="bot-panel" aria-label="机器人右侧栏">
   <header v-if="mode==='computer'"><div class="tabs" role="group" aria-label="电脑与定时任务"><button :aria-pressed="view==='computer'" @click="view='computer'"><AppIcon name="monitor" :size="15"/>电脑</button><button :aria-pressed="view==='routines'" @click="view='routines'"><AppIcon name="calendar" :size="15"/>定时任务</button></div><button class="close" aria-label="关闭机器人侧栏" @click="emit('close')"><AppIcon name="close"/></button></header>
   <WorkspaceInspectorPanel v-if="mode==='inspector'" show-close :conversation-id="conversationId" :task-id="taskId" @close="emit('close')"/>
-  <LocalVmChatPanel v-else-if="view==='computer'" embedded :agents="agents" :is-admin="isAdmin" :active="active" @changed="emit('changed')" @settings="emit('settings')" @desktop="(agent,backend)=>emit('desktop',agent,backend)" @workspace="emit('workspace',$event)"/>
+  <LocalVmChatPanel v-else-if="view==='computer'" embedded :agents="agents" :is-admin="isAdmin" :active="active" @changed="emit('changed')" @settings="emit('settings')" @desktop="(agent,backend,host)=>emit('desktop',agent,backend,host)" @workspace="emit('workspace',$event)"/>
   <WorkspaceRoutinesPanel v-else-if="agents[0]" :agent-id="agents[0].id"/>
  </aside>
 </template>

+ 4 - 4
src/client/views/ConversationsView.vue

@@ -237,13 +237,13 @@ let cursor = 0,
 const selected = computed(() => (typeof route.params.id === 'string' ? route.params.id : undefined))
 const selectedTask = computed(() => typeof route.query.taskId === 'string' ? route.query.taskId : '')
 const shell=ref<InstanceType<typeof WorkspaceShell>>(),vmWorkspace=ref<InstanceType<typeof LocalVmWorkspace>>(),desktopViewer=ref<InstanceType<typeof ComputerPanel>>()
-const computerOpen=ref(false),dockView=ref<'computer'|'inspector'>(),twoDesktops=ref(false),desktopAgent=ref<Agent>(),desktopBackend=ref<'desktop'|'cloud'|'vm'>()
+const computerOpen=ref(false),dockView=ref<'computer'|'inspector'>(),twoDesktops=ref(false),desktopAgent=ref<Agent>(),desktopBackend=ref<'desktop'|'cloud'|'vm'>(),desktopHost=ref('')
 const creatingTask=ref(false)
 const CREATE_TASK_VALUE='__create_task__'
 function toggleDock(view:'computer'|'inspector'){dockView.value=dockView.value===view?undefined:view}
-async function openComputer(agent:Agent,backend?:'desktop'|'cloud'|'vm'){
+async function openComputer(agent:Agent,backend?:'desktop'|'cloud'|'vm',host?:string){
   if(window.yaoyaoDesktop?.openComputer){try{await window.yaoyaoDesktop.openComputer(agent.id)}catch(cause){error.value=cause instanceof Error?cause.message:'无法打开电脑窗口'}return}
-  desktopAgent.value=agent;desktopBackend.value=backend;computerOpen.value=true
+  desktopAgent.value=agent;desktopBackend.value=backend;desktopHost.value=host??'';computerOpen.value=true
 }
 async function leaveComputer(){
   if(twoDesktops.value&&vmWorkspace.value&&!await vmWorkspace.value.close())return false
@@ -1017,7 +1017,7 @@ onBeforeUnmount(() => {
     </section>
     <WorkspaceBotPanel v-if="dockView&&active" :conversation-id="active.id" :task-id="activeTask?.id" :mode="dockView" :active="!twoDesktops" :agents="computerCandidates" :is-admin="auth.user?.role === 'admin'" @close="dockView=undefined" @changed="refresh()" @settings="shell?.openLocalVm()" @desktop="openComputer" @workspace="desktopAgent=$event;twoDesktops=true" />
     </div>
-    <ComputerPanel ref="desktopViewer" v-if="computerOpen&&desktopAgent" :agents="[desktopAgent]" :backend="desktopBackend" auto-take @changed="load()" @close="computerOpen=false" />
+    <ComputerPanel ref="desktopViewer" v-if="computerOpen&&desktopAgent" :agents="[desktopAgent]" :backend="desktopBackend" :host="desktopHost" auto-take @changed="load()" @close="computerOpen=false" />
     <LocalVmWorkspace ref="vmWorkspace" v-if="twoDesktops&&desktopAgent" :agents="agents.filter(a=>a.execution==='computer'&&!a.archived&&!a.computerEnvironmentId)" :primary="desktopAgent.id" @close="twoDesktops=false" />
     <FloatingResourceSearch section="groups" label="搜索聊天" :items="searchItems" tabbed @open="searchActionError = ''" @select="select">
       <template #item-actions="{ item }">

Some files were not shown because too many files changed in this diff