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,407 @@
1
+ /**
2
+ * Notification Configuration Reader
3
+ *
4
+ * Reads notification config from .omx-config.json and provides
5
+ * backward compatibility with the old stopHookCallbacks format.
6
+ */
7
+ import { readFileSync, existsSync } from "fs";
8
+ import { join } from "path";
9
+ import { codexHome } from "../utils/paths.js";
10
+ const CONFIG_FILE = join(codexHome(), ".omx-config.json");
11
+ function readRawConfig() {
12
+ if (!existsSync(CONFIG_FILE))
13
+ return null;
14
+ try {
15
+ return JSON.parse(readFileSync(CONFIG_FILE, "utf-8"));
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ }
21
+ function migrateStopHookCallbacks(raw) {
22
+ const callbacks = raw.stopHookCallbacks;
23
+ if (!callbacks)
24
+ return null;
25
+ const config = {
26
+ enabled: true,
27
+ events: {
28
+ "session-end": { enabled: true },
29
+ },
30
+ };
31
+ const telegram = callbacks.telegram;
32
+ if (telegram?.enabled) {
33
+ const telegramConfig = {
34
+ enabled: true,
35
+ botToken: telegram.botToken || "",
36
+ chatId: telegram.chatId || "",
37
+ };
38
+ config.telegram = telegramConfig;
39
+ }
40
+ const discord = callbacks.discord;
41
+ if (discord?.enabled) {
42
+ const discordConfig = {
43
+ enabled: true,
44
+ webhookUrl: discord.webhookUrl || "",
45
+ };
46
+ config.discord = discordConfig;
47
+ }
48
+ return config;
49
+ }
50
+ function normalizeOptional(value) {
51
+ const trimmed = value?.trim();
52
+ return trimmed || undefined;
53
+ }
54
+ export function validateMention(raw) {
55
+ const mention = normalizeOptional(raw);
56
+ if (!mention)
57
+ return undefined;
58
+ if (/^<@!?\d{17,20}>$/.test(mention) || /^<@&\d{17,20}>$/.test(mention)) {
59
+ return mention;
60
+ }
61
+ return undefined;
62
+ }
63
+ export function parseMentionAllowedMentions(mention) {
64
+ if (!mention)
65
+ return {};
66
+ const userMatch = mention.match(/^<@!?(\d{17,20})>$/);
67
+ if (userMatch)
68
+ return { users: [userMatch[1]] };
69
+ const roleMatch = mention.match(/^<@&(\d{17,20})>$/);
70
+ if (roleMatch)
71
+ return { roles: [roleMatch[1]] };
72
+ return {};
73
+ }
74
+ export function buildConfigFromEnv() {
75
+ const config = { enabled: false };
76
+ let hasAnyPlatform = false;
77
+ const discordMention = validateMention(process.env.OMX_DISCORD_MENTION);
78
+ const discordBotToken = process.env.OMX_DISCORD_NOTIFIER_BOT_TOKEN;
79
+ const discordChannel = process.env.OMX_DISCORD_NOTIFIER_CHANNEL;
80
+ if (discordBotToken && discordChannel) {
81
+ config["discord-bot"] = {
82
+ enabled: true,
83
+ botToken: discordBotToken,
84
+ channelId: discordChannel,
85
+ mention: discordMention,
86
+ };
87
+ hasAnyPlatform = true;
88
+ }
89
+ const discordWebhook = process.env.OMX_DISCORD_WEBHOOK_URL;
90
+ if (discordWebhook) {
91
+ config.discord = {
92
+ enabled: true,
93
+ webhookUrl: discordWebhook,
94
+ mention: discordMention,
95
+ };
96
+ hasAnyPlatform = true;
97
+ }
98
+ const telegramToken = process.env.OMX_TELEGRAM_BOT_TOKEN ||
99
+ process.env.OMX_TELEGRAM_NOTIFIER_BOT_TOKEN;
100
+ const telegramChatId = process.env.OMX_TELEGRAM_CHAT_ID ||
101
+ process.env.OMX_TELEGRAM_NOTIFIER_CHAT_ID ||
102
+ process.env.OMX_TELEGRAM_NOTIFIER_UID;
103
+ if (telegramToken && telegramChatId) {
104
+ config.telegram = {
105
+ enabled: true,
106
+ botToken: telegramToken,
107
+ chatId: telegramChatId,
108
+ };
109
+ hasAnyPlatform = true;
110
+ }
111
+ const slackWebhook = process.env.OMX_SLACK_WEBHOOK_URL;
112
+ if (slackWebhook) {
113
+ config.slack = {
114
+ enabled: true,
115
+ webhookUrl: slackWebhook,
116
+ };
117
+ hasAnyPlatform = true;
118
+ }
119
+ if (!hasAnyPlatform)
120
+ return null;
121
+ config.enabled = true;
122
+ return config;
123
+ }
124
+ function mergeEnvIntoFileConfig(fileConfig, envConfig) {
125
+ const merged = { ...fileConfig };
126
+ if (!merged["discord-bot"] && envConfig["discord-bot"]) {
127
+ merged["discord-bot"] = envConfig["discord-bot"];
128
+ }
129
+ else if (merged["discord-bot"] && envConfig["discord-bot"]) {
130
+ merged["discord-bot"] = {
131
+ ...merged["discord-bot"],
132
+ botToken: merged["discord-bot"].botToken || envConfig["discord-bot"].botToken,
133
+ channelId: merged["discord-bot"].channelId || envConfig["discord-bot"].channelId,
134
+ mention: merged["discord-bot"].mention !== undefined
135
+ ? validateMention(merged["discord-bot"].mention)
136
+ : envConfig["discord-bot"].mention,
137
+ };
138
+ }
139
+ if (!merged.discord && envConfig.discord) {
140
+ merged.discord = envConfig.discord;
141
+ }
142
+ else if (merged.discord && envConfig.discord) {
143
+ merged.discord = {
144
+ ...merged.discord,
145
+ webhookUrl: merged.discord.webhookUrl || envConfig.discord.webhookUrl,
146
+ mention: merged.discord.mention !== undefined
147
+ ? validateMention(merged.discord.mention)
148
+ : envConfig.discord.mention,
149
+ };
150
+ }
151
+ else if (merged.discord) {
152
+ merged.discord = {
153
+ ...merged.discord,
154
+ mention: validateMention(merged.discord.mention),
155
+ };
156
+ }
157
+ if (!merged.telegram && envConfig.telegram) {
158
+ merged.telegram = envConfig.telegram;
159
+ }
160
+ if (!merged.slack && envConfig.slack) {
161
+ merged.slack = envConfig.slack;
162
+ }
163
+ return merged;
164
+ }
165
+ /**
166
+ * Resolve a named profile from the notifications block.
167
+ *
168
+ * Priority:
169
+ * 1. Explicit `profileName` argument
170
+ * 2. OMX_NOTIFY_PROFILE environment variable
171
+ * 3. `defaultProfile` field in config
172
+ * 4. null (no profile selected → fall back to flat config)
173
+ */
174
+ export function resolveProfileConfig(notifications, profileName) {
175
+ const profiles = notifications.profiles;
176
+ if (!profiles || Object.keys(profiles).length === 0) {
177
+ return null; // no profiles defined, use flat config
178
+ }
179
+ const name = profileName ||
180
+ process.env.OMX_NOTIFY_PROFILE ||
181
+ notifications.defaultProfile;
182
+ if (!name) {
183
+ return null; // no profile selected, use flat config
184
+ }
185
+ const profile = profiles[name];
186
+ if (!profile) {
187
+ console.warn(`[notifications] Profile "${name}" not found. Available: ${Object.keys(profiles).join(", ")}`);
188
+ return null;
189
+ }
190
+ return profile;
191
+ }
192
+ /**
193
+ * List available profile names from the config file.
194
+ */
195
+ export function listProfiles() {
196
+ const raw = readRawConfig();
197
+ if (!raw)
198
+ return [];
199
+ const notifications = raw.notifications;
200
+ if (!notifications?.profiles)
201
+ return [];
202
+ return Object.keys(notifications.profiles);
203
+ }
204
+ /**
205
+ * Get the active profile name based on resolution priority.
206
+ * Returns null if no profile is active (flat config mode).
207
+ */
208
+ export function getActiveProfileName() {
209
+ if (process.env.OMX_NOTIFY_PROFILE) {
210
+ return process.env.OMX_NOTIFY_PROFILE;
211
+ }
212
+ const raw = readRawConfig();
213
+ if (!raw)
214
+ return null;
215
+ const notifications = raw.notifications;
216
+ if (!notifications?.profiles || Object.keys(notifications.profiles).length === 0) {
217
+ return null;
218
+ }
219
+ return notifications.defaultProfile || null;
220
+ }
221
+ export function getNotificationConfig(profileName) {
222
+ const raw = readRawConfig();
223
+ if (raw) {
224
+ const notifications = raw.notifications;
225
+ if (notifications) {
226
+ // Try profile resolution first
227
+ const profileConfig = resolveProfileConfig(notifications, profileName);
228
+ if (profileConfig) {
229
+ if (typeof profileConfig.enabled !== "boolean") {
230
+ return null;
231
+ }
232
+ const envConfig = buildConfigFromEnv();
233
+ if (envConfig) {
234
+ return mergeEnvIntoFileConfig(profileConfig, envConfig);
235
+ }
236
+ return profileConfig;
237
+ }
238
+ // Fall back to flat config (backward compatible)
239
+ if (typeof notifications.enabled !== "boolean") {
240
+ return null;
241
+ }
242
+ const envConfig = buildConfigFromEnv();
243
+ if (envConfig) {
244
+ return mergeEnvIntoFileConfig(notifications, envConfig);
245
+ }
246
+ const envMention = validateMention(process.env.OMX_DISCORD_MENTION);
247
+ if (envMention) {
248
+ const patched = { ...notifications };
249
+ if (patched["discord-bot"] && patched["discord-bot"].mention === undefined) {
250
+ patched["discord-bot"] = { ...patched["discord-bot"], mention: envMention };
251
+ }
252
+ if (patched.discord && patched.discord.mention === undefined) {
253
+ patched.discord = { ...patched.discord, mention: envMention };
254
+ }
255
+ return patched;
256
+ }
257
+ return notifications;
258
+ }
259
+ }
260
+ const envConfig = buildConfigFromEnv();
261
+ if (envConfig)
262
+ return envConfig;
263
+ if (raw) {
264
+ return migrateStopHookCallbacks(raw);
265
+ }
266
+ return null;
267
+ }
268
+ export function isEventEnabled(config, event) {
269
+ if (!config.enabled)
270
+ return false;
271
+ const eventConfig = config.events?.[event];
272
+ if (eventConfig && eventConfig.enabled === false)
273
+ return false;
274
+ if (!eventConfig) {
275
+ return !!(config.discord?.enabled ||
276
+ config["discord-bot"]?.enabled ||
277
+ config.telegram?.enabled ||
278
+ config.slack?.enabled ||
279
+ config.webhook?.enabled);
280
+ }
281
+ if (eventConfig.discord?.enabled ||
282
+ eventConfig["discord-bot"]?.enabled ||
283
+ eventConfig.telegram?.enabled ||
284
+ eventConfig.slack?.enabled ||
285
+ eventConfig.webhook?.enabled) {
286
+ return true;
287
+ }
288
+ return !!(config.discord?.enabled ||
289
+ config["discord-bot"]?.enabled ||
290
+ config.telegram?.enabled ||
291
+ config.slack?.enabled ||
292
+ config.webhook?.enabled);
293
+ }
294
+ export function getEnabledPlatforms(config, event) {
295
+ if (!config.enabled)
296
+ return [];
297
+ const platforms = [];
298
+ const eventConfig = config.events?.[event];
299
+ if (eventConfig && eventConfig.enabled === false)
300
+ return [];
301
+ const checkPlatform = (platform) => {
302
+ const eventPlatform = eventConfig?.[platform];
303
+ if (eventPlatform &&
304
+ typeof eventPlatform === "object" &&
305
+ "enabled" in eventPlatform) {
306
+ if (eventPlatform.enabled) {
307
+ platforms.push(platform);
308
+ }
309
+ return;
310
+ }
311
+ const topLevel = config[platform];
312
+ if (topLevel &&
313
+ typeof topLevel === "object" &&
314
+ "enabled" in topLevel &&
315
+ topLevel.enabled) {
316
+ platforms.push(platform);
317
+ }
318
+ };
319
+ checkPlatform("discord");
320
+ checkPlatform("discord-bot");
321
+ checkPlatform("telegram");
322
+ checkPlatform("slack");
323
+ checkPlatform("webhook");
324
+ return platforms;
325
+ }
326
+ const REPLY_PLATFORM_EVENTS = [
327
+ "session-start",
328
+ "ask-user-question",
329
+ "session-stop",
330
+ "session-idle",
331
+ "session-end",
332
+ ];
333
+ function getEnabledReplyPlatformConfig(config, platform) {
334
+ const topLevel = config[platform];
335
+ if (topLevel?.enabled) {
336
+ return topLevel;
337
+ }
338
+ for (const event of REPLY_PLATFORM_EVENTS) {
339
+ const eventConfig = config.events?.[event];
340
+ const eventPlatform = eventConfig?.[platform];
341
+ if (eventPlatform &&
342
+ typeof eventPlatform === "object" &&
343
+ "enabled" in eventPlatform &&
344
+ eventPlatform.enabled) {
345
+ return eventPlatform;
346
+ }
347
+ }
348
+ return undefined;
349
+ }
350
+ export function getReplyListenerPlatformConfig(config) {
351
+ if (!config)
352
+ return {};
353
+ const telegramConfig = getEnabledReplyPlatformConfig(config, "telegram");
354
+ const discordBotConfig = getEnabledReplyPlatformConfig(config, "discord-bot");
355
+ return {
356
+ telegramBotToken: telegramConfig?.botToken || config.telegram?.botToken,
357
+ telegramChatId: telegramConfig?.chatId || config.telegram?.chatId,
358
+ discordBotToken: discordBotConfig?.botToken || config["discord-bot"]?.botToken,
359
+ discordChannelId: discordBotConfig?.channelId || config["discord-bot"]?.channelId,
360
+ discordMention: discordBotConfig?.mention || config["discord-bot"]?.mention,
361
+ };
362
+ }
363
+ function parseDiscordUserIds(envValue, configValue) {
364
+ if (envValue) {
365
+ const ids = envValue
366
+ .split(",")
367
+ .map((id) => id.trim())
368
+ .filter((id) => /^\d{17,20}$/.test(id));
369
+ if (ids.length > 0)
370
+ return ids;
371
+ }
372
+ if (Array.isArray(configValue)) {
373
+ const ids = configValue
374
+ .filter((id) => typeof id === "string" && /^\d{17,20}$/.test(id));
375
+ if (ids.length > 0)
376
+ return ids;
377
+ }
378
+ return [];
379
+ }
380
+ export function getReplyConfig() {
381
+ const notifConfig = getNotificationConfig();
382
+ if (!notifConfig?.enabled)
383
+ return null;
384
+ const hasDiscordBot = !!getEnabledReplyPlatformConfig(notifConfig, "discord-bot");
385
+ const hasTelegram = !!getEnabledReplyPlatformConfig(notifConfig, "telegram");
386
+ if (!hasDiscordBot && !hasTelegram)
387
+ return null;
388
+ const raw = readRawConfig();
389
+ const replyRaw = raw?.notifications?.reply;
390
+ const enabled = process.env.OMX_REPLY_ENABLED === "true" || replyRaw?.enabled === true;
391
+ if (!enabled)
392
+ return null;
393
+ const authorizedDiscordUserIds = parseDiscordUserIds(process.env.OMX_REPLY_DISCORD_USER_IDS, replyRaw?.authorizedDiscordUserIds);
394
+ if (hasDiscordBot && authorizedDiscordUserIds.length === 0) {
395
+ console.warn("[notifications] Discord reply listening disabled: authorizedDiscordUserIds is empty. " +
396
+ "Set OMX_REPLY_DISCORD_USER_IDS or add to .omx-config.json notifications.reply.authorizedDiscordUserIds");
397
+ }
398
+ return {
399
+ enabled: true,
400
+ pollIntervalMs: parseInt(process.env.OMX_REPLY_POLL_INTERVAL_MS || "") || replyRaw?.pollIntervalMs || 3000,
401
+ maxMessageLength: replyRaw?.maxMessageLength || 500,
402
+ rateLimitPerMinute: parseInt(process.env.OMX_REPLY_RATE_LIMIT || "") || replyRaw?.rateLimitPerMinute || 10,
403
+ includePrefix: process.env.OMX_REPLY_INCLUDE_PREFIX !== "false" && (replyRaw?.includePrefix !== false),
404
+ authorizedDiscordUserIds,
405
+ };
406
+ }
407
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/notifications/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
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 type { DiscordNotificationConfig, DiscordBotNotificationConfig, TelegramNotificationConfig, SlackNotificationConfig, WebhookNotificationConfig, FullNotificationPayload, NotificationResult, DispatchResult, FullNotificationConfig, NotificationEvent } from "./types.js";
9
+ export declare function sendDiscord(config: DiscordNotificationConfig, payload: FullNotificationPayload): Promise<NotificationResult>;
10
+ export declare function sendDiscordBot(config: DiscordBotNotificationConfig, payload: FullNotificationPayload): Promise<NotificationResult>;
11
+ export declare function sendTelegram(config: TelegramNotificationConfig, payload: FullNotificationPayload): Promise<NotificationResult>;
12
+ export declare function sendSlack(config: SlackNotificationConfig, payload: FullNotificationPayload): Promise<NotificationResult>;
13
+ export declare function sendWebhook(config: WebhookNotificationConfig, payload: FullNotificationPayload): Promise<NotificationResult>;
14
+ export declare function dispatchNotifications(config: FullNotificationConfig, event: NotificationEvent, payload: FullNotificationPayload): Promise<DispatchResult>;
15
+ //# sourceMappingURL=dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/notifications/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,yBAAyB,EACzB,4BAA4B,EAC5B,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAElB,cAAc,EACd,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAoFpB,wBAAsB,WAAW,CAC/B,MAAM,EAAE,yBAAyB,EACjC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CA8C7B;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,4BAA4B,EACpC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAwD7B;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,0BAA0B,EAClC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAmF7B;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,uBAAuB,EAC/B,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAyC7B;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,yBAAyB,EACjC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAuD7B;AAqBD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,cAAc,CAAC,CAsGzB"}