oh-my-codex 0.3.9 → 0.4.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 (184) hide show
  1. package/README.md +25 -0
  2. package/dist/cli/__tests__/doctor-team.test.js +58 -0
  3. package/dist/cli/__tests__/doctor-team.test.js.map +1 -1
  4. package/dist/cli/__tests__/index.test.js +9 -3
  5. package/dist/cli/__tests__/index.test.js.map +1 -1
  6. package/dist/cli/__tests__/lifecycle-notifications.test.d.ts +2 -0
  7. package/dist/cli/__tests__/lifecycle-notifications.test.d.ts.map +1 -0
  8. package/dist/cli/__tests__/lifecycle-notifications.test.js +48 -0
  9. package/dist/cli/__tests__/lifecycle-notifications.test.js.map +1 -0
  10. package/dist/cli/doctor.js +28 -0
  11. package/dist/cli/doctor.js.map +1 -1
  12. package/dist/cli/hooks.d.ts +4 -0
  13. package/dist/cli/hooks.d.ts.map +1 -0
  14. package/dist/cli/hooks.js +201 -0
  15. package/dist/cli/hooks.js.map +1 -0
  16. package/dist/cli/index.d.ts +1 -1
  17. package/dist/cli/index.d.ts.map +1 -1
  18. package/dist/cli/index.js +181 -2
  19. package/dist/cli/index.js.map +1 -1
  20. package/dist/config/__tests__/models.test.d.ts +2 -0
  21. package/dist/config/__tests__/models.test.d.ts.map +1 -0
  22. package/dist/config/__tests__/models.test.js +69 -0
  23. package/dist/config/__tests__/models.test.js.map +1 -0
  24. package/dist/config/models.d.ts +24 -0
  25. package/dist/config/models.d.ts.map +1 -0
  26. package/dist/config/models.js +53 -0
  27. package/dist/config/models.js.map +1 -0
  28. package/dist/hooks/__tests__/notify-hook-linked-sync.test.js +6 -0
  29. package/dist/hooks/__tests__/notify-hook-linked-sync.test.js.map +1 -1
  30. package/dist/hooks/__tests__/notify-hook-session-scope.test.js +6 -0
  31. package/dist/hooks/__tests__/notify-hook-session-scope.test.js.map +1 -1
  32. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +224 -36
  33. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  34. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +4 -0
  35. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
  36. package/dist/hooks/__tests__/tmux-hook-engine.test.js +1 -1
  37. package/dist/hooks/__tests__/tmux-hook-engine.test.js.map +1 -1
  38. package/dist/hooks/extensibility/__tests__/example-hook-plugins.test.d.ts +2 -0
  39. package/dist/hooks/extensibility/__tests__/example-hook-plugins.test.d.ts.map +1 -0
  40. package/dist/hooks/extensibility/__tests__/example-hook-plugins.test.js +153 -0
  41. package/dist/hooks/extensibility/__tests__/example-hook-plugins.test.js.map +1 -0
  42. package/dist/hooks/extensibility/dispatcher.d.ts +4 -0
  43. package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -0
  44. package/dist/hooks/extensibility/dispatcher.js +223 -0
  45. package/dist/hooks/extensibility/dispatcher.js.map +1 -0
  46. package/dist/hooks/extensibility/events.d.ts +18 -0
  47. package/dist/hooks/extensibility/events.d.ts.map +1 -0
  48. package/dist/hooks/extensibility/events.js +53 -0
  49. package/dist/hooks/extensibility/events.js.map +1 -0
  50. package/dist/hooks/extensibility/index.d.ts +6 -0
  51. package/dist/hooks/extensibility/index.d.ts.map +1 -0
  52. package/dist/hooks/extensibility/index.js +6 -0
  53. package/dist/hooks/extensibility/index.js.map +1 -0
  54. package/dist/hooks/extensibility/loader.d.ts +14 -0
  55. package/dist/hooks/extensibility/loader.d.ts.map +1 -0
  56. package/dist/hooks/extensibility/loader.js +102 -0
  57. package/dist/hooks/extensibility/loader.js.map +1 -0
  58. package/dist/hooks/extensibility/logging.d.ts +4 -0
  59. package/dist/hooks/extensibility/logging.d.ts.map +1 -0
  60. package/dist/hooks/extensibility/logging.js +16 -0
  61. package/dist/hooks/extensibility/logging.js.map +1 -0
  62. package/dist/hooks/extensibility/plugin-runner.d.ts +2 -0
  63. package/dist/hooks/extensibility/plugin-runner.d.ts.map +1 -0
  64. package/dist/hooks/extensibility/plugin-runner.js +69 -0
  65. package/dist/hooks/extensibility/plugin-runner.js.map +1 -0
  66. package/dist/hooks/extensibility/runtime.d.ts +3 -0
  67. package/dist/hooks/extensibility/runtime.d.ts.map +1 -0
  68. package/dist/hooks/extensibility/runtime.js +29 -0
  69. package/dist/hooks/extensibility/runtime.js.map +1 -0
  70. package/dist/hooks/extensibility/sdk.d.ts +11 -0
  71. package/dist/hooks/extensibility/sdk.d.ts.map +1 -0
  72. package/dist/hooks/extensibility/sdk.js +240 -0
  73. package/dist/hooks/extensibility/sdk.js.map +1 -0
  74. package/dist/hooks/extensibility/types.d.ts +122 -0
  75. package/dist/hooks/extensibility/types.d.ts.map +1 -0
  76. package/dist/hooks/extensibility/types.js +2 -0
  77. package/dist/hooks/extensibility/types.js.map +1 -0
  78. package/dist/mcp/__tests__/state-paths.test.js +21 -1
  79. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  80. package/dist/mcp/__tests__/state-server-team-tools.test.js +53 -1
  81. package/dist/mcp/__tests__/state-server-team-tools.test.js.map +1 -1
  82. package/dist/mcp/state-paths.d.ts +1 -0
  83. package/dist/mcp/state-paths.d.ts.map +1 -1
  84. package/dist/mcp/state-paths.js +34 -1
  85. package/dist/mcp/state-paths.js.map +1 -1
  86. package/dist/mcp/state-server.d.ts.map +1 -1
  87. package/dist/mcp/state-server.js +46 -11
  88. package/dist/mcp/state-server.js.map +1 -1
  89. package/dist/notifications/__tests__/config.test.d.ts +2 -0
  90. package/dist/notifications/__tests__/config.test.d.ts.map +1 -0
  91. package/dist/notifications/__tests__/config.test.js +186 -0
  92. package/dist/notifications/__tests__/config.test.js.map +1 -0
  93. package/dist/notifications/__tests__/dispatcher.test.d.ts +2 -0
  94. package/dist/notifications/__tests__/dispatcher.test.d.ts.map +1 -0
  95. package/dist/notifications/__tests__/dispatcher.test.js +202 -0
  96. package/dist/notifications/__tests__/dispatcher.test.js.map +1 -0
  97. package/dist/notifications/__tests__/formatter.test.d.ts +2 -0
  98. package/dist/notifications/__tests__/formatter.test.d.ts.map +1 -0
  99. package/dist/notifications/__tests__/formatter.test.js +103 -0
  100. package/dist/notifications/__tests__/formatter.test.js.map +1 -0
  101. package/dist/notifications/__tests__/notifier.test.d.ts +2 -0
  102. package/dist/notifications/__tests__/notifier.test.d.ts.map +1 -0
  103. package/dist/notifications/__tests__/notifier.test.js +104 -0
  104. package/dist/notifications/__tests__/notifier.test.js.map +1 -0
  105. package/dist/notifications/__tests__/profiles.test.d.ts +2 -0
  106. package/dist/notifications/__tests__/profiles.test.d.ts.map +1 -0
  107. package/dist/notifications/__tests__/profiles.test.js +404 -0
  108. package/dist/notifications/__tests__/profiles.test.js.map +1 -0
  109. package/dist/notifications/__tests__/reply-listener.test.d.ts +2 -0
  110. package/dist/notifications/__tests__/reply-listener.test.d.ts.map +1 -0
  111. package/dist/notifications/__tests__/reply-listener.test.js +58 -0
  112. package/dist/notifications/__tests__/reply-listener.test.js.map +1 -0
  113. package/dist/notifications/__tests__/session-registry.test.d.ts +2 -0
  114. package/dist/notifications/__tests__/session-registry.test.d.ts.map +1 -0
  115. package/dist/notifications/__tests__/session-registry.test.js +147 -0
  116. package/dist/notifications/__tests__/session-registry.test.js.map +1 -0
  117. package/dist/notifications/__tests__/tmux-detector.test.d.ts +2 -0
  118. package/dist/notifications/__tests__/tmux-detector.test.d.ts.map +1 -0
  119. package/dist/notifications/__tests__/tmux-detector.test.js +77 -0
  120. package/dist/notifications/__tests__/tmux-detector.test.js.map +1 -0
  121. package/dist/notifications/__tests__/tmux.test.d.ts +2 -0
  122. package/dist/notifications/__tests__/tmux.test.d.ts.map +1 -0
  123. package/dist/notifications/__tests__/tmux.test.js +90 -0
  124. package/dist/notifications/__tests__/tmux.test.js.map +1 -0
  125. package/dist/notifications/config.d.ts +44 -0
  126. package/dist/notifications/config.d.ts.map +1 -0
  127. package/dist/notifications/config.js +407 -0
  128. package/dist/notifications/config.js.map +1 -0
  129. package/dist/notifications/dispatcher.d.ts +15 -0
  130. package/dist/notifications/dispatcher.d.ts.map +1 -0
  131. package/dist/notifications/dispatcher.js +410 -0
  132. package/dist/notifications/dispatcher.js.map +1 -0
  133. package/dist/notifications/formatter.d.ts +14 -0
  134. package/dist/notifications/formatter.d.ts.map +1 -0
  135. package/dist/notifications/formatter.js +134 -0
  136. package/dist/notifications/formatter.js.map +1 -0
  137. package/dist/notifications/index.d.ts +32 -0
  138. package/dist/notifications/index.d.ts.map +1 -0
  139. package/dist/notifications/index.js +93 -0
  140. package/dist/notifications/index.js.map +1 -0
  141. package/dist/notifications/reply-listener.d.ts +47 -0
  142. package/dist/notifications/reply-listener.d.ts.map +1 -0
  143. package/dist/notifications/reply-listener.js +656 -0
  144. package/dist/notifications/reply-listener.js.map +1 -0
  145. package/dist/notifications/session-registry.d.ts +26 -0
  146. package/dist/notifications/session-registry.d.ts.map +1 -0
  147. package/dist/notifications/session-registry.js +275 -0
  148. package/dist/notifications/session-registry.js.map +1 -0
  149. package/dist/notifications/tmux-detector.d.ts +17 -0
  150. package/dist/notifications/tmux-detector.d.ts.map +1 -0
  151. package/dist/notifications/tmux-detector.js +82 -0
  152. package/dist/notifications/tmux-detector.js.map +1 -0
  153. package/dist/notifications/tmux.d.ts +28 -0
  154. package/dist/notifications/tmux.d.ts.map +1 -0
  155. package/dist/notifications/tmux.js +210 -0
  156. package/dist/notifications/tmux.js.map +1 -0
  157. package/dist/notifications/types.d.ts +181 -0
  158. package/dist/notifications/types.d.ts.map +1 -0
  159. package/dist/notifications/types.js +9 -0
  160. package/dist/notifications/types.js.map +1 -0
  161. package/dist/team/__tests__/runtime.test.js +54 -2
  162. package/dist/team/__tests__/runtime.test.js.map +1 -1
  163. package/dist/team/__tests__/state.test.js +30 -0
  164. package/dist/team/__tests__/state.test.js.map +1 -1
  165. package/dist/team/__tests__/worker-bootstrap.test.js +2 -0
  166. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
  167. package/dist/team/runtime.d.ts +2 -2
  168. package/dist/team/runtime.d.ts.map +1 -1
  169. package/dist/team/runtime.js +19 -12
  170. package/dist/team/runtime.js.map +1 -1
  171. package/dist/team/state.d.ts +1 -1
  172. package/dist/team/state.d.ts.map +1 -1
  173. package/dist/team/state.js +5 -0
  174. package/dist/team/state.js.map +1 -1
  175. package/dist/team/tmux-session.d.ts.map +1 -1
  176. package/dist/team/tmux-session.js +59 -15
  177. package/dist/team/tmux-session.js.map +1 -1
  178. package/dist/team/worker-bootstrap.d.ts.map +1 -1
  179. package/dist/team/worker-bootstrap.js +4 -0
  180. package/dist/team/worker-bootstrap.js.map +1 -1
  181. package/package.json +1 -1
  182. package/scripts/hook-derived-watcher.js +335 -0
  183. package/scripts/notify-hook.js +168 -7
  184. package/scripts/tmux-hook-engine.js +3 -2
@@ -0,0 +1,410 @@
1
+ /**
2
+ * Notification Dispatcher
3
+ *
4
+ * Sends notifications to configured platforms (Discord, Telegram, Slack, webhook).
5
+ * All sends are non-blocking with timeouts. Failures are swallowed to avoid
6
+ * blocking hooks.
7
+ */
8
+ import { request as httpsRequest } from "https";
9
+ import { parseMentionAllowedMentions } from "./config.js";
10
+ const SEND_TIMEOUT_MS = 10_000;
11
+ const DISPATCH_TIMEOUT_MS = 15_000;
12
+ const DISCORD_MAX_CONTENT_LENGTH = 2000;
13
+ function composeDiscordContent(message, mention) {
14
+ const mentionParsed = parseMentionAllowedMentions(mention);
15
+ const allowed_mentions = {
16
+ parse: [],
17
+ users: mentionParsed.users,
18
+ roles: mentionParsed.roles,
19
+ };
20
+ let content;
21
+ if (mention) {
22
+ const prefix = `${mention}\n`;
23
+ const maxBody = DISCORD_MAX_CONTENT_LENGTH - prefix.length;
24
+ const body = message.length > maxBody
25
+ ? message.slice(0, maxBody - 1) + "\u2026"
26
+ : message;
27
+ content = `${prefix}${body}`;
28
+ }
29
+ else {
30
+ content =
31
+ message.length > DISCORD_MAX_CONTENT_LENGTH
32
+ ? message.slice(0, DISCORD_MAX_CONTENT_LENGTH - 1) + "\u2026"
33
+ : message;
34
+ }
35
+ return { content, allowed_mentions };
36
+ }
37
+ function validateDiscordUrl(webhookUrl) {
38
+ try {
39
+ const url = new URL(webhookUrl);
40
+ const allowedHosts = ["discord.com", "discordapp.com"];
41
+ if (!allowedHosts.some((host) => url.hostname === host || url.hostname.endsWith(`.${host}`))) {
42
+ return false;
43
+ }
44
+ return url.protocol === "https:";
45
+ }
46
+ catch {
47
+ return false;
48
+ }
49
+ }
50
+ function validateTelegramToken(token) {
51
+ return /^[0-9]+:[A-Za-z0-9_-]+$/.test(token);
52
+ }
53
+ function validateSlackUrl(webhookUrl) {
54
+ try {
55
+ const url = new URL(webhookUrl);
56
+ return (url.protocol === "https:" &&
57
+ (url.hostname === "hooks.slack.com" ||
58
+ url.hostname.endsWith(".hooks.slack.com")));
59
+ }
60
+ catch {
61
+ return false;
62
+ }
63
+ }
64
+ function validateWebhookUrl(url) {
65
+ try {
66
+ const parsed = new URL(url);
67
+ return parsed.protocol === "https:";
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ }
73
+ export async function sendDiscord(config, payload) {
74
+ if (!config.enabled || !config.webhookUrl) {
75
+ return { platform: "discord", success: false, error: "Not configured" };
76
+ }
77
+ if (!validateDiscordUrl(config.webhookUrl)) {
78
+ return {
79
+ platform: "discord",
80
+ success: false,
81
+ error: "Invalid webhook URL",
82
+ };
83
+ }
84
+ try {
85
+ const { content, allowed_mentions } = composeDiscordContent(payload.message, config.mention);
86
+ const body = { content, allowed_mentions };
87
+ if (config.username) {
88
+ body.username = config.username;
89
+ }
90
+ const response = await fetch(config.webhookUrl, {
91
+ method: "POST",
92
+ headers: { "Content-Type": "application/json" },
93
+ body: JSON.stringify(body),
94
+ signal: AbortSignal.timeout(SEND_TIMEOUT_MS),
95
+ });
96
+ if (!response.ok) {
97
+ return {
98
+ platform: "discord",
99
+ success: false,
100
+ error: `HTTP ${response.status}`,
101
+ };
102
+ }
103
+ return { platform: "discord", success: true };
104
+ }
105
+ catch (error) {
106
+ return {
107
+ platform: "discord",
108
+ success: false,
109
+ error: error instanceof Error ? error.message : "Unknown error",
110
+ };
111
+ }
112
+ }
113
+ export async function sendDiscordBot(config, payload) {
114
+ if (!config.enabled) {
115
+ return { platform: "discord-bot", success: false, error: "Not enabled" };
116
+ }
117
+ const botToken = config.botToken;
118
+ const channelId = config.channelId;
119
+ if (!botToken || !channelId) {
120
+ return {
121
+ platform: "discord-bot",
122
+ success: false,
123
+ error: "Missing botToken or channelId",
124
+ };
125
+ }
126
+ try {
127
+ const { content, allowed_mentions } = composeDiscordContent(payload.message, config.mention);
128
+ const url = `https://discord.com/api/v10/channels/${channelId}/messages`;
129
+ const response = await fetch(url, {
130
+ method: "POST",
131
+ headers: {
132
+ "Content-Type": "application/json",
133
+ Authorization: `Bot ${botToken}`,
134
+ },
135
+ body: JSON.stringify({ content, allowed_mentions }),
136
+ signal: AbortSignal.timeout(SEND_TIMEOUT_MS),
137
+ });
138
+ if (!response.ok) {
139
+ return {
140
+ platform: "discord-bot",
141
+ success: false,
142
+ error: `HTTP ${response.status}`,
143
+ };
144
+ }
145
+ let messageId;
146
+ try {
147
+ const data = (await response.json());
148
+ messageId = data?.id;
149
+ }
150
+ catch {
151
+ // Non-fatal
152
+ }
153
+ return { platform: "discord-bot", success: true, messageId };
154
+ }
155
+ catch (error) {
156
+ return {
157
+ platform: "discord-bot",
158
+ success: false,
159
+ error: error instanceof Error ? error.message : "Unknown error",
160
+ };
161
+ }
162
+ }
163
+ export async function sendTelegram(config, payload) {
164
+ if (!config.enabled || !config.botToken || !config.chatId) {
165
+ return { platform: "telegram", success: false, error: "Not configured" };
166
+ }
167
+ if (!validateTelegramToken(config.botToken)) {
168
+ return {
169
+ platform: "telegram",
170
+ success: false,
171
+ error: "Invalid bot token format",
172
+ };
173
+ }
174
+ try {
175
+ const body = JSON.stringify({
176
+ chat_id: config.chatId,
177
+ text: payload.message,
178
+ parse_mode: config.parseMode || "Markdown",
179
+ });
180
+ const result = await new Promise((resolve) => {
181
+ const req = httpsRequest({
182
+ hostname: "api.telegram.org",
183
+ path: `/bot${config.botToken}/sendMessage`,
184
+ method: "POST",
185
+ family: 4,
186
+ headers: {
187
+ "Content-Type": "application/json",
188
+ "Content-Length": Buffer.byteLength(body),
189
+ },
190
+ timeout: SEND_TIMEOUT_MS,
191
+ }, (res) => {
192
+ const chunks = [];
193
+ res.on("data", (chunk) => chunks.push(chunk));
194
+ res.on("end", () => {
195
+ if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
196
+ let messageId;
197
+ try {
198
+ const body = JSON.parse(Buffer.concat(chunks).toString("utf-8"));
199
+ if (body?.result?.message_id !== undefined) {
200
+ messageId = String(body.result.message_id);
201
+ }
202
+ }
203
+ catch {
204
+ // Non-fatal
205
+ }
206
+ resolve({ platform: "telegram", success: true, messageId });
207
+ }
208
+ else {
209
+ resolve({
210
+ platform: "telegram",
211
+ success: false,
212
+ error: `HTTP ${res.statusCode}`,
213
+ });
214
+ }
215
+ });
216
+ });
217
+ req.on("error", (e) => {
218
+ resolve({ platform: "telegram", success: false, error: e.message });
219
+ });
220
+ req.on("timeout", () => {
221
+ req.destroy();
222
+ resolve({
223
+ platform: "telegram",
224
+ success: false,
225
+ error: "Request timeout",
226
+ });
227
+ });
228
+ req.write(body);
229
+ req.end();
230
+ });
231
+ return result;
232
+ }
233
+ catch (error) {
234
+ return {
235
+ platform: "telegram",
236
+ success: false,
237
+ error: error instanceof Error ? error.message : "Unknown error",
238
+ };
239
+ }
240
+ }
241
+ export async function sendSlack(config, payload) {
242
+ if (!config.enabled || !config.webhookUrl) {
243
+ return { platform: "slack", success: false, error: "Not configured" };
244
+ }
245
+ if (!validateSlackUrl(config.webhookUrl)) {
246
+ return { platform: "slack", success: false, error: "Invalid webhook URL" };
247
+ }
248
+ try {
249
+ const body = { text: payload.message };
250
+ if (config.channel) {
251
+ body.channel = config.channel;
252
+ }
253
+ if (config.username) {
254
+ body.username = config.username;
255
+ }
256
+ const response = await fetch(config.webhookUrl, {
257
+ method: "POST",
258
+ headers: { "Content-Type": "application/json" },
259
+ body: JSON.stringify(body),
260
+ signal: AbortSignal.timeout(SEND_TIMEOUT_MS),
261
+ });
262
+ if (!response.ok) {
263
+ return {
264
+ platform: "slack",
265
+ success: false,
266
+ error: `HTTP ${response.status}`,
267
+ };
268
+ }
269
+ return { platform: "slack", success: true };
270
+ }
271
+ catch (error) {
272
+ return {
273
+ platform: "slack",
274
+ success: false,
275
+ error: error instanceof Error ? error.message : "Unknown error",
276
+ };
277
+ }
278
+ }
279
+ export async function sendWebhook(config, payload) {
280
+ if (!config.enabled || !config.url) {
281
+ return { platform: "webhook", success: false, error: "Not configured" };
282
+ }
283
+ if (!validateWebhookUrl(config.url)) {
284
+ return {
285
+ platform: "webhook",
286
+ success: false,
287
+ error: "Invalid URL (HTTPS required)",
288
+ };
289
+ }
290
+ try {
291
+ const headers = {
292
+ "Content-Type": "application/json",
293
+ ...config.headers,
294
+ };
295
+ const response = await fetch(config.url, {
296
+ method: config.method || "POST",
297
+ headers,
298
+ body: JSON.stringify({
299
+ event: payload.event,
300
+ session_id: payload.sessionId,
301
+ message: payload.message,
302
+ timestamp: payload.timestamp,
303
+ tmux_session: payload.tmuxSession,
304
+ project_name: payload.projectName,
305
+ project_path: payload.projectPath,
306
+ modes_used: payload.modesUsed,
307
+ duration_ms: payload.durationMs,
308
+ reason: payload.reason,
309
+ active_mode: payload.activeMode,
310
+ question: payload.question,
311
+ }),
312
+ signal: AbortSignal.timeout(SEND_TIMEOUT_MS),
313
+ });
314
+ if (!response.ok) {
315
+ return {
316
+ platform: "webhook",
317
+ success: false,
318
+ error: `HTTP ${response.status}`,
319
+ };
320
+ }
321
+ return { platform: "webhook", success: true };
322
+ }
323
+ catch (error) {
324
+ return {
325
+ platform: "webhook",
326
+ success: false,
327
+ error: error instanceof Error ? error.message : "Unknown error",
328
+ };
329
+ }
330
+ }
331
+ function getEffectivePlatformConfig(platform, config, event) {
332
+ const eventConfig = config.events?.[event];
333
+ const eventPlatform = eventConfig?.[platform];
334
+ if (eventPlatform &&
335
+ typeof eventPlatform === "object" &&
336
+ "enabled" in eventPlatform) {
337
+ return eventPlatform;
338
+ }
339
+ return config[platform];
340
+ }
341
+ export async function dispatchNotifications(config, event, payload) {
342
+ const promises = [];
343
+ const discordConfig = getEffectivePlatformConfig("discord", config, event);
344
+ if (discordConfig?.enabled) {
345
+ promises.push(sendDiscord(discordConfig, payload));
346
+ }
347
+ const telegramConfig = getEffectivePlatformConfig("telegram", config, event);
348
+ if (telegramConfig?.enabled) {
349
+ promises.push(sendTelegram(telegramConfig, payload));
350
+ }
351
+ const slackConfig = getEffectivePlatformConfig("slack", config, event);
352
+ if (slackConfig?.enabled) {
353
+ promises.push(sendSlack(slackConfig, payload));
354
+ }
355
+ const webhookConfig = getEffectivePlatformConfig("webhook", config, event);
356
+ if (webhookConfig?.enabled) {
357
+ promises.push(sendWebhook(webhookConfig, payload));
358
+ }
359
+ const discordBotConfig = getEffectivePlatformConfig("discord-bot", config, event);
360
+ if (discordBotConfig?.enabled) {
361
+ promises.push(sendDiscordBot(discordBotConfig, payload));
362
+ }
363
+ if (promises.length === 0) {
364
+ return { event, results: [], anySuccess: false };
365
+ }
366
+ let timer;
367
+ try {
368
+ const results = await Promise.race([
369
+ Promise.allSettled(promises).then((settled) => settled.map((s) => s.status === "fulfilled"
370
+ ? s.value
371
+ : {
372
+ platform: "unknown",
373
+ success: false,
374
+ error: String(s.reason),
375
+ })),
376
+ new Promise((resolve) => {
377
+ timer = setTimeout(() => resolve([
378
+ {
379
+ platform: "unknown",
380
+ success: false,
381
+ error: "Dispatch timeout",
382
+ },
383
+ ]), DISPATCH_TIMEOUT_MS);
384
+ }),
385
+ ]);
386
+ return {
387
+ event,
388
+ results,
389
+ anySuccess: results.some((r) => r.success),
390
+ };
391
+ }
392
+ catch (error) {
393
+ return {
394
+ event,
395
+ results: [
396
+ {
397
+ platform: "unknown",
398
+ success: false,
399
+ error: String(error),
400
+ },
401
+ ],
402
+ anySuccess: false,
403
+ };
404
+ }
405
+ finally {
406
+ if (timer)
407
+ clearTimeout(timer);
408
+ }
409
+ }
410
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/notifications/dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Notification Message Formatters
3
+ *
4
+ * Produces human-readable notification messages for each event type.
5
+ * Supports markdown (Discord/Telegram) and plain text (Slack/webhook) formats.
6
+ */
7
+ import type { FullNotificationPayload } from "./types.js";
8
+ export declare function formatSessionStart(payload: FullNotificationPayload): string;
9
+ export declare function formatSessionStop(payload: FullNotificationPayload): string;
10
+ export declare function formatSessionEnd(payload: FullNotificationPayload): string;
11
+ export declare function formatSessionIdle(payload: FullNotificationPayload): string;
12
+ export declare function formatAskUserQuestion(payload: FullNotificationPayload): string;
13
+ export declare function formatNotification(payload: FullNotificationPayload): string;
14
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/notifications/formatter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AA4C1D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAiB3E;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAmB1E;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CA6BzE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAkB1E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAa9E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAe3E"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Notification Message Formatters
3
+ *
4
+ * Produces human-readable notification messages for each event type.
5
+ * Supports markdown (Discord/Telegram) and plain text (Slack/webhook) formats.
6
+ */
7
+ import { basename } from "path";
8
+ function formatDuration(ms) {
9
+ if (!ms)
10
+ return "unknown";
11
+ const seconds = Math.floor(ms / 1000);
12
+ const minutes = Math.floor(seconds / 60);
13
+ const hours = Math.floor(minutes / 60);
14
+ if (hours > 0) {
15
+ return `${hours}h ${minutes % 60}m ${seconds % 60}s`;
16
+ }
17
+ if (minutes > 0) {
18
+ return `${minutes}m ${seconds % 60}s`;
19
+ }
20
+ return `${seconds}s`;
21
+ }
22
+ function projectDisplay(payload) {
23
+ if (payload.projectName)
24
+ return payload.projectName;
25
+ if (payload.projectPath)
26
+ return basename(payload.projectPath);
27
+ return "unknown";
28
+ }
29
+ function buildFooter(payload, markdown) {
30
+ const parts = [];
31
+ if (payload.tmuxSession) {
32
+ parts.push(markdown
33
+ ? `**tmux:** \`${payload.tmuxSession}\``
34
+ : `tmux: ${payload.tmuxSession}`);
35
+ }
36
+ parts.push(markdown
37
+ ? `**project:** \`${projectDisplay(payload)}\``
38
+ : `project: ${projectDisplay(payload)}`);
39
+ return parts.join(markdown ? " | " : " | ");
40
+ }
41
+ export function formatSessionStart(payload) {
42
+ const time = new Date(payload.timestamp).toLocaleTimeString();
43
+ const project = projectDisplay(payload);
44
+ const lines = [
45
+ `# Session Started`,
46
+ "",
47
+ `**Session:** \`${payload.sessionId}\``,
48
+ `**Project:** \`${project}\``,
49
+ `**Time:** ${time}`,
50
+ ];
51
+ if (payload.tmuxSession) {
52
+ lines.push(`**tmux:** \`${payload.tmuxSession}\``);
53
+ }
54
+ return lines.join("\n");
55
+ }
56
+ export function formatSessionStop(payload) {
57
+ const lines = [`# Session Continuing`, ""];
58
+ if (payload.activeMode) {
59
+ lines.push(`**Mode:** ${payload.activeMode}`);
60
+ }
61
+ if (payload.iteration != null && payload.maxIterations != null) {
62
+ lines.push(`**Iteration:** ${payload.iteration}/${payload.maxIterations}`);
63
+ }
64
+ if (payload.incompleteTasks != null && payload.incompleteTasks > 0) {
65
+ lines.push(`**Incomplete tasks:** ${payload.incompleteTasks}`);
66
+ }
67
+ lines.push("");
68
+ lines.push(buildFooter(payload, true));
69
+ return lines.join("\n");
70
+ }
71
+ export function formatSessionEnd(payload) {
72
+ const duration = formatDuration(payload.durationMs);
73
+ const lines = [
74
+ `# Session Ended`,
75
+ "",
76
+ `**Session:** \`${payload.sessionId}\``,
77
+ `**Duration:** ${duration}`,
78
+ `**Reason:** ${payload.reason || "unknown"}`,
79
+ ];
80
+ if (payload.agentsSpawned != null) {
81
+ lines.push(`**Agents:** ${payload.agentsCompleted ?? 0}/${payload.agentsSpawned} completed`);
82
+ }
83
+ if (payload.modesUsed && payload.modesUsed.length > 0) {
84
+ lines.push(`**Modes:** ${payload.modesUsed.join(", ")}`);
85
+ }
86
+ if (payload.contextSummary) {
87
+ lines.push("", `**Summary:** ${payload.contextSummary}`);
88
+ }
89
+ lines.push("");
90
+ lines.push(buildFooter(payload, true));
91
+ return lines.join("\n");
92
+ }
93
+ export function formatSessionIdle(payload) {
94
+ const lines = [`# Session Idle`, ""];
95
+ lines.push(`Codex has finished and is waiting for input.`);
96
+ lines.push("");
97
+ if (payload.reason) {
98
+ lines.push(`**Reason:** ${payload.reason}`);
99
+ }
100
+ if (payload.modesUsed && payload.modesUsed.length > 0) {
101
+ lines.push(`**Modes:** ${payload.modesUsed.join(", ")}`);
102
+ }
103
+ lines.push("");
104
+ lines.push(buildFooter(payload, true));
105
+ return lines.join("\n");
106
+ }
107
+ export function formatAskUserQuestion(payload) {
108
+ const lines = [`# Input Needed`, ""];
109
+ if (payload.question) {
110
+ lines.push(`**Question:** ${payload.question}`);
111
+ lines.push("");
112
+ }
113
+ lines.push(`Codex is waiting for your response.`);
114
+ lines.push("");
115
+ lines.push(buildFooter(payload, true));
116
+ return lines.join("\n");
117
+ }
118
+ export function formatNotification(payload) {
119
+ switch (payload.event) {
120
+ case "session-start":
121
+ return formatSessionStart(payload);
122
+ case "session-stop":
123
+ return formatSessionStop(payload);
124
+ case "session-end":
125
+ return formatSessionEnd(payload);
126
+ case "session-idle":
127
+ return formatSessionIdle(payload);
128
+ case "ask-user-question":
129
+ return formatAskUserQuestion(payload);
130
+ default:
131
+ return payload.message || `Event: ${payload.event}`;
132
+ }
133
+ }
134
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/notifications/formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Notification System - Public API
3
+ *
4
+ * Multi-platform lifecycle notifications for oh-my-codex.
5
+ * Sends notifications to Discord, Telegram, Slack, and generic webhooks
6
+ * on session lifecycle events.
7
+ *
8
+ * Usage:
9
+ * import { notifyLifecycle } from '../notifications/index.js';
10
+ * await notifyLifecycle('session-start', { sessionId, projectPath, ... });
11
+ */
12
+ export type { NotificationEvent, NotificationPlatform, FullNotificationConfig, FullNotificationPayload, NotificationResult, DispatchResult, DiscordNotificationConfig, DiscordBotNotificationConfig, TelegramNotificationConfig, SlackNotificationConfig, WebhookNotificationConfig, EventNotificationConfig, ReplyConfig, NotificationProfilesConfig, NotificationsBlock, } from "./types.js";
13
+ export { dispatchNotifications, sendDiscord, sendDiscordBot, sendTelegram, sendSlack, sendWebhook, } from "./dispatcher.js";
14
+ export { formatNotification, formatSessionStart, formatSessionStop, formatSessionEnd, formatSessionIdle, formatAskUserQuestion, } from "./formatter.js";
15
+ export { getCurrentTmuxSession, getCurrentTmuxPaneId, getTeamTmuxSessions, formatTmuxInfo, } from "./tmux.js";
16
+ export { getNotificationConfig, isEventEnabled, getEnabledPlatforms, getReplyConfig, getReplyListenerPlatformConfig, resolveProfileConfig, listProfiles, getActiveProfileName, } from "./config.js";
17
+ export { registerMessage, loadAllMappings, lookupByMessageId, removeSession, removeMessagesByPane, pruneStale, } from "./session-registry.js";
18
+ export type { SessionMapping } from "./session-registry.js";
19
+ export { startReplyListener, stopReplyListener, getReplyListenerStatus, isDaemonRunning, sanitizeReplyInput, } from "./reply-listener.js";
20
+ export { notify, loadNotificationConfig } from "./notifier.js";
21
+ export type { NotificationConfig, NotificationPayload } from "./notifier.js";
22
+ import type { NotificationEvent, FullNotificationPayload, DispatchResult } from "./types.js";
23
+ /**
24
+ * High-level notification function for lifecycle events.
25
+ *
26
+ * Reads config, checks if the event is enabled, formats the message,
27
+ * and dispatches to all configured platforms. Non-blocking, swallows errors.
28
+ */
29
+ export declare function notifyLifecycle(event: NotificationEvent, data: Partial<FullNotificationPayload> & {
30
+ sessionId: string;
31
+ }, profileName?: string): Promise<DispatchResult | null>;
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/notifications/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,YAAY,EACV,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,cAAc,EACd,yBAAyB,EACzB,4BAA4B,EAC5B,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,WAAW,EACX,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,SAAS,EACT,WAAW,GACZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,8BAA8B,EAC9B,oBAAoB,EACpB,YAAY,EACZ,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,UAAU,GACX,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC/D,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAE7E,OAAO,KAAK,EACV,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,EACf,MAAM,YAAY,CAAC;AAOpB;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC9D,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAuEhC"}