Files
agentic-resources/tests/test_grok_adapter.py
tegwick 06767ef924 session-memory Phase 1: Grok adapter (T02)
- adapters/grok.py: reads the per-session dir (summary.json + chat_history.jsonl
  + events.jsonl + updates.jsonl); conversation from chat_history, lifecycle/
  turn from events, tool-call names paired in order from updates ACP stream
- registered in ingest dispatch; codex+grok sources enabled in config.toml
- tests/test_grok_adapter.py (synthetic + real local sessions)
- live multi-flavor dry-run discovers 89 sessions across flavors

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 22:12:30 +02:00

93 lines
4.0 KiB
Python

"""Grok adapter tests (T02): synthetic session dir + real local sessions."""
import glob
import json
import os
import sys
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from session_memory.adapters.grok import parse_session # noqa: E402
REPO_MAP = {"agentic-resources": "helix_forge", "net-kingdom": "netkingdom",
"can-you-assist": "coulomb_social"}
def _mk_session(dir_path, sid):
os.makedirs(dir_path, exist_ok=True)
with open(os.path.join(dir_path, "summary.json"), "w") as f:
json.dump({"info": {"id": sid, "cwd": "/home/worsch/agentic-resources"},
"created_at": "2026-06-06T10:00:00Z",
"last_active_at": "2026-06-06T10:05:00Z",
"current_model_id": "grok-build", "head_branch": "main"}, f)
with open(os.path.join(dir_path, "events.jsonl"), "w") as f:
f.write(json.dumps({"ts": "2026-06-06T10:00:00Z", "type": "turn_started",
"turn_number": 0, "model_id": "grok-build"}) + "\n")
f.write(json.dumps({"ts": "2026-06-06T10:05:00Z", "type": "turn_ended",
"turn_number": 0}) + "\n")
with open(os.path.join(dir_path, "chat_history.jsonl"), "w") as f:
for rec in [
{"type": "system", "content": "sys prompt"},
{"type": "user", "content": [{"type": "text", "text": "fix the bug"}]},
{"type": "reasoning", "content": [{"type": "text", "text": "thinking..."}]},
{"type": "assistant", "content": ""}, # empty -> skipped
{"type": "tool_result", "content": "The file x.py has been updated"},
{"type": "assistant", "content": "done"},
{"type": "tool_result", "content": "6 passed"},
]:
f.write(json.dumps(rec) + "\n")
with open(os.path.join(dir_path, "updates.jsonl"), "w") as f:
for u in [
{"sessionUpdate": "tool_call", "toolCallId": "c1", "title": "edit_file",
"rawInput": {"target_file": "x.py"}},
{"sessionUpdate": "tool_call", "toolCallId": "c2", "title": "shell",
"rawInput": {"command": "pytest -q"}},
]:
f.write(json.dumps({"timestamp": "t", "method": "session/update",
"params": {"sessionId": sid, "update": u}}) + "\n")
def test_grok_synthetic_dir(tmp_path):
d = tmp_path / "%2Fhome%2Fworsch%2Fagentic-resources" / "sid-1"
_mk_session(str(d), "sid-1")
norm = parse_session(str(d / "chat_history.jsonl"), REPO_MAP)
assert norm is not None
s = norm.session
assert s.session_uid == "grok:sid-1"
assert s.flavor == "grok"
assert s.repo == "agentic-resources" and s.domain == "helix_forge"
assert s.model == "grok-build"
assert s.git_branch == "main"
assert s.cost.turns == 1
assert s.cost.wall_clock_s == 300.0
kinds = [e.kind for e in norm.events]
# 4 lifecycle from events.jsonl? no: turn_started + turn_ended = 2 lifecycle
assert kinds.count("lifecycle") == 2
assert "user_msg" in kinds and "thinking" in kinds and "assistant_msg" in kinds
# paired tool calls recovered names -> edit + test_run, each followed by tool_result
assert "edit" in kinds and "test_run" in kinds
edit = next(e for e in norm.events if e.kind == "edit")
assert edit.tool == "edit_file"
# tool_result after test_run links to it
tr = [e for e in norm.events if e.kind == "tool_result"]
assert len(tr) == 2
def test_real_local_grok_sessions_if_available():
base = os.path.expanduser("~/.grok/sessions")
chats = glob.glob(os.path.join(base, "*", "*", "chat_history.jsonl"))
if not chats:
return
parsed = 0
for c in chats:
norm = parse_session(c, REPO_MAP)
if norm is None:
continue
parsed += 1
assert norm.session.session_uid.startswith("grok:")
seqs = [e.seq for e in norm.events]
assert seqs == sorted(seqs) and len(seqs) == len(set(seqs))
assert parsed >= 1