@@ -190,7 +190,7 @@ def _parse_steps_by_chat_pairs(self, agent_logs: list[LogPart]) -> list[dict]:
190190 current_step_parts = []
191191
192192 for log_part in logs_to_process :
193- if "agent-step" in log_part .content :
193+ if "agent-step" in log_part .content or "Trial ID:" in log_part . content :
194194 continue
195195
196196 # A chat_response marks the beginning of a new step.
@@ -210,52 +210,77 @@ def _parse_steps_by_chat_pairs(self, agent_logs: list[LogPart]) -> list[dict]:
210210
211211 return steps
212212
213- def _syntax_highlight_content (self , content : str ) -> str :
214- """Syntax highlights the content."""
215-
216- content = html .escape (content )
217-
218- # Simple pre-formatted blocks
219- content = re .sub (r'<conclusion>(.*?)</conclusion>' ,
220- r'<pre class="conclusion-block">\1</pre>' ,
221- content ,
222- flags = re .DOTALL )
223- content = re .sub (r'<reason>(.*?)</reason>' ,
224- r'<pre class="reason-block">\1</pre>' ,
225- content ,
226- flags = re .DOTALL )
227-
228- # Code blocks with language specification
229- content = re .sub (r'<bash>(.*?)</bash>' ,
230- r'<pre><code class="language-bash">\1</code></pre>' ,
231- content ,
232- flags = re .DOTALL )
233- content = re .sub (r'<build_script>(.*?)</build_script>' ,
234- r'<pre><code class="language-c++">\1</code></pre>' ,
235- content ,
236- flags = re .DOTALL )
237- content = re .sub (r'<fuzz_target>(.*?)</fuzz_target>' ,
238- r'<pre><code class="language-c++">\1</code></pre>' ,
239- content ,
240- flags = re .DOTALL )
241-
242- # Standard output/error with return code
243- content = re .sub (
244- r'<stdout>(.*?)</stdout>' ,
245- r'<h4>Standard Output</h4><pre><code class="language-bash">\1</code></pre>' ,
246- content ,
247- flags = re .DOTALL )
248- content = re .sub (
249- r'<stderr>(.*?)</stderr>' ,
250- r'<h4>Standard Error</h4><pre><code class="language-bash">\1</code></pre>' ,
251- content ,
252- flags = re .DOTALL )
253- content = re .sub (r'<return_code>(.*?)</return_code>' ,
254- r'<h4>Return Code</h4><pre><code>\1</code></pre>' ,
255- content ,
256- flags = re .DOTALL )
257-
258- return content
213+ def _syntax_highlight_content (self , content : str , default_language : str = "" ) -> str :
214+ """Syntax highlights content while preserving visible tags."""
215+
216+ # Escape everything first so raw logs are safe to render in HTML
217+ escaped = html .escape (content )
218+
219+ # Helper to simplify substitutions
220+ def _sub (pattern : str , repl : str , text : str ) -> str :
221+ return re .sub (pattern , repl , text , flags = re .DOTALL )
222+
223+ def _normalize_lang (lang : str ) -> str :
224+ if not lang :
225+ return 'cpp'
226+ lang = lang .strip ().lower ()
227+ if lang in ['c++' , 'cpp' , 'cxx' ]:
228+ return 'cpp'
229+ if lang in ['c' ]:
230+ return 'c'
231+ if lang in ['python' , 'py' ]:
232+ return 'python'
233+ if lang in ['java' ]:
234+ return 'java'
235+ if lang in ['rust' , 'rs' ]:
236+ return 'rust'
237+ if lang in ['go' , 'golang' ]:
238+ return 'go'
239+ return 'cpp'
240+
241+ lang_key = _normalize_lang (default_language )
242+
243+ escaped = _sub (r'<conclusion>(\s*[^\s].*?[^\s]\s*|(?:\s*[^\s].*?)?)</conclusion>' ,
244+ r'<span class="log-tag"><conclusion></span>'
245+ r'<pre class="whitespace-pre-wrap break-words overflow-x-auto reason-block">\1</pre>'
246+ r'<span class="log-tag"></conclusion></span>' , escaped )
247+ escaped = _sub (r'<reason>(\s*[^\s].*?[^\s]\s*|(?:\s*[^\s].*?)?)</reason>' ,
248+ r'<span class="log-tag"><reason></span>'
249+ r'<div class="markdown-block whitespace-pre-wrap break-words overflow-x-auto">\1</div>'
250+ r'<span class="log-tag"></reason></span>' , escaped )
251+
252+ escaped = _sub (r'<bash>(\s*[^\s].*?[^\s]\s*|(?:\s*[^\s].*?)?)</bash>' ,
253+ r'<span class="log-tag"><bash></span>'
254+ r'<pre class="whitespace-pre-wrap break-words overflow-x-auto"><code class="language-bash">\1</code></pre>'
255+ r'<span class="log-tag"></bash></span>' ,
256+ escaped )
257+ escaped = _sub (r'<build_script>(\s*[^\s].*?[^\s]\s*|(?:\s*[^\s].*?)?)</build_script>' ,
258+ r'<span class="log-tag"><build_script></span>'
259+ r'<pre class="whitespace-pre-wrap break-words overflow-x-auto"><code class="language-cpp">\1</code></pre>'
260+ r'<span class="log-tag"></build_script></span>' ,
261+ escaped )
262+ escaped = _sub (r'<fuzz target>(\s*[^\s].*?[^\s]\s*|(?:\s*[^\s].*?)?)</fuzz target>' ,
263+ rf'<span class="log-tag"><fuzz target></span>'
264+ rf'<pre class="whitespace-pre-wrap break-words overflow-x-auto"><code class="language-{ lang_key } ">\1</code></pre>'
265+ rf'<span class="log-tag"></fuzz target></span>' ,
266+ escaped )
267+
268+ escaped = _sub (r'<stdout>(\s*[^\s].*?[^\s]\s*|(?:\s*[^\s].*?)?)</stdout>' ,
269+ r'<span class="log-tag"><stdout></span>'
270+ r'<pre class="whitespace-pre-wrap break-words overflow-x-auto"><code class="language-bash">\1</code></pre>'
271+ r'<span class="log-tag"></stdout></span>' ,
272+ escaped )
273+ escaped = _sub (r'<stderr>(\s*[^\s].*?[^\s]\s*|(?:\s*[^\s].*?)?)</stderr>' ,
274+ r'<span class="log-tag"><stderr></span>'
275+ r'<pre class="whitespace-pre-wrap break-words overflow-x-auto"><code class="language-bash">\1</code></pre>'
276+ r'<span class="log-tag"></stderr></span>' ,
277+ escaped )
278+ escaped = _sub (r'<return_code>(\s*[^\s].*?[^\s]\s*|(?:\s*[^\s].*?)?)</return_code>' ,
279+ r'<span class="log-tag"><return_code></span>'
280+ r'<pre class="whitespace-pre-wrap break-words overflow-x-auto"><code>\1</code></pre>'
281+ r'<span class="log-tag"></return_code></span>' , escaped )
282+
283+ return escaped
259284
260285 def _create_step_data (self , step_number : int ,
261286 log_parts : list [LogPart ]) -> dict :
@@ -285,20 +310,6 @@ def get_agent_sections(self) -> dict[str, list[LogPart]]:
285310 current_agent = None
286311 agent_counters = {}
287312
288- # NUMBER OF BASH TOOLS REQUESTED BY LLMS
289- # system prompt is itself
290- # subsequent ones will be LLM request tool -> tool execution
291-
292- # NO REASON IF THERE'S BASH
293- # JUST NEED CONCLUSION
294- # SO INSTEAD STEP 4 - BASH REASON CONCLUSION FUZZ TARGET BUILDSCRIPT -> STEP 4 - BASH, CONCLUSION
295-
296- # bash syntax highlight - shell
297- # build script - c or c++
298- # stdout/stderror - console/shell/bash - BASH
299-
300- # moving to html
301-
302313 for log_part in self ._logs :
303314 lines = log_part .content .split ('\n ' )
304315 agent_headers = []
0 commit comments