#!/usr/bin/env python3
"""ACP stub harness; no live Antigravity backend. Synthetic W2 quota variants only."""
import sys, os, json, pathlib, datetime, sqlite3
ROOT=pathlib.Path('/tmp/lead-33596-r2/capture-2')
if '--version' in sys.argv:
 print('ACP fixture 1.0.0'); sys.exit()
run=ROOT/('stub-'+datetime.datetime.now(datetime.timezone.utc).strftime('%Y%m%dT%H%M%S%fZ'))
run.mkdir()
log=open(run/'protocol.jsonl','a',buffering=1)
profile=pathlib.Path(os.environ.get('GEMINI_HOME',str(run/'profile')))
conversations=profile/'antigravity-acp'/'conversations'
conversations.mkdir(parents=True,exist_ok=True)
session='fixture-'+str(os.getpid())
model={'currentModelId':'fixture-model','availableModels':[{'modelId':'fixture-model','name':'Fixture model'}]}
modes={'currentModeId':'default','availableModes':[{'id':'default','name':'Default'},{'id':'yolo','name':'YOLO'}]}
options=[{'configId':'model','name':'Model','category':'model','type':'select','currentValue':'fixture-model','options':[{'value':'fixture-model','name':'Fixture model'}]}]
def record(event,**extra):
 log.write(json.dumps({'at':datetime.datetime.now(datetime.timezone.utc).isoformat(),'event':event,**extra})+'\n')
record('start',pid=os.getpid(),profile=str(profile),argv=sys.argv[1:])
def reply(req,result):
 print(json.dumps({'jsonrpc':'2.0','id':req['id'],'result':result}),flush=True)
for line in sys.stdin:
 try:
  req=json.loads(line); method=req.get('method'); record('request',method=method,id=req.get('id'))
  if 'id' not in req: continue
  if method=='initialize':
   reply(req,{'protocolVersion':req.get('params',{}).get('protocolVersion',1),'agentInfo':{'name':'ACP fixture','version':'1.0.0'},'info':{'name':'ACP fixture','version':'1.0.0'},'agentCapabilities':{'loadSession':True},'capabilities':{'session':{}},'authMethods':[{'id':'oauth-personal','methodId':'oauth-personal','type':'agent','name':'Fixture authentication'}],'_meta':{'modelState':model}})
  elif method in ['session/new','session/load','session/resume']:
   session=req.get('params',{}).get('sessionId',session)
   reply(req,{'sessionId':session,'models':model,'modes':modes,'configOptions':options})
  elif method=='session/prompt':
   session=req['params']['sessionId']
   prompt=json.dumps(req['params'])
   row='W2b' if 'W2b' in prompt else 'W2a'
   reset='quotaResetDelay:1h' if row=='W2b' else 'quotaResetTimeStamp:2026-11-10T05:05:00Z'
   text=f'Error 429, Message: Quota exhausted for test model., Status: RESOURCE_EXHAUSTED, Details: [map[@type:type.googleapis.com/google.rpc.ErrorInfo domain:googleapis.com metadata:map[{reset}] reason:QUOTA_EXHAUSTED]]'
   db=sqlite3.connect(str(conversations/(session+'.db')))
   db.execute('CREATE TABLE IF NOT EXISTS steps (idx INTEGER PRIMARY KEY, step_type INTEGER, step_payload BLOB)')
   idx=db.execute('SELECT coalesce(max(idx),0)+1 FROM steps').fetchone()[0]
   db.execute('INSERT INTO steps VALUES (?,?,?)',(idx,17,text.encode()))
   db.commit(); db.close()
   record('quota_step_appended_prompt_left_unresolved',row=row,sessionId=session,stepType=17,idx=idx,payload=text)
  else: reply(req,{'configOptions':options} if method=='session/set_config_option' else {})
 except Exception as e: record('error',message=str(e))
record('stdin_closed')
