@@ -72,13 +72,153 @@ <h2>🎯 Game Rounds</h2>
7272 {% if round_num in trajectories_by_round %}
7373 {% for trajectory in trajectories_by_round[round_num] %}
7474
75- <!-- Trajectory View -->
76- < details class ="foldout trajectory-foldout ">
77- < summary > 🤖 Player {{ trajectory.player_id }} Round {{ round_num }} - Trajectory</ summary >
78- < div class ="trajectory-content ">
79- {% include 'trajectory.html' %}
75+ <!-- Trajectory Container with Overview and Messages -->
76+ < div class ="trajectory-header ">
77+ < h3 > 🤖 Player {{ trajectory.player_id }} Round {{ round_num }}</ h3 >
78+ < div class ="trajectory-stats ">
79+ < div class ="stat-item ">
80+ < span class ="stat-label "> API Calls:</ span >
81+ < span class ="stat-value "> {{ trajectory.api_calls }}</ span >
82+ </ div >
83+ < div class ="stat-item ">
84+ < span class ="stat-label "> Cost:</ span >
85+ < span class ="stat-value "> ${{ "%.2f"|format(trajectory.cost) }}</ span >
86+ </ div >
87+ {% if trajectory.exit_status %}
88+ < div class ="stat-item ">
89+ < span class ="stat-label "> Exit Status:</ span >
90+ < span class ="stat-value status-{{ trajectory.exit_status.lower() }} "> {{ trajectory.exit_status }}</ span >
91+ </ div >
92+ {% endif %}
8093 </ div >
81- </ details >
94+
95+ <!-- Messages Foldout inside the same container -->
96+ < details class ="trajectory-messages-foldout ">
97+ < summary > 💬 Messages ({{ trajectory.messages|length }} total)</ summary >
98+ < div class ="trajectory-content ">
99+ < div class ="messages-container ">
100+ {% for message in trajectory.messages %}
101+ < div class ="message-block {{ message.role }} ">
102+ < span class ="message-role-badge "> {{ message.role.title() }} #{{ loop.index }}</ span >
103+ < div class ="message-content ">
104+ {% if message.content is string %}
105+ {% set content_lines = message.content.split('\n') %}
106+ {% if content_lines|length < = 5 %}
107+ <!-- Show full content if 5 lines or less -->
108+ < div class ="message-content-full ">
109+ {% if message.role == 'assistant' and '```' in message.content %}
110+ <!-- Special handling for assistant messages with code blocks -->
111+ {% set parts = message.content.split('```') %}
112+ {% for part in parts %}
113+ {% if loop.index is odd %}
114+ <!-- Text part -->
115+ < div class ="message-text "> < pre > {{ part }}</ pre > </ div >
116+ {% else %}
117+ <!-- Code part -->
118+ < div class ="code-block ">
119+ < pre > < code > {{ part }}</ code > </ pre >
120+ </ div >
121+ {% endif %}
122+ {% endfor %}
123+ {% else %}
124+ <!-- Regular text content -->
125+ < div class ="message-text ">
126+ < pre > {{ message.content }}</ pre >
127+ </ div >
128+ {% endif %}
129+ </ div >
130+ {% else %}
131+ <!-- Show preview with expand button -->
132+ < div class ="message-preview-short clickable-message " onclick ="expandMessage(this) " title ="Click to expand ({{ content_lines|length - 5 }} more lines) ">
133+ < div class ="message-text ">
134+ < pre > {{ content_lines[:5] | join('\n') }}</ pre >
135+ </ div >
136+ < div class ="expand-indicator ">
137+ ▼ {{ content_lines|length - 5 }} more lines
138+ </ div >
139+ </ div >
140+ < div class ="message-content-full " style ="display: none; " title ="Content expanded - click collapse button below to hide ">
141+ {% if message.role == 'assistant' and '```' in message.content %}
142+ <!-- Special handling for assistant messages with code blocks -->
143+ {% set parts = message.content.split('```') %}
144+ {% for part in parts %}
145+ {% if loop.index is odd %}
146+ <!-- Text part -->
147+ < div class ="message-text "> < pre > {{ part }}</ pre > </ div >
148+ {% else %}
149+ <!-- Code part -->
150+ < div class ="code-block ">
151+ < pre > < code > {{ part }}</ code > </ pre >
152+ </ div >
153+ {% endif %}
154+ {% endfor %}
155+ {% else %}
156+ <!-- Regular text content -->
157+ < div class ="message-text ">
158+ < pre > {{ message.content }}</ pre >
159+ </ div >
160+ {% endif %}
161+ < div class ="collapse-indicator clickable-message " onclick ="collapseMessage(this) " title ="Click to collapse ">
162+ ▲ Click to collapse
163+ </ div >
164+ </ div >
165+ {% endif %}
166+ {% elif message.content is iterable %}
167+ <!-- Handle complex content (e.g., user messages with multiple parts) -->
168+ < div class ="message-content-full ">
169+ {% for content_part in message.content %}
170+ {% if content_part.type == 'text' %}
171+ {% set content_lines = content_part.text.split('\n') %}
172+ {% if content_lines|length < = 5 %}
173+ < div class ="message-text ">
174+ < pre > {{ content_part.text }}</ pre >
175+ </ div >
176+ {% else %}
177+ < div class ="message-preview-short clickable-message " onclick ="expandMessage(this) " title ="Click to expand ({{ content_lines|length - 5 }} more lines) ">
178+ < div class ="message-text ">
179+ < pre > {{ content_lines[:5] | join('\n') }}</ pre >
180+ </ div >
181+ < div class ="expand-indicator ">
182+ ▼ {{ content_lines|length - 5 }} more lines
183+ </ div >
184+ </ div >
185+ < div class ="message-content-expanded " style ="display: none; " title ="Content expanded - click collapse button below to hide ">
186+ < div class ="message-text ">
187+ < pre > {{ content_part.text }}</ pre >
188+ </ div >
189+ < div class ="collapse-indicator clickable-message " onclick ="collapseMessage(this) " title ="Click to collapse ">
190+ ▲ Click to collapse
191+ </ div >
192+ </ div >
193+ {% endif %}
194+ {% else %}
195+ < div class ="message-part ">
196+ < strong > {{ content_part.type.title() }}:</ strong >
197+ < pre > {{ content_part | tojson(indent=2) }}</ pre >
198+ </ div >
199+ {% endif %}
200+ {% endfor %}
201+ </ div >
202+ {% else %}
203+ <!-- Fallback for other content types -->
204+ < div class ="message-content-full ">
205+ < div class ="message-text ">
206+ < pre > {{ message.content | tojson(indent=2) }}</ pre >
207+ </ div >
208+ </ div >
209+ {% endif %}
210+ </ div >
211+ </ div >
212+ {% endfor %}
213+ </ div >
214+ < div class ="collapse-messages-button ">
215+ < button onclick ="collapseTrajectoryMessages(this) " class ="btn-collapse-messages ">
216+ ▲ Collapse Messages
217+ </ button >
218+ </ div >
219+ </ div >
220+ </ details >
221+ </ div >
82222
83223 <!-- Submission -->
84224 {% if trajectory.submission %}
0 commit comments