diff --git a/src/hooks/auto-slash-command/hook.ts b/src/hooks/auto-slash-command/hook.ts index 1803394d1..8b2c4a58e 100644 --- a/src/hooks/auto-slash-command/hook.ts +++ b/src/hooks/auto-slash-command/hook.ts @@ -56,6 +56,16 @@ function getCommandExecutionEventID(input: CommandExecuteBeforeInput): string | return null } +function partsContainAutoSlashCommandTags(parts: Array<{ text?: string }>): boolean { + return parts.some((part) => + typeof part.text === "string" + && ( + part.text.includes(AUTO_SLASH_COMMAND_TAG_OPEN) + || part.text.includes(AUTO_SLASH_COMMAND_TAG_CLOSE) + ) + ) +} + export interface AutoSlashCommandHookOptions { skills?: LoadedSkill[] pluginsEnabled?: boolean @@ -153,6 +163,10 @@ export function createAutoSlashCommandHook(options?: AutoSlashCommandHookOptions input: CommandExecuteBeforeInput, output: CommandExecuteBeforeOutput ): Promise => { + if (partsContainAutoSlashCommandTags(output.parts)) { + return + } + const eventID = getCommandExecutionEventID(input) const commandKey = eventID ? `${input.sessionID}:event:${eventID}` diff --git a/src/hooks/auto-slash-command/index.test.ts b/src/hooks/auto-slash-command/index.test.ts index 56d6dbbed..70e8d81c9 100644 --- a/src/hooks/auto-slash-command/index.test.ts +++ b/src/hooks/auto-slash-command/index.test.ts @@ -355,6 +355,22 @@ describe("createAutoSlashCommandHook", () => { expect(output.parts[0].text).toContain("/ralph-loop Command") }) + it("should not duplicate injection when command output is already tagged", async () => { + //#given + const hook = createAutoSlashCommandHook() + const input = createCommandInput("ralph-loop") + const taggedContent = "\n/ralph-loop Command\n" + const output = createCommandOutput(taggedContent) + + //#when + await hook["command.execute.before"](input, output) + + //#then + expect(output.parts).toHaveLength(1) + expect(output.parts[0]?.text).toBe(taggedContent) + expect(output.parts[0]?.text?.split("").length).toBe(2) + }) + it("should inject template for known builtin commands like ulw-loop", async () => { //#given const hook = createAutoSlashCommandHook()