Browse Source

chore: remove human-relay provider (#10388)

Co-authored-by: Roo Code <[email protected]>
Hannes Rudolph 2 months ago
parent
commit
c37aa02b21
59 changed files with 5 additions and 719 deletions
  1. 0 1
      .github/ISSUE_TEMPLATE/bug_report.yml
  2. 0 1
      .roo/rules-translate/instructions-zh-cn.md
  3. 0 4
      apps/vscode-e2e/src/suite/extension.test.ts
  4. 2 6
      packages/types/src/provider-settings.ts
  5. 0 1
      packages/types/src/providers/index.ts
  6. 0 5
      packages/types/src/vscode.ts
  7. 0 26
      src/activate/humanRelay.ts
  8. 0 16
      src/activate/registerCommands.ts
  9. 0 4
      src/api/index.ts
  10. 0 134
      src/api/providers/human-relay.ts
  11. 0 1
      src/api/providers/index.ts
  12. 0 19
      src/core/webview/webviewMessageHandler.ts
  13. 0 3
      src/shared/ExtensionMessage.ts
  14. 0 5
      src/shared/ProfileValidator.ts
  15. 0 2
      src/shared/WebviewMessage.ts
  16. 0 14
      src/shared/__tests__/ProfileValidator.spec.ts
  17. 2 5
      src/shared/checkExistApiConfig.ts
  18. 0 28
      webview-ui/src/App.tsx
  19. 0 9
      webview-ui/src/__tests__/App.spec.tsx
  20. 0 115
      webview-ui/src/components/human-relay/HumanRelayDialog.tsx
  21. 0 11
      webview-ui/src/components/settings/ApiOptions.tsx
  22. 0 1
      webview-ui/src/components/settings/constants.ts
  23. 1 2
      webview-ui/src/components/ui/hooks/useSelectedModel.ts
  24. 0 13
      webview-ui/src/i18n/locales/ca/humanRelay.json
  25. 0 4
      webview-ui/src/i18n/locales/ca/settings.json
  26. 0 13
      webview-ui/src/i18n/locales/de/humanRelay.json
  27. 0 4
      webview-ui/src/i18n/locales/de/settings.json
  28. 0 13
      webview-ui/src/i18n/locales/en/humanRelay.json
  29. 0 4
      webview-ui/src/i18n/locales/en/settings.json
  30. 0 13
      webview-ui/src/i18n/locales/es/humanRelay.json
  31. 0 4
      webview-ui/src/i18n/locales/es/settings.json
  32. 0 13
      webview-ui/src/i18n/locales/fr/humanRelay.json
  33. 0 4
      webview-ui/src/i18n/locales/fr/settings.json
  34. 0 13
      webview-ui/src/i18n/locales/hi/humanRelay.json
  35. 0 4
      webview-ui/src/i18n/locales/hi/settings.json
  36. 0 13
      webview-ui/src/i18n/locales/id/humanRelay.json
  37. 0 4
      webview-ui/src/i18n/locales/id/settings.json
  38. 0 13
      webview-ui/src/i18n/locales/it/humanRelay.json
  39. 0 4
      webview-ui/src/i18n/locales/it/settings.json
  40. 0 13
      webview-ui/src/i18n/locales/ja/humanRelay.json
  41. 0 4
      webview-ui/src/i18n/locales/ja/settings.json
  42. 0 13
      webview-ui/src/i18n/locales/ko/humanRelay.json
  43. 0 4
      webview-ui/src/i18n/locales/ko/settings.json
  44. 0 13
      webview-ui/src/i18n/locales/nl/humanRelay.json
  45. 0 4
      webview-ui/src/i18n/locales/nl/settings.json
  46. 0 13
      webview-ui/src/i18n/locales/pl/humanRelay.json
  47. 0 4
      webview-ui/src/i18n/locales/pl/settings.json
  48. 0 13
      webview-ui/src/i18n/locales/pt-BR/humanRelay.json
  49. 0 4
      webview-ui/src/i18n/locales/pt-BR/settings.json
  50. 0 13
      webview-ui/src/i18n/locales/ru/humanRelay.json
  51. 0 4
      webview-ui/src/i18n/locales/ru/settings.json
  52. 0 13
      webview-ui/src/i18n/locales/tr/humanRelay.json
  53. 0 4
      webview-ui/src/i18n/locales/tr/settings.json
  54. 0 13
      webview-ui/src/i18n/locales/vi/humanRelay.json
  55. 0 4
      webview-ui/src/i18n/locales/vi/settings.json
  56. 0 13
      webview-ui/src/i18n/locales/zh-CN/humanRelay.json
  57. 0 4
      webview-ui/src/i18n/locales/zh-CN/settings.json
  58. 0 13
      webview-ui/src/i18n/locales/zh-TW/humanRelay.json
  59. 0 4
      webview-ui/src/i18n/locales/zh-TW/settings.json

+ 0 - 1
.github/ISSUE_TEMPLATE/bug_report.yml

@@ -84,7 +84,6 @@ body:
         - Google Gemini
         - Google Vertex AI
         - Groq
-        - Human Relay Provider
         - LiteLLM
         - LM Studio
         - Mistral AI

+ 0 - 1
.roo/rules-translate/instructions-zh-cn.md

@@ -16,7 +16,6 @@
 | Auto-approve          | 自动批准          | 始终批准     | 权限相关术语  |
 | Checkpoint            | 存档点            | 检查点/快照  | 技术概念统一  |
 | MCP Server            | MCP 服务          | MCP 服务器   | 技术组件      |
-| Human Relay           | 人工辅助模式      | 人工中继     | 功能描述清晰  |
 | Network Timeout       | 请求超时          | 网络超时     | 更准确描述    |
 | Terminal              | 终端              | 命令行       | 技术术语统一  |
 | diff                  | 差异更新          | 差分/补丁    | 代码变更      |

+ 0 - 4
apps/vscode-e2e/src/suite/extension.test.ts

@@ -19,10 +19,6 @@ suite("Roo Code Extension", function () {
 			"openInNewTab",
 			"settingsButtonClicked",
 			"historyButtonClicked",
-			"showHumanRelayDialog",
-			"registerHumanRelayCallback",
-			"unregisterHumanRelayCallback",
-			"handleHumanRelayResponse",
 			"newTask",
 			"setCustomStoragePath",
 			"focusInput",

+ 2 - 6
packages/types/src/provider-settings.ts

@@ -102,7 +102,7 @@ export const isCustomProvider = (key: string): key is CustomProvider => customPr
  * model lists.
  */
 
-export const fauxProviders = ["fake-ai", "human-relay"] as const
+export const fauxProviders = ["fake-ai"] as const
 
 export type FauxProvider = (typeof fauxProviders)[number]
 
@@ -344,8 +344,6 @@ const requestySchema = baseProviderSettingsSchema.extend({
 	requestyModelId: z.string().optional(),
 })
 
-const humanRelaySchema = baseProviderSettingsSchema
-
 const fakeAiSchema = baseProviderSettingsSchema.extend({
 	fakeAi: z.unknown().optional(),
 })
@@ -447,7 +445,6 @@ export const providerSettingsSchemaDiscriminated = z.discriminatedUnion("apiProv
 	minimaxSchema.merge(z.object({ apiProvider: z.literal("minimax") })),
 	unboundSchema.merge(z.object({ apiProvider: z.literal("unbound") })),
 	requestySchema.merge(z.object({ apiProvider: z.literal("requesty") })),
-	humanRelaySchema.merge(z.object({ apiProvider: z.literal("human-relay") })),
 	fakeAiSchema.merge(z.object({ apiProvider: z.literal("fake-ai") })),
 	xaiSchema.merge(z.object({ apiProvider: z.literal("xai") })),
 	groqSchema.merge(z.object({ apiProvider: z.literal("groq") })),
@@ -489,7 +486,6 @@ export const providerSettingsSchema = z.object({
 	...minimaxSchema.shape,
 	...unboundSchema.shape,
 	...requestySchema.shape,
-	...humanRelaySchema.shape,
 	...fakeAiSchema.shape,
 	...xaiSchema.shape,
 	...groqSchema.shape,
@@ -627,7 +623,7 @@ export const getApiProtocol = (provider: ProviderName | undefined, modelId?: str
  */
 
 export const MODELS_BY_PROVIDER: Record<
-	Exclude<ProviderName, "fake-ai" | "human-relay" | "gemini-cli" | "openai">,
+	Exclude<ProviderName, "fake-ai" | "gemini-cli" | "openai">,
 	{ id: ProviderName; label: string; models: string[] }
 > = {
 	anthropic: {

+ 0 - 1
packages/types/src/providers/index.ts

@@ -143,7 +143,6 @@ export function getProviderDefaultModelId(
 			return vercelAiGatewayDefaultModelId
 		case "anthropic":
 		case "gemini-cli":
-		case "human-relay":
 		case "fake-ai":
 		default:
 			return anthropicDefaultModelId

+ 0 - 5
packages/types/src/vscode.ts

@@ -38,11 +38,6 @@ export const commandIds = [
 
 	"openInNewTab",
 
-	"showHumanRelayDialog",
-	"registerHumanRelayCallback",
-	"unregisterHumanRelayCallback",
-	"handleHumanRelayResponse",
-
 	"newTask",
 
 	"setCustomStoragePath",

+ 0 - 26
src/activate/humanRelay.ts

@@ -1,26 +0,0 @@
-// Callback mapping of human relay response.
-const humanRelayCallbacks = new Map<string, (response: string | undefined) => void>()
-
-/**
- * Register a callback function for human relay response.
- * @param requestId
- * @param callback
- */
-export const registerHumanRelayCallback = (requestId: string, callback: (response: string | undefined) => void) =>
-	humanRelayCallbacks.set(requestId, callback)
-
-export const unregisterHumanRelayCallback = (requestId: string) => humanRelayCallbacks.delete(requestId)
-
-export const handleHumanRelayResponse = (response: { requestId: string; text?: string; cancelled?: boolean }) => {
-	const callback = humanRelayCallbacks.get(response.requestId)
-
-	if (callback) {
-		if (response.cancelled) {
-			callback(undefined)
-		} else {
-			callback(response.text)
-		}
-
-		humanRelayCallbacks.delete(response.requestId)
-	}
-}

+ 0 - 16
src/activate/registerCommands.ts

@@ -9,8 +9,6 @@ import { getCommand } from "../utils/commands"
 import { ClineProvider } from "../core/webview/ClineProvider"
 import { ContextProxy } from "../core/config/ContextProxy"
 import { focusPanel } from "../utils/focusPanel"
-
-import { registerHumanRelayCallback, unregisterHumanRelayCallback, handleHumanRelayResponse } from "./humanRelay"
 import { handleNewTask } from "./handleTask"
 import { CodeIndexManager } from "../services/code-index/manager"
 import { importSettingsWithFeedback } from "../core/config/importExport"
@@ -136,20 +134,6 @@ const getCommandsMap = ({ context, outputChannel, provider }: RegisterCommandOpt
 		if (!visibleProvider) return
 		visibleProvider.postMessageToWebview({ type: "action", action: "marketplaceButtonClicked" })
 	},
-	showHumanRelayDialog: (params: { requestId: string; promptText: string }) => {
-		const panel = getPanel()
-
-		if (panel) {
-			panel?.webview.postMessage({
-				type: "showHumanRelayDialog",
-				requestId: params.requestId,
-				promptText: params.promptText,
-			})
-		}
-	},
-	registerHumanRelayCallback: registerHumanRelayCallback,
-	unregisterHumanRelayCallback: unregisterHumanRelayCallback,
-	handleHumanRelayResponse: handleHumanRelayResponse,
 	newTask: handleNewTask,
 	setCustomStoragePath: async () => {
 		const { promptForCustomStoragePath } = await import("../utils/storage")

+ 0 - 4
src/api/index.ts

@@ -22,7 +22,6 @@ import {
 	VsCodeLmHandler,
 	UnboundHandler,
 	RequestyHandler,
-	HumanRelayHandler,
 	FakeAIHandler,
 	XAIHandler,
 	GroqHandler,
@@ -159,8 +158,6 @@ export function buildApiHandler(configuration: ProviderSettings): ApiHandler {
 			return new UnboundHandler(options)
 		case "requesty":
 			return new RequestyHandler(options)
-		case "human-relay":
-			return new HumanRelayHandler()
 		case "fake-ai":
 			return new FakeAIHandler(options)
 		case "xai":
@@ -198,7 +195,6 @@ export function buildApiHandler(configuration: ProviderSettings): ApiHandler {
 		case "baseten":
 			return new BasetenHandler(options)
 		default:
-			apiProvider satisfies "gemini-cli" | undefined
 			return new AnthropicHandler(options)
 	}
 }

+ 0 - 134
src/api/providers/human-relay.ts

@@ -1,134 +0,0 @@
-import { Anthropic } from "@anthropic-ai/sdk"
-import * as vscode from "vscode"
-
-import type { ModelInfo } from "@roo-code/types"
-
-import { getCommand } from "../../utils/commands"
-import { ApiStream } from "../transform/stream"
-
-import type { ApiHandler, SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index"
-
-/**
- * Human Relay API processor
- * This processor does not directly call the API, but interacts with the model through human operations copy and paste.
- */
-export class HumanRelayHandler implements ApiHandler, SingleCompletionHandler {
-	countTokens(_content: Array<Anthropic.Messages.ContentBlockParam>): Promise<number> {
-		return Promise.resolve(0)
-	}
-
-	/**
-	 * Create a message processing flow, display a dialog box to request human assistance
-	 * @param systemPrompt System prompt words
-	 * @param messages Message list
-	 * @param metadata Optional metadata
-	 */
-	async *createMessage(
-		systemPrompt: string,
-		messages: Anthropic.Messages.MessageParam[],
-		metadata?: ApiHandlerCreateMessageMetadata,
-	): ApiStream {
-		// Get the most recent user message
-		const latestMessage = messages[messages.length - 1]
-
-		if (!latestMessage) {
-			throw new Error("No message to relay")
-		}
-
-		// If it is the first message, splice the system prompt word with the user message
-		let promptText = ""
-		if (messages.length === 1) {
-			promptText = `${systemPrompt}\n\n${getMessageContent(latestMessage)}`
-		} else {
-			promptText = getMessageContent(latestMessage)
-		}
-
-		// Copy to clipboard
-		await vscode.env.clipboard.writeText(promptText)
-
-		// A dialog box pops up to request user action
-		const response = await showHumanRelayDialog(promptText)
-
-		if (!response) {
-			// The user canceled the operation
-			throw new Error("Human relay operation cancelled")
-		}
-
-		// Return to the user input reply
-		yield { type: "text", text: response }
-	}
-
-	/**
-	 * Get model information
-	 */
-	getModel(): { id: string; info: ModelInfo } {
-		// Human relay does not depend on a specific model, here is a default configuration
-		return {
-			id: "human-relay",
-			info: {
-				maxTokens: 16384,
-				contextWindow: 100000,
-				supportsImages: true,
-				supportsPromptCache: false,
-				inputPrice: 0,
-				outputPrice: 0,
-				description: "Calling web-side AI model through human relay",
-			},
-		}
-	}
-
-	/**
-	 * Implementation of a single prompt
-	 * @param prompt Prompt content
-	 */
-	async completePrompt(prompt: string): Promise<string> {
-		// Copy to clipboard
-		await vscode.env.clipboard.writeText(prompt)
-
-		// A dialog box pops up to request user action
-		const response = await showHumanRelayDialog(prompt)
-
-		if (!response) {
-			throw new Error("Human relay operation cancelled")
-		}
-
-		return response
-	}
-}
-
-/**
- * Extract text content from message object
- * @param message
- */
-function getMessageContent(message: Anthropic.Messages.MessageParam): string {
-	if (typeof message.content === "string") {
-		return message.content
-	} else if (Array.isArray(message.content)) {
-		return message.content
-			.filter((item) => item.type === "text")
-			.map((item) => (item.type === "text" ? item.text : ""))
-			.join("\n")
-	}
-	return ""
-}
-/**
- * Displays the human relay dialog and waits for user response.
- * @param promptText The prompt text that needs to be copied.
- * @returns The user's input response or undefined (if canceled).
- */
-async function showHumanRelayDialog(promptText: string): Promise<string | undefined> {
-	return new Promise<string | undefined>((resolve) => {
-		// Create a unique request ID.
-		const requestId = Date.now().toString()
-
-		// Register a global callback function.
-		vscode.commands.executeCommand(
-			getCommand("registerHumanRelayCallback"),
-			requestId,
-			(response: string | undefined) => resolve(response),
-		)
-
-		// Open the dialog box directly using the current panel.
-		vscode.commands.executeCommand(getCommand("showHumanRelayDialog"), { requestId, promptText })
-	})
-}

+ 0 - 1
src/api/providers/index.ts

@@ -11,7 +11,6 @@ export { FakeAIHandler } from "./fake-ai"
 export { GeminiHandler } from "./gemini"
 export { GroqHandler } from "./groq"
 export { HuggingFaceHandler } from "./huggingface"
-export { HumanRelayHandler } from "./human-relay"
 export { IOIntelligenceHandler } from "./io-intelligence"
 export { LiteLLMHandler } from "./lite-llm"
 export { LmStudioHandler } from "./lm-studio"

+ 0 - 19
src/core/webview/webviewMessageHandler.ts

@@ -2218,25 +2218,6 @@ export const webviewMessageHandler = async (
 				})
 			}
 			break
-		case "humanRelayResponse":
-			if (message.requestId && message.text) {
-				vscode.commands.executeCommand(getCommand("handleHumanRelayResponse"), {
-					requestId: message.requestId,
-					text: message.text,
-					cancelled: false,
-				})
-			}
-			break
-
-		case "humanRelayCancel":
-			if (message.requestId) {
-				vscode.commands.executeCommand(getCommand("handleHumanRelayResponse"), {
-					requestId: message.requestId,
-					cancelled: true,
-				})
-			}
-			break
-
 		case "telemetrySetting": {
 			const telemetrySetting = message.text as TelemetrySetting
 			const previousSetting = getGlobalState("telemetrySetting") || "unset"

+ 0 - 3
src/shared/ExtensionMessage.ts

@@ -94,9 +94,6 @@ export interface ExtensionMessage {
 		| "deleteCustomModeCheck"
 		| "currentCheckpointUpdated"
 		| "checkpointInitWarning"
-		| "showHumanRelayDialog"
-		| "humanRelayResponse"
-		| "humanRelayCancel"
 		| "browserToolEnabled"
 		| "browserConnectionResult"
 		| "remoteBrowserEnabled"

+ 0 - 5
src/shared/ProfileValidator.ts

@@ -14,10 +14,6 @@ export class ProfileValidator {
 			return false
 		}
 
-		if (profile.apiProvider === "human-relay") {
-			return true
-		}
-
 		const modelId = this.getModelIdFromProfile(profile)
 
 		if (!modelId) {
@@ -90,7 +86,6 @@ export class ProfileValidator {
 				return profile.ioIntelligenceModelId
 			case "deepinfra":
 				return profile.deepInfraModelId
-			case "human-relay":
 			case "fake-ai":
 			default:
 				return undefined

+ 0 - 2
src/shared/WebviewMessage.ts

@@ -113,8 +113,6 @@ export interface WebviewMessage {
 		| "checkpointDiff"
 		| "checkpointRestore"
 		| "deleteMcpServer"
-		| "humanRelayResponse"
-		| "humanRelayCancel"
 		| "codebaseIndexEnabled"
 		| "telemetrySetting"
 		| "testBrowserConnection"

+ 0 - 14
src/shared/__tests__/ProfileValidator.spec.ts

@@ -47,20 +47,6 @@ describe("ProfileValidator", () => {
 			expect(ProfileValidator.isProfileAllowed(profile, allowList)).toBe(false)
 		})
 
-		it("should allow human-relay provider regardless of model", () => {
-			const allowList: OrganizationAllowList = {
-				allowAll: false,
-				providers: {
-					"human-relay": { allowAll: false },
-				},
-			}
-			const profile: ProviderSettings = {
-				apiProvider: "human-relay",
-			}
-
-			expect(ProfileValidator.isProfileAllowed(profile, allowList)).toBe(true)
-		})
-
 		it("should allow providers with allowAll=true regardless of model", () => {
 			const allowList: OrganizationAllowList = {
 				allowAll: false,

+ 2 - 5
src/shared/checkExistApiConfig.ts

@@ -5,11 +5,8 @@ export function checkExistKey(config: ProviderSettings | undefined) {
 		return false
 	}
 
-	// Special case for human-relay, fake-ai, claude-code, qwen-code, and roo providers which don't need any configuration.
-	if (
-		config.apiProvider &&
-		["human-relay", "fake-ai", "claude-code", "qwen-code", "roo"].includes(config.apiProvider)
-	) {
+	// Special case for fake-ai, claude-code, qwen-code, and roo providers which don't need any configuration.
+	if (config.apiProvider && ["fake-ai", "claude-code", "qwen-code", "roo"].includes(config.apiProvider)) {
 		return true
 	}
 

+ 0 - 28
webview-ui/src/App.tsx

@@ -16,7 +16,6 @@ import HistoryView from "./components/history/HistoryView"
 import SettingsView, { SettingsViewRef } from "./components/settings/SettingsView"
 import WelcomeView from "./components/welcome/WelcomeViewProvider"
 import { MarketplaceView } from "./components/marketplace/MarketplaceView"
-import { HumanRelayDialog } from "./components/human-relay/HumanRelayDialog"
 import { CheckpointRestoreDialog } from "./components/chat/CheckpointRestoreDialog"
 import { DeleteMessageDialog, EditMessageDialog } from "./components/chat/MessageModificationConfirmationDialog"
 import ErrorBoundary from "./components/ErrorBoundary"
@@ -27,12 +26,6 @@ import { STANDARD_TOOLTIP_DELAY } from "./components/ui/standard-tooltip"
 
 type Tab = "settings" | "history" | "chat" | "marketplace" | "cloud"
 
-interface HumanRelayDialogState {
-	isOpen: boolean
-	requestId: string
-	promptText: string
-}
-
 interface DeleteMessageDialogState {
 	isOpen: boolean
 	messageTs: number
@@ -51,8 +44,6 @@ interface EditMessageDialogState {
 const MemoizedDeleteMessageDialog = React.memo(DeleteMessageDialog)
 const MemoizedEditMessageDialog = React.memo(EditMessageDialog)
 const MemoizedCheckpointRestoreDialog = React.memo(CheckpointRestoreDialog)
-const MemoizedHumanRelayDialog = React.memo(HumanRelayDialog)
-
 const tabsByMessageAction: Partial<Record<NonNullable<ExtensionMessage["action"]>, Tab>> = {
 	chatButtonClicked: "chat",
 	settingsButtonClicked: "settings",
@@ -83,12 +74,6 @@ const App = () => {
 	const [showAnnouncement, setShowAnnouncement] = useState(false)
 	const [tab, setTab] = useState<Tab>("chat")
 
-	const [humanRelayDialogState, setHumanRelayDialogState] = useState<HumanRelayDialogState>({
-		isOpen: false,
-		requestId: "",
-		promptText: "",
-	})
-
 	const [deleteMessageDialogState, setDeleteMessageDialogState] = useState<DeleteMessageDialogState>({
 		isOpen: false,
 		messageTs: 0,
@@ -158,11 +143,6 @@ const App = () => {
 				}
 			}
 
-			if (message.type === "showHumanRelayDialog" && message.requestId && message.promptText) {
-				const { requestId, promptText } = message
-				setHumanRelayDialogState({ isOpen: true, requestId, promptText })
-			}
-
 			if (message.type === "showDeleteMessageDialog" && message.messageTs) {
 				setDeleteMessageDialogState({
 					isOpen: true,
@@ -271,14 +251,6 @@ const App = () => {
 				showAnnouncement={showAnnouncement}
 				hideAnnouncement={() => setShowAnnouncement(false)}
 			/>
-			<MemoizedHumanRelayDialog
-				isOpen={humanRelayDialogState.isOpen}
-				requestId={humanRelayDialogState.requestId}
-				promptText={humanRelayDialogState.promptText}
-				onClose={() => setHumanRelayDialogState((prev) => ({ ...prev, isOpen: false }))}
-				onSubmit={(requestId, text) => vscode.postMessage({ type: "humanRelayResponse", requestId, text })}
-				onCancel={(requestId) => vscode.postMessage({ type: "humanRelayCancel", requestId })}
-			/>
 			{deleteMessageDialogState.hasCheckpoint ? (
 				<MemoizedCheckpointRestoreDialog
 					open={deleteMessageDialogState.isOpen}

+ 0 - 9
webview-ui/src/__tests__/App.spec.tsx

@@ -90,15 +90,6 @@ vi.mock("@src/components/cloud/CloudView", () => ({
 
 const mockUseExtensionState = vi.fn()
 
-// Mock the HumanRelayDialog component
-vi.mock("@src/components/human-relay/HumanRelayDialog", () => ({
-	HumanRelayDialog: ({ _children, isOpen, onClose }: any) => (
-		<div data-testid="human-relay-dialog" data-open={isOpen} onClick={onClose}>
-			Human Relay Dialog
-		</div>
-	),
-}))
-
 // Mock i18next and react-i18next
 vi.mock("i18next", () => {
 	const tFunction = (key: string) => key

+ 0 - 115
webview-ui/src/components/human-relay/HumanRelayDialog.tsx

@@ -1,115 +0,0 @@
-import * as React from "react"
-import { Button } from "../ui/button"
-import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "../ui/dialog"
-import { Textarea } from "../ui/textarea"
-import { useClipboard } from "../ui/hooks"
-import { Check, Copy, X } from "lucide-react"
-import { useAppTranslation } from "@/i18n/TranslationContext"
-
-interface HumanRelayDialogProps {
-	isOpen: boolean
-	onClose: () => void
-	requestId: string
-	promptText: string
-	onSubmit: (requestId: string, text: string) => void
-	onCancel: (requestId: string) => void
-}
-
-/**
- * Human Relay Dialog Component
- * Displays the prompt text that needs to be copied and provides an input box for the user to paste the AI's response.
- */
-export const HumanRelayDialog: React.FC<HumanRelayDialogProps> = ({
-	isOpen,
-	onClose,
-	requestId,
-	promptText,
-	onSubmit,
-	onCancel,
-}) => {
-	const { t } = useAppTranslation()
-	const [response, setResponse] = React.useState("")
-	const { copy } = useClipboard()
-	const [isCopyClicked, setIsCopyClicked] = React.useState(false)
-
-	// Clear input when dialog opens
-	React.useEffect(() => {
-		if (isOpen) {
-			setResponse("")
-			setIsCopyClicked(false)
-		}
-	}, [isOpen])
-
-	// Copy to clipboard and show success message
-	const handleCopy = () => {
-		copy(promptText)
-		setIsCopyClicked(true)
-		setTimeout(() => {
-			setIsCopyClicked(false)
-		}, 2000)
-	}
-
-	// Submit response
-	const handleSubmit = (e: React.FormEvent) => {
-		e.preventDefault()
-		if (response.trim()) {
-			onSubmit(requestId, response)
-			onClose()
-		}
-	}
-
-	// Cancel operation
-	const handleCancel = () => {
-		onCancel(requestId)
-		onClose()
-	}
-
-	return (
-		<Dialog open={isOpen} onOpenChange={(open) => !open && handleCancel()}>
-			<DialogContent className="sm:max-w-[600px] overflow-y-auto max-h-[80vh]">
-				<DialogHeader>
-					<DialogTitle>{t("humanRelay:dialogTitle")}</DialogTitle>
-					<DialogDescription>{t("humanRelay:dialogDescription")}</DialogDescription>
-				</DialogHeader>
-
-				<div className="grid gap-6 py-6">
-					<div className="relative">
-						<Textarea
-							className="min-h-[200px] font-mono text-sm p-4 pr-12 whitespace-pre-wrap"
-							value={promptText}
-							readOnly
-						/>
-						<Button variant="ghost" size="icon" className="absolute top-2 right-2" onClick={handleCopy}>
-							{isCopyClicked ? <Check className="h-4 w-4" /> : <Copy className="h-4 w-4" />}
-						</Button>
-					</div>
-
-					{isCopyClicked && (
-						<div className="text-sm text-emerald-500 font-medium">{t("humanRelay:copiedToClipboard")}</div>
-					)}
-
-					<div>
-						<div className="mb-2 font-medium">{t("humanRelay:aiResponse.label")}</div>
-						<Textarea
-							placeholder={t("humanRelay:aiResponse.placeholder")}
-							value={response}
-							onChange={(e) => setResponse(e.target.value)}
-							className="min-h-[150px]"
-						/>
-					</div>
-				</div>
-
-				<DialogFooter>
-					<Button variant="outline" onClick={handleCancel} className="gap-1">
-						<X className="h-4 w-4" />
-						{t("humanRelay:actions.cancel")}
-					</Button>
-					<Button onClick={handleSubmit} disabled={!response.trim()} className="gap-1">
-						<Check className="h-4 w-4" />
-						{t("humanRelay:actions.submit")}
-					</Button>
-				</DialogFooter>
-			</DialogContent>
-		</Dialog>
-	)
-}

+ 0 - 11
webview-ui/src/components/settings/ApiOptions.tsx

@@ -741,17 +741,6 @@ const ApiOptions = ({
 				/>
 			)}
 
-			{selectedProvider === "human-relay" && (
-				<>
-					<div className="text-sm text-vscode-descriptionForeground">
-						{t("settings:providers.humanRelay.description")}
-					</div>
-					<div className="text-sm text-vscode-descriptionForeground">
-						{t("settings:providers.humanRelay.instructions")}
-					</div>
-				</>
-			)}
-
 			{selectedProvider === "fireworks" && (
 				<Fireworks apiConfiguration={apiConfiguration} setApiConfigurationField={setApiConfigurationField} />
 			)}

+ 0 - 1
webview-ui/src/components/settings/constants.ts

@@ -67,7 +67,6 @@ export const PROVIDERS = [
 	{ value: "ollama", label: "Ollama" },
 	{ value: "unbound", label: "Unbound" },
 	{ value: "requesty", label: "Requesty" },
-	{ value: "human-relay", label: "Human Relay" },
 	{ value: "xai", label: "xAI (Grok)" },
 	{ value: "groq", label: "Groq" },
 	{ value: "huggingface", label: "Hugging Face" },

+ 1 - 2
webview-ui/src/components/ui/hooks/useSelectedModel.ts

@@ -391,10 +391,9 @@ function getSelectedModel({
 			return { id, info }
 		}
 		// case "anthropic":
-		// case "human-relay":
 		// case "fake-ai":
 		default: {
-			provider satisfies "anthropic" | "gemini-cli" | "qwen-code" | "human-relay" | "fake-ai"
+			provider satisfies "anthropic" | "gemini-cli" | "qwen-code" | "fake-ai"
 			const id = apiConfiguration.apiModelId ?? defaultModelId
 			const baseInfo = anthropicModels[id as keyof typeof anthropicModels]
 

+ 0 - 13
webview-ui/src/i18n/locales/ca/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "Relé Humà - Si us plau, ajudeu a copiar/enganxar informació",
-	"dialogDescription": "Si us plau, copieu el següent prompt a la IA web, després enganxeu la resposta de la IA al quadre d'entrada de sota.",
-	"copiedToClipboard": "Copiat al porta-retalls",
-	"aiResponse": {
-		"label": "Si us plau, introduïu la resposta de la IA:",
-		"placeholder": "Enganxeu aquí la resposta de la IA..."
-	},
-	"actions": {
-		"cancel": "Cancel·lar",
-		"submit": "Enviar"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/ca/settings.json

@@ -433,10 +433,6 @@
 		"getUnboundApiKey": "Obtenir clau API d'Unbound",
 		"unboundRefreshModelsSuccess": "Llista de models actualitzada! Ara podeu seleccionar entre els últims models.",
 		"unboundInvalidApiKey": "Clau API no vàlida. Si us plau, comproveu la vostra clau API i torneu-ho a provar.",
-		"humanRelay": {
-			"description": "No es requereix clau API, però l'usuari necessita ajuda per copiar i enganxar informació al xat d'IA web.",
-			"instructions": "Durant l'ús, apareixerà un diàleg i el missatge actual es copiarà automàticament al porta-retalls. Necessiteu enganxar-lo a les versions web d'IA (com ChatGPT o Claude), després copiar la resposta de l'IA de nou al diàleg i fer clic al botó de confirmació."
-		},
 		"roo": {
 			"authenticatedMessage": "Autenticat de forma segura a través del teu compte de Roo Code Cloud.",
 			"connectButton": "Connecta amb Roo Code Cloud"

+ 0 - 13
webview-ui/src/i18n/locales/de/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "Menschliche Weiterleitung - Bitte hilf beim Kopieren/Einfügen von Informationen",
-	"dialogDescription": "Bitte kopiere den folgenden Prompt in die Web-KI und füge dann die Antwort der KI in das Eingabefeld unten ein.",
-	"copiedToClipboard": "In die Zwischenablage kopiert",
-	"aiResponse": {
-		"label": "Bitte gib die KI-Antwort ein:",
-		"placeholder": "KI-Antwort hier einfügen..."
-	},
-	"actions": {
-		"cancel": "Abbrechen",
-		"submit": "Absenden"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/de/settings.json

@@ -433,10 +433,6 @@
 		"getUnboundApiKey": "Unbound API-Schlüssel erhalten",
 		"unboundRefreshModelsSuccess": "Modellliste aktualisiert! Sie können jetzt aus den neuesten Modellen auswählen.",
 		"unboundInvalidApiKey": "Ungültiger API-Schlüssel. Bitte überprüfen Sie Ihren API-Schlüssel und versuchen Sie es erneut.",
-		"humanRelay": {
-			"description": "Es ist kein API-Schlüssel erforderlich, aber der Benutzer muss beim Kopieren und Einfügen der Informationen in den Web-Chat-KI helfen.",
-			"instructions": "Während der Verwendung wird ein Dialogfeld angezeigt und die aktuelle Nachricht wird automatisch in die Zwischenablage kopiert. Du musst diese in Web-Versionen von KI (wie ChatGPT oder Claude) einfügen, dann die Antwort der KI zurück in das Dialogfeld kopieren und auf die Bestätigungsschaltfläche klicken."
-		},
 		"roo": {
 			"authenticatedMessage": "Sicher authentifiziert über dein Roo Code Cloud-Konto.",
 			"connectButton": "Mit Roo Code Cloud verbinden"

+ 0 - 13
webview-ui/src/i18n/locales/en/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "Human Relay - Please Help Copy/Paste Information",
-	"dialogDescription": "Please copy the following prompt to the web AI, then paste the AI's response in the input box below.",
-	"copiedToClipboard": "Copied to clipboard",
-	"aiResponse": {
-		"label": "Please enter AI's response:",
-		"placeholder": "Paste AI's response here..."
-	},
-	"actions": {
-		"cancel": "Cancel",
-		"submit": "Submit"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/en/settings.json

@@ -442,10 +442,6 @@
 		"getUnboundApiKey": "Get Unbound API Key",
 		"unboundRefreshModelsSuccess": "Models list updated! You can now select from the latest models.",
 		"unboundInvalidApiKey": "Invalid API key. Please check your API key and try again.",
-		"humanRelay": {
-			"description": "No API key is required, but the user needs to help copy and paste the information to the web chat AI.",
-			"instructions": "During use, a dialog box will pop up and the current message will be copied to the clipboard automatically. You need to paste these to web versions of AI (such as ChatGPT or Claude), then copy the AI's reply back to the dialog box and click the confirm button."
-		},
 		"roo": {
 			"authenticatedMessage": "Securely authenticated through your Roo Code Cloud account.",
 			"connectButton": "Connect to Roo Code Cloud"

+ 0 - 13
webview-ui/src/i18n/locales/es/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "Relevo Humano - Por favor ayude a copiar/pegar información",
-	"dialogDescription": "Por favor copie el siguiente mensaje en la IA web, luego pegue la respuesta de la IA en el cuadro de entrada a continuación.",
-	"copiedToClipboard": "Copiado al portapapeles",
-	"aiResponse": {
-		"label": "Por favor ingrese la respuesta de la IA:",
-		"placeholder": "Pegue la respuesta de la IA aquí..."
-	},
-	"actions": {
-		"cancel": "Cancelar",
-		"submit": "Enviar"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/es/settings.json

@@ -433,10 +433,6 @@
 		"getUnboundApiKey": "Obtener clave API de Unbound",
 		"unboundRefreshModelsSuccess": "¡Lista de modelos actualizada! Ahora puede seleccionar entre los últimos modelos.",
 		"unboundInvalidApiKey": "Clave API inválida. Por favor, verifique su clave API e inténtelo de nuevo.",
-		"humanRelay": {
-			"description": "No se requiere clave API, pero el usuario necesita ayudar a copiar y pegar la información en el chat web de IA.",
-			"instructions": "Durante el uso, aparecerá un cuadro de diálogo y el mensaje actual se copiará automáticamente al portapapeles. Debe pegarlo en las versiones web de IA (como ChatGPT o Claude), luego copiar la respuesta de la IA de vuelta al cuadro de diálogo y hacer clic en el botón de confirmar."
-		},
 		"roo": {
 			"authenticatedMessage": "Autenticado de forma segura a través de tu cuenta de Roo Code Cloud.",
 			"connectButton": "Conectar a Roo Code Cloud"

+ 0 - 13
webview-ui/src/i18n/locales/fr/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "Relais Humain - Veuillez aider à copier/coller les informations",
-	"dialogDescription": "Veuillez copier le texte suivant dans l'IA web, puis collez la réponse de l'IA dans la zone de saisie ci-dessous.",
-	"copiedToClipboard": "Copié dans le presse-papiers",
-	"aiResponse": {
-		"label": "Veuillez saisir la réponse de l'IA :",
-		"placeholder": "Collez la réponse de l'IA ici..."
-	},
-	"actions": {
-		"cancel": "Annuler",
-		"submit": "Envoyer"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/fr/settings.json

@@ -433,10 +433,6 @@
 		"getUnboundApiKey": "Obtenir la clé API Unbound",
 		"unboundRefreshModelsSuccess": "Liste des modèles mise à jour ! Vous pouvez maintenant sélectionner parmi les derniers modèles.",
 		"unboundInvalidApiKey": "Clé API invalide. Veuillez vérifier votre clé API et réessayer.",
-		"humanRelay": {
-			"description": "Aucune clé API n'est requise, mais l'utilisateur doit aider à copier et coller les informations dans le chat web de l'IA.",
-			"instructions": "Pendant l'utilisation, une boîte de dialogue apparaîtra et le message actuel sera automatiquement copié dans le presse-papiers. Vous devez le coller dans les versions web de l'IA (comme ChatGPT ou Claude), puis copier la réponse de l'IA dans la boîte de dialogue et cliquer sur le bouton de confirmation."
-		},
 		"roo": {
 			"authenticatedMessage": "Authentifié de manière sécurisée via ton compte Roo Code Cloud.",
 			"connectButton": "Se connecter à Roo Code Cloud"

+ 0 - 13
webview-ui/src/i18n/locales/hi/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "मानव रिले - कृपया जानकारी कॉपी-पेस्ट करने में सहायता करें",
-	"dialogDescription": "कृपया निम्नलिखित प्रॉम्प्ट को वेब AI में कॉपी करें, फिर AI की प्रतिक्रिया को नीचे दिए गए इनपुट बॉक्स में पेस्ट करें।",
-	"copiedToClipboard": "क्लिपबोर्ड पर कॉपी किया गया",
-	"aiResponse": {
-		"label": "कृपया AI की प्रतिक्रिया दर्ज करें:",
-		"placeholder": "यहाँ AI की प्रतिक्रिया पेस्ट करें..."
-	},
-	"actions": {
-		"cancel": "रद्द करें",
-		"submit": "जमा करें"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/hi/settings.json

@@ -433,10 +433,6 @@
 		"getUnboundApiKey": "Unbound API कुंजी प्राप्त करें",
 		"unboundRefreshModelsSuccess": "मॉडल सूची अपडेट हो गई है! अब आप नवीनतम मॉडलों में से चुन सकते हैं।",
 		"unboundInvalidApiKey": "अमान्य API कुंजी। कृपया अपनी API कुंजी की जांच करें और पुनः प्रयास करें।",
-		"humanRelay": {
-			"description": "कोई API कुंजी आवश्यक नहीं है, लेकिन उपयोगकर्ता को वेब चैट AI में जानकारी कॉपी और पेस्ट करने में मदद करनी होगी।",
-			"instructions": "उपयोग के दौरान, एक डायलॉग बॉक्स पॉप अप होगा और वर्तमान संदेश स्वचालित रूप से क्लिपबोर्ड पर कॉपी हो जाएगा। आपको इन्हें AI के वेब संस्करणों (जैसे ChatGPT या Claude) में पेस्ट करना होगा, फिर AI की प्रतिक्रिया को डायलॉग बॉक्स में वापस कॉपी करें और पुष्टि बटन पर क्लिक करें।"
-		},
 		"roo": {
 			"authenticatedMessage": "आपके Roo Code Cloud खाते के माध्यम से सुरक्षित रूप से प्रमाणित।",
 			"connectButton": "Roo Code Cloud से कनेक्ट करें"

+ 0 - 13
webview-ui/src/i18n/locales/id/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "Human Relay - Mohon Bantu Salin/Tempel Informasi",
-	"dialogDescription": "Silakan salin prompt berikut ke web AI, lalu tempel respons AI di kotak input di bawah.",
-	"copiedToClipboard": "Disalin ke clipboard",
-	"aiResponse": {
-		"label": "Silakan masukkan respons AI:",
-		"placeholder": "Tempel respons AI di sini..."
-	},
-	"actions": {
-		"cancel": "Batal",
-		"submit": "Kirim"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/id/settings.json

@@ -437,10 +437,6 @@
 		"getUnboundApiKey": "Dapatkan Unbound API Key",
 		"unboundRefreshModelsSuccess": "Daftar model diperbarui! Kamu sekarang dapat memilih dari model terbaru.",
 		"unboundInvalidApiKey": "API key tidak valid. Silakan periksa API key kamu dan coba lagi.",
-		"humanRelay": {
-			"description": "Tidak diperlukan API key, tetapi pengguna perlu membantu menyalin dan menempel informasi ke web chat AI.",
-			"instructions": "Selama penggunaan, kotak dialog akan muncul dan pesan saat ini akan disalin ke clipboard secara otomatis. Kamu perlu menempel ini ke versi web AI (seperti ChatGPT atau Claude), lalu salin balasan AI kembali ke kotak dialog dan klik tombol konfirmasi."
-		},
 		"roo": {
 			"authenticatedMessage": "Terautentikasi dengan aman melalui akun Roo Code Cloud Anda.",
 			"connectButton": "Hubungkan ke Roo Code Cloud"

+ 0 - 13
webview-ui/src/i18n/locales/it/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "Relay Umano - Aiuta a copiare/incollare le informazioni",
-	"dialogDescription": "Copia il seguente prompt nell'AI web, quindi incolla la risposta dell'AI nella casella di input sottostante.",
-	"copiedToClipboard": "Copiato negli appunti",
-	"aiResponse": {
-		"label": "Inserisci la risposta dell'AI:",
-		"placeholder": "Incolla qui la risposta dell'AI..."
-	},
-	"actions": {
-		"cancel": "Annulla",
-		"submit": "Invia"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/it/settings.json

@@ -433,10 +433,6 @@
 		"getUnboundApiKey": "Ottieni chiave API Unbound",
 		"unboundRefreshModelsSuccess": "Lista dei modelli aggiornata! Ora puoi selezionare tra gli ultimi modelli.",
 		"unboundInvalidApiKey": "Chiave API non valida. Controlla la tua chiave API e riprova.",
-		"humanRelay": {
-			"description": "Non è richiesta alcuna chiave API, ma l'utente dovrà aiutare a copiare e incollare le informazioni nella chat web AI.",
-			"instructions": "Durante l'uso, apparirà una finestra di dialogo e il messaggio corrente verrà automaticamente copiato negli appunti. Dovrai incollarlo nelle versioni web dell'AI (come ChatGPT o Claude), quindi copiare la risposta dell'AI nella finestra di dialogo e fare clic sul pulsante di conferma."
-		},
 		"roo": {
 			"authenticatedMessage": "Autenticato in modo sicuro tramite il tuo account Roo Code Cloud.",
 			"connectButton": "Connetti a Roo Code Cloud"

+ 0 - 13
webview-ui/src/i18n/locales/ja/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "ヒューマンリレー - 情報のコピー&ペーストにご協力ください",
-	"dialogDescription": "以下のプロンプトをウェブAIにコピーし、AIの応答を下の入力ボックスにペーストしてください。",
-	"copiedToClipboard": "クリップボードにコピーしました",
-	"aiResponse": {
-		"label": "AIの応答を入力してください:",
-		"placeholder": "ここにAIの応答をペースト..."
-	},
-	"actions": {
-		"cancel": "キャンセル",
-		"submit": "送信"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/ja/settings.json

@@ -433,10 +433,6 @@
 		"getUnboundApiKey": "Unbound APIキーを取得",
 		"unboundRefreshModelsSuccess": "モデルリストが更新されました!最新のモデルから選択できます。",
 		"unboundInvalidApiKey": "無効なAPIキーです。APIキーを確認して、もう一度お試しください。",
-		"humanRelay": {
-			"description": "APIキーは不要ですが、ユーザーはウェブチャットAIに情報をコピー&ペーストする必要があります。",
-			"instructions": "使用中にダイアログボックスが表示され、現在のメッセージが自動的にクリップボードにコピーされます。これらをウェブ版のAI(ChatGPTやClaudeなど)に貼り付け、AIの返答をダイアログボックスにコピーして確認ボタンをクリックする必要があります。"
-		},
 		"roo": {
 			"authenticatedMessage": "Roo Code Cloudアカウントを通じて安全に認証されています。",
 			"connectButton": "Roo Code Cloudに接続"

+ 0 - 13
webview-ui/src/i18n/locales/ko/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "휴먼 릴레이 - 정보 복사/붙여넣기를 도와주세요",
-	"dialogDescription": "다음 프롬프트를 웹 AI에 복사하고, AI의 응답을 아래 입력창에 붙여넣어 주세요.",
-	"copiedToClipboard": "클립보드에 복사됨",
-	"aiResponse": {
-		"label": "AI의 응답을 입력해주세요:",
-		"placeholder": "여기에 AI의 응답을 붙여넣으세요..."
-	},
-	"actions": {
-		"cancel": "취소",
-		"submit": "제출"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/ko/settings.json

@@ -433,10 +433,6 @@
 		"getUnboundApiKey": "Unbound API 키 받기",
 		"unboundRefreshModelsSuccess": "모델 목록이 업데이트되었습니다! 이제 최신 모델에서 선택할 수 있습니다.",
 		"unboundInvalidApiKey": "잘못된 API 키입니다. API 키를 확인하고 다시 시도해 주세요.",
-		"humanRelay": {
-			"description": "API 키가 필요하지 않지만, 사용자가 웹 채팅 AI에 정보를 복사하여 붙여넣어야 합니다.",
-			"instructions": "사용 중에 대화 상자가 나타나고 현재 메시지가 자동으로 클립보드에 복사됩니다. 이를 웹 버전 AI(예: ChatGPT 또는 Claude)에 붙여넣은 다음, AI의 응답을 대화 상자에 복사하고 확인 버튼을 클릭해야 합니다."
-		},
 		"roo": {
 			"authenticatedMessage": "Roo Code Cloud 계정을 통해 안전하게 인증되었습니다.",
 			"connectButton": "Roo Code Cloud에 연결"

+ 0 - 13
webview-ui/src/i18n/locales/nl/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "Human Relay - Help alstublieft met kopiëren/plakken",
-	"dialogDescription": "Kopieer de volgende prompt naar de web-AI en plak het antwoord van de AI in het onderstaande invoerveld.",
-	"copiedToClipboard": "Gekopieerd naar klembord",
-	"aiResponse": {
-		"label": "Voer het antwoord van de AI in:",
-		"placeholder": "Plak hier het antwoord van de AI..."
-	},
-	"actions": {
-		"cancel": "Annuleren",
-		"submit": "Verzenden"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/nl/settings.json

@@ -433,10 +433,6 @@
 		"getUnboundApiKey": "Unbound API-sleutel ophalen",
 		"unboundRefreshModelsSuccess": "Modellenlijst bijgewerkt! U kunt nu kiezen uit de nieuwste modellen.",
 		"unboundInvalidApiKey": "Ongeldige API-sleutel. Controleer uw API-sleutel en probeer het opnieuw.",
-		"humanRelay": {
-			"description": "Geen API-sleutel vereist, maar de gebruiker moet helpen met kopiëren en plakken naar de webchat-AI.",
-			"instructions": "Tijdens gebruik verschijnt een dialoogvenster en wordt het huidige bericht automatisch naar het klembord gekopieerd. Je moet deze plakken in webversies van AI (zoals ChatGPT of Claude), vervolgens het antwoord van de AI terugkopiëren naar het dialoogvenster en op bevestigen klikken."
-		},
 		"roo": {
 			"authenticatedMessage": "Veilig geauthenticeerd via je Roo Code Cloud-account.",
 			"connectButton": "Verbinden met Roo Code Cloud"

+ 0 - 13
webview-ui/src/i18n/locales/pl/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "Przekaźnik Ludzki - Pomóż skopiować/wkleić informacje",
-	"dialogDescription": "Skopiuj poniższy prompt do AI w przeglądarce, a następnie wklej odpowiedź AI do pola wprowadzania poniżej.",
-	"copiedToClipboard": "Skopiowano do schowka",
-	"aiResponse": {
-		"label": "Wprowadź odpowiedź AI:",
-		"placeholder": "Wklej tutaj odpowiedź AI..."
-	},
-	"actions": {
-		"cancel": "Anuluj",
-		"submit": "Wyślij"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/pl/settings.json

@@ -433,10 +433,6 @@
 		"getUnboundApiKey": "Uzyskaj klucz API Unbound",
 		"unboundRefreshModelsSuccess": "Lista modeli zaktualizowana! Możesz teraz wybierać spośród najnowszych modeli.",
 		"unboundInvalidApiKey": "Nieprawidłowy klucz API. Sprawdź swój klucz API i spróbuj ponownie.",
-		"humanRelay": {
-			"description": "Nie jest wymagany klucz API, ale użytkownik będzie musiał pomóc w kopiowaniu i wklejaniu informacji do czatu internetowego AI.",
-			"instructions": "Podczas użytkowania pojawi się okno dialogowe, a bieżąca wiadomość zostanie automatycznie skopiowana do schowka. Będziesz musiał wkleić ją do internetowych wersji AI (takich jak ChatGPT lub Claude), a następnie skopiować odpowiedź AI z powrotem do okna dialogowego i kliknąć przycisk potwierdzenia."
-		},
 		"roo": {
 			"authenticatedMessage": "Bezpiecznie uwierzytelniony przez twoje konto Roo Code Cloud.",
 			"connectButton": "Połącz z Roo Code Cloud"

+ 0 - 13
webview-ui/src/i18n/locales/pt-BR/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "Retransmissão Humana - Ajude a copiar/colar informações",
-	"dialogDescription": "Por favor, copie o seguinte prompt para a IA web e depois cole a resposta da IA na caixa de entrada abaixo.",
-	"copiedToClipboard": "Copiado para a área de transferência",
-	"aiResponse": {
-		"label": "Digite a resposta da IA:",
-		"placeholder": "Cole a resposta da IA aqui..."
-	},
-	"actions": {
-		"cancel": "Cancelar",
-		"submit": "Enviar"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/pt-BR/settings.json

@@ -433,10 +433,6 @@
 		"getUnboundApiKey": "Obter chave de API Unbound",
 		"unboundRefreshModelsSuccess": "Lista de modelos atualizada! Agora você pode selecionar entre os modelos mais recentes.",
 		"unboundInvalidApiKey": "Chave API inválida. Por favor, verifique sua chave API e tente novamente.",
-		"humanRelay": {
-			"description": "Não é necessária chave de API, mas o usuário precisa ajudar a copiar e colar as informações para a IA do chat web.",
-			"instructions": "Durante o uso, uma caixa de diálogo será exibida e a mensagem atual será copiada para a área de transferência automaticamente. Você precisa colar isso nas versões web de IA (como ChatGPT ou Claude), depois copiar a resposta da IA de volta para a caixa de diálogo e clicar no botão confirmar."
-		},
 		"roo": {
 			"authenticatedMessage": "Autenticado com segurança através da sua conta Roo Code Cloud.",
 			"connectButton": "Conectar ao Roo Code Cloud"

+ 0 - 13
webview-ui/src/i18n/locales/ru/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "Человеческая эстафета — пожалуйста, помогите скопировать/вставить информацию",
-	"dialogDescription": "Пожалуйста, скопируйте следующий запрос в веб-ИИ, затем вставьте ответ ИИ в поле ввода ниже.",
-	"copiedToClipboard": "Скопировано в буфер обмена",
-	"aiResponse": {
-		"label": "Пожалуйста, введите ответ ИИ:",
-		"placeholder": "Вставьте ответ ИИ сюда..."
-	},
-	"actions": {
-		"cancel": "Отмена",
-		"submit": "Отправить"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/ru/settings.json

@@ -433,10 +433,6 @@
 		"getUnboundApiKey": "Получить Unbound API-ключ",
 		"unboundRefreshModelsSuccess": "Список моделей обновлен! Теперь вы можете выбрать из последних моделей.",
 		"unboundInvalidApiKey": "Недействительный API-ключ. Пожалуйста, проверьте ваш API-ключ и попробуйте снова.",
-		"humanRelay": {
-			"description": "API-ключ не требуется, но пользователю нужно вручную копировать и вставлять информацию в веб-чат ИИ.",
-			"instructions": "Во время использования появится диалоговое окно, и текущее сообщение будет скопировано в буфер обмена автоматически. Вам нужно вставить его в веб-версию ИИ (например, ChatGPT или Claude), затем скопировать ответ ИИ обратно в диалоговое окно и нажать кнопку подтверждения."
-		},
 		"roo": {
 			"authenticatedMessage": "Безопасно аутентифицирован через твой аккаунт Roo Code Cloud.",
 			"connectButton": "Подключиться к Roo Code Cloud"

+ 0 - 13
webview-ui/src/i18n/locales/tr/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "İnsan Aktarımı - Lütfen bilgileri kopyalama/yapıştırmada yardımcı olun",
-	"dialogDescription": "Lütfen aşağıdaki metni web AI'ya kopyalayın, ardından AI'nın yanıtını aşağıdaki giriş kutusuna yapıştırın.",
-	"copiedToClipboard": "Panoya kopyalandı",
-	"aiResponse": {
-		"label": "Lütfen AI yanıtını girin:",
-		"placeholder": "AI yanıtını buraya yapıştırın..."
-	},
-	"actions": {
-		"cancel": "İptal",
-		"submit": "Gönder"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/tr/settings.json

@@ -433,10 +433,6 @@
 		"getUnboundApiKey": "Unbound API Anahtarı Al",
 		"unboundRefreshModelsSuccess": "Model listesi güncellendi! Artık en son modeller arasından seçim yapabilirsiniz.",
 		"unboundInvalidApiKey": "Geçersiz API anahtarı. Lütfen API anahtarınızı kontrol edin ve tekrar deneyin.",
-		"humanRelay": {
-			"description": "API anahtarı gerekmez, ancak kullanıcının bilgileri web sohbet yapay zekasına kopyalayıp yapıştırması gerekir.",
-			"instructions": "Kullanım sırasında bir iletişim kutusu açılacak ve mevcut mesaj otomatik olarak panoya kopyalanacaktır. Bunları web yapay zekalarına (ChatGPT veya Claude gibi) yapıştırmanız, ardından yapay zekanın yanıtını iletişim kutusuna kopyalayıp onay düğmesine tıklamanız gerekir."
-		},
 		"roo": {
 			"authenticatedMessage": "Roo Code Cloud hesabın üzerinden güvenli bir şekilde kimlik doğrulandı.",
 			"connectButton": "Roo Code Cloud'a Bağlan"

+ 0 - 13
webview-ui/src/i18n/locales/vi/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "Chuyển tiếp Thủ công - Vui lòng giúp Sao chép/Dán thông tin",
-	"dialogDescription": "Vui lòng sao chép đoạn nhắc sau vào AI web, sau đó dán phản hồi của AI vào hộp nhập liệu bên dưới.",
-	"copiedToClipboard": "Đã sao chép vào clipboard",
-	"aiResponse": {
-		"label": "Vui lòng nhập phản hồi của AI:",
-		"placeholder": "Dán phản hồi của AI vào đây..."
-	},
-	"actions": {
-		"cancel": "Hủy",
-		"submit": "Gửi"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/vi/settings.json

@@ -433,10 +433,6 @@
 		"getUnboundApiKey": "Lấy khóa API Unbound",
 		"unboundRefreshModelsSuccess": "Đã cập nhật danh sách mô hình! Bây giờ bạn có thể chọn từ các mô hình mới nhất.",
 		"unboundInvalidApiKey": "Khóa API không hợp lệ. Vui lòng kiểm tra khóa API của bạn và thử lại.",
-		"humanRelay": {
-			"description": "Không cần khóa API, nhưng người dùng cần giúp sao chép và dán thông tin vào AI trò chuyện web.",
-			"instructions": "Trong quá trình sử dụng, một hộp thoại sẽ xuất hiện và tin nhắn hiện tại sẽ được tự động sao chép vào clipboard. Bạn cần dán chúng vào các phiên bản web của AI (như ChatGPT hoặc Claude), sau đó sao chép phản hồi của AI trở lại hộp thoại và nhấp vào nút xác nhận."
-		},
 		"roo": {
 			"authenticatedMessage": "Đã xác thực an toàn thông qua tài khoản Roo Code Cloud của bạn.",
 			"connectButton": "Kết nối với Roo Code Cloud"

+ 0 - 13
webview-ui/src/i18n/locales/zh-CN/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "人工辅助模式",
-	"dialogDescription": "操作指南:\n1. 复制下方提示词到外部AI工具\n2. 将得到的结果粘贴至输入框",
-	"copiedToClipboard": "已复制到剪贴板",
-	"aiResponse": {
-		"label": "AI响应内容:",
-		"placeholder": "请在此处粘贴结果..."
-	},
-	"actions": {
-		"cancel": "取消",
-		"submit": "提交"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/zh-CN/settings.json

@@ -433,10 +433,6 @@
 		"getUnboundApiKey": "获取 Unbound API 密钥",
 		"unboundRefreshModelsSuccess": "模型列表已更新!您现在可以从最新模型中选择。",
 		"unboundInvalidApiKey": "无效的API密钥。请检查您的API密钥并重试。",
-		"humanRelay": {
-			"description": "不需要 API 密钥,但用户需要帮助将信息复制并粘贴到网页聊天 AI。",
-			"instructions": "使用期间,将弹出对话框并自动将当前消息复制到剪贴板。您需要将这些内容粘贴到 AI 的网页版本(如 ChatGPT 或 Claude),然后将 AI 的回复复制回对话框并点击确认按钮。"
-		},
 		"roo": {
 			"authenticatedMessage": "已通过 Roo Code Cloud 账户安全认证。",
 			"connectButton": "连接到 Roo Code Cloud"

+ 0 - 13
webview-ui/src/i18n/locales/zh-TW/humanRelay.json

@@ -1,13 +0,0 @@
-{
-	"dialogTitle": "人工轉發 - 請協助複製貼上訊息",
-	"dialogDescription": "請將以下提示詞複製到網頁 AI,然後將 AI 的回覆貼上到下方的輸入框中。",
-	"copiedToClipboard": "已複製到剪貼簿",
-	"aiResponse": {
-		"label": "請輸入 AI 的回覆:",
-		"placeholder": "在此貼上 AI 的回覆..."
-	},
-	"actions": {
-		"cancel": "取消",
-		"submit": "提交"
-	}
-}

+ 0 - 4
webview-ui/src/i18n/locales/zh-TW/settings.json

@@ -433,10 +433,6 @@
 		"getUnboundApiKey": "取得 Unbound API 金鑰",
 		"unboundRefreshModelsSuccess": "模型列表已更新!您現在可以從最新模型中選擇。",
 		"unboundInvalidApiKey": "無效的 API 金鑰。請檢查您的 API 金鑰並重試。",
-		"humanRelay": {
-			"description": "不需要 API 金鑰,但使用者需要協助將資訊複製並貼上到網頁聊天 AI。",
-			"instructions": "使用期間會彈出對話框,並自動將目前訊息複製到剪貼簿。您需要將這些內容貼上到網頁版 AI(如 ChatGPT 或 Claude),然後將 AI 的回覆複製回對話框並點選確認按鈕。"
-		},
 		"roo": {
 			"authenticatedMessage": "已透過 Roo Code Cloud 帳戶安全認證。",
 			"connectButton": "連接到 Roo Code Cloud"