@herdctl/discord 0.0.1

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 (137) hide show
  1. package/dist/__tests__/auto-mode-handler.test.d.ts +2 -0
  2. package/dist/__tests__/auto-mode-handler.test.d.ts.map +1 -0
  3. package/dist/__tests__/auto-mode-handler.test.js +362 -0
  4. package/dist/__tests__/auto-mode-handler.test.js.map +1 -0
  5. package/dist/__tests__/discord-connector.test.d.ts +2 -0
  6. package/dist/__tests__/discord-connector.test.d.ts.map +1 -0
  7. package/dist/__tests__/discord-connector.test.js +958 -0
  8. package/dist/__tests__/discord-connector.test.js.map +1 -0
  9. package/dist/__tests__/error-handler.test.d.ts +2 -0
  10. package/dist/__tests__/error-handler.test.d.ts.map +1 -0
  11. package/dist/__tests__/error-handler.test.js +509 -0
  12. package/dist/__tests__/error-handler.test.js.map +1 -0
  13. package/dist/__tests__/errors.test.d.ts +2 -0
  14. package/dist/__tests__/errors.test.d.ts.map +1 -0
  15. package/dist/__tests__/errors.test.js +152 -0
  16. package/dist/__tests__/errors.test.js.map +1 -0
  17. package/dist/__tests__/logger.test.d.ts +2 -0
  18. package/dist/__tests__/logger.test.d.ts.map +1 -0
  19. package/dist/__tests__/logger.test.js +282 -0
  20. package/dist/__tests__/logger.test.js.map +1 -0
  21. package/dist/__tests__/mention-handler.test.d.ts +2 -0
  22. package/dist/__tests__/mention-handler.test.d.ts.map +1 -0
  23. package/dist/__tests__/mention-handler.test.js +547 -0
  24. package/dist/__tests__/mention-handler.test.js.map +1 -0
  25. package/dist/auto-mode-handler.d.ts +145 -0
  26. package/dist/auto-mode-handler.d.ts.map +1 -0
  27. package/dist/auto-mode-handler.js +211 -0
  28. package/dist/auto-mode-handler.js.map +1 -0
  29. package/dist/commands/__tests__/command-manager.test.d.ts +2 -0
  30. package/dist/commands/__tests__/command-manager.test.d.ts.map +1 -0
  31. package/dist/commands/__tests__/command-manager.test.js +307 -0
  32. package/dist/commands/__tests__/command-manager.test.js.map +1 -0
  33. package/dist/commands/__tests__/help.test.d.ts +2 -0
  34. package/dist/commands/__tests__/help.test.d.ts.map +1 -0
  35. package/dist/commands/__tests__/help.test.js +105 -0
  36. package/dist/commands/__tests__/help.test.js.map +1 -0
  37. package/dist/commands/__tests__/reset.test.d.ts +2 -0
  38. package/dist/commands/__tests__/reset.test.d.ts.map +1 -0
  39. package/dist/commands/__tests__/reset.test.js +140 -0
  40. package/dist/commands/__tests__/reset.test.js.map +1 -0
  41. package/dist/commands/__tests__/status.test.d.ts +2 -0
  42. package/dist/commands/__tests__/status.test.d.ts.map +1 -0
  43. package/dist/commands/__tests__/status.test.js +205 -0
  44. package/dist/commands/__tests__/status.test.js.map +1 -0
  45. package/dist/commands/command-manager.d.ts +66 -0
  46. package/dist/commands/command-manager.d.ts.map +1 -0
  47. package/dist/commands/command-manager.js +191 -0
  48. package/dist/commands/command-manager.js.map +1 -0
  49. package/dist/commands/help.d.ts +8 -0
  50. package/dist/commands/help.d.ts.map +1 -0
  51. package/dist/commands/help.js +27 -0
  52. package/dist/commands/help.js.map +1 -0
  53. package/dist/commands/index.d.ts +12 -0
  54. package/dist/commands/index.d.ts.map +1 -0
  55. package/dist/commands/index.js +13 -0
  56. package/dist/commands/index.js.map +1 -0
  57. package/dist/commands/reset.d.ts +9 -0
  58. package/dist/commands/reset.d.ts.map +1 -0
  59. package/dist/commands/reset.js +28 -0
  60. package/dist/commands/reset.js.map +1 -0
  61. package/dist/commands/status.d.ts +9 -0
  62. package/dist/commands/status.d.ts.map +1 -0
  63. package/dist/commands/status.js +102 -0
  64. package/dist/commands/status.js.map +1 -0
  65. package/dist/commands/types.d.ts +87 -0
  66. package/dist/commands/types.d.ts.map +1 -0
  67. package/dist/commands/types.js +8 -0
  68. package/dist/commands/types.js.map +1 -0
  69. package/dist/discord-connector.d.ts +154 -0
  70. package/dist/discord-connector.d.ts.map +1 -0
  71. package/dist/discord-connector.js +638 -0
  72. package/dist/discord-connector.js.map +1 -0
  73. package/dist/error-handler.d.ts +237 -0
  74. package/dist/error-handler.d.ts.map +1 -0
  75. package/dist/error-handler.js +433 -0
  76. package/dist/error-handler.js.map +1 -0
  77. package/dist/errors.d.ts +61 -0
  78. package/dist/errors.d.ts.map +1 -0
  79. package/dist/errors.js +77 -0
  80. package/dist/errors.js.map +1 -0
  81. package/dist/index.d.ts +34 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +36 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/logger.d.ts +119 -0
  86. package/dist/logger.d.ts.map +1 -0
  87. package/dist/logger.js +198 -0
  88. package/dist/logger.js.map +1 -0
  89. package/dist/mention-handler.d.ts +176 -0
  90. package/dist/mention-handler.d.ts.map +1 -0
  91. package/dist/mention-handler.js +236 -0
  92. package/dist/mention-handler.js.map +1 -0
  93. package/dist/session-manager/__tests__/errors.test.d.ts +2 -0
  94. package/dist/session-manager/__tests__/errors.test.d.ts.map +1 -0
  95. package/dist/session-manager/__tests__/errors.test.js +124 -0
  96. package/dist/session-manager/__tests__/errors.test.js.map +1 -0
  97. package/dist/session-manager/__tests__/session-manager.test.d.ts +2 -0
  98. package/dist/session-manager/__tests__/session-manager.test.d.ts.map +1 -0
  99. package/dist/session-manager/__tests__/session-manager.test.js +517 -0
  100. package/dist/session-manager/__tests__/session-manager.test.js.map +1 -0
  101. package/dist/session-manager/__tests__/types.test.d.ts +2 -0
  102. package/dist/session-manager/__tests__/types.test.d.ts.map +1 -0
  103. package/dist/session-manager/__tests__/types.test.js +169 -0
  104. package/dist/session-manager/__tests__/types.test.js.map +1 -0
  105. package/dist/session-manager/errors.d.ts +58 -0
  106. package/dist/session-manager/errors.d.ts.map +1 -0
  107. package/dist/session-manager/errors.js +70 -0
  108. package/dist/session-manager/errors.js.map +1 -0
  109. package/dist/session-manager/index.d.ts +11 -0
  110. package/dist/session-manager/index.d.ts.map +1 -0
  111. package/dist/session-manager/index.js +12 -0
  112. package/dist/session-manager/index.js.map +1 -0
  113. package/dist/session-manager/session-manager.d.ts +107 -0
  114. package/dist/session-manager/session-manager.d.ts.map +1 -0
  115. package/dist/session-manager/session-manager.js +347 -0
  116. package/dist/session-manager/session-manager.js.map +1 -0
  117. package/dist/session-manager/types.d.ts +167 -0
  118. package/dist/session-manager/types.d.ts.map +1 -0
  119. package/dist/session-manager/types.js +57 -0
  120. package/dist/session-manager/types.js.map +1 -0
  121. package/dist/types.d.ts +323 -0
  122. package/dist/types.d.ts.map +1 -0
  123. package/dist/types.js +8 -0
  124. package/dist/types.js.map +1 -0
  125. package/dist/utils/__tests__/formatting.test.d.ts +2 -0
  126. package/dist/utils/__tests__/formatting.test.d.ts.map +1 -0
  127. package/dist/utils/__tests__/formatting.test.js +571 -0
  128. package/dist/utils/__tests__/formatting.test.js.map +1 -0
  129. package/dist/utils/formatting.d.ts +211 -0
  130. package/dist/utils/formatting.d.ts.map +1 -0
  131. package/dist/utils/formatting.js +305 -0
  132. package/dist/utils/formatting.js.map +1 -0
  133. package/dist/utils/index.d.ts +5 -0
  134. package/dist/utils/index.d.ts.map +1 -0
  135. package/dist/utils/index.js +9 -0
  136. package/dist/utils/index.js.map +1 -0
  137. package/package.json +49 -0
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Command Manager - Handles slash command registration and execution
3
+ *
4
+ * Registers commands per-bot (as application commands) and handles
5
+ * command interactions by routing them to the appropriate handler.
6
+ */
7
+ import { REST, Routes, SlashCommandBuilder, } from "discord.js";
8
+ import { helpCommand } from "./help.js";
9
+ import { resetCommand } from "./reset.js";
10
+ import { statusCommand } from "./status.js";
11
+ import { ErrorHandler, withRetry, } from "../error-handler.js";
12
+ // =============================================================================
13
+ // Default Logger
14
+ // =============================================================================
15
+ function createDefaultLogger(agentName) {
16
+ const prefix = `[commands:${agentName}]`;
17
+ return {
18
+ debug: (msg, data) => console.debug(prefix, msg, data ? JSON.stringify(data) : ""),
19
+ info: (msg, data) => console.info(prefix, msg, data ? JSON.stringify(data) : ""),
20
+ warn: (msg, data) => console.warn(prefix, msg, data ? JSON.stringify(data) : ""),
21
+ error: (msg, data) => console.error(prefix, msg, data ? JSON.stringify(data) : ""),
22
+ };
23
+ }
24
+ // =============================================================================
25
+ // Built-in Commands
26
+ // =============================================================================
27
+ /**
28
+ * Get all built-in commands
29
+ */
30
+ function getBuiltInCommands() {
31
+ return [helpCommand, resetCommand, statusCommand];
32
+ }
33
+ // =============================================================================
34
+ // Command Manager Implementation
35
+ // =============================================================================
36
+ /**
37
+ * CommandManager handles slash command registration and execution.
38
+ *
39
+ * Commands are registered per-bot using Discord's REST API. Each agent's
40
+ * bot has its own set of commands.
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * const commandManager = new CommandManager({
45
+ * agentName: 'my-agent',
46
+ * client: discordClient,
47
+ * botToken: process.env.BOT_TOKEN,
48
+ * sessionManager,
49
+ * getConnectorState: () => connector.getState(),
50
+ * });
51
+ *
52
+ * // Register commands after client is ready
53
+ * await commandManager.registerCommands();
54
+ *
55
+ * // Handle interactions in your interaction handler
56
+ * client.on('interactionCreate', async (interaction) => {
57
+ * if (interaction.isChatInputCommand()) {
58
+ * await commandManager.handleInteraction(interaction);
59
+ * }
60
+ * });
61
+ * ```
62
+ */
63
+ export class CommandManager {
64
+ agentName;
65
+ client;
66
+ botToken;
67
+ sessionManager;
68
+ getConnectorState;
69
+ logger;
70
+ commands;
71
+ errorHandler;
72
+ constructor(options) {
73
+ this.agentName = options.agentName;
74
+ this.client = options.client;
75
+ this.botToken = options.botToken;
76
+ this.sessionManager = options.sessionManager;
77
+ this.getConnectorState = options.getConnectorState;
78
+ this.logger = options.logger ?? createDefaultLogger(options.agentName);
79
+ // Initialize error handler
80
+ this.errorHandler = new ErrorHandler({
81
+ logger: this.logger,
82
+ agentName: this.agentName,
83
+ });
84
+ // Initialize commands map
85
+ this.commands = new Map();
86
+ for (const command of getBuiltInCommands()) {
87
+ this.commands.set(command.name, command);
88
+ }
89
+ }
90
+ /**
91
+ * Register all commands with Discord
92
+ *
93
+ * Uses the Discord REST API to register application commands.
94
+ * Commands are registered globally for the bot application.
95
+ * Includes retry logic for transient failures.
96
+ */
97
+ async registerCommands() {
98
+ const rest = new REST({ version: "10" }).setToken(this.botToken);
99
+ // Build command data for Discord API
100
+ const commandData = Array.from(this.commands.values()).map((cmd) => new SlashCommandBuilder()
101
+ .setName(cmd.name)
102
+ .setDescription(cmd.description)
103
+ .toJSON());
104
+ const clientId = this.client.user?.id;
105
+ if (!clientId) {
106
+ this.logger.error("Cannot register commands: client user ID not available");
107
+ throw new Error("Client user ID not available for command registration");
108
+ }
109
+ this.logger.info("Registering slash commands...", {
110
+ commandCount: commandData.length,
111
+ commands: Array.from(this.commands.keys()),
112
+ });
113
+ // Use retry logic for command registration (handles rate limits, network issues)
114
+ const result = await withRetry(async () => {
115
+ await rest.put(Routes.applicationCommands(clientId), {
116
+ body: commandData,
117
+ });
118
+ }, {
119
+ maxAttempts: 3,
120
+ baseDelayMs: 2000,
121
+ operationName: "registerCommands",
122
+ logger: this.logger,
123
+ });
124
+ if (!result.success) {
125
+ const errorMessage = result.error?.message ?? "Unknown error";
126
+ this.logger.error("Failed to register slash commands after retries", {
127
+ error: errorMessage,
128
+ attempts: result.attempts,
129
+ });
130
+ throw result.error ?? new Error("Failed to register commands");
131
+ }
132
+ this.logger.info("Successfully registered slash commands");
133
+ }
134
+ /**
135
+ * Handle an incoming command interaction
136
+ *
137
+ * Routes the interaction to the appropriate command handler.
138
+ * Provides user-friendly error messages on failure.
139
+ */
140
+ async handleInteraction(interaction) {
141
+ const commandName = interaction.commandName;
142
+ const command = this.commands.get(commandName);
143
+ if (!command) {
144
+ this.logger.warn("Unknown command received", { commandName });
145
+ await interaction.reply({
146
+ content: "Unknown command.",
147
+ ephemeral: true,
148
+ });
149
+ return;
150
+ }
151
+ this.logger.debug("Executing command", {
152
+ commandName,
153
+ userId: interaction.user.id,
154
+ channelId: interaction.channelId,
155
+ });
156
+ const context = {
157
+ interaction,
158
+ client: this.client,
159
+ agentName: this.agentName,
160
+ sessionManager: this.sessionManager,
161
+ connectorState: this.getConnectorState(),
162
+ };
163
+ try {
164
+ await command.execute(context);
165
+ }
166
+ catch (error) {
167
+ // Use error handler for detailed logging
168
+ const userMessage = this.errorHandler.handleError(error, `executing command '${commandName}'`);
169
+ // Try to respond with user-friendly error if we haven't already replied
170
+ if (!interaction.replied && !interaction.deferred) {
171
+ await interaction.reply({
172
+ content: userMessage,
173
+ ephemeral: true,
174
+ });
175
+ }
176
+ else if (interaction.deferred && !interaction.replied) {
177
+ // If deferred but not replied, use editReply
178
+ await interaction.editReply({
179
+ content: userMessage,
180
+ });
181
+ }
182
+ }
183
+ }
184
+ /**
185
+ * Get all registered commands
186
+ */
187
+ getCommands() {
188
+ return this.commands;
189
+ }
190
+ }
191
+ //# sourceMappingURL=command-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-manager.js","sourceRoot":"","sources":["../../src/commands/command-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * /help command - Show available commands
3
+ *
4
+ * Responds ephemerally with a list of available commands and their descriptions.
5
+ */
6
+ import type { SlashCommand } from "./types.js";
7
+ export declare const helpCommand: SlashCommand;
8
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,WAAW,EAAE,YAuBzB,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * /help command - Show available commands
3
+ *
4
+ * Responds ephemerally with a list of available commands and their descriptions.
5
+ */
6
+ export const helpCommand = {
7
+ name: "help",
8
+ description: "Show available commands",
9
+ async execute(context) {
10
+ const { interaction, agentName } = context;
11
+ const helpMessage = `**${agentName} Bot Commands**
12
+
13
+ **/help** - Show this help message
14
+ **/status** - Show agent status and session info
15
+ **/reset** - Clear conversation context (start fresh session)
16
+
17
+ **Interacting with the bot:**
18
+ - Mention the bot in a channel to start a conversation
19
+ - In configured channels, the bot may respond automatically
20
+ - DMs are supported based on configuration`;
21
+ await interaction.reply({
22
+ content: helpMessage,
23
+ ephemeral: true,
24
+ });
25
+ },
26
+ };
27
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,yBAAyB;IAEtC,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;QAE3C,MAAM,WAAW,GAAG,KAAK,SAAS;;;;;;;;;2CASK,CAAC;QAExC,MAAM,WAAW,CAAC,KAAK,CAAC;YACtB,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Slash commands module for Discord bot
3
+ *
4
+ * Provides command registration, handling, and built-in commands
5
+ * for controlling the bot via Discord slash commands.
6
+ */
7
+ export { CommandManager } from "./command-manager.js";
8
+ export type { CommandContext, SlashCommand, CommandManagerLogger, CommandManagerOptions, ICommandManager, } from "./types.js";
9
+ export { helpCommand } from "./help.js";
10
+ export { resetCommand } from "./reset.js";
11
+ export { statusCommand } from "./status.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,YAAY,EACV,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Slash commands module for Discord bot
3
+ *
4
+ * Provides command registration, handling, and built-in commands
5
+ * for controlling the bot via Discord slash commands.
6
+ */
7
+ // Command Manager
8
+ export { CommandManager } from "./command-manager.js";
9
+ // Built-in Commands
10
+ export { helpCommand } from "./help.js";
11
+ export { resetCommand } from "./reset.js";
12
+ export { statusCommand } from "./status.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAWtD,oBAAoB;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * /reset command - Clear conversation context
3
+ *
4
+ * Clears the session for the current channel, starting a fresh conversation.
5
+ * Responds ephemerally with confirmation.
6
+ */
7
+ import type { SlashCommand } from "./types.js";
8
+ export declare const resetCommand: SlashCommand;
9
+ //# sourceMappingURL=reset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../src/commands/reset.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,YAAY,EAAE,YAsB1B,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * /reset command - Clear conversation context
3
+ *
4
+ * Clears the session for the current channel, starting a fresh conversation.
5
+ * Responds ephemerally with confirmation.
6
+ */
7
+ export const resetCommand = {
8
+ name: "reset",
9
+ description: "Clear conversation context (start fresh session)",
10
+ async execute(context) {
11
+ const { interaction, sessionManager, agentName } = context;
12
+ const channelId = interaction.channelId;
13
+ const wasCleared = await sessionManager.clearSession(channelId);
14
+ if (wasCleared) {
15
+ await interaction.reply({
16
+ content: `Conversation context cleared for **${agentName}**. Starting fresh!`,
17
+ ephemeral: true,
18
+ });
19
+ }
20
+ else {
21
+ await interaction.reply({
22
+ content: `No active session found for **${agentName}** in this channel. You're already starting fresh!`,
23
+ ephemeral: true,
24
+ });
25
+ }
26
+ },
27
+ };
28
+ //# sourceMappingURL=reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.js","sourceRoot":"","sources":["../../src/commands/reset.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,kDAAkD;IAE/D,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;QAC3D,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;QAExC,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAEhE,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,KAAK,CAAC;gBACtB,OAAO,EAAE,sCAAsC,SAAS,qBAAqB;gBAC7E,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,CAAC,KAAK,CAAC;gBACtB,OAAO,EAAE,iCAAiC,SAAS,oDAAoD;gBACvG,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * /status command - Show agent status and session info
3
+ *
4
+ * Responds ephemerally with the current agent status, connection info,
5
+ * and session information for the current channel.
6
+ */
7
+ import type { SlashCommand } from "./types.js";
8
+ export declare const statusCommand: SlashCommand;
9
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,YAAY,CAAC;AA6D/D,eAAO,MAAM,aAAa,EAAE,YAgD3B,CAAC"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * /status command - Show agent status and session info
3
+ *
4
+ * Responds ephemerally with the current agent status, connection info,
5
+ * and session information for the current channel.
6
+ */
7
+ /**
8
+ * Format a timestamp for display
9
+ */
10
+ function formatTimestamp(isoString) {
11
+ if (!isoString) {
12
+ return "N/A";
13
+ }
14
+ const date = new Date(isoString);
15
+ return date.toLocaleString();
16
+ }
17
+ /**
18
+ * Format duration since a timestamp
19
+ */
20
+ function formatDuration(isoString) {
21
+ if (!isoString) {
22
+ return "N/A";
23
+ }
24
+ const startTime = new Date(isoString).getTime();
25
+ const now = Date.now();
26
+ const durationMs = now - startTime;
27
+ const seconds = Math.floor(durationMs / 1000);
28
+ const minutes = Math.floor(seconds / 60);
29
+ const hours = Math.floor(minutes / 60);
30
+ const days = Math.floor(hours / 24);
31
+ if (days > 0) {
32
+ return `${days}d ${hours % 24}h`;
33
+ }
34
+ if (hours > 0) {
35
+ return `${hours}h ${minutes % 60}m`;
36
+ }
37
+ if (minutes > 0) {
38
+ return `${minutes}m ${seconds % 60}s`;
39
+ }
40
+ return `${seconds}s`;
41
+ }
42
+ /**
43
+ * Get status emoji based on connection status
44
+ */
45
+ function getStatusEmoji(status) {
46
+ switch (status) {
47
+ case "connected":
48
+ return "\u{1F7E2}"; // Green circle
49
+ case "connecting":
50
+ case "reconnecting":
51
+ return "\u{1F7E1}"; // Yellow circle
52
+ case "disconnected":
53
+ case "disconnecting":
54
+ return "\u26AA"; // White circle
55
+ case "error":
56
+ return "\u{1F534}"; // Red circle
57
+ default:
58
+ return "\u2753"; // Question mark
59
+ }
60
+ }
61
+ export const statusCommand = {
62
+ name: "status",
63
+ description: "Show agent status and session info",
64
+ async execute(context) {
65
+ const { interaction, agentName, connectorState, sessionManager } = context;
66
+ const channelId = interaction.channelId;
67
+ // Get session info for this channel
68
+ const session = await sessionManager.getSession(channelId);
69
+ // Build status message
70
+ const statusEmoji = getStatusEmoji(connectorState.status);
71
+ const botUsername = connectorState.botUser?.username ?? "Unknown";
72
+ let statusMessage = `**${agentName} Status**
73
+
74
+ ${statusEmoji} **Connection:** ${connectorState.status}
75
+ **Bot:** ${botUsername}`;
76
+ if (connectorState.connectedAt) {
77
+ statusMessage += `\n**Connected:** ${formatTimestamp(connectorState.connectedAt)}`;
78
+ statusMessage += `\n**Uptime:** ${formatDuration(connectorState.connectedAt)}`;
79
+ }
80
+ if (connectorState.reconnectAttempts > 0) {
81
+ statusMessage += `\n**Reconnect Attempts:** ${connectorState.reconnectAttempts}`;
82
+ }
83
+ if (connectorState.lastError) {
84
+ statusMessage += `\n**Last Error:** ${connectorState.lastError}`;
85
+ }
86
+ // Session info
87
+ statusMessage += `\n\n**Session Info**`;
88
+ if (session) {
89
+ statusMessage += `\n**Session ID:** \`${session.sessionId.substring(0, 20)}...\``;
90
+ statusMessage += `\n**Last Activity:** ${formatTimestamp(session.lastMessageAt)}`;
91
+ statusMessage += `\n**Session Age:** ${formatDuration(session.lastMessageAt)}`;
92
+ }
93
+ else {
94
+ statusMessage += `\nNo active session in this channel.`;
95
+ }
96
+ await interaction.reply({
97
+ content: statusMessage,
98
+ ephemeral: true,
99
+ });
100
+ },
101
+ };
102
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,SAAS,eAAe,CAAC,SAAwB;IAC/C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,SAAwB;IAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,GAAG,GAAG,SAAS,CAAC;IAEnC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IAEpC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACb,OAAO,GAAG,IAAI,KAAK,KAAK,GAAG,EAAE,GAAG,CAAC;IACnC,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,GAAG,KAAK,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,GAAG,OAAO,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC;IACxC,CAAC;IACD,OAAO,GAAG,OAAO,GAAG,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,MAAc;IACpC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,WAAW;YACd,OAAO,WAAW,CAAC,CAAC,eAAe;QACrC,KAAK,YAAY,CAAC;QAClB,KAAK,cAAc;YACjB,OAAO,WAAW,CAAC,CAAC,gBAAgB;QACtC,KAAK,cAAc,CAAC;QACpB,KAAK,eAAe;YAClB,OAAO,QAAQ,CAAC,CAAC,eAAe;QAClC,KAAK,OAAO;YACV,OAAO,WAAW,CAAC,CAAC,aAAa;QACnC;YACE,OAAO,QAAQ,CAAC,CAAC,gBAAgB;IACrC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,oCAAoC;IAEjD,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;QAC3E,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;QAExC,oCAAoC;QACpC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAE3D,uBAAuB;QACvB,MAAM,WAAW,GAAG,cAAc,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,EAAE,QAAQ,IAAI,SAAS,CAAC;QAElE,IAAI,aAAa,GAAG,KAAK,SAAS;;EAEpC,WAAW,oBAAoB,cAAc,CAAC,MAAM;WAC3C,WAAW,EAAE,CAAC;QAErB,IAAI,cAAc,CAAC,WAAW,EAAE,CAAC;YAC/B,aAAa,IAAI,oBAAoB,eAAe,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;YACnF,aAAa,IAAI,iBAAiB,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;QACjF,CAAC;QAED,IAAI,cAAc,CAAC,iBAAiB,GAAG,CAAC,EAAE,CAAC;YACzC,aAAa,IAAI,6BAA6B,cAAc,CAAC,iBAAiB,EAAE,CAAC;QACnF,CAAC;QAED,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;YAC7B,aAAa,IAAI,qBAAqB,cAAc,CAAC,SAAS,EAAE,CAAC;QACnE,CAAC;QAED,eAAe;QACf,aAAa,IAAI,sBAAsB,CAAC;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,aAAa,IAAI,uBAAuB,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC;YAClF,aAAa,IAAI,wBAAwB,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YAClF,aAAa,IAAI,sBAAsB,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,aAAa,IAAI,sCAAsC,CAAC;QAC1D,CAAC;QAED,MAAM,WAAW,CAAC,KAAK,CAAC;YACtB,OAAO,EAAE,aAAa;YACtB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Type definitions for Discord slash commands
3
+ *
4
+ * Provides interfaces for command registration, execution context,
5
+ * and command handler definitions.
6
+ */
7
+ import type { ChatInputCommandInteraction, Client } from "discord.js";
8
+ import type { DiscordConnectorState } from "../types.js";
9
+ import type { ISessionManager } from "../session-manager/index.js";
10
+ /**
11
+ * Context provided to command handlers when executing
12
+ */
13
+ export interface CommandContext {
14
+ /** The Discord interaction object */
15
+ interaction: ChatInputCommandInteraction;
16
+ /** The Discord client */
17
+ client: Client;
18
+ /** Name of the agent this command is being executed for */
19
+ agentName: string;
20
+ /** Session manager for conversation context management */
21
+ sessionManager: ISessionManager;
22
+ /** Current connector state */
23
+ connectorState: DiscordConnectorState;
24
+ }
25
+ /**
26
+ * Definition of a slash command
27
+ */
28
+ export interface SlashCommand {
29
+ /** Command name (lowercase, no spaces) */
30
+ name: string;
31
+ /** Command description shown in Discord's command picker */
32
+ description: string;
33
+ /**
34
+ * Execute the command
35
+ *
36
+ * @param context - Command execution context
37
+ */
38
+ execute(context: CommandContext): Promise<void>;
39
+ }
40
+ /**
41
+ * Logger interface for command manager operations
42
+ */
43
+ export interface CommandManagerLogger {
44
+ debug(message: string, data?: Record<string, unknown>): void;
45
+ info(message: string, data?: Record<string, unknown>): void;
46
+ warn(message: string, data?: Record<string, unknown>): void;
47
+ error(message: string, data?: Record<string, unknown>): void;
48
+ }
49
+ /**
50
+ * Options for the command manager
51
+ */
52
+ export interface CommandManagerOptions {
53
+ /** Name of the agent */
54
+ agentName: string;
55
+ /** Discord client for registering commands */
56
+ client: Client;
57
+ /** Bot token for REST API authentication */
58
+ botToken: string;
59
+ /** Session manager for conversation context */
60
+ sessionManager: ISessionManager;
61
+ /** Function to get current connector state */
62
+ getConnectorState: () => DiscordConnectorState;
63
+ /** Optional logger */
64
+ logger?: CommandManagerLogger;
65
+ }
66
+ /**
67
+ * Interface for command managers
68
+ */
69
+ export interface ICommandManager {
70
+ /**
71
+ * Register all commands with Discord
72
+ *
73
+ * Commands are registered per-bot (application commands), not globally.
74
+ */
75
+ registerCommands(): Promise<void>;
76
+ /**
77
+ * Handle an incoming command interaction
78
+ *
79
+ * @param interaction - The command interaction to handle
80
+ */
81
+ handleInteraction(interaction: ChatInputCommandInteraction): Promise<void>;
82
+ /**
83
+ * Get all registered commands
84
+ */
85
+ getCommands(): ReadonlyMap<string, SlashCommand>;
86
+ }
87
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,EAAQ,MAAM,YAAY,CAAC;AAC5E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAMnE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,WAAW,EAAE,2BAA2B,CAAC;IAEzC,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IAEf,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAElB,0DAA0D;IAC1D,cAAc,EAAE,eAAe,CAAC;IAEhC,8BAA8B;IAC9B,cAAc,EAAE,qBAAqB,CAAC;CACvC;AAMD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IAEb,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAMD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9D;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAElB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IAEf,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IAEjB,+CAA+C;IAC/C,cAAc,EAAE,eAAe,CAAC;IAEhC,8CAA8C;IAC9C,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;IAE/C,sBAAsB;IACtB,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B;AAMD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAElC;;;;OAIG;IACH,iBAAiB,CAAC,WAAW,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3E;;OAEG;IACH,WAAW,IAAI,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAClD"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Type definitions for Discord slash commands
3
+ *
4
+ * Provides interfaces for command registration, execution context,
5
+ * and command handler definitions.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}