@herdctl/discord 1.1.0 → 1.2.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 (134) hide show
  1. package/README.md +14 -1
  2. package/dist/__tests__/attachments.test.d.ts +8 -0
  3. package/dist/__tests__/attachments.test.d.ts.map +1 -0
  4. package/dist/__tests__/attachments.test.js +439 -0
  5. package/dist/__tests__/attachments.test.js.map +1 -0
  6. package/dist/__tests__/discord-connector.test.js +4 -1
  7. package/dist/__tests__/discord-connector.test.js.map +1 -1
  8. package/dist/__tests__/embeds.test.d.ts +2 -0
  9. package/dist/__tests__/embeds.test.d.ts.map +1 -0
  10. package/dist/__tests__/embeds.test.js +47 -0
  11. package/dist/__tests__/embeds.test.js.map +1 -0
  12. package/dist/__tests__/logger.test.js +4 -1
  13. package/dist/__tests__/logger.test.js.map +1 -1
  14. package/dist/__tests__/manager.test.js +1193 -28
  15. package/dist/__tests__/manager.test.js.map +1 -1
  16. package/dist/__tests__/message-normalizer.test.d.ts +2 -0
  17. package/dist/__tests__/message-normalizer.test.d.ts.map +1 -0
  18. package/dist/__tests__/message-normalizer.test.js +83 -0
  19. package/dist/__tests__/message-normalizer.test.js.map +1 -0
  20. package/dist/__tests__/runtime-parity.test.d.ts +2 -0
  21. package/dist/__tests__/runtime-parity.test.d.ts.map +1 -0
  22. package/dist/__tests__/runtime-parity.test.js +157 -0
  23. package/dist/__tests__/runtime-parity.test.js.map +1 -0
  24. package/dist/auto-mode-handler.d.ts.map +1 -1
  25. package/dist/auto-mode-handler.js +9 -0
  26. package/dist/auto-mode-handler.js.map +1 -1
  27. package/dist/commands/__tests__/command-manager.test.js +63 -3
  28. package/dist/commands/__tests__/command-manager.test.js.map +1 -1
  29. package/dist/commands/__tests__/extended-commands.test.d.ts +2 -0
  30. package/dist/commands/__tests__/extended-commands.test.d.ts.map +1 -0
  31. package/dist/commands/__tests__/extended-commands.test.js +159 -0
  32. package/dist/commands/__tests__/extended-commands.test.js.map +1 -0
  33. package/dist/commands/__tests__/help.test.js +5 -6
  34. package/dist/commands/__tests__/help.test.js.map +1 -1
  35. package/dist/commands/__tests__/reset.test.js +14 -6
  36. package/dist/commands/__tests__/reset.test.js.map +1 -1
  37. package/dist/commands/__tests__/status.test.js +27 -25
  38. package/dist/commands/__tests__/status.test.js.map +1 -1
  39. package/dist/commands/cancel.d.ts +3 -0
  40. package/dist/commands/cancel.d.ts.map +1 -0
  41. package/dist/commands/cancel.js +7 -0
  42. package/dist/commands/cancel.js.map +1 -0
  43. package/dist/commands/command-manager.d.ts +4 -1
  44. package/dist/commands/command-manager.d.ts.map +1 -1
  45. package/dist/commands/command-manager.js +65 -3
  46. package/dist/commands/command-manager.js.map +1 -1
  47. package/dist/commands/config.d.ts +3 -0
  48. package/dist/commands/config.d.ts.map +1 -0
  49. package/dist/commands/config.js +33 -0
  50. package/dist/commands/config.js.map +1 -0
  51. package/dist/commands/help.d.ts +1 -1
  52. package/dist/commands/help.d.ts.map +1 -1
  53. package/dist/commands/help.js +26 -12
  54. package/dist/commands/help.js.map +1 -1
  55. package/dist/commands/index.d.ts +12 -1
  56. package/dist/commands/index.d.ts.map +1 -1
  57. package/dist/commands/index.js +12 -1
  58. package/dist/commands/index.js.map +1 -1
  59. package/dist/commands/new.d.ts +3 -0
  60. package/dist/commands/new.d.ts.map +1 -0
  61. package/dist/commands/new.js +22 -0
  62. package/dist/commands/new.js.map +1 -0
  63. package/dist/commands/ping.d.ts +3 -0
  64. package/dist/commands/ping.d.ts.map +1 -0
  65. package/dist/commands/ping.js +22 -0
  66. package/dist/commands/ping.js.map +1 -0
  67. package/dist/commands/reset.d.ts +1 -1
  68. package/dist/commands/reset.d.ts.map +1 -1
  69. package/dist/commands/reset.js +13 -13
  70. package/dist/commands/reset.js.map +1 -1
  71. package/dist/commands/retry.d.ts +3 -0
  72. package/dist/commands/retry.d.ts.map +1 -0
  73. package/dist/commands/retry.js +25 -0
  74. package/dist/commands/retry.js.map +1 -0
  75. package/dist/commands/session.d.ts +3 -0
  76. package/dist/commands/session.d.ts.map +1 -0
  77. package/dist/commands/session.js +47 -0
  78. package/dist/commands/session.js.map +1 -0
  79. package/dist/commands/skill.d.ts +3 -0
  80. package/dist/commands/skill.d.ts.map +1 -0
  81. package/dist/commands/skill.js +44 -0
  82. package/dist/commands/skill.js.map +1 -0
  83. package/dist/commands/skills.d.ts +3 -0
  84. package/dist/commands/skills.d.ts.map +1 -0
  85. package/dist/commands/skills.js +30 -0
  86. package/dist/commands/skills.js.map +1 -0
  87. package/dist/commands/status.d.ts +1 -1
  88. package/dist/commands/status.d.ts.map +1 -1
  89. package/dist/commands/status.js +25 -18
  90. package/dist/commands/status.js.map +1 -1
  91. package/dist/commands/stop.d.ts +3 -0
  92. package/dist/commands/stop.d.ts.map +1 -0
  93. package/dist/commands/stop.js +25 -0
  94. package/dist/commands/stop.js.map +1 -0
  95. package/dist/commands/tools.d.ts +3 -0
  96. package/dist/commands/tools.d.ts.map +1 -0
  97. package/dist/commands/tools.js +30 -0
  98. package/dist/commands/tools.js.map +1 -0
  99. package/dist/commands/types.d.ts +71 -1
  100. package/dist/commands/types.d.ts.map +1 -1
  101. package/dist/commands/usage.d.ts +3 -0
  102. package/dist/commands/usage.d.ts.map +1 -0
  103. package/dist/commands/usage.js +58 -0
  104. package/dist/commands/usage.js.map +1 -0
  105. package/dist/discord-connector.d.ts +10 -1
  106. package/dist/discord-connector.d.ts.map +1 -1
  107. package/dist/discord-connector.js +153 -8
  108. package/dist/discord-connector.js.map +1 -1
  109. package/dist/embeds.d.ts +47 -0
  110. package/dist/embeds.d.ts.map +1 -0
  111. package/dist/embeds.js +121 -0
  112. package/dist/embeds.js.map +1 -0
  113. package/dist/index.d.ts +6 -2
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +3 -1
  116. package/dist/index.js.map +1 -1
  117. package/dist/manager.d.ts +53 -24
  118. package/dist/manager.d.ts.map +1 -1
  119. package/dist/manager.js +1031 -217
  120. package/dist/manager.js.map +1 -1
  121. package/dist/mention-handler.d.ts.map +1 -1
  122. package/dist/mention-handler.js +27 -0
  123. package/dist/mention-handler.js.map +1 -1
  124. package/dist/message-normalizer.d.ts +40 -0
  125. package/dist/message-normalizer.d.ts.map +1 -0
  126. package/dist/message-normalizer.js +99 -0
  127. package/dist/message-normalizer.js.map +1 -0
  128. package/dist/types.d.ts +80 -3
  129. package/dist/types.d.ts.map +1 -1
  130. package/dist/voice-transcriber.d.ts +31 -0
  131. package/dist/voice-transcriber.d.ts.map +1 -0
  132. package/dist/voice-transcriber.js +44 -0
  133. package/dist/voice-transcriber.js.map +1 -0
  134. package/package.json +3 -3
@@ -4,10 +4,21 @@
4
4
  * Provides command registration, handling, and built-in commands
5
5
  * for controlling the bot via Discord slash commands.
6
6
  */
7
+ // Built-in Commands
8
+ export { cancelCommand } from "./cancel.js";
7
9
  // Command Manager
8
10
  export { CommandManager } from "./command-manager.js";
9
- // Built-in Commands
11
+ export { configCommand } from "./config.js";
10
12
  export { helpCommand } from "./help.js";
13
+ export { newCommand } from "./new.js";
14
+ export { pingCommand } from "./ping.js";
11
15
  export { resetCommand } from "./reset.js";
16
+ export { retryCommand } from "./retry.js";
17
+ export { sessionCommand } from "./session.js";
18
+ export { skillCommand } from "./skill.js";
19
+ export { skillsCommand } from "./skills.js";
12
20
  export { statusCommand } from "./status.js";
21
+ export { stopCommand } from "./stop.js";
22
+ export { toolsCommand } from "./tools.js";
23
+ export { usageCommand } from "./usage.js";
13
24
  //# sourceMappingURL=index.js.map
@@ -1 +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;AACtD,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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oBAAoB;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAa1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SlashCommand } from "./types.js";
2
+ export declare const newCommand: SlashCommand;
3
+ //# sourceMappingURL=new.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,UAAU,EAAE,YAuBxB,CAAC"}
@@ -0,0 +1,22 @@
1
+ export const newCommand = {
2
+ name: "new",
3
+ description: "Start a fresh conversation (clear current session)",
4
+ async execute(context) {
5
+ const { interaction, sessionManager, agentName } = context;
6
+ const channelId = interaction.channelId;
7
+ const wasCleared = await sessionManager.clearSession(channelId);
8
+ await interaction.reply({
9
+ embeds: [
10
+ {
11
+ description: wasCleared
12
+ ? "Started a new conversation. Previous session context was cleared."
13
+ : "Started a new conversation. No previous session was active.",
14
+ color: 0x22c55e,
15
+ footer: { text: `herdctl · ${agentName}` },
16
+ },
17
+ ],
18
+ ephemeral: true,
19
+ });
20
+ },
21
+ };
22
+ //# sourceMappingURL=new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAiB;IACtC,IAAI,EAAE,KAAK;IACX,WAAW,EAAE,oDAAoD;IAEjE,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,MAAM,WAAW,CAAC,KAAK,CAAC;YACtB,MAAM,EAAE;gBACN;oBACE,WAAW,EAAE,UAAU;wBACrB,CAAC,CAAC,mEAAmE;wBACrE,CAAC,CAAC,6DAA6D;oBACjE,KAAK,EAAE,QAAQ;oBACf,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,SAAS,EAAE,EAAE;iBAC3C;aACF;YACD,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SlashCommand } from "./types.js";
2
+ export declare const pingCommand: SlashCommand;
3
+ //# sourceMappingURL=ping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ping.d.ts","sourceRoot":"","sources":["../../src/commands/ping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,WAAW,EAAE,YAqBzB,CAAC"}
@@ -0,0 +1,22 @@
1
+ export const pingCommand = {
2
+ name: "ping",
3
+ description: "Quick health check",
4
+ async execute(context) {
5
+ const { interaction, connectorState, agentName } = context;
6
+ await interaction.reply({
7
+ embeds: [
8
+ {
9
+ description: [
10
+ "**Status:** online",
11
+ `**Connector:** ${connectorState.status}`,
12
+ `**Agent:** ${agentName}`,
13
+ ].join("\n"),
14
+ color: 0x22c55e,
15
+ footer: { text: `herdctl · ${agentName}` },
16
+ },
17
+ ],
18
+ ephemeral: true,
19
+ });
20
+ },
21
+ };
22
+ //# sourceMappingURL=ping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ping.js","sourceRoot":"","sources":["../../src/commands/ping.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,oBAAoB;IAEjC,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;QAC3D,MAAM,WAAW,CAAC,KAAK,CAAC;YACtB,MAAM,EAAE;gBACN;oBACE,WAAW,EAAE;wBACX,oBAAoB;wBACpB,kBAAkB,cAAc,CAAC,MAAM,EAAE;wBACzC,cAAc,SAAS,EAAE;qBAC1B,CAAC,IAAI,CAAC,IAAI,CAAC;oBACZ,KAAK,EAAE,QAAQ;oBACf,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,SAAS,EAAE,EAAE;iBAC3C;aACF;YACD,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * /reset command - Clear conversation context
3
3
  *
4
4
  * Clears the session for the current channel, starting a fresh conversation.
5
- * Responds ephemerally with confirmation.
5
+ * Responds ephemerally with a color-coded embed confirmation.
6
6
  */
7
7
  import type { SlashCommand } from "./types.js";
8
8
  export declare const resetCommand: SlashCommand;
@@ -1 +1 @@
1
- {"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../src/commands/reset.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,YAAY,EAAE,YAsB1B,CAAC"}
1
+ {"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../src/commands/reset.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,YAAY,EAAE,YAuB1B,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * /reset command - Clear conversation context
3
3
  *
4
4
  * Clears the session for the current channel, starting a fresh conversation.
5
- * Responds ephemerally with confirmation.
5
+ * Responds ephemerally with a color-coded embed confirmation.
6
6
  */
7
7
  export const resetCommand = {
8
8
  name: "reset",
@@ -11,18 +11,18 @@ export const resetCommand = {
11
11
  const { interaction, sessionManager, agentName } = context;
12
12
  const channelId = interaction.channelId;
13
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
- }
14
+ await interaction.reply({
15
+ embeds: [
16
+ {
17
+ description: wasCleared
18
+ ? "Session cleared. Starting fresh."
19
+ : "No active session in this channel.",
20
+ color: wasCleared ? 0x22c55e : 0x6b7280,
21
+ footer: { text: `herdctl \u00b7 ${agentName}` },
22
+ },
23
+ ],
24
+ ephemeral: true,
25
+ });
26
26
  },
27
27
  };
28
28
  //# sourceMappingURL=reset.js.map
@@ -1 +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"}
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,MAAM,WAAW,CAAC,KAAK,CAAC;YACtB,MAAM,EAAE;gBACN;oBACE,WAAW,EAAE,UAAU;wBACrB,CAAC,CAAC,kCAAkC;wBACpC,CAAC,CAAC,oCAAoC;oBACxC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;oBACvC,MAAM,EAAE,EAAE,IAAI,EAAE,kBAAkB,SAAS,EAAE,EAAE;iBAChD;aACF;YACD,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SlashCommand } from "./types.js";
2
+ export declare const retryCommand: SlashCommand;
3
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/commands/retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,YAAY,EAAE,YA0B1B,CAAC"}
@@ -0,0 +1,25 @@
1
+ export const retryCommand = {
2
+ name: "retry",
3
+ description: "Retry the last prompt in this channel",
4
+ async execute(context) {
5
+ const { interaction, commandActions, agentName } = context;
6
+ const channelId = interaction.channelId;
7
+ const result = commandActions?.retryRun
8
+ ? await commandActions.retryRun(channelId)
9
+ : {
10
+ success: false,
11
+ message: "Retry is not available in this deployment.",
12
+ };
13
+ await interaction.reply({
14
+ embeds: [
15
+ {
16
+ description: result.message,
17
+ color: result.success ? 0x22c55e : 0xef4444,
18
+ footer: { text: `herdctl · ${agentName}` },
19
+ },
20
+ ],
21
+ ephemeral: true,
22
+ });
23
+ },
24
+ };
25
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/commands/retry.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,uCAAuC;IAEpD,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,MAAM,GAAG,cAAc,EAAE,QAAQ;YACrC,CAAC,CAAC,MAAM,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC1C,CAAC,CAAC;gBACE,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,4CAA4C;aACtD,CAAC;QAEN,MAAM,WAAW,CAAC,KAAK,CAAC;YACtB,MAAM,EAAE;gBACN;oBACE,WAAW,EAAE,MAAM,CAAC,OAAO;oBAC3B,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;oBAC3C,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,SAAS,EAAE,EAAE;iBAC3C;aACF;YACD,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SlashCommand } from "./types.js";
2
+ export declare const sessionCommand: SlashCommand;
3
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,cAAc,EAAE,YAmD5B,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { formatDuration } from "@herdctl/chat";
2
+ export const sessionCommand = {
3
+ name: "session",
4
+ description: "Show current session and run state for this channel",
5
+ async execute(context) {
6
+ const { interaction, sessionManager, commandActions, agentName } = context;
7
+ const channelId = interaction.channelId;
8
+ const session = await sessionManager.getSession(channelId);
9
+ const managedInfo = commandActions?.getSessionInfo
10
+ ? await commandActions.getSessionInfo(channelId)
11
+ : undefined;
12
+ const lines = [];
13
+ if (session) {
14
+ lines.push("**Session**");
15
+ lines.push(`\`${session.sessionId.substring(0, 20)}…\` · Active ${formatDuration(session.lastMessageAt)} ago`);
16
+ }
17
+ else {
18
+ lines.push("**Session**");
19
+ lines.push("No active session.");
20
+ }
21
+ lines.push("");
22
+ lines.push("**Run State**");
23
+ if (managedInfo?.activeJobId) {
24
+ lines.push(`Running job: \`${managedInfo.activeJobId}\``);
25
+ }
26
+ else {
27
+ lines.push("No active run in this channel.");
28
+ }
29
+ if (managedInfo?.lastPrompt) {
30
+ const preview = managedInfo.lastPrompt.length > 100
31
+ ? `${managedInfo.lastPrompt.substring(0, 100)}…`
32
+ : managedInfo.lastPrompt;
33
+ lines.push(`Last prompt: \`${preview}\``);
34
+ }
35
+ await interaction.reply({
36
+ embeds: [
37
+ {
38
+ description: lines.join("\n"),
39
+ color: 0x3b82f6,
40
+ footer: { text: `herdctl · ${agentName}` },
41
+ },
42
+ ],
43
+ ephemeral: true,
44
+ });
45
+ },
46
+ };
47
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,qDAAqD;IAElE,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;QAC3E,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;QAExC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,cAAc,EAAE,cAAc;YAChD,CAAC,CAAC,MAAM,cAAc,CAAC,cAAc,CAAC,SAAS,CAAC;YAChD,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1B,KAAK,CAAC,IAAI,CACR,KAAK,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CACnG,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACnC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5B,IAAI,WAAW,EAAE,WAAW,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,kBAAkB,WAAW,CAAC,WAAW,IAAI,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,WAAW,EAAE,UAAU,EAAE,CAAC;YAC5B,MAAM,OAAO,GACX,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG;gBACjC,CAAC,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;gBAChD,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,kBAAkB,OAAO,IAAI,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,WAAW,CAAC,KAAK,CAAC;YACtB,MAAM,EAAE;gBACN;oBACE,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC7B,KAAK,EAAE,QAAQ;oBACf,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,SAAS,EAAE,EAAE;iBAC3C;aACF;YACD,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SlashCommand } from "./types.js";
2
+ export declare const skillCommand: SlashCommand;
3
+ //# sourceMappingURL=skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,YAAY,CAAC;AA8B/D,eAAO,MAAM,YAAY,EAAE,YAyB1B,CAAC"}
@@ -0,0 +1,44 @@
1
+ function buildSkillCommand(builder) {
2
+ builder.addStringOption((option) => option.setName("name").setDescription("Skill name").setRequired(true).setAutocomplete(true));
3
+ builder.addStringOption((option) => option.setName("input").setDescription("Optional input for the skill").setRequired(false));
4
+ return builder;
5
+ }
6
+ async function autocompleteSkill(interaction, context) {
7
+ const focused = interaction.options.getFocused().toLowerCase();
8
+ const skills = context.commandActions?.listSkills
9
+ ? await context.commandActions.listSkills()
10
+ : [];
11
+ const choices = skills
12
+ .filter((skill) => skill.name.toLowerCase().includes(focused))
13
+ .slice(0, 25)
14
+ .map((skill) => ({
15
+ name: skill.description ? `${skill.name} — ${skill.description}`.slice(0, 100) : skill.name,
16
+ value: skill.name,
17
+ }));
18
+ await interaction.respond(choices);
19
+ }
20
+ export const skillCommand = {
21
+ name: "skill",
22
+ description: "Trigger a skill in this channel",
23
+ build: buildSkillCommand,
24
+ autocomplete: autocompleteSkill,
25
+ async execute(context) {
26
+ const { interaction, commandActions, agentName } = context;
27
+ const skillName = interaction.options.getString("name", true);
28
+ const input = interaction.options.getString("input", false) ?? undefined;
29
+ const result = commandActions?.runSkill
30
+ ? await commandActions.runSkill(interaction.channelId, skillName, input)
31
+ : { success: false, message: "Skill execution is not available in this deployment." };
32
+ await interaction.reply({
33
+ embeds: [
34
+ {
35
+ description: result.message,
36
+ color: result.success ? 0x22c55e : 0xef4444,
37
+ footer: { text: `herdctl · ${agentName}` },
38
+ },
39
+ ],
40
+ ephemeral: true,
41
+ });
42
+ },
43
+ };
44
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAGA,SAAS,iBAAiB,CAAC,OAA4B;IACrD,OAAO,CAAC,eAAe,CAAC,CAAC,MAAM,EAAE,EAAE,CACjC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAC5F,CAAC;IACF,OAAO,CAAC,eAAe,CAAC,CAAC,MAAM,EAAE,EAAE,CACjC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,8BAA8B,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAC1F,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,WAAoC,EACpC,OAA4C;IAE5C,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,UAAU;QAC/C,CAAC,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE;QAC3C,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,OAAO,GAAG,MAAM;SACnB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAC7D,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACf,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;QAC3F,KAAK,EAAE,KAAK,CAAC,IAAI;KAClB,CAAC,CAAC,CAAC;IACN,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,iCAAiC;IAC9C,KAAK,EAAE,iBAAiB;IACxB,YAAY,EAAE,iBAAiB;IAE/B,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;QAC3D,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC;QACzE,MAAM,MAAM,GAAG,cAAc,EAAE,QAAQ;YACrC,CAAC,CAAC,MAAM,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC;YACxE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,sDAAsD,EAAE,CAAC;QAExF,MAAM,WAAW,CAAC,KAAK,CAAC;YACtB,MAAM,EAAE;gBACN;oBACE,WAAW,EAAE,MAAM,CAAC,OAAO;oBAC3B,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;oBAC3C,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,SAAS,EAAE,EAAE;iBAC3C;aACF;YACD,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SlashCommand } from "./types.js";
2
+ export declare const skillsCommand: SlashCommand;
3
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,aAAa,EAAE,YAgC3B,CAAC"}
@@ -0,0 +1,30 @@
1
+ export const skillsCommand = {
2
+ name: "skills",
3
+ description: "List discovered skills for this agent",
4
+ async execute(context) {
5
+ const { interaction, commandActions, agentName } = context;
6
+ const skills = commandActions?.listSkills ? await commandActions.listSkills() : [];
7
+ if (skills.length === 0) {
8
+ await interaction.reply({
9
+ content: "No skills were discovered for this agent.",
10
+ ephemeral: true,
11
+ });
12
+ return;
13
+ }
14
+ const lines = skills.slice(0, 25).map((skill) => {
15
+ const detail = skill.description ? ` — ${skill.description}` : "";
16
+ return `• \`${skill.name}\`${detail}`;
17
+ });
18
+ await interaction.reply({
19
+ embeds: [
20
+ {
21
+ description: [`Discovered **${skills.length}** skill(s):`, "", ...lines].join("\n"),
22
+ color: 0x3b82f6,
23
+ footer: { text: `herdctl · ${agentName}` },
24
+ },
25
+ ],
26
+ ephemeral: true,
27
+ });
28
+ },
29
+ };
30
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,uCAAuC;IAEpD,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;QAC3D,MAAM,MAAM,GAAG,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEnF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,WAAW,CAAC,KAAK,CAAC;gBACtB,OAAO,EAAE,2CAA2C;gBACpD,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,MAAM,WAAW,CAAC,KAAK,CAAC;YACtB,MAAM,EAAE;gBACN;oBACE,WAAW,EAAE,CAAC,gBAAgB,MAAM,CAAC,MAAM,cAAc,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;oBACnF,KAAK,EAAE,QAAQ;oBACf,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,SAAS,EAAE,EAAE;iBAC3C;aACF;YACD,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * /status command - Show agent status and session info
3
3
  *
4
- * Responds ephemerally with the current agent status, connection info,
4
+ * Responds ephemerally with a condensed embed showing connection status
5
5
  * and session information for the current channel.
6
6
  */
7
7
  import type { SlashCommand } from "./types.js";
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,aAAa,EAAE,YAgD3B,CAAC"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,aAAa,EAAE,YAyD3B,CAAC"}
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * /status command - Show agent status and session info
3
3
  *
4
- * Responds ephemerally with the current agent status, connection info,
4
+ * Responds ephemerally with a condensed embed showing connection status
5
5
  * and session information for the current channel.
6
6
  */
7
- import { formatDuration, formatTimestamp, getStatusEmoji } from "@herdctl/chat";
7
+ import { formatDuration, getStatusEmoji } from "@herdctl/chat";
8
8
  export const statusCommand = {
9
9
  name: "status",
10
10
  description: "Show agent status and session info",
@@ -13,35 +13,42 @@ export const statusCommand = {
13
13
  const channelId = interaction.channelId;
14
14
  // Get session info for this channel
15
15
  const session = await sessionManager.getSession(channelId);
16
- // Build status message
16
+ // Build condensed status
17
17
  const statusEmoji = getStatusEmoji(connectorState.status);
18
18
  const botUsername = connectorState.botUser?.username ?? "Unknown";
19
- let statusMessage = `**${agentName} Status**
20
-
21
- ${statusEmoji} **Connection:** ${connectorState.status}
22
- **Bot:** ${botUsername}`;
19
+ const statusLabel = connectorState.status.charAt(0).toUpperCase() + connectorState.status.slice(1);
20
+ const lines = [];
21
+ // Connection line: "🟢 **Connected** as MyBot · Uptime 2h 30m"
22
+ const connectionParts = [`${statusEmoji} **${statusLabel}**`, `as ${botUsername}`];
23
23
  if (connectorState.connectedAt) {
24
- statusMessage += `\n**Connected:** ${formatTimestamp(connectorState.connectedAt)}`;
25
- statusMessage += `\n**Uptime:** ${formatDuration(connectorState.connectedAt)}`;
24
+ connectionParts.push(`\u00b7 Uptime ${formatDuration(connectorState.connectedAt)}`);
26
25
  }
26
+ lines.push(connectionParts.join(" "));
27
27
  if (connectorState.reconnectAttempts > 0) {
28
- statusMessage += `\n**Reconnect Attempts:** ${connectorState.reconnectAttempts}`;
28
+ lines.push(`Reconnect attempts: ${connectorState.reconnectAttempts}`);
29
29
  }
30
30
  if (connectorState.lastError) {
31
- statusMessage += `\n**Last Error:** ${connectorState.lastError}`;
31
+ lines.push(`Last error: ${connectorState.lastError}`);
32
32
  }
33
- // Session info
34
- statusMessage += `\n\n**Session Info**`;
33
+ // Session section
34
+ lines.push("");
35
35
  if (session) {
36
- statusMessage += `\n**Session ID:** \`${session.sessionId.substring(0, 20)}...\``;
37
- statusMessage += `\n**Last Activity:** ${formatTimestamp(session.lastMessageAt)}`;
38
- statusMessage += `\n**Session Age:** ${formatDuration(session.lastMessageAt)}`;
36
+ lines.push("**Session**");
37
+ lines.push(`\`${session.sessionId.substring(0, 20)}\u2026\` \u00b7 Active ${formatDuration(session.lastMessageAt)} ago`);
39
38
  }
40
39
  else {
41
- statusMessage += `\nNo active session in this channel.`;
40
+ lines.push("**Session**");
41
+ lines.push("No active session in this channel.");
42
42
  }
43
43
  await interaction.reply({
44
- content: statusMessage,
44
+ embeds: [
45
+ {
46
+ description: lines.join("\n"),
47
+ color: 0x3b82f6,
48
+ footer: { text: `herdctl \u00b7 ${agentName}` },
49
+ timestamp: new Date().toISOString(),
50
+ },
51
+ ],
45
52
  ephemeral: true,
46
53
  });
47
54
  },
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGhF,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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/D,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,yBAAyB;QACzB,MAAM,WAAW,GAAG,cAAc,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,EAAE,QAAQ,IAAI,SAAS,CAAC;QAClE,MAAM,WAAW,GACf,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEjF,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,+DAA+D;QAC/D,MAAM,eAAe,GAAG,CAAC,GAAG,WAAW,MAAM,WAAW,IAAI,EAAE,MAAM,WAAW,EAAE,CAAC,CAAC;QACnF,IAAI,cAAc,CAAC,WAAW,EAAE,CAAC;YAC/B,eAAe,CAAC,IAAI,CAAC,iBAAiB,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAEtC,IAAI,cAAc,CAAC,iBAAiB,GAAG,CAAC,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,uBAAuB,cAAc,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,eAAe,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,kBAAkB;QAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1B,KAAK,CAAC,IAAI,CACR,KAAK,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,0BAA0B,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAC7G,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,WAAW,CAAC,KAAK,CAAC;YACtB,MAAM,EAAE;gBACN;oBACE,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC7B,KAAK,EAAE,QAAQ;oBACf,MAAM,EAAE,EAAE,IAAI,EAAE,kBAAkB,SAAS,EAAE,EAAE;oBAC/C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC;aACF;YACD,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SlashCommand } from "./types.js";
2
+ export declare const stopCommand: SlashCommand;
3
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,WAAW,EAAE,YA0BzB,CAAC"}
@@ -0,0 +1,25 @@
1
+ export const stopCommand = {
2
+ name: "stop",
3
+ description: "Stop the active run in this channel",
4
+ async execute(context) {
5
+ const { interaction, commandActions, agentName } = context;
6
+ const channelId = interaction.channelId;
7
+ const result = commandActions?.stopRun
8
+ ? await commandActions.stopRun(channelId)
9
+ : {
10
+ success: false,
11
+ message: "Stop is not available in this deployment.",
12
+ };
13
+ await interaction.reply({
14
+ embeds: [
15
+ {
16
+ description: result.message,
17
+ color: result.success ? 0x22c55e : 0xef4444,
18
+ footer: { text: `herdctl · ${agentName}` },
19
+ },
20
+ ],
21
+ ephemeral: true,
22
+ });
23
+ },
24
+ };
25
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,qCAAqC;IAElD,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,MAAM,GAAG,cAAc,EAAE,OAAO;YACpC,CAAC,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC;YACzC,CAAC,CAAC;gBACE,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,2CAA2C;aACrD,CAAC;QAEN,MAAM,WAAW,CAAC,KAAK,CAAC;YACtB,MAAM,EAAE;gBACN;oBACE,WAAW,EAAE,MAAM,CAAC,OAAO;oBAC3B,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;oBAC3C,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,SAAS,EAAE,EAAE;iBAC3C;aACF;YACD,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SlashCommand } from "./types.js";
2
+ export declare const toolsCommand: SlashCommand;
3
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/commands/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,YAAY,EAAE,YA8B1B,CAAC"}
@@ -0,0 +1,30 @@
1
+ export const toolsCommand = {
2
+ name: "tools",
3
+ description: "Show allowed/denied tools and MCP integration status",
4
+ async execute(context) {
5
+ const { interaction, commandActions, agentName } = context;
6
+ const config = commandActions?.getAgentConfig ? await commandActions.getAgentConfig() : null;
7
+ if (!config) {
8
+ await interaction.reply({
9
+ content: "Tool details are not available in this deployment.",
10
+ ephemeral: true,
11
+ });
12
+ return;
13
+ }
14
+ await interaction.reply({
15
+ embeds: [
16
+ {
17
+ description: [
18
+ `**Allowed:** ${config.allowedTools?.length ? config.allowedTools.join(", ") : "all defaults"}`,
19
+ `**Denied:** ${config.deniedTools?.length ? config.deniedTools.join(", ") : "none"}`,
20
+ `**MCP Servers:** ${config.mcpServers?.length ? config.mcpServers.join(", ") : "none"}`,
21
+ ].join("\n"),
22
+ color: 0x3b82f6,
23
+ footer: { text: `herdctl · ${agentName}` },
24
+ },
25
+ ],
26
+ ephemeral: true,
27
+ });
28
+ },
29
+ };
30
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/commands/tools.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,sDAAsD;IAEnE,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;QAC3D,MAAM,MAAM,GAAG,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7F,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,WAAW,CAAC,KAAK,CAAC;gBACtB,OAAO,EAAE,oDAAoD;gBAC7D,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,WAAW,CAAC,KAAK,CAAC;YACtB,MAAM,EAAE;gBACN;oBACE,WAAW,EAAE;wBACX,gBAAgB,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE;wBAC/F,eAAe,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;wBACpF,oBAAoB,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;qBACxF,CAAC,IAAI,CAAC,IAAI,CAAC;oBACZ,KAAK,EAAE,QAAQ;oBACf,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,SAAS,EAAE,EAAE;iBAC3C;aACF;YACD,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}