import datetime, json, pathlib, subprocess, sys, time, re
# Usage: python capture-flow.py AGENT_BROWSER SESSION ORIGIN OUTPUT_ROOT SIDE
browser,session,origin,root,side=sys.argv[1:]
out=pathlib.Path(root)/(side+'-'+datetime.datetime.now(datetime.timezone.utc).strftime('%Y%m%dT%H%M%SZ'));out.mkdir(parents=True)
def call(*args):
 p=subprocess.run([browser,'--session',session,*args],capture_output=True,text=True)
 if p.returncode: raise RuntimeError(p.stderr)
 return p.stdout
call('set','viewport','1280','800')
call('open',origin+'/settings/providers')
call('wait','--text','Providers')
def click_named(name):
 snapshot=call('snapshot','-i')
 refs=re.findall(r'- button "'+re.escape(name)+r'"[^\n]*?ref=(e[0-9]+)', snapshot)
 if not refs: raise RuntimeError('No button '+name+' in '+snapshot)
 call('focus','@'+refs[0])
 call('press','Enter')
call('record','start',str(out/(side+'.webm')))
click_named('Add provider')
call('wait','--text','Show more')
click_named('Show more')
call('wait','--fn',"document.querySelector('button[aria-label=\"Add Two Dot Example Agent\"]')?.disabled === false")
click_named('Add Two Dot Example Agent')
call('wait','--fn','document.body.innerText.includes("resolves outside its installation directory") || Boolean(document.querySelector("#add-provider-label")?.getClientRects().length)')
(out/'screen.txt').write_text(call('snapshot'))
# Require two identical captures 500 ms apart before retaining the final still.
previous=None
for i in range(12):
 image=out/('settle-'+str(i)+'.png')
 call('screenshot',str(image))
 content=image.read_bytes()
 if content==previous:
  (out/(side+'.png')).write_bytes(content)
  break
 previous=content
 time.sleep(.5)
else: raise RuntimeError('Screen did not settle')
call('record','stop')
print(out)
