diff --git a/app/static/js/app.js b/app/static/js/app.js
index 3c30982..0c442f5 100644
--- a/app/static/js/app.js
+++ b/app/static/js/app.js
@@ -1354,7 +1354,7 @@ function createMessageElement(msg) {
- ${window.deviceCaps?.supports_raw_resend ? `
+ ${window.deviceCaps?.supports_raw_resend && typeof msg.id === 'number' ? `
@@ -1464,7 +1464,14 @@ async function sendMessage() {
// Replace optimistic ID with real DB id so echo WebSocket updates work
if (data.id) {
const wrapper = document.querySelector(`.message-wrapper[data-msg-id="${optimisticId}"]`);
- if (wrapper) wrapper.dataset.msgId = data.id;
+ if (wrapper) {
+ wrapper.dataset.msgId = data.id;
+ // Inject the post-send action buttons (analyzer, raw resend)
+ // now — refreshMessagesMeta would otherwise skip this message
+ // until the first echo arrives, which never happens on
+ // channels with no repeaters in range.
+ refreshMessagesMeta([data.id]);
+ }
}
// Use server timestamp to prevent poll-triggered reload due to clock skew
if (data.timestamp) {