added support for codex provider. fixed bug in claude code export (lines split when shouldn't be)

This commit is contained in:
JesseMarkowitz
2026-08-18 08:01:34 -04:00
parent d083aea135
commit fe5ed341ad
10 changed files with 1435 additions and 40 deletions
+7 -33
View File
@@ -54,6 +54,7 @@ from src.blocks import (
make_unknown_block,
)
from src.loss_report import LossReport
from src.utils import git_root_name
from src.providers.base import (
BaseProvider,
HIDDEN_CONTENT_FULL,
@@ -395,7 +396,11 @@ def _parse_jsonl(path: Path) -> list[dict]:
except OSError as e:
logger.warning("[claude-code] Could not read %s: %s", path, e)
return records
for line in text.splitlines():
# split("\n"), not splitlines(): splitlines() also breaks on U+0085,
# U+2028/9 and friends, which are legal *inside* a JSON string. A NEL in
# captured command output shreds one record into unparseable fragments and
# loses it silently (observed 2026-08-18 in a real Codex rollout).
for line in text.split("\n"):
line = line.strip()
if not line:
continue
@@ -458,37 +463,6 @@ def _ignored_repos() -> set[str]:
return {s.strip() for s in env.split(",") if s.strip()}
# dir Path → git-repo name it belongs to (or None). Process-wide; the working
# tree doesn't change under us mid-run, so caching walked dirs is safe.
_GIT_ROOT_CACHE: dict[Path, str | None] = {}
_CACHE_MISS = object()
def _git_root_name(path: Path, max_steps: int = 25) -> str | None:
"""Name of the git repo ``path`` lives in — nearest ancestor with ``.git``.
Walks up from ``path`` until a ``.git`` entry is found (returns that dir's
basename) or the filesystem root is reached (returns ``None``). Disk-based:
a path in no git repo, or a repo no longer on disk, yields ``None``.
"""
cur = path
for _ in range(max_steps):
cached = _GIT_ROOT_CACHE.get(cur, _CACHE_MISS)
if cached is not _CACHE_MISS:
return cached
try:
if (cur / ".git").exists():
_GIT_ROOT_CACHE[cur] = cur.name
return cur.name
except OSError:
break
if cur.parent == cur: # filesystem root
break
cur = cur.parent
_GIT_ROOT_CACHE[path] = None
return None
# Absolute path-like tokens inside Bash command strings (file_path/path keys are
# matched directly). git-root resolution short-circuits on non-repo paths.
_ABS_PATH_RE = re.compile(r"/(?:[\w.\-]+/)*[\w.\-]+")
@@ -521,7 +495,7 @@ def _repos_touched(
if p in seen:
return
seen.add(p)
name = _git_root_name(Path(p))
name = git_root_name(Path(p))
if name and not name.startswith(".") and name not in ignore:
counts[name] += 1