workspaceEnvironment.test.ts 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. // @vitest-environment node
  2. import {expect,it} from 'vitest'
  3. import {buildWorkspaceEnvironment,workspaceEnvironmentTools} from '../../src/server/workspaceEnvironment'
  4. import {parseHostTools} from '../../src/server/hostToolSettings'
  5. import {deviceInventoryText,type DesktopEnvironmentSnapshot} from '../../src/shared/botEnvironment'
  6. import type {WorkspaceAgent} from '../../src/shared/workspace'
  7. const agent:WorkspaceAgent={id:'bot',name:'Bot',avatar:'',instructions:'',nodeId:'local',profile:'default',archived:false,revision:1,createdAt:1,updatedAt:1}
  8. const desktop:DesktopEnvironmentSnapshot={capturedAt:10,sourceHost:'local',hosts:[{id:'local',target:'server',name:'服务器',kind:'server',source:true,online:true,open:true,
  9. capabilities:{view:{enabled:true,status:'human_control'},input:{enabled:true,status:'human_control'},fileRead:{enabled:false,status:'not_authorized'},fileWrite:{enabled:false,status:'not_authorized'},shell:{enabled:false,status:'not_authorized'},fileTransfer:{enabled:false,status:'not_authorized'}},transfer:{protocol:'legacy',readMaxMiB:12,writeMaxMiB:10}}]}
  10. it('mounts only granted desktop capabilities while distinguishing human control and deferred virtual environments',()=>{
  11. const env=buildWorkspaceEnvironment({agent,globals:parseHostTools({}),desktop,bridge:true,cloud:false,plugins:false})
  12. const names=workspaceEnvironmentTools(env).map(tool=>tool.id)
  13. expect(names).toContain('desktop_environment_view')
  14. expect(names).not.toContain('desktop_shell')
  15. expect(names).toContain('computer_shell')
  16. expect(names).not.toContain('cloud_computer_shell')
  17. expect(env.virtual.vm.status).toBe('on_demand')
  18. expect(env.virtual.cloud.status).toBe('not_configured')
  19. expect(deviceInventoryText(env.desktop)).toContain('等待人工交还')
  20. expect(env.cwd).toBeUndefined()
  21. })
  22. it('captures policy and file limits rather than observing later settings mutations',()=>{
  23. const globals=parseHostTools({fileTransferMaxMiB:60,cloud:false,vm:false})
  24. const facts=structuredClone(desktop)
  25. for(const cap of Object.values(facts.hosts[0]!.capabilities))Object.assign(cap,{enabled:true,status:'ready'})
  26. const env=buildWorkspaceEnvironment({agent,globals,desktop:facts,bridge:true,cloud:true,plugins:false})
  27. globals.fileTransferMaxMiB=1;globals.vm=true
  28. const names=workspaceEnvironmentTools(env)
  29. expect(names.find(tool=>tool.id==='desktop_file_copy')?.description).toContain('60 MiB')
  30. expect(names.some(tool=>tool.id==='computer_shell')).toBe(false)
  31. expect(env.virtual.vm.status).toBe('disabled')
  32. expect(env.virtual.cloud.status).toBe('disabled')
  33. })
  34. it('does not expose computer tools for an unavailable Bot or missing bridge',()=>{
  35. const env=buildWorkspaceEnvironment({agent:{...agent,archived:true},globals:parseHostTools({}),desktop,bridge:false,cloud:true,plugins:false})
  36. expect(workspaceEnvironmentTools(env)).toEqual([])
  37. expect(env.virtual.vm.status).toBe('bridge_unavailable')
  38. })