#!/usr/bin/env python3
"""Run the built real CLI and real Codex in a PTY; capture both exit recovery and rejected flag.
Usage: python3 driver.py CHECKOUT OUTPUT_ROOT SIDE
No model turn is started: CODEX_HOME deliberately names a regular file.
"""
import os, sys, pty, subprocess, select, time, json, struct, fcntl, termios, pathlib, re, datetime
checkout, root, side = map(pathlib.Path, sys.argv[1:])
run = root / (str(side) + '-' + datetime.datetime.now(datetime.timezone.utc).strftime('%Y%m%dT%H%M%S'))
run.mkdir(parents=True)
state = run / 'codex-state'
state.write_text('Deliberately a file to force a real Codex storage startup failure.\n')
env = os.environ.copy()
env.update(CODEX_HOME=str(state), T3CODE_HOME=str(run/'t3-home'), T3CODE_DEV_SEED='0', TERM='xterm-256color', NO_COLOR='1')
# Avoid exposing inherited provider configuration; the startup error requires no account.
for name in list(env):
    if any(x in name for x in ['TOKEN','API_KEY','BASE_URL']): env.pop(name)
cli = checkout/'apps/server/dist/bin.mjs'
events=[]
transcript=''
start=time.monotonic()
for args, shown in [(['triage','--agent','codex'], '$ t3 triage --agent codex'), (['triage','--no-daemon'], '$ t3 triage --no-daemon')]:
    events.append([time.monotonic()-start,'o',shown+'\r\n'])
    transcript += shown+'\n'
    master, slave = pty.openpty()
    fcntl.ioctl(slave, termios.TIOCSWINSZ, struct.pack('HHHH', 48,120,0,0))
    p=subprocess.Popen(['node',str(cli),*args],cwd=checkout,env=env,stdin=slave,stdout=slave,stderr=slave)
    os.close(slave)
    while True:
        try: chunk=os.read(master,65536)
        except OSError: break
        if not chunk: break
        data=chunk.decode(errors='replace')
        events.append([time.monotonic()-start,'o',data]); transcript+=data
    p.wait(); os.close(master)
    line=f'CLI exit status: {p.returncode}\r\n\r\n'
    events.append([time.monotonic()-start,'o',line]); transcript+=line
# Published paths are consistently redacted; raw artifacts stay private.
def clean(s):
    return s.replace(str(run),'/evidence/run').replace(str(checkout),'/workspace/t3code')
transcript=clean(transcript)
(run/'terminal.txt').write_text(re.sub(r'\x1b\[[0-?]*[ -/]*[@-~]','',transcript).replace('\r',''))
with (run/'terminal.cast').open('w') as f:
    f.write(json.dumps({'version':2,'width':120,'height':48,'title':f'{side}: real T3 CLI / Codex storage startup failure'})+'\n')
    for t,k,s in events: f.write(json.dumps([round(t,6),k,clean(s)])+'\n')
print(run)
print((run/'terminal.txt').read_text())
