#!/usr/bin/env python3
import argparse,json,pathlib,urllib.request,base64,datetime
p=argparse.ArgumentParser();p.add_argument('--artifacts',required=True);p.add_argument('--count',type=int,default=3);a=p.parse_args();r=pathlib.Path(a.artifacts)
x=json.loads((r/'owned.json').read_text());env=dict(s.split(b'=',1) for s in pathlib.Path('/proc',str(x['wrapper']),'environ').read_bytes().split(b'\0') if b'=' in s);auth=base64.b64encode(b'opencode:'+env[b'OPENCODE_PASSWORD']).decode()
def get(url):return json.load(urllib.request.urlopen(urllib.request.Request('http://127.0.0.1:'+str(x['port'])+url,headers={'Authorization':'Basic '+auth})))
sessions=[]
for line in (r/'network.jsonl').read_text().splitlines():
 e=json.loads(line)
 if e.get('method')=='POST' and e.get('url','').endswith('/prompt'):
  session=e['url'].split('/')[3]
  if session not in sessions:sessions.append(session)
active=get('/api/session/active')['data'];result=[]
for n,s in enumerate(sessions[-a.count:]):
 messages=get('/api/session/'+s+'/message?limit=50&order=desc')['data'];result.append({'thread':n+1,'nativeActive':s in active,'history':messages})
# Emit only synthetic completion markers, not native identifiers, provider metadata or paths.
out={'at':datetime.datetime.now(datetime.timezone.utc).isoformat(),'nativeProcessAlive':True,'threads':[{'thread':x['thread'],'nativeActive':x['nativeActive'],'completionMarkerInAssistantHistory':any(m.get('type')=='assistant' and 'RECOVERY COMPLETE' in json.dumps(m) for m in x['history'])} for x in result]}
(r/'native-result.json').write_text(json.dumps(out,indent=2));print(json.dumps(out,indent=2))
