hammoc 1.0.3 → 1.1.0

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.
Files changed (176) hide show
  1. package/README.md +46 -16
  2. package/bin/hammoc.js +22 -5
  3. package/package.json +2 -1
  4. package/packages/client/dist/assets/{index-BfemoSfM.js → index-CFWfpySn.js} +1 -1
  5. package/packages/client/dist/assets/index-D8ezrT4P.js +1446 -0
  6. package/packages/client/dist/assets/index-JvaBmdnx.css +32 -0
  7. package/packages/client/dist/favicon-192.png +0 -0
  8. package/packages/client/dist/favicon-512.png +0 -0
  9. package/packages/client/dist/favicon.png +0 -0
  10. package/packages/client/dist/index.html +5 -3
  11. package/packages/client/dist/manifest.webmanifest +1 -1
  12. package/packages/client/dist/sw.js +2 -1
  13. package/packages/server/dist/app.d.ts.map +1 -1
  14. package/packages/server/dist/app.js +58 -6
  15. package/packages/server/dist/app.js.map +1 -1
  16. package/packages/server/dist/config/index.d.ts +17 -9
  17. package/packages/server/dist/config/index.d.ts.map +1 -1
  18. package/packages/server/dist/config/index.js +17 -10
  19. package/packages/server/dist/config/index.js.map +1 -1
  20. package/packages/server/dist/controllers/boardController.d.ts +0 -1
  21. package/packages/server/dist/controllers/boardController.d.ts.map +1 -1
  22. package/packages/server/dist/controllers/boardController.js +62 -29
  23. package/packages/server/dist/controllers/boardController.js.map +1 -1
  24. package/packages/server/dist/controllers/cliController.d.ts.map +1 -1
  25. package/packages/server/dist/controllers/cliController.js +8 -0
  26. package/packages/server/dist/controllers/cliController.js.map +1 -1
  27. package/packages/server/dist/controllers/fileSystemController.d.ts +10 -0
  28. package/packages/server/dist/controllers/fileSystemController.d.ts.map +1 -1
  29. package/packages/server/dist/controllers/fileSystemController.js +156 -0
  30. package/packages/server/dist/controllers/fileSystemController.js.map +1 -1
  31. package/packages/server/dist/controllers/queueController.d.ts +0 -4
  32. package/packages/server/dist/controllers/queueController.d.ts.map +1 -1
  33. package/packages/server/dist/controllers/queueController.js +0 -88
  34. package/packages/server/dist/controllers/queueController.js.map +1 -1
  35. package/packages/server/dist/controllers/queueTemplateController.d.ts +4 -0
  36. package/packages/server/dist/controllers/queueTemplateController.d.ts.map +1 -1
  37. package/packages/server/dist/controllers/queueTemplateController.js +61 -4
  38. package/packages/server/dist/controllers/queueTemplateController.js.map +1 -1
  39. package/packages/server/dist/controllers/serverController.d.ts +3 -3
  40. package/packages/server/dist/controllers/serverController.d.ts.map +1 -1
  41. package/packages/server/dist/controllers/serverController.js +91 -39
  42. package/packages/server/dist/controllers/serverController.js.map +1 -1
  43. package/packages/server/dist/controllers/sessionController.d.ts.map +1 -1
  44. package/packages/server/dist/controllers/sessionController.js +2 -1
  45. package/packages/server/dist/controllers/sessionController.js.map +1 -1
  46. package/packages/server/dist/handlers/websocket.d.ts +12 -2
  47. package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
  48. package/packages/server/dist/handlers/websocket.js +785 -106
  49. package/packages/server/dist/handlers/websocket.js.map +1 -1
  50. package/packages/server/dist/index.js +5 -1
  51. package/packages/server/dist/index.js.map +1 -1
  52. package/packages/server/dist/locales/en/server.json +12 -3
  53. package/packages/server/dist/locales/es/server.json +3 -1
  54. package/packages/server/dist/locales/ja/server.json +3 -1
  55. package/packages/server/dist/locales/ko/server.json +12 -3
  56. package/packages/server/dist/locales/pt/server.json +3 -1
  57. package/packages/server/dist/locales/zh-CN/server.json +3 -1
  58. package/packages/server/dist/middleware/pathGuard.d.ts +1 -7
  59. package/packages/server/dist/middleware/pathGuard.d.ts.map +1 -1
  60. package/packages/server/dist/middleware/pathGuard.js +57 -4
  61. package/packages/server/dist/middleware/pathGuard.js.map +1 -1
  62. package/packages/server/dist/middleware/session.d.ts.map +1 -1
  63. package/packages/server/dist/middleware/session.js +3 -1
  64. package/packages/server/dist/middleware/session.js.map +1 -1
  65. package/packages/server/dist/routes/board.d.ts.map +1 -1
  66. package/packages/server/dist/routes/board.js +0 -1
  67. package/packages/server/dist/routes/board.js.map +1 -1
  68. package/packages/server/dist/routes/fileSystem.d.ts.map +1 -1
  69. package/packages/server/dist/routes/fileSystem.js +39 -0
  70. package/packages/server/dist/routes/fileSystem.js.map +1 -1
  71. package/packages/server/dist/routes/preferences.d.ts.map +1 -1
  72. package/packages/server/dist/routes/preferences.js +80 -2
  73. package/packages/server/dist/routes/preferences.js.map +1 -1
  74. package/packages/server/dist/routes/queue.d.ts.map +1 -1
  75. package/packages/server/dist/routes/queue.js +9 -8
  76. package/packages/server/dist/routes/queue.js.map +1 -1
  77. package/packages/server/dist/services/bmadStatusService.d.ts.map +1 -1
  78. package/packages/server/dist/services/bmadStatusService.js +60 -0
  79. package/packages/server/dist/services/bmadStatusService.js.map +1 -1
  80. package/packages/server/dist/services/chatService.d.ts +4 -0
  81. package/packages/server/dist/services/chatService.d.ts.map +1 -1
  82. package/packages/server/dist/services/chatService.js +7 -1
  83. package/packages/server/dist/services/chatService.js.map +1 -1
  84. package/packages/server/dist/services/cliService.d.ts.map +1 -1
  85. package/packages/server/dist/services/cliService.js +66 -15
  86. package/packages/server/dist/services/cliService.js.map +1 -1
  87. package/packages/server/dist/services/fileSystemService.d.ts +29 -1
  88. package/packages/server/dist/services/fileSystemService.d.ts.map +1 -1
  89. package/packages/server/dist/services/fileSystemService.js +240 -5
  90. package/packages/server/dist/services/fileSystemService.js.map +1 -1
  91. package/packages/server/dist/services/gitService.js +1 -1
  92. package/packages/server/dist/services/gitService.js.map +1 -1
  93. package/packages/server/dist/services/historyParser.d.ts +13 -0
  94. package/packages/server/dist/services/historyParser.d.ts.map +1 -1
  95. package/packages/server/dist/services/historyParser.js +159 -14
  96. package/packages/server/dist/services/historyParser.js.map +1 -1
  97. package/packages/server/dist/services/issueService.d.ts +3 -10
  98. package/packages/server/dist/services/issueService.d.ts.map +1 -1
  99. package/packages/server/dist/services/issueService.js +145 -156
  100. package/packages/server/dist/services/issueService.js.map +1 -1
  101. package/packages/server/dist/services/notificationService.d.ts +11 -6
  102. package/packages/server/dist/services/notificationService.d.ts.map +1 -1
  103. package/packages/server/dist/services/notificationService.js +75 -20
  104. package/packages/server/dist/services/notificationService.js.map +1 -1
  105. package/packages/server/dist/services/preferencesService.d.ts +2 -3
  106. package/packages/server/dist/services/preferencesService.d.ts.map +1 -1
  107. package/packages/server/dist/services/preferencesService.js +3 -10
  108. package/packages/server/dist/services/preferencesService.js.map +1 -1
  109. package/packages/server/dist/services/projectService.d.ts +26 -1
  110. package/packages/server/dist/services/projectService.d.ts.map +1 -1
  111. package/packages/server/dist/services/projectService.js +113 -0
  112. package/packages/server/dist/services/projectService.js.map +1 -1
  113. package/packages/server/dist/services/queueService.d.ts +1 -1
  114. package/packages/server/dist/services/queueService.d.ts.map +1 -1
  115. package/packages/server/dist/services/queueService.js +6 -2
  116. package/packages/server/dist/services/queueService.js.map +1 -1
  117. package/packages/server/dist/services/queueTemplateService.d.ts +5 -0
  118. package/packages/server/dist/services/queueTemplateService.d.ts.map +1 -1
  119. package/packages/server/dist/services/queueTemplateService.js +71 -21
  120. package/packages/server/dist/services/queueTemplateService.js.map +1 -1
  121. package/packages/server/dist/services/sessionService.d.ts +12 -0
  122. package/packages/server/dist/services/sessionService.d.ts.map +1 -1
  123. package/packages/server/dist/services/sessionService.js +121 -107
  124. package/packages/server/dist/services/sessionService.js.map +1 -1
  125. package/packages/server/dist/services/streamHandler.d.ts +4 -2
  126. package/packages/server/dist/services/streamHandler.d.ts.map +1 -1
  127. package/packages/server/dist/services/streamHandler.js +20 -4
  128. package/packages/server/dist/services/streamHandler.js.map +1 -1
  129. package/packages/server/dist/services/webPushService.d.ts +61 -0
  130. package/packages/server/dist/services/webPushService.d.ts.map +1 -0
  131. package/packages/server/dist/services/webPushService.js +258 -0
  132. package/packages/server/dist/services/webPushService.js.map +1 -0
  133. package/packages/server/dist/utils/networkUtils.d.ts +17 -2
  134. package/packages/server/dist/utils/networkUtils.d.ts.map +1 -1
  135. package/packages/server/dist/utils/networkUtils.js +121 -8
  136. package/packages/server/dist/utils/networkUtils.js.map +1 -1
  137. package/packages/server/package.json +4 -0
  138. package/packages/shared/dist/constants/errorCodes.d.ts +1 -0
  139. package/packages/shared/dist/constants/errorCodes.d.ts.map +1 -1
  140. package/packages/shared/dist/constants/errorCodes.js +2 -0
  141. package/packages/shared/dist/constants/errorCodes.js.map +1 -1
  142. package/packages/shared/dist/index.d.ts +1 -1
  143. package/packages/shared/dist/index.d.ts.map +1 -1
  144. package/packages/shared/dist/index.js.map +1 -1
  145. package/packages/shared/dist/types/bmadStatus.d.ts +2 -0
  146. package/packages/shared/dist/types/bmadStatus.d.ts.map +1 -1
  147. package/packages/shared/dist/types/bmadStatus.js.map +1 -1
  148. package/packages/shared/dist/types/board.d.ts +8 -8
  149. package/packages/shared/dist/types/board.d.ts.map +1 -1
  150. package/packages/shared/dist/types/board.js +24 -39
  151. package/packages/shared/dist/types/board.js.map +1 -1
  152. package/packages/shared/dist/types/fileSystem.d.ts +36 -0
  153. package/packages/shared/dist/types/fileSystem.d.ts.map +1 -1
  154. package/packages/shared/dist/types/fileSystem.js +15 -0
  155. package/packages/shared/dist/types/fileSystem.js.map +1 -1
  156. package/packages/shared/dist/types/history.d.ts +10 -2
  157. package/packages/shared/dist/types/history.d.ts.map +1 -1
  158. package/packages/shared/dist/types/preferences.d.ts +26 -1
  159. package/packages/shared/dist/types/preferences.d.ts.map +1 -1
  160. package/packages/shared/dist/types/preferences.js.map +1 -1
  161. package/packages/shared/dist/types/sdk.d.ts +23 -0
  162. package/packages/shared/dist/types/sdk.d.ts.map +1 -1
  163. package/packages/shared/dist/types/sdk.js +48 -0
  164. package/packages/shared/dist/types/sdk.js.map +1 -1
  165. package/packages/shared/dist/types/streaming.d.ts +1 -0
  166. package/packages/shared/dist/types/streaming.d.ts.map +1 -1
  167. package/packages/shared/dist/types/streaming.js.map +1 -1
  168. package/packages/shared/dist/types/websocket.d.ts +41 -1
  169. package/packages/shared/dist/types/websocket.d.ts.map +1 -1
  170. package/packages/shared/dist/utils/queueTemplateUtils.d.ts +2 -1
  171. package/packages/shared/dist/utils/queueTemplateUtils.d.ts.map +1 -1
  172. package/packages/shared/dist/utils/queueTemplateUtils.js +10 -3
  173. package/packages/shared/dist/utils/queueTemplateUtils.js.map +1 -1
  174. package/packages/client/dist/assets/index-B335pbdL.js +0 -1297
  175. package/packages/client/dist/assets/index-CmTNL_3X.css +0 -32
  176. package/packages/client/dist/workbox-7a79b53c.js +0 -1
@@ -1,16 +1,21 @@
1
1
  /**
2
- * Notification Service — Telegram alerts for background streaming events
3
- * Sends notifications only when the client socket is disconnected.
2
+ * Notification Service — orchestrates Telegram and Web Push alerts
3
+ * Sends notifications only when the client socket is disconnected (or alwaysNotify is on).
4
4
  * Supports dynamic reconfiguration via reload() for UI-driven settings changes.
5
5
  */
6
6
  import { config } from '../config/index.js';
7
7
  import { preferencesService } from './preferencesService.js';
8
+ import { webPushService } from './webPushService.js';
8
9
  import { SUPPORTED_LANGUAGES } from '@hammoc/shared';
9
10
  import i18next from '../i18n.js';
10
11
  class NotificationService {
12
+ // Telegram settings
11
13
  effectiveBotToken;
12
14
  effectiveChatId;
13
- enabled;
15
+ telegramEnabled;
16
+ // Web Push settings
17
+ webPushEnabled;
18
+ // Shared settings
14
19
  baseUrl;
15
20
  shouldNotifyPermission;
16
21
  shouldNotifyComplete;
@@ -24,7 +29,8 @@ class NotificationService {
24
29
  // Initial config from env vars (preferences not yet loaded at startup)
25
30
  this.effectiveBotToken = config.telegram.botToken;
26
31
  this.effectiveChatId = config.telegram.chatId;
27
- this.enabled = config.telegram.enabled;
32
+ this.telegramEnabled = config.telegram.enabled;
33
+ this.webPushEnabled = false;
28
34
  this.baseUrl = '';
29
35
  this.shouldNotifyPermission = true;
30
36
  this.shouldNotifyComplete = true;
@@ -37,17 +43,21 @@ class NotificationService {
37
43
  }
38
44
  /**
39
45
  * Reload configuration from preferences + env vars.
40
- * Called after Telegram settings are updated via UI,
46
+ * Called after settings are updated via UI,
41
47
  * and once during server startup to load preferences.
42
48
  */
43
49
  async reload() {
44
50
  try {
45
51
  const prefs = await preferencesService.readPreferences();
46
52
  const telegram = prefs.telegram ?? {};
53
+ // Telegram
47
54
  this.effectiveBotToken = telegram.botToken ?? config.telegram.botToken;
48
55
  this.effectiveChatId = telegram.chatId ?? config.telegram.chatId;
49
- this.enabled = (telegram.enabled ?? false) && !!this.effectiveBotToken && !!this.effectiveChatId;
56
+ this.telegramEnabled = (telegram.enabled ?? false) && !!this.effectiveBotToken && !!this.effectiveChatId;
50
57
  this.baseUrl = telegram.baseUrl ?? process.env.BASE_URL ?? '';
58
+ // Web Push
59
+ this.webPushEnabled = prefs.webPush?.enabled ?? false;
60
+ // Shared notification type toggles
51
61
  this.shouldNotifyPermission = telegram.notifyPermission ?? true;
52
62
  this.shouldNotifyComplete = telegram.notifyComplete ?? true;
53
63
  this.shouldNotifyError = telegram.notifyError ?? true;
@@ -72,9 +82,10 @@ class NotificationService {
72
82
  shouldNotify(socketCount) {
73
83
  return socketCount === 0 || this.alwaysNotify;
74
84
  }
85
+ // ── Telegram delivery ──────────────────────────────────────────────
75
86
  /** Send a Telegram message (best-effort, silent fail) */
76
- async send(message) {
77
- if (!this.enabled || !this.effectiveBotToken || !this.effectiveChatId)
87
+ async sendTelegram(message) {
88
+ if (!this.telegramEnabled || !this.effectiveBotToken || !this.effectiveChatId)
78
89
  return;
79
90
  try {
80
91
  const apiUrl = `https://api.telegram.org/bot${this.effectiveBotToken}/sendMessage`;
@@ -92,7 +103,20 @@ class NotificationService {
92
103
  // Silent fail — notifications are best-effort
93
104
  }
94
105
  }
95
- /** Resolve the user's preferred language for Telegram messages */
106
+ // ── Web Push delivery ──────────────────────────────────────────────
107
+ /** Send a Web Push notification (best-effort, silent fail) */
108
+ async sendPush(title, body, url, tag) {
109
+ if (!this.webPushEnabled)
110
+ return;
111
+ try {
112
+ await webPushService.sendPush({ title, body, url, tag });
113
+ }
114
+ catch {
115
+ // Silent fail — notifications are best-effort
116
+ }
117
+ }
118
+ // ── Shared helpers ─────────────────────────────────────────────────
119
+ /** Resolve the user's preferred language for notification messages */
96
120
  async resolveLanguage() {
97
121
  try {
98
122
  const prefs = await preferencesService.readPreferences();
@@ -114,6 +138,11 @@ class NotificationService {
114
138
  .replace(/</g, '&lt;')
115
139
  .replace(/>/g, '&gt;');
116
140
  }
141
+ /** Strip HTML tags for plain-text push body */
142
+ stripHtml(text) {
143
+ return text.replace(/<[^>]+>/g, '');
144
+ }
145
+ // ── Notification methods ───────────────────────────────────────────
117
146
  /** Notify that user input is needed (permission or AskUserQuestion) */
118
147
  async notifyInputRequired(sessionId, toolName, prompt) {
119
148
  if (!this.shouldNotifyPermission)
@@ -123,7 +152,10 @@ class NotificationService {
123
152
  const emoji = toolName === 'AskUserQuestion' ? '❓' : '🔐';
124
153
  const label = toolName === 'AskUserQuestion' ? t('notification.question.title') : t('notification.permission.title');
125
154
  const detail = prompt ? `\n${prompt}` : '';
126
- await this.send(`${emoji} <b>${label}</b>\nSession: <code>${sessionId}</code>${detail}${this.buildLink()}`);
155
+ await Promise.allSettled([
156
+ this.sendTelegram(`${emoji} <b>${label}</b>\nSession: <code>${sessionId}</code>${detail}${this.buildLink()}`),
157
+ this.sendPush(`${emoji} ${label}`, prompt ? prompt.slice(0, 200) : `Session: ${sessionId}`, this.baseUrl || '/', `input-${sessionId}`),
158
+ ]);
127
159
  }
128
160
  /** Notify that streaming completed successfully, optionally including last assistant message */
129
161
  async notifyComplete(sessionId, lastContent, queueProgress) {
@@ -131,20 +163,28 @@ class NotificationService {
131
163
  return;
132
164
  const lang = await this.resolveLanguage();
133
165
  const t = i18next.getFixedT(lang);
134
- let message = `✅ <b>${t('notification.complete.title')}</b>\nSession: <code>${sessionId}</code>`;
166
+ // Telegram (HTML)
167
+ let telegramMsg = `✅ <b>${t('notification.complete.title')}</b>\nSession: <code>${sessionId}</code>`;
135
168
  if (queueProgress && queueProgress.total > 0) {
136
169
  const current = Math.max(0, Math.min(queueProgress.current, queueProgress.total));
137
170
  const pct = Math.round((current / queueProgress.total) * 100);
138
- message += `\n📊 ${t('notification.complete.queueProgress', { current, total: queueProgress.total, pct })}`;
171
+ telegramMsg += `\n📊 ${t('notification.complete.queueProgress', { current, total: queueProgress.total, pct })}`;
139
172
  }
140
173
  if (lastContent) {
141
174
  const MAX_LEN = 500;
142
175
  const escaped = this.escapeHtml(lastContent);
143
176
  const truncated = escaped.length > MAX_LEN ? escaped.slice(0, MAX_LEN) + '…' : escaped;
144
- message += `\n\n<b>${t('notification.complete.lastMessage')}</b>\n<pre>${truncated}</pre>`;
177
+ telegramMsg += `\n\n<b>${t('notification.complete.lastMessage')}</b>\n<pre>${truncated}</pre>`;
145
178
  }
146
- message += this.buildLink();
147
- await this.send(message);
179
+ telegramMsg += this.buildLink();
180
+ // Push (plain text)
181
+ const pushBody = lastContent
182
+ ? lastContent.slice(0, 200)
183
+ : `Session: ${sessionId}`;
184
+ await Promise.allSettled([
185
+ this.sendTelegram(telegramMsg),
186
+ this.sendPush(`✅ ${t('notification.complete.title')}`, pushBody, this.baseUrl || '/', `complete-${sessionId}`),
187
+ ]);
148
188
  }
149
189
  /** Notify that an error occurred during streaming */
150
190
  async notifyError(sessionId, error) {
@@ -152,7 +192,10 @@ class NotificationService {
152
192
  return;
153
193
  const lang = await this.resolveLanguage();
154
194
  const t = i18next.getFixedT(lang);
155
- await this.send(`❌ <b>${t('notification.error.title')}</b>\nSession: <code>${sessionId}</code>\n${error}${this.buildLink()}`);
195
+ await Promise.allSettled([
196
+ this.sendTelegram(`❌ <b>${t('notification.error.title')}</b>\nSession: <code>${sessionId}</code>\n${error}${this.buildLink()}`),
197
+ this.sendPush(`❌ ${t('notification.error.title')}`, error.slice(0, 200), this.baseUrl || '/', `error-${sessionId}`),
198
+ ]);
156
199
  }
157
200
  /** Notify that queue execution has started */
158
201
  async notifyQueueStart(totalItems, sessionUrl) {
@@ -160,7 +203,10 @@ class NotificationService {
160
203
  return;
161
204
  const lang = await this.resolveLanguage();
162
205
  const t = i18next.getFixedT(lang);
163
- await this.send(`🚀 <b>${t('notification.queueStart.title')}</b>\n${t('notification.queueStart.body', { value: totalItems })}\n\n${sessionUrl}`);
206
+ await Promise.allSettled([
207
+ this.sendTelegram(`🚀 <b>${t('notification.queueStart.title')}</b>\n${t('notification.queueStart.body', { value: totalItems })}\n\n${sessionUrl}`),
208
+ this.sendPush(`🚀 ${t('notification.queueStart.title')}`, t('notification.queueStart.body', { value: totalItems }), sessionUrl || '/', 'queue-start'),
209
+ ]);
164
210
  }
165
211
  /** Notify that queue execution completed all items */
166
212
  async notifyQueueComplete(sessionUrl) {
@@ -168,7 +214,10 @@ class NotificationService {
168
214
  return;
169
215
  const lang = await this.resolveLanguage();
170
216
  const t = i18next.getFixedT(lang);
171
- await this.send(`✅ <b>${t('notification.queueComplete.title')}</b>\n${t('notification.queueComplete.body')}\n\n${sessionUrl}`);
217
+ await Promise.allSettled([
218
+ this.sendTelegram(`✅ <b>${t('notification.queueComplete.title')}</b>\n${t('notification.queueComplete.body')}\n\n${sessionUrl}`),
219
+ this.sendPush(`✅ ${t('notification.queueComplete.title')}`, t('notification.queueComplete.body'), sessionUrl || '/', 'queue-complete'),
220
+ ]);
172
221
  }
173
222
  /** Notify that queue paused due to error (QUEUE_STOP, SDK error, etc.) */
174
223
  async notifyQueueError(reason, sessionUrl) {
@@ -176,7 +225,10 @@ class NotificationService {
176
225
  return;
177
226
  const lang = await this.resolveLanguage();
178
227
  const t = i18next.getFixedT(lang);
179
- await this.send(`⚠️ <b>${t('notification.queuePaused.title')}</b>\n${reason}\n\n${sessionUrl}`);
228
+ await Promise.allSettled([
229
+ this.sendTelegram(`⚠️ <b>${t('notification.queuePaused.title')}</b>\n${reason}\n\n${sessionUrl}`),
230
+ this.sendPush(`⚠️ ${t('notification.queuePaused.title')}`, reason.slice(0, 200), sessionUrl || '/', 'queue-error'),
231
+ ]);
180
232
  }
181
233
  /** Notify that queue is waiting for user input (permission or AskUserQuestion) */
182
234
  async notifyQueueInputRequired(sessionUrl) {
@@ -184,7 +236,10 @@ class NotificationService {
184
236
  return;
185
237
  const lang = await this.resolveLanguage();
186
238
  const t = i18next.getFixedT(lang);
187
- await this.send(`❓ <b>${t('notification.inputRequired.title')}</b>\n${t('notification.inputRequired.body')}\n\n${sessionUrl}`);
239
+ await Promise.allSettled([
240
+ this.sendTelegram(`❓ <b>${t('notification.inputRequired.title')}</b>\n${t('notification.inputRequired.body')}\n\n${sessionUrl}`),
241
+ this.sendPush(`❓ ${t('notification.inputRequired.title')}`, t('notification.inputRequired.body'), sessionUrl || '/', 'queue-input'),
242
+ ]);
188
243
  }
189
244
  /**
190
245
  * Send a test Telegram message.
@@ -1 +1 @@
1
- {"version":3,"file":"notificationService.js","sourceRoot":"","sources":["../../src/services/notificationService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notificationService.js","sourceRoot":"","sources":["../../src/services/notificationService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,OAAO,MAAM,YAAY,CAAC;AAEjC,MAAM,mBAAmB;IACvB,oBAAoB;IACZ,iBAAiB,CAAS;IAC1B,eAAe,CAAS;IACxB,eAAe,CAAU;IAEjC,oBAAoB;IACZ,cAAc,CAAU;IAEhC,kBAAkB;IACV,OAAO,CAAS;IAChB,sBAAsB,CAAU;IAChC,oBAAoB,CAAU;IAC9B,iBAAiB,CAAU;IAC3B,sBAAsB,CAAU;IAChC,yBAAyB,CAAU;IACnC,sBAAsB,CAAU;IAChC,8BAA8B,CAAU;IACxC,YAAY,CAAU;IAE9B;QACE,uEAAuE;QACvE,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAClD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC9C,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC/C,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QACnC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QACnC,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;QACtC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QACnC,IAAI,CAAC,8BAA8B,GAAG,IAAI,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,eAAe,EAAE,CAAC;YACzD,MAAM,QAAQ,GAAqB,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;YAExD,WAAW;YACX,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACvE,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjE,IAAI,CAAC,eAAe,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;YACzG,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;YAE9D,WAAW;YACX,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC;YAEtD,mCAAmC;YACnC,IAAI,CAAC,sBAAsB,GAAG,QAAQ,CAAC,gBAAgB,IAAI,IAAI,CAAC;YAChE,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC,cAAc,IAAI,IAAI,CAAC;YAC5D,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,WAAW,IAAI,IAAI,CAAC;YACtD,IAAI,CAAC,sBAAsB,GAAG,QAAQ,CAAC,gBAAgB,IAAI,IAAI,CAAC;YAChE,IAAI,CAAC,yBAAyB,GAAG,QAAQ,CAAC,mBAAmB,IAAI,IAAI,CAAC;YACtE,IAAI,CAAC,sBAAsB,GAAG,QAAQ,CAAC,gBAAgB,IAAI,IAAI,CAAC;YAChE,IAAI,CAAC,8BAA8B,GAAG,QAAQ,CAAC,wBAAwB,IAAI,IAAI,CAAC;YAChF,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,YAAY,IAAI,KAAK,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,oDAAoD;QACtD,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,WAAmB;QAC9B,OAAO,WAAW,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC;IAChD,CAAC;IAED,sEAAsE;IAEtE,yDAAyD;IACjD,KAAK,CAAC,YAAY,CAAC,OAAe;QACxC,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO;QACtF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,+BAA+B,IAAI,CAAC,iBAAiB,cAAc,CAAC;YACnF,MAAM,KAAK,CAAC,MAAM,EAAE;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,OAAO,EAAE,IAAI,CAAC,eAAe;oBAC7B,IAAI,EAAE,OAAO;oBACb,UAAU,EAAE,MAAM;iBACnB,CAAC;aACH,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;QAChD,CAAC;IACH,CAAC;IAED,sEAAsE;IAEtE,8DAA8D;IACtD,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,IAAY,EAAE,GAAY,EAAE,GAAY;QAC5E,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QACjC,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;QAChD,CAAC;IACH,CAAC;IAED,sEAAsE;IAEtE,sEAAsE;IAC9D,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,eAAe,EAAE,CAAC;YACzD,IAAI,KAAK,CAAC,QAAQ,IAAI,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,QAA8C,CAAC,EAAE,CAAC;gBACzG,OAAO,KAAK,CAAC,QAAQ,CAAC;YACxB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2DAA2D;IACnD,SAAS;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,CAAC;IAED,kEAAkE;IAC1D,UAAU,CAAC,IAAY;QAC7B,OAAO,IAAI;aACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;aACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;aACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,+CAA+C;IACvC,SAAS,CAAC,IAAY;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,sEAAsE;IAEtE,uEAAuE;IACvE,KAAK,CAAC,mBAAmB,CAAC,SAAiB,EAAE,QAAgB,EAAE,MAAe;QAC5E,IAAI,CAAC,IAAI,CAAC,sBAAsB;YAAE,OAAO;QACzC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,QAAQ,KAAK,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1D,MAAM,KAAK,GAAG,QAAQ,KAAK,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC;QACrH,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE3C,MAAM,OAAO,CAAC,UAAU,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,GAAG,KAAK,OAAO,KAAK,wBAAwB,SAAS,UAAU,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YAC7G,IAAI,CAAC,QAAQ,CACX,GAAG,KAAK,IAAI,KAAK,EAAE,EACnB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,SAAS,EAAE,EACvD,IAAI,CAAC,OAAO,IAAI,GAAG,EACnB,SAAS,SAAS,EAAE,CACrB;SACF,CAAC,CAAC;IACL,CAAC;IAED,gGAAgG;IAChG,KAAK,CAAC,cAAc,CAAC,SAAiB,EAAE,WAAoB,EAAE,aAAkD;QAC9G,IAAI,CAAC,IAAI,CAAC,oBAAoB;YAAE,OAAO;QACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAElC,kBAAkB;QAClB,IAAI,WAAW,GAAG,QAAQ,CAAC,CAAC,6BAA6B,CAAC,wBAAwB,SAAS,SAAS,CAAC;QACrG,IAAI,aAAa,IAAI,aAAa,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;YAClF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;YAC9D,WAAW,IAAI,QAAQ,CAAC,CAAC,qCAAqC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QAClH,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,GAAG,CAAC;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YACvF,WAAW,IAAI,UAAU,CAAC,CAAC,mCAAmC,CAAC,cAAc,SAAS,QAAQ,CAAC;QACjG,CAAC;QACD,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QAEhC,oBAAoB;QACpB,MAAM,QAAQ,GAAG,WAAW;YAC1B,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YAC3B,CAAC,CAAC,YAAY,SAAS,EAAE,CAAC;QAE5B,MAAM,OAAO,CAAC,UAAU,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;YAC9B,IAAI,CAAC,QAAQ,CACX,KAAK,CAAC,CAAC,6BAA6B,CAAC,EAAE,EACvC,QAAQ,EACR,IAAI,CAAC,OAAO,IAAI,GAAG,EACnB,YAAY,SAAS,EAAE,CACxB;SACF,CAAC,CAAC;IACL,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,KAAa;QAChD,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE,OAAO;QACpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAElC,MAAM,OAAO,CAAC,UAAU,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,0BAA0B,CAAC,wBAAwB,SAAS,YAAY,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YAC/H,IAAI,CAAC,QAAQ,CACX,KAAK,CAAC,CAAC,0BAA0B,CAAC,EAAE,EACpC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EACnB,IAAI,CAAC,OAAO,IAAI,GAAG,EACnB,SAAS,SAAS,EAAE,CACrB;SACF,CAAC,CAAC;IACL,CAAC;IAED,8CAA8C;IAC9C,KAAK,CAAC,gBAAgB,CAAC,UAAkB,EAAE,UAAkB;QAC3D,IAAI,CAAC,IAAI,CAAC,sBAAsB;YAAE,OAAO;QACzC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAElC,MAAM,OAAO,CAAC,UAAU,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,+BAA+B,CAAC,SAAS,CAAC,CAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,OAAO,UAAU,EAAE,CAAC;YAClJ,IAAI,CAAC,QAAQ,CACX,MAAM,CAAC,CAAC,+BAA+B,CAAC,EAAE,EAC1C,CAAC,CAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EACxD,UAAU,IAAI,GAAG,EACjB,aAAa,CACd;SACF,CAAC,CAAC;IACL,CAAC;IAED,sDAAsD;IACtD,KAAK,CAAC,mBAAmB,CAAC,UAAkB;QAC1C,IAAI,CAAC,IAAI,CAAC,yBAAyB;YAAE,OAAO;QAC5C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAElC,MAAM,OAAO,CAAC,UAAU,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,kCAAkC,CAAC,SAAS,CAAC,CAAC,iCAAiC,CAAC,OAAO,UAAU,EAAE,CAAC;YAChI,IAAI,CAAC,QAAQ,CACX,KAAK,CAAC,CAAC,kCAAkC,CAAC,EAAE,EAC5C,CAAC,CAAC,iCAAiC,CAAC,EACpC,UAAU,IAAI,GAAG,EACjB,gBAAgB,CACjB;SACF,CAAC,CAAC;IACL,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,UAAkB;QACvD,IAAI,CAAC,IAAI,CAAC,sBAAsB;YAAE,OAAO;QACzC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAElC,MAAM,OAAO,CAAC,UAAU,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,gCAAgC,CAAC,SAAS,MAAM,OAAO,UAAU,EAAE,CAAC;YACjG,IAAI,CAAC,QAAQ,CACX,MAAM,CAAC,CAAC,gCAAgC,CAAC,EAAE,EAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EACpB,UAAU,IAAI,GAAG,EACjB,aAAa,CACd;SACF,CAAC,CAAC;IACL,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,wBAAwB,CAAC,UAAkB;QAC/C,IAAI,CAAC,IAAI,CAAC,8BAA8B;YAAE,OAAO;QACjD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAElC,MAAM,OAAO,CAAC,UAAU,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,kCAAkC,CAAC,SAAS,CAAC,CAAC,iCAAiC,CAAC,OAAO,UAAU,EAAE,CAAC;YAChI,IAAI,CAAC,QAAQ,CACX,KAAK,CAAC,CAAC,kCAAkC,CAAC,EAAE,EAC5C,CAAC,CAAC,iCAAiC,CAAC,EACpC,UAAU,IAAI,GAAG,EACjB,aAAa,CACd;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,SAAkD;QAC/D,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,eAAe,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;QAEtC,MAAM,YAAY,GAAG,SAAS,EAAE,QAAQ,IAAI,QAAQ,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC1F,MAAM,UAAU,GAAG,SAAS,EAAE,MAAM,IAAI,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAElF,IAAI,CAAC,YAAY,IAAI,CAAC,UAAU,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAClC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,mCAAmC,CAAC,EAAE,CAAC;QAC3E,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,+BAA+B,YAAY,cAAc,CAAC;YACzE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;gBACnC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,OAAO,EAAE,UAAU;oBACnB,IAAI,EAAE,qBAAqB,CAAC,CAAC,2BAA2B,CAAC,EAAE;oBAC3D,UAAU,EAAE,MAAM;iBACnB,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrD,MAAM,IAAI,GAAI,IAA+B,CAAC,WAAW,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACvF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YACzC,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACrE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAA8B;IACpE,MAAM,SAAS,GAAG,KAAK,CAAC,SAGV,CAAC;IACf,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,IAAI,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC;IACxB,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QACtB,MAAM,IAAI,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,EAAE,CAAC"}
@@ -14,10 +14,9 @@ declare class PreferencesService {
14
14
  getEffectivePreferences(): Promise<UserPreferences>;
15
15
  /**
16
16
  * Check if terminal feature is enabled.
17
- * Priority: TERMINAL_ENABLED env var (if 'false') > preferences.json > default (true)
18
- * Story 17.5: Terminal Security
17
+ * Controlled only by TERMINAL_ENABLED env var / config.terminal.enabled.
19
18
  */
20
- getTerminalEnabled(): Promise<boolean>;
19
+ getTerminalEnabled(): boolean;
21
20
  writePreferences(partial: Partial<UserPreferences>): Promise<UserPreferences>;
22
21
  /**
23
22
  * Returns Telegram settings with env var fallback and masking.
@@ -1 +1 @@
1
- {"version":3,"file":"preferencesService.d.ts","sourceRoot":"","sources":["../../src/services/preferencesService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAoB,2BAA2B,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAGpI,cAAM,kBAAkB;IACtB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,kBAAkB;IAIpB,eAAe,IAAI,OAAO,CAAC,eAAe,CAAC;IAajD;;;OAGG;IACG,uBAAuB,IAAI,OAAO,CAAC,eAAe,CAAC;IAWzD;;;;OAIG;IACG,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IAMtC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IAUnF;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC,2BAA2B,CAAC;IAoCjE;;;OAGG;IACG,sBAAsB,CAAC,MAAM,EAAE,6BAA6B,GAAG,OAAO,CAAC,2BAA2B,CAAC;CAiB1G;AAED,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
1
+ {"version":3,"file":"preferencesService.d.ts","sourceRoot":"","sources":["../../src/services/preferencesService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAoB,2BAA2B,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAGpI,cAAM,kBAAkB;IACtB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,kBAAkB;IAIpB,eAAe,IAAI,OAAO,CAAC,eAAe,CAAC;IAajD;;;OAGG;IACG,uBAAuB,IAAI,OAAO,CAAC,eAAe,CAAC;IAQzD;;;OAGG;IACH,kBAAkB,IAAI,OAAO;IAIvB,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IAUnF;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC,2BAA2B,CAAC;IAoCjE;;;OAGG;IACG,sBAAsB,CAAC,MAAM,EAAE,6BAA6B,GAAG,OAAO,CAAC,2BAA2B,CAAC;CAiB1G;AAED,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
@@ -36,21 +36,14 @@ class PreferencesService {
36
36
  if (process.env.CHAT_TIMEOUT_MS) {
37
37
  prefs.chatTimeoutMs = parseInt(process.env.CHAT_TIMEOUT_MS, 10);
38
38
  }
39
- if (process.env.TERMINAL_ENABLED === 'false') {
40
- prefs.terminalEnabled = false;
41
- }
42
39
  return prefs;
43
40
  }
44
41
  /**
45
42
  * Check if terminal feature is enabled.
46
- * Priority: TERMINAL_ENABLED env var (if 'false') > preferences.json > default (true)
47
- * Story 17.5: Terminal Security
43
+ * Controlled only by TERMINAL_ENABLED env var / config.terminal.enabled.
48
44
  */
49
- async getTerminalEnabled() {
50
- if (process.env.TERMINAL_ENABLED === 'false')
51
- return false;
52
- const prefs = await this.readPreferences();
53
- return prefs.terminalEnabled !== false;
45
+ getTerminalEnabled() {
46
+ return config.terminal.enabled;
54
47
  }
55
48
  async writePreferences(partial) {
56
49
  const dataDir = this.getDataDir();
@@ -1 +1 @@
1
- {"version":3,"file":"preferencesService.js","sourceRoot":"","sources":["../../src/services/preferencesService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"preferencesService.js","sourceRoot":"","sources":["../../src/services/preferencesService.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@
4
4
  * [Source: Story 3.1 - Task 2]
5
5
  * [Extended: Story 3.6 - Task 2: Project creation service]
6
6
  */
7
- import type { PromptHistoryData, ProjectInfo, ProjectSettings, UpdateProjectSettingsRequest, ProjectSettingsApiResponse, CreateProjectRequest, CreateProjectResponse, ValidatePathResponse } from '@hammoc/shared';
7
+ import type { PromptHistoryData, PromptChainItem, ProjectInfo, ProjectSettings, UpdateProjectSettingsRequest, ProjectSettingsApiResponse, CreateProjectRequest, CreateProjectResponse, ValidatePathResponse } from '@hammoc/shared';
8
8
  /**
9
9
  * ProjectService - Scans and lists Claude Code projects
10
10
  */
@@ -62,6 +62,21 @@ declare class ProjectService {
62
62
  * Write session names to <originalPath>/.hammoc/session-names.json
63
63
  */
64
64
  private writeSessionNames;
65
+ private sessionPermissionLocks;
66
+ /**
67
+ * Read per-session permission modes from <originalPath>/.hammoc/session-permissions.json
68
+ * Returns empty object if file doesn't exist
69
+ */
70
+ readSessionPermissions(originalPath: string): Promise<Record<string, string>>;
71
+ /**
72
+ * Write per-session permission modes to <originalPath>/.hammoc/session-permissions.json
73
+ */
74
+ private writeSessionPermissions;
75
+ /**
76
+ * Update per-session permission mode for a specific session.
77
+ * Uses per-path mutex to prevent read-modify-write races.
78
+ */
79
+ updateSessionPermission(originalPath: string, sessionId: string, mode: string): Promise<void>;
65
80
  /**
66
81
  * Update a session name for a project identified by slug
67
82
  * @param name null to remove the name
@@ -92,6 +107,16 @@ declare class ProjectService {
92
107
  * Write prompt history for a session identified by project slug
93
108
  */
94
109
  writePromptHistoryBySlug(projectSlug: string, sessionId: string, data: PromptHistoryData): Promise<void>;
110
+ /** Validate sessionId and resolve safe file path within chain-failures directory */
111
+ private resolveChainFailurePath;
112
+ /**
113
+ * Read chain failure records for a session from ~/.hammoc/chain-failures/
114
+ */
115
+ readChainFailures(sessionId: string): Promise<PromptChainItem[]>;
116
+ /**
117
+ * Write chain failure records for a session to ~/.hammoc/chain-failures/
118
+ */
119
+ writeChainFailures(sessionId: string, failures: PromptChainItem[]): Promise<void>;
95
120
  /**
96
121
  * Extract originalPath (cwd) from a .jsonl session file's first few lines.
97
122
  * Used as fallback when sessions-index.json doesn't exist (e.g., VS Code extension projects).
@@ -1 +1 @@
1
- {"version":3,"file":"projectService.d.ts","sourceRoot":"","sources":["../../src/services/projectService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"projectService.d.ts","sourceRoot":"","sources":["../../src/services/projectService.ts"],"names":[],"mappings":"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"}
@@ -310,6 +310,64 @@ class ProjectService {
310
310
  const namesPath = path.join(hammocDir, 'session-names.json');
311
311
  await fs.writeFile(namesPath, JSON.stringify(names, null, 2), 'utf-8');
312
312
  }
313
+ // Per-path mutex for session-permissions.json read-modify-write
314
+ sessionPermissionLocks = new Map();
315
+ /**
316
+ * Read per-session permission modes from <originalPath>/.hammoc/session-permissions.json
317
+ * Returns empty object if file doesn't exist
318
+ */
319
+ async readSessionPermissions(originalPath) {
320
+ const filePath = path.join(originalPath, '.hammoc', 'session-permissions.json');
321
+ try {
322
+ const content = await fs.readFile(filePath, 'utf-8');
323
+ return JSON.parse(content);
324
+ }
325
+ catch (err) {
326
+ // Only treat missing file as empty; re-throw parse/other errors to prevent data loss
327
+ if (err.code === 'ENOENT')
328
+ return {};
329
+ throw err;
330
+ }
331
+ }
332
+ /**
333
+ * Write per-session permission modes to <originalPath>/.hammoc/session-permissions.json
334
+ */
335
+ async writeSessionPermissions(originalPath, permissions) {
336
+ const hammocDir = path.join(originalPath, '.hammoc');
337
+ await fs.mkdir(hammocDir, { recursive: true });
338
+ const filePath = path.join(hammocDir, 'session-permissions.json');
339
+ await fs.writeFile(filePath, JSON.stringify(permissions, null, 2), 'utf-8');
340
+ }
341
+ /**
342
+ * Update per-session permission mode for a specific session.
343
+ * Uses per-path mutex to prevent read-modify-write races.
344
+ */
345
+ async updateSessionPermission(originalPath, sessionId, mode) {
346
+ // Shield chain from previous failures, then run current operation
347
+ const prev = this.sessionPermissionLocks.get(originalPath) ?? Promise.resolve();
348
+ let resolve;
349
+ let reject;
350
+ const next = new Promise((res, rej) => { resolve = res; reject = rej; });
351
+ const shielded = next.catch(() => { });
352
+ this.sessionPermissionLocks.set(originalPath, shielded);
353
+ try {
354
+ await prev.catch(() => { });
355
+ const permissions = await this.readSessionPermissions(originalPath);
356
+ permissions[sessionId] = mode;
357
+ await this.writeSessionPermissions(originalPath, permissions);
358
+ resolve();
359
+ }
360
+ catch (err) {
361
+ reject(err);
362
+ throw err;
363
+ }
364
+ finally {
365
+ // Clean up lock entry if no other operation has queued behind this one
366
+ if (this.sessionPermissionLocks.get(originalPath) === shielded) {
367
+ this.sessionPermissionLocks.delete(originalPath);
368
+ }
369
+ }
370
+ }
313
371
  /**
314
372
  * Update a session name for a project identified by slug
315
373
  * @param name null to remove the name
@@ -396,6 +454,61 @@ class ProjectService {
396
454
  }
397
455
  await this.writePromptHistory(info.originalPath, sessionId, data);
398
456
  }
457
+ /** Validate sessionId and resolve safe file path within chain-failures directory */
458
+ resolveChainFailurePath(sessionId) {
459
+ if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(sessionId)) {
460
+ throw new Error(`Invalid sessionId format: ${sessionId}`);
461
+ }
462
+ const dir = path.join(os.homedir(), '.hammoc', 'chain-failures');
463
+ const filePath = path.resolve(dir, `${sessionId}.json`);
464
+ if (!filePath.startsWith(path.resolve(dir))) {
465
+ throw new Error(`Path traversal detected for sessionId: ${sessionId}`);
466
+ }
467
+ return filePath;
468
+ }
469
+ /**
470
+ * Read chain failure records for a session from ~/.hammoc/chain-failures/
471
+ */
472
+ async readChainFailures(sessionId) {
473
+ try {
474
+ const filePath = this.resolveChainFailurePath(sessionId);
475
+ const content = await fs.readFile(filePath, 'utf-8');
476
+ const data = JSON.parse(content);
477
+ if (!data || !Array.isArray(data.failures)) {
478
+ throw new Error(`Invalid chain-failures format for session ${sessionId}`);
479
+ }
480
+ return data.failures;
481
+ }
482
+ catch (err) {
483
+ // File not found is expected (no failures recorded yet)
484
+ if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') {
485
+ return [];
486
+ }
487
+ // Propagate corruption / permission errors so callers can handle them
488
+ throw err;
489
+ }
490
+ }
491
+ /**
492
+ * Write chain failure records for a session to ~/.hammoc/chain-failures/
493
+ */
494
+ async writeChainFailures(sessionId, failures) {
495
+ const filePath = this.resolveChainFailurePath(sessionId);
496
+ const dir = path.dirname(filePath);
497
+ if (failures.length === 0) {
498
+ try {
499
+ await fs.unlink(filePath);
500
+ }
501
+ catch (err) {
502
+ // File not found is expected; rethrow other errors (permissions, etc.)
503
+ if (err && typeof err === 'object' && 'code' in err && err.code !== 'ENOENT') {
504
+ throw err;
505
+ }
506
+ }
507
+ return;
508
+ }
509
+ await fs.mkdir(dir, { recursive: true });
510
+ await fs.writeFile(filePath, JSON.stringify({ failures }, null, 2), 'utf-8');
511
+ }
399
512
  /**
400
513
  * Extract originalPath (cwd) from a .jsonl session file's first few lines.
401
514
  * Used as fallback when sessions-index.json doesn't exist (e.g., VS Code extension projects).