"""Read only synthetic OpenCode sessions; publish tool search paths, never model metadata."""
import argparse, sqlite3, json, datetime
p=argparse.ArgumentParser();p.add_argument('db');p.add_argument('output');args=p.parse_args()
c=sqlite3.connect('file:'+args.db+'?mode=ro',uri=True)
out=[]
for sid,created in c.execute('select id,time_created from session_v2 order by time_created'):
 result={'session':sid,'createdUtc':datetime.datetime.fromtimestamp(created/1000,datetime.timezone.utc).isoformat(),'messages':[]}
 for seq,typ,data in c.execute('select seq,type,data from session_message where session_id=? order by seq',(sid,)):
  d=json.loads(data);item={'seq':seq,'type':typ,'time':d.get('time')}
  if typ=='user': item['text']=d.get('text')
  if typ=='system' and 'tool catalog has changed' in d.get('text',''): item['text']='The Code Mode tool catalog has changed.'
  for tool in d.get('content',[]):
   if tool['type']!='tool': continue
   state=tool.get('state',{});code=state.get('input',{}).get('code','')
   if 'search(' in code:
    searches=[]
    for content in state.get('content',[]):
     if content.get('type')=='text':
      try:
       v=json.loads(content['text']);searches.append({'paths':[i['path'] for i in v.get('items',[])],'remaining':v.get('remaining')})
      except (ValueError,TypeError): pass
    item['search']={'code':code,'results':searches}
   if '.orchestrator_capabilities(' in code:
    item['capabilityCall']={'code':code,'status':state.get('status')}
  if typ in ('user','idle') or any(k in item for k in ('text','search','capabilityCall')):result['messages'].append(item)
 out.append(result)
json.dump(out,open(args.output,'w'),indent=2)
