"""Drive a fresh synthetic thread through a real running T3 server.
Set EVIDENCE_CHECKOUT, EVIDENCE_PROVIDER and EVIDENCE_MODEL privately.
Usage: python3 reproduce.py <new-output-directory>
The adjacent call.mjs authenticates using T3's normal local CLI session path.
"""
import datetime, json, os, pathlib, subprocess, sys, time
out=pathlib.Path(sys.argv[1]); out.mkdir(parents=True,exist_ok=False)
driver=pathlib.Path(__file__).with_name('call.mjs')
records=[]
def emit(stage,data):
    entry={'time':datetime.datetime.now(datetime.timezone.utc).isoformat(),'stage':stage,**data}
    records.append(entry); print(json.dumps(entry),flush=True)
    (out/'transcript.json').write_text(json.dumps(records,indent=2))
def call(tool,args):
    result=subprocess.run(['node',str(driver),tool,json.dumps(args)],capture_output=True,text=True,check=True)
    raw=json.loads(result.stdout)
    if raw.get('isError'): return {'error':json.loads(raw['content'][0]['text'])['message']}
    return raw['structuredContent']
def read(tid): return call('t3_thread_read',{'threadId':tid,'view':'activity'})
def summary(v):
    return {'status':v['thread']['status'],'runs':[{'ordinal':r['ordinal'],'status':r['status']} for r in v['recentRuns']],
        'items':[{'type':i['type'],'status':i['status'],'text':i['text']} for i in v['items'] if i['type'] in ['user_message','assistant_message','command_execution']]}
project=call('t3_project_list',{})['projects'][0]['id']
message="Run python3 -c 'import time; time.sleep(150)' in the foreground. Do not run it in the background. When it finishes reply done."
launched=call('t3_thread_launch',{'projectId':project,'title':'Restart evidence','message':message,'runtimeMode':'full-access','modelSelection':{'instanceId':os.environ['EVIDENCE_PROVIDER'],'model':os.environ['EVIDENCE_MODEL']}})
tid=launched['threadId']; emit('launch',{'message':message})
(out/'private-thread.json').write_text(json.dumps(launched))
for _ in range(120):
    state=read(tid)
    if any(i['type']=='command_execution' and 'time.sleep(150)' in (i['text'] or '') for i in state['items']): break
    if state['thread']['status']=='failed': emit('failed',summary(state)); sys.exit(1)
    time.sleep(1)
else: emit('no-foreground-sleep',summary(state)); sys.exit(1)
emit('before-send',summary(state))
time.sleep(25)
result=call('t3_thread_send',{'threadId':tid,'mode':'restart','message':'Stop sleeping and reply with just: restarted'})
emit('restart-send',{k:v for k,v in result.items() if k in ['error','delivery','status']})
if 'error' in result:
    time.sleep(5); emit('after-send',summary(read(tid)))
else:
    for _ in range(90):
        state=read(tid)
        if state['thread']['status'] in ['completed','failed','idle']: break
        time.sleep(1)
    emit('after-send',summary(state))
