import sqlite3,json,sys
from pathlib import Path
qid=int(sys.argv[1]); Q='/opt/struktur/obsidian-graphiti-import/obsidian_graphiti_import.db'; R='/opt/struktur/graphiti/request-data/requests.db'; EV='/opt/struktur/graphiti/request-data/processing-events.jsonl'
q=sqlite3.connect('file:'+Q+'?mode=ro',uri=True); q.row_factory=sqlite3.Row; print('QUEUE',json.dumps(dict(q.execute('select id,relative_path,status,attempts,size,last_error,last_error_phase,graphiti_status,graphiti_episode_uuid from files where id=?',(qid,)).fetchone()),ensure_ascii=False)); q.close()
r=sqlite3.connect('file:'+R+'?mode=ro',uri=True); r.row_factory=sqlite3.Row; req=dict(r.execute('select request_id,run_id,queue_id,started_at,completed_at,status,http_status,llm_request_count,model,provider,episode_uuid,error_phase,error_message from graphiti_requests where queue_id=? order by rowid desc limit 1',(str(qid),)).fetchone()); print('REQUEST',json.dumps(req,ensure_ascii=False)); r.close()
ev=[]
for line in Path(EV).read_text(errors='replace').splitlines():
try:
x=json.loads(line)
if x.get('request_id')==req['request_id']: ev.append(x)
except: pass
llm=[x for x in ev if x.get('phase','').startswith('llm_call') and x.get('outcome')=='completed']; edge=[x for x in llm if x.get('graphiti_phase')=='edge_extraction']; print('TELEMETRY',json.dumps({'events':len(ev),'llm_completed':len(llm),'edge':edge,'max_tokens':sorted(set(x.get('max_tokens') for x in llm)),'max_output':max([x.get('output_tokens') or 0 for x in llm],default=0),'truncation':any(x.get('error_class')=='LLM_OUTPUT_TRUNCATED' for x in ev),'json_error':any('JSONDecodeError' in str(x) for x in ev),'edge_total':max([x.get('edge_total') or 0 for x in ev],default=0),'edge_completed':len([x for x in ev if x.get('phase')=='edge_completed' and x.get('outcome')=='completed']),'neo4j_commit':[(x.get('outcome'),x.get('error_message')) for x in ev if x.get('phase')=='neo4j_write_commit']},ensure_ascii=False)); print('HEALTH',__import__('urllib.request').request.urlopen('http://127.0.0.1:8644/health').read().decode()); print('BLOCK',Path('/opt/struktur/obsidian-graphiti-import/import_run_block.json').read_text())