@delt/claude-alarm 0.6.21 → 0.6.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -944,6 +944,40 @@
944
944
 
945
945
  const $ = (sel) => document.querySelector(sel);
946
946
 
947
+ // --- Message persistence (localStorage, last 5 per session) ---
948
+ const MSG_STORAGE_KEY = 'claude-alarm-messages';
949
+ const MSG_LIMIT = 5;
950
+
951
+ function saveMessages() {
952
+ try {
953
+ const data = {};
954
+ for (const [sid, msgs] of Object.entries(state.messages)) {
955
+ if (msgs.length) {
956
+ // Exclude imageData to save localStorage space
957
+ data[sid] = msgs.slice(-MSG_LIMIT).map(m => {
958
+ if (m.imageData) return { ...m, imageData: null, imageName: m.imageName ? '[image] ' + m.imageName : null };
959
+ return m;
960
+ });
961
+ }
962
+ }
963
+ localStorage.setItem(MSG_STORAGE_KEY, JSON.stringify(data));
964
+ } catch {}
965
+ }
966
+
967
+ function loadMessages() {
968
+ try {
969
+ const raw = localStorage.getItem(MSG_STORAGE_KEY);
970
+ if (raw) {
971
+ const data = JSON.parse(raw);
972
+ for (const [sid, msgs] of Object.entries(data)) {
973
+ if (Array.isArray(msgs) && msgs.length) state.messages[sid] = msgs;
974
+ }
975
+ }
976
+ } catch {}
977
+ }
978
+
979
+ loadMessages();
980
+
947
981
  // --- Theme ---
948
982
  function initTheme() {
949
983
  const saved = localStorage.getItem('claude-alarm-theme') || 'dark';
@@ -1039,6 +1073,7 @@
1039
1073
  case 'reply_from_session':
1040
1074
  if (!state.messages[msg.sessionId]) state.messages[msg.sessionId] = [];
1041
1075
  state.messages[msg.sessionId].push({ from: 'session', content: msg.content, time: msg.timestamp });
1076
+ saveMessages();
1042
1077
  state.waitingReply[msg.sessionId] = false;
1043
1078
  if (state.selectedSession === msg.sessionId) { renderMessages(); }
1044
1079
  else { state.unread[msg.sessionId] = (state.unread[msg.sessionId] || 0) + 1; renderSessions(); }
@@ -1118,6 +1153,7 @@
1118
1153
  renderSessions();
1119
1154
  renderMessages();
1120
1155
  updateImageUI();
1156
+ $('#msgInput').focus();
1121
1157
  }
1122
1158
 
1123
1159
  function updateImageUI() {
@@ -1322,6 +1358,7 @@
1322
1358
  imageName: hasImage ? state.pendingImage.name : null,
1323
1359
  time: Date.now(),
1324
1360
  });
1361
+ saveMessages();
1325
1362
 
1326
1363
  input.value = '';
1327
1364
  input.style.height = 'auto';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@delt/claude-alarm",
3
- "version": "0.6.21",
3
+ "version": "0.6.23",
4
4
  "description": "Monitor and get notifications from multiple Claude Code sessions via MCP Channels",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -944,6 +944,40 @@
944
944
 
945
945
  const $ = (sel) => document.querySelector(sel);
946
946
 
947
+ // --- Message persistence (localStorage, last 5 per session) ---
948
+ const MSG_STORAGE_KEY = 'claude-alarm-messages';
949
+ const MSG_LIMIT = 5;
950
+
951
+ function saveMessages() {
952
+ try {
953
+ const data = {};
954
+ for (const [sid, msgs] of Object.entries(state.messages)) {
955
+ if (msgs.length) {
956
+ // Exclude imageData to save localStorage space
957
+ data[sid] = msgs.slice(-MSG_LIMIT).map(m => {
958
+ if (m.imageData) return { ...m, imageData: null, imageName: m.imageName ? '[image] ' + m.imageName : null };
959
+ return m;
960
+ });
961
+ }
962
+ }
963
+ localStorage.setItem(MSG_STORAGE_KEY, JSON.stringify(data));
964
+ } catch {}
965
+ }
966
+
967
+ function loadMessages() {
968
+ try {
969
+ const raw = localStorage.getItem(MSG_STORAGE_KEY);
970
+ if (raw) {
971
+ const data = JSON.parse(raw);
972
+ for (const [sid, msgs] of Object.entries(data)) {
973
+ if (Array.isArray(msgs) && msgs.length) state.messages[sid] = msgs;
974
+ }
975
+ }
976
+ } catch {}
977
+ }
978
+
979
+ loadMessages();
980
+
947
981
  // --- Theme ---
948
982
  function initTheme() {
949
983
  const saved = localStorage.getItem('claude-alarm-theme') || 'dark';
@@ -1039,6 +1073,7 @@
1039
1073
  case 'reply_from_session':
1040
1074
  if (!state.messages[msg.sessionId]) state.messages[msg.sessionId] = [];
1041
1075
  state.messages[msg.sessionId].push({ from: 'session', content: msg.content, time: msg.timestamp });
1076
+ saveMessages();
1042
1077
  state.waitingReply[msg.sessionId] = false;
1043
1078
  if (state.selectedSession === msg.sessionId) { renderMessages(); }
1044
1079
  else { state.unread[msg.sessionId] = (state.unread[msg.sessionId] || 0) + 1; renderSessions(); }
@@ -1118,6 +1153,7 @@
1118
1153
  renderSessions();
1119
1154
  renderMessages();
1120
1155
  updateImageUI();
1156
+ $('#msgInput').focus();
1121
1157
  }
1122
1158
 
1123
1159
  function updateImageUI() {
@@ -1322,6 +1358,7 @@
1322
1358
  imageName: hasImage ? state.pendingImage.name : null,
1323
1359
  time: Date.now(),
1324
1360
  });
1361
+ saveMessages();
1325
1362
 
1326
1363
  input.value = '';
1327
1364
  input.style.height = 'auto';