#!/usr/bin/env python3
"""Deterministic ACP driver: real tracked sleeps, no language model."""
import sys,json,uuid,threading,subprocess,signal,atexit
if 'stdio' not in sys.argv:
 print('grok 1.0.77' if '--version' in sys.argv else 'You are logged in\n* scenario (default)' if 'models' in sys.argv else '{}');sys.exit()
children=[];sessions={};lock=threading.Lock()
def cleanup():
 for p in children:
  if p.poll() is None:p.terminate()
atexit.register(cleanup)
def stop(*_):cleanup();sys.exit()
signal.signal(signal.SIGTERM,stop);signal.signal(signal.SIGINT,stop)
def send(j):
 with lock:print(json.dumps({'jsonrpc':'2.0',**j}),flush=True)
def update(s,u):send({'method':'session/update','params':{'sessionId':s,'update':u}})
def text(s,t):update(s,{'sessionUpdate':'agent_message_chunk','content':{'type':'text','text':t}})
def prompt(j):
 s=j['params']['sessionId'];n=sessions[s];sessions[s]+=1
 if n==0:
  p=subprocess.Popen(['sleep','600']);children.append(p)
  update(s,{'sessionUpdate':'tool_call','toolCallId':'background-sleep','kind':'execute','title':'sleep 600','status':'completed','rawInput':{'command':'sleep 600','variant':'Monitor','persistent':True},'rawOutput':{'type':'BackgroundTaskStarted','task_id':'tracked-sleep-600'},'content':[{'type':'content','content':{'type':'text','text':'Command running in background with ID: tracked-sleep-600'}}]})
  text(s,'Started sleep 600 in the background. The turn is complete; send a follow-up.')
 else:
  update(s,{'sessionUpdate':'tool_call','toolCallId':'foreground-sleep-'+str(n),'kind':'execute','title':'sleep 15','status':'in_progress','rawInput':{'command':'sleep 15'}})
  p=subprocess.Popen(['sleep','15']);children.append(p);p.wait()
  update(s,{'sessionUpdate':'tool_call_update','toolCallId':'foreground-sleep-'+str(n),'status':'completed'})
  text(s,'Foreground sleep 15 finished. The earlier background command is still running.')
 send({'id':j['id'],'result':{'stopReason':'end_turn'}})
for line in sys.stdin:
 try:j=json.loads(line)
 except:continue
 m=j.get('method');i=j.get('id');p=j.get('params',{})
 if i is None:continue
 if m=='initialize':r={'protocolVersion':1,'agentCapabilities':{'loadSession':True,'promptCapabilities':{'image':False,'embeddedContext':True}},'authMethods':[{'id':'xai.api_key','name':'Replay'},{'id':'cached_token','name':'Replay'}],'agentInfo':{'name':'Replay','version':'1'}}
 elif m in ['session/new','session/load']:
  s=p.get('sessionId',str(uuid.uuid4()));sessions.setdefault(s,0);r={'sessionId':s,'models':{'currentModelId':'scenario','availableModels':[{'modelId':'scenario','name':'Scenario'}]}}
 elif m=='session/prompt':threading.Thread(target=prompt,args=(j,),daemon=True).start();continue
 elif m=='session/get_config_options':r={'configOptions':[]}
 else:r={}
 send({'id':i,'result':r})
