import json, pathlib, sys, urllib.request
worktree, project, side, phase = sys.argv[1:]
root=pathlib.Path(__file__).parent
project=str(root/project)
metadata=list((pathlib.Path(worktree)/'.t3/userdata/opencode-servers').glob('*.json'))
ports=[json.loads(p.read_text())['port'] for p in metadata]
def clean(value):
    if isinstance(value,str):
        return value.replace(project,'<project>').replace(str(root),'<proof>').replace(str(pathlib.Path.home()),'<home>')
    if isinstance(value,list): return [clean(x) for x in value]
    if isinstance(value,dict): return {k:clean(v) for k,v in value.items()}
    return value
sessions=[]
for port in ports:
    try:
        data=json.load(urllib.request.urlopen(f'http://127.0.0.1:{port}/session?directory={project}'))
        for s in data:
            if s.get('directory')!=project or any(t['session']==s['id'] for t in sessions): continue
            messages=json.load(urllib.request.urlopen(f"http://127.0.0.1:{port}/session/{s['id']}/message?directory={project}"))
            sessions.append({'session':s['id'],'parent':s.get('parentID'),'title':s['title'],'permission':[r for r in s.get('permission',[]) if not r['pattern'].startswith('/')], 'messages':[{'role':m['info']['role'],'agent':m['info'].get('agent'),'parts':[{'type':p['type'],**({'text':p['text']} if p['type']=='text' else {}),**({'tool':p['tool'],'status':p['state']['status'],'input':p['state'].get('input'), 'output':str(p['state'].get('output',''))[:600]} if p['type']=='tool' else {})} for p in m['parts'] if p['type'] in ['text','tool']]} for m in messages]})
    except Exception as e: print(type(e).__name__, str(e))
output=clean({'side':side,'phase':phase,'sessions':sessions,'files':{p.name:p.read_text() for p in pathlib.Path(project).glob('*.txt')}})
(root/f'{side}-{phase}.json').write_text(json.dumps(output,indent=2))
print('sessions',[(s['session'],s['title']) for s in sessions]);print('files',output['files'])
