musonda 1.0.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 (196) hide show
  1. package/IMPLEMENTATION.md +432 -0
  2. package/README.md +119 -0
  3. package/dist/agent/harness.d.ts +25 -0
  4. package/dist/agent/harness.js +215 -0
  5. package/dist/agent/harness.js.map +1 -0
  6. package/dist/agent/openaiResponsesClient.d.ts +35 -0
  7. package/dist/agent/openaiResponsesClient.js +250 -0
  8. package/dist/agent/openaiResponsesClient.js.map +1 -0
  9. package/dist/agent/systemPrompt.d.ts +9 -0
  10. package/dist/agent/systemPrompt.js +100 -0
  11. package/dist/agent/systemPrompt.js.map +1 -0
  12. package/dist/agent/types.d.ts +53 -0
  13. package/dist/agent/types.js +2 -0
  14. package/dist/agent/types.js.map +1 -0
  15. package/dist/cli/commands/chat.d.ts +6 -0
  16. package/dist/cli/commands/chat.js +8 -0
  17. package/dist/cli/commands/chat.js.map +1 -0
  18. package/dist/cli/commands/doctor.d.ts +4 -0
  19. package/dist/cli/commands/doctor.js +336 -0
  20. package/dist/cli/commands/doctor.js.map +1 -0
  21. package/dist/cli/commands/gateway.d.ts +20 -0
  22. package/dist/cli/commands/gateway.js +135 -0
  23. package/dist/cli/commands/gateway.js.map +1 -0
  24. package/dist/cli/commands/help.d.ts +4 -0
  25. package/dist/cli/commands/help.js +159 -0
  26. package/dist/cli/commands/help.js.map +1 -0
  27. package/dist/cli/commands/plugins.d.ts +18 -0
  28. package/dist/cli/commands/plugins.js +250 -0
  29. package/dist/cli/commands/plugins.js.map +1 -0
  30. package/dist/cli/commands/service.d.ts +16 -0
  31. package/dist/cli/commands/service.js +136 -0
  32. package/dist/cli/commands/service.js.map +1 -0
  33. package/dist/cli/commands/setup.d.ts +4 -0
  34. package/dist/cli/commands/setup.js +8 -0
  35. package/dist/cli/commands/setup.js.map +1 -0
  36. package/dist/cli/commands/status.d.ts +4 -0
  37. package/dist/cli/commands/status.js +73 -0
  38. package/dist/cli/commands/status.js.map +1 -0
  39. package/dist/cli/commands/update.d.ts +22 -0
  40. package/dist/cli/commands/update.js +226 -0
  41. package/dist/cli/commands/update.js.map +1 -0
  42. package/dist/cli/daemon.d.ts +33 -0
  43. package/dist/cli/daemon.js +208 -0
  44. package/dist/cli/daemon.js.map +1 -0
  45. package/dist/cli/interactiveMenu.d.ts +5 -0
  46. package/dist/cli/interactiveMenu.js +225 -0
  47. package/dist/cli/interactiveMenu.js.map +1 -0
  48. package/dist/cli/musondaCli.d.ts +30 -0
  49. package/dist/cli/musondaCli.js +269 -0
  50. package/dist/cli/musondaCli.js.map +1 -0
  51. package/dist/cli/ui.d.ts +49 -0
  52. package/dist/cli/ui.js +90 -0
  53. package/dist/cli/ui.js.map +1 -0
  54. package/dist/cli.d.ts +9 -0
  55. package/dist/cli.js +315 -0
  56. package/dist/cli.js.map +1 -0
  57. package/dist/config/loader.d.ts +12 -0
  58. package/dist/config/loader.js +217 -0
  59. package/dist/config/loader.js.map +1 -0
  60. package/dist/config/paths.d.ts +11 -0
  61. package/dist/config/paths.js +18 -0
  62. package/dist/config/paths.js.map +1 -0
  63. package/dist/config/types.d.ts +246 -0
  64. package/dist/config/types.js +155 -0
  65. package/dist/config/types.js.map +1 -0
  66. package/dist/gateway/channels/cli.d.ts +37 -0
  67. package/dist/gateway/channels/cli.js +298 -0
  68. package/dist/gateway/channels/cli.js.map +1 -0
  69. package/dist/gateway/channels/discord.d.ts +18 -0
  70. package/dist/gateway/channels/discord.js +419 -0
  71. package/dist/gateway/channels/discord.js.map +1 -0
  72. package/dist/gateway/channels/slack.d.ts +26 -0
  73. package/dist/gateway/channels/slack.js +470 -0
  74. package/dist/gateway/channels/slack.js.map +1 -0
  75. package/dist/gateway/channels/webhook.d.ts +18 -0
  76. package/dist/gateway/channels/webhook.js +49 -0
  77. package/dist/gateway/channels/webhook.js.map +1 -0
  78. package/dist/gateway/http.d.ts +33 -0
  79. package/dist/gateway/http.js +605 -0
  80. package/dist/gateway/http.js.map +1 -0
  81. package/dist/gateway/server.d.ts +38 -0
  82. package/dist/gateway/server.js +233 -0
  83. package/dist/gateway/server.js.map +1 -0
  84. package/dist/gateway/types.d.ts +28 -0
  85. package/dist/gateway/types.js +2 -0
  86. package/dist/gateway/types.js.map +1 -0
  87. package/dist/index.d.ts +17 -0
  88. package/dist/index.js +32 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/memory/memoryManager.d.ts +22 -0
  91. package/dist/memory/memoryManager.js +200 -0
  92. package/dist/memory/memoryManager.js.map +1 -0
  93. package/dist/memory/storage.d.ts +24 -0
  94. package/dist/memory/storage.js +187 -0
  95. package/dist/memory/storage.js.map +1 -0
  96. package/dist/memory/types.d.ts +43 -0
  97. package/dist/memory/types.js +2 -0
  98. package/dist/memory/types.js.map +1 -0
  99. package/dist/plugins/manifest.d.ts +23 -0
  100. package/dist/plugins/manifest.js +185 -0
  101. package/dist/plugins/manifest.js.map +1 -0
  102. package/dist/plugins/mcp/mcpBridge.d.ts +31 -0
  103. package/dist/plugins/mcp/mcpBridge.js +115 -0
  104. package/dist/plugins/mcp/mcpBridge.js.map +1 -0
  105. package/dist/plugins/mcp/mcpClient.d.ts +43 -0
  106. package/dist/plugins/mcp/mcpClient.js +309 -0
  107. package/dist/plugins/mcp/mcpClient.js.map +1 -0
  108. package/dist/plugins/mcp/mcpConfig.d.ts +34 -0
  109. package/dist/plugins/mcp/mcpConfig.js +326 -0
  110. package/dist/plugins/mcp/mcpConfig.js.map +1 -0
  111. package/dist/plugins/mcp/types.d.ts +48 -0
  112. package/dist/plugins/mcp/types.js +2 -0
  113. package/dist/plugins/mcp/types.js.map +1 -0
  114. package/dist/plugins/pluginManager.d.ts +164 -0
  115. package/dist/plugins/pluginManager.js +1016 -0
  116. package/dist/plugins/pluginManager.js.map +1 -0
  117. package/dist/plugins/skills/frontmatterParser.d.ts +28 -0
  118. package/dist/plugins/skills/frontmatterParser.js +189 -0
  119. package/dist/plugins/skills/frontmatterParser.js.map +1 -0
  120. package/dist/plugins/skills/skillDiscovery.d.ts +15 -0
  121. package/dist/plugins/skills/skillDiscovery.js +148 -0
  122. package/dist/plugins/skills/skillDiscovery.js.map +1 -0
  123. package/dist/plugins/skills/skillTools.d.ts +8 -0
  124. package/dist/plugins/skills/skillTools.js +195 -0
  125. package/dist/plugins/skills/skillTools.js.map +1 -0
  126. package/dist/plugins/skills/types.d.ts +25 -0
  127. package/dist/plugins/skills/types.js +2 -0
  128. package/dist/plugins/skills/types.js.map +1 -0
  129. package/dist/plugins/types.d.ts +30 -0
  130. package/dist/plugins/types.js +2 -0
  131. package/dist/plugins/types.js.map +1 -0
  132. package/dist/scheduler/scheduler.d.ts +25 -0
  133. package/dist/scheduler/scheduler.js +239 -0
  134. package/dist/scheduler/scheduler.js.map +1 -0
  135. package/dist/scheduler/types.d.ts +39 -0
  136. package/dist/scheduler/types.js +2 -0
  137. package/dist/scheduler/types.js.map +1 -0
  138. package/dist/security/childProcessEnv.d.ts +5 -0
  139. package/dist/security/childProcessEnv.js +42 -0
  140. package/dist/security/childProcessEnv.js.map +1 -0
  141. package/dist/security/fileSandbox.d.ts +153 -0
  142. package/dist/security/fileSandbox.js +779 -0
  143. package/dist/security/fileSandbox.js.map +1 -0
  144. package/dist/service/index.d.ts +30 -0
  145. package/dist/service/index.js +41 -0
  146. package/dist/service/index.js.map +1 -0
  147. package/dist/service/systemd.d.ts +36 -0
  148. package/dist/service/systemd.js +409 -0
  149. package/dist/service/systemd.js.map +1 -0
  150. package/dist/service/types.d.ts +118 -0
  151. package/dist/service/types.js +6 -0
  152. package/dist/service/types.js.map +1 -0
  153. package/dist/tools/builtin/calcTools.d.ts +2 -0
  154. package/dist/tools/builtin/calcTools.js +51 -0
  155. package/dist/tools/builtin/calcTools.js.map +1 -0
  156. package/dist/tools/builtin/fileTools.d.ts +11 -0
  157. package/dist/tools/builtin/fileTools.js +352 -0
  158. package/dist/tools/builtin/fileTools.js.map +1 -0
  159. package/dist/tools/builtin/memoryTools.d.ts +4 -0
  160. package/dist/tools/builtin/memoryTools.js +123 -0
  161. package/dist/tools/builtin/memoryTools.js.map +1 -0
  162. package/dist/tools/builtin/noteTools.d.ts +4 -0
  163. package/dist/tools/builtin/noteTools.js +91 -0
  164. package/dist/tools/builtin/noteTools.js.map +1 -0
  165. package/dist/tools/builtin/pluginTools.d.ts +29 -0
  166. package/dist/tools/builtin/pluginTools.js +406 -0
  167. package/dist/tools/builtin/pluginTools.js.map +1 -0
  168. package/dist/tools/builtin/scheduleTools.d.ts +4 -0
  169. package/dist/tools/builtin/scheduleTools.js +156 -0
  170. package/dist/tools/builtin/scheduleTools.js.map +1 -0
  171. package/dist/tools/builtin/timeTools.d.ts +2 -0
  172. package/dist/tools/builtin/timeTools.js +41 -0
  173. package/dist/tools/builtin/timeTools.js.map +1 -0
  174. package/dist/tools/builtin/webTools.d.ts +12 -0
  175. package/dist/tools/builtin/webTools.js +325 -0
  176. package/dist/tools/builtin/webTools.js.map +1 -0
  177. package/dist/tools/registry.d.ts +15 -0
  178. package/dist/tools/registry.js +111 -0
  179. package/dist/tools/registry.js.map +1 -0
  180. package/dist/tools/types.d.ts +41 -0
  181. package/dist/tools/types.js +2 -0
  182. package/dist/tools/types.js.map +1 -0
  183. package/dist/utils/logger.d.ts +29 -0
  184. package/dist/utils/logger.js +124 -0
  185. package/dist/utils/logger.js.map +1 -0
  186. package/dist/wizard/onboarding.d.ts +3 -0
  187. package/dist/wizard/onboarding.js +408 -0
  188. package/dist/wizard/onboarding.js.map +1 -0
  189. package/package.json +69 -0
  190. package/plugins/example-calc/mcp.json +11 -0
  191. package/plugins/example-calc/plugin.json +12 -0
  192. package/plugins/example-calc/server.mjs +92 -0
  193. package/plugins/example-calc/skills/math-assistant/SKILL.md +15 -0
  194. package/plugins/plugin-builder/plugin.json +12 -0
  195. package/plugins/plugin-builder/skills/create-plugin/SKILL.md +149 -0
  196. package/plugins/plugin-builder/skills/manage-plugins/SKILL.md +157 -0
@@ -0,0 +1,419 @@
1
+ import { Client, GatewayIntentBits, Partials, Events, ActivityType, } from 'discord.js';
2
+ import { logger } from '../../utils/logger.js';
3
+ export class DiscordChannelAdapter {
4
+ name = 'discord';
5
+ client = null;
6
+ config;
7
+ discordConfig;
8
+ messageHandler;
9
+ connected = false;
10
+ constructor(config) {
11
+ this.config = config;
12
+ this.discordConfig = config.channels.discord;
13
+ }
14
+ isConnected() {
15
+ return this.connected;
16
+ }
17
+ onMessage(handler) {
18
+ this.messageHandler = handler;
19
+ }
20
+ async start() {
21
+ if (!this.discordConfig.enabled) {
22
+ logger.channel('discord', 'Discord channel is disabled in configuration.');
23
+ return;
24
+ }
25
+ if (!this.discordConfig.token || !this.discordConfig.token.trim()) {
26
+ logger.warn('Discord bot token is missing. Skipping Discord channel startup.');
27
+ return;
28
+ }
29
+ this.client = new Client({
30
+ intents: [
31
+ GatewayIntentBits.Guilds,
32
+ GatewayIntentBits.GuildMessages,
33
+ GatewayIntentBits.DirectMessages,
34
+ GatewayIntentBits.MessageContent,
35
+ ],
36
+ partials: [Partials.Channel, Partials.Message],
37
+ });
38
+ this.client.once(Events.ClientReady, (c) => {
39
+ this.connected = true;
40
+ const assistantName = this.config.assistant.customName || this.config.assistant.name || 'Musonda';
41
+ logger.channel('discord', `Logged in as ${c.user.tag}! Assistant name: ${assistantName}`);
42
+ c.user.setPresence({
43
+ activities: [
44
+ {
45
+ name: this.discordConfig.statusMessage || `${assistantName} | ${this.config.model.model}`,
46
+ type: ActivityType.Custom,
47
+ },
48
+ ],
49
+ status: 'online',
50
+ });
51
+ });
52
+ this.client.on(Events.MessageCreate, async (msg) => {
53
+ await this.handleDiscordMessage(msg);
54
+ });
55
+ this.client.on(Events.Error, (err) => {
56
+ logger.error('Discord client encountered an error:', err);
57
+ });
58
+ try {
59
+ logger.channel('discord', 'Connecting to Discord gateway...');
60
+ await this.client.login(this.discordConfig.token);
61
+ }
62
+ catch (err) {
63
+ this.connected = false;
64
+ logger.error(`Failed to connect Discord bot: ${err.message}`);
65
+ }
66
+ }
67
+ async stop() {
68
+ if (this.client) {
69
+ await this.client.destroy();
70
+ this.connected = false;
71
+ logger.channel('discord', 'Discord bot disconnected.');
72
+ }
73
+ }
74
+ async handleDiscordMessage(msg) {
75
+ // Ignore messages from bots (including self)
76
+ if (msg.author.bot)
77
+ return;
78
+ const isDM = !msg.guild;
79
+ const botUser = this.client?.user;
80
+ const botId = botUser?.id;
81
+ // Security Guardrail: Channel authorization check
82
+ const isPublicAllowed = Boolean(this.discordConfig.allowPublic);
83
+ const hasUserAllowlist = Boolean(this.discordConfig.allowedUsers && this.discordConfig.allowedUsers.length > 0);
84
+ const hasGuildAllowlist = Boolean(this.discordConfig.allowedGuilds && this.discordConfig.allowedGuilds.length > 0);
85
+ const hasChannelAllowlist = Boolean(this.discordConfig.allowedChannels && this.discordConfig.allowedChannels.length > 0);
86
+ const hasAnyAllowlist = hasUserAllowlist || hasGuildAllowlist || hasChannelAllowlist;
87
+ // In private mode (default), if no allowlists configured at all, block all inbound messages
88
+ if (!isPublicAllowed && !hasAnyAllowlist) {
89
+ logger.warn(`[DISCORD] Ignored message from ${msg.author.tag} (${msg.author.id}). No allowlists (allowedUsers/allowedGuilds) configured and allowPublic is false.`);
90
+ return;
91
+ }
92
+ // Check user allowlist if configured
93
+ if (hasUserAllowlist && !this.discordConfig.allowedUsers.includes(msg.author.id)) {
94
+ return;
95
+ }
96
+ // In DMs, require user to be in allowedUsers unless allowPublic is explicitly enabled
97
+ if (isDM && !isPublicAllowed && !hasUserAllowlist) {
98
+ logger.warn(`[DISCORD] Ignored DM from unauthorized user ${msg.author.tag} (${msg.author.id}). Add to allowedUsers or set allowPublic: true.`);
99
+ return;
100
+ }
101
+ // Check guild allowlist if configured
102
+ if (msg.guildId && hasGuildAllowlist && !this.discordConfig.allowedGuilds.includes(msg.guildId)) {
103
+ return;
104
+ }
105
+ // Check channel allowlist if configured
106
+ if (hasChannelAllowlist && !this.discordConfig.allowedChannels.includes(msg.channelId)) {
107
+ return;
108
+ }
109
+ let rawContent = msg.content.trim();
110
+ const assistantName = this.config.assistant.customName || this.config.assistant.name || 'Musonda';
111
+ // In guilds, check if mention or name prefix is required
112
+ let shouldRespond = false;
113
+ if (isDM) {
114
+ shouldRespond = true;
115
+ }
116
+ else {
117
+ const isMentioned = Boolean(botId && msg.mentions.has(botId));
118
+ const startsWithName = rawContent.toLowerCase().startsWith(assistantName.toLowerCase());
119
+ if (!this.discordConfig.requireMentionInGuild || isMentioned || startsWithName) {
120
+ shouldRespond = true;
121
+ }
122
+ }
123
+ if (!shouldRespond)
124
+ return;
125
+ // Strip bot mention or prefix from message
126
+ if (botId) {
127
+ rawContent = rawContent.replace(new RegExp(`<@!?${botId}>`, 'g'), '').trim();
128
+ }
129
+ if (rawContent.toLowerCase().startsWith(assistantName.toLowerCase())) {
130
+ rawContent = rawContent.substring(assistantName.length).replace(/^[,:\s]+/, '').trim();
131
+ }
132
+ if (!rawContent) {
133
+ await msg.reply(`Hello ${msg.author.displayName || msg.author.username}! How can I help you today?`);
134
+ return;
135
+ }
136
+ // Typing management
137
+ let typingInterval = null;
138
+ const startTyping = async () => {
139
+ try {
140
+ if ('sendTyping' in msg.channel && typeof msg.channel.sendTyping === 'function') {
141
+ await msg.channel.sendTyping();
142
+ if (!typingInterval) {
143
+ typingInterval = setInterval(async () => {
144
+ try {
145
+ await msg.channel.sendTyping();
146
+ }
147
+ catch { }
148
+ }, 8000);
149
+ }
150
+ }
151
+ }
152
+ catch { }
153
+ };
154
+ const stopTyping = () => {
155
+ if (typingInterval) {
156
+ clearInterval(typingInterval);
157
+ typingInterval = null;
158
+ }
159
+ };
160
+ let placeholderMsg = null;
161
+ let accumulatedText = '';
162
+ let editTimer = null;
163
+ let lastEditTimestamp = 0;
164
+ let isCompleted = false;
165
+ const ensurePlaceholder = async (initialText = '*Musonda is thinking...*') => {
166
+ if (placeholderMsg)
167
+ return placeholderMsg;
168
+ try {
169
+ placeholderMsg = await msg.reply(initialText);
170
+ }
171
+ catch (err) {
172
+ logger.debug('[DISCORD] Failed to create placeholder reply:', err.message);
173
+ }
174
+ return placeholderMsg;
175
+ };
176
+ const scheduleEdit = () => {
177
+ if (editTimer || isCompleted)
178
+ return;
179
+ const now = Date.now();
180
+ const elapsed = now - lastEditTimestamp;
181
+ const delay = Math.max(0, 1200 - elapsed);
182
+ editTimer = setTimeout(async () => {
183
+ editTimer = null;
184
+ if (isCompleted)
185
+ return;
186
+ lastEditTimestamp = Date.now();
187
+ if (!placeholderMsg) {
188
+ await ensurePlaceholder(accumulatedText.substring(0, 1950));
189
+ }
190
+ else {
191
+ try {
192
+ const preview = accumulatedText.length > 1950
193
+ ? accumulatedText.substring(0, 1945) + '...'
194
+ : accumulatedText;
195
+ if (preview) {
196
+ await placeholderMsg.edit(preview);
197
+ }
198
+ }
199
+ catch (err) {
200
+ logger.debug('[DISCORD] Throttled message edit failed:', err.message);
201
+ }
202
+ }
203
+ }, delay);
204
+ };
205
+ // Reply function that splits messages longer than Discord's 2000 character limit
206
+ const replyFn = async (text) => {
207
+ stopTyping();
208
+ if (editTimer) {
209
+ clearTimeout(editTimer);
210
+ editTimer = null;
211
+ }
212
+ if (placeholderMsg && isCompleted) {
213
+ return;
214
+ }
215
+ const chunks = this.splitMessage(text, 1950);
216
+ if (placeholderMsg) {
217
+ try {
218
+ if (chunks.length > 0) {
219
+ await placeholderMsg.edit(chunks[0]);
220
+ for (let i = 1; i < chunks.length; i++) {
221
+ await msg.reply(chunks[i]);
222
+ }
223
+ return;
224
+ }
225
+ }
226
+ catch { }
227
+ }
228
+ for (const chunk of chunks) {
229
+ try {
230
+ await msg.reply(chunk);
231
+ }
232
+ catch (err) {
233
+ logger.error('Failed to send Discord reply chunk:', err.message);
234
+ }
235
+ }
236
+ };
237
+ await startTyping();
238
+ const inbound = {
239
+ id: msg.id,
240
+ channel: 'discord',
241
+ channelType: isDM ? 'dm' : 'guild',
242
+ channelId: msg.channelId,
243
+ userId: msg.author.id,
244
+ userName: msg.author.displayName || msg.author.username,
245
+ userHandle: msg.author.tag,
246
+ text: rawContent,
247
+ raw: msg,
248
+ reply: replyFn,
249
+ sendTyping: startTyping,
250
+ onEvent: async (event) => {
251
+ switch (event.type) {
252
+ case 'run.started': {
253
+ await ensurePlaceholder();
254
+ break;
255
+ }
256
+ case 'status': {
257
+ if (!accumulatedText && placeholderMsg) {
258
+ try {
259
+ await placeholderMsg.edit(`*${event.text}*`);
260
+ }
261
+ catch { }
262
+ }
263
+ break;
264
+ }
265
+ case 'tool.started': {
266
+ if (!accumulatedText && placeholderMsg) {
267
+ try {
268
+ await placeholderMsg.edit(`*Running \`${event.name}\`…*`);
269
+ }
270
+ catch { }
271
+ }
272
+ break;
273
+ }
274
+ case 'output.delta': {
275
+ accumulatedText += event.text;
276
+ scheduleEdit();
277
+ break;
278
+ }
279
+ case 'run.completed': {
280
+ isCompleted = true;
281
+ stopTyping();
282
+ if (editTimer) {
283
+ clearTimeout(editTimer);
284
+ editTimer = null;
285
+ }
286
+ const finalAnswer = event.text || accumulatedText;
287
+ const chunks = this.splitMessage(finalAnswer, 1950);
288
+ if (placeholderMsg && chunks.length > 0) {
289
+ try {
290
+ await placeholderMsg.edit(chunks[0]);
291
+ for (let i = 1; i < chunks.length; i++) {
292
+ await msg.reply(chunks[i]);
293
+ }
294
+ }
295
+ catch (err) {
296
+ logger.error('Failed to update final Discord placeholder:', err.message);
297
+ }
298
+ }
299
+ break;
300
+ }
301
+ case 'run.failed': {
302
+ isCompleted = true;
303
+ stopTyping();
304
+ if (editTimer) {
305
+ clearTimeout(editTimer);
306
+ editTimer = null;
307
+ }
308
+ if (placeholderMsg) {
309
+ try {
310
+ await placeholderMsg.edit(`⚠️ ${event.message}`);
311
+ }
312
+ catch { }
313
+ }
314
+ break;
315
+ }
316
+ }
317
+ },
318
+ onStreamDelta: async (delta) => {
319
+ accumulatedText += delta;
320
+ scheduleEdit();
321
+ },
322
+ };
323
+ if (this.messageHandler) {
324
+ try {
325
+ await this.messageHandler(inbound);
326
+ }
327
+ catch (err) {
328
+ isCompleted = true;
329
+ stopTyping();
330
+ if (editTimer) {
331
+ clearTimeout(editTimer);
332
+ editTimer = null;
333
+ }
334
+ logger.error('Error handling Discord message:', err);
335
+ if (placeholderMsg) {
336
+ try {
337
+ await placeholderMsg.edit(`⚠️ Sorry, an error occurred while processing your request: ${err.message}`);
338
+ }
339
+ catch {
340
+ await msg.reply(`⚠️ Sorry, an error occurred while processing your request: ${err.message}`);
341
+ }
342
+ }
343
+ else {
344
+ await msg.reply(`⚠️ Sorry, an error occurred while processing your request: ${err.message}`);
345
+ }
346
+ }
347
+ finally {
348
+ stopTyping();
349
+ if (editTimer) {
350
+ clearTimeout(editTimer);
351
+ editTimer = null;
352
+ }
353
+ }
354
+ }
355
+ }
356
+ splitMessage(text, maxLength = 1950) {
357
+ if (text.length <= maxLength)
358
+ return [text];
359
+ const chunks = [];
360
+ let remaining = text;
361
+ while (remaining.length > 0) {
362
+ if (remaining.length <= maxLength) {
363
+ chunks.push(remaining);
364
+ break;
365
+ }
366
+ // Try to break at a double newline or newline
367
+ let splitIndex = remaining.lastIndexOf('\n\n', maxLength);
368
+ if (splitIndex === -1 || splitIndex < maxLength * 0.5) {
369
+ splitIndex = remaining.lastIndexOf('\n', maxLength);
370
+ }
371
+ // If no newline, try to break at a space
372
+ if (splitIndex === -1 || splitIndex < maxLength * 0.5) {
373
+ splitIndex = remaining.lastIndexOf(' ', maxLength);
374
+ }
375
+ // Fallback: hard cut
376
+ if (splitIndex === -1 || splitIndex === 0) {
377
+ splitIndex = maxLength;
378
+ }
379
+ chunks.push(remaining.substring(0, splitIndex).trim());
380
+ remaining = remaining.substring(splitIndex).trim();
381
+ }
382
+ return chunks;
383
+ }
384
+ async sendDirect(channelId, text, userId) {
385
+ if (!this.client || !this.connected)
386
+ return false;
387
+ try {
388
+ let targetChannel = null;
389
+ if (channelId && channelId !== 'default' && channelId !== userId) {
390
+ try {
391
+ targetChannel = await this.client.channels.fetch(channelId);
392
+ }
393
+ catch { }
394
+ }
395
+ // Fallback to DM if userId is provided
396
+ if (!targetChannel && userId) {
397
+ try {
398
+ const user = await this.client.users.fetch(userId);
399
+ targetChannel = await user.createDM();
400
+ }
401
+ catch { }
402
+ }
403
+ if (!targetChannel || typeof targetChannel.send !== 'function') {
404
+ logger.warn(`Discord: Could not find channel or DM for target ${channelId} / ${userId}`);
405
+ return false;
406
+ }
407
+ const chunks = this.splitMessage(text, 1950);
408
+ for (const chunk of chunks) {
409
+ await targetChannel.send(chunk);
410
+ }
411
+ return true;
412
+ }
413
+ catch (err) {
414
+ logger.error('Failed to send Discord direct message:', err.message);
415
+ return false;
416
+ }
417
+ }
418
+ }
419
+ //# sourceMappingURL=discord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord.js","sourceRoot":"","sources":["../../../src/gateway/channels/discord.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { ChannelAdapter, InboundMessage } from '../types.js';
2
+ import { MusondaConfig } from '../../config/types.js';
3
+ export declare class SlackChannelAdapter implements ChannelAdapter {
4
+ readonly name = "slack";
5
+ private app;
6
+ private config;
7
+ private slackConfig;
8
+ private messageHandler?;
9
+ private connected;
10
+ private userCache;
11
+ private botUserId;
12
+ constructor(config: MusondaConfig);
13
+ isConnected(): boolean;
14
+ onMessage(handler: (message: InboundMessage) => Promise<void>): void;
15
+ start(): Promise<void>;
16
+ stop(): Promise<void>;
17
+ private getDisplayName;
18
+ private handleSlackEvent;
19
+ /**
20
+ * Convert standard Markdown to Slack mrkdwn
21
+ * Converts bold **text** to *text*, while preserving triple backticks.
22
+ */
23
+ private formatForSlack;
24
+ private splitMessage;
25
+ sendDirect(channelId: string, text: string, threadTs?: string): Promise<boolean>;
26
+ }