from pathlib import Path
p=Path('/opt/struktur/obsidian-graphiti-import/aa043/aa043_single_writer.py')
s=p.read_text()
old=""" except (urllib.error.URLError,TimeoutError,Exception) as exc:
  c.execute(\"update graphiti_import_queue set graphiti_status='processing',remote_outcome='UNKNOWN_REMOTE_OUTCOME',unknown_since=?,last_error_class='unknown_remote_outcome',last_error_message=?,updated_at=? where id=?\",(now(),str(exc)[:1000],now(),qid)); c.commit(); raise
"""
new=""" except urllib.error.HTTPError as exc:
  body=exc.read().decode('utf-8','replace')[:4000]
  is_rate=(exc.code == 429 or 'provider_rate_limit' in body or 'RateLimitError' in body or 'temporarily rate-limited' in body or '\"code\": 429' in body)
  if is_rate:
   try: detail=json.loads(body)
   except Exception: detail={}
   retry_after=float(detail.get('retry_after') or detail.get('rate_limit_reset') or 0) if isinstance(detail,dict) else 0
   delay=max(900.0,retry_after)
   next_at=(datetime.now(timezone.utc)+timedelta(seconds=delay)).isoformat()
   msg='provider_rate_limit http_status=%s body=%s' % (exc.code,body)
   c.execute(\"update graphiti_import_queue set graphiti_status='retry_wait',remote_outcome='PROVIDER_RATE_LIMIT',next_attempt_at=?,last_http_status=?,last_error_class='provider_rate_limit',last_error_message=?,unknown_since=NULL,lock_owner=NULL,lock_token=NULL,lease_expires_at=NULL,heartbeat_at=NULL,updated_at=? where id=?\",(next_at,exc.code,msg[:1000],now(),qid)); c.commit(); raise
  msg='http_status=%s body=%s' % (exc.code,body)
  c.execute(\"update graphiti_import_queue set graphiti_status='processing',remote_outcome='UNKNOWN_REMOTE_OUTCOME',unknown_since=?,last_error_class='unknown_remote_outcome',last_error_message=?,last_http_status=?,updated_at=? where id=?\",(now(),msg[:1000],exc.code,now(),qid)); c.commit(); raise
 except (urllib.error.URLError,TimeoutError,Exception) as exc:
  c.execute(\"update graphiti_import_queue set graphiti_status='processing',remote_outcome='UNKNOWN_REMOTE_OUTCOME',unknown_since=?,last_error_class='unknown_remote_outcome',last_error_message=?,updated_at=? where id=?\",(now(),str(exc)[:1000],now(),qid)); c.commit(); raise
"""
if old not in s: raise SystemExit('writer block not found')
p.write_text(s.replace(old,new,1))
