import argparse, json, os, signal, subprocess, secrets, time
from pathlib import Path
ROOT=Path('/tmp/lead-28018-r1/evidence-capture-2/run-20261103T033340Z')
p=argparse.ArgumentParser(); p.add_argument('action',choices=['start','stop']); p.add_argument('name'); p.add_argument('--worktree',default='/home/ubuntu/wt/pr-28018'); p.add_argument('--home'); p.add_argument('--invalid-key',action='store_true'); p.add_argument('--missing-key',action='store_true'); a=p.parse_args()
state=ROOT/(a.name+'-process.json')
if a.action=='start':
 token=ROOT/'private-dev-auth.txt'
 if not token.exists(): token.write_text(secrets.token_hex(32)); token.chmod(0o600)
 env=dict(os.environ,T3CODE_DEV_SEED='0',T3CODE_DEV_AUTH_TOKEN=token.read_text().strip())
 env['NODE_OPTIONS']=(env.get('NODE_OPTIONS','')+' --import '+str(ROOT/'freeze-clock.mjs')).strip()
 if a.invalid_key: env['CURSOR_API_KEY']='deliberately-invalid-evidence-fixture'
 if a.missing_key: env.pop('CURSOR_API_KEY',None)
 run=ROOT/(a.name+'-'+time.strftime('%Y%m%dT%H%M%SZ',time.gmtime()));run.mkdir()
 home=Path(a.home or str(run/'home')); (home/'userdata').mkdir(parents=True,exist_ok=True)
 settings=home/'userdata/settings.json'
 if not settings.exists():
  settings.write_text(json.dumps({'providerInstances':{'cursor':{'driver':'cursor','enabled':True,'config':{'customModels':[]}}},'enableProviderUpdateChecks':False},indent=2))
 with (run/'server.log').open('w') as out:
  proc=subprocess.Popen(['vp','run','dev','--home-dir',str(home)],cwd=a.worktree,env=env,stdout=out,stderr=subprocess.STDOUT,start_new_session=True)
 info={'pid':proc.pid,'pgid':proc.pid,'worktree':a.worktree,'home':str(home),'run':str(run),'log':str(run/'server.log')};state.write_text(json.dumps(info,indent=2));print(json.dumps(info))
else:
 info=json.loads(state.read_text()); pid=info['pid']
 if Path(f'/proc/{pid}').exists():
  if os.getpgid(pid)!=info['pgid']: raise RuntimeError('process group changed')
  os.killpg(info['pgid'],signal.SIGTERM)
 print('Stopped captured process group',info['pgid'])
