#!/usr/bin/python3
# Synthetic ACP agent: recursively watches its startup cwd using real Linux inotify.
import os,sys,json,ctypes,time
libc=ctypes.CDLL(None,use_errno=True)
fd=libc.inotify_init1(0)
count=0
for root,dirs,files in os.walk(os.getcwd()):
    if libc.inotify_add_watch(fd,os.fsencode(root),0x00000100|0x00000200)>=0: count+=1

def record(method,params):
    proc=f'/proc/{os.getpid()}'
    info=open(f'{proc}/fdinfo/{fd}').read()
    row={'time':time.time(),'pid':os.getpid(),'method':method,'cwd':os.readlink(proc+'/cwd'),'watchCount':sum(x.startswith('inotify ') for x in info.splitlines()),'fdinfo':info,'sessionCwd':params.get('cwd')}
    with open(os.environ['ACP_EVIDENCE_LOG'],'a') as out: out.write(json.dumps(row)+'\n')
record('spawn',{})
for line in sys.stdin:
    try: req=json.loads(line)
    except Exception: continue
    method=req.get('method'); params=req.get('params',{})
    record(method,params)
    if 'id' not in req: continue
    if method=='initialize': result={'protocolVersion':1,'agentCapabilities':{},'agentInfo':{'name':'indexing-evidence-agent','version':'1.0.0'},'authMethods':[{'id':'synthetic','name':'Synthetic sign-in'}]}
    elif method=='authenticate': result={}
    elif method=='session/new':
        result={'sessionId':'evidence-session','models':{'currentModelId':'evidence','availableModels':[{'modelId':'evidence','name':'Evidence'}]}}
    elif method=='session/prompt': result={'stopReason':'end_turn'}
    else: result={}
    print(json.dumps({'jsonrpc':'2.0','id':req['id'],'result':result}),flush=True)
    if method=='session/new': print(json.dumps({'jsonrpc':'2.0','method':'session/update','params':{'sessionId':'evidence-session','update':{'sessionUpdate':'available_commands_update','availableCommands':[]}}}),flush=True)
