diff --git a/src/frontend/app.js b/src/frontend/app.js
index 38bd8bf..8d79b3d 100644
--- a/src/frontend/app.js
+++ b/src/frontend/app.js
@@ -1658,6 +1658,19 @@ function renderSettings(container) {
html += '
Applies to grouped session views like All Sessions and Claude Code. Projects always stay repository-based.
';
html += '';
+ // Message Sort Order
+ var savedMsgSort = localStorage.getItem('codedash-msg-sort') || 'asc';
+ html += '';
+ html += '
';
+ html += '
Default order for messages in session drawer
';
+ html += '
';
+ [['asc', '↑ Oldest first'], ['desc', '↓ Newest first']].forEach(function(pair) {
+ var active = savedMsgSort === pair[0] ? ' active' : '';
+ html += '';
+ });
+ html += '
';
+ html += '
';
+
// LLM Configuration
html += '';
html += '
';
diff --git a/src/frontend/detail.js b/src/frontend/detail.js
index 8555320..0f2ef85 100644
--- a/src/frontend/detail.js
+++ b/src/frontend/detail.js
@@ -101,30 +101,8 @@ async function openDetail(s) {
var data = await resp.json();
var msgContainer = body.querySelector('.detail-messages');
if (data.messages && data.messages.length > 0) {
- var msgsHtml = '
Conversation
';
- data.messages.forEach(function(m) {
- var roleClass = m.role === 'user' ? 'msg-user' : 'msg-assistant';
- var roleLabel = m.role === 'user' ? 'You' : 'Assistant';
- var hasTools = m.tools && m.tools.length > 0;
- msgsHtml += '
';
- });
- msgContainer.innerHTML = msgsHtml;
+ window._detailMessages = data.messages;
+ renderDetailMessages(msgContainer, data.messages);
} else {
msgContainer.innerHTML = '
No messages found in detail file.
';
}
@@ -206,6 +184,48 @@ function closeDetail() {
if (overlay) overlay.classList.remove('open');
}
+function renderDetailMessages(container, messages) {
+ var sort = localStorage.getItem('codedash-msg-sort') || 'asc';
+ var sorted = sort === 'desc' ? messages.slice().reverse() : messages;
+ var btnLabel = sort === 'asc' ? '↑ Oldest first' : '↓ Newest first';
+ var msgsHtml = '
';
+ msgsHtml += '
Conversation
';
+ msgsHtml += '';
+ msgsHtml += '';
+ sorted.forEach(function(m) {
+ var roleClass = m.role === 'user' ? 'msg-user' : 'msg-assistant';
+ var roleLabel = m.role === 'user' ? 'You' : 'Assistant';
+ var hasTools = m.tools && m.tools.length > 0;
+ msgsHtml += '
';
+ });
+ container.innerHTML = msgsHtml;
+}
+
+function toggleMsgSort() {
+ var current = localStorage.getItem('codedash-msg-sort') || 'asc';
+ localStorage.setItem('codedash-msg-sort', current === 'asc' ? 'desc' : 'asc');
+ var container = document.querySelector('.detail-messages');
+ if (container && window._detailMessages) {
+ renderDetailMessages(container, window._detailMessages);
+ }
+}
+
// ── Detail panel resize ───────────────────────────────────────
(function initDetailResize() {
var handle = document.getElementById('detailResizeHandle');