#!/usr/bin/env python3
import subprocess,os,json,sys,threading,pathlib
root=pathlib.Path(__file__).resolve().parents[2]
side=pathlib.Path(__file__).parent.parent.name
aliases=json.loads((root/'private-aliases.json').read_text())
def redact(v):
 if isinstance(v,str):
  for a,b in sorted(aliases.items(),key=lambda x:-len(x[0])): v=v.replace(a,b)
  return v
 if isinstance(v,list):return [redact(x) for x in v]
 if isinstance(v,dict):return {k:redact(x) for k,x in v.items()}
 return v
env=dict(os.environ,COPILOT_HOME=str(root/side/'copilot-home'),GH_TOKEN=subprocess.check_output(['gh','auth','token'],text=True).strip())
p=subprocess.Popen([str(root/'copilot/node_modules/.bin/copilot'),*sys.argv[1:]],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=open(root/side/'copilot-stderr.log','a'),env=env,text=True,bufsize=1)
wire=open(root/side/'wire.jsonl','a',buffering=1)
def read():
 for l in p.stdout:
  try:
   o=json.loads(l);wire.write(json.dumps(dict(direction='from-copilot',message=redact(o)))+'\n')
   # Change display names only; protocol model identifiers and all behavior remain original.
   def names(v):
    if isinstance(v,list):return [names(x) for x in v]
    if isinstance(v,dict):return {k:(redact(x) if k in ('name','description') and isinstance(x,str) else names(x)) for k,x in v.items()}
    return v
   print(json.dumps(names(o)),flush=True)
  except Exception: print(l,end='',flush=True)
threading.Thread(target=read,daemon=True).start()
try:
 for l in sys.stdin:
  try:wire.write(json.dumps(dict(direction='to-copilot',message=redact(json.loads(l))))+'\n')
  except Exception:pass
  p.stdin.write(l);p.stdin.flush()
finally:
 p.terminate();p.wait()
