fix(agents): open agy, codex and hermes databases read-only (Issue #64)
This commit is contained in:
1 parent
3ce5d5fdc1
commit
b0eccc5301
8 files changed
+461
-56
No files matched your search
@@ -1,7 +1,6 @@
|
||||
import os, sys, sqlite3, shutil, subprocess, tempfile
|
||||
from urllib.parse import quote
|
||||
import os, sys, sqlite3, shutil, subprocess
|
||||
from typing import Optional, Any, List
|
||||
from lib_py.agents.base import BaseAgentAdapter, DiscoveryContext, scan_names, db_rows_naming, conversation_in_use
|
||||
from lib_py.agents.base import BaseAgentAdapter, DiscoveryContext, _ro_connect, scan_names, db_rows_naming, conversation_in_use
|
||||
from lib_py.verify_session import workspace_key
|
||||
|
||||
# Tables a 1.x opencode wrote and a migration to 2.x keeps but no longer
|
||||
@@ -10,31 +9,6 @@ _LEGACY_TABLES = (("message", "session_id"), ("messages", "session_id"), ("part"
|
||||
("parts", "session_id"), ("todo", "session_id"), ("session_share", "session_id"),
|
||||
("session", "id"), ("sessions", "id"))
|
||||
|
||||
def _ro_connect(db: str):
|
||||
"""A read that neither creates nor removes anything beside db (Issue #60).
|
||||
Both WAL sidecars (a live writer keeps them): read through them. No -wal:
|
||||
nothing to apply, so the file is read as immutable. A -wal without its
|
||||
-shm (left behind - no writer runs without one) still holds committed
|
||||
rows: they are read from a private copy, where SQLite may rebuild the
|
||||
index, loaded into memory."""
|
||||
path = os.path.abspath(db)
|
||||
wal, shm = os.path.exists(path + "-wal"), os.path.exists(path + "-shm")
|
||||
if wal and shm:
|
||||
return sqlite3.connect(f"file:{quote(path)}?mode=ro", uri=True)
|
||||
if not wal:
|
||||
return sqlite3.connect(f"file:{quote(path)}?mode=ro&immutable=1", uri=True)
|
||||
mem = sqlite3.connect(":memory:")
|
||||
with tempfile.TemporaryDirectory(prefix="mam-opencode-") as tmp:
|
||||
copy = os.path.join(tmp, "opencode.db")
|
||||
shutil.copyfile(path, copy)
|
||||
shutil.copyfile(path + "-wal", copy + "-wal")
|
||||
src = sqlite3.connect(copy)
|
||||
try:
|
||||
src.backup(mem)
|
||||
finally:
|
||||
src.close()
|
||||
return mem
|
||||
|
||||
|
||||
# (binary, HOME, XDG_DATA_HOME) -> the db `debug paths` printed for them.
|
||||
_DB_PATHS = {}
|
||||
|
||||
Reference in new issue
Block a user