(message, index)
| 117 | } |
| 118 | |
| 119 | function createMessageElement(message, index) { |
| 120 | const messageBlock = document.createElement("div"); |
| 121 | messageBlock.className = `message-block ${message.role}`; |
| 122 | |
| 123 | const roleBadge = document.createElement("span"); |
| 124 | roleBadge.className = "message-role-badge"; |
| 125 | roleBadge.textContent = |
| 126 | message.role.charAt(0).toUpperCase() + message.role.slice(1) + " #" + index; |
| 127 | |
| 128 | const messageContent = document.createElement("div"); |
| 129 | messageContent.className = "message-content"; |
| 130 | |
| 131 | // Handle different content types. |
| 132 | // mini-swe-agent v2 (tool-call) assistant messages keep the command in |
| 133 | // extra.actions / tool_calls instead of in a ```bash block in the text, so they need |
| 134 | // their own renderer. v1 messages have neither and fall through to the text paths below. |
| 135 | const toolActions = |
| 136 | message.extra && Array.isArray(message.extra.actions) |
| 137 | ? message.extra.actions |
| 138 | : []; |
| 139 | const hasToolCalls = |
| 140 | Array.isArray(message.tool_calls) && message.tool_calls.length > 0; |
| 141 | if (toolActions.length > 0 || hasToolCalls) { |
| 142 | messageContent.innerHTML = createToolCallContentHTML(message); |
| 143 | } else if (typeof message.content === "string") { |
| 144 | const lines = message.content.split("\n"); |
| 145 | if (lines.length <= 5) { |
| 146 | // Show full content |
| 147 | messageContent.innerHTML = createFullContentHTML( |
| 148 | message.content, |
| 149 | message.role, |
| 150 | ); |
| 151 | } else { |
| 152 | // Show preview with expand |
| 153 | messageContent.innerHTML = createPreviewContentHTML( |
| 154 | message.content, |
| 155 | lines, |
| 156 | message.role, |
| 157 | ); |
| 158 | } |
| 159 | } else if (Array.isArray(message.content)) { |
| 160 | // Handle complex content (e.g., user messages with multiple parts) |
| 161 | messageContent.innerHTML = createComplexContentHTML(message.content); |
| 162 | } else { |
| 163 | // Fallback |
| 164 | messageContent.innerHTML = `<div class="message-content-full"><div class="message-text"><pre>${JSON.stringify( |
| 165 | message.content, |
| 166 | null, |
| 167 | 2, |
| 168 | )}</pre></div></div>`; |
| 169 | } |
| 170 | |
| 171 | messageBlock.appendChild(roleBadge); |
| 172 | messageBlock.appendChild(messageContent); |
| 173 | |
| 174 | return messageBlock; |
| 175 | } |
| 176 |
no test coverage detected