@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.
- package/dist/__tests__/auto-mode-handler.test.d.ts +2 -0
- package/dist/__tests__/auto-mode-handler.test.d.ts.map +1 -0
- package/dist/__tests__/auto-mode-handler.test.js +362 -0
- package/dist/__tests__/auto-mode-handler.test.js.map +1 -0
- package/dist/__tests__/discord-connector.test.d.ts +2 -0
- package/dist/__tests__/discord-connector.test.d.ts.map +1 -0
- package/dist/__tests__/discord-connector.test.js +958 -0
- package/dist/__tests__/discord-connector.test.js.map +1 -0
- package/dist/__tests__/error-handler.test.d.ts +2 -0
- package/dist/__tests__/error-handler.test.d.ts.map +1 -0
- package/dist/__tests__/error-handler.test.js +509 -0
- package/dist/__tests__/error-handler.test.js.map +1 -0
- package/dist/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +152 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/logger.test.d.ts +2 -0
- package/dist/__tests__/logger.test.d.ts.map +1 -0
- package/dist/__tests__/logger.test.js +282 -0
- package/dist/__tests__/logger.test.js.map +1 -0
- package/dist/__tests__/mention-handler.test.d.ts +2 -0
- package/dist/__tests__/mention-handler.test.d.ts.map +1 -0
- package/dist/__tests__/mention-handler.test.js +547 -0
- package/dist/__tests__/mention-handler.test.js.map +1 -0
- package/dist/auto-mode-handler.d.ts +145 -0
- package/dist/auto-mode-handler.d.ts.map +1 -0
- package/dist/auto-mode-handler.js +211 -0
- package/dist/auto-mode-handler.js.map +1 -0
- package/dist/commands/__tests__/command-manager.test.d.ts +2 -0
- package/dist/commands/__tests__/command-manager.test.d.ts.map +1 -0
- package/dist/commands/__tests__/command-manager.test.js +307 -0
- package/dist/commands/__tests__/command-manager.test.js.map +1 -0
- package/dist/commands/__tests__/help.test.d.ts +2 -0
- package/dist/commands/__tests__/help.test.d.ts.map +1 -0
- package/dist/commands/__tests__/help.test.js +105 -0
- package/dist/commands/__tests__/help.test.js.map +1 -0
- package/dist/commands/__tests__/reset.test.d.ts +2 -0
- package/dist/commands/__tests__/reset.test.d.ts.map +1 -0
- package/dist/commands/__tests__/reset.test.js +140 -0
- package/dist/commands/__tests__/reset.test.js.map +1 -0
- package/dist/commands/__tests__/status.test.d.ts +2 -0
- package/dist/commands/__tests__/status.test.d.ts.map +1 -0
- package/dist/commands/__tests__/status.test.js +205 -0
- package/dist/commands/__tests__/status.test.js.map +1 -0
- package/dist/commands/command-manager.d.ts +66 -0
- package/dist/commands/command-manager.d.ts.map +1 -0
- package/dist/commands/command-manager.js +191 -0
- package/dist/commands/command-manager.js.map +1 -0
- package/dist/commands/help.d.ts +8 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +27 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/index.d.ts +12 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +13 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/reset.d.ts +9 -0
- package/dist/commands/reset.d.ts.map +1 -0
- package/dist/commands/reset.js +28 -0
- package/dist/commands/reset.js.map +1 -0
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +102 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/types.d.ts +87 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +8 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/discord-connector.d.ts +154 -0
- package/dist/discord-connector.d.ts.map +1 -0
- package/dist/discord-connector.js +638 -0
- package/dist/discord-connector.js.map +1 -0
- package/dist/error-handler.d.ts +237 -0
- package/dist/error-handler.d.ts.map +1 -0
- package/dist/error-handler.js +433 -0
- package/dist/error-handler.js.map +1 -0
- package/dist/errors.d.ts +61 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +77 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +119 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +198 -0
- package/dist/logger.js.map +1 -0
- package/dist/mention-handler.d.ts +176 -0
- package/dist/mention-handler.d.ts.map +1 -0
- package/dist/mention-handler.js +236 -0
- package/dist/mention-handler.js.map +1 -0
- package/dist/session-manager/__tests__/errors.test.d.ts +2 -0
- package/dist/session-manager/__tests__/errors.test.d.ts.map +1 -0
- package/dist/session-manager/__tests__/errors.test.js +124 -0
- package/dist/session-manager/__tests__/errors.test.js.map +1 -0
- package/dist/session-manager/__tests__/session-manager.test.d.ts +2 -0
- package/dist/session-manager/__tests__/session-manager.test.d.ts.map +1 -0
- package/dist/session-manager/__tests__/session-manager.test.js +517 -0
- package/dist/session-manager/__tests__/session-manager.test.js.map +1 -0
- package/dist/session-manager/__tests__/types.test.d.ts +2 -0
- package/dist/session-manager/__tests__/types.test.d.ts.map +1 -0
- package/dist/session-manager/__tests__/types.test.js +169 -0
- package/dist/session-manager/__tests__/types.test.js.map +1 -0
- package/dist/session-manager/errors.d.ts +58 -0
- package/dist/session-manager/errors.d.ts.map +1 -0
- package/dist/session-manager/errors.js +70 -0
- package/dist/session-manager/errors.js.map +1 -0
- package/dist/session-manager/index.d.ts +11 -0
- package/dist/session-manager/index.d.ts.map +1 -0
- package/dist/session-manager/index.js +12 -0
- package/dist/session-manager/index.js.map +1 -0
- package/dist/session-manager/session-manager.d.ts +107 -0
- package/dist/session-manager/session-manager.d.ts.map +1 -0
- package/dist/session-manager/session-manager.js +347 -0
- package/dist/session-manager/session-manager.js.map +1 -0
- package/dist/session-manager/types.d.ts +167 -0
- package/dist/session-manager/types.d.ts.map +1 -0
- package/dist/session-manager/types.js +57 -0
- package/dist/session-manager/types.js.map +1 -0
- package/dist/types.d.ts +323 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/__tests__/formatting.test.d.ts +2 -0
- package/dist/utils/__tests__/formatting.test.d.ts.map +1 -0
- package/dist/utils/__tests__/formatting.test.js +571 -0
- package/dist/utils/__tests__/formatting.test.js.map +1 -0
- package/dist/utils/formatting.d.ts +211 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +305 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- 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":"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"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|