import http.server,socketserver,json,os,time
ROOT=os.path.dirname(__file__)
class Server(socketserver.ThreadingMixIn,socketserver.UnixStreamServer): pass
class Handler(http.server.BaseHTTPRequestHandler):
 def log_message(self,*args): pass
 def do_GET(self): self.answer({'login':'scenario','id':123})
 def answer(self,data):
  b=json.dumps(data).encode(); self.send_response(200); self.send_header('Content-Type','application/json'); self.send_header('Content-Length',str(len(b))); self.send_header('x-ratelimit-remaining','5000'); self.end_headers(); self.wfile.write(b)
 def do_POST(self):
  req=json.loads(self.rfile.read(int(self.headers.get('Content-Length',0)))); q=req.get('query',''); v=req.get('variables',{}); text=v.get('q','')
  with open(ROOT+'/requests.jsonl','a') as f:f.write(json.dumps(req)+'\n')
  row={'__typename':'PullRequest','number':42,'title':'Chronic reliability improvements','url':'https://github.com/scenario/search-demo/pull/42','author':{'__typename':'User','login':'scenario','avatarUrl':'https://avatars.githubusercontent.com/u/0','name':'Scenario'},'headRefName':'fix/chronic','baseRefName':'main','state':'OPEN','isDraft':False,'mergeable':'MERGEABLE','reviewDecision':None,'latestReviews':{'nodes':[]},'additions':12,'deletions':3,'createdAt':'2026-11-10T10:00:00Z','updatedAt':'2026-11-11T10:00:00Z','mergedAt':None,'repository':{'nameWithOwner':'scenario/search-demo'},'reviewRequests':{'nodes':[]},'labels':{'nodes':[{'name':'bug','color':'d73a4a','description':None}]},'commits':{'nodes':[{'commit':{'statusCheckRollup':None}}]},'stack':None,'stackEntry':None}
  if 'RoutingIdentityViewer' in q: data={'viewer':{'databaseId':123,'login':'scenario'}}
  elif 'PullRequestSearch' in q:
   words=text.split(); partial=any(w.strip(chr(34)).lower() in ['c','ch','chr','chro'] for w in words)
   nodes=[] if partial else [row]
   if 'review-requested:' in text:nodes=[]
   time.sleep(.4); data={'search':{'pageInfo':{'hasNextPage':False,'endCursor':None},'nodes':nodes}}
  elif 'PullRequestList' in q: data={'repository':{'pullRequests':{'pageInfo':{'hasNextPage':False,'endCursor':None},'nodes':[row]}}}
  elif 'PullRequestsByHead' in q: data={'_0_repository':{'pullRequests':{'nodes':[]}}}
  elif 'ActorAvatars' in q:data={'nodes':[]}
  else:
   import re
   aliases=re.findall(r'(\w+):repository',q)
   data={a:{'pullRequest':{'stack':None,'stackEntry':None,'additions':12,'deletions':3}} for a in aliases}
   data['repository']={'pullRequest':{'stack':None,'stackEntry':None}}
  self.answer({'data':data})
Server(ROOT+'/github.sock',Handler).serve_forever()
