#!/usr/bin/env python3
"""Run either checked-out app commit with isolated synthetic evidence state.
Requires dependencies installed with vp i. Keep running while driving the browser.
"""
import argparse,json,os,pathlib,signal,subprocess,time,datetime
p=argparse.ArgumentParser();p.add_argument('--checkout',required=True);p.add_argument('--output',required=True);a=p.parse_args()
root=pathlib.Path(a.checkout).resolve();out=pathlib.Path(a.output).resolve()/datetime.datetime.now().strftime('%Y%m%d-%H%M%S');out.mkdir(parents=True)
home=root/'.t3'/('evidence-'+out.name);(home/'userdata').mkdir(parents=True)
driver=pathlib.Path(__file__).with_name('replay-background.py').resolve()
settings={'defaultModelSelection':{'instanceId':'grok','model':'scenario'},'providerInstances':{k:{'driver':k,'enabled':False} for k in ['codex','claudeAgent','cursor','muse','pi','opencode','antigravity']}}
settings['providerInstances']['grok']={'driver':'grok','enabled':True,'displayName':'Replay (dev)','config':{'binaryPath':str(driver),'customModels':[{'slug':'scenario','name':'Scenario'}]}}
(home/'userdata/settings.json').write_text(json.dumps(settings))
workspace=home/'workspace';workspace.mkdir()
def run(args):return subprocess.check_output(args,cwd=root,text=True)
run(['git','-C',str(workspace),'init','-q','-b','main']);run(['git','-C',str(workspace),'-c','user.name=Scenario','-c','user.email=scenario@example.invalid','commit','--allow-empty','-qm','Initial commit'])
env={**os.environ,'T3CODE_DEV_SEED':'0','T3CODE_AUTO_BOOTSTRAP_PROJECT_FROM_CWD':'0'}
log=open(out/'app.log','w');server=subprocess.Popen(['vp','run','dev','--home-dir',str(home),'--no-seed'],cwd=root,env=env,stdout=log,stderr=log,start_new_session=True)
def stop(*_):raise KeyboardInterrupt
signal.signal(signal.SIGTERM,stop)
try:
 for _ in range(120):
  if server.poll() is not None:raise RuntimeError('App exited; inspect local app.log')
  if 'pairingUrl:' in (out/'app.log').read_text():break
  time.sleep(1)
 else:raise RuntimeError('App did not start')
 cli=['node','apps/server/src/bin.ts']
 run(cli+['project','add',str(workspace),'--title','Background demo','--base-dir',str(home)])
 result=json.loads(run(cli+['thread','start',str(workspace),'Start tracked sleep 600 and finish without waiting.','--title','Background command follow-up','--provider','grok','--model','scenario','--base-dir',str(home),'--wait','--json']))
 (out/'thread.json').write_text(json.dumps(result))
 print('Synthetic thread is ready. Pair using the local app.log link and open Background command follow-up. Do not publish the pairing link.',flush=True)
 while server.poll() is None:time.sleep(1)
except KeyboardInterrupt:pass
finally:
 os.killpg(server.pid,signal.SIGINT);server.wait();log.close()
