computerArtifacts.test.ts 1.8 KB

12345678910111213141516171819202122232425262728
  1. // @vitest-environment node
  2. import {expect,it,vi} from 'vitest'
  3. import {mkdtempSync,rmSync} from 'node:fs'
  4. import {join} from 'node:path'
  5. import {tmpdir} from 'node:os'
  6. import {WorkspaceStore} from '../../src/server/workspaceStore'
  7. import {WorkspaceAssets} from '../../src/server/workspaceAssets'
  8. import type {WorkspaceNodes} from '../../src/server/workspaceGateway'
  9. it('never resolves a computer message path against native Hermes or the host filesystem',async()=>{
  10. const home=mkdtempSync(join(tmpdir(),'yaoyao-computer-artifacts-')),store=new WorkspaceStore(home),target=vi.fn()
  11. const assets=new WorkspaceAssets(store,{target} as unknown as WorkspaceNodes,home)
  12. try{
  13. const agent=store.createAgent('owner',{name:'隔离',profile:'default',execution:'computer'})
  14. const conversation=store.list<any>('owner','conversation')[0]
  15. const message:any={id:crypto.randomUUID(),conversationId:conversation.id,seq:0,role:'assistant',execution:'computer',agentId:agent.id,content:'[host file](/Users/private/secret.txt)',reasoning:'',status:'complete',attachments:[],tools:[],createdAt:Date.now()}
  16. store.saveMessage('owner',message)
  17. await assets.archive('owner',message)
  18. expect(target).not.toHaveBeenCalled()
  19. store.updateAgent('owner',agent.id,{execution:'profile'})
  20. await assets.archive('owner',message)
  21. expect(target).not.toHaveBeenCalled()
  22. const first=assets.publish('owner',message,agent,'report.txt',Buffer.from('guest output'))
  23. expect(assets.publish('owner',message,agent,'report.txt',Buffer.from('guest output'))).toEqual(first)
  24. await assets.archive('owner',message)
  25. expect(message.attachments).toHaveLength(1)
  26. expect(message.attachments[0]).not.toHaveProperty('path')
  27. }finally{assets.close();store.close();rmSync(home,{recursive:true,force:true})}
  28. })