@lsamien/yaovi 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build-info.json +23 -3
- package/desktop/main.mjs +18 -9
- package/dist/assets/{AboutDialog-CBKv505Y.js → AboutDialog-CJ9tCjSs.js} +2 -2
- package/dist/assets/AboutDialog-CJ9tCjSs.js.map +1 -0
- package/dist/assets/{BotAutomationsView-S3aHciek.js → BotAutomationsView-CsoI3js3.js} +2 -2
- package/dist/assets/{BotAutomationsView-S3aHciek.js.map → BotAutomationsView-CsoI3js3.js.map} +1 -1
- package/dist/assets/{BotControlSettingsPanel-DJF4oA6g.js → BotControlSettingsPanel-DIuBZlLu.js} +2 -2
- package/dist/assets/{BotControlSettingsPanel-DJF4oA6g.js.map → BotControlSettingsPanel-DIuBZlLu.js.map} +1 -1
- package/dist/assets/{BotPluginsDialog-BVOQ3DTp.js → BotPluginsDialog-BsGszDMH.js} +2 -2
- package/dist/assets/{BotPluginsDialog-BVOQ3DTp.js.map → BotPluginsDialog-BsGszDMH.js.map} +1 -1
- package/dist/assets/{BotSettingsPanel-CEH3KSAO.js → BotSettingsPanel-j3ThYgt2.js} +3 -3
- package/dist/assets/{BotSettingsPanel-CEH3KSAO.js.map → BotSettingsPanel-j3ThYgt2.js.map} +1 -1
- package/dist/assets/{ComputerPanel-CC-xkAxr.js → ComputerPanel-DdlgOm-B.js} +2 -2
- package/dist/assets/{ComputerPanel-CC-xkAxr.js.map → ComputerPanel-DdlgOm-B.js.map} +1 -1
- package/dist/assets/{ComputerViewerView-CEQrOmy7.js → ComputerViewerView-I3adPI6O.js} +2 -2
- package/dist/assets/{ComputerViewerView-CEQrOmy7.js.map → ComputerViewerView-I3adPI6O.js.map} +1 -1
- package/dist/assets/ConversationsView-CBhzg-9w.css +1 -0
- package/dist/assets/{ConversationsView-CzFWn-79.js → ConversationsView-CxVFk5sQ.js} +73 -73
- package/dist/assets/ConversationsView-CxVFk5sQ.js.map +1 -0
- package/dist/assets/{DevicePairingDialog-ByYk05DC.js → DevicePairingDialog-C307ARt-.js} +2 -2
- package/dist/assets/{DevicePairingDialog-ByYk05DC.js.map → DevicePairingDialog-C307ARt-.js.map} +1 -1
- package/dist/assets/{LocalVmSettingsPanel-DBkqouAU.js → LocalVmSettingsPanel-Zs7CiXdf.js} +2 -2
- package/dist/assets/{LocalVmSettingsPanel-DBkqouAU.js.map → LocalVmSettingsPanel-Zs7CiXdf.js.map} +1 -1
- package/dist/assets/{ProviderLoginDialog-DdPS62uM.js → ProviderLoginDialog-D3mqdAlo.js} +2 -2
- package/dist/assets/{ProviderLoginDialog-DdPS62uM.js.map → ProviderLoginDialog-D3mqdAlo.js.map} +1 -1
- package/dist/assets/{RunnerSettingsPanel-gzA2xzOg.js → RunnerSettingsPanel-DjMGnXGP.js} +2 -2
- package/dist/assets/{RunnerSettingsPanel-gzA2xzOg.js.map → RunnerSettingsPanel-DjMGnXGP.js.map} +1 -1
- package/dist/assets/{StandaloneDialog-B9HCNEFb.js → StandaloneDialog-BXCK22Dx.js} +2 -2
- package/dist/assets/{StandaloneDialog-B9HCNEFb.js.map → StandaloneDialog-BXCK22Dx.js.map} +1 -1
- package/dist/assets/{UpdateCheckDialog-djkXTQgD.js → UpdateCheckDialog-DAY0VEQm.js} +2 -2
- package/dist/assets/{UpdateCheckDialog-djkXTQgD.js.map → UpdateCheckDialog-DAY0VEQm.js.map} +1 -1
- package/dist/assets/{UsageView-DFaWBB40.js → UsageView-DNwG8LAx.js} +2 -2
- package/dist/assets/{UsageView-DFaWBB40.js.map → UsageView-DNwG8LAx.js.map} +1 -1
- package/dist/assets/{WorkspaceKnowledgePanel-In2a_s_z.js → WorkspaceKnowledgePanel-hy_IkIJI.js} +2 -2
- package/dist/assets/{WorkspaceKnowledgePanel-In2a_s_z.js.map → WorkspaceKnowledgePanel-hy_IkIJI.js.map} +1 -1
- package/dist/assets/{WorkspaceRoutinesPanel-zOxFoqML.js → WorkspaceRoutinesPanel-B7PkBP7x.js} +2 -2
- package/dist/assets/{WorkspaceRoutinesPanel-zOxFoqML.js.map → WorkspaceRoutinesPanel-B7PkBP7x.js.map} +1 -1
- package/dist/assets/{WorkstreamsView-HvlivC3b.js → WorkstreamsView-BeE2TRXK.js} +2 -2
- package/dist/assets/{WorkstreamsView-HvlivC3b.js.map → WorkstreamsView-BeE2TRXK.js.map} +1 -1
- package/dist/assets/{index-BPE9bBla.js → index-D11cgXI9.js} +3 -3
- package/dist/assets/{index-BPE9bBla.js.map → index-D11cgXI9.js.map} +1 -1
- package/dist/assets/{pdf-Q2a37aK5.js → pdf-BjTcV6As.js} +2 -2
- package/dist/assets/{pdf-Q2a37aK5.js.map → pdf-BjTcV6As.js.map} +1 -1
- package/dist/index.html +1 -1
- package/dist-server/server/botControl.js +1 -1
- package/dist-server/server/desktopEnvironments.js +10 -9
- package/dist-server/server/desktopHostProtocol.js +1 -1
- package/dist-server/server/workspacePrompt.js +2 -2
- package/dist-server/shared/botEnvironment.js +10 -4
- package/dist-server/shared/fileTransferEndpoint.mjs +5 -5
- package/dist-server/shared/hostPaths.mjs +14 -4
- package/package.json +3 -2
- package/release.json +3 -3
- package/dist/assets/AboutDialog-CBKv505Y.js.map +0 -1
- package/dist/assets/ConversationsView-B6JNGLt_.css +0 -1
- package/dist/assets/ConversationsView-CzFWn-79.js.map +0 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LocalVmSettingsPanel-
|
|
2
|
-
import{A as e,Dt as t,F as n,M as r,_ as i,b as a,d as o,et as s,f as c,m as l,ot as u,p as d,t as f,v as p,y as m}from"./_plugin-vue_export-helper-BumXM028.js";import{t as h}from"./WorkspaceKnowledgePanel-
|
|
3
|
-
//# sourceMappingURL=BotSettingsPanel-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LocalVmSettingsPanel-Zs7CiXdf.js","assets/_plugin-vue_export-helper-BumXM028.js","assets/index-D11cgXI9.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/index-BQLAALTS.css","assets/id-mzBN_4Vw.js","assets/RunnerSettingsPanel-DjMGnXGP.js","assets/RunnerSettingsPanel-hNMCkf-_.css","assets/ConversationsView-CxVFk5sQ.js","assets/WorkspaceKnowledgePanel-hy_IkIJI.js","assets/ProviderLoginDialog-D3mqdAlo.js","assets/StandaloneDialog-BXCK22Dx.js","assets/StandaloneDialog-BS6Ta2zL.css","assets/ProviderLoginDialog-Ad7_Yh7J.css","assets/WorkspaceKnowledgePanel-B_NER3l9.css","assets/WorkspaceRoutinesPanel-B7PkBP7x.js","assets/WorkspaceRoutinesPanel-CbLiNc6R.css","assets/ComputerPanel-DdlgOm-B.js","assets/ComputerPanel-BcXhqQ9K.css","assets/backgroundTaskPresentation-CJMcreMr.js","assets/ConversationsView-CBhzg-9w.css","assets/LocalVmSettingsPanel-Z2-jouAB.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{A as e,Dt as t,F as n,M as r,_ as i,b as a,d as o,et as s,f as c,m as l,ot as u,p as d,t as f,v as p,y as m}from"./_plugin-vue_export-helper-BumXM028.js";import{t as h}from"./WorkspaceKnowledgePanel-hy_IkIJI.js";import{t as g,w as _}from"./index-D11cgXI9.js";import{a as v,i as y,n as b,o as x,r as S}from"./ConversationsView-CxVFk5sQ.js";var C={class:`bot-settings-panel`},w={key:0,class:`bot-settings-panel__vm`},T={key:1},E={key:2},D={key:3},O=[`aria-label`,`aria-busy`],k={key:0,role:`alert`},A={key:1,role:`status`},j={key:3,class:`bot-settings__empty`},M=f(a({__name:`BotSettingsPanel`,props:{isAdmin:{type:Boolean},page:{}},emits:[`changed`,`dirty-change`],setup(a,{emit:f}){let M=m(()=>g(()=>import(`./LocalVmSettingsPanel-Zs7CiXdf.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]))),N=f,P=s([]),F=s([]),I=s(!0),L=s(``),R=s(!1),z=!1;async function B(){I.value=!0,L.value=``;try{let[e,t,n]=await Promise.all([_(`/api/app/capabilities`),_(`/api/app/agents`),_(`/api/app/conversations`)]);if(z)return;R.value=e.features.includes(`bot-file-memory-v1`),P.value=t.agents,F.value=n.conversations}catch(e){z||(L.value=e instanceof Error?e.message:`无法加载 Bot 配置`)}finally{z||(I.value=!1)}}function V(){N(`changed`),B()}return r(B),e(()=>{z=!0}),(e,r)=>(n(),l(`div`,C,[a.page===`vm`&&a.isAdmin?(n(),l(`section`,w,[p(u(M))])):a.page===`computers`&&a.isAdmin?(n(),l(`section`,T,[p(v),p(S),p(y)])):a.page===`files`&&a.isAdmin?(n(),l(`section`,E,[p(x)])):a.page===`memory`&&a.isAdmin?(n(),l(`section`,D,[p(b,{section:`memory`,active:!0})])):a.page===`projects`||a.page===`user`?(n(),l(`section`,{key:4,class:`bot-settings-panel__knowledge`,"aria-label":a.page===`projects`?`项目设置`:`用户记忆设置`,"aria-busy":I.value},[L.value?(n(),l(`p`,k,[i(t(L.value)+` `,1),o(`button`,{type:`button`,onClick:B},`重试`)])):I.value&&!R.value?(n(),l(`p`,A,`正在加载…`)):R.value?(n(),c(h,{key:2,embedded:``,"initial-tab":a.page===`user`?`user`:`projects`,agents:P.value,conversations:F.value,onChanged:V,onDirtyChange:r[0]||=e=>N(`dirty-change`,e)},null,8,[`initial-tab`,`agents`,`conversations`])):(n(),l(`p`,j,`当前服务尚不支持项目和用户记忆,请更新服务后重试。`))],8,O)):d(``,!0)]))}}),[[`__scopeId`,`data-v-8bcd3450`]]);export{M as default};
|
|
3
|
+
//# sourceMappingURL=BotSettingsPanel-j3ThYgt2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":";irBAWA,IAAM,EAAuB,YAA2B,OAAO,iHAA4C,EAGrG,EAAO,EACP,EAAS,EAAsB,CAAC,CAAC,EAAG,EAAgB,EAA6B,CAAC,CAAC,EACnF,EAAU,EAAI,EAAI,EAAG,EAAQ,EAAI,EAAE,EAAG,EAAmB,EAAI,EAAK,EACpE,EAAS,GACb,eAAe,GAAO,CACpB,EAAQ,MAAQ,GAAM,EAAM,MAAQ,GACpC,GAAI,CACF,GAAM,CAAC,EAAc,EAAG,GAAK,MAAM,QAAQ,IAAI,CAC7C,EAAgC,uBAAuB,EACvD,EAAsC,iBAAiB,EACvD,EAAoD,wBAAwB,CAC9E,CAAC,EACD,GAAI,EAAQ,OACZ,EAAiB,MAAQ,EAAa,SAAS,SAAS,oBAAoB,EAC5E,EAAO,MAAQ,EAAE,OAAQ,EAAc,MAAQ,EAAE,aACnD,OAAS,EAAO,CAAO,IAAQ,EAAM,MAAQ,aAAiB,MAAQ,EAAM,QAAU,cAAc,QAC5F,CAAO,IAAQ,EAAQ,MAAQ,GAAM,CAC/C,CACA,SAAS,GAAU,CAAE,EAAK,SAAS,EAAG,EAAU,CAAE,QAClD,EAAU,CAAI,EACd,MAAsB,CAAE,EAAS,EAAK,CAAC,UAIrC,MAWM,MAXN,EAWM,CAVa,SAAI,MAAa,WAAhC,MAA0G,UAA1G,EAA0G,CAAlC,EAAwB,SAC5E,SAAI,aAAoB,WAA5C,MAAuI,aAAlF,EAA4B,KAA0B,KAAkB,EACzG,aAAI,SAAgB,WAAxC,MAA8E,aAA7B,EAAmB,MAChD,SAAI,UAAiB,WAAzC,MAAqH,aAAnE,EAAyD,GAAlC,QAAQ,SAAU,OAAQ,EAC/E,eAAI,YAAmB,SAAI,QAA/C,MAKU,iBALkD,MAAM,gCAAiC,aAAY,SAAI,2BAAsC,YAAW,OACzJ,YAAT,MAA0F,IAA1F,EAA0F,CAA3D,WAAK,EAAE,IAAC,KAA+C,UAAvC,KAAK,SAAU,QAAO,CAAM,MAAE,KAC/D,SAAO,CAAK,SAA1B,MAAmE,IAAnE,EAA0D,OAAK,GAC3B,SAApC,MAAsO,SAAhL,YAAU,cAAa,SAAI,yBAAoC,OAAQ,QAAS,cAAe,QAAgB,UAAS,EAAU,cAAY,UAAE,EAAI,eAAiB,CAAM,iDACjO,WAAmE,IAAnE,EAAsC,2BAAyB","names":[],"ignoreList":[],"sources":["../../src/client/components/workspace/BotSettingsPanel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {defineAsyncComponent, onBeforeUnmount, onMounted, ref} from 'vue'\nimport {apiRequest} from '@/api/client'\nimport WorkspaceKnowledgePanel from './WorkspaceKnowledgePanel.vue'\nimport FileAccessPanel from '@/components/app/FileAccessPanel.vue'\nimport DeviceAuthorizationPanel from '@/components/app/DeviceAuthorizationPanel.vue'\nimport HostToolsPanel from '@/components/app/HostToolsPanel.vue'\nimport ExecutionSettingsPanel from '@/components/app/ExecutionSettingsPanel.vue'\nimport SystemManagementPanel from '@/components/app/SystemManagementPanel.vue'\nimport type {WorkspaceAgent, WorkspaceConversation} from '@shared/workspace'\n\nconst LocalVmSettingsPanel = defineAsyncComponent(() => import('@/components/app/LocalVmSettingsPanel.vue'))\ntype Page = 'projects' | 'user' | 'vm' | 'computers' | 'files' | 'memory'\ndefineProps<{isAdmin?: boolean; page: Page}>()\nconst emit = defineEmits<{changed: []; 'dirty-change': [dirty: boolean]}>()\nconst agents = ref<WorkspaceAgent[]>([]), conversations = ref<WorkspaceConversation[]>([])\nconst loading = ref(true), error = ref(''), knowledgeEnabled = ref(false)\nlet closed = false\nasync function load() {\n loading.value = true; error.value = ''\n try {\n const [capabilities, a, c] = await Promise.all([\n apiRequest<{features:string[]}>('/api/app/capabilities'),\n apiRequest<{agents:WorkspaceAgent[]}>('/api/app/agents'),\n apiRequest<{conversations:WorkspaceConversation[]}>('/api/app/conversations'),\n ])\n if (closed) return\n knowledgeEnabled.value = capabilities.features.includes('bot-file-memory-v1')\n agents.value = a.agents; conversations.value = c.conversations\n } catch (cause) { if (!closed) error.value = cause instanceof Error ? cause.message : '无法加载 Bot 配置' }\n finally { if (!closed) loading.value = false }\n}\nfunction changed() { emit('changed'); void load() }\nonMounted(load)\nonBeforeUnmount(() => { closed = true })\n</script>\n\n<template>\n <div class=\"bot-settings-panel\">\n <section v-if=\"page === 'vm' && isAdmin\" class=\"bot-settings-panel__vm\"><LocalVmSettingsPanel /></section>\n <section v-else-if=\"page === 'computers' && isAdmin\"><DeviceAuthorizationPanel /><ExecutionSettingsPanel /><HostToolsPanel /></section>\n <section v-else-if=\"page === 'files' && isAdmin\"><FileAccessPanel /></section>\n <section v-else-if=\"page === 'memory' && isAdmin\"><SystemManagementPanel section=\"memory\" :active=\"true\" /></section>\n <section v-else-if=\"page === 'projects' || page === 'user'\" class=\"bot-settings-panel__knowledge\" :aria-label=\"page === 'projects' ? '项目设置' : '用户记忆设置'\" :aria-busy=\"loading\">\n <p v-if=\"error\" role=\"alert\">{{error}} <button type=\"button\" @click=\"load\">重试</button></p>\n <p v-else-if=\"loading && !knowledgeEnabled\" role=\"status\">正在加载…</p>\n <WorkspaceKnowledgePanel v-else-if=\"knowledgeEnabled\" embedded :initial-tab=\"page === 'user' ? 'user' : 'projects'\" :agents=\"agents\" :conversations=\"conversations\" @changed=\"changed\" @dirty-change=\"emit('dirty-change', $event)\" />\n <p v-else class=\"bot-settings__empty\">当前服务尚不支持项目和用户记忆,请更新服务后重试。</p>\n </section>\n </div>\n</template>\n\n<style scoped>\n.bot-settings-panel{min-width:0}.bot-settings-panel__knowledge :deep(.project-heading h3){display:none}.bot-settings-panel__knowledge>p{margin:0;font-size:14px;line-height:1.7;color:var(--text-secondary)}.bot-settings-panel__knowledge>[role=alert]{color:var(--danger)}.bot-settings-panel__knowledge>p button{min-height:44px;padding:8px 12px;border:1px solid var(--line);border-radius:8px;background:var(--surface);color:var(--text-primary);font:inherit;cursor:pointer}.bot-settings-panel button:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.bot-settings-panel__vm :deep(article){padding:20px;border:0;border-radius:12px;background:var(--settings-panel)}.bot-settings-panel__vm :deep(article:first-child h3){display:none}.bot-settings-panel__vm :deep(.segmented button[aria-pressed=true]){background:var(--surface)}\n</style>\n"],"file":"BotSettingsPanel-
|
|
1
|
+
{"version":3,"mappings":";irBAWA,IAAM,EAAuB,YAA2B,OAAO,iHAA4C,EAGrG,EAAO,EACP,EAAS,EAAsB,CAAC,CAAC,EAAG,EAAgB,EAA6B,CAAC,CAAC,EACnF,EAAU,EAAI,EAAI,EAAG,EAAQ,EAAI,EAAE,EAAG,EAAmB,EAAI,EAAK,EACpE,EAAS,GACb,eAAe,GAAO,CACpB,EAAQ,MAAQ,GAAM,EAAM,MAAQ,GACpC,GAAI,CACF,GAAM,CAAC,EAAc,EAAG,GAAK,MAAM,QAAQ,IAAI,CAC7C,EAAgC,uBAAuB,EACvD,EAAsC,iBAAiB,EACvD,EAAoD,wBAAwB,CAC9E,CAAC,EACD,GAAI,EAAQ,OACZ,EAAiB,MAAQ,EAAa,SAAS,SAAS,oBAAoB,EAC5E,EAAO,MAAQ,EAAE,OAAQ,EAAc,MAAQ,EAAE,aACnD,OAAS,EAAO,CAAO,IAAQ,EAAM,MAAQ,aAAiB,MAAQ,EAAM,QAAU,cAAc,QAC5F,CAAO,IAAQ,EAAQ,MAAQ,GAAM,CAC/C,CACA,SAAS,GAAU,CAAE,EAAK,SAAS,EAAG,EAAU,CAAE,QAClD,EAAU,CAAI,EACd,MAAsB,CAAE,EAAS,EAAK,CAAC,UAIrC,MAWM,MAXN,EAWM,CAVa,SAAI,MAAa,WAAhC,MAA0G,UAA1G,EAA0G,CAAlC,EAAwB,SAC5E,SAAI,aAAoB,WAA5C,MAAuI,aAAlF,EAA4B,KAA0B,KAAkB,EACzG,aAAI,SAAgB,WAAxC,MAA8E,aAA7B,EAAmB,MAChD,SAAI,UAAiB,WAAzC,MAAqH,aAAnE,EAAyD,GAAlC,QAAQ,SAAU,OAAQ,EAC/E,eAAI,YAAmB,SAAI,QAA/C,MAKU,iBALkD,MAAM,gCAAiC,aAAY,SAAI,2BAAsC,YAAW,OACzJ,YAAT,MAA0F,IAA1F,EAA0F,CAA3D,WAAK,EAAE,IAAC,KAA+C,UAAvC,KAAK,SAAU,QAAO,CAAM,MAAE,KAC/D,SAAO,CAAK,SAA1B,MAAmE,IAAnE,EAA0D,OAAK,GAC3B,SAApC,MAAsO,SAAhL,YAAU,cAAa,SAAI,yBAAoC,OAAQ,QAAS,cAAe,QAAgB,UAAS,EAAU,cAAY,UAAE,EAAI,eAAiB,CAAM,iDACjO,WAAmE,IAAnE,EAAsC,2BAAyB","names":[],"ignoreList":[],"sources":["../../src/client/components/workspace/BotSettingsPanel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {defineAsyncComponent, onBeforeUnmount, onMounted, ref} from 'vue'\nimport {apiRequest} from '@/api/client'\nimport WorkspaceKnowledgePanel from './WorkspaceKnowledgePanel.vue'\nimport FileAccessPanel from '@/components/app/FileAccessPanel.vue'\nimport DeviceAuthorizationPanel from '@/components/app/DeviceAuthorizationPanel.vue'\nimport HostToolsPanel from '@/components/app/HostToolsPanel.vue'\nimport ExecutionSettingsPanel from '@/components/app/ExecutionSettingsPanel.vue'\nimport SystemManagementPanel from '@/components/app/SystemManagementPanel.vue'\nimport type {WorkspaceAgent, WorkspaceConversation} from '@shared/workspace'\n\nconst LocalVmSettingsPanel = defineAsyncComponent(() => import('@/components/app/LocalVmSettingsPanel.vue'))\ntype Page = 'projects' | 'user' | 'vm' | 'computers' | 'files' | 'memory'\ndefineProps<{isAdmin?: boolean; page: Page}>()\nconst emit = defineEmits<{changed: []; 'dirty-change': [dirty: boolean]}>()\nconst agents = ref<WorkspaceAgent[]>([]), conversations = ref<WorkspaceConversation[]>([])\nconst loading = ref(true), error = ref(''), knowledgeEnabled = ref(false)\nlet closed = false\nasync function load() {\n loading.value = true; error.value = ''\n try {\n const [capabilities, a, c] = await Promise.all([\n apiRequest<{features:string[]}>('/api/app/capabilities'),\n apiRequest<{agents:WorkspaceAgent[]}>('/api/app/agents'),\n apiRequest<{conversations:WorkspaceConversation[]}>('/api/app/conversations'),\n ])\n if (closed) return\n knowledgeEnabled.value = capabilities.features.includes('bot-file-memory-v1')\n agents.value = a.agents; conversations.value = c.conversations\n } catch (cause) { if (!closed) error.value = cause instanceof Error ? cause.message : '无法加载 Bot 配置' }\n finally { if (!closed) loading.value = false }\n}\nfunction changed() { emit('changed'); void load() }\nonMounted(load)\nonBeforeUnmount(() => { closed = true })\n</script>\n\n<template>\n <div class=\"bot-settings-panel\">\n <section v-if=\"page === 'vm' && isAdmin\" class=\"bot-settings-panel__vm\"><LocalVmSettingsPanel /></section>\n <section v-else-if=\"page === 'computers' && isAdmin\"><DeviceAuthorizationPanel /><ExecutionSettingsPanel /><HostToolsPanel /></section>\n <section v-else-if=\"page === 'files' && isAdmin\"><FileAccessPanel /></section>\n <section v-else-if=\"page === 'memory' && isAdmin\"><SystemManagementPanel section=\"memory\" :active=\"true\" /></section>\n <section v-else-if=\"page === 'projects' || page === 'user'\" class=\"bot-settings-panel__knowledge\" :aria-label=\"page === 'projects' ? '项目设置' : '用户记忆设置'\" :aria-busy=\"loading\">\n <p v-if=\"error\" role=\"alert\">{{error}} <button type=\"button\" @click=\"load\">重试</button></p>\n <p v-else-if=\"loading && !knowledgeEnabled\" role=\"status\">正在加载…</p>\n <WorkspaceKnowledgePanel v-else-if=\"knowledgeEnabled\" embedded :initial-tab=\"page === 'user' ? 'user' : 'projects'\" :agents=\"agents\" :conversations=\"conversations\" @changed=\"changed\" @dirty-change=\"emit('dirty-change', $event)\" />\n <p v-else class=\"bot-settings__empty\">当前服务尚不支持项目和用户记忆,请更新服务后重试。</p>\n </section>\n </div>\n</template>\n\n<style scoped>\n.bot-settings-panel{min-width:0}.bot-settings-panel__knowledge :deep(.project-heading h3){display:none}.bot-settings-panel__knowledge>p{margin:0;font-size:14px;line-height:1.7;color:var(--text-secondary)}.bot-settings-panel__knowledge>[role=alert]{color:var(--danger)}.bot-settings-panel__knowledge>p button{min-height:44px;padding:8px 12px;border:1px solid var(--line);border-radius:8px;background:var(--surface);color:var(--text-primary);font:inherit;cursor:pointer}.bot-settings-panel button:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.bot-settings-panel__vm :deep(article){padding:20px;border:0;border-radius:12px;background:var(--settings-panel)}.bot-settings-panel__vm :deep(article:first-child h3){display:none}.bot-settings-panel__vm :deep(.segmented button[aria-pressed=true]){background:var(--surface)}\n</style>\n"],"file":"BotSettingsPanel-j3ThYgt2.js"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{A as e,B as t,Dt as n,F as r,G as i,H as a,L as o,M as s,Tt as c,W as l,_ as u,a as d,b as f,d as p,et as m,f as ee,m as h,o as te,ot as ne,p as g,t as re,u as _}from"./_plugin-vue_export-helper-BumXM028.js";import{G as ie,J as ae,W as oe,w as v}from"./index-BPE9bBla.js";import{n as y}from"./id-mzBN_4Vw.js";function se(e){return!!e?.enabled&&(!!e.available||!!e.installation)}async function ce(e,t,n,r){let i=`/api/app/agents/${encodeURIComponent(e)}/managed-browser`,a=t??await v(i,{signal:n});if(n.throwIfAborted(),!se(a))throw Error(a.reason||`托管浏览器不可用,请检查执行节点与授权`);!a.available&&a.installation?.status!==`installing`&&(a=await v(i+`/prepare`,{method:`POST`,body:{retry:a.installation?.status===`failed`},signal:n}));let o=Date.now();for(;;){if(n.throwIfAborted(),r(a),a.available)return;if(a.installation?.status===`failed`)throw Error(a.installation.error||a.installation.message||`浏览器准备失败,请重试`);if(!se(a))throw Error(a.reason||`执行节点已不可用,请重新连接后重试`);if(Date.now()-o>6e5)throw Error(`浏览器仍在准备中,可稍后重新接管查看进度`);await new Promise((e,t)=>{let r=()=>{clearTimeout(i),t(n.reason??new DOMException(`Aborted`,`AbortError`))},i=setTimeout(()=>{n.removeEventListener(`abort`,r),e()},1e3);n.addEventListener(`abort`,r,{once:!0}),n.aborted&&r()}),a=await v(i,{signal:n})}}var le=class{send;failed;id=y();done;resolve;queue=[];running=!1;ending=!1;finished=!1;heartbeat;latest;constructor(e,t,n){this.send=t,this.failed=n,this.latest={x:e.x,y:e.y},this.done=new Promise(e=>{this.resolve=e}),this.heartbeat=setInterval(()=>{this.ending||this.move(this.latest)},1e3),this.enqueue(`start`,e)}move(e){this.ending||this.enqueue(`move`,e)}end(e){this.ending||(this.ending=!0,clearInterval(this.heartbeat),this.enqueue(`end`,e))}cancel(){return this.finished?this.done:(this.ending=!0,clearInterval(this.heartbeat),this.queue=[],this.enqueue(`cancel`,this.latest),this.done)}enqueue(e,t){this.latest={x:t.x,y:t.y};let n={kind:`pointer`,gestureId:this.id,phase:e,x:t.x,y:t.y};e===`move`&&this.queue.at(-1)?.phase===`move`?this.queue[this.queue.length-1]=n:this.queue.push(n),this.flush()}async flush(){if(!(this.running||this.finished)){this.running=!0;try{for(;this.queue.length;){let e=this.queue.shift();if(await this.send(e),e.phase===`end`||e.phase===`cancel`){this.finish();return}}}catch(e){this.ending=!0,this.queue=[],clearInterval(this.heartbeat);try{await this.send({kind:`pointer`,gestureId:this.id,phase:`cancel`,...this.latest})}catch{}this.failed(e),this.finish()}finally{this.running=!1}}}finish(){this.finished=!0,this.ending=!0,this.queue=[],clearInterval(this.heartbeat),this.resolve()}},ue={class:`browser-toolbar`,"aria-label":`机器人浏览器`},b={class:`browser-tabs`,role:`tablist`,"aria-label":`浏览器标签页`},x=[`aria-selected`,`title`,`disabled`,`onClick`],S=[`aria-label`,`disabled`,`onClick`],de=[`disabled`],C=[`disabled`],w=[`disabled`],T=[`disabled`],E=[`disabled`],D=[`disabled`],fe=re(f({__name:`BrowserToolbar`,props:{state:{},enabled:{type:Boolean}},emits:[`action`],setup(e,{emit:t}){let s=e,l=t,u=m(``),f=m(!1),ee=_(()=>s.state?.tabs.find(e=>e.active));a(()=>ee.value?.url,e=>{f.value||(u.value=e===`about:blank`?``:e??``)},{immediate:!0});function te(){let e=u.value.trim();e&&(/^https?:\/\//i.test(e)||(e=`https://`+e),f.value=!1,l(`action`,{kind:`navigate`,url:e}))}return(t,a)=>(r(),h(`div`,ue,[p(`div`,b,[(r(!0),h(d,null,o(e.state?.tabs,t=>(r(),h(`div`,{key:t.id,class:c([`tab`,{active:t.active}])},[p(`button`,{role:`tab`,"aria-selected":t.active,title:t.title,disabled:!e.enabled,onClick:e=>l(`action`,{kind:`select-tab`,tabId:t.id})},n(t.title),9,x),p(`button`,{class:`close-tab`,"aria-label":`关闭标签页 ${t.title}`,disabled:!e.enabled,onClick:e=>l(`action`,{kind:`close-tab`,tabId:t.id})},`×`,8,S)],2))),128)),p(`button`,{class:`new-tab`,"aria-label":`新建标签页`,disabled:!e.enabled,onClick:a[0]||=e=>l(`action`,{kind:`new-tab`,url:`https://www.google.com/`})},`+`,8,de)]),p(`form`,{class:`navigation`,onSubmit:ae(te,[`prevent`])},[p(`button`,{type:`button`,"aria-label":`后退`,disabled:!e.enabled,onClick:a[1]||=e=>l(`action`,{kind:`back`})},`←`,8,C),p(`button`,{type:`button`,"aria-label":`前进`,disabled:!e.enabled,onClick:a[2]||=e=>l(`action`,{kind:`forward`})},`→`,8,w),p(`button`,{type:`button`,"aria-label":`重新加载页面`,disabled:!e.enabled,onClick:a[3]||=e=>l(`action`,{kind:`reload`})},`↻`,8,T),i(p(`input`,{"onUpdate:modelValue":a[4]||=e=>u.value=e,type:`text`,inputmode:`url`,autocomplete:`off`,spellcheck:`false`,"aria-label":`浏览器地址`,placeholder:`输入网址`,disabled:!e.enabled,onFocus:a[5]||=e=>f.value=!0,onBlur:a[6]||=e=>f.value=!1},null,40,E),[[ie,u.value]]),p(`button`,{type:`submit`,disabled:!e.enabled||!u.value.trim()},`前往`,8,D)],32)]))}}),[[`__scopeId`,`data-v-76ef2743`]]),pe=[`value`,`disabled`],me=[`value`,`disabled`],he=[`disabled`],ge=[`value`],_e={key:2},ve=[`disabled`],ye=[`disabled`],be=[`aria-expanded`],xe=[`aria-pressed`],Se=[`disabled`],Ce=[`aria-busy`],we={role:`status`},Te=[`value`],Ee={key:1},De={key:2,role:`alert`},Oe=[`aria-busy`],ke={key:0,role:`status`},Ae=[`disabled`],je=[`src`,`alt`],Me={key:1,role:`status`},Ne={key:2,class:`view-label`},Pe={key:3,class:`computer-error`,role:`alert`},Fe={key:4},Ie={key:0},Le={key:1},Re={key:2},ze={key:3},Be={key:4,class:`browser-downloads`},Ve={key:5},He=[`disabled`],Ue=[`disabled`],We={key:0,class:`manual-input`},Ge={class:`key-row`},Ke=[`disabled`,`onClick`],qe={class:`key-row`},Je=[`disabled`],Ye=[`disabled`],Xe=[`disabled`],Ze=[`disabled`],Qe=[`disabled`],$e=[`disabled`],et={key:1},tt={key:2},nt=[`aria-busy`],rt=[`disabled`],O=re(f({__name:`ComputerPanel`,props:{agents:{},embedded:{type:Boolean},standalone:{type:Boolean},autoTake:{type:Boolean},backend:{},host:{}},emits:[`close`,`changed`,`controlRequest`,`targetChanged`],setup(f,{expose:re,emit:ue}){let b=f,x=ue,S=m(b.agents[0]?.id??``),de=m(),C=m(b.backend),w=m(b.host??(b.backend===`desktop`?`local`:``)),T=m(),E=m({mode:`off`}),D=m(),O=m(),k=m(!1),it=m(!1),A=m(),at=m(!1),j=m(),M=m(!1),ot=m(!1),st=m(!1),N=m(!0),P,F=_(()=>C.value===`managed-browser`?j.value?.installation:void 0),ct=_(()=>b.agents.find(e=>e.id===S.value)),I=m(``),L=m(!1),lt=m(``),ut=m(``),R=m(!1),dt,ft=``,pt,z=!1,mt=!1,ht=0,B=0,gt={off:`电脑未运行`,idle:`电脑空闲 · 仅查看`,agent:`机器人正在操作`,pausing:`正在等待当前操作结束`,human:`人工控制中`,resuming:`正在交还机器人`,error:`电脑需要检查`},V=_(()=>!!O.value&&O.value.controlId===E.value.controlId),_t=_(()=>C.value===`managed-browser`&&V.value&&E.value.mode===`human`&&!E.value.canResume),H=_(()=>R.value&&!!D.value&&V.value&&E.value.mode===`human`&&D.value?.generation===E.value.generation),U=_(()=>H.value&&!L.value&&!at.value),W=m({vm:!0,cloud:!0,managedBrowser:!1}),G=_(()=>{let e=W.value,t=T.value,n=[];if(e.cloud&&n.push({key:`cloud`,label:`云虚拟机`+(N.value?` · 正在检查`:t?.cloudConfigured?``:` · 未连接`),backend:`cloud`,disabled:N.value||!t?.cloudConfigured}),e.vm&&n.push({key:`vm`,label:`本地虚拟机`+(N.value?` · 正在检查`:t?.vmEnabled?``:` · 未启用`),backend:`vm`,disabled:N.value||!t?.vmEnabled}),e.managedBrowser){let e=t?.managedBrowser;n.push({key:`managed-browser`,label:`托管浏览器`+(N.value?` · 正在检查`:e?.available?``:se(e)?` · `+(e?.installation?.status===`failed`?`准备失败`:`待准备`):` · 不可用`),backend:`managed-browser`,disabled:N.value||!se(e)})}return n}),vt=_(()=>G.value.find(e=>e.backend===C.value&&(e.host??``)===w.value)?.key??``),yt=_(()=>G.value.some(e=>e.key===vt.value&&!e.disabled));a([C,w],([e,t])=>{e&&x(`targetChanged`,e,t||void 0)},{immediate:!0});async function bt(){if(!S.value)return;let e=S.value,t=encodeURIComponent(e);N.value=!0;try{let n=await v(`/api/app/settings/host-tools`);if(z||e!==S.value)return;W.value={vm:n.vm,cloud:n.cloud,managedBrowser:n.managedBrowser===!0};let[r,i,a]=await Promise.all([W.value.cloud?v(`/api/app/agents/${t}/cloud-computer`).catch(()=>void 0):Promise.resolve(void 0),W.value.vm?v(`/api/app/agents/${t}/local-vm`).catch(()=>void 0):Promise.resolve(void 0),W.value.managedBrowser?v(`/api/app/agents/${t}/managed-browser`).catch(()=>void 0):Promise.resolve(void 0)]);if(z||e!==S.value)return;T.value={cloudConfigured:!!r?.configured,vmEnabled:!!i?.enabled,managedBrowser:a},C.value===`managed-browser`&&(j.value=a,A.value=a)}finally{e===S.value&&(N.value=!1)}}async function xt(e){let t=G.value.find(t=>t.key===e);if(!(!t||t.disabled||e===vt.value)){if(await $(),O.value)try{await wt(`/giveback`,{...O.value,notes:``})}catch(e){I.value=e instanceof Error?e.message:`请先交还当前电脑`;return}C.value=t.backend,w.value=t.host??``,P?.abort(),clearTimeout(Y),J=void 0,A.value=void 0,j.value=void 0,q.length=0,R.value=!1,B++,dt=void 0,D.value=void 0,O.value=void 0,E.value={mode:`off`},ft=``,I.value=``,await Tt()}}let St=()=>`/api/app/agents/${encodeURIComponent(S.value)}/computer`,Ct=()=>{let e=new URLSearchParams;C.value&&e.set(`backend`,C.value),C.value===`desktop`&&w.value&&e.set(`host`,w.value);let t=e.toString();return t?`?`+t:``};async function wt(e,t){return v(St()+e+Ct(),{method:`POST`,body:t})}async function Tt(){if(mt||L.value||z||!S.value||document.hidden||!yt.value&&!(C.value===`managed-browser`&&W.value.managedBrowser))return;mt=!0;let e=++B,t=St(),n=Ct(),r=S.value;try{if(C.value===`managed-browser`){let t=await v(`/api/app/agents/${encodeURIComponent(r)}/managed-browser`).catch(t=>{throw e===B&&!z&&(j.value=void 0,A.value=void 0,T.value&&(T.value.managedBrowser=void 0),E.value={mode:`off`,backend:`managed-browser`}),t});if(e!==B||z)return;if(j.value=t,A.value=t,T.value&&(T.value.managedBrowser=t),!t.available){E.value={mode:`off`,backend:`managed-browser`},R.value=!1,D.value=void 0,I.value=ft;return}}let i=await v(t+n);if(e!==B||z)return;if(E.value=i,R.value=!0,O.value&&i.controlId!==O.value.controlId&&i.mode!==`pausing`&&(O.value=void 0),V.value&&Date.now()-ht>8e3&&(await wt(`/renew`,O.value),ht=Date.now()),i.backend===`browser`){let t=await v(`/api/app/agents/${encodeURIComponent(S.value)}/browser`);if(e!==B||z)return;A.value=t,j.value=void 0}else i.backend!==`managed-browser`&&(A.value=void 0,j.value=void 0);if(i.mode!==`off`&&(![`browser`,`managed-browser`].includes(i.backend??``)||A.value?.open)){let r=await v(t+`/frame`+n);e===B&&!z&&(D.value=r)}else D.value=void 0;I.value=ft}catch(t){if(e===B&&!z){R.value=!1,D.value=void 0,q.length=0,I.value=t instanceof Error?t.message:`无法读取电脑状态`;{let e=Number(t.status);([401,410].includes(e)||e===403&&O.value)&&(O.value=void 0,D.value=void 0,E.value={mode:`off`})}}}finally{mt=!1}}async function K(e){if(L.value)return;B++,L.value=!0,ft=``,I.value=``;let t=``;try{await e()}catch(e){t=e instanceof Error?e.message:`电脑操作失败`}finally{L.value=!1,z||(await Tt(),t&&(ft=t,I.value=t),kt())}}async function Et(){if(!L.value){ot.value=!0;try{await K(bt)}finally{ot.value=!1}}}function Dt(){return K(async()=>{if(!yt.value)throw Error(`所选电脑不可用,请重新选择`);let e=S.value,t=C.value,n=St(),r=Ct(),i=new AbortController;P=i;try{if(t===`managed-browser`&&(M.value=!j.value?.available,await ce(e,j.value,i.signal,n=>{!z&&e===S.value&&t===C.value&&(j.value=n,A.value=n,T.value&&(T.value.managedBrowser=n))})),i.signal.throwIfAborted(),z||e!==S.value||t!==C.value)return;M.value=!1,dt??=y();let a=await v(n+`/take`+r,{method:`POST`,body:{requestId:dt}}),o={controlId:a.controlId,token:a.token};if(z||i.signal.aborted||e!==S.value||t!==C.value){await v(n+`/giveback`+r,{method:`POST`,body:{...o,notes:``}});return}O.value=o,E.value=a,ht=0}catch(e){if(!i.signal.aborted)throw e}finally{P===i&&(P=void 0,M.value=!1)}})}let q=[],Ot=!1,J,Y;function X(e){if(!H.value||z||at.value)return;J&&(q.push(J),J=void 0,clearTimeout(Y));let t=q.at(-1);if(e.kind===`text`&&t?.kind===`text`&&t.text.length+e.text.length<=16e3)t.text+=e.text;else if(q.length<64)q.push(e);else{I.value=`输入过快,请稍后再试`;return}kt()}async function kt(){if(Ot||L.value||!q.length||z)return;if(!H.value||!D.value||!O.value){q.length=0;return}Ot=!0;let e=q.shift(),t=D.value,n=O.value;try{await K(async()=>{await wt(`/input`,{...n,requestId:y(),generation:t.generation,frameId:t.id,action:e})}),I.value&&(q.length=0)}finally{Ot=!1,q.length&&setTimeout(()=>void kt(),0)}}function At(e){if(!U.value||!D.value||!O.value)return;let t=D.value,n=O.value;K(async()=>{C.value===`managed-browser`?await v(`/api/app/agents/${encodeURIComponent(S.value)}/managed-browser/action`,{method:`POST`,body:{...n,requestId:y(),generation:t.generation,action:e}}):await wt(`/browser`,{...n,requestId:y(),generation:t.generation,frameId:t.id,action:e})})}function jt(e,t=!1){let n=e.currentTarget.getBoundingClientRect(),r=D.value,i=Math.min(n.width/r.width,n.height/r.height),a=n.left+(n.width-r.width*i)/2,o=n.top+(n.height-r.height*i)/2,s=Math.floor((e.clientX-a)/i),c=Math.floor((e.clientY-o)/i);if(t)return{x:Math.max(0,Math.min(r.width-1,s)),y:Math.max(0,Math.min(r.height-1,c))};if(!(s<0||c<0||s>=r.width||c>=r.height))return{x:s,y:c}}let Z,Mt=!1,Q;function Nt(e){if(!U.value||Z||e.button!==0||q.length)return;let t=e.currentTarget;t.focus({preventScroll:!0});let n=jt(e);n&&(Mt=!1,Z={...n,clientX:e.clientX,clientY:e.clientY,pointerId:e.pointerId,element:t},t.setPointerCapture(e.pointerId))}function Pt(e){let t=St(),n=Ct(),r=O.value,i=D.value.generation,a=D.value;clearTimeout(Y),J=void 0,I.value=``,at.value=!0;let o=()=>!z&&St()===t&&Ct()===n&&O.value?.controlId===r.controlId&&E.value.generation===i,s=new le(e,async e=>{if(e.phase!==`cancel`&&(!o()||!H.value))throw Error(`控制权已变化,请重新接管`);if(await v(t+`/input`+n,{method:`POST`,timeoutMs:5e3,body:{...r,requestId:y(),generation:i,frameId:a.id,action:{...e}}}),e.phase===`cancel`)return;let s=await v(t+`/frame`+n,{timeoutMs:5e3});if(!o()||s.generation!==i)throw Error(`控制权已变化,请重新接管`);a=s,D.value=s},e=>{o()&&(I.value=e instanceof Error?e.message:`拖动失败,请重新按下鼠标`)});Q=s,s.done.then(async()=>{if(Q===s){Q=void 0,at.value=!1;let e=I.value;await Tt(),o()&&e&&(I.value=e)}})}function Ft(e){let t=Z;if(!t||e.pointerId!==t.pointerId||!H.value||C.value!==`managed-browser`)return;!Q&&Math.hypot(e.clientX-t.clientX,e.clientY-t.clientY)>5&&(Mt=!0,Pt(t));let n=jt(e,!0);n&&Q?.move(n)}function It(){let e=Z;Z=void 0,e?.element.hasPointerCapture(e.pointerId)&&e.element.releasePointerCapture(e.pointerId)}function $(){return It(),Q?(Mt=!0,Q.cancel()):Promise.resolve()}function Lt(e){let t=Z;if(!t||e.pointerId!==t.pointerId)return;if(!H.value){$();return}Ft(e);let n=jt(e,!0);if(It(),Q){n?Q.end(n):$();return}n&&Math.hypot(e.clientX-t.clientX,e.clientY-t.clientY)>5&&(Mt=!0,X({kind:`drag`,fromX:t.x,fromY:t.y,toX:n.x,toY:n.y}))}let Rt=()=>{$()},zt=()=>{document.hidden&&$()};a(H,e=>{e||$()});function Bt(e){H.value&&(e.preventDefault(),X({kind:`scroll`,direction:Math.abs(e.deltaX)>Math.abs(e.deltaY)?e.deltaX>0?`right`:`left`:e.deltaY>0?`down`:`up`,amount:Math.min(20,Math.max(1,Math.ceil(Math.abs(e.deltaY||e.deltaX)/80)))}))}function Vt(e){if(!H.value)return;if(e.preventDefault(),e.stopPropagation(),e.key===`Escape`){$(),e.currentTarget.blur();return}let t=[e.ctrlKey||C.value===`managed-browser`&&e.metaKey?`ctrl`:``,e.altKey?`alt`:``,e.shiftKey?`shift`:``,e.metaKey&&C.value!==`managed-browser`?`super`:``].filter(Boolean);e.key.length===1&&!e.ctrlKey&&!e.altKey&&!e.metaKey?X({kind:`text`,text:e.key}):[`Control`,`Alt`,`Shift`,`Meta`].includes(e.key)||X({kind:`key`,key:{Enter:`Return`,ArrowUp:`Up`,ArrowDown:`Down`,ArrowLeft:`Left`,ArrowRight:`Right`,Backspace:`BackSpace`}[e.key]??e.key,modifiers:t})}function Ht(e){if(Mt){Mt=!1;return}if(!H.value||!D.value)return;let t=jt(e);if(!t)return;let n={kind:`click`,...t,button:e.button===2?`right`:`left`,count:e.detail>1?2:1};if(e.button===2||e.detail>1)clearTimeout(Y),J=void 0,X(n);else{if(J){let e=J;J=void 0,clearTimeout(Y),X(e)}J=n,Y=setTimeout(()=>{let e=J;J=void 0,e&&X(e)},180)}}async function Ut(){await $(),O.value&&(await wt(`/giveback`,{...O.value,notes:ut.value}),O.value=void 0,dt=void 0,ut.value=``)}async function Wt(){if(L.value||!_t.value||!O.value)return;await $();let e=S.value,t=O.value;st.value=!0;try{await K(async()=>{clearTimeout(Y),J=void 0,q.length=0;let n=await v(`/api/app/agents/${encodeURIComponent(e)}/managed-browser/close`,{method:`POST`,body:t});z||S.value!==e||C.value!==`managed-browser`||O.value!==t||(E.value=n,O.value=void 0,dt=void 0,ut.value=``,D.value=void 0,R.value=!1,k.value=!1,x(`changed`))})}finally{st.value=!1}}async function Gt(){if(M.value){P?.abort(),z=!0,de.value?.close?.(),x(`close`);return}L.value||(await K(Ut),O.value||(z=!0,!b.embedded&&!b.standalone&&de.value?.close(),x(`close`)))}async function Kt(){try{document.fullscreenElement?await document.exitFullscreen():await de.value?.requestFullscreen()}catch{I.value=`无法进入全屏,请使用窗口最大化`}}async function qt(){await Tt(),z||(pt=setTimeout(()=>void qt(),1200))}return a(S,()=>{$(),P?.abort(),clearTimeout(Y),J=void 0,A.value=void 0,j.value=void 0,q.length=0,R.value=!1,B++,dt=void 0,D.value=void 0,O.value=void 0,E.value={mode:`off`},ft=``,I.value=``,C.value=b.backend,w.value=b.host??(b.backend===`desktop`?`local`:``),T.value=void 0,bt().then(async()=>{if(!C.value){let e=G.value.find(e=>!e.disabled);e&&await xt(e.key)}await Tt()}).catch(e=>{I.value=e instanceof Error?e.message:`无法读取电脑列表`})}),s(async()=>{window.addEventListener(`blur`,Rt),document.addEventListener(`visibilitychange`,zt),!b.embedded&&!b.standalone&&de.value?.showModal();try{if(await bt(),z)return;if(!C.value){let e=G.value.find(e=>!e.disabled);e&&await xt(e.key)}if(!yt.value&&C.value!==`managed-browser`)throw Error(`所选电脑不可用,请重新选择;未打开其他电脑`);b.autoTake&&!z&&yt.value&&await Dt()}catch(e){I.value=e instanceof Error?e.message:`无法读取电脑列表`}z||qt()}),e(()=>{$(),window.removeEventListener(`blur`,Rt),document.removeEventListener(`visibilitychange`,zt),P?.abort(),O.value&&wt(`/giveback`,{...O.value,notes:ut.value}).catch(()=>{}),q.length=0,J=void 0,clearTimeout(Y),z=!0,B++,clearTimeout(pt)}),re({take:Dt,close:Gt,releaseControl:async()=>{if(M.value){P?.abort();return}if(L.value)throw Error(`请等待当前操作完成`);if(await K(Ut),O.value)throw Error(I.value||`请先交还控制权`)},hasControl:()=>!!O.value}),(e,a)=>(r(),ee(te,{to:`body`,disabled:f.embedded||f.standalone},[(r(),ee(t(f.embedded||f.standalone?`section`:`dialog`),{ref_key:`dialog`,ref:de,class:c([`computer-panel`,{embedded:f.embedded,standalone:f.standalone}]),"aria-label":G.value.find(e=>e.key===vt.value)?.label||`电脑桌面`,onCancel:ae(Gt,[`prevent`])},{default:l(()=>[p(`header`,null,[p(`div`,null,[p(`strong`,null,n(C.value===`managed-browser`?`托管浏览器`:C.value===`cloud`?`云虚拟机`:`本地虚拟机`),1),p(`small`,null,n(M.value?`正在准备浏览器`:gt[E.value.mode]),1)]),G.value.length>1?(r(),h(`select`,{key:0,value:vt.value,"aria-label":`切换电脑环境`,disabled:!!O.value||L.value,onChange:a[0]||=e=>xt(e.target.value)},[(r(!0),h(d,null,o(G.value,e=>(r(),h(`option`,{key:e.key,value:e.key,disabled:e.disabled},n(e.label),9,me))),128))],40,pe)):g(``,!0),f.agents.length>1?i((r(),h(`select`,{key:1,"onUpdate:modelValue":a[1]||=e=>S.value=e,"aria-label":`选择电脑`,disabled:!!O.value||L.value},[(r(!0),h(d,null,o(f.agents,e=>(r(),h(`option`,{key:e.id,value:e.id},n(e.name),9,ge))),128))],8,he)),[[oe,S.value]]):f.embedded?g(``,!0):(r(),h(`span`,_e,n(f.agents[0]?.name),1)),f.embedded&&!O.value?(r(),h(`button`,{key:3,disabled:L.value||E.value.mode===`human`,onClick:a[2]||=e=>x(`controlRequest`)},`接管电脑`,8,ve)):g(``,!0),f.embedded&&V.value?(r(),h(`button`,{key:4,onClick:a[3]||=e=>k.value=!k.value},`键盘与操作`)):g(``,!0),f.embedded&&V.value?(r(),h(`button`,{key:5,disabled:L.value||E.value.mode!==`human`,onClick:a[4]||=e=>K(Ut)},`交还`,8,ye)):g(``,!0),f.embedded?g(``,!0):(r(),h(d,{key:6},[V.value?(r(),h(`button`,{key:0,type:`button`,"aria-expanded":k.value,onClick:a[5]||=e=>k.value=!k.value},`键盘与操作`,8,be)):g(``,!0),p(`button`,{type:`button`,"aria-pressed":it.value,onClick:a[6]||=e=>it.value=!it.value},n(it.value?`适应窗口`:`原始大小`),9,xe),p(`button`,{type:`button`,onClick:Kt},`全屏`)],64)),f.embedded?g(``,!0):(r(),h(`button`,{key:7,class:`return-control`,type:`button`,disabled:L.value&&!M.value,onClick:Gt},n(C.value===`managed-browser`?O.value?`交还并收起`:`收起窗口`:O.value?`交还并关闭`:`关闭`),9,Se))]),E.value.backend===`browser`||E.value.backend===`managed-browser`?(r(),ee(fe,{key:0,state:A.value,enabled:U.value,onAction:At},null,8,[`state`,`enabled`])):g(``,!0),F.value&&F.value.status!==`ready`?(r(),h(`section`,{key:1,class:`browser-installation`,"aria-busy":M.value},[p(`p`,we,n(F.value.message),1),F.value.status===`installing`||F.value.status===`checking`?(r(),h(`progress`,{key:0,value:F.value.progress,max:`100`,"aria-label":`浏览器准备进度`},null,8,Te)):g(``,!0),M.value?(r(),h(`small`,Ee,`关闭窗口后仍会继续准备。`)):g(``,!0),F.value.error?(r(),h(`p`,De,n(F.value.error),1)):g(``,!0)],8,Ce)):g(``,!0),!N.value&&C.value===`managed-browser`&&!j.value?.available?(r(),h(`section`,{key:2,class:`browser-availability`,"aria-busy":ot.value},[F.value?g(``,!0):(r(),h(`p`,ke,n(j.value?.reason||(W.value.managedBrowser?`执行节点暂时不可用,请检查连接后重新检测。`:`托管浏览器尚未开放,请在「设置 → 环境与权限 → 运行环境」中开启。`)),1)),p(`button`,{type:`button`,disabled:L.value,onClick:Et},n(ot.value?`正在检测…`:`重新检测`),9,Ae)],8,Oe)):g(``,!0),p(`div`,{class:c([`computer-screen`,{controlling:H.value,"actual-size":it.value}])},[D.value?(r(),h(`img`,{key:0,src:`data:image/png;base64,${D.value.data}`,alt:(G.value.find(e=>e.key===vt.value)?.label||`电脑`)+`当前画面`,draggable:`false`,tabindex:`0`,title:`点按后可使用键盘、滚轮和拖动;按 Esc 退出键盘控制`,onPointerdown:Nt,onPointermove:Ft,onPointerup:Lt,onPointercancel:$,onLostpointercapture:a[7]||=e=>ne(Z)&&$(),onBlur:$,onWheel:Bt,onKeydown:Vt,onClick:Ht,onContextmenu:ae(Ht,[`prevent`])},null,40,je)):(r(),h(`p`,Me,n(N.value?`正在检查电脑环境…`:M.value?`准备完成后会自动接管,无需再次点击。`:E.value.mode===`off`?C.value===`managed-browser`?`浏览器尚未打开。接管后可打开网页。`:`打开电脑后可查看桌面。`:`正在读取电脑画面…`),1)),D.value&&(!V.value||D.value.generation!==E.value.generation)?(r(),h(`span`,Ne,n(V.value?`正在同步画面`:E.value.mode===`off`?`上次画面`:`仅查看`),1)):g(``,!0)],2),I.value||E.value.error?(r(),h(`p`,Pe,n(I.value||E.value.error),1)):g(``,!0),k.value||!f.embedded&&!O.value?(r(),h(`footer`,Fe,[E.value.backend===`grok`?(r(),h(`p`,Ie,`多个机器人共享同一台 Grok Bot 云端电脑、工作文件与浏览器资料。`)):E.value.backend===`local`?(r(),h(`p`,Le,`当前显示`+n(E.value.hostName||`所选电脑`)+`的桌面,点击、输入、按键和滚动都会发送到这台电脑。`,1)):g(``,!0),C.value===`vm`&&ct.value?.computerEnvironmentId?(r(),h(`p`,Re,`共享电脑:`+n(ct.value.computerEnvironmentName)+`。成员共用工作文件和浏览器资料,可同时执行命令与文件操作,桌面操作交替进行;人工接管时机器人暂停等待。`,1)):g(``,!0),E.value.backend===`managed-browser`?(r(),h(`p`,ze,`当前是托管浏览器,与电脑桌面和虚拟机分别管理;网页操作无需启动虚拟机。`)):g(``,!0),j.value?.downloads.length?(r(),h(`details`,Be,[p(`summary`,null,`浏览器下载(`+n(j.value.downloads.length)+`)`,1),p(`ul`,null,[(r(!0),h(d,null,o(j.value.downloads,e=>(r(),h(`li`,{key:e.id},[p(`span`,null,n(e.name),1),p(`small`,null,n((e.size/1024).toFixed(1))+` KiB`,1)]))),128))])])):g(``,!0),O.value?g(``,!0):(r(),h(`p`,Ve,`查看不会输入任何内容。接管后机器人会暂停,已有操作结束后才允许人工操作。`)),!O.value&&!yt.value&&C.value!==`managed-browser`?(r(),h(`button`,{key:6,type:`button`,disabled:L.value,onClick:a[8]||=e=>K(bt)},`重新检查连接`,8,He)):g(``,!0),!O.value&&E.value.mode!==`human`?(r(),h(`button`,{key:7,type:`button`,disabled:L.value||!yt.value,onClick:a[9]||=e=>f.embedded?x(`controlRequest`):Dt()},n(M.value?`正在准备浏览器…`:F.value?.status===`failed`?`重试并接管浏览器`:E.value.mode===`off`?`打开并控制`:`接管电脑`),9,Ue)):g(``,!0),V.value?(r(),h(d,{key:8},[k.value?(r(),h(`section`,We,[p(`div`,Ge,[(r(),h(d,null,o([`Return`,`Tab`,`Escape`,`BackSpace`,`Up`,`Down`,`Left`,`Right`],e=>p(`button`,{key:e,type:`button`,disabled:!U.value,onClick:t=>X({kind:`key`,key:e})},n({Return:`回车`,Escape:`Esc`,BackSpace:`退格`,Up:`↑`,Down:`↓`,Left:`←`,Right:`→`}[e]||e),9,Ke)),64))]),p(`div`,qe,[p(`button`,{disabled:!U.value,onClick:a[10]||=e=>X({kind:`key`,key:`a`,modifiers:[E.value.backend===`local`||E.value.backend===`browser`?`super`:`ctrl`]})},`全选`,8,Je),p(`button`,{disabled:!U.value,onClick:a[11]||=e=>X({kind:`key`,key:`c`,modifiers:[E.value.backend===`local`||E.value.backend===`browser`?`super`:`ctrl`]})},`复制`,8,Ye),p(`button`,{disabled:!U.value,onClick:a[12]||=e=>X({kind:`key`,key:`v`,modifiers:[E.value.backend===`local`||E.value.backend===`browser`?`super`:`ctrl`]})},`粘贴`,8,Xe)]),p(`label`,null,[a[17]||=u(`输入到电脑`,-1),i(p(`textarea`,{"onUpdate:modelValue":a[13]||=e=>lt.value=e,rows:`2`,maxlength:`16000`,placeholder:`输入文字后点击发送`,disabled:!U.value},null,8,Ze),[[ie,lt.value]])]),p(`button`,{type:`button`,disabled:!U.value||!lt.value,onClick:a[14]||=e=>{X({kind:`text`,text:lt.value}),lt.value=``}},`输入文字`,8,Qe)])):g(``,!0),p(`label`,null,[a[18]||=u(`交还说明`,-1),i(p(`textarea`,{"onUpdate:modelValue":a[15]||=e=>ut.value=e,rows:`2`,maxlength:`4000`,placeholder:`告诉机器人你完成了什么,以及接下来需要做什么`},null,512),[[ie,ut.value]])]),p(`button`,{type:`button`,disabled:L.value||E.value.mode!==`human`,onClick:a[16]||=e=>K(Ut)},n(E.value.canResume?`交还机器人并继续`:C.value===`managed-browser`?`结束接管`:`结束控制`),9,$e),C.value===`managed-browser`?(r(),h(`small`,et,n(j.value?.supportsRetention===!0?`交还或收起只会释放操作权,页面会保留;长时间空闲后可能回收。`:j.value?.supportsRetention===!1?`此节点需更新后才能跨任务保留页面;任务结束后浏览器会关闭。`:`交还或收起会结束当前接管。`),1)):(r(),h(`small`,tt,`控制只属于当前页面。页面断开后控制权会到期,任务不会自行恢复。`))],64)):g(``,!0)])):g(``,!0),_t.value?(r(),h(`section`,{key:5,class:`browser-session-actions`,"aria-busy":st.value},[p(`button`,{type:`button`,disabled:L.value,onClick:Wt},n(st.value?`正在关闭浏览器…`:`关闭浏览器`),9,rt),a[19]||=p(`small`,null,`结束当前浏览器会话并关闭标签页。`,-1)],8,nt)):g(``,!0)]),_:1},40,[`class`,`aria-label`]))],8,[`disabled`]))}}),[[`__scopeId`,`data-v-a7647a88`]]);export{se as n,O as t};
|
|
2
|
-
//# sourceMappingURL=ComputerPanel-
|
|
1
|
+
import{A as e,B as t,Dt as n,F as r,G as i,H as a,L as o,M as s,Tt as c,W as l,_ as u,a as d,b as f,d as p,et as m,f as ee,m as h,o as te,ot as ne,p as g,t as re,u as _}from"./_plugin-vue_export-helper-BumXM028.js";import{G as ie,J as ae,W as oe,w as v}from"./index-D11cgXI9.js";import{n as y}from"./id-mzBN_4Vw.js";function se(e){return!!e?.enabled&&(!!e.available||!!e.installation)}async function ce(e,t,n,r){let i=`/api/app/agents/${encodeURIComponent(e)}/managed-browser`,a=t??await v(i,{signal:n});if(n.throwIfAborted(),!se(a))throw Error(a.reason||`托管浏览器不可用,请检查执行节点与授权`);!a.available&&a.installation?.status!==`installing`&&(a=await v(i+`/prepare`,{method:`POST`,body:{retry:a.installation?.status===`failed`},signal:n}));let o=Date.now();for(;;){if(n.throwIfAborted(),r(a),a.available)return;if(a.installation?.status===`failed`)throw Error(a.installation.error||a.installation.message||`浏览器准备失败,请重试`);if(!se(a))throw Error(a.reason||`执行节点已不可用,请重新连接后重试`);if(Date.now()-o>6e5)throw Error(`浏览器仍在准备中,可稍后重新接管查看进度`);await new Promise((e,t)=>{let r=()=>{clearTimeout(i),t(n.reason??new DOMException(`Aborted`,`AbortError`))},i=setTimeout(()=>{n.removeEventListener(`abort`,r),e()},1e3);n.addEventListener(`abort`,r,{once:!0}),n.aborted&&r()}),a=await v(i,{signal:n})}}var le=class{send;failed;id=y();done;resolve;queue=[];running=!1;ending=!1;finished=!1;heartbeat;latest;constructor(e,t,n){this.send=t,this.failed=n,this.latest={x:e.x,y:e.y},this.done=new Promise(e=>{this.resolve=e}),this.heartbeat=setInterval(()=>{this.ending||this.move(this.latest)},1e3),this.enqueue(`start`,e)}move(e){this.ending||this.enqueue(`move`,e)}end(e){this.ending||(this.ending=!0,clearInterval(this.heartbeat),this.enqueue(`end`,e))}cancel(){return this.finished?this.done:(this.ending=!0,clearInterval(this.heartbeat),this.queue=[],this.enqueue(`cancel`,this.latest),this.done)}enqueue(e,t){this.latest={x:t.x,y:t.y};let n={kind:`pointer`,gestureId:this.id,phase:e,x:t.x,y:t.y};e===`move`&&this.queue.at(-1)?.phase===`move`?this.queue[this.queue.length-1]=n:this.queue.push(n),this.flush()}async flush(){if(!(this.running||this.finished)){this.running=!0;try{for(;this.queue.length;){let e=this.queue.shift();if(await this.send(e),e.phase===`end`||e.phase===`cancel`){this.finish();return}}}catch(e){this.ending=!0,this.queue=[],clearInterval(this.heartbeat);try{await this.send({kind:`pointer`,gestureId:this.id,phase:`cancel`,...this.latest})}catch{}this.failed(e),this.finish()}finally{this.running=!1}}}finish(){this.finished=!0,this.ending=!0,this.queue=[],clearInterval(this.heartbeat),this.resolve()}},ue={class:`browser-toolbar`,"aria-label":`机器人浏览器`},b={class:`browser-tabs`,role:`tablist`,"aria-label":`浏览器标签页`},x=[`aria-selected`,`title`,`disabled`,`onClick`],S=[`aria-label`,`disabled`,`onClick`],de=[`disabled`],C=[`disabled`],w=[`disabled`],T=[`disabled`],E=[`disabled`],D=[`disabled`],fe=re(f({__name:`BrowserToolbar`,props:{state:{},enabled:{type:Boolean}},emits:[`action`],setup(e,{emit:t}){let s=e,l=t,u=m(``),f=m(!1),ee=_(()=>s.state?.tabs.find(e=>e.active));a(()=>ee.value?.url,e=>{f.value||(u.value=e===`about:blank`?``:e??``)},{immediate:!0});function te(){let e=u.value.trim();e&&(/^https?:\/\//i.test(e)||(e=`https://`+e),f.value=!1,l(`action`,{kind:`navigate`,url:e}))}return(t,a)=>(r(),h(`div`,ue,[p(`div`,b,[(r(!0),h(d,null,o(e.state?.tabs,t=>(r(),h(`div`,{key:t.id,class:c([`tab`,{active:t.active}])},[p(`button`,{role:`tab`,"aria-selected":t.active,title:t.title,disabled:!e.enabled,onClick:e=>l(`action`,{kind:`select-tab`,tabId:t.id})},n(t.title),9,x),p(`button`,{class:`close-tab`,"aria-label":`关闭标签页 ${t.title}`,disabled:!e.enabled,onClick:e=>l(`action`,{kind:`close-tab`,tabId:t.id})},`×`,8,S)],2))),128)),p(`button`,{class:`new-tab`,"aria-label":`新建标签页`,disabled:!e.enabled,onClick:a[0]||=e=>l(`action`,{kind:`new-tab`,url:`https://www.google.com/`})},`+`,8,de)]),p(`form`,{class:`navigation`,onSubmit:ae(te,[`prevent`])},[p(`button`,{type:`button`,"aria-label":`后退`,disabled:!e.enabled,onClick:a[1]||=e=>l(`action`,{kind:`back`})},`←`,8,C),p(`button`,{type:`button`,"aria-label":`前进`,disabled:!e.enabled,onClick:a[2]||=e=>l(`action`,{kind:`forward`})},`→`,8,w),p(`button`,{type:`button`,"aria-label":`重新加载页面`,disabled:!e.enabled,onClick:a[3]||=e=>l(`action`,{kind:`reload`})},`↻`,8,T),i(p(`input`,{"onUpdate:modelValue":a[4]||=e=>u.value=e,type:`text`,inputmode:`url`,autocomplete:`off`,spellcheck:`false`,"aria-label":`浏览器地址`,placeholder:`输入网址`,disabled:!e.enabled,onFocus:a[5]||=e=>f.value=!0,onBlur:a[6]||=e=>f.value=!1},null,40,E),[[ie,u.value]]),p(`button`,{type:`submit`,disabled:!e.enabled||!u.value.trim()},`前往`,8,D)],32)]))}}),[[`__scopeId`,`data-v-76ef2743`]]),pe=[`value`,`disabled`],me=[`value`,`disabled`],he=[`disabled`],ge=[`value`],_e={key:2},ve=[`disabled`],ye=[`disabled`],be=[`aria-expanded`],xe=[`aria-pressed`],Se=[`disabled`],Ce=[`aria-busy`],we={role:`status`},Te=[`value`],Ee={key:1},De={key:2,role:`alert`},Oe=[`aria-busy`],ke={key:0,role:`status`},Ae=[`disabled`],je=[`src`,`alt`],Me={key:1,role:`status`},Ne={key:2,class:`view-label`},Pe={key:3,class:`computer-error`,role:`alert`},Fe={key:4},Ie={key:0},Le={key:1},Re={key:2},ze={key:3},Be={key:4,class:`browser-downloads`},Ve={key:5},He=[`disabled`],Ue=[`disabled`],We={key:0,class:`manual-input`},Ge={class:`key-row`},Ke=[`disabled`,`onClick`],qe={class:`key-row`},Je=[`disabled`],Ye=[`disabled`],Xe=[`disabled`],Ze=[`disabled`],Qe=[`disabled`],$e=[`disabled`],et={key:1},tt={key:2},nt=[`aria-busy`],rt=[`disabled`],O=re(f({__name:`ComputerPanel`,props:{agents:{},embedded:{type:Boolean},standalone:{type:Boolean},autoTake:{type:Boolean},backend:{},host:{}},emits:[`close`,`changed`,`controlRequest`,`targetChanged`],setup(f,{expose:re,emit:ue}){let b=f,x=ue,S=m(b.agents[0]?.id??``),de=m(),C=m(b.backend),w=m(b.host??(b.backend===`desktop`?`local`:``)),T=m(),E=m({mode:`off`}),D=m(),O=m(),k=m(!1),it=m(!1),A=m(),at=m(!1),j=m(),M=m(!1),ot=m(!1),st=m(!1),N=m(!0),P,F=_(()=>C.value===`managed-browser`?j.value?.installation:void 0),ct=_(()=>b.agents.find(e=>e.id===S.value)),I=m(``),L=m(!1),lt=m(``),ut=m(``),R=m(!1),dt,ft=``,pt,z=!1,mt=!1,ht=0,B=0,gt={off:`电脑未运行`,idle:`电脑空闲 · 仅查看`,agent:`机器人正在操作`,pausing:`正在等待当前操作结束`,human:`人工控制中`,resuming:`正在交还机器人`,error:`电脑需要检查`},V=_(()=>!!O.value&&O.value.controlId===E.value.controlId),_t=_(()=>C.value===`managed-browser`&&V.value&&E.value.mode===`human`&&!E.value.canResume),H=_(()=>R.value&&!!D.value&&V.value&&E.value.mode===`human`&&D.value?.generation===E.value.generation),U=_(()=>H.value&&!L.value&&!at.value),W=m({vm:!0,cloud:!0,managedBrowser:!1}),G=_(()=>{let e=W.value,t=T.value,n=[];if(e.cloud&&n.push({key:`cloud`,label:`云虚拟机`+(N.value?` · 正在检查`:t?.cloudConfigured?``:` · 未连接`),backend:`cloud`,disabled:N.value||!t?.cloudConfigured}),e.vm&&n.push({key:`vm`,label:`本地虚拟机`+(N.value?` · 正在检查`:t?.vmEnabled?``:` · 未启用`),backend:`vm`,disabled:N.value||!t?.vmEnabled}),e.managedBrowser){let e=t?.managedBrowser;n.push({key:`managed-browser`,label:`托管浏览器`+(N.value?` · 正在检查`:e?.available?``:se(e)?` · `+(e?.installation?.status===`failed`?`准备失败`:`待准备`):` · 不可用`),backend:`managed-browser`,disabled:N.value||!se(e)})}return n}),vt=_(()=>G.value.find(e=>e.backend===C.value&&(e.host??``)===w.value)?.key??``),yt=_(()=>G.value.some(e=>e.key===vt.value&&!e.disabled));a([C,w],([e,t])=>{e&&x(`targetChanged`,e,t||void 0)},{immediate:!0});async function bt(){if(!S.value)return;let e=S.value,t=encodeURIComponent(e);N.value=!0;try{let n=await v(`/api/app/settings/host-tools`);if(z||e!==S.value)return;W.value={vm:n.vm,cloud:n.cloud,managedBrowser:n.managedBrowser===!0};let[r,i,a]=await Promise.all([W.value.cloud?v(`/api/app/agents/${t}/cloud-computer`).catch(()=>void 0):Promise.resolve(void 0),W.value.vm?v(`/api/app/agents/${t}/local-vm`).catch(()=>void 0):Promise.resolve(void 0),W.value.managedBrowser?v(`/api/app/agents/${t}/managed-browser`).catch(()=>void 0):Promise.resolve(void 0)]);if(z||e!==S.value)return;T.value={cloudConfigured:!!r?.configured,vmEnabled:!!i?.enabled,managedBrowser:a},C.value===`managed-browser`&&(j.value=a,A.value=a)}finally{e===S.value&&(N.value=!1)}}async function xt(e){let t=G.value.find(t=>t.key===e);if(!(!t||t.disabled||e===vt.value)){if(await $(),O.value)try{await wt(`/giveback`,{...O.value,notes:``})}catch(e){I.value=e instanceof Error?e.message:`请先交还当前电脑`;return}C.value=t.backend,w.value=t.host??``,P?.abort(),clearTimeout(Y),J=void 0,A.value=void 0,j.value=void 0,q.length=0,R.value=!1,B++,dt=void 0,D.value=void 0,O.value=void 0,E.value={mode:`off`},ft=``,I.value=``,await Tt()}}let St=()=>`/api/app/agents/${encodeURIComponent(S.value)}/computer`,Ct=()=>{let e=new URLSearchParams;C.value&&e.set(`backend`,C.value),C.value===`desktop`&&w.value&&e.set(`host`,w.value);let t=e.toString();return t?`?`+t:``};async function wt(e,t){return v(St()+e+Ct(),{method:`POST`,body:t})}async function Tt(){if(mt||L.value||z||!S.value||document.hidden||!yt.value&&!(C.value===`managed-browser`&&W.value.managedBrowser))return;mt=!0;let e=++B,t=St(),n=Ct(),r=S.value;try{if(C.value===`managed-browser`){let t=await v(`/api/app/agents/${encodeURIComponent(r)}/managed-browser`).catch(t=>{throw e===B&&!z&&(j.value=void 0,A.value=void 0,T.value&&(T.value.managedBrowser=void 0),E.value={mode:`off`,backend:`managed-browser`}),t});if(e!==B||z)return;if(j.value=t,A.value=t,T.value&&(T.value.managedBrowser=t),!t.available){E.value={mode:`off`,backend:`managed-browser`},R.value=!1,D.value=void 0,I.value=ft;return}}let i=await v(t+n);if(e!==B||z)return;if(E.value=i,R.value=!0,O.value&&i.controlId!==O.value.controlId&&i.mode!==`pausing`&&(O.value=void 0),V.value&&Date.now()-ht>8e3&&(await wt(`/renew`,O.value),ht=Date.now()),i.backend===`browser`){let t=await v(`/api/app/agents/${encodeURIComponent(S.value)}/browser`);if(e!==B||z)return;A.value=t,j.value=void 0}else i.backend!==`managed-browser`&&(A.value=void 0,j.value=void 0);if(i.mode!==`off`&&(![`browser`,`managed-browser`].includes(i.backend??``)||A.value?.open)){let r=await v(t+`/frame`+n);e===B&&!z&&(D.value=r)}else D.value=void 0;I.value=ft}catch(t){if(e===B&&!z){R.value=!1,D.value=void 0,q.length=0,I.value=t instanceof Error?t.message:`无法读取电脑状态`;{let e=Number(t.status);([401,410].includes(e)||e===403&&O.value)&&(O.value=void 0,D.value=void 0,E.value={mode:`off`})}}}finally{mt=!1}}async function K(e){if(L.value)return;B++,L.value=!0,ft=``,I.value=``;let t=``;try{await e()}catch(e){t=e instanceof Error?e.message:`电脑操作失败`}finally{L.value=!1,z||(await Tt(),t&&(ft=t,I.value=t),kt())}}async function Et(){if(!L.value){ot.value=!0;try{await K(bt)}finally{ot.value=!1}}}function Dt(){return K(async()=>{if(!yt.value)throw Error(`所选电脑不可用,请重新选择`);let e=S.value,t=C.value,n=St(),r=Ct(),i=new AbortController;P=i;try{if(t===`managed-browser`&&(M.value=!j.value?.available,await ce(e,j.value,i.signal,n=>{!z&&e===S.value&&t===C.value&&(j.value=n,A.value=n,T.value&&(T.value.managedBrowser=n))})),i.signal.throwIfAborted(),z||e!==S.value||t!==C.value)return;M.value=!1,dt??=y();let a=await v(n+`/take`+r,{method:`POST`,body:{requestId:dt}}),o={controlId:a.controlId,token:a.token};if(z||i.signal.aborted||e!==S.value||t!==C.value){await v(n+`/giveback`+r,{method:`POST`,body:{...o,notes:``}});return}O.value=o,E.value=a,ht=0}catch(e){if(!i.signal.aborted)throw e}finally{P===i&&(P=void 0,M.value=!1)}})}let q=[],Ot=!1,J,Y;function X(e){if(!H.value||z||at.value)return;J&&(q.push(J),J=void 0,clearTimeout(Y));let t=q.at(-1);if(e.kind===`text`&&t?.kind===`text`&&t.text.length+e.text.length<=16e3)t.text+=e.text;else if(q.length<64)q.push(e);else{I.value=`输入过快,请稍后再试`;return}kt()}async function kt(){if(Ot||L.value||!q.length||z)return;if(!H.value||!D.value||!O.value){q.length=0;return}Ot=!0;let e=q.shift(),t=D.value,n=O.value;try{await K(async()=>{await wt(`/input`,{...n,requestId:y(),generation:t.generation,frameId:t.id,action:e})}),I.value&&(q.length=0)}finally{Ot=!1,q.length&&setTimeout(()=>void kt(),0)}}function At(e){if(!U.value||!D.value||!O.value)return;let t=D.value,n=O.value;K(async()=>{C.value===`managed-browser`?await v(`/api/app/agents/${encodeURIComponent(S.value)}/managed-browser/action`,{method:`POST`,body:{...n,requestId:y(),generation:t.generation,action:e}}):await wt(`/browser`,{...n,requestId:y(),generation:t.generation,frameId:t.id,action:e})})}function jt(e,t=!1){let n=e.currentTarget.getBoundingClientRect(),r=D.value,i=Math.min(n.width/r.width,n.height/r.height),a=n.left+(n.width-r.width*i)/2,o=n.top+(n.height-r.height*i)/2,s=Math.floor((e.clientX-a)/i),c=Math.floor((e.clientY-o)/i);if(t)return{x:Math.max(0,Math.min(r.width-1,s)),y:Math.max(0,Math.min(r.height-1,c))};if(!(s<0||c<0||s>=r.width||c>=r.height))return{x:s,y:c}}let Z,Mt=!1,Q;function Nt(e){if(!U.value||Z||e.button!==0||q.length)return;let t=e.currentTarget;t.focus({preventScroll:!0});let n=jt(e);n&&(Mt=!1,Z={...n,clientX:e.clientX,clientY:e.clientY,pointerId:e.pointerId,element:t},t.setPointerCapture(e.pointerId))}function Pt(e){let t=St(),n=Ct(),r=O.value,i=D.value.generation,a=D.value;clearTimeout(Y),J=void 0,I.value=``,at.value=!0;let o=()=>!z&&St()===t&&Ct()===n&&O.value?.controlId===r.controlId&&E.value.generation===i,s=new le(e,async e=>{if(e.phase!==`cancel`&&(!o()||!H.value))throw Error(`控制权已变化,请重新接管`);if(await v(t+`/input`+n,{method:`POST`,timeoutMs:5e3,body:{...r,requestId:y(),generation:i,frameId:a.id,action:{...e}}}),e.phase===`cancel`)return;let s=await v(t+`/frame`+n,{timeoutMs:5e3});if(!o()||s.generation!==i)throw Error(`控制权已变化,请重新接管`);a=s,D.value=s},e=>{o()&&(I.value=e instanceof Error?e.message:`拖动失败,请重新按下鼠标`)});Q=s,s.done.then(async()=>{if(Q===s){Q=void 0,at.value=!1;let e=I.value;await Tt(),o()&&e&&(I.value=e)}})}function Ft(e){let t=Z;if(!t||e.pointerId!==t.pointerId||!H.value||C.value!==`managed-browser`)return;!Q&&Math.hypot(e.clientX-t.clientX,e.clientY-t.clientY)>5&&(Mt=!0,Pt(t));let n=jt(e,!0);n&&Q?.move(n)}function It(){let e=Z;Z=void 0,e?.element.hasPointerCapture(e.pointerId)&&e.element.releasePointerCapture(e.pointerId)}function $(){return It(),Q?(Mt=!0,Q.cancel()):Promise.resolve()}function Lt(e){let t=Z;if(!t||e.pointerId!==t.pointerId)return;if(!H.value){$();return}Ft(e);let n=jt(e,!0);if(It(),Q){n?Q.end(n):$();return}n&&Math.hypot(e.clientX-t.clientX,e.clientY-t.clientY)>5&&(Mt=!0,X({kind:`drag`,fromX:t.x,fromY:t.y,toX:n.x,toY:n.y}))}let Rt=()=>{$()},zt=()=>{document.hidden&&$()};a(H,e=>{e||$()});function Bt(e){H.value&&(e.preventDefault(),X({kind:`scroll`,direction:Math.abs(e.deltaX)>Math.abs(e.deltaY)?e.deltaX>0?`right`:`left`:e.deltaY>0?`down`:`up`,amount:Math.min(20,Math.max(1,Math.ceil(Math.abs(e.deltaY||e.deltaX)/80)))}))}function Vt(e){if(!H.value)return;if(e.preventDefault(),e.stopPropagation(),e.key===`Escape`){$(),e.currentTarget.blur();return}let t=[e.ctrlKey||C.value===`managed-browser`&&e.metaKey?`ctrl`:``,e.altKey?`alt`:``,e.shiftKey?`shift`:``,e.metaKey&&C.value!==`managed-browser`?`super`:``].filter(Boolean);e.key.length===1&&!e.ctrlKey&&!e.altKey&&!e.metaKey?X({kind:`text`,text:e.key}):[`Control`,`Alt`,`Shift`,`Meta`].includes(e.key)||X({kind:`key`,key:{Enter:`Return`,ArrowUp:`Up`,ArrowDown:`Down`,ArrowLeft:`Left`,ArrowRight:`Right`,Backspace:`BackSpace`}[e.key]??e.key,modifiers:t})}function Ht(e){if(Mt){Mt=!1;return}if(!H.value||!D.value)return;let t=jt(e);if(!t)return;let n={kind:`click`,...t,button:e.button===2?`right`:`left`,count:e.detail>1?2:1};if(e.button===2||e.detail>1)clearTimeout(Y),J=void 0,X(n);else{if(J){let e=J;J=void 0,clearTimeout(Y),X(e)}J=n,Y=setTimeout(()=>{let e=J;J=void 0,e&&X(e)},180)}}async function Ut(){await $(),O.value&&(await wt(`/giveback`,{...O.value,notes:ut.value}),O.value=void 0,dt=void 0,ut.value=``)}async function Wt(){if(L.value||!_t.value||!O.value)return;await $();let e=S.value,t=O.value;st.value=!0;try{await K(async()=>{clearTimeout(Y),J=void 0,q.length=0;let n=await v(`/api/app/agents/${encodeURIComponent(e)}/managed-browser/close`,{method:`POST`,body:t});z||S.value!==e||C.value!==`managed-browser`||O.value!==t||(E.value=n,O.value=void 0,dt=void 0,ut.value=``,D.value=void 0,R.value=!1,k.value=!1,x(`changed`))})}finally{st.value=!1}}async function Gt(){if(M.value){P?.abort(),z=!0,de.value?.close?.(),x(`close`);return}L.value||(await K(Ut),O.value||(z=!0,!b.embedded&&!b.standalone&&de.value?.close(),x(`close`)))}async function Kt(){try{document.fullscreenElement?await document.exitFullscreen():await de.value?.requestFullscreen()}catch{I.value=`无法进入全屏,请使用窗口最大化`}}async function qt(){await Tt(),z||(pt=setTimeout(()=>void qt(),1200))}return a(S,()=>{$(),P?.abort(),clearTimeout(Y),J=void 0,A.value=void 0,j.value=void 0,q.length=0,R.value=!1,B++,dt=void 0,D.value=void 0,O.value=void 0,E.value={mode:`off`},ft=``,I.value=``,C.value=b.backend,w.value=b.host??(b.backend===`desktop`?`local`:``),T.value=void 0,bt().then(async()=>{if(!C.value){let e=G.value.find(e=>!e.disabled);e&&await xt(e.key)}await Tt()}).catch(e=>{I.value=e instanceof Error?e.message:`无法读取电脑列表`})}),s(async()=>{window.addEventListener(`blur`,Rt),document.addEventListener(`visibilitychange`,zt),!b.embedded&&!b.standalone&&de.value?.showModal();try{if(await bt(),z)return;if(!C.value){let e=G.value.find(e=>!e.disabled);e&&await xt(e.key)}if(!yt.value&&C.value!==`managed-browser`)throw Error(`所选电脑不可用,请重新选择;未打开其他电脑`);b.autoTake&&!z&&yt.value&&await Dt()}catch(e){I.value=e instanceof Error?e.message:`无法读取电脑列表`}z||qt()}),e(()=>{$(),window.removeEventListener(`blur`,Rt),document.removeEventListener(`visibilitychange`,zt),P?.abort(),O.value&&wt(`/giveback`,{...O.value,notes:ut.value}).catch(()=>{}),q.length=0,J=void 0,clearTimeout(Y),z=!0,B++,clearTimeout(pt)}),re({take:Dt,close:Gt,releaseControl:async()=>{if(M.value){P?.abort();return}if(L.value)throw Error(`请等待当前操作完成`);if(await K(Ut),O.value)throw Error(I.value||`请先交还控制权`)},hasControl:()=>!!O.value}),(e,a)=>(r(),ee(te,{to:`body`,disabled:f.embedded||f.standalone},[(r(),ee(t(f.embedded||f.standalone?`section`:`dialog`),{ref_key:`dialog`,ref:de,class:c([`computer-panel`,{embedded:f.embedded,standalone:f.standalone}]),"aria-label":G.value.find(e=>e.key===vt.value)?.label||`电脑桌面`,onCancel:ae(Gt,[`prevent`])},{default:l(()=>[p(`header`,null,[p(`div`,null,[p(`strong`,null,n(C.value===`managed-browser`?`托管浏览器`:C.value===`cloud`?`云虚拟机`:`本地虚拟机`),1),p(`small`,null,n(M.value?`正在准备浏览器`:gt[E.value.mode]),1)]),G.value.length>1?(r(),h(`select`,{key:0,value:vt.value,"aria-label":`切换电脑环境`,disabled:!!O.value||L.value,onChange:a[0]||=e=>xt(e.target.value)},[(r(!0),h(d,null,o(G.value,e=>(r(),h(`option`,{key:e.key,value:e.key,disabled:e.disabled},n(e.label),9,me))),128))],40,pe)):g(``,!0),f.agents.length>1?i((r(),h(`select`,{key:1,"onUpdate:modelValue":a[1]||=e=>S.value=e,"aria-label":`选择电脑`,disabled:!!O.value||L.value},[(r(!0),h(d,null,o(f.agents,e=>(r(),h(`option`,{key:e.id,value:e.id},n(e.name),9,ge))),128))],8,he)),[[oe,S.value]]):f.embedded?g(``,!0):(r(),h(`span`,_e,n(f.agents[0]?.name),1)),f.embedded&&!O.value?(r(),h(`button`,{key:3,disabled:L.value||E.value.mode===`human`,onClick:a[2]||=e=>x(`controlRequest`)},`接管电脑`,8,ve)):g(``,!0),f.embedded&&V.value?(r(),h(`button`,{key:4,onClick:a[3]||=e=>k.value=!k.value},`键盘与操作`)):g(``,!0),f.embedded&&V.value?(r(),h(`button`,{key:5,disabled:L.value||E.value.mode!==`human`,onClick:a[4]||=e=>K(Ut)},`交还`,8,ye)):g(``,!0),f.embedded?g(``,!0):(r(),h(d,{key:6},[V.value?(r(),h(`button`,{key:0,type:`button`,"aria-expanded":k.value,onClick:a[5]||=e=>k.value=!k.value},`键盘与操作`,8,be)):g(``,!0),p(`button`,{type:`button`,"aria-pressed":it.value,onClick:a[6]||=e=>it.value=!it.value},n(it.value?`适应窗口`:`原始大小`),9,xe),p(`button`,{type:`button`,onClick:Kt},`全屏`)],64)),f.embedded?g(``,!0):(r(),h(`button`,{key:7,class:`return-control`,type:`button`,disabled:L.value&&!M.value,onClick:Gt},n(C.value===`managed-browser`?O.value?`交还并收起`:`收起窗口`:O.value?`交还并关闭`:`关闭`),9,Se))]),E.value.backend===`browser`||E.value.backend===`managed-browser`?(r(),ee(fe,{key:0,state:A.value,enabled:U.value,onAction:At},null,8,[`state`,`enabled`])):g(``,!0),F.value&&F.value.status!==`ready`?(r(),h(`section`,{key:1,class:`browser-installation`,"aria-busy":M.value},[p(`p`,we,n(F.value.message),1),F.value.status===`installing`||F.value.status===`checking`?(r(),h(`progress`,{key:0,value:F.value.progress,max:`100`,"aria-label":`浏览器准备进度`},null,8,Te)):g(``,!0),M.value?(r(),h(`small`,Ee,`关闭窗口后仍会继续准备。`)):g(``,!0),F.value.error?(r(),h(`p`,De,n(F.value.error),1)):g(``,!0)],8,Ce)):g(``,!0),!N.value&&C.value===`managed-browser`&&!j.value?.available?(r(),h(`section`,{key:2,class:`browser-availability`,"aria-busy":ot.value},[F.value?g(``,!0):(r(),h(`p`,ke,n(j.value?.reason||(W.value.managedBrowser?`执行节点暂时不可用,请检查连接后重新检测。`:`托管浏览器尚未开放,请在「设置 → 环境与权限 → 运行环境」中开启。`)),1)),p(`button`,{type:`button`,disabled:L.value,onClick:Et},n(ot.value?`正在检测…`:`重新检测`),9,Ae)],8,Oe)):g(``,!0),p(`div`,{class:c([`computer-screen`,{controlling:H.value,"actual-size":it.value}])},[D.value?(r(),h(`img`,{key:0,src:`data:image/png;base64,${D.value.data}`,alt:(G.value.find(e=>e.key===vt.value)?.label||`电脑`)+`当前画面`,draggable:`false`,tabindex:`0`,title:`点按后可使用键盘、滚轮和拖动;按 Esc 退出键盘控制`,onPointerdown:Nt,onPointermove:Ft,onPointerup:Lt,onPointercancel:$,onLostpointercapture:a[7]||=e=>ne(Z)&&$(),onBlur:$,onWheel:Bt,onKeydown:Vt,onClick:Ht,onContextmenu:ae(Ht,[`prevent`])},null,40,je)):(r(),h(`p`,Me,n(N.value?`正在检查电脑环境…`:M.value?`准备完成后会自动接管,无需再次点击。`:E.value.mode===`off`?C.value===`managed-browser`?`浏览器尚未打开。接管后可打开网页。`:`打开电脑后可查看桌面。`:`正在读取电脑画面…`),1)),D.value&&(!V.value||D.value.generation!==E.value.generation)?(r(),h(`span`,Ne,n(V.value?`正在同步画面`:E.value.mode===`off`?`上次画面`:`仅查看`),1)):g(``,!0)],2),I.value||E.value.error?(r(),h(`p`,Pe,n(I.value||E.value.error),1)):g(``,!0),k.value||!f.embedded&&!O.value?(r(),h(`footer`,Fe,[E.value.backend===`grok`?(r(),h(`p`,Ie,`多个机器人共享同一台 Grok Bot 云端电脑、工作文件与浏览器资料。`)):E.value.backend===`local`?(r(),h(`p`,Le,`当前显示`+n(E.value.hostName||`所选电脑`)+`的桌面,点击、输入、按键和滚动都会发送到这台电脑。`,1)):g(``,!0),C.value===`vm`&&ct.value?.computerEnvironmentId?(r(),h(`p`,Re,`共享电脑:`+n(ct.value.computerEnvironmentName)+`。成员共用工作文件和浏览器资料,可同时执行命令与文件操作,桌面操作交替进行;人工接管时机器人暂停等待。`,1)):g(``,!0),E.value.backend===`managed-browser`?(r(),h(`p`,ze,`当前是托管浏览器,与电脑桌面和虚拟机分别管理;网页操作无需启动虚拟机。`)):g(``,!0),j.value?.downloads.length?(r(),h(`details`,Be,[p(`summary`,null,`浏览器下载(`+n(j.value.downloads.length)+`)`,1),p(`ul`,null,[(r(!0),h(d,null,o(j.value.downloads,e=>(r(),h(`li`,{key:e.id},[p(`span`,null,n(e.name),1),p(`small`,null,n((e.size/1024).toFixed(1))+` KiB`,1)]))),128))])])):g(``,!0),O.value?g(``,!0):(r(),h(`p`,Ve,`查看不会输入任何内容。接管后机器人会暂停,已有操作结束后才允许人工操作。`)),!O.value&&!yt.value&&C.value!==`managed-browser`?(r(),h(`button`,{key:6,type:`button`,disabled:L.value,onClick:a[8]||=e=>K(bt)},`重新检查连接`,8,He)):g(``,!0),!O.value&&E.value.mode!==`human`?(r(),h(`button`,{key:7,type:`button`,disabled:L.value||!yt.value,onClick:a[9]||=e=>f.embedded?x(`controlRequest`):Dt()},n(M.value?`正在准备浏览器…`:F.value?.status===`failed`?`重试并接管浏览器`:E.value.mode===`off`?`打开并控制`:`接管电脑`),9,Ue)):g(``,!0),V.value?(r(),h(d,{key:8},[k.value?(r(),h(`section`,We,[p(`div`,Ge,[(r(),h(d,null,o([`Return`,`Tab`,`Escape`,`BackSpace`,`Up`,`Down`,`Left`,`Right`],e=>p(`button`,{key:e,type:`button`,disabled:!U.value,onClick:t=>X({kind:`key`,key:e})},n({Return:`回车`,Escape:`Esc`,BackSpace:`退格`,Up:`↑`,Down:`↓`,Left:`←`,Right:`→`}[e]||e),9,Ke)),64))]),p(`div`,qe,[p(`button`,{disabled:!U.value,onClick:a[10]||=e=>X({kind:`key`,key:`a`,modifiers:[E.value.backend===`local`||E.value.backend===`browser`?`super`:`ctrl`]})},`全选`,8,Je),p(`button`,{disabled:!U.value,onClick:a[11]||=e=>X({kind:`key`,key:`c`,modifiers:[E.value.backend===`local`||E.value.backend===`browser`?`super`:`ctrl`]})},`复制`,8,Ye),p(`button`,{disabled:!U.value,onClick:a[12]||=e=>X({kind:`key`,key:`v`,modifiers:[E.value.backend===`local`||E.value.backend===`browser`?`super`:`ctrl`]})},`粘贴`,8,Xe)]),p(`label`,null,[a[17]||=u(`输入到电脑`,-1),i(p(`textarea`,{"onUpdate:modelValue":a[13]||=e=>lt.value=e,rows:`2`,maxlength:`16000`,placeholder:`输入文字后点击发送`,disabled:!U.value},null,8,Ze),[[ie,lt.value]])]),p(`button`,{type:`button`,disabled:!U.value||!lt.value,onClick:a[14]||=e=>{X({kind:`text`,text:lt.value}),lt.value=``}},`输入文字`,8,Qe)])):g(``,!0),p(`label`,null,[a[18]||=u(`交还说明`,-1),i(p(`textarea`,{"onUpdate:modelValue":a[15]||=e=>ut.value=e,rows:`2`,maxlength:`4000`,placeholder:`告诉机器人你完成了什么,以及接下来需要做什么`},null,512),[[ie,ut.value]])]),p(`button`,{type:`button`,disabled:L.value||E.value.mode!==`human`,onClick:a[16]||=e=>K(Ut)},n(E.value.canResume?`交还机器人并继续`:C.value===`managed-browser`?`结束接管`:`结束控制`),9,$e),C.value===`managed-browser`?(r(),h(`small`,et,n(j.value?.supportsRetention===!0?`交还或收起只会释放操作权,页面会保留;长时间空闲后可能回收。`:j.value?.supportsRetention===!1?`此节点需更新后才能跨任务保留页面;任务结束后浏览器会关闭。`:`交还或收起会结束当前接管。`),1)):(r(),h(`small`,tt,`控制只属于当前页面。页面断开后控制权会到期,任务不会自行恢复。`))],64)):g(``,!0)])):g(``,!0),_t.value?(r(),h(`section`,{key:5,class:`browser-session-actions`,"aria-busy":st.value},[p(`button`,{type:`button`,disabled:L.value,onClick:Wt},n(st.value?`正在关闭浏览器…`:`关闭浏览器`),9,rt),a[19]||=p(`small`,null,`结束当前浏览器会话并关闭标签页。`,-1)],8,nt)):g(``,!0)]),_:1},40,[`class`,`aria-label`]))],8,[`disabled`]))}}),[[`__scopeId`,`data-v-a7647a88`]]);export{se as n,O as t};
|
|
2
|
+
//# sourceMappingURL=ComputerPanel-DdlgOm-B.js.map
|