@lsamien/yaovi 0.1.3 → 0.1.4

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.
Files changed (59) hide show
  1. package/build-info.json +15 -4
  2. package/desktop/main.mjs +1 -1
  3. package/dist/assets/{AboutDialog-CnNkIRo8.js → AboutDialog-CDpS-zAu.js} +2 -2
  4. package/dist/assets/{AboutDialog-CnNkIRo8.js.map → AboutDialog-CDpS-zAu.js.map} +1 -1
  5. package/dist/assets/{BotAutomationsView-J9Y7Unoq.js → BotAutomationsView-RXBQzdfc.js} +2 -2
  6. package/dist/assets/{BotAutomationsView-J9Y7Unoq.js.map → BotAutomationsView-RXBQzdfc.js.map} +1 -1
  7. package/dist/assets/{BotControlSettingsPanel-CtXD24FZ.js → BotControlSettingsPanel-GQEVHXbw.js} +2 -2
  8. package/dist/assets/{BotControlSettingsPanel-CtXD24FZ.js.map → BotControlSettingsPanel-GQEVHXbw.js.map} +1 -1
  9. package/dist/assets/BotPluginsDialog-HIhXqyGn.js +2 -0
  10. package/dist/assets/{BotPluginsDialog-qRw8dCbX.js.map → BotPluginsDialog-HIhXqyGn.js.map} +1 -1
  11. package/dist/assets/{BotSettingsPanel-DbCMOfAW.js → BotSettingsPanel-Bkqal3lR.js} +3 -3
  12. package/dist/assets/{BotSettingsPanel-DbCMOfAW.js.map → BotSettingsPanel-Bkqal3lR.js.map} +1 -1
  13. package/dist/assets/{ComputerPanel-CI-jDmC3.js → ComputerPanel-Dt73pgTG.js} +2 -2
  14. package/dist/assets/{ComputerPanel-CI-jDmC3.js.map → ComputerPanel-Dt73pgTG.js.map} +1 -1
  15. package/dist/assets/{ComputerViewerView-B76D6Fln.js → ComputerViewerView-ChYgaS9q.js} +2 -2
  16. package/dist/assets/{ComputerViewerView-B76D6Fln.js.map → ComputerViewerView-ChYgaS9q.js.map} +1 -1
  17. package/dist/assets/{ConversationsView-DsuaLKva.js → ConversationsView-DzcDJZh3.js} +88 -88
  18. package/dist/assets/ConversationsView-DzcDJZh3.js.map +1 -0
  19. package/dist/assets/ConversationsView-EdF5AM1T.css +1 -0
  20. package/dist/assets/{LocalVmSettingsPanel-BfXFdMYF.js → LocalVmSettingsPanel-DLbDb5Tq.js} +4 -4
  21. package/dist/assets/{LocalVmSettingsPanel-BfXFdMYF.js.map → LocalVmSettingsPanel-DLbDb5Tq.js.map} +1 -1
  22. package/dist/assets/{ModelNetworkChoice-DB6cLOBw.js → ModelNetworkChoice-Cfyt4Unl.js} +2 -2
  23. package/dist/assets/{ModelNetworkChoice-DB6cLOBw.js.map → ModelNetworkChoice-Cfyt4Unl.js.map} +1 -1
  24. package/dist/assets/{StandaloneDialog-BWUp2Wxo.js → StandaloneDialog-Cte829Ai.js} +2 -2
  25. package/dist/assets/{StandaloneDialog-BWUp2Wxo.js.map → StandaloneDialog-Cte829Ai.js.map} +1 -1
  26. package/dist/assets/{UpdateCheckDialog-CpZSPlUI.js → UpdateCheckDialog-BaMo_M4n.js} +2 -2
  27. package/dist/assets/{UpdateCheckDialog-CpZSPlUI.js.map → UpdateCheckDialog-BaMo_M4n.js.map} +1 -1
  28. package/dist/assets/{UsageView-BhiRCw7p.js → UsageView-CklMPG4n.js} +3 -3
  29. package/dist/assets/{UsageView-BhiRCw7p.js.map → UsageView-CklMPG4n.js.map} +1 -1
  30. package/dist/assets/WorkspaceKnowledgePanel-BdbhD3rO.js +3 -0
  31. package/dist/assets/{WorkspaceKnowledgePanel-D34YxglF.js.map → WorkspaceKnowledgePanel-BdbhD3rO.js.map} +1 -1
  32. package/dist/assets/WorkspaceRoutinesPanel-VpRoMe1x.js +2 -0
  33. package/dist/assets/{WorkspaceRoutinesPanel-Bn-W52Im.js.map → WorkspaceRoutinesPanel-VpRoMe1x.js.map} +1 -1
  34. package/dist/assets/{WorkstreamsView-CH6qDPvj.js → WorkstreamsView-BwZpuuhs.js} +2 -2
  35. package/dist/assets/{WorkstreamsView-CH6qDPvj.js.map → WorkstreamsView-BwZpuuhs.js.map} +1 -1
  36. package/dist/assets/index-C-5Gq82f.css +1 -0
  37. package/dist/assets/{index-DjhQ-RMG.js → index-Cx1SdzRY.js} +18 -18
  38. package/dist/assets/index-Cx1SdzRY.js.map +1 -0
  39. package/dist/assets/{pdf-wqiF06Qz.js → pdf-CoNh_Rmj.js} +2 -2
  40. package/dist/assets/{pdf-wqiF06Qz.js.map → pdf-CoNh_Rmj.js.map} +1 -1
  41. package/dist/index.html +2 -2
  42. package/dist-server/server/remoteAccess/dispatcher.js +5 -1
  43. package/node_modules/@yaovi/remote-core/index.mjs +13 -10
  44. package/node_modules/@yaovi/remote-core/package.json +2 -2
  45. package/node_modules/@yaovi/remote-core/types/remote-core/src/control/recovery.d.ts +1 -1
  46. package/node_modules/@yaovi/remote-core/types/remote-core/src/control/remote.d.ts +2 -0
  47. package/node_modules/@yaovi/remote-core/types/remote-core/src/index.d.ts +1 -0
  48. package/node_modules/@yaovi/remote-core/types/remote-core/src/transport/lan.d.ts +10 -4
  49. package/node_modules/@yaovi/remote-core/types/remote-core/src/transport/packet.d.ts +2 -2
  50. package/package.json +2 -2
  51. package/release.json +3 -3
  52. package/vendor/yaovi-remote-core-0.2.0-remote.18.tgz +0 -0
  53. package/dist/assets/BotPluginsDialog-qRw8dCbX.js +0 -2
  54. package/dist/assets/ConversationsView-DoA0eNiz.css +0 -1
  55. package/dist/assets/ConversationsView-DsuaLKva.js.map +0 -1
  56. package/dist/assets/WorkspaceKnowledgePanel-D34YxglF.js +0 -3
  57. package/dist/assets/WorkspaceRoutinesPanel-Bn-W52Im.js +0 -2
  58. package/dist/assets/index-DjhQ-RMG.js.map +0 -1
  59. package/dist/assets/index-DrIgDgnN.css +0 -1
@@ -1,3 +1,3 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LocalVmSettingsPanel-BfXFdMYF.js","assets/_plugin-vue_export-helper-CD0r-vVb.js","assets/index-DjhQ-RMG.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/index-DrIgDgnN.css","assets/ConversationsView-DsuaLKva.js","assets/WorkspaceKnowledgePanel-D34YxglF.js","assets/WorkspaceKnowledgePanel-CBlUplay.css","assets/StandaloneDialog-BWUp2Wxo.js","assets/StandaloneDialog-BS6Ta2zL.css","assets/ModelNetworkChoice-DB6cLOBw.js","assets/ModelNetworkChoice-CvoBde4M.css","assets/WorkspaceRoutinesPanel-Bn-W52Im.js","assets/WorkspaceRoutinesPanel-CbLiNc6R.css","assets/ComputerPanel-CI-jDmC3.js","assets/ComputerPanel-BcXhqQ9K.css","assets/backgroundTaskPresentation-CJMcreMr.js","assets/ConversationsView-DoA0eNiz.css","assets/LocalVmSettingsPanel-UgBP6t1d.css"])))=>i.map(i=>d[i]);
2
- import{A as e,F as t,M as n,Ot as r,_ as i,b as a,d as o,et as s,f as c,m as l,p as u,st as d,t as f,v as p,y as m}from"./_plugin-vue_export-helper-CD0r-vVb.js";import{t as h}from"./WorkspaceKnowledgePanel-D34YxglF.js";import{D as g,t as _}from"./index-DjhQ-RMG.js";import{a as v,i as y,n as b,o as x,r as S}from"./ConversationsView-DsuaLKva.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(()=>_(()=>import(`./LocalVmSettingsPanel-BfXFdMYF.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]))),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([g(`/api/app/capabilities`),g(`/api/app/agents`),g(`/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 n(B),e(()=>{z=!0}),(e,n)=>(t(),l(`div`,C,[a.page===`vm`&&a.isAdmin?(t(),l(`section`,w,[p(d(M))])):a.page===`computers`&&a.isAdmin?(t(),l(`section`,T,[p(v),p(S),p(y)])):a.page===`files`&&a.isAdmin?(t(),l(`section`,E,[p(x)])):a.page===`memory`&&a.isAdmin?(t(),l(`section`,D,[p(b,{section:`memory`,active:!0})])):a.page===`projects`||a.page===`user`?(t(),l(`section`,{key:4,class:`bot-settings-panel__knowledge`,"aria-label":a.page===`projects`?`项目设置`:`用户记忆设置`,"aria-busy":I.value},[L.value?(t(),l(`p`,k,[i(r(L.value)+` `,1),o(`button`,{type:`button`,onClick:B},`重试`)])):I.value&&!R.value?(t(),l(`p`,A,`正在加载…`)):R.value?(t(),c(h,{key:2,embedded:``,"initial-tab":a.page===`user`?`user`:`projects`,agents:P.value,conversations:F.value,onChanged:V,onDirtyChange:n[0]||=e=>N(`dirty-change`,e)},null,8,[`initial-tab`,`agents`,`conversations`])):(t(),l(`p`,j,`当前服务尚不支持项目和用户记忆,请更新服务后重试。`))],8,O)):u(``,!0)]))}}),[[`__scopeId`,`data-v-8bcd3450`]]);export{M as default};
3
- //# sourceMappingURL=BotSettingsPanel-DbCMOfAW.js.map
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LocalVmSettingsPanel-DLbDb5Tq.js","assets/_plugin-vue_export-helper-CD0r-vVb.js","assets/index-Cx1SdzRY.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/index-C-5Gq82f.css","assets/ConversationsView-DzcDJZh3.js","assets/WorkspaceKnowledgePanel-BdbhD3rO.js","assets/WorkspaceKnowledgePanel-CBlUplay.css","assets/StandaloneDialog-Cte829Ai.js","assets/StandaloneDialog-BS6Ta2zL.css","assets/ModelNetworkChoice-Cfyt4Unl.js","assets/ModelNetworkChoice-CvoBde4M.css","assets/WorkspaceRoutinesPanel-VpRoMe1x.js","assets/WorkspaceRoutinesPanel-CbLiNc6R.css","assets/ComputerPanel-Dt73pgTG.js","assets/ComputerPanel-BcXhqQ9K.css","assets/backgroundTaskPresentation-CJMcreMr.js","assets/ConversationsView-EdF5AM1T.css","assets/LocalVmSettingsPanel-UgBP6t1d.css"])))=>i.map(i=>d[i]);
2
+ import{A as e,F as t,M as n,Ot as r,_ as i,b as a,d as o,et as s,f as c,m as l,p as u,st as d,t as f,v as p,y as m}from"./_plugin-vue_export-helper-CD0r-vVb.js";import{t as h}from"./WorkspaceKnowledgePanel-BdbhD3rO.js";import{j as g,t as _}from"./index-Cx1SdzRY.js";import{a as v,i as y,n as b,o as x,r as S}from"./ConversationsView-DzcDJZh3.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(()=>_(()=>import(`./LocalVmSettingsPanel-DLbDb5Tq.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]))),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([g(`/api/app/capabilities`),g(`/api/app/agents`),g(`/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 n(B),e(()=>{z=!0}),(e,n)=>(t(),l(`div`,C,[a.page===`vm`&&a.isAdmin?(t(),l(`section`,w,[p(d(M))])):a.page===`computers`&&a.isAdmin?(t(),l(`section`,T,[p(v),p(S),p(y)])):a.page===`files`&&a.isAdmin?(t(),l(`section`,E,[p(x)])):a.page===`memory`&&a.isAdmin?(t(),l(`section`,D,[p(b,{section:`memory`,active:!0})])):a.page===`projects`||a.page===`user`?(t(),l(`section`,{key:4,class:`bot-settings-panel__knowledge`,"aria-label":a.page===`projects`?`项目设置`:`用户记忆设置`,"aria-busy":I.value},[L.value?(t(),l(`p`,k,[i(r(L.value)+` `,1),o(`button`,{type:`button`,onClick:B},`重试`)])):I.value&&!R.value?(t(),l(`p`,A,`正在加载…`)):R.value?(t(),c(h,{key:2,embedded:``,"initial-tab":a.page===`user`?`user`:`projects`,agents:P.value,conversations:F.value,onChanged:V,onDirtyChange:n[0]||=e=>N(`dirty-change`,e)},null,8,[`initial-tab`,`agents`,`conversations`])):(t(),l(`p`,j,`当前服务尚不支持项目和用户记忆,请更新服务后重试。`))],8,O)):u(``,!0)]))}}),[[`__scopeId`,`data-v-8bcd3450`]]);export{M as default};
3
+ //# sourceMappingURL=BotSettingsPanel-Bkqal3lR.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":";irBAWA,IAAM,EAAuB,YAA2B,OAAO,wGAA4C,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-DbCMOfAW.js"}
1
+ {"version":3,"mappings":";irBAWA,IAAM,EAAuB,YAA2B,OAAO,wGAA4C,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-Bkqal3lR.js"}
@@ -1,2 +1,2 @@
1
- import{A as e,B as t,Et as n,F as r,G as i,H as a,L as o,M as s,Ot 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,p as g,st as ne,t as re,u as _}from"./_plugin-vue_export-helper-CD0r-vVb.js";import{D as v,i as ie,nt as ae,ot as oe,rt as se}from"./index-DjhQ-RMG.js";function ce(e){return!!e?.enabled&&(!!e.available||!!e.installation)}async function le(e,t,n,r){let i=`/api/app/agents/${encodeURIComponent(e)}/managed-browser`,a=t??await v(i,{signal:n});if(n.throwIfAborted(),!ce(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(!ce(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 ue=class{send;failed;id=ie();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()}},de={class:`browser-toolbar`,"aria-label":`机器人浏览器`},y={class:`browser-tabs`,role:`tablist`,"aria-label":`浏览器标签页`},b=[`aria-selected`,`title`,`disabled`,`onClick`],x=[`aria-label`,`disabled`,`onClick`],fe=[`disabled`],S=[`disabled`],C=[`disabled`],w=[`disabled`],T=[`disabled`],E=[`disabled`],pe=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`,de,[p(`div`,y,[(r(!0),h(d,null,o(e.state?.tabs,t=>(r(),h(`div`,{key:t.id,class:n([`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})},c(t.title),9,b),p(`button`,{class:`close-tab`,"aria-label":`关闭标签页 ${t.title}`,disabled:!e.enabled,onClick:e=>l(`action`,{kind:`close-tab`,tabId:t.id})},`×`,8,x)],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,fe)]),p(`form`,{class:`navigation`,onSubmit:oe(te,[`prevent`])},[p(`button`,{type:`button`,"aria-label":`后退`,disabled:!e.enabled,onClick:a[1]||=e=>l(`action`,{kind:`back`})},`←`,8,S),p(`button`,{type:`button`,"aria-label":`前进`,disabled:!e.enabled,onClick:a[2]||=e=>l(`action`,{kind:`forward`})},`→`,8,C),p(`button`,{type:`button`,"aria-label":`重新加载页面`,disabled:!e.enabled,onClick:a[3]||=e=>l(`action`,{kind:`reload`})},`↻`,8,w),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,T),[[se,u.value]]),p(`button`,{type:`submit`,disabled:!e.enabled||!u.value.trim()},`前往`,8,E)],32)]))}}),[[`__scopeId`,`data-v-76ef2743`]]),me=[`value`,`disabled`],he=[`value`,`disabled`],ge=[`disabled`],_e=[`value`],ve={key:2},ye=[`disabled`],be=[`disabled`],xe=[`aria-expanded`],Se=[`aria-pressed`],Ce=[`disabled`],we=[`aria-busy`],Te={role:`status`},Ee=[`value`],De={key:1},Oe={key:2,role:`alert`},ke=[`aria-busy`],Ae={key:0,role:`status`},je=[`disabled`],Me=[`src`,`alt`],Ne={key:1,role:`status`},Pe={key:2,class:`view-label`},Fe={key:3,class:`computer-error`,role:`alert`},Ie={key:4},Le={key:0},Re={key:1},ze={key:2},Be={key:3},Ve={key:4,class:`browser-downloads`},He={key:5},Ue=[`disabled`],We=[`disabled`],Ge={key:0,class:`manual-input`},Ke={class:`key-row`},qe=[`disabled`,`onClick`],Je={class:`key-row`},Ye=[`disabled`],Xe=[`disabled`],Ze=[`disabled`],Qe=[`disabled`],$e=[`disabled`],et=[`disabled`],tt={key:1},nt={key:2},rt=[`aria-busy`],it=[`disabled`],D=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:de}){let y=f,b=de,x=m(y.agents[0]?.id??``),fe=m(),S=m(y.backend),C=m(y.host??(y.backend===`desktop`?`local`:``)),w=m(),T=m({mode:`off`}),E=m(),D=m(),O=m(!1),at=m(!1),k=m(),ot=m(!1),A=m(),j=m(!1),st=m(!1),ct=m(!1),M=m(!0),N,P=_(()=>S.value===`managed-browser`?A.value?.installation:void 0),lt=_(()=>y.agents.find(e=>e.id===x.value)),F=m(``),I=m(!1),ut=m(``),dt=m(``),L=m(!1),ft,pt=``,mt,R=!1,ht=!1,gt=0,z=0,_t={off:`电脑未运行`,idle:`电脑空闲 · 仅查看`,agent:`机器人正在操作`,pausing:`正在等待当前操作结束`,human:`人工控制中`,resuming:`正在交还机器人`,error:`电脑需要检查`},B=_(()=>!!D.value&&D.value.controlId===T.value.controlId),vt=_(()=>S.value===`managed-browser`&&B.value&&T.value.mode===`human`&&!T.value.canResume),V=_(()=>L.value&&!!E.value&&B.value&&T.value.mode===`human`&&E.value?.generation===T.value.generation),H=_(()=>V.value&&!I.value&&!ot.value),U=m({vm:!0,cloud:!0,managedBrowser:!1}),W=_(()=>{let e=U.value,t=w.value,n=[];if(e.cloud&&n.push({key:`cloud`,label:`云虚拟机`+(M.value?` · 正在检查`:t?.cloudConfigured?``:` · 未连接`),backend:`cloud`,disabled:M.value||!t?.cloudConfigured}),e.vm&&n.push({key:`vm`,label:`本地虚拟机`+(M.value?` · 正在检查`:t?.vmEnabled?``:` · 未启用`),backend:`vm`,disabled:M.value||!t?.vmEnabled}),e.managedBrowser){let e=t?.managedBrowser;n.push({key:`managed-browser`,label:`托管浏览器`+(M.value?` · 正在检查`:e?.available?``:ce(e)?` · `+(e?.installation?.status===`failed`?`准备失败`:`待准备`):` · 不可用`),backend:`managed-browser`,disabled:M.value||!ce(e)})}return n}),yt=_(()=>W.value.find(e=>e.backend===S.value&&(e.host??``)===C.value)?.key??``),G=_(()=>W.value.some(e=>e.key===yt.value&&!e.disabled));a([S,C],([e,t])=>{e&&b(`targetChanged`,e,t||void 0)},{immediate:!0});async function bt(){if(!x.value)return;let e=x.value,t=encodeURIComponent(e);M.value=!0;try{let n=await v(`/api/app/settings/host-tools`);if(R||e!==x.value)return;U.value={vm:n.vm,cloud:n.cloud,managedBrowser:n.managedBrowser===!0};let[r,i,a]=await Promise.all([U.value.cloud?v(`/api/app/agents/${t}/cloud-computer`).catch(()=>void 0):Promise.resolve(void 0),U.value.vm?v(`/api/app/agents/${t}/local-vm`).catch(()=>void 0):Promise.resolve(void 0),U.value.managedBrowser?v(`/api/app/agents/${t}/managed-browser`).catch(()=>void 0):Promise.resolve(void 0)]);if(R||e!==x.value)return;w.value={cloudConfigured:!!r?.configured,vmEnabled:!!i?.enabled,managedBrowser:a},S.value===`managed-browser`&&(A.value=a,k.value=a)}finally{e===x.value&&(M.value=!1)}}async function xt(e){let t=W.value.find(t=>t.key===e);if(!(!t||t.disabled||e===yt.value)){if(await $(),D.value)try{await wt(`/giveback`,{...D.value,notes:``})}catch(e){F.value=e instanceof Error?e.message:`请先交还当前电脑`;return}S.value=t.backend,C.value=t.host??``,N?.abort(),clearTimeout(Y),J=void 0,k.value=void 0,A.value=void 0,q.length=0,L.value=!1,z++,ft=void 0,E.value=void 0,D.value=void 0,T.value={mode:`off`},pt=``,F.value=``,await Tt()}}let St=()=>`/api/app/agents/${encodeURIComponent(x.value)}/computer`,Ct=()=>{let e=new URLSearchParams;S.value&&e.set(`backend`,S.value),S.value===`desktop`&&C.value&&e.set(`host`,C.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(ht||I.value||R||!x.value||document.hidden||!G.value&&!(S.value===`managed-browser`&&U.value.managedBrowser))return;ht=!0;let e=++z,t=St(),n=Ct(),r=x.value;try{if(S.value===`managed-browser`){let t=await v(`/api/app/agents/${encodeURIComponent(r)}/managed-browser`).catch(t=>{throw e===z&&!R&&(A.value=void 0,k.value=void 0,w.value&&(w.value.managedBrowser=void 0),T.value={mode:`off`,backend:`managed-browser`}),t});if(e!==z||R)return;if(A.value=t,k.value=t,w.value&&(w.value.managedBrowser=t),!t.available){T.value={mode:`off`,backend:`managed-browser`},L.value=!1,E.value=void 0,F.value=pt;return}}let i=await v(t+n);if(e!==z||R)return;if(T.value=i,L.value=!0,D.value&&i.controlId!==D.value.controlId&&i.mode!==`pausing`&&(D.value=void 0),B.value&&Date.now()-gt>8e3&&(await wt(`/renew`,D.value),gt=Date.now()),i.backend===`browser`){let t=await v(`/api/app/agents/${encodeURIComponent(x.value)}/browser`);if(e!==z||R)return;k.value=t,A.value=void 0}else i.backend!==`managed-browser`&&(k.value=void 0,A.value=void 0);if(i.mode!==`off`&&(![`browser`,`managed-browser`].includes(i.backend??``)||k.value?.open)){let r=await v(t+`/frame`+n);e===z&&!R&&(E.value=r)}else E.value=void 0;F.value=pt}catch(t){if(e===z&&!R){L.value=!1,E.value=void 0,q.length=0,F.value=t instanceof Error?t.message:`无法读取电脑状态`;{let e=Number(t.status);([401,410].includes(e)||e===403&&D.value)&&(D.value=void 0,E.value=void 0,T.value={mode:`off`})}}}finally{ht=!1}}async function K(e){if(I.value)return;z++,I.value=!0,pt=``,F.value=``;let t=``;try{await e()}catch(e){t=e instanceof Error?e.message:`电脑操作失败`}finally{I.value=!1,R||(await Tt(),t&&(pt=t,F.value=t),kt())}}async function Et(){if(!I.value){st.value=!0;try{await K(bt)}finally{st.value=!1}}}function Dt(){return K(async()=>{if(!G.value)throw Error(`所选电脑不可用,请重新选择`);let e=x.value,t=S.value,n=St(),r=Ct(),i=new AbortController;N=i;try{if(t===`managed-browser`&&(j.value=!A.value?.available,await le(e,A.value,i.signal,n=>{!R&&e===x.value&&t===S.value&&(A.value=n,k.value=n,w.value&&(w.value.managedBrowser=n))})),i.signal.throwIfAborted(),R||e!==x.value||t!==S.value)return;j.value=!1,ft??=ie();let a=await v(n+`/take`+r,{method:`POST`,body:{requestId:ft}}),o={controlId:a.controlId,token:a.token};if(R||i.signal.aborted||e!==x.value||t!==S.value){await v(n+`/giveback`+r,{method:`POST`,body:{...o,notes:``}});return}D.value=o,T.value=a,gt=0}catch(e){if(!i.signal.aborted)throw e}finally{N===i&&(N=void 0,j.value=!1)}})}let q=[],Ot=!1,J,Y;function X(e){if(!V.value||R||ot.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{F.value=`输入过快,请稍后再试`;return}kt()}async function kt(){if(Ot||I.value||!q.length||R)return;if(!V.value||!E.value||!D.value){q.length=0;return}Ot=!0;let e=q.shift(),t=E.value,n=D.value;try{await K(async()=>{await wt(`/input`,{...n,requestId:ie(),generation:t.generation,frameId:t.id,action:e})}),F.value&&(q.length=0)}finally{Ot=!1,q.length&&setTimeout(()=>void kt(),0)}}function At(e){if(!H.value||!E.value||!D.value)return;let t=E.value,n=D.value;K(async()=>{S.value===`managed-browser`?await v(`/api/app/agents/${encodeURIComponent(x.value)}/managed-browser/action`,{method:`POST`,body:{...n,requestId:ie(),generation:t.generation,action:e}}):await wt(`/browser`,{...n,requestId:ie(),generation:t.generation,frameId:t.id,action:e})})}function jt(e,t=!1){let n=e.currentTarget.getBoundingClientRect(),r=E.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(!H.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=D.value,i=E.value.generation,a=E.value;clearTimeout(Y),J=void 0,F.value=``,ot.value=!0;let o=()=>!R&&St()===t&&Ct()===n&&D.value?.controlId===r.controlId&&T.value.generation===i,s=new ue(e,async e=>{if(e.phase!==`cancel`&&(!o()||!V.value))throw Error(`控制权已变化,请重新接管`);if(await v(t+`/input`+n,{method:`POST`,timeoutMs:5e3,body:{...r,requestId:ie(),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,E.value=s},e=>{o()&&(F.value=e instanceof Error?e.message:`拖动失败,请重新按下鼠标`)});Q=s,s.done.then(async()=>{if(Q===s){Q=void 0,ot.value=!1;let e=F.value;await Tt(),o()&&e&&(F.value=e)}})}function Ft(e){let t=Z;if(!t||e.pointerId!==t.pointerId||!V.value||S.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(!V.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(V,e=>{e||$()});function Bt(e){V.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(!V.value)return;if(e.preventDefault(),e.stopPropagation(),e.key===`Escape`){$(),e.currentTarget.blur();return}let t=[e.ctrlKey||S.value===`managed-browser`&&e.metaKey?`ctrl`:``,e.altKey?`alt`:``,e.shiftKey?`shift`:``,e.metaKey&&S.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(!V.value||!E.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 $(),D.value&&(await wt(`/giveback`,{...D.value,notes:dt.value}),D.value=void 0,ft=void 0,dt.value=``)}async function Wt(){if(I.value||!vt.value||!D.value)return;await $();let e=x.value,t=D.value;ct.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});R||x.value!==e||S.value!==`managed-browser`||D.value!==t||(T.value=n,D.value=void 0,ft=void 0,dt.value=``,E.value=void 0,L.value=!1,O.value=!1,b(`changed`))})}finally{ct.value=!1}}async function Gt(){if(j.value){N?.abort(),R=!0,fe.value?.close?.(),b(`close`);return}I.value||(await K(Ut),D.value||(R=!0,!y.embedded&&!y.standalone&&fe.value?.close(),b(`close`)))}async function Kt(){try{document.fullscreenElement?await document.exitFullscreen():await fe.value?.requestFullscreen()}catch{F.value=`无法进入全屏,请使用窗口最大化`}}async function qt(){await Tt(),R||(mt=setTimeout(()=>void qt(),1200))}return a(x,()=>{$(),N?.abort(),clearTimeout(Y),J=void 0,k.value=void 0,A.value=void 0,q.length=0,L.value=!1,z++,ft=void 0,E.value=void 0,D.value=void 0,T.value={mode:`off`},pt=``,F.value=``,S.value=y.backend,C.value=y.host??(y.backend===`desktop`?`local`:``),w.value=void 0,bt().then(async()=>{if(!S.value){let e=W.value.find(e=>!e.disabled);e&&await xt(e.key)}await Tt()}).catch(e=>{F.value=e instanceof Error?e.message:`无法读取电脑列表`})}),s(async()=>{window.addEventListener(`blur`,Rt),document.addEventListener(`visibilitychange`,zt),!y.embedded&&!y.standalone&&fe.value?.showModal();try{if(await bt(),R)return;if(!S.value){let e=W.value.find(e=>!e.disabled);e&&await xt(e.key)}if(!G.value&&S.value!==`managed-browser`)throw Error(`所选电脑不可用,请重新选择;未打开其他电脑`);y.autoTake&&!R&&G.value&&await Dt()}catch(e){F.value=e instanceof Error?e.message:`无法读取电脑列表`}R||qt()}),e(()=>{$(),window.removeEventListener(`blur`,Rt),document.removeEventListener(`visibilitychange`,zt),N?.abort(),D.value&&wt(`/giveback`,{...D.value,notes:dt.value}).catch(()=>{}),q.length=0,J=void 0,clearTimeout(Y),R=!0,z++,clearTimeout(mt)}),re({take:Dt,close:Gt,releaseControl:async()=>{if(j.value){N?.abort();return}if(I.value)throw Error(`请等待当前操作完成`);if(await K(Ut),D.value)throw Error(F.value||`请先交还控制权`)},hasControl:()=>!!D.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:fe,class:n([`computer-panel`,{embedded:f.embedded,standalone:f.standalone}]),"aria-label":W.value.find(e=>e.key===yt.value)?.label||`电脑桌面`,onCancel:oe(Gt,[`prevent`])},{default:l(()=>[p(`header`,null,[p(`div`,null,[p(`strong`,null,c(S.value===`managed-browser`?`托管浏览器`:S.value===`cloud`?`云虚拟机`:`本地虚拟机`),1),p(`small`,null,c(j.value?`正在准备浏览器`:_t[T.value.mode]),1)]),W.value.length>1?(r(),h(`select`,{key:0,value:yt.value,"aria-label":`切换电脑环境`,disabled:!!D.value||I.value,onChange:a[0]||=e=>xt(e.target.value)},[(r(!0),h(d,null,o(W.value,e=>(r(),h(`option`,{key:e.key,value:e.key,disabled:e.disabled},c(e.label),9,he))),128))],40,me)):g(``,!0),f.agents.length>1?i((r(),h(`select`,{key:1,"onUpdate:modelValue":a[1]||=e=>x.value=e,"aria-label":`选择电脑`,disabled:!!D.value||I.value},[(r(!0),h(d,null,o(f.agents,e=>(r(),h(`option`,{key:e.id,value:e.id},c(e.name),9,_e))),128))],8,ge)),[[ae,x.value]]):f.embedded?g(``,!0):(r(),h(`span`,ve,c(f.agents[0]?.name),1)),f.embedded&&!D.value?(r(),h(`button`,{key:3,disabled:I.value||T.value.mode===`human`,onClick:a[2]||=e=>b(`controlRequest`)},`接管电脑`,8,ye)):g(``,!0),f.embedded&&B.value?(r(),h(`button`,{key:4,onClick:a[3]||=e=>O.value=!O.value},`键盘与操作`)):g(``,!0),f.embedded&&B.value?(r(),h(`button`,{key:5,disabled:I.value||T.value.mode!==`human`,onClick:a[4]||=e=>K(Ut)},`交还`,8,be)):g(``,!0),f.embedded?g(``,!0):(r(),h(d,{key:6},[B.value?(r(),h(`button`,{key:0,type:`button`,"aria-expanded":O.value,onClick:a[5]||=e=>O.value=!O.value},`键盘与操作`,8,xe)):g(``,!0),p(`button`,{type:`button`,"aria-pressed":at.value,onClick:a[6]||=e=>at.value=!at.value},c(at.value?`适应窗口`:`原始大小`),9,Se),p(`button`,{type:`button`,onClick:Kt},`全屏`)],64)),f.embedded?g(``,!0):(r(),h(`button`,{key:7,class:`return-control`,type:`button`,disabled:I.value&&!j.value,onClick:Gt},c(S.value===`managed-browser`?D.value?`交还并收起`:`收起窗口`:D.value?`交还并关闭`:`关闭`),9,Ce))]),T.value.backend===`browser`||T.value.backend===`managed-browser`?(r(),ee(pe,{key:0,state:k.value,enabled:H.value,onAction:At},null,8,[`state`,`enabled`])):g(``,!0),P.value&&P.value.status!==`ready`?(r(),h(`section`,{key:1,class:`browser-installation`,"aria-busy":j.value},[p(`p`,Te,c(P.value.message),1),P.value.status===`installing`||P.value.status===`checking`?(r(),h(`progress`,{key:0,value:P.value.progress,max:`100`,"aria-label":`浏览器准备进度`},null,8,Ee)):g(``,!0),j.value?(r(),h(`small`,De,`关闭窗口后仍会继续准备。`)):g(``,!0),P.value.error?(r(),h(`p`,Oe,c(P.value.error),1)):g(``,!0)],8,we)):g(``,!0),!M.value&&S.value===`managed-browser`&&!A.value?.available?(r(),h(`section`,{key:2,class:`browser-availability`,"aria-busy":st.value},[P.value?g(``,!0):(r(),h(`p`,Ae,c(A.value?.reason||(U.value.managedBrowser?`执行节点暂时不可用,请检查连接后重新检测。`:`托管浏览器尚未开放,请在「设置 → 环境与权限 → 运行环境」中开启。`)),1)),p(`button`,{type:`button`,disabled:I.value,onClick:Et},c(st.value?`正在检测…`:`重新检测`),9,je)],8,ke)):g(``,!0),p(`div`,{class:n([`computer-screen`,{controlling:V.value,"actual-size":at.value}])},[E.value?(r(),h(`img`,{key:0,src:`data:image/png;base64,${E.value.data}`,alt:(W.value.find(e=>e.key===yt.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:oe(Ht,[`prevent`])},null,40,Me)):(r(),h(`p`,Ne,c(M.value?`正在检查电脑环境…`:j.value?`准备完成后会自动接管,无需再次点击。`:T.value.mode===`off`?S.value===`managed-browser`?`浏览器尚未打开。接管后可打开网页。`:`打开电脑后可查看桌面。`:`正在读取电脑画面…`),1)),E.value&&(!B.value||E.value.generation!==T.value.generation)?(r(),h(`span`,Pe,c(B.value?`正在同步画面`:T.value.mode===`off`?`上次画面`:`仅查看`),1)):g(``,!0)],2),F.value||T.value.error?(r(),h(`p`,Fe,c(F.value||T.value.error),1)):g(``,!0),O.value||!f.embedded&&!D.value?(r(),h(`footer`,Ie,[T.value.backend===`grok`?(r(),h(`p`,Le,`多个机器人共享同一台 Grok Bot 云端电脑、工作文件与浏览器资料。`)):T.value.backend===`local`?(r(),h(`p`,Re,`当前显示`+c(T.value.hostName||`所选电脑`)+`的桌面,点击、输入、按键和滚动都会发送到这台电脑。`,1)):g(``,!0),S.value===`vm`&&lt.value?.computerEnvironmentId?(r(),h(`p`,ze,`共享电脑:`+c(lt.value.computerEnvironmentName)+`。成员共用工作文件和浏览器资料,可同时执行命令与文件操作,桌面操作交替进行;人工接管时机器人暂停等待。`,1)):g(``,!0),T.value.backend===`managed-browser`?(r(),h(`p`,Be,`当前是托管浏览器,与电脑桌面和虚拟机分别管理;网页操作无需启动虚拟机。`)):g(``,!0),A.value?.downloads.length?(r(),h(`details`,Ve,[p(`summary`,null,`浏览器下载(`+c(A.value.downloads.length)+`)`,1),p(`ul`,null,[(r(!0),h(d,null,o(A.value.downloads,e=>(r(),h(`li`,{key:e.id},[p(`span`,null,c(e.name),1),p(`small`,null,c((e.size/1024).toFixed(1))+` KiB`,1)]))),128))])])):g(``,!0),D.value?g(``,!0):(r(),h(`p`,He,`查看不会输入任何内容。接管后机器人会暂停,已有操作结束后才允许人工操作。`)),!D.value&&!G.value&&S.value!==`managed-browser`?(r(),h(`button`,{key:6,type:`button`,disabled:I.value,onClick:a[8]||=e=>K(bt)},`重新检查连接`,8,Ue)):g(``,!0),!D.value&&T.value.mode!==`human`?(r(),h(`button`,{key:7,type:`button`,disabled:I.value||!G.value,onClick:a[9]||=e=>f.embedded?b(`controlRequest`):Dt()},c(j.value?`正在准备浏览器…`:P.value?.status===`failed`?`重试并接管浏览器`:T.value.mode===`off`?`打开并控制`:`接管电脑`),9,We)):g(``,!0),B.value?(r(),h(d,{key:8},[O.value?(r(),h(`section`,Ge,[p(`div`,Ke,[(r(),h(d,null,o([`Return`,`Tab`,`Escape`,`BackSpace`,`Up`,`Down`,`Left`,`Right`],e=>p(`button`,{key:e,type:`button`,disabled:!H.value,onClick:t=>X({kind:`key`,key:e})},c({Return:`回车`,Escape:`Esc`,BackSpace:`退格`,Up:`↑`,Down:`↓`,Left:`←`,Right:`→`}[e]||e),9,qe)),64))]),p(`div`,Je,[p(`button`,{disabled:!H.value,onClick:a[10]||=e=>X({kind:`key`,key:`a`,modifiers:[T.value.backend===`local`||T.value.backend===`browser`?`super`:`ctrl`]})},`全选`,8,Ye),p(`button`,{disabled:!H.value,onClick:a[11]||=e=>X({kind:`key`,key:`c`,modifiers:[T.value.backend===`local`||T.value.backend===`browser`?`super`:`ctrl`]})},`复制`,8,Xe),p(`button`,{disabled:!H.value,onClick:a[12]||=e=>X({kind:`key`,key:`v`,modifiers:[T.value.backend===`local`||T.value.backend===`browser`?`super`:`ctrl`]})},`粘贴`,8,Ze)]),p(`label`,null,[a[17]||=u(`输入到电脑`,-1),i(p(`textarea`,{"onUpdate:modelValue":a[13]||=e=>ut.value=e,rows:`2`,maxlength:`16000`,placeholder:`输入文字后点击发送`,disabled:!H.value},null,8,Qe),[[se,ut.value]])]),p(`button`,{type:`button`,disabled:!H.value||!ut.value,onClick:a[14]||=e=>{X({kind:`text`,text:ut.value}),ut.value=``}},`输入文字`,8,$e)])):g(``,!0),p(`label`,null,[a[18]||=u(`交还说明`,-1),i(p(`textarea`,{"onUpdate:modelValue":a[15]||=e=>dt.value=e,rows:`2`,maxlength:`4000`,placeholder:`告诉机器人你完成了什么,以及接下来需要做什么`},null,512),[[se,dt.value]])]),p(`button`,{type:`button`,disabled:I.value||T.value.mode!==`human`,onClick:a[16]||=e=>K(Ut)},c(T.value.canResume?`交还机器人并继续`:S.value===`managed-browser`?`结束接管`:`结束控制`),9,et),S.value===`managed-browser`?(r(),h(`small`,tt,c(A.value?.supportsRetention===!0?`交还或收起只会释放操作权,页面会保留;长时间空闲后可能回收。`:A.value?.supportsRetention===!1?`此节点需更新后才能跨任务保留页面;任务结束后浏览器会关闭。`:`交还或收起会结束当前接管。`),1)):(r(),h(`small`,nt,`控制只属于当前页面。页面断开后控制权会到期,任务不会自行恢复。`))],64)):g(``,!0)])):g(``,!0),vt.value?(r(),h(`section`,{key:5,class:`browser-session-actions`,"aria-busy":ct.value},[p(`button`,{type:`button`,disabled:I.value,onClick:Wt},c(ct.value?`正在关闭浏览器…`:`关闭浏览器`),9,it),a[19]||=p(`small`,null,`结束当前浏览器会话并关闭标签页。`,-1)],8,rt)):g(``,!0)]),_:1},40,[`class`,`aria-label`]))],8,[`disabled`]))}}),[[`__scopeId`,`data-v-a7647a88`]]);export{ce as n,D as t};
2
- //# sourceMappingURL=ComputerPanel-CI-jDmC3.js.map
1
+ import{A as e,B as t,Et as n,F as r,G as i,H as a,L as o,M as s,Ot 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,p as g,st as ne,t as re,u as _}from"./_plugin-vue_export-helper-CD0r-vVb.js";import{at as ie,i as ae,j as v,lt as oe,ot as se}from"./index-Cx1SdzRY.js";function ce(e){return!!e?.enabled&&(!!e.available||!!e.installation)}async function le(e,t,n,r){let i=`/api/app/agents/${encodeURIComponent(e)}/managed-browser`,a=t??await v(i,{signal:n});if(n.throwIfAborted(),!ce(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(!ce(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 ue=class{send;failed;id=ae();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()}},de={class:`browser-toolbar`,"aria-label":`机器人浏览器`},y={class:`browser-tabs`,role:`tablist`,"aria-label":`浏览器标签页`},b=[`aria-selected`,`title`,`disabled`,`onClick`],x=[`aria-label`,`disabled`,`onClick`],fe=[`disabled`],S=[`disabled`],C=[`disabled`],w=[`disabled`],T=[`disabled`],E=[`disabled`],pe=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`,de,[p(`div`,y,[(r(!0),h(d,null,o(e.state?.tabs,t=>(r(),h(`div`,{key:t.id,class:n([`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})},c(t.title),9,b),p(`button`,{class:`close-tab`,"aria-label":`关闭标签页 ${t.title}`,disabled:!e.enabled,onClick:e=>l(`action`,{kind:`close-tab`,tabId:t.id})},`×`,8,x)],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,fe)]),p(`form`,{class:`navigation`,onSubmit:oe(te,[`prevent`])},[p(`button`,{type:`button`,"aria-label":`后退`,disabled:!e.enabled,onClick:a[1]||=e=>l(`action`,{kind:`back`})},`←`,8,S),p(`button`,{type:`button`,"aria-label":`前进`,disabled:!e.enabled,onClick:a[2]||=e=>l(`action`,{kind:`forward`})},`→`,8,C),p(`button`,{type:`button`,"aria-label":`重新加载页面`,disabled:!e.enabled,onClick:a[3]||=e=>l(`action`,{kind:`reload`})},`↻`,8,w),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,T),[[se,u.value]]),p(`button`,{type:`submit`,disabled:!e.enabled||!u.value.trim()},`前往`,8,E)],32)]))}}),[[`__scopeId`,`data-v-76ef2743`]]),me=[`value`,`disabled`],he=[`value`,`disabled`],ge=[`disabled`],_e=[`value`],ve={key:2},ye=[`disabled`],be=[`disabled`],xe=[`aria-expanded`],Se=[`aria-pressed`],Ce=[`disabled`],we=[`aria-busy`],Te={role:`status`},Ee=[`value`],De={key:1},Oe={key:2,role:`alert`},ke=[`aria-busy`],Ae={key:0,role:`status`},je=[`disabled`],Me=[`src`,`alt`],Ne={key:1,role:`status`},Pe={key:2,class:`view-label`},Fe={key:3,class:`computer-error`,role:`alert`},Ie={key:4},Le={key:0},Re={key:1},ze={key:2},Be={key:3},Ve={key:4,class:`browser-downloads`},He={key:5},Ue=[`disabled`],We=[`disabled`],Ge={key:0,class:`manual-input`},Ke={class:`key-row`},qe=[`disabled`,`onClick`],Je={class:`key-row`},Ye=[`disabled`],Xe=[`disabled`],Ze=[`disabled`],Qe=[`disabled`],$e=[`disabled`],et=[`disabled`],tt={key:1},nt={key:2},rt=[`aria-busy`],it=[`disabled`],D=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:de}){let y=f,b=de,x=m(y.agents[0]?.id??``),fe=m(),S=m(y.backend),C=m(y.host??(y.backend===`desktop`?`local`:``)),w=m(),T=m({mode:`off`}),E=m(),D=m(),O=m(!1),at=m(!1),k=m(),ot=m(!1),A=m(),j=m(!1),st=m(!1),ct=m(!1),M=m(!0),N,P=_(()=>S.value===`managed-browser`?A.value?.installation:void 0),lt=_(()=>y.agents.find(e=>e.id===x.value)),F=m(``),I=m(!1),ut=m(``),dt=m(``),L=m(!1),ft,pt=``,mt,R=!1,ht=!1,gt=0,z=0,_t={off:`电脑未运行`,idle:`电脑空闲 · 仅查看`,agent:`机器人正在操作`,pausing:`正在等待当前操作结束`,human:`人工控制中`,resuming:`正在交还机器人`,error:`电脑需要检查`},B=_(()=>!!D.value&&D.value.controlId===T.value.controlId),vt=_(()=>S.value===`managed-browser`&&B.value&&T.value.mode===`human`&&!T.value.canResume),V=_(()=>L.value&&!!E.value&&B.value&&T.value.mode===`human`&&E.value?.generation===T.value.generation),H=_(()=>V.value&&!I.value&&!ot.value),U=m({vm:!0,cloud:!0,managedBrowser:!1}),W=_(()=>{let e=U.value,t=w.value,n=[];if(e.cloud&&n.push({key:`cloud`,label:`云虚拟机`+(M.value?` · 正在检查`:t?.cloudConfigured?``:` · 未连接`),backend:`cloud`,disabled:M.value||!t?.cloudConfigured}),e.vm&&n.push({key:`vm`,label:`本地虚拟机`+(M.value?` · 正在检查`:t?.vmEnabled?``:` · 未启用`),backend:`vm`,disabled:M.value||!t?.vmEnabled}),e.managedBrowser){let e=t?.managedBrowser;n.push({key:`managed-browser`,label:`托管浏览器`+(M.value?` · 正在检查`:e?.available?``:ce(e)?` · `+(e?.installation?.status===`failed`?`准备失败`:`待准备`):` · 不可用`),backend:`managed-browser`,disabled:M.value||!ce(e)})}return n}),yt=_(()=>W.value.find(e=>e.backend===S.value&&(e.host??``)===C.value)?.key??``),G=_(()=>W.value.some(e=>e.key===yt.value&&!e.disabled));a([S,C],([e,t])=>{e&&b(`targetChanged`,e,t||void 0)},{immediate:!0});async function bt(){if(!x.value)return;let e=x.value,t=encodeURIComponent(e);M.value=!0;try{let n=await v(`/api/app/settings/host-tools`);if(R||e!==x.value)return;U.value={vm:n.vm,cloud:n.cloud,managedBrowser:n.managedBrowser===!0};let[r,i,a]=await Promise.all([U.value.cloud?v(`/api/app/agents/${t}/cloud-computer`).catch(()=>void 0):Promise.resolve(void 0),U.value.vm?v(`/api/app/agents/${t}/local-vm`).catch(()=>void 0):Promise.resolve(void 0),U.value.managedBrowser?v(`/api/app/agents/${t}/managed-browser`).catch(()=>void 0):Promise.resolve(void 0)]);if(R||e!==x.value)return;w.value={cloudConfigured:!!r?.configured,vmEnabled:!!i?.enabled,managedBrowser:a},S.value===`managed-browser`&&(A.value=a,k.value=a)}finally{e===x.value&&(M.value=!1)}}async function xt(e){let t=W.value.find(t=>t.key===e);if(!(!t||t.disabled||e===yt.value)){if(await $(),D.value)try{await wt(`/giveback`,{...D.value,notes:``})}catch(e){F.value=e instanceof Error?e.message:`请先交还当前电脑`;return}S.value=t.backend,C.value=t.host??``,N?.abort(),clearTimeout(Y),J=void 0,k.value=void 0,A.value=void 0,q.length=0,L.value=!1,z++,ft=void 0,E.value=void 0,D.value=void 0,T.value={mode:`off`},pt=``,F.value=``,await Tt()}}let St=()=>`/api/app/agents/${encodeURIComponent(x.value)}/computer`,Ct=()=>{let e=new URLSearchParams;S.value&&e.set(`backend`,S.value),S.value===`desktop`&&C.value&&e.set(`host`,C.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(ht||I.value||R||!x.value||document.hidden||!G.value&&!(S.value===`managed-browser`&&U.value.managedBrowser))return;ht=!0;let e=++z,t=St(),n=Ct(),r=x.value;try{if(S.value===`managed-browser`){let t=await v(`/api/app/agents/${encodeURIComponent(r)}/managed-browser`).catch(t=>{throw e===z&&!R&&(A.value=void 0,k.value=void 0,w.value&&(w.value.managedBrowser=void 0),T.value={mode:`off`,backend:`managed-browser`}),t});if(e!==z||R)return;if(A.value=t,k.value=t,w.value&&(w.value.managedBrowser=t),!t.available){T.value={mode:`off`,backend:`managed-browser`},L.value=!1,E.value=void 0,F.value=pt;return}}let i=await v(t+n);if(e!==z||R)return;if(T.value=i,L.value=!0,D.value&&i.controlId!==D.value.controlId&&i.mode!==`pausing`&&(D.value=void 0),B.value&&Date.now()-gt>8e3&&(await wt(`/renew`,D.value),gt=Date.now()),i.backend===`browser`){let t=await v(`/api/app/agents/${encodeURIComponent(x.value)}/browser`);if(e!==z||R)return;k.value=t,A.value=void 0}else i.backend!==`managed-browser`&&(k.value=void 0,A.value=void 0);if(i.mode!==`off`&&(![`browser`,`managed-browser`].includes(i.backend??``)||k.value?.open)){let r=await v(t+`/frame`+n);e===z&&!R&&(E.value=r)}else E.value=void 0;F.value=pt}catch(t){if(e===z&&!R){L.value=!1,E.value=void 0,q.length=0,F.value=t instanceof Error?t.message:`无法读取电脑状态`;{let e=Number(t.status);([401,410].includes(e)||e===403&&D.value)&&(D.value=void 0,E.value=void 0,T.value={mode:`off`})}}}finally{ht=!1}}async function K(e){if(I.value)return;z++,I.value=!0,pt=``,F.value=``;let t=``;try{await e()}catch(e){t=e instanceof Error?e.message:`电脑操作失败`}finally{I.value=!1,R||(await Tt(),t&&(pt=t,F.value=t),kt())}}async function Et(){if(!I.value){st.value=!0;try{await K(bt)}finally{st.value=!1}}}function Dt(){return K(async()=>{if(!G.value)throw Error(`所选电脑不可用,请重新选择`);let e=x.value,t=S.value,n=St(),r=Ct(),i=new AbortController;N=i;try{if(t===`managed-browser`&&(j.value=!A.value?.available,await le(e,A.value,i.signal,n=>{!R&&e===x.value&&t===S.value&&(A.value=n,k.value=n,w.value&&(w.value.managedBrowser=n))})),i.signal.throwIfAborted(),R||e!==x.value||t!==S.value)return;j.value=!1,ft??=ae();let a=await v(n+`/take`+r,{method:`POST`,body:{requestId:ft}}),o={controlId:a.controlId,token:a.token};if(R||i.signal.aborted||e!==x.value||t!==S.value){await v(n+`/giveback`+r,{method:`POST`,body:{...o,notes:``}});return}D.value=o,T.value=a,gt=0}catch(e){if(!i.signal.aborted)throw e}finally{N===i&&(N=void 0,j.value=!1)}})}let q=[],Ot=!1,J,Y;function X(e){if(!V.value||R||ot.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{F.value=`输入过快,请稍后再试`;return}kt()}async function kt(){if(Ot||I.value||!q.length||R)return;if(!V.value||!E.value||!D.value){q.length=0;return}Ot=!0;let e=q.shift(),t=E.value,n=D.value;try{await K(async()=>{await wt(`/input`,{...n,requestId:ae(),generation:t.generation,frameId:t.id,action:e})}),F.value&&(q.length=0)}finally{Ot=!1,q.length&&setTimeout(()=>void kt(),0)}}function At(e){if(!H.value||!E.value||!D.value)return;let t=E.value,n=D.value;K(async()=>{S.value===`managed-browser`?await v(`/api/app/agents/${encodeURIComponent(x.value)}/managed-browser/action`,{method:`POST`,body:{...n,requestId:ae(),generation:t.generation,action:e}}):await wt(`/browser`,{...n,requestId:ae(),generation:t.generation,frameId:t.id,action:e})})}function jt(e,t=!1){let n=e.currentTarget.getBoundingClientRect(),r=E.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(!H.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=D.value,i=E.value.generation,a=E.value;clearTimeout(Y),J=void 0,F.value=``,ot.value=!0;let o=()=>!R&&St()===t&&Ct()===n&&D.value?.controlId===r.controlId&&T.value.generation===i,s=new ue(e,async e=>{if(e.phase!==`cancel`&&(!o()||!V.value))throw Error(`控制权已变化,请重新接管`);if(await v(t+`/input`+n,{method:`POST`,timeoutMs:5e3,body:{...r,requestId:ae(),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,E.value=s},e=>{o()&&(F.value=e instanceof Error?e.message:`拖动失败,请重新按下鼠标`)});Q=s,s.done.then(async()=>{if(Q===s){Q=void 0,ot.value=!1;let e=F.value;await Tt(),o()&&e&&(F.value=e)}})}function Ft(e){let t=Z;if(!t||e.pointerId!==t.pointerId||!V.value||S.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(!V.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(V,e=>{e||$()});function Bt(e){V.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(!V.value)return;if(e.preventDefault(),e.stopPropagation(),e.key===`Escape`){$(),e.currentTarget.blur();return}let t=[e.ctrlKey||S.value===`managed-browser`&&e.metaKey?`ctrl`:``,e.altKey?`alt`:``,e.shiftKey?`shift`:``,e.metaKey&&S.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(!V.value||!E.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 $(),D.value&&(await wt(`/giveback`,{...D.value,notes:dt.value}),D.value=void 0,ft=void 0,dt.value=``)}async function Wt(){if(I.value||!vt.value||!D.value)return;await $();let e=x.value,t=D.value;ct.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});R||x.value!==e||S.value!==`managed-browser`||D.value!==t||(T.value=n,D.value=void 0,ft=void 0,dt.value=``,E.value=void 0,L.value=!1,O.value=!1,b(`changed`))})}finally{ct.value=!1}}async function Gt(){if(j.value){N?.abort(),R=!0,fe.value?.close?.(),b(`close`);return}I.value||(await K(Ut),D.value||(R=!0,!y.embedded&&!y.standalone&&fe.value?.close(),b(`close`)))}async function Kt(){try{document.fullscreenElement?await document.exitFullscreen():await fe.value?.requestFullscreen()}catch{F.value=`无法进入全屏,请使用窗口最大化`}}async function qt(){await Tt(),R||(mt=setTimeout(()=>void qt(),1200))}return a(x,()=>{$(),N?.abort(),clearTimeout(Y),J=void 0,k.value=void 0,A.value=void 0,q.length=0,L.value=!1,z++,ft=void 0,E.value=void 0,D.value=void 0,T.value={mode:`off`},pt=``,F.value=``,S.value=y.backend,C.value=y.host??(y.backend===`desktop`?`local`:``),w.value=void 0,bt().then(async()=>{if(!S.value){let e=W.value.find(e=>!e.disabled);e&&await xt(e.key)}await Tt()}).catch(e=>{F.value=e instanceof Error?e.message:`无法读取电脑列表`})}),s(async()=>{window.addEventListener(`blur`,Rt),document.addEventListener(`visibilitychange`,zt),!y.embedded&&!y.standalone&&fe.value?.showModal();try{if(await bt(),R)return;if(!S.value){let e=W.value.find(e=>!e.disabled);e&&await xt(e.key)}if(!G.value&&S.value!==`managed-browser`)throw Error(`所选电脑不可用,请重新选择;未打开其他电脑`);y.autoTake&&!R&&G.value&&await Dt()}catch(e){F.value=e instanceof Error?e.message:`无法读取电脑列表`}R||qt()}),e(()=>{$(),window.removeEventListener(`blur`,Rt),document.removeEventListener(`visibilitychange`,zt),N?.abort(),D.value&&wt(`/giveback`,{...D.value,notes:dt.value}).catch(()=>{}),q.length=0,J=void 0,clearTimeout(Y),R=!0,z++,clearTimeout(mt)}),re({take:Dt,close:Gt,releaseControl:async()=>{if(j.value){N?.abort();return}if(I.value)throw Error(`请等待当前操作完成`);if(await K(Ut),D.value)throw Error(F.value||`请先交还控制权`)},hasControl:()=>!!D.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:fe,class:n([`computer-panel`,{embedded:f.embedded,standalone:f.standalone}]),"aria-label":W.value.find(e=>e.key===yt.value)?.label||`电脑桌面`,onCancel:oe(Gt,[`prevent`])},{default:l(()=>[p(`header`,null,[p(`div`,null,[p(`strong`,null,c(S.value===`managed-browser`?`托管浏览器`:S.value===`cloud`?`云虚拟机`:`本地虚拟机`),1),p(`small`,null,c(j.value?`正在准备浏览器`:_t[T.value.mode]),1)]),W.value.length>1?(r(),h(`select`,{key:0,value:yt.value,"aria-label":`切换电脑环境`,disabled:!!D.value||I.value,onChange:a[0]||=e=>xt(e.target.value)},[(r(!0),h(d,null,o(W.value,e=>(r(),h(`option`,{key:e.key,value:e.key,disabled:e.disabled},c(e.label),9,he))),128))],40,me)):g(``,!0),f.agents.length>1?i((r(),h(`select`,{key:1,"onUpdate:modelValue":a[1]||=e=>x.value=e,"aria-label":`选择电脑`,disabled:!!D.value||I.value},[(r(!0),h(d,null,o(f.agents,e=>(r(),h(`option`,{key:e.id,value:e.id},c(e.name),9,_e))),128))],8,ge)),[[ie,x.value]]):f.embedded?g(``,!0):(r(),h(`span`,ve,c(f.agents[0]?.name),1)),f.embedded&&!D.value?(r(),h(`button`,{key:3,disabled:I.value||T.value.mode===`human`,onClick:a[2]||=e=>b(`controlRequest`)},`接管电脑`,8,ye)):g(``,!0),f.embedded&&B.value?(r(),h(`button`,{key:4,onClick:a[3]||=e=>O.value=!O.value},`键盘与操作`)):g(``,!0),f.embedded&&B.value?(r(),h(`button`,{key:5,disabled:I.value||T.value.mode!==`human`,onClick:a[4]||=e=>K(Ut)},`交还`,8,be)):g(``,!0),f.embedded?g(``,!0):(r(),h(d,{key:6},[B.value?(r(),h(`button`,{key:0,type:`button`,"aria-expanded":O.value,onClick:a[5]||=e=>O.value=!O.value},`键盘与操作`,8,xe)):g(``,!0),p(`button`,{type:`button`,"aria-pressed":at.value,onClick:a[6]||=e=>at.value=!at.value},c(at.value?`适应窗口`:`原始大小`),9,Se),p(`button`,{type:`button`,onClick:Kt},`全屏`)],64)),f.embedded?g(``,!0):(r(),h(`button`,{key:7,class:`return-control`,type:`button`,disabled:I.value&&!j.value,onClick:Gt},c(S.value===`managed-browser`?D.value?`交还并收起`:`收起窗口`:D.value?`交还并关闭`:`关闭`),9,Ce))]),T.value.backend===`browser`||T.value.backend===`managed-browser`?(r(),ee(pe,{key:0,state:k.value,enabled:H.value,onAction:At},null,8,[`state`,`enabled`])):g(``,!0),P.value&&P.value.status!==`ready`?(r(),h(`section`,{key:1,class:`browser-installation`,"aria-busy":j.value},[p(`p`,Te,c(P.value.message),1),P.value.status===`installing`||P.value.status===`checking`?(r(),h(`progress`,{key:0,value:P.value.progress,max:`100`,"aria-label":`浏览器准备进度`},null,8,Ee)):g(``,!0),j.value?(r(),h(`small`,De,`关闭窗口后仍会继续准备。`)):g(``,!0),P.value.error?(r(),h(`p`,Oe,c(P.value.error),1)):g(``,!0)],8,we)):g(``,!0),!M.value&&S.value===`managed-browser`&&!A.value?.available?(r(),h(`section`,{key:2,class:`browser-availability`,"aria-busy":st.value},[P.value?g(``,!0):(r(),h(`p`,Ae,c(A.value?.reason||(U.value.managedBrowser?`执行节点暂时不可用,请检查连接后重新检测。`:`托管浏览器尚未开放,请在「设置 → 环境与权限 → 运行环境」中开启。`)),1)),p(`button`,{type:`button`,disabled:I.value,onClick:Et},c(st.value?`正在检测…`:`重新检测`),9,je)],8,ke)):g(``,!0),p(`div`,{class:n([`computer-screen`,{controlling:V.value,"actual-size":at.value}])},[E.value?(r(),h(`img`,{key:0,src:`data:image/png;base64,${E.value.data}`,alt:(W.value.find(e=>e.key===yt.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:oe(Ht,[`prevent`])},null,40,Me)):(r(),h(`p`,Ne,c(M.value?`正在检查电脑环境…`:j.value?`准备完成后会自动接管,无需再次点击。`:T.value.mode===`off`?S.value===`managed-browser`?`浏览器尚未打开。接管后可打开网页。`:`打开电脑后可查看桌面。`:`正在读取电脑画面…`),1)),E.value&&(!B.value||E.value.generation!==T.value.generation)?(r(),h(`span`,Pe,c(B.value?`正在同步画面`:T.value.mode===`off`?`上次画面`:`仅查看`),1)):g(``,!0)],2),F.value||T.value.error?(r(),h(`p`,Fe,c(F.value||T.value.error),1)):g(``,!0),O.value||!f.embedded&&!D.value?(r(),h(`footer`,Ie,[T.value.backend===`grok`?(r(),h(`p`,Le,`多个机器人共享同一台 Grok Bot 云端电脑、工作文件与浏览器资料。`)):T.value.backend===`local`?(r(),h(`p`,Re,`当前显示`+c(T.value.hostName||`所选电脑`)+`的桌面,点击、输入、按键和滚动都会发送到这台电脑。`,1)):g(``,!0),S.value===`vm`&&lt.value?.computerEnvironmentId?(r(),h(`p`,ze,`共享电脑:`+c(lt.value.computerEnvironmentName)+`。成员共用工作文件和浏览器资料,可同时执行命令与文件操作,桌面操作交替进行;人工接管时机器人暂停等待。`,1)):g(``,!0),T.value.backend===`managed-browser`?(r(),h(`p`,Be,`当前是托管浏览器,与电脑桌面和虚拟机分别管理;网页操作无需启动虚拟机。`)):g(``,!0),A.value?.downloads.length?(r(),h(`details`,Ve,[p(`summary`,null,`浏览器下载(`+c(A.value.downloads.length)+`)`,1),p(`ul`,null,[(r(!0),h(d,null,o(A.value.downloads,e=>(r(),h(`li`,{key:e.id},[p(`span`,null,c(e.name),1),p(`small`,null,c((e.size/1024).toFixed(1))+` KiB`,1)]))),128))])])):g(``,!0),D.value?g(``,!0):(r(),h(`p`,He,`查看不会输入任何内容。接管后机器人会暂停,已有操作结束后才允许人工操作。`)),!D.value&&!G.value&&S.value!==`managed-browser`?(r(),h(`button`,{key:6,type:`button`,disabled:I.value,onClick:a[8]||=e=>K(bt)},`重新检查连接`,8,Ue)):g(``,!0),!D.value&&T.value.mode!==`human`?(r(),h(`button`,{key:7,type:`button`,disabled:I.value||!G.value,onClick:a[9]||=e=>f.embedded?b(`controlRequest`):Dt()},c(j.value?`正在准备浏览器…`:P.value?.status===`failed`?`重试并接管浏览器`:T.value.mode===`off`?`打开并控制`:`接管电脑`),9,We)):g(``,!0),B.value?(r(),h(d,{key:8},[O.value?(r(),h(`section`,Ge,[p(`div`,Ke,[(r(),h(d,null,o([`Return`,`Tab`,`Escape`,`BackSpace`,`Up`,`Down`,`Left`,`Right`],e=>p(`button`,{key:e,type:`button`,disabled:!H.value,onClick:t=>X({kind:`key`,key:e})},c({Return:`回车`,Escape:`Esc`,BackSpace:`退格`,Up:`↑`,Down:`↓`,Left:`←`,Right:`→`}[e]||e),9,qe)),64))]),p(`div`,Je,[p(`button`,{disabled:!H.value,onClick:a[10]||=e=>X({kind:`key`,key:`a`,modifiers:[T.value.backend===`local`||T.value.backend===`browser`?`super`:`ctrl`]})},`全选`,8,Ye),p(`button`,{disabled:!H.value,onClick:a[11]||=e=>X({kind:`key`,key:`c`,modifiers:[T.value.backend===`local`||T.value.backend===`browser`?`super`:`ctrl`]})},`复制`,8,Xe),p(`button`,{disabled:!H.value,onClick:a[12]||=e=>X({kind:`key`,key:`v`,modifiers:[T.value.backend===`local`||T.value.backend===`browser`?`super`:`ctrl`]})},`粘贴`,8,Ze)]),p(`label`,null,[a[17]||=u(`输入到电脑`,-1),i(p(`textarea`,{"onUpdate:modelValue":a[13]||=e=>ut.value=e,rows:`2`,maxlength:`16000`,placeholder:`输入文字后点击发送`,disabled:!H.value},null,8,Qe),[[se,ut.value]])]),p(`button`,{type:`button`,disabled:!H.value||!ut.value,onClick:a[14]||=e=>{X({kind:`text`,text:ut.value}),ut.value=``}},`输入文字`,8,$e)])):g(``,!0),p(`label`,null,[a[18]||=u(`交还说明`,-1),i(p(`textarea`,{"onUpdate:modelValue":a[15]||=e=>dt.value=e,rows:`2`,maxlength:`4000`,placeholder:`告诉机器人你完成了什么,以及接下来需要做什么`},null,512),[[se,dt.value]])]),p(`button`,{type:`button`,disabled:I.value||T.value.mode!==`human`,onClick:a[16]||=e=>K(Ut)},c(T.value.canResume?`交还机器人并继续`:S.value===`managed-browser`?`结束接管`:`结束控制`),9,et),S.value===`managed-browser`?(r(),h(`small`,tt,c(A.value?.supportsRetention===!0?`交还或收起只会释放操作权,页面会保留;长时间空闲后可能回收。`:A.value?.supportsRetention===!1?`此节点需更新后才能跨任务保留页面;任务结束后浏览器会关闭。`:`交还或收起会结束当前接管。`),1)):(r(),h(`small`,nt,`控制只属于当前页面。页面断开后控制权会到期,任务不会自行恢复。`))],64)):g(``,!0)])):g(``,!0),vt.value?(r(),h(`section`,{key:5,class:`browser-session-actions`,"aria-busy":ct.value},[p(`button`,{type:`button`,disabled:I.value,onClick:Wt},c(ct.value?`正在关闭浏览器…`:`关闭浏览器`),9,it),a[19]||=p(`small`,null,`结束当前浏览器会话并关闭标签页。`,-1)],8,rt)):g(``,!0)]),_:1},40,[`class`,`aria-label`]))],8,[`disabled`]))}}),[[`__scopeId`,`data-v-a7647a88`]]);export{ce as n,D as t};
2
+ //# sourceMappingURL=ComputerPanel-Dt73pgTG.js.map