| 135 | } |
| 136 | |
| 137 | void ChatModel::addMessage( |
| 138 | const QString &content, |
| 139 | ChatRole role, |
| 140 | const QString &id, |
| 141 | const QList<Context::ContentFile> &attachments, |
| 142 | const QList<ImageAttachment> &images, |
| 143 | bool isRedacted, |
| 144 | const QString &signature) |
| 145 | { |
| 146 | if (!m_messages.isEmpty() && !id.isEmpty() && m_messages.last().id == id |
| 147 | && m_messages.last().role == role) { |
| 148 | Message &lastMessage = m_messages.last(); |
| 149 | lastMessage.content = content; |
| 150 | lastMessage.attachments = attachments; |
| 151 | lastMessage.images = images; |
| 152 | lastMessage.isRedacted = isRedacted; |
| 153 | lastMessage.signature = signature; |
| 154 | emit dataChanged(index(m_messages.size() - 1), index(m_messages.size() - 1)); |
| 155 | } else { |
| 156 | beginInsertRows(QModelIndex(), m_messages.size(), m_messages.size()); |
| 157 | Message newMessage{role, content, id}; |
| 158 | newMessage.attachments = attachments; |
| 159 | newMessage.images = images; |
| 160 | newMessage.isRedacted = isRedacted; |
| 161 | newMessage.signature = signature; |
| 162 | m_messages.append(newMessage); |
| 163 | endInsertRows(); |
| 164 | |
| 165 | if (m_loadingFromHistory && role == ChatRole::FileEdit) { |
| 166 | const QString marker = "QODEASSIST_FILE_EDIT:"; |
| 167 | if (content.contains(marker)) { |
| 168 | int markerPos = content.indexOf(marker); |
| 169 | int jsonStart = markerPos + marker.length(); |
| 170 | |
| 171 | if (jsonStart < content.length()) { |
| 172 | QString jsonStr = content.mid(jsonStart); |
| 173 | QJsonDocument doc = QJsonDocument::fromJson(jsonStr.toUtf8()); |
| 174 | |
| 175 | if (doc.isObject()) { |
| 176 | QJsonObject editData = doc.object(); |
| 177 | QString editId = editData.value("edit_id").toString(); |
| 178 | QString filePath = editData.value("file").toString(); |
| 179 | QString oldContent = editData.value("old_content").toString(); |
| 180 | QString newContent = editData.value("new_content").toString(); |
| 181 | QString originalStatus = editData.value("status").toString(); |
| 182 | |
| 183 | if (!editId.isEmpty() && !filePath.isEmpty()) { |
| 184 | Context::ChangesManager::instance().addFileEdit( |
| 185 | editId, filePath, oldContent, newContent, false, true); |
| 186 | |
| 187 | editData["status"] = "archived"; |
| 188 | editData["status_message"] = "Loaded from chat history"; |
| 189 | |
| 190 | QString updatedContent = marker |
| 191 | + QString::fromUtf8(QJsonDocument(editData).toJson(QJsonDocument::Compact)); |
| 192 | m_messages.last().content = updatedContent; |
| 193 | |
| 194 | emit dataChanged(index(m_messages.size() - 1), index(m_messages.size() - 1)); |