ask-seq.mjs 2.1 KB

12345678910111213141516171819202122232425262728
  1. #!/usr/bin/env node
  2. import { readFileSync } from 'node:fs';
  3. import { homedir } from 'node:os';
  4. import { join } from 'node:path';
  5. const F='https://server.fmode.cn/api/functions', T='agent-node-lj-test';
  6. const sleep=(ms)=>new Promise(r=>setTimeout(r,ms));
  7. const t=JSON.parse(readFileSync(join(homedir(),'.fmode/config/user.json'),'utf8'))?.sessionToken;
  8. async function prov(id){const r=await fetch(F,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({id:'RP5Ht55NeX',token:t,params:{agentId:id}})});const j=await r.json();const d=j.result??j;if(!d?.accessToken)throw new Error('provision 失败');return d;}
  9. const QS=JSON.parse(process.argv[2]||'[]');
  10. const p1=await prov(T), agent=await prov(T);
  11. const mx=await import('matrix-js-sdk');
  12. const c=mx.createClient({baseUrl:p1.homeserver,accessToken:p1.accessToken,userId:p1.userMxId});
  13. const room=(await c.createRoom({invite:[agent.agentMxId],name:`seq-${Date.now()}`,preset:mx.Preset.TrustedPrivateChat})).room_id;
  14. const hs=p1.homeserver.replace(/\/$/,''), auth={Authorization:`Bearer ${p1.accessToken}`};
  15. for(let i=0;i<30;i++){await sleep(3000);const j=await(await fetch(`${hs}/_matrix/client/v3/rooms/${encodeURIComponent(room)}/joined_members`,{headers:auth})).json().catch(()=>({}));if((j.joined??{})[agent.agentMxId])break;}
  16. const seen=new Set();
  17. for(const q of QS){
  18. console.log(`\n===== 问 =====\n${q}\n`);
  19. const s=await c.sendEvent(room,'m.room.message',{msgtype:'m.text',body:q,'m.mentions':{user_ids:[agent.agentMxId]}});
  20. seen.add(s.event_id);
  21. let buf='',lastNew=Date.now();const stop=Date.now()+420_000;
  22. while(Date.now()<stop){await sleep(5000);let added=false;
  23. try{const j=await(await fetch(`${hs}/_matrix/client/v3/rooms/${encodeURIComponent(room)}/messages?dir=b&limit=80`,{headers:auth})).json();
  24. for(const ev of (j.chunk??[]).reverse()){if(ev.type!=='m.room.message'||seen.has(ev.event_id)||ev.sender===p1.userMxId)continue;seen.add(ev.event_id);buf+=String(ev.content?.body??'')+'\n';added=true;}}catch{}
  25. if(added)lastNew=Date.now();else if(buf&&Date.now()-lastNew>30000)break;}
  26. console.log(buf.trim()||'(无回复)');
  27. }
  28. console.log('\n房间:',room);c.stopClient();