import subprocess,sys,pathlib,datetime,time,json
binary,session,side,root=sys.argv[1:]
out=pathlib.Path(root)/(side+'-'+datetime.datetime.now().strftime('%Y%m%d-%H%M%S'));out.mkdir()
def ab(*args):
 r=subprocess.run([binary,'--session',session,*args],capture_output=True,text=True,check=True)
 return r.stdout
ab('set','viewport','1280','800')
ab('set','media','light')
# Privacy only: preserve row layout, names and shortcut badges; obscure workspace paths.
ab('eval', '''(()=>{const s=document.createElement('style');s.textContent='[role="option"] span.min-w-0.flex-1.truncate, [aria-label="Message input"] { visibility:hidden !important; }';document.head.append(s)})()''')
ab('record','start',str(out/'raw.mp4'))
observations=[]
for query in ['li','zu']:
 ab('press','Control+k')
 ab('find','role','option','click','--name','New thread in...','--exact')
 time.sleep(1.5)
 observations.append(ab('snapshot','-i'))
 ab('find','role','combobox','fill',query,'--name','Search...','--exact')
 time.sleep(2)
 observations.append(ab('snapshot','-i'))
 ab('press','Control+1')
 time.sleep(3)
 observations.append(ab('snapshot','-i'))
 ab('press','Escape')
 time.sleep(1)
ab('record','stop')
(out/'observations-private.txt').write_text('\n'.join(observations))
# Crop to the picker and thread breadcrumb; excludes private environment and model labels.
subprocess.run(['ffmpeg','-y','-i',str(out/'raw.mp4'),'-vf','crop=700:640:260:0','-c:v','libx264','-crf','20',str(out/(side+'.mp4'))],capture_output=True,check=True)
print(out)
