Fall back to execa if VSCode terminal integration fails (#3049)

This commit is contained in:
Chris Estreich 2025-04-29 21:10:41 -07:00 committed by GitHub
parent 33a1f358cb
commit 7863303aac
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
34 changed files with 382 additions and 218 deletions

View file

@ -0,0 +1,5 @@
---
"roo-cline": patch
---
Use a fallback terminal if VSCode shell integration fails

View file

@ -2,7 +2,7 @@
"customModes": [
{
"slug": "test",
"name": "Test",
"name": "🧪 Test",
"roleDefinition": "You are Roo, a Jest testing specialist with deep expertise in:\n- Writing and maintaining Jest test suites\n- Test-driven development (TDD) practices\n- Mocking and stubbing with Jest\n- Integration testing strategies\n- TypeScript testing patterns\n- Code coverage analysis\n- Test performance optimization\n\nYour focus is on maintaining high test quality and coverage across the codebase, working primarily with:\n- Test files in __tests__ directories\n- Mock implementations in __mocks__\n- Test utilities and helpers\n- Jest configuration and setup\n\nYou ensure tests are:\n- Well-structured and maintainable\n- Following Jest best practices\n- Properly typed with TypeScript\n- Providing meaningful coverage\n- Using appropriate mocking strategies",
"groups": [
"read",
@ -20,7 +20,7 @@
},
{
"slug": "translate",
"name": "Translate",
"name": "🌐 Translate",
"roleDefinition": "You are Roo, a linguistic specialist focused on translating and managing localization files. Your responsibility is to help maintain and update translation files for the application, ensuring consistency and accuracy across all language resources.",
"groups": [
"read",

View file

@ -2,7 +2,7 @@
const { execSync } = require("child_process")
if (process.platform === "win32") {
execSync("npm-run-all test:* lint:*", { stdio: "inherit" })
execSync("npm-run-all test:*", { stdio: "inherit" })
} else {
execSync("npm-run-all -p test:* lint:*", { stdio: "inherit" })
execSync("npm-run-all -p test:*", { stdio: "inherit" })
}

View file

@ -1,3 +1,15 @@
import nock from "nock"
nock.disableNetConnect()
export function allowNetConnect(host?: string | RegExp) {
if (host) {
nock.enableNetConnect(host)
} else {
nock.enableNetConnect()
}
}
// Mock the logger globally for all tests
jest.mock("../utils/logging", () => ({
logger: {

View file

@ -5,6 +5,36 @@ import { Anthropic } from "@anthropic-ai/sdk"
import { GlamaHandler } from "../glama"
import { ApiHandlerOptions } from "../../../shared/api"
// Mock dependencies
jest.mock("../fetchers/cache", () => ({
getModels: jest.fn().mockImplementation(() => {
return Promise.resolve({
"anthropic/claude-3-7-sonnet": {
maxTokens: 8192,
contextWindow: 200000,
supportsImages: true,
supportsPromptCache: true,
inputPrice: 3,
outputPrice: 15,
cacheWritesPrice: 3.75,
cacheReadsPrice: 0.3,
description: "Claude 3.7 Sonnet",
thinking: false,
supportsComputerUse: true,
},
"openai/gpt-4o": {
maxTokens: 4096,
contextWindow: 128000,
supportsImages: true,
supportsPromptCache: false,
inputPrice: 5,
outputPrice: 15,
description: "GPT-4o",
},
})
}),
}))
// Mock OpenAI client
const mockCreate = jest.fn()
const mockWithResponse = jest.fn()

View file

@ -9,6 +9,38 @@ import { ApiHandlerOptions } from "../../../shared/api"
// Mock dependencies
jest.mock("openai")
jest.mock("delay", () => jest.fn(() => Promise.resolve()))
jest.mock("../fetchers/cache", () => ({
getModels: jest.fn().mockImplementation(() => {
return Promise.resolve({
"anthropic/claude-3.7-sonnet": {
maxTokens: 8192,
contextWindow: 200000,
supportsImages: true,
supportsPromptCache: true,
inputPrice: 3,
outputPrice: 15,
cacheWritesPrice: 3.75,
cacheReadsPrice: 0.3,
description: "Claude 3.7 Sonnet",
thinking: false,
supportsComputerUse: true,
},
"anthropic/claude-3.7-sonnet:thinking": {
maxTokens: 128000,
contextWindow: 200000,
supportsImages: true,
supportsPromptCache: true,
inputPrice: 3,
outputPrice: 15,
cacheWritesPrice: 3.75,
cacheReadsPrice: 0.3,
description: "Claude 3.7 Sonnet with thinking",
thinking: true,
supportsComputerUse: true,
},
})
}),
}))
describe("OpenRouterHandler", () => {
const mockOptions: ApiHandlerOptions = {

View file

@ -1,3 +1,5 @@
// npx jest src/api/providers/__tests__/requesty.test.ts
import { Anthropic } from "@anthropic-ai/sdk"
import OpenAI from "openai"
import { ApiHandlerOptions, ModelInfo } from "../../../shared/api"
@ -9,6 +11,22 @@ import { convertToR1Format } from "../../transform/r1-format"
jest.mock("openai")
jest.mock("../../transform/openai-format")
jest.mock("../../transform/r1-format")
jest.mock("../fetchers/cache", () => ({
getModels: jest.fn().mockResolvedValue({
"test-model": {
maxTokens: 8192,
contextWindow: 200_000,
supportsImages: true,
supportsComputerUse: true,
supportsPromptCache: true,
inputPrice: 3.0,
outputPrice: 15.0,
cacheWritesPrice: 3.75,
cacheReadsPrice: 0.3,
description: "Test model description",
},
}),
}))
describe("RequestyHandler", () => {
let handler: RequestyHandler

View file

@ -6,6 +6,58 @@ import { ApiHandlerOptions } from "../../../shared/api"
import { UnboundHandler } from "../unbound"
// Mock dependencies
jest.mock("../fetchers/cache", () => ({
getModels: jest.fn().mockImplementation(() => {
return Promise.resolve({
"anthropic/claude-3-5-sonnet-20241022": {
maxTokens: 8192,
contextWindow: 200000,
supportsImages: true,
supportsPromptCache: true,
inputPrice: 3,
outputPrice: 15,
cacheWritesPrice: 3.75,
cacheReadsPrice: 0.3,
description: "Claude 3.5 Sonnet",
thinking: false,
supportsComputerUse: true,
},
"anthropic/claude-3-7-sonnet-20250219": {
maxTokens: 8192,
contextWindow: 200000,
supportsImages: true,
supportsPromptCache: true,
inputPrice: 3,
outputPrice: 15,
cacheWritesPrice: 3.75,
cacheReadsPrice: 0.3,
description: "Claude 3.7 Sonnet",
thinking: false,
supportsComputerUse: true,
},
"openai/gpt-4o": {
maxTokens: 4096,
contextWindow: 128000,
supportsImages: true,
supportsPromptCache: false,
inputPrice: 5,
outputPrice: 15,
description: "GPT-4o",
},
"openai/o3-mini": {
maxTokens: 4096,
contextWindow: 128000,
supportsImages: true,
supportsPromptCache: false,
inputPrice: 1,
outputPrice: 3,
description: "O3 Mini",
},
})
}),
}))
// Mock OpenAI client
const mockCreate = jest.fn()
const mockWithResponse = jest.fn()

View file

@ -13,7 +13,7 @@ nockBack.setMode("lockdown")
describe("OpenRouter API", () => {
describe("getOpenRouterModels", () => {
it("fetches models and validates schema", async () => {
it.skip("fetches models and validates schema", async () => {
const { nockDone } = await nockBack("openrouter-models.json")
const models = await getOpenRouterModels()

View file

@ -19,7 +19,7 @@ export class GlamaHandler extends RouterProvider implements SingleCompletionHand
constructor(options: ApiHandlerOptions) {
super({
options,
name: "unbound",
name: "glama",
baseURL: "https://glama.ai/api/gateway/openai/v1",
apiKey: options.glamaApiKey,
modelId: options.glamaModelId,

View file

@ -13,7 +13,7 @@ import {
} from "../../shared/tools"
import { formatResponse } from "../prompts/responses"
import { telemetryService } from "../../services/telemetry/TelemetryService"
import { executeCommand } from "./executeCommandTool"
import { type ExecuteCommandOptions, executeCommand } from "./executeCommandTool"
export async function attemptCompletionTool(
cline: Cline,
@ -82,7 +82,9 @@ export async function attemptCompletionTool(
return
}
const [userRejected, execCommandResult] = await executeCommand(cline, command!)
const options: ExecuteCommandOptions = { command }
const [userRejected, execCommandResult] = await executeCommand(cline, options)
if (userRejected) {
cline.didRejectTool = true

View file

@ -8,10 +8,12 @@ import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag, To
import { formatResponse } from "../prompts/responses"
import { unescapeHtmlEntities } from "../../utils/text-normalization"
import { telemetryService } from "../../services/telemetry/TelemetryService"
import { ExitCodeDetails, RooTerminalProcess } from "../../integrations/terminal/types"
import { ExitCodeDetails, RooTerminalCallbacks, RooTerminalProcess } from "../../integrations/terminal/types"
import { TerminalRegistry } from "../../integrations/terminal/TerminalRegistry"
import { Terminal } from "../../integrations/terminal/Terminal"
class ShellIntegrationError extends Error {}
export async function executeCommandTool(
cline: Cline,
block: ToolUse,
@ -52,13 +54,44 @@ export async function executeCommandTool(
return
}
const [userRejected, result] = await executeCommand(cline, command, customCwd)
const clineProvider = await cline.providerRef.deref()
const clineProviderState = await clineProvider?.getState()
const { terminalOutputLineLimit = 500, terminalShellIntegrationDisabled = false } = clineProviderState ?? {}
if (userRejected) {
cline.didRejectTool = true
const options: ExecuteCommandOptions = {
command,
customCwd,
terminalShellIntegrationDisabled,
terminalOutputLineLimit,
}
pushToolResult(result)
try {
const [rejected, result] = await executeCommand(cline, options)
if (rejected) {
cline.didRejectTool = true
}
pushToolResult(result)
} catch (error: unknown) {
await cline.say("shell_integration_warning")
clineProvider?.setValue("terminalShellIntegrationDisabled", true)
if (error instanceof ShellIntegrationError) {
const [rejected, result] = await executeCommand(cline, {
...options,
terminalShellIntegrationDisabled: true,
})
if (rejected) {
cline.didRejectTool = true
}
pushToolResult(result)
} else {
pushToolResult(`Command failed to execute in terminal due to a shell integration error.`)
}
}
return
}
@ -68,10 +101,21 @@ export async function executeCommandTool(
}
}
export type ExecuteCommandOptions = {
command: string
customCwd?: string
terminalShellIntegrationDisabled?: boolean
terminalOutputLineLimit?: number
}
export async function executeCommand(
cline: Cline,
command: string,
customCwd?: string,
{
command,
customCwd,
terminalShellIntegrationDisabled = false,
terminalOutputLineLimit = 500,
}: ExecuteCommandOptions,
): Promise<[boolean, ToolResponse]> {
let workingDir: string
@ -94,13 +138,11 @@ export async function executeCommand(
let completed = false
let result: string = ""
let exitDetails: ExitCodeDetails | undefined
let shellIntegrationError: string | undefined
const clineProvider = await cline.providerRef.deref()
const clineProviderState = await clineProvider?.getState()
const { terminalOutputLineLimit = 500, terminalShellIntegrationDisabled = false } = clineProviderState ?? {}
const terminalProvider = terminalShellIntegrationDisabled ? "execa" : "vscode"
const callbacks = {
const callbacks: RooTerminalCallbacks = {
onLine: async (output: string, process: RooTerminalProcess) => {
const compressed = Terminal.compressTerminalOutput(output, terminalOutputLineLimit)
cline.say("command_output", compressed)
@ -123,13 +165,14 @@ export async function executeCommand(
result = Terminal.compressTerminalOutput(output ?? "", terminalOutputLineLimit)
completed = true
},
onShellExecutionComplete: (details: ExitCodeDetails) => {
exitDetails = details
},
onNoShellIntegration: async (message: string) => {
onShellExecutionComplete: (details: ExitCodeDetails) => (exitDetails = details),
}
if (terminalProvider === "vscode") {
callbacks.onNoShellIntegration = async (error: string) => {
telemetryService.captureShellIntegrationError(cline.taskId)
await cline.say("shell_integration_warning", message)
},
shellIntegrationError = error
}
}
const terminal = await TerminalRegistry.getOrCreateTerminal(workingDir, !!customCwd, cline.taskId, terminalProvider)
@ -149,6 +192,10 @@ export async function executeCommand(
await process
cline.terminalProcess = undefined
if (shellIntegrationError) {
throw new ShellIntegrationError(shellIntegrationError)
}
// Wait for a short delay to ensure all messages are sent to the webview.
// This delay allows time for non-awaited promises to be created and
// for their associated messages to be sent to the webview, maintaining

View file

@ -1503,8 +1503,10 @@ export class ClineProvider extends EventEmitter<ClineProviderEvents> implements
// Add model ID if available
const currentCline = this.getCurrentCline()
if (currentCline?.api) {
const { id: modelId } = currentCline.api.getModel()
if (modelId) {
properties.modelId = modelId
}

View file

@ -56,7 +56,7 @@ export class Terminal extends BaseTerminal {
process.on("line", (line) => callbacks.onLine(line, process))
process.once("completed", (output) => callbacks.onCompleted(output, process))
process.once("shell_execution_complete", (details) => callbacks.onShellExecutionComplete(details, process))
process.once("no_shell_integration", (msg) => callbacks.onNoShellIntegration(msg, process))
process.once("no_shell_integration", (msg) => callbacks.onNoShellIntegration?.(msg, process))
const promise = new Promise<void>((resolve, reject) => {
// Set up event handlers

View file

@ -35,11 +35,11 @@ export class TerminalRegistry {
// Register handler for terminal close events to clean up temporary
// directories.
const closeDisposable = vscode.window.onDidCloseTerminal((terminal) => {
const terminalInfo = this.getTerminalByVSCETerminal(terminal)
const closeDisposable = vscode.window.onDidCloseTerminal((vsceTerminal) => {
const terminal = this.getTerminalByVSCETerminal(vsceTerminal)
if (terminalInfo) {
ShellIntegrationManager.zshCleanupTmpDir(terminalInfo.id)
if (terminal) {
ShellIntegrationManager.zshCleanupTmpDir(terminal.id)
}
})
@ -50,16 +50,16 @@ export class TerminalRegistry {
async (e: vscode.TerminalShellExecutionStartEvent) => {
// Get a handle to the stream as early as possible:
const stream = e.execution.read()
const terminalInfo = this.getTerminalByVSCETerminal(e.terminal)
const terminal = this.getTerminalByVSCETerminal(e.terminal)
console.info("[onDidStartTerminalShellExecution] Shell execution started:", {
hasExecution: !!e.execution,
command: e.execution?.commandLine?.value,
terminalId: terminalInfo?.id,
terminalId: terminal?.id,
})
if (terminalInfo) {
terminalInfo.setActiveStream(stream)
if (terminal) {
terminal.setActiveStream(stream)
} else {
console.error(
"[onDidStartTerminalShellExecution] Shell execution started, but not from a Roo-registered terminal:",
@ -75,18 +75,18 @@ export class TerminalRegistry {
const endDisposable = vscode.window.onDidEndTerminalShellExecution?.(
async (e: vscode.TerminalShellExecutionEndEvent) => {
const terminalInfo = this.getTerminalByVSCETerminal(e.terminal)
const process = terminalInfo?.process
const terminal = this.getTerminalByVSCETerminal(e.terminal)
const process = terminal?.process
const exitDetails = TerminalProcess.interpretExitCode(e.exitCode)
console.info("[TerminalRegistry] Shell execution ended:", {
hasExecution: !!e.execution,
command: e.execution?.commandLine?.value,
terminalId: terminalInfo?.id,
terminalId: terminal?.id,
...exitDetails,
})
if (!terminalInfo) {
if (!terminal) {
console.error(
"[onDidEndTerminalShellExecution] Shell execution ended, but not from a Roo-registered terminal:",
e,
@ -95,10 +95,10 @@ export class TerminalRegistry {
return
}
if (!terminalInfo.running) {
if (!terminal.running) {
console.error(
"[TerminalRegistry] Shell execution end event received, but process is not running for terminal:",
{ terminalId: terminalInfo?.id, command: process?.command, exitCode: e.exitCode },
{ terminalId: terminal?.id, command: process?.command, exitCode: e.exitCode },
)
return
@ -107,14 +107,14 @@ export class TerminalRegistry {
if (!process) {
console.error(
"[TerminalRegistry] Shell execution end event received on running terminal, but process is undefined:",
{ terminalId: terminalInfo.id, exitCode: e.exitCode },
{ terminalId: terminal.id, exitCode: e.exitCode },
)
return
}
// Signal completion to any waiting processes.
terminalInfo.shellExecutionComplete(exitDetails)
terminal.shellExecutionComplete(exitDetails)
},
)
@ -317,8 +317,8 @@ export class TerminalRegistry {
* @param terminal The VSCode terminal instance
* @returns The Terminal object, or undefined if not found
*/
private static getTerminalByVSCETerminal(terminal: vscode.Terminal): RooTerminal | undefined {
const found = this.terminals.find((t) => t instanceof Terminal && t.terminal === terminal)
private static getTerminalByVSCETerminal(vsceTerminal: vscode.Terminal): RooTerminal | undefined {
const found = this.terminals.find((t) => t instanceof Terminal && t.terminal === vsceTerminal)
if (found?.isClosed()) {
this.removeTerminal(found.id)

View file

@ -24,7 +24,7 @@ export interface RooTerminalCallbacks {
onLine: (line: string, process: RooTerminalProcess) => void
onCompleted: (output: string | undefined, process: RooTerminalProcess) => void
onShellExecutionComplete: (details: ExitCodeDetails, process: RooTerminalProcess) => void
onNoShellIntegration: (message: string, process: RooTerminalProcess) => void
onNoShellIntegration?: (message: string, process: RooTerminalProcess) => void
}
export interface RooTerminalProcess extends EventEmitter<RooTerminalProcessEvents> {

View file

@ -28,6 +28,7 @@ import { FollowUpSuggest } from "./FollowUpSuggest"
import { ProgressIndicator } from "./ProgressIndicator"
import { Markdown } from "./Markdown"
import { CommandExecution } from "./CommandExecution"
import { CommandExecutionError } from "./CommandExecutionError"
interface ChatRowProps {
message: ClineMessage
@ -918,51 +919,7 @@ export const ChatRowContent = ({
</>
)
case "shell_integration_warning":
return (
<>
<div
style={{
display: "flex",
flexDirection: "column",
backgroundColor: "rgba(255, 191, 0, 0.1)",
padding: 8,
borderRadius: 3,
fontSize: 12,
}}>
<div style={{ display: "flex", alignItems: "center", marginBottom: 4 }}>
<i
className="codicon codicon-warning"
style={{
marginRight: 8,
fontSize: 18,
color: "#FFA500",
}}></i>
<span style={{ fontWeight: 500, color: "#FFA500" }}>
{t("chat:shellIntegration.unavailable")}
</span>
</div>
<div>
<strong>{message.text}</strong>
<br />
<div>
&bull; {t("chat:shellIntegration.checkSettings")}
<br />
&bull; {t("chat:shellIntegration.updateVSCode")} (
<code>CMD/CTRL + Shift + P</code> "Update")
<br />
&bull; {t("chat:shellIntegration.supportedShell")} (
<code>CMD/CTRL + Shift + P</code> "Terminal: Select Default Profile")
</div>
<br />
<a
href="http://docs.roocode.com/troubleshooting/shell-integration/"
style={{ color: "inherit", textDecoration: "underline" }}>
{t("chat:shellIntegration.troubleshooting")}
</a>
</div>
</div>
</>
)
return <CommandExecutionError />
case "mcp_server_response":
return (
<>

View file

@ -0,0 +1,39 @@
import { useCallback } from "react"
import { useTranslation, Trans } from "react-i18next"
import { VSCodeLink } from "@vscode/webview-ui-toolkit/react"
export const CommandExecutionError = () => {
const { t } = useTranslation()
const onClick = useCallback((e: React.MouseEvent<HTMLAnchorElement>) => {
e.preventDefault()
window.postMessage({ type: "action", action: "settingsButtonClicked", values: { section: "terminal" } }, "*")
}, [])
return (
<div className="text-sm rounded-xs p-2 border border-vscode-editorWarning-foreground">
<div className="flex flex-col gap-2">
<div className="flex items-center">
<i className="codicon codicon-warning mr-1 text-vscode-editorWarning-foreground" />
<span className="text-vscode-editorWarning-foreground font-medium">
{t("chat:shellIntegration.title")}
</span>
</div>
<div>
<Trans
i18nKey="chat:shellIntegration.description"
components={{
settingsLink: <VSCodeLink href="#" onClick={onClick} className="inline" />,
}}
/>
</div>
<a
href="http://docs.roocode.com/troubleshooting/shell-integration/"
className="underline"
style={{ color: "inherit" }}>
{t("chat:shellIntegration.troubleshooting")}
</a>
</div>
</div>
)
}

View file

@ -185,13 +185,6 @@
"hasQuestion": "Roo té una pregunta:"
},
"taskCompleted": "Tasca completada",
"shellIntegration": {
"unavailable": "Integració de shell no disponible",
"troubleshooting": "Encara tens problemes? Fes clic aquí per a la documentació d'integració de shell.",
"checkSettings": "Comprova les solucions alternatives del terminal a la pàgina de configuració",
"updateVSCode": "Actualitza VSCode",
"supportedShell": "Assegura't d'utilitzar un shell compatible: zsh, bash, fish o PowerShell"
},
"powershell": {
"issues": "Sembla que estàs tenint problemes amb Windows PowerShell, si us plau consulta aquesta documentació per a més informació."
},
@ -240,5 +233,10 @@
}
},
"systemPromptWarning": "ADVERTÈNCIA: S'ha activat una substitució personalitzada d'instruccions del sistema. Això pot trencar greument la funcionalitat i causar un comportament impredictible.",
"selectApiConfig": "Seleccioneu la configuració de l'API"
"selectApiConfig": "Seleccioneu la configuració de l'API",
"shellIntegration": {
"title": "Integració de Shell no disponible",
"description": "La teva ordre s'està executant sense la integració de shell de VSCode. Pots tornar a activar la integració de shell a la secció <strong>Terminal</strong> de la <settingsLink>configuració de Roo Code</settingsLink>.",
"troubleshooting": "Fes clic aquí per a la documentació d'integració de shell."
}
}

View file

@ -185,13 +185,6 @@
"hasQuestion": "Roo hat eine Frage:"
},
"taskCompleted": "Aufgabe abgeschlossen",
"shellIntegration": {
"unavailable": "Shell-Integration nicht verfügbar",
"troubleshooting": "Immer noch Probleme? Klicke hier für die Shell-Integrationsdokumentation.",
"checkSettings": "Überprüfe die Terminal-Workarounds in den Einstellungen",
"updateVSCode": "VSCode aktualisieren",
"supportedShell": "Stelle sicher, dass du eine unterstützte Shell verwendest: zsh, bash, fish oder PowerShell"
},
"powershell": {
"issues": "Es scheint, dass du Probleme mit Windows PowerShell hast, bitte sieh dir dies an"
},
@ -240,5 +233,10 @@
}
},
"systemPromptWarning": "WARNUNG: Benutzerdefinierte Systemaufforderung aktiv. Dies kann die Funktionalität erheblich beeinträchtigen und zu unvorhersehbarem Verhalten führen.",
"selectApiConfig": "API-Konfiguration auswählen"
"selectApiConfig": "API-Konfiguration auswählen",
"shellIntegration": {
"title": "Shell-Integration nicht verfügbar",
"description": "Dein Befehl wird ohne VSCode-Shell-Integration ausgeführt. Du kannst die Shell-Integration im Bereich <strong>Terminal</strong> in den <settingsLink>Roo Code Einstellungen</settingsLink> wieder aktivieren.",
"troubleshooting": "Klicke hier für die Shell-Integrations-Dokumentation."
}
}

View file

@ -186,13 +186,6 @@
"title": "Edit Unsuccessful"
},
"troubleMessage": "Roo is having trouble...",
"shellIntegration": {
"unavailable": "Shell Integration Unavailable",
"troubleshooting": "Still having trouble? Click here for shell integration documentation.",
"checkSettings": "Check terminal workarounds in the settings page",
"updateVSCode": "Update VSCode",
"supportedShell": "Make sure you're using a supported shell: zsh, bash, fish, or PowerShell"
},
"powershell": {
"issues": "It seems like you're having Windows PowerShell issues, please see this"
},
@ -240,5 +233,10 @@
"close": "Close browser"
}
},
"systemPromptWarning": "WARNING: Custom system prompt override active. This can severely break functionality and cause unpredictable behavior."
"systemPromptWarning": "WARNING: Custom system prompt override active. This can severely break functionality and cause unpredictable behavior.",
"shellIntegration": {
"title": "Shell Integration Unavailable",
"description": "Your command is being executed without VSCode shell integration. You can re-enable shell integration in the <strong>Terminal</strong> section of the <settingsLink>Roo Code settings</settingsLink>.",
"troubleshooting": "Click here for shell integration documentation."
}
}

View file

@ -185,13 +185,6 @@
"hasQuestion": "Roo tiene una pregunta:"
},
"taskCompleted": "Tarea completada",
"shellIntegration": {
"unavailable": "Integración de shell no disponible",
"troubleshooting": "¿Sigues teniendo problemas? Haz clic aquí para ver la documentación de integración de shell.",
"checkSettings": "Revisa los ajustes alternativos de terminal en la página de configuración",
"updateVSCode": "Actualiza VSCode",
"supportedShell": "Asegúrate de usar un shell compatible: zsh, bash, fish o PowerShell"
},
"powershell": {
"issues": "Parece que estás teniendo problemas con Windows PowerShell, por favor consulta esta"
},
@ -240,5 +233,10 @@
}
},
"systemPromptWarning": "ADVERTENCIA: Anulación de instrucciones del sistema personalizada activa. Esto puede romper gravemente la funcionalidad y causar un comportamiento impredecible.",
"selectApiConfig": "Seleccionar configuración de API"
"selectApiConfig": "Seleccionar configuración de API",
"shellIntegration": {
"title": "Integración de Shell no disponible",
"description": "Tu comando se está ejecutando sin la integración de shell de VSCode. Puedes reactivar la integración de shell en la sección <strong>Terminal</strong> de la <settingsLink>configuración de Roo Code</settingsLink>.",
"troubleshooting": "Haz clic aquí para ver la documentación de integración de shell."
}
}

View file

@ -185,13 +185,6 @@
"hasQuestion": "Roo a une question :"
},
"taskCompleted": "Tâche terminée",
"shellIntegration": {
"unavailable": "Intégration du shell indisponible",
"troubleshooting": "Toujours des problèmes ? Cliquez ici pour la documentation d'intégration du shell.",
"checkSettings": "Vérifie les solutions de contournement du terminal dans les paramètres",
"updateVSCode": "Mets à jour VSCode",
"supportedShell": "Assure-toi d'utiliser un shell supporté : zsh, bash, fish ou PowerShell"
},
"powershell": {
"issues": "Il semble que vous rencontriez des problèmes avec Windows PowerShell, veuillez consulter ce"
},
@ -240,5 +233,10 @@
}
},
"systemPromptWarning": "AVERTISSEMENT : Remplacement d'instructions système personnalisées actif. Cela peut gravement perturber la fonctionnalité et provoquer un comportement imprévisible.",
"selectApiConfig": "Sélectionner la configuration de lAPI"
"selectApiConfig": "Sélectionner la configuration de l'API",
"shellIntegration": {
"title": "Intégration Shell non disponible",
"description": "Votre commande est exécutée sans l'intégration shell de VSCode. Vous pouvez réactiver l'intégration shell dans la section <strong>Terminal</strong> des <settingsLink>paramètres de Roo Code</settingsLink>.",
"troubleshooting": "Cliquez ici pour la documentation d'intégration shell."
}
}

View file

@ -185,13 +185,6 @@
"hasQuestion": "Roo का एक प्रश्न है:"
},
"taskCompleted": "कार्य पूरा हुआ",
"shellIntegration": {
"unavailable": "शेल एकीकरण अनुपलब्ध",
"troubleshooting": "अभी भी समस्या है? शेल एकीकरण दस्तावेज़ के लिए यहाँ क्लिक करें।",
"checkSettings": "सेटिंग्स पेज में टर्मिनल वर्कअराउंड जांचें",
"updateVSCode": "VSCode अपडेट करें",
"supportedShell": "सुनिश्चित करें कि आप समर्थित शेल का उपयोग कर रहे हैं: zsh, bash, fish या PowerShell"
},
"powershell": {
"issues": "ऐसा लगता है कि आपको Windows PowerShell के साथ समस्याएँ हो रही हैं, कृपया इसे देखें"
},
@ -240,5 +233,10 @@
}
},
"systemPromptWarning": "चेतावनी: कस्टम सिस्टम प्रॉम्प्ट ओवरराइड सक्रिय है। यह कार्यक्षमता को गंभीर रूप से बाधित कर सकता है और अनियमित व्यवहार का कारण बन सकता है.",
"selectApiConfig": "एपीआई कॉन्फ़िगरेशन का चयन करें"
"selectApiConfig": "एपीआई कॉन्फ़िगरेशन का चयन करें",
"shellIntegration": {
"title": "शेल इंटीग्रेशन अनुपलब्ध",
"description": "आपका कमांड VSCode शेल इंटीग्रेशन के बिना निष्पादित हो रहा है। आप <settingsLink>Roo Code सेटिंग्स</settingsLink> के <strong>टर्मिनल</strong> अनुभाग में शेल इंटीग्रेशन को पुनः सक्षम कर सकते हैं।",
"troubleshooting": "शेल इंटीग्रेशन दस्तावेज़ के लिए यहां क्लिक करें।"
}
}

View file

@ -185,13 +185,6 @@
"hasQuestion": "Roo ha una domanda:"
},
"taskCompleted": "Attività completata",
"shellIntegration": {
"unavailable": "Integrazione shell non disponibile",
"troubleshooting": "Ancora problemi? Clicca qui per la documentazione sull'integrazione della shell.",
"checkSettings": "Controlla le soluzioni alternative del terminale nella pagina delle impostazioni",
"updateVSCode": "Aggiorna VSCode",
"supportedShell": "Assicurati di utilizzare una shell supportata: zsh, bash, fish o PowerShell"
},
"powershell": {
"issues": "Sembra che tu stia avendo problemi con Windows PowerShell, consulta questa"
},
@ -240,5 +233,10 @@
}
},
"systemPromptWarning": "ATTENZIONE: Sovrascrittura personalizzata delle istruzioni di sistema attiva. Questo può compromettere gravemente le funzionalità e causare comportamenti imprevedibili.",
"selectApiConfig": "Seleziona la configurazione API"
"selectApiConfig": "Seleziona la configurazione API",
"shellIntegration": {
"title": "Integrazione Shell non disponibile",
"description": "Il tuo comando viene eseguito senza l'integrazione shell di VSCode. Puoi riattivare l'integrazione shell nella sezione <strong>Terminal</strong> delle <settingsLink>impostazioni di Roo Code</settingsLink>.",
"troubleshooting": "Clicca qui per la documentazione sull'integrazione shell."
}
}

View file

@ -185,13 +185,6 @@
"hasQuestion": "Rooは質問があります:"
},
"taskCompleted": "タスク完了",
"shellIntegration": {
"unavailable": "シェル統合が利用できません",
"troubleshooting": "まだ問題がありますか?シェル統合のドキュメントはこちらをクリックしてください。",
"checkSettings": "設定ページでターミナルの回避策を確認してください",
"updateVSCode": "VSCodeを更新してください",
"supportedShell": "サポートされているシェルを使用していることを確認してくださいzsh、bash、fish、またはPowerShell"
},
"powershell": {
"issues": "Windows PowerShellに問題があるようです。こちらを参照してください"
},
@ -240,5 +233,10 @@
}
},
"systemPromptWarning": "警告:カスタムシステムプロンプトの上書きが有効です。これにより機能が深刻に損なわれ、予測不可能な動作が発生する可能性があります。",
"selectApiConfig": "API構成を選択"
"selectApiConfig": "API構成を選択",
"shellIntegration": {
"title": "シェル統合が利用できません",
"description": "コマンドはVSCodeシェル統合なしで実行されています。<settingsLink>Roo Code設定</settingsLink>の<strong>ターミナル</strong>セクションでシェル統合を再有効化できます。",
"troubleshooting": "シェル統合のドキュメントはこちらをクリック"
}
}

View file

@ -185,13 +185,6 @@
"hasQuestion": "Roo에게 질문이 있습니다:"
},
"taskCompleted": "작업 완료",
"shellIntegration": {
"unavailable": "쉘 통합 사용 불가",
"troubleshooting": "여전히 문제가 있나요? 쉘 통합 문서를 보려면 여기를 클릭하세요.",
"checkSettings": "설정 페이지에서 터미널 해결 방법을 확인하세요",
"updateVSCode": "VSCode를 업데이트하세요",
"supportedShell": "지원되는 쉘을 사용하고 있는지 확인하세요: zsh, bash, fish 또는 PowerShell"
},
"powershell": {
"issues": "Windows PowerShell에 문제가 있는 것 같습니다. 다음을 참조하세요"
},
@ -240,5 +233,10 @@
}
},
"systemPromptWarning": "경고: 사용자 정의 시스템 프롬프트 재정의가 활성화되었습니다. 이로 인해 기능이 심각하게 손상되고 예측할 수 없는 동작이 발생할 수 있습니다.",
"selectApiConfig": "API 구성 선택"
"selectApiConfig": "API 구성 선택",
"shellIntegration": {
"title": "Shell 통합 사용 불가",
"description": "명령이 VSCode shell 통합 없이 실행되고 있습니다. <settingsLink>Roo Code 설정</settingsLink>의 <strong>터미널</strong> 섹션에서 shell 통합을 다시 활성화할 수 있습니다.",
"troubleshooting": "shell 통합 문서를 보려면 여기를 클릭하세요."
}
}

View file

@ -185,13 +185,6 @@
"hasQuestion": "Roo ma pytanie:"
},
"taskCompleted": "Zadanie zakończone",
"shellIntegration": {
"unavailable": "Integracja powłoki niedostępna",
"troubleshooting": "Nadal masz problemy? Kliknij tutaj, aby zobaczyć dokumentację integracji powłoki.",
"checkSettings": "Sprawdź obejścia terminala na stronie ustawień",
"updateVSCode": "Zaktualizuj VSCode",
"supportedShell": "Upewnij się, że używasz obsługiwanej powłoki: zsh, bash, fish lub PowerShell"
},
"powershell": {
"issues": "Wygląda na to, że masz problemy z Windows PowerShell, proszę zapoznaj się z tym"
},
@ -240,5 +233,10 @@
}
},
"systemPromptWarning": "OSTRZEŻENIE: Aktywne niestandardowe zastąpienie instrukcji systemowych. Może to poważnie zakłócić funkcjonalność i powodować nieprzewidywalne zachowanie.",
"selectApiConfig": "Wybierz konfigurację API"
"selectApiConfig": "Wybierz konfigurację API",
"shellIntegration": {
"title": "Integracja powłoki niedostępna",
"description": "Twoje polecenie jest wykonywane bez integracji powłoki VSCode. Możesz ponownie włączyć integrację powłoki w sekcji <strong>Terminal</strong> w <settingsLink>ustawieniach Roo Code</settingsLink>.",
"troubleshooting": "Kliknij tutaj, aby zobaczyć dokumentację integracji powłoki."
}
}

View file

@ -185,13 +185,6 @@
"hasQuestion": "Roo tem uma pergunta:"
},
"taskCompleted": "Tarefa concluída",
"shellIntegration": {
"unavailable": "Integração de shell indisponível",
"troubleshooting": "Ainda com problemas? Clique aqui para ver a documentação de integração do shell.",
"checkSettings": "Verifique as soluções alternativas do terminal na página de configurações",
"updateVSCode": "Atualize o VSCode",
"supportedShell": "Certifique-se de estar usando um shell suportado: zsh, bash, fish ou PowerShell"
},
"powershell": {
"issues": "Parece que você está tendo problemas com o Windows PowerShell, por favor veja este"
},
@ -240,5 +233,10 @@
}
},
"systemPromptWarning": "AVISO: Substituição personalizada de instrução do sistema ativa. Isso pode comprometer gravemente a funcionalidade e causar comportamento imprevisível.",
"selectApiConfig": "Selecionar configuração da API"
"selectApiConfig": "Selecionar configuração da API",
"shellIntegration": {
"title": "Integração de Shell Indisponível",
"description": "Seu comando está sendo executado sem a integração de shell do VSCode. Você pode reativar a integração de shell na seção <strong>Terminal</strong> das <settingsLink>configurações do Roo Code</settingsLink>.",
"troubleshooting": "Clique aqui para a documentação de integração de shell."
}
}

View file

@ -186,13 +186,6 @@
"title": "Не удалось выполнить редактирование"
},
"troubleMessage": "У Roo возникли проблемы...",
"shellIntegration": {
"unavailable": "Интеграция с оболочкой недоступна",
"troubleshooting": "Все еще есть проблемы? Кликните здесь для документации по интеграции с оболочкой.",
"checkSettings": "Проверьте обходные решения для терминала на странице настроек",
"updateVSCode": "Обновите VSCode",
"supportedShell": "Убедитесь, что вы используете поддерживаемую оболочку: zsh, bash, fish или PowerShell"
},
"powershell": {
"issues": "Похоже, у вас проблемы с Windows PowerShell, пожалуйста, ознакомьтесь с этим"
},
@ -240,5 +233,10 @@
"close": "Закрыть браузер"
}
},
"systemPromptWarning": "ПРЕДУПРЕЖДЕНИЕ: Активна пользовательская системная подсказка. Это может серьезно нарушить работу и вызвать непредсказуемое поведение."
"systemPromptWarning": "ПРЕДУПРЕЖДЕНИЕ: Активна пользовательская системная подсказка. Это может серьезно нарушить работу и вызвать непредсказуемое поведение.",
"shellIntegration": {
"title": "Интеграция с оболочкой недоступна",
"description": "Ваша команда выполняется без интеграции с оболочкой VSCode. Вы можете повторно включить интеграцию с оболочкой в разделе <strong>Терминал</strong> <settingsLink>настроек Roo Code</settingsLink>.",
"troubleshooting": "Нажмите здесь для просмотра документации по интеграции с оболочкой."
}
}

View file

@ -185,13 +185,6 @@
"hasQuestion": "Roo'nun bir sorusu var:"
},
"taskCompleted": "Görev Tamamlandı",
"shellIntegration": {
"unavailable": "Kabuk Entegrasyonu Kullanılamıyor",
"troubleshooting": "Hala sorun mu yaşıyorsunuz? Kabuk entegrasyonu belgelerine göz atmak için buraya tıklayın.",
"checkSettings": "Ayarlar sayfasındaki terminal geçici çözümlerini kontrol et",
"updateVSCode": "VSCode'u güncelle",
"supportedShell": "Desteklenen bir kabuk kullandığından emin ol: zsh, bash, fish veya PowerShell"
},
"powershell": {
"issues": "Windows PowerShell ile ilgili sorunlar yaşıyor gibi görünüyorsunuz, lütfen şu konuya bakın"
},
@ -240,5 +233,10 @@
}
},
"systemPromptWarning": "UYARI: Özel sistem komut geçersiz kılma aktif. Bu işlevselliği ciddi şekilde bozabilir ve öngörülemeyen davranışlara neden olabilir.",
"selectApiConfig": "API yapılandırmasını seçin"
"selectApiConfig": "API yapılandırmasını seçin",
"shellIntegration": {
"title": "Kabuk Entegrasyonu Kullanılamıyor",
"description": "Komutunuz VSCode kabuk entegrasyonu olmadan çalıştırılıyor. <settingsLink>Roo Code ayarları</settingsLink>'nın <strong>Terminal</strong> bölümünden kabuk entegrasyonunu yeniden etkinleştirebilirsiniz.",
"troubleshooting": "Kabuk entegrasyonu belgeleri için buraya tıklayın."
}
}

View file

@ -185,13 +185,6 @@
"hasQuestion": "Roo có một câu hỏi:"
},
"taskCompleted": "Nhiệm vụ hoàn thành",
"shellIntegration": {
"unavailable": "Tích hợp shell không khả dụng",
"troubleshooting": "Vẫn gặp vấn đề? Nhấp vào đây để xem tài liệu tích hợp shell.",
"checkSettings": "Kiểm tra các giải pháp thay thế cho terminal trong trang cài đặt",
"updateVSCode": "Cập nhật VSCode",
"supportedShell": "Đảm bảo bạn đang sử dụng shell được hỗ trợ: zsh, bash, fish hoặc PowerShell"
},
"powershell": {
"issues": "Có vẻ như bạn đang gặp vấn đề với Windows PowerShell, vui lòng xem"
},
@ -240,5 +233,10 @@
}
},
"systemPromptWarning": "CẢNH BÁO: Đã kích hoạt ghi đè lệnh nhắc hệ thống tùy chỉnh. Điều này có thể phá vỡ nghiêm trọng chức năng và gây ra hành vi không thể dự đoán.",
"selectApiConfig": "Chọn cấu hình API"
"selectApiConfig": "Chọn cấu hình API",
"shellIntegration": {
"title": "Tích hợp Shell không khả dụng",
"description": "Lệnh của bạn đang được thực thi mà không có tích hợp shell VSCode. Bạn có thể kích hoạt lại tích hợp shell trong phần <strong>Terminal</strong> của <settingsLink>cài đặt Roo Code</settingsLink>.",
"troubleshooting": "Nhấp vào đây để xem tài liệu về tích hợp shell."
}
}

View file

@ -185,13 +185,6 @@
"hasQuestion": "Roo有一个问题:"
},
"taskCompleted": "任务完成",
"shellIntegration": {
"unavailable": "Shell集成不可用",
"troubleshooting": "仍有问题吗点击此处查看Shell集成文档。",
"checkSettings": "检查设置页面中的终端解决方案",
"updateVSCode": "更新VSCode",
"supportedShell": "确保使用受支持的shellzsh、bash、fish或PowerShell"
},
"powershell": {
"issues": "看起来您遇到了Windows PowerShell问题请参阅此"
},
@ -240,5 +233,10 @@
}
},
"systemPromptWarning": "警告:自定义系统提示词覆盖已激活。这可能严重破坏功能并导致不可预测的行为。",
"selectApiConfig": "选择 API 配置"
"selectApiConfig": "选择 API 配置",
"shellIntegration": {
"title": "Shell 集成不可用",
"description": "您的命令正在没有 VSCode shell 集成的情况下执行。您可以在 <settingsLink>Roo Code 设置</settingsLink> 的 <strong>终端</strong> 部分重新启用 shell 集成。",
"troubleshooting": "点击此处查看 shell 集成文档。"
}
}

View file

@ -185,13 +185,6 @@
"hasQuestion": "Roo 有一個問題:"
},
"taskCompleted": "工作完成",
"shellIntegration": {
"unavailable": "Shell 整合功能無法使用",
"troubleshooting": "仍有問題嗎?點擊此處查看 Shell 整合文件。",
"checkSettings": "檢查設定頁面中的終端解決方案",
"updateVSCode": "更新 VSCode",
"supportedShell": "確保使用支援的 shellzsh、bash、fish 或 PowerShell"
},
"powershell": {
"issues": "看起來您遇到了 Windows PowerShell 的問題,請參考此處"
},
@ -240,5 +233,10 @@
}
},
"systemPromptWarning": "警告:自訂系統提示詞覆蓋已啟用。這可能嚴重破壞功能並導致不可預測的行為。",
"selectApiConfig": "選取 API 設定"
"selectApiConfig": "選取 API 設定",
"shellIntegration": {
"title": "Shell 整合不可用",
"description": "您的命令正在沒有 VSCode shell 整合的情況下執行。您可以在 <settingsLink>Roo Code 設定</settingsLink> 的 <strong>終端機</strong> 部分重新啟用 shell 整合。",
"troubleshooting": "點擊此處查看 shell 整合文件。"
}
}