import sqlite3,json,datetime,urllib.request
DB='/opt/struktur/youtube-research/knowledge.db'; now=datetime.datetime.now(datetime.timezone.utc).isoformat()
c=sqlite3.connect('file:'+DB+'?mode=ro',uri=True); c.row_factory=sqlite3.Row
allcols=[r[1] for r in c.execute('pragma table_info(graphiti_import_queue)')]
rows=[]
for r in c.execute("select * from graphiti_import_queue where graphiti_status='processing' order by id"):
d=dict(r); rows.append({k:d.get(k) for k in ['id','video_id','source_type','obsidian_path','graphiti_status','attempt_count','graphiti_attempts','locked_at','lock_owner','lock_token','lease_expires_at','heartbeat_at','updated_at','last_attempt_at','last_http_status','last_error_class','last_error_message','remote_outcome','graphiti_episode_id','content_hash','content_version_hash','payload_hash','import_identity','graphiti_release'] if k in d})
out={'checked_at_utc':now,'columns':allcols,'rows':rows}
try:
with urllib.request.urlopen('http://127.0.0.1:8644/episodes/inventory',timeout=30) as r: inv=json.loads(r.read()).get('episodes',[])
for row in out['rows']:
iid=row.get('import_identity'); row['episode_matches']=[]
for e in inv:
if iid and iid in json.dumps(e,ensure_ascii=False,sort_keys=True): row['episode_matches'].append({'uuid':e.get('uuid'),'name':e.get('name')})
except Exception as e: out['inventory_error']=type(e).__name__+': '+str(e)
try:
d=sqlite3.connect('file:/opt/struktur/graphiti/request-data/requests.db?mode=ro',uri=True); d.row_factory=sqlite3.Row
ids=[r['id'] for r in out['rows']]
if ids:
marks=','.join('?'*len(ids)); out['requests']=[dict(r) for r in d.execute('select request_id,queue_id,status,http_status,error_phase,terminal_reason,started_at,completed_at,llm_request_count,error_message,episode_uuid from graphiti_requests where queue_id in ('+marks+') order by started_at desc',ids)]
else: out['requests']=[]
except Exception as e: out['request_error']=type(e).__name__+': '+str(e)
print(json.dumps(out,ensure_ascii=False,indent=2))