constERROR_PATS=['error','Error','ENOENT','failed','Failed','FAILED','permission denied','Permission denied','EPERM','EACCES','command not found','No such file','Exit code'];
letcur=db.prepare('SELECT * FROM messages WHERE uuid=?').get(uuid);
while(cur){chain.unshift(cur);cur=cur.parent_uuid?db.prepare('SELECT * FROM messages WHERE uuid=?').get(cur.parent_uuid):null;}
returnchain;
};
constthread=(sid)=>db.prepare('SELECT * FROM messages WHERE session_id=? ORDER BY timestamp').all(sid);
constsubagents=(sid)=>{
returndb.prepare('SELECT * FROM subagents WHERE session_id=?').all(sid).map(r=>{
constc=db.prepare('SELECT COUNT(*) as c FROM messages WHERE agent_id=?').get(r.agent_id);
return{...r,messageCount:c?.c||0};
});
};
constworkflows=(sid)=>sid
?db.prepare('SELECT * FROM workflows WHERE session_id=? ORDER BY timestamp').all(sid)
:db.prepare('SELECT * FROM workflows ORDER BY timestamp DESC').all();
constworkflowTree=(runId)=>{
constwf=db.prepare('SELECT * FROM workflows WHERE run_id=?').get(runId);
if(!wf)returnnull;
constagents=db.prepare('SELECT * FROM workflow_agents WHERE run_id=?').all(runId).map(a=>({
...a,messages:db.prepare('SELECT * FROM messages WHERE agent_id=? ORDER BY timestamp').all(a.agent_id),
}));
return{...wf,agents};
};
constfileHistory=(fp)=>{
returndb.prepare(
'SELECT tc.*,s.title as s_title,s.project as s_project FROM tool_calls tc LEFT JOIN sessions s ON s.id=tc.session_id WHERE tc.file_path=? ORDER BY tc.id'
timestamp:db.prepare('SELECT timestamp FROM messages WHERE uuid=?').get(r.message_uuid)?.timestamp,
}));
};
constfailures=(sid)=>{
constlikeClauses=ERROR_PATS.map(()=>'content LIKE ?').join(' OR ');
constlikeParams=ERROR_PATS.map(p=>`%${p}%`);
letquery=`SELECT * FROM tool_results WHERE (${likeClauses})`;
constparams=[...likeParams];
if(sid){query+=' AND session_id=?';params.push(sid);}
constrows=db.prepare(query).all(...params);
returnrows.map(r=>{
consttc=db.prepare('SELECT * FROM tool_calls WHERE id=?').get(r.tool_use_id);
constsession=db.prepare('SELECT * FROM sessions WHERE id=?').get(r.session_id);
constrm=db.prepare('SELECT * FROM messages WHERE uuid=?').get(r.message_uuid);
constnext=rm?.timestamp?db.prepare('SELECT * FROM messages WHERE session_id=? AND timestamp>? ORDER BY timestamp LIMIT 3').all(r.session_id,rm.timestamp):[];
?db.prepare('SELECT * FROM summaries WHERE session_id=? ORDER BY timestamp').all(sessionId)
:db.prepare('SELECT su.*, s.title as session_title, s.project FROM summaries su LEFT JOIN sessions s ON s.id=su.session_id ORDER BY su.timestamp DESC').all();