(
sessionId: string,
workspaceId: string,
sessionState: SessionState,
parsedPrompt: ParsedPrompt
)
| 788 | return delegatedToolNames; |
| 789 | } |
| 790 | private async tryHandleSlashCommand( |
| 791 | sessionId: string, |
| 792 | workspaceId: string, |
| 793 | sessionState: SessionState, |
| 794 | parsedPrompt: ParsedPrompt |
| 795 | ): Promise<PromptResponse | null> { |
| 796 | const trimmedPrompt = parsedPrompt.text.trim(); |
| 797 | if (!trimmedPrompt.startsWith("/")) { |
| 798 | return null; |
| 799 | } |
| 800 | |
| 801 | let skillsByName: ReadonlyMap<string, AgentSkillDescriptor>; |
| 802 | try { |
| 803 | skillsByName = await this.getSessionSkills(sessionId, workspaceId); |
| 804 | } catch (error) { |
| 805 | console.error("[acp] Failed to load skills for slash command parsing", error); |
| 806 | // Built-in ACP slash commands (/clear, /compact, etc.) should |
| 807 | // still work when skill discovery has a transient failure. |
| 808 | skillsByName = new Map<string, AgentSkillDescriptor>(); |
| 809 | } |
| 810 | |
| 811 | const parsedCommand = parseAcpSlashCommand(parsedPrompt.text, skillsByName); |
| 812 | if (parsedCommand == null) { |
| 813 | return null; |
| 814 | } |
| 815 | |
| 816 | return this.handleSlashCommand( |
| 817 | sessionId, |
| 818 | workspaceId, |
| 819 | sessionState, |
| 820 | parsedPrompt, |
| 821 | parsedCommand |
| 822 | ); |
| 823 | } |
| 824 | |
| 825 | private async handleSlashCommand( |
| 826 | sessionId: string, |
no test coverage detected