§
    øžyjÞ  ã                  ó²   — d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 ddl
mZ dd„Zdd„Z ed¬¦  «         G d„ d¦  «        ¦   «         ZdZddœdd„ZdS ) zñImport-safe helpers for inspecting a Python interpreter's linked SQLite.

This module intentionally depends only on the standard library.  Installer and
update code must be able to use it before Hermes' third-party dependencies are
healthy.
é    )ÚannotationsN)Ú	dataclass)ÚPath)ÚIterableÚpartsúIterable[object]Úreturnútuple[int, int, int]c                óš   — d„ | D ¦   «         }|                      dgdt          |¦  «        z
  z  ¦  «         t          |d d…         ¦  «        S )Nc                ó,   — g | ]}t          |¦  «        ‘ŒS © )Úint)Ú.0Úparts     ú?/home/ragecks/.hermes/hermes-agent/hermes_cli/sqlite_runtime.pyú
<listcomp>z"_version_tuple.<locals>.<listcomp>   s   € Ð*Ð*Ð*˜D�c�$‰iŒiÐ*Ð*Ð*ó    r   é   )ÚextendÚlenÚtuple)r   Úvaluess     r   Ú_version_tupler      sN   € Ø*Ð* EÐ*Ñ*Ô*€FØ
‡M‚M�1�#˜�S ™[œ[™Ñ)Ñ*Ô*Ð*Ý�˜˜˜”ÑÔÐr   Úversion_infoútuple[int, ...]Úboolc                óŒ   — t          | ¦  «        }|dk     rdS |dk    rdS d|cxk    rdk     rn ndS d|cxk    rdk     rn ndS dS )	z>Return whether *version_info* contains SQLite's WAL-reset bug.)r   é   r   F)r   é3   r   )r   é2   r   )r   r   r   )r   é,   é   )r   é-   r   T)r   )r   Úinfos     r   Úis_sqlite_wal_reset_vulnerabler%      s„   € õ ˜,Ñ'Ô'€DØˆiÒÐØˆuØˆzÒÐØˆuØ�TÐ&Ð&Ò&Ð&˜JÒ&Ð&Ð&Ð&Ð&ØˆuØ�TÐ&Ð&Ò&Ð&˜JÒ&Ð&Ð&Ð&Ð&ØˆuØˆ4r   T)Úfrozenc                  óh   — e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ded
<   edd„¦   «         ZdS )ÚSQLiteRuntimeInfoz7SQLite details reported by one exact Python executable.r   Ú
executableÚbase_prefixr
   Úpython_versionÚsqlite_versionÚstrÚsqlite_version_stringÚsqlite_source_idr	   r   c                ó*   — t          | j        ¦  «        S )N)r%   r,   )Úselfs    r   Úwal_reset_vulnerablez&SQLiteRuntimeInfo.wal_reset_vulnerable3   s   € å-¨dÔ.AÑBÔBÐBr   N)r	   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__Úpropertyr2   r   r   r   r(   r(   (   sˆ   € € € € € € àAÐAàÐÐÑØÐÐÑØ(Ð(Ð(Ñ(Ø(Ð(Ð(Ñ(ØÐÐÑØÐÐÑàðCð Cð Cñ „XðCð Cð Cr   r(   aò  
import json
import sqlite3
import sys

conn = sqlite3.connect(":memory:")
try:
    row = conn.execute("SELECT sqlite_source_id()").fetchone()
finally:
    conn.close()

print(json.dumps({
    "base_prefix": sys.base_prefix,
    "executable": sys.executable,
    "python_version": list(sys.version_info[:3]),
    "sqlite_version": list(sqlite3.sqlite_version_info),
    "sqlite_version_string": sqlite3.sqlite_version,
    "sqlite_source_id": str(row[0]) if row and row[0] is not None else "",
}))
g      >@)ÚtimeoutÚpythonú
str | Pathr9   ÚfloatúSQLiteRuntimeInfo | Nonec               ó$  — t          | ¦  «        }t          t          j        ¦  «        }dD ]}|                     |d¦  «         Œ	 t          j        t          |¦  «        ddt          gdd|d|¬¦  «        }n# t          t
          j
        f$ r Y dS w xY w|j        dk    rdS 	 t          j        |j        ¦  «        }t          t          t          |d	         ¦  «        ¦  «        t          t          |d
         ¦  «        ¦  «        t!          |d         ¦  «        t!          |d         ¦  «        t          |d         ¦  «        t          |                     dd¦  «        ¦  «        ¬¦  «        S # t$          t&          t(          t          j        f$ r Y dS w xY w)zÙProbe SQLite in *python*, never the caller's linked SQLite.

    ``None`` means the interpreter could not be executed or returned malformed
    data.  The child runs isolated from inherited Python path overrides.
    )ÚCONDA_DEFAULT_ENVÚCONDA_PREFIXÚ
PYTHONHOMEÚ
PYTHONPATHÚUV_PROJECT_ENVIRONMENTÚ	UV_PYTHONÚVIRTUAL_ENVNz-Iz-cTF)Úcapture_outputÚtextr9   ÚcheckÚenvr   r)   r*   r+   r,   r.   r/   Ú )r)   r*   r+   r,   r.   r/   )r   ÚdictÚosÚenvironÚpopÚ
subprocessÚrunr-   Ú_PROBE_SCRIPTÚOSErrorÚTimeoutExpiredÚ
returncodeÚjsonÚloadsÚstdoutr(   r   ÚgetÚKeyErrorÚ	TypeErrorÚ
ValueErrorÚJSONDecodeError)r:   r9   r)   rI   ÚkeyÚresultÚpayloads          r   Úprobe_sqlite_runtimer`   N   sŸ  € õ �f‘”€JÝ
�rŒzÑ
Ô
€Cðð 	ð 	ˆð 	�Š��TÑÔÐÐð
Ý”Ý�‰_Œ_˜d D­-Ð8ØØØØØð
ñ 
ô 
ˆˆøõ •ZÔ.Ð/ð ð ð ØˆtˆtðøøøàÔ˜AÒÐØˆtðÝ”*˜Vœ]Ñ+Ô+ˆÝ Ý�C ¨Ô 5Ñ6Ô6Ñ7Ô7Ý�S ¨Ô!7Ñ8Ô8Ñ9Ô9Ý)¨'Ð2BÔ*CÑDÔDÝ)¨'Ð2BÔ*CÑDÔDÝ"% gÐ.EÔ&FÑ"GÔ"GÝ  §¢Ð-?ÀÑ!DÔ!DÑEÔEð
ñ 
ô 
ð 	
øõ •i¥­TÔ-AÐBð ð ð Øˆtˆtðøøøs%   Á0A6 Á6BÂBÂ!CE) Å)"FÆF)r   r   r	   r
   )r   r   r	   r   )r:   r;   r9   r<   r	   r=   )r6   Ú
__future__r   rU   rL   rO   Údataclassesr   Úpathlibr   Útypingr   r   r%   r(   rQ   r`   r   r   r   ú<module>re      s  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð ðð ð ð ð  €�$ÐÑÔðCð Cð Cð Cð Cñ Cô Cñ ÔðCð€ð2 ð.ð .ð .ð .ð .ð .ð .ð .r   