Skip to content

Commit 3f1a739

Browse files
committed
Enh(viewer): Include full programming files
1 parent 6039351 commit 3f1a739

2 files changed

Lines changed: 71 additions & 0 deletions

File tree

codeclash/viewer/app.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,17 @@ class TrajectoryInfo:
6262
submission: str | None
6363
memory: str | None
6464
messages: list[dict[str, Any]]
65+
diff: str | None = None
66+
incremental_diff: str | None = None
67+
modified_files: dict[str, str] | None = None
6568

6669

6770
class LogParser:
6871
"""Parses game log files into structured data"""
6972

7073
def __init__(self, log_dir: Path):
7174
self.log_dir = Path(log_dir)
75+
self._player_metadata = {}
7276

7377
def parse_game_metadata(self) -> GameMetadata:
7478
"""Parse overall game metadata"""
@@ -79,6 +83,13 @@ def parse_game_metadata(self) -> GameMetadata:
7983
else:
8084
results = {"status": "No metadata file found"}
8185

86+
# Store player metadata for later use
87+
self._player_metadata = {}
88+
if "agents" in results:
89+
for agent in results["agents"]:
90+
player_name = agent.get("name", "")
91+
self._player_metadata[player_name] = agent
92+
8293
# Parse tournament.log if it exists
8394
main_log_file = self.log_dir / "tournament.log"
8495
main_log = main_log_file.read_text() if main_log_file.exists() else "No tournament log found"
@@ -128,6 +139,18 @@ def parse_trajectory(self, player_id: int, round_num: int) -> TrajectoryInfo | N
128139
info = data.get("info", {})
129140
model_stats = info.get("model_stats", {})
130141

142+
# Get diff data from player metadata if available
143+
player_name = f"p{player_id}"
144+
diff = None
145+
incremental_diff = None
146+
modified_files = None
147+
148+
if player_name in self._player_metadata:
149+
player_meta = self._player_metadata[player_name]
150+
diff = player_meta.get("diff", {}).get(str(round_num), "")
151+
incremental_diff = player_meta.get("incremental_diff", {}).get(str(round_num), "")
152+
modified_files = player_meta.get("modified_files", {}).get(str(round_num), {})
153+
131154
return TrajectoryInfo(
132155
player_id=player_id,
133156
round_num=round_num,
@@ -137,6 +160,9 @@ def parse_trajectory(self, player_id: int, round_num: int) -> TrajectoryInfo | N
137160
submission=info.get("submission"),
138161
memory=info.get("memory"),
139162
messages=data.get("messages", []),
163+
diff=diff,
164+
incremental_diff=incremental_diff,
165+
modified_files=modified_files,
140166
)
141167
except (json.JSONDecodeError, KeyError) as e:
142168
print(f"Error parsing {traj_file}: {e}")

codeclash/viewer/templates/index.html

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,53 @@ <h3>🤖 Player {{ trajectory.player_id }} Round {{ round_num }}</h3>
236236
</div>
237237
</div>
238238
</details>
239+
240+
<!-- Diff Foldout inside the same container -->
241+
{% if trajectory.diff and trajectory.diff.strip() %}
242+
<details class="trajectory-messages-foldout">
243+
<summary>📝 Diff (Full)</summary>
244+
<div class="trajectory-content">
245+
<div class="log-content">
246+
<pre><code>{{ trajectory.diff }}</code></pre>
247+
</div>
248+
</div>
249+
</details>
250+
{% endif %}
251+
252+
<!-- Incremental Diff Foldout inside the same container -->
253+
{% if trajectory.incremental_diff and trajectory.incremental_diff.strip() %}
254+
<details class="trajectory-messages-foldout">
255+
<summary>🔄 Incremental Diff</summary>
256+
<div class="trajectory-content">
257+
<div class="log-content">
258+
<pre><code>{{ trajectory.incremental_diff }}</code></pre>
259+
</div>
260+
</div>
261+
</details>
262+
{% endif %}
263+
264+
<!-- Modified Files Foldout inside the same container -->
265+
{% if trajectory.modified_files and trajectory.modified_files %}
266+
<details class="trajectory-messages-foldout">
267+
<summary>📁 Changed Files ({{ trajectory.modified_files|length }} files)</summary>
268+
<div class="trajectory-content">
269+
<div class="log-content">
270+
{% for file_path, file_content in trajectory.modified_files.items() %}
271+
<details class="foldout">
272+
<summary>{{ file_path }}</summary>
273+
<div class="log-content">
274+
<pre><code>{{ file_content }}</code></pre>
275+
</div>
276+
</details>
277+
{% endfor %}
278+
</div>
279+
</div>
280+
</details>
281+
{% endif %}
282+
239283
</div>
240284

285+
241286
<!-- Submission -->
242287
{% if trajectory.submission %}
243288
<details class="foldout">

0 commit comments

Comments
 (0)