mirror of
https://github.com/pacnpal/Roo-Code.git
synced 2025-12-20 04:11:10 -05:00
Merge pull request #526 from RooVetGit/switch_mode_tool
Add a tool to switch modes
This commit is contained in:
5
.changeset/tidy-camels-roll.md
Normal file
5
.changeset/tidy-camels-roll.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"roo-cline": patch
|
||||
---
|
||||
|
||||
Add a switch_mode tool to allow Roo to propose switching modes
|
||||
@@ -1022,6 +1022,8 @@ export class Cline {
|
||||
return `[${block.name} for '${block.params.question}']`
|
||||
case "attempt_completion":
|
||||
return `[${block.name}]`
|
||||
case "switch_mode":
|
||||
return `[${block.name} to '${block.params.mode_slug}'${block.params.reason ? ` because: ${block.params.reason}` : ""}]`
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2014,6 +2016,74 @@ export class Cline {
|
||||
break
|
||||
}
|
||||
}
|
||||
case "switch_mode": {
|
||||
const mode_slug: string | undefined = block.params.mode_slug
|
||||
const reason: string | undefined = block.params.reason
|
||||
try {
|
||||
if (block.partial) {
|
||||
const partialMessage = JSON.stringify({
|
||||
tool: "switchMode",
|
||||
mode: removeClosingTag("mode_slug", mode_slug),
|
||||
reason: removeClosingTag("reason", reason),
|
||||
})
|
||||
await this.ask("tool", partialMessage, block.partial).catch(() => {})
|
||||
break
|
||||
} else {
|
||||
if (!mode_slug) {
|
||||
this.consecutiveMistakeCount++
|
||||
pushToolResult(await this.sayAndCreateMissingParamError("switch_mode", "mode_slug"))
|
||||
break
|
||||
}
|
||||
this.consecutiveMistakeCount = 0
|
||||
|
||||
// Verify the mode exists
|
||||
const targetMode = getModeBySlug(
|
||||
mode_slug,
|
||||
(await this.providerRef.deref()?.getState())?.customModes,
|
||||
)
|
||||
if (!targetMode) {
|
||||
pushToolResult(formatResponse.toolError(`Invalid mode: ${mode_slug}`))
|
||||
break
|
||||
}
|
||||
|
||||
// Check if already in requested mode
|
||||
const currentMode =
|
||||
(await this.providerRef.deref()?.getState())?.mode ?? defaultModeSlug
|
||||
if (currentMode === mode_slug) {
|
||||
pushToolResult(`Already in ${targetMode.name} mode.`)
|
||||
break
|
||||
}
|
||||
|
||||
const completeMessage = JSON.stringify({
|
||||
tool: "switchMode",
|
||||
mode: mode_slug,
|
||||
reason,
|
||||
})
|
||||
|
||||
const didApprove = await askApproval("tool", completeMessage)
|
||||
if (!didApprove) {
|
||||
break
|
||||
}
|
||||
|
||||
// Switch the mode
|
||||
const provider = this.providerRef.deref()
|
||||
if (provider) {
|
||||
await provider.updateGlobalState("mode", mode_slug)
|
||||
await provider.postStateToWebview()
|
||||
}
|
||||
pushToolResult(
|
||||
`Successfully switched from ${getModeBySlug(currentMode)?.name ?? currentMode} mode to ${
|
||||
targetMode.name
|
||||
} mode${reason ? ` because: ${reason}` : ""}.`,
|
||||
)
|
||||
break
|
||||
}
|
||||
} catch (error) {
|
||||
await handleError("switching mode", error)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
case "attempt_completion": {
|
||||
/*
|
||||
this.consecutiveMistakeCount = 0
|
||||
|
||||
@@ -21,6 +21,7 @@ export const toolUseNames = [
|
||||
"access_mcp_resource",
|
||||
"ask_followup_question",
|
||||
"attempt_completion",
|
||||
"switch_mode",
|
||||
] as const
|
||||
|
||||
// Converts array of tool call names into a union type ("execute_command" | "read_file" | ...)
|
||||
@@ -47,6 +48,8 @@ export const toolParamNames = [
|
||||
"diff",
|
||||
"start_line",
|
||||
"end_line",
|
||||
"mode_slug",
|
||||
"reason",
|
||||
] as const
|
||||
|
||||
export type ToolParamName = (typeof toolParamNames)[number]
|
||||
@@ -114,3 +117,8 @@ export interface AttemptCompletionToolUse extends ToolUse {
|
||||
name: "attempt_completion"
|
||||
params: Partial<Pick<Record<ToolParamName, string>, "result" | "command">>
|
||||
}
|
||||
|
||||
export interface SwitchModeToolUse extends ToolUse {
|
||||
name: "switch_mode"
|
||||
params: Partial<Pick<Record<ToolParamName, string>, "mode_slug" | "reason">>
|
||||
}
|
||||
|
||||
@@ -181,6 +181,23 @@ I've updated the CSS
|
||||
<command>open index.html</command>
|
||||
</attempt_completion>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
Parameters:
|
||||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
|
||||
# Tool Use Guidelines
|
||||
|
||||
1. In <thinking> tags, assess what information you already have and what information you need to proceed with the task.
|
||||
@@ -469,6 +486,23 @@ I've updated the CSS
|
||||
<command>open index.html</command>
|
||||
</attempt_completion>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
Parameters:
|
||||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
|
||||
# Tool Use Guidelines
|
||||
|
||||
1. In <thinking> tags, assess what information you already have and what information you need to proceed with the task.
|
||||
@@ -757,6 +791,23 @@ I've updated the CSS
|
||||
<command>open index.html</command>
|
||||
</attempt_completion>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
Parameters:
|
||||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
|
||||
# Tool Use Guidelines
|
||||
|
||||
1. In <thinking> tags, assess what information you already have and what information you need to proceed with the task.
|
||||
@@ -1091,6 +1142,23 @@ I've updated the CSS
|
||||
<command>open index.html</command>
|
||||
</attempt_completion>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
Parameters:
|
||||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
|
||||
# Tool Use Guidelines
|
||||
|
||||
1. In <thinking> tags, assess what information you already have and what information you need to proceed with the task.
|
||||
@@ -1431,6 +1499,23 @@ I've updated the CSS
|
||||
<command>open index.html</command>
|
||||
</attempt_completion>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
Parameters:
|
||||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
|
||||
# Tool Use Guidelines
|
||||
|
||||
1. In <thinking> tags, assess what information you already have and what information you need to proceed with the task.
|
||||
@@ -2129,6 +2214,23 @@ I've updated the CSS
|
||||
<command>open index.html</command>
|
||||
</attempt_completion>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
Parameters:
|
||||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
|
||||
# Tool Use Guidelines
|
||||
|
||||
1. In <thinking> tags, assess what information you already have and what information you need to proceed with the task.
|
||||
@@ -2480,6 +2582,23 @@ I've updated the CSS
|
||||
<command>open index.html</command>
|
||||
</attempt_completion>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
Parameters:
|
||||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
|
||||
# Tool Use Guidelines
|
||||
|
||||
1. In <thinking> tags, assess what information you already have and what information you need to proceed with the task.
|
||||
@@ -2768,6 +2887,23 @@ I've updated the CSS
|
||||
<command>open index.html</command>
|
||||
</attempt_completion>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
Parameters:
|
||||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
|
||||
# Tool Use Guidelines
|
||||
|
||||
1. In <thinking> tags, assess what information you already have and what information you need to proceed with the task.
|
||||
@@ -3099,6 +3235,23 @@ I've updated the CSS
|
||||
<command>open index.html</command>
|
||||
</attempt_completion>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
Parameters:
|
||||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
|
||||
# Tool Use Guidelines
|
||||
|
||||
1. In <thinking> tags, assess what information you already have and what information you need to proceed with the task.
|
||||
@@ -3373,6 +3526,23 @@ I've updated the CSS
|
||||
<command>open index.html</command>
|
||||
</attempt_completion>
|
||||
|
||||
## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
Parameters:
|
||||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>
|
||||
|
||||
# Tool Use Guidelines
|
||||
|
||||
1. In <thinking> tags, assess what information you already have and what information you need to proceed with the task.
|
||||
|
||||
@@ -9,6 +9,7 @@ import { getAskFollowupQuestionDescription } from "./ask-followup-question"
|
||||
import { getAttemptCompletionDescription } from "./attempt-completion"
|
||||
import { getUseMcpToolDescription } from "./use-mcp-tool"
|
||||
import { getAccessMcpResourceDescription } from "./access-mcp-resource"
|
||||
import { getSwitchModeDescription } from "./switch-mode"
|
||||
import { DiffStrategy } from "../../diff/DiffStrategy"
|
||||
import { McpHub } from "../../../services/mcp/McpHub"
|
||||
import { Mode, ModeConfig, getModeConfig, isToolAllowedForMode, getGroupName } from "../../../shared/modes"
|
||||
@@ -28,6 +29,7 @@ const toolDescriptionMap: Record<string, (args: ToolArgs) => string | undefined>
|
||||
attempt_completion: () => getAttemptCompletionDescription(),
|
||||
use_mcp_tool: (args) => getUseMcpToolDescription(args),
|
||||
access_mcp_resource: (args) => getAccessMcpResourceDescription(args),
|
||||
switch_mode: () => getSwitchModeDescription(),
|
||||
apply_diff: (args) =>
|
||||
args.diffStrategy ? args.diffStrategy.getToolDescription({ cwd: args.cwd, toolOptions: args.toolOptions }) : "",
|
||||
}
|
||||
@@ -97,4 +99,5 @@ export {
|
||||
getAttemptCompletionDescription,
|
||||
getUseMcpToolDescription,
|
||||
getAccessMcpResourceDescription,
|
||||
getSwitchModeDescription,
|
||||
}
|
||||
|
||||
18
src/core/prompts/tools/switch-mode.ts
Normal file
18
src/core/prompts/tools/switch-mode.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
export function getSwitchModeDescription(): string {
|
||||
return `## switch_mode
|
||||
Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch.
|
||||
Parameters:
|
||||
- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect")
|
||||
- reason: (optional) The reason for switching modes
|
||||
Usage:
|
||||
<switch_mode>
|
||||
<mode_slug>Mode slug here</mode_slug>
|
||||
<reason>Reason for switching here</reason>
|
||||
</switch_mode>
|
||||
|
||||
Example: Requesting to switch to code mode
|
||||
<switch_mode>
|
||||
<mode_slug>code</mode_slug>
|
||||
<reason>Need to make code changes</reason>
|
||||
</switch_mode>`
|
||||
}
|
||||
@@ -166,11 +166,14 @@ export interface ClineSayTool {
|
||||
| "listFilesRecursive"
|
||||
| "listCodeDefinitionNames"
|
||||
| "searchFiles"
|
||||
| "switchMode"
|
||||
path?: string
|
||||
diff?: string
|
||||
content?: string
|
||||
regex?: string
|
||||
filePattern?: string
|
||||
mode?: string
|
||||
reason?: string
|
||||
}
|
||||
|
||||
// must keep in sync with system prompt
|
||||
|
||||
@@ -15,6 +15,7 @@ export const TOOL_DISPLAY_NAMES = {
|
||||
access_mcp_resource: "access mcp resources",
|
||||
ask_followup_question: "ask questions",
|
||||
attempt_completion: "complete tasks",
|
||||
switch_mode: "switch modes",
|
||||
} as const
|
||||
|
||||
// Define available tool groups
|
||||
@@ -29,7 +30,7 @@ export const TOOL_GROUPS: Record<string, ToolGroupValues> = {
|
||||
export type ToolGroup = keyof typeof TOOL_GROUPS
|
||||
|
||||
// Tools that are always available to all modes
|
||||
export const ALWAYS_AVAILABLE_TOOLS = ["ask_followup_question", "attempt_completion"] as const
|
||||
export const ALWAYS_AVAILABLE_TOOLS = ["ask_followup_question", "attempt_completion", "switch_mode"] as const
|
||||
|
||||
// Tool name types for type safety
|
||||
export type ToolName = keyof typeof TOOL_DISPLAY_NAMES
|
||||
|
||||
@@ -443,6 +443,27 @@ export const ChatRowContent = ({
|
||||
// </div>
|
||||
// </>
|
||||
// )
|
||||
case "switchMode":
|
||||
return (
|
||||
<>
|
||||
<div style={headerStyle}>
|
||||
{toolIcon("symbol-enum")}
|
||||
<span style={{ fontWeight: "bold" }}>
|
||||
{message.type === "ask" ? (
|
||||
<>
|
||||
Roo wants to switch to <code>{tool.mode}</code> mode
|
||||
{tool.reason ? ` because: ${tool.reason}` : ""}
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
Roo switched to <code>{tool.mode}</code> mode
|
||||
{tool.reason ? ` because: ${tool.reason}` : ""}
|
||||
</>
|
||||
)}
|
||||
</span>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
default:
|
||||
return null
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user