import {spawn} from 'node:child_process'; import {readFile,writeFile} from 'node:fs/promises'; import {fileURLToPath} from 'node:url'; import {once} from 'node:events'; import assert from 'node:assert/strict'; import {digest} from '../src/core.mjs'; const root=fileURLToPath(new URL('../',import.meta.url)),port=4319,base=`http://127.0.0.1:${port}`; const child=spawn(process.execPath,['src/server.mjs'],{cwd:root,env:{...process.env,PORT:String(port)},stdio:['ignore','pipe','pipe']}); const exited=once(child,'exit').catch(()=>{}); let logs='';child.stdout.on('data',x=>logs+=x);child.stderr.on('data',x=>logs+=x); const api=async(path,data)=>{ const response=await fetch(base+path,data?{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify(data)}:{}); const result=await response.json();if(!response.ok)throw new Error(result.error);return result; }; try{ let ready=false; for(let attempt=0;attempt<100;attempt++){ try{await api('/api/sample');ready=true;break;}catch{} await new Promise(resolve=>setTimeout(resolve,50)); } if(!ready)throw new Error('Local server did not start: '+logs); const source=await api('/api/sample'),before=digest(source.issues),triage=await api('/api/triage',source); const decisions=triage.items.filter(x=>!x.needsReview).slice(0,2).map(x=>({id:x.id,label:x.suggestedLabel})); assert.equal(decisions.length,2); const applied=await api('/api/apply',{runId:triage.runId,decisions}); assert.equal(applied.appliedCount,2);assert.notEqual(digest(applied.issues),before); const restored=await api('/api/undo',{revisionId:applied.revisionId}); assert.equal(digest(restored.issues),before); const disk=JSON.parse(await readFile(root+'data/sample.json','utf8'));assert.equal(digest(disk.issues),before); const result={recordedAt:new Date().toISOString(),kind:'actual local HTTP end-to-end demonstration; not browser visual verification',steps:['load synthetic sample','execute Mastra workflow and local embeddings','select two suggestions','apply to in-memory copy','undo revision','verify original and restored SHA-256 digests match'],triage,decisions,applied,restored,originalHash:before,restoredHash:digest(restored.issues),originalFileUnchanged:true,serverLogs:logs}; await writeFile(root+'evidence/end-to-end-demo.json',JSON.stringify(result,null,2)+'\n'); console.log(JSON.stringify({summary:triage.summary,applied:applied.appliedCount,restored:restored.restoredCount,originalFileUnchanged:true,timings:triage.timings})); }finally{ if(child.exitCode===null&&child.signalCode===null)child.kill('SIGTERM');await exited; }