chore: Remove legacy MCP-UI proxy support (#10086)

This commit is contained in:
Lifei Zhou
2026-06-30 08:58:40 +10:00
committed by GitHub
parent fe7f16b727
commit f81a0e2471
32 changed files with 62 additions and 1280 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-26
View File
@@ -3343,32 +3343,6 @@ export type SyncFeaturedModelsResponses = {
200: unknown;
};
export type McpUiProxyData = {
body?: never;
path?: never;
query: {
/**
* Secret key for authentication
*/
secret: string;
};
url: '/mcp-ui-proxy';
};
export type McpUiProxyErrors = {
/**
* Unauthorized - invalid or missing secret
*/
401: unknown;
};
export type McpUiProxyResponses = {
/**
* MCP UI proxy HTML page
*/
200: unknown;
};
export type DecodeRecipeData = {
body: DecodeRecipeRequest;
path?: never;
+1 -1
View File
@@ -261,7 +261,7 @@ export default function BaseChat({
}
}, [messages.length]);
// Listen for global scroll-to-bottom requests (e.g., from MCP UI prompt actions)
// Listen for global scroll-to-bottom requests (e.g., from MCP App message actions)
useEffect(() => {
const handleGlobalScrollRequest = () => {
// Add a small delay to ensure content has been rendered
@@ -1,401 +0,0 @@
import { AppEvents } from '../constants/events';
import {
UIResourceRenderer,
UIActionResultIntent,
UIActionResultLink,
UIActionResultNotification,
UIActionResultPrompt,
UIActionResultToolCall,
UIActionResult,
} from '@mcp-ui/client';
import { useState, useEffect } from 'react';
import { toast } from 'react-toastify';
import { EmbeddedResource } from '../api';
import { useTheme } from '../contexts/ThemeContext';
import { errorMessage } from '../utils/conversionUtils';
import { isProtocolSafe, getProtocol } from '../utils/urlSecurity';
import { defineMessages, useIntl } from '../i18n';
const i18n = defineMessages({
toastTitle: {
id: 'mcpUIResourceRenderer.toastTitle',
defaultMessage: 'MCP-UI {messageType} message',
},
toastMessageReceived: {
id: 'mcpUIResourceRenderer.toastMessageReceived',
defaultMessage: 'Message received for {message}.',
},
toastUnsupported: {
id: 'mcpUIResourceRenderer.toastUnsupported',
defaultMessage:
"Message received for {message}. {messageType} messages aren't supported yet, refer to console for more details.",
},
openExternalLinkTitle: {
id: 'mcpUIResourceRenderer.openExternalLinkTitle',
defaultMessage: 'Open External Link',
},
openProtocolLink: {
id: 'mcpUIResourceRenderer.openProtocolLink',
defaultMessage: 'Open {protocol} link?',
},
openLinkDetail: {
id: 'mcpUIResourceRenderer.openLinkDetail',
defaultMessage: 'This will open: {url}',
},
cancelButton: {
id: 'mcpUIResourceRenderer.cancelButton',
defaultMessage: 'Cancel',
},
openButton: {
id: 'mcpUIResourceRenderer.openButton',
defaultMessage: 'Open',
},
});
interface MCPUIResourceRendererProps {
content: EmbeddedResource & { type: 'resource' };
appendPromptToChat?: (value: string) => void;
}
// More specific result types using discriminated unions
type UIActionHandlerSuccess<T = unknown> = {
status: 'success';
data?: T;
message?: string;
};
type UIActionHandlerError = {
status: 'error';
error: {
code: UIActionErrorCode;
message: string;
details?: unknown;
};
};
type UIActionHandlerPending = {
status: 'pending';
message: string;
};
type UIActionHandlerResult<T = unknown> =
| UIActionHandlerSuccess<T>
| UIActionHandlerError
| UIActionHandlerPending;
// Strongly typed error codes
enum UIActionErrorCode {
UNSUPPORTED_ACTION = 'UNSUPPORTED_ACTION',
UNKNOWN_ACTION = 'UNKNOWN_ACTION',
TOOL_NOT_FOUND = 'TOOL_NOT_FOUND',
TOOL_EXECUTION_FAILED = 'TOOL_EXECUTION_FAILED',
NAVIGATION_FAILED = 'NAVIGATION_FAILED',
PROMPT_FAILED = 'PROMPT_FAILED',
INTENT_FAILED = 'INTENT_FAILED',
INVALID_PARAMS = 'INVALID_PARAMS',
NETWORK_ERROR = 'NETWORK_ERROR',
TIMEOUT = 'TIMEOUT',
}
// toast component
const ToastComponent = ({
messageType,
message,
isImplemented = true,
}: {
messageType: string;
message?: string;
isImplemented?: boolean;
}) => {
const intl = useIntl();
const title = intl.formatMessage(i18n.toastTitle, { messageType });
return (
<div className="flex flex-col gap-0 py-2 pr-4">
<p className="font-bold">{title}</p>
{isImplemented ? (
<p>
{intl.formatMessage(i18n.toastMessageReceived, {
message: <span className="font-bold">{message}</span>,
})}
</p>
) : (
<p>
{intl.formatMessage(i18n.toastUnsupported, {
message: <span className="font-bold">{message}</span>,
messageType: messageType.charAt(0).toUpperCase() + messageType.slice(1),
})}
</p>
)}
</div>
);
};
export default function MCPUIResourceRenderer({
content,
appendPromptToChat,
}: MCPUIResourceRendererProps) {
const intl = useIntl();
const { resolvedTheme } = useTheme();
const [proxyUrl, setProxyUrl] = useState<string | undefined>(undefined);
useEffect(() => {
const fetchProxyUrl = async () => {
try {
const gooseApiHost = await window.electron.getGoosedHostPort();
const secretKey = await window.electron.getSecretKey();
if (gooseApiHost && secretKey) {
setProxyUrl(`${gooseApiHost}/mcp-ui-proxy?secret=${encodeURIComponent(secretKey)}`);
} else {
console.error('Failed to get goosed host/port or secret key');
}
} catch (error) {
console.error('Error fetching MCP-UI Proxy URL:', error);
}
};
fetchProxyUrl().catch(console.error);
}, []);
const handleUIAction = async (actionEvent: UIActionResult): Promise<UIActionHandlerResult> => {
// result to pass back to the MCP-UI
let result: UIActionHandlerResult;
const handleToolAction = async (
actionEvent: UIActionResultToolCall
): Promise<UIActionHandlerResult> => {
const { toolName, params } = actionEvent.payload;
toast.info(<ToastComponent messageType="tool" message={toolName} isImplemented={false} />, {
theme: resolvedTheme,
});
return {
status: 'error' as const,
error: {
code: UIActionErrorCode.UNSUPPORTED_ACTION,
message: 'Tool calls are not yet implemented',
details: { toolName, params },
},
};
};
const handlePromptAction = async (
actionEvent: UIActionResultPrompt
): Promise<UIActionHandlerResult> => {
const { prompt } = actionEvent.payload;
if (appendPromptToChat) {
try {
appendPromptToChat(prompt);
window.dispatchEvent(new CustomEvent(AppEvents.SCROLL_CHAT_TO_BOTTOM));
return {
status: 'success' as const,
message: 'Prompt sent to chat successfully',
};
} catch (error) {
return {
status: 'error' as const,
error: {
code: UIActionErrorCode.PROMPT_FAILED,
message: 'Failed to send prompt to chat',
details: errorMessage(error),
},
};
}
}
return {
status: 'error' as const,
error: {
code: UIActionErrorCode.UNSUPPORTED_ACTION,
message: 'Prompt handling is not implemented - append prop is required',
details: { prompt },
},
};
};
const handleLinkAction = async (
actionEvent: UIActionResultLink
): Promise<UIActionHandlerResult> => {
const { url } = actionEvent.payload;
try {
// Safe protocols open directly, unknown protocols require user confirmation
// Dangerous protocols are blocked by main.ts in the open-external handler
if (isProtocolSafe(url)) {
await window.electron.openExternal(url);
return {
status: 'success' as const,
message: `Opened ${url} in default application`,
};
}
// Unknown protocols require user confirmation
const protocol = getProtocol(url);
if (!protocol) {
return {
status: 'error' as const,
error: {
code: UIActionErrorCode.INVALID_PARAMS,
message: `Invalid URL format: ${url}`,
details: { url },
},
};
}
const result = await window.electron.showMessageBox({
type: 'question',
buttons: [
intl.formatMessage(i18n.cancelButton),
intl.formatMessage(i18n.openButton),
],
defaultId: 0,
title: intl.formatMessage(i18n.openExternalLinkTitle),
message: intl.formatMessage(i18n.openProtocolLink, { protocol }),
detail: intl.formatMessage(i18n.openLinkDetail, { url }),
});
if (result.response !== 1) {
return {
status: 'error' as const,
error: {
code: UIActionErrorCode.NAVIGATION_FAILED,
message: 'User cancelled',
details: { url },
},
};
}
await window.electron.openExternal(url);
return {
status: 'success' as const,
message: `Opened ${url} in default application`,
};
} catch (error) {
return {
status: 'error' as const,
error: {
code: UIActionErrorCode.NAVIGATION_FAILED,
message: `Failed to open URL: ${url}`,
details: errorMessage(error),
},
};
}
};
const handleNotifyAction = async (
actionEvent: UIActionResultNotification
): Promise<UIActionHandlerResult> => {
const { message } = actionEvent.payload;
toast.info(<ToastComponent messageType="notify" message={message} isImplemented={true} />, {
theme: resolvedTheme,
});
return {
status: 'success' as const,
data: {
displayedAt: new Date().toISOString(),
message: 'Notification displayed',
details: actionEvent.payload,
},
};
};
const handleIntentAction = async (
actionEvent: UIActionResultIntent
): Promise<UIActionHandlerResult> => {
toast.info(
<ToastComponent
messageType="intent"
message={actionEvent.payload.intent}
isImplemented={false}
/>,
{
theme: resolvedTheme,
}
);
return {
status: 'error' as const,
error: {
code: UIActionErrorCode.UNSUPPORTED_ACTION,
message: 'Intent handling is not yet implemented',
details: actionEvent.payload,
},
};
};
try {
switch (actionEvent.type) {
case 'tool':
result = await handleToolAction(actionEvent);
break;
case 'prompt':
result = await handlePromptAction(actionEvent);
break;
case 'link':
result = await handleLinkAction(actionEvent);
break;
case 'notify':
result = await handleNotifyAction(actionEvent);
break;
case 'intent':
result = await handleIntentAction(actionEvent);
break;
default: {
const _exhaustiveCheck: never = actionEvent;
console.error('Unhandled MCP-UI action type:', _exhaustiveCheck);
result = {
status: 'error',
error: {
code: UIActionErrorCode.UNKNOWN_ACTION,
message: `Unknown action type`,
details: actionEvent,
},
};
}
}
} catch (error) {
console.error('Unexpected error handling MCP-UI action:', error);
result = {
status: 'error',
error: {
code: UIActionErrorCode.UNKNOWN_ACTION,
message: 'An unexpected error occurred',
details: error instanceof Error ? error.stack : error,
},
};
}
return result;
};
return (
<div className="mt-3 p-4 border border-border-primary rounded-lg bg-background-secondary">
<div className="overflow-hidden rounded-sm">
<UIResourceRenderer
resource={content.resource}
onUIAction={handleUIAction}
supportedContentTypes={['rawHtml', 'externalUrl']} // Goose does not support remoteDom content
htmlProps={{
autoResizeIframe: {
height: true,
width: false, // set to false to allow for responsive design
},
iframeRenderData: {
// iframeRenderData allows us to pass data down to MCP-UIs
// MCP-UIs might find stuff like host and theme for conditional rendering
// usage of this is experimental, leaving in place for demos
host: 'goose',
theme: resolvedTheme,
},
proxy: proxyUrl, // refer to https://mcpui.dev/guide/client/using-a-proxy
}}
/>
</div>
</div>
);
}
@@ -13,22 +13,16 @@ import {
} from '../types/message';
import { cn, snakeToTitleCase } from '../utils';
import { LoadingStatus } from './ui/Dot';
import { ChevronRight, ExternalLink, FlaskConical } from 'lucide-react';
import { ChevronRight, ExternalLink } from 'lucide-react';
import { TooltipWrapper } from './settings/providers/subcomponents/buttons/TooltipWrapper';
import MCPUIResourceRenderer from './MCPUIResourceRenderer';
import { isUIResource } from '@mcp-ui/client';
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
import type { ContentBlock, EmbeddedResource } from '../api';
import type { ContentBlock } from '../api';
import McpAppRenderer from './McpApps/McpAppRenderer';
import ToolApprovalButtons from './ToolApprovalButtons';
import { defineMessages, useIntl } from '../i18n';
const i18n = defineMessages({
mcpUiExperimental: {
id: 'toolCallWithResponse.mcpUiExperimental',
defaultMessage: 'MCP UI is experimental and may change at any time.',
},
viewSubagentSession: {
id: 'toolCallWithResponse.viewSubagentSession',
defaultMessage: 'View subagent session',
@@ -152,13 +146,6 @@ function getToolResultContent(toolResult: Record<string, unknown>): ContentBlock
});
}
function isEmbeddedResource(
content: ContentBlock
): content is EmbeddedResource & { type: 'resource' } {
const c = content as Record<string, unknown>;
return c.type === 'resource' && typeof c.resource === 'object' && c.resource !== null;
}
interface McpAppWrapperProps {
toolRequest: ToolRequestMessageContent;
toolResponse?: ToolResponseMessageContent;
@@ -236,7 +223,6 @@ export default function ToolCallWithResponse({
confirmationContent,
isApprovalClicked,
}: ToolCallWithResponseProps) {
const intl = useIntl();
// Handle both the wrapped ToolResult format and the unwrapped format
// The server serializes ToolResult<T> as { status: "success", value: T } or { status: "error", error: string }
const toolCallData = toolRequest.toolCall as Record<string, unknown>;
@@ -298,28 +284,6 @@ export default function ToolCallWithResponse({
</div>
)}
</div>
{/* MCP UI — Inline */}
{shouldShowMcpContent &&
!hasMcpAppResourceURI &&
toolResponse?.toolResult &&
getToolResultContent(toolResponse.toolResult).map((content, index) => {
if (!isEmbeddedResource(content)) return null;
if (isUIResource(content)) {
return (
<div key={index} className="mt-3">
<MCPUIResourceRenderer content={content} appendPromptToChat={append} />
<div className="mt-3 p-4 py-3 border border-border-primary rounded-lg bg-background-secondary flex items-center">
<FlaskConical className="mr-2" size={20} />
<div className="text-sm font-sans">
{intl.formatMessage(i18n.mcpUiExperimental)}
</div>
</div>
</div>
);
} else {
return null;
}
})}
{/* MCP App */}
{shouldShowMcpContent && hasMcpAppResourceURI && sessionId && (
-27
View File
@@ -1949,30 +1949,6 @@
"mcpAppRenderer.playingInPip": {
"defaultMessage": "Wiedergabe im Bild-in-Bild-Modus"
},
"mcpUIResourceRenderer.cancelButton": {
"defaultMessage": "Abbrechen"
},
"mcpUIResourceRenderer.openButton": {
"defaultMessage": "Öffnen"
},
"mcpUIResourceRenderer.openExternalLinkTitle": {
"defaultMessage": "Externen Link öffnen"
},
"mcpUIResourceRenderer.openLinkDetail": {
"defaultMessage": "Dies öffnet: {url}"
},
"mcpUIResourceRenderer.openProtocolLink": {
"defaultMessage": "{protocol}-Link öffnen?"
},
"mcpUIResourceRenderer.toastMessageReceived": {
"defaultMessage": "Nachricht für {message} empfangen."
},
"mcpUIResourceRenderer.toastTitle": {
"defaultMessage": "MCP-UI-Nachricht {messageType}"
},
"mcpUIResourceRenderer.toastUnsupported": {
"defaultMessage": "Nachricht für {message} empfangen. Nachrichten vom Typ {messageType} werden noch nicht unterstützt, weitere Details finden Sie in der Konsole."
},
"mentionPopover.itemsFound": {
"defaultMessage": "{count,plural,one{# Element gefunden} other{# Elemente gefunden}}"
},
@@ -4430,9 +4406,6 @@
"toolCallWithResponse.logs": {
"defaultMessage": "Protokolle"
},
"toolCallWithResponse.mcpUiExperimental": {
"defaultMessage": "MCP UI ist experimentell und kann sich jederzeit ändern."
},
"toolCallWithResponse.output": {
"defaultMessage": "Ausgabe"
},
-27
View File
@@ -1949,30 +1949,6 @@
"mcpAppRenderer.playingInPip": {
"defaultMessage": "Playing in Picture-in-Picture"
},
"mcpUIResourceRenderer.cancelButton": {
"defaultMessage": "Cancel"
},
"mcpUIResourceRenderer.openButton": {
"defaultMessage": "Open"
},
"mcpUIResourceRenderer.openExternalLinkTitle": {
"defaultMessage": "Open External Link"
},
"mcpUIResourceRenderer.openLinkDetail": {
"defaultMessage": "This will open: {url}"
},
"mcpUIResourceRenderer.openProtocolLink": {
"defaultMessage": "Open {protocol} link?"
},
"mcpUIResourceRenderer.toastMessageReceived": {
"defaultMessage": "Message received for {message}."
},
"mcpUIResourceRenderer.toastTitle": {
"defaultMessage": "MCP-UI {messageType} message"
},
"mcpUIResourceRenderer.toastUnsupported": {
"defaultMessage": "Message received for {message}. {messageType} messages aren't supported yet, refer to console for more details."
},
"mentionPopover.itemsFound": {
"defaultMessage": "{count,plural,one{# item found} other{# items found}}"
},
@@ -4430,9 +4406,6 @@
"toolCallWithResponse.logs": {
"defaultMessage": "Logs"
},
"toolCallWithResponse.mcpUiExperimental": {
"defaultMessage": "MCP UI is experimental and may change at any time."
},
"toolCallWithResponse.output": {
"defaultMessage": "Output"
},
-27
View File
@@ -1949,30 +1949,6 @@
"mcpAppRenderer.playingInPip": {
"defaultMessage": "Reproduciendo en imagen en imagen"
},
"mcpUIResourceRenderer.cancelButton": {
"defaultMessage": "Cancelar"
},
"mcpUIResourceRenderer.openButton": {
"defaultMessage": "Abrir"
},
"mcpUIResourceRenderer.openExternalLinkTitle": {
"defaultMessage": "Abrir enlace externo"
},
"mcpUIResourceRenderer.openLinkDetail": {
"defaultMessage": "Esto abrirá: {url}"
},
"mcpUIResourceRenderer.openProtocolLink": {
"defaultMessage": "¿Abrir enlace {protocol}?"
},
"mcpUIResourceRenderer.toastMessageReceived": {
"defaultMessage": "Mensaje recibido para {message}."
},
"mcpUIResourceRenderer.toastTitle": {
"defaultMessage": "Mensaje {messageType} de MCP-UI"
},
"mcpUIResourceRenderer.toastUnsupported": {
"defaultMessage": "Mensaje recibido para {message}. Los mensajes {messageType} aún no se admiten, consulta la consola para más detalles."
},
"mentionPopover.itemsFound": {
"defaultMessage": "{count,plural,one{# elemento encontrado} other{# elementos encontrados}}"
},
@@ -4430,9 +4406,6 @@
"toolCallWithResponse.logs": {
"defaultMessage": "Logs"
},
"toolCallWithResponse.mcpUiExperimental": {
"defaultMessage": "La UI de MCP es experimental y puede cambiar en cualquier momento."
},
"toolCallWithResponse.output": {
"defaultMessage": "Salida"
},
-27
View File
@@ -1949,30 +1949,6 @@
"mcpAppRenderer.playingInPip": {
"defaultMessage": "Lecture en Picture-in-Picture"
},
"mcpUIResourceRenderer.cancelButton": {
"defaultMessage": "Annuler"
},
"mcpUIResourceRenderer.openButton": {
"defaultMessage": "Ouvrir"
},
"mcpUIResourceRenderer.openExternalLinkTitle": {
"defaultMessage": "Ouvrir le lien externe"
},
"mcpUIResourceRenderer.openLinkDetail": {
"defaultMessage": "Cela ouvrira : {url}"
},
"mcpUIResourceRenderer.openProtocolLink": {
"defaultMessage": "Ouvrir le lien {protocol} ?"
},
"mcpUIResourceRenderer.toastMessageReceived": {
"defaultMessage": "Message reçu pour {message}."
},
"mcpUIResourceRenderer.toastTitle": {
"defaultMessage": "Message MCP-UI {messageType}"
},
"mcpUIResourceRenderer.toastUnsupported": {
"defaultMessage": "Message reçu pour {message}. Les messages {messageType} ne sont pas encore pris en charge, consultez la console pour plus de détails."
},
"mentionPopover.itemsFound": {
"defaultMessage": "{count,plural,one{# élément trouvé} other{# éléments trouvés}}"
},
@@ -4430,9 +4406,6 @@
"toolCallWithResponse.logs": {
"defaultMessage": "Journaux"
},
"toolCallWithResponse.mcpUiExperimental": {
"defaultMessage": "L'interface MCP est expérimentale et peut changer à tout moment."
},
"toolCallWithResponse.output": {
"defaultMessage": "Sortie"
},
-27
View File
@@ -1949,30 +1949,6 @@
"mcpAppRenderer.playingInPip": {
"defaultMessage": "पिक्चर-इन-पिक्चर में बजाना"
},
"mcpUIResourceRenderer.cancelButton": {
"defaultMessage": "रद्द करें"
},
"mcpUIResourceRenderer.openButton": {
"defaultMessage": "खुला"
},
"mcpUIResourceRenderer.openExternalLinkTitle": {
"defaultMessage": "बाहरी लिंक खोलें"
},
"mcpUIResourceRenderer.openLinkDetail": {
"defaultMessage": "यह खुलेगा: {url}"
},
"mcpUIResourceRenderer.openProtocolLink": {
"defaultMessage": "{protocol} लिंक खोलें?"
},
"mcpUIResourceRenderer.toastMessageReceived": {
"defaultMessage": "{message} के लिए संदेश प्राप्त हुआ।"
},
"mcpUIResourceRenderer.toastTitle": {
"defaultMessage": "एमसीपी-यूआई {messageType} संदेश"
},
"mcpUIResourceRenderer.toastUnsupported": {
"defaultMessage": "{message} के लिए संदेश प्राप्त हुआ। {messageType} संदेश अभी तक समर्थित नहीं हैं, अधिक विवरण के लिए कंसोल देखें।"
},
"mentionPopover.itemsFound": {
"defaultMessage": "{count,plural,one{# आइटम मिला} other{# आइटम मिले}}"
},
@@ -4430,9 +4406,6 @@
"toolCallWithResponse.logs": {
"defaultMessage": "लॉग"
},
"toolCallWithResponse.mcpUiExperimental": {
"defaultMessage": "MCP यूआई प्रयोगात्मक है और किसी भी समय बदल सकता है।"
},
"toolCallWithResponse.output": {
"defaultMessage": "आउटपुट"
},
-27
View File
@@ -1949,30 +1949,6 @@
"mcpAppRenderer.playingInPip": {
"defaultMessage": "Memutar dalam Picture-in-Picture"
},
"mcpUIResourceRenderer.cancelButton": {
"defaultMessage": "Batal"
},
"mcpUIResourceRenderer.openButton": {
"defaultMessage": "Buka"
},
"mcpUIResourceRenderer.openExternalLinkTitle": {
"defaultMessage": "Buka Tautan Eksternal"
},
"mcpUIResourceRenderer.openLinkDetail": {
"defaultMessage": "Ini akan membuka: {url}"
},
"mcpUIResourceRenderer.openProtocolLink": {
"defaultMessage": "Buka tautan {protocol}?"
},
"mcpUIResourceRenderer.toastMessageReceived": {
"defaultMessage": "Pesan diterima untuk {message}."
},
"mcpUIResourceRenderer.toastTitle": {
"defaultMessage": "Pesan MCP-UI {messageType}"
},
"mcpUIResourceRenderer.toastUnsupported": {
"defaultMessage": "Pesan diterima untuk {message}. Pesan {messageType} belum didukung, lihat konsol untuk detail lebih lanjut."
},
"mentionPopover.itemsFound": {
"defaultMessage": "{count,plural,one{# item ditemukan} other{# item ditemukan}}"
},
@@ -4430,9 +4406,6 @@
"toolCallWithResponse.logs": {
"defaultMessage": "Log"
},
"toolCallWithResponse.mcpUiExperimental": {
"defaultMessage": "MCP UI bersifat eksperimental dan dapat berubah sewaktu-waktu."
},
"toolCallWithResponse.output": {
"defaultMessage": "Keluaran"
},
-27
View File
@@ -1949,30 +1949,6 @@
"mcpAppRenderer.playingInPip": {
"defaultMessage": "In riproduzione in Picture-in-Picture"
},
"mcpUIResourceRenderer.cancelButton": {
"defaultMessage": "Annulla"
},
"mcpUIResourceRenderer.openButton": {
"defaultMessage": "Apri"
},
"mcpUIResourceRenderer.openExternalLinkTitle": {
"defaultMessage": "Apri link esterno"
},
"mcpUIResourceRenderer.openLinkDetail": {
"defaultMessage": "Questo aprirà: {url}"
},
"mcpUIResourceRenderer.openProtocolLink": {
"defaultMessage": "Aprire il link {protocol}?"
},
"mcpUIResourceRenderer.toastMessageReceived": {
"defaultMessage": "Messaggio ricevuto per {message}."
},
"mcpUIResourceRenderer.toastTitle": {
"defaultMessage": "Messaggio MCP-UI {messageType}"
},
"mcpUIResourceRenderer.toastUnsupported": {
"defaultMessage": "Messaggio ricevuto per {message}. I messaggi {messageType} non sono ancora supportati, consulta la console per maggiori dettagli."
},
"mentionPopover.itemsFound": {
"defaultMessage": "{count,plural,one{# elemento trovato} other{# elementi trovati}}"
},
@@ -4430,9 +4406,6 @@
"toolCallWithResponse.logs": {
"defaultMessage": "Log"
},
"toolCallWithResponse.mcpUiExperimental": {
"defaultMessage": "L'interfaccia MCP è sperimentale e può cambiare in qualsiasi momento."
},
"toolCallWithResponse.output": {
"defaultMessage": "Output"
},
-27
View File
@@ -1949,30 +1949,6 @@
"mcpAppRenderer.playingInPip": {
"defaultMessage": "ピクチャ・イン・ピクチャで再生中"
},
"mcpUIResourceRenderer.cancelButton": {
"defaultMessage": "キャンセル"
},
"mcpUIResourceRenderer.openButton": {
"defaultMessage": "開く"
},
"mcpUIResourceRenderer.openExternalLinkTitle": {
"defaultMessage": "外部リンクを開く"
},
"mcpUIResourceRenderer.openLinkDetail": {
"defaultMessage": "次を開きます: {url}"
},
"mcpUIResourceRenderer.openProtocolLink": {
"defaultMessage": "{protocol}リンクを開きますか?"
},
"mcpUIResourceRenderer.toastMessageReceived": {
"defaultMessage": "{message}のメッセージを受信しました。"
},
"mcpUIResourceRenderer.toastTitle": {
"defaultMessage": "MCP-UI {messageType}メッセージ"
},
"mcpUIResourceRenderer.toastUnsupported": {
"defaultMessage": "{message}のメッセージを受信しました。{messageType}メッセージはまだサポートされていません。詳細はコンソールを確認してください。"
},
"mentionPopover.itemsFound": {
"defaultMessage": "{count,plural,one{# 件見つかりました} other{# 件見つかりました}}"
},
@@ -4430,9 +4406,6 @@
"toolCallWithResponse.logs": {
"defaultMessage": "ログ"
},
"toolCallWithResponse.mcpUiExperimental": {
"defaultMessage": "MCP UIは実験的な機能であり、予告なく変更される場合があります。"
},
"toolCallWithResponse.output": {
"defaultMessage": "出力"
},
-27
View File
@@ -1949,30 +1949,6 @@
"mcpAppRenderer.playingInPip": {
"defaultMessage": "PIP(Picture-in-Picture)에서 재생 중"
},
"mcpUIResourceRenderer.cancelButton": {
"defaultMessage": "취소"
},
"mcpUIResourceRenderer.openButton": {
"defaultMessage": "열기"
},
"mcpUIResourceRenderer.openExternalLinkTitle": {
"defaultMessage": "외부 링크 열기"
},
"mcpUIResourceRenderer.openLinkDetail": {
"defaultMessage": "열립니다: {url}"
},
"mcpUIResourceRenderer.openProtocolLink": {
"defaultMessage": "{protocol} 링크를 열까요?"
},
"mcpUIResourceRenderer.toastMessageReceived": {
"defaultMessage": "{message}에 대한 메시지가 수신되었습니다."
},
"mcpUIResourceRenderer.toastTitle": {
"defaultMessage": "MCP-UI {messageType} 메시지"
},
"mcpUIResourceRenderer.toastUnsupported": {
"defaultMessage": "{message}에 대한 메시지가 수신되었습니다. {messageType} 메시지는 아직 지원되지 않습니다. 자세한 내용은 콘솔을 참조하세요."
},
"mentionPopover.itemsFound": {
"defaultMessage": "{count,plural,one{#개 항목 발견} other{#개 항목 발견}}"
},
@@ -4430,9 +4406,6 @@
"toolCallWithResponse.logs": {
"defaultMessage": "로그"
},
"toolCallWithResponse.mcpUiExperimental": {
"defaultMessage": "MCP UI는 실험적이며 언제든지 변경될 수 있습니다."
},
"toolCallWithResponse.output": {
"defaultMessage": "출력"
},
-27
View File
@@ -1949,30 +1949,6 @@
"mcpAppRenderer.playingInPip": {
"defaultMessage": "Bermain dalam Gambar-dalam-Gambar"
},
"mcpUIResourceRenderer.cancelButton": {
"defaultMessage": "Batal"
},
"mcpUIResourceRenderer.openButton": {
"defaultMessage": "Buka"
},
"mcpUIResourceRenderer.openExternalLinkTitle": {
"defaultMessage": "Buka Pautan Luaran"
},
"mcpUIResourceRenderer.openLinkDetail": {
"defaultMessage": "Ini akan membuka: {url}"
},
"mcpUIResourceRenderer.openProtocolLink": {
"defaultMessage": "Buka pautan {protocol}?"
},
"mcpUIResourceRenderer.toastMessageReceived": {
"defaultMessage": "Mesej diterima untuk {message}."
},
"mcpUIResourceRenderer.toastTitle": {
"defaultMessage": "Mesej MCP-UI {messageType}"
},
"mcpUIResourceRenderer.toastUnsupported": {
"defaultMessage": "Mesej diterima untuk {message}. Mesej {messageType} belum disokong lagi, rujuk konsol untuk butiran lanjut."
},
"mentionPopover.itemsFound": {
"defaultMessage": "{count,plural,one{# item dijumpai} other{# item dijumpai}}"
},
@@ -4430,9 +4406,6 @@
"toolCallWithResponse.logs": {
"defaultMessage": "Log"
},
"toolCallWithResponse.mcpUiExperimental": {
"defaultMessage": "MCP UI adalah eksperimen dan boleh berubah pada bila-bila masa."
},
"toolCallWithResponse.output": {
"defaultMessage": "Output"
},
-27
View File
@@ -1949,30 +1949,6 @@
"mcpAppRenderer.playingInPip": {
"defaultMessage": "Reproduzindo em Picture-in-Picture"
},
"mcpUIResourceRenderer.cancelButton": {
"defaultMessage": "Cancelar"
},
"mcpUIResourceRenderer.openButton": {
"defaultMessage": "Abrir"
},
"mcpUIResourceRenderer.openExternalLinkTitle": {
"defaultMessage": "Abrir Link Externo"
},
"mcpUIResourceRenderer.openLinkDetail": {
"defaultMessage": "Isto abrirá: {url}"
},
"mcpUIResourceRenderer.openProtocolLink": {
"defaultMessage": "Abrir link {protocol}?"
},
"mcpUIResourceRenderer.toastMessageReceived": {
"defaultMessage": "Mensagem recebida para {message}."
},
"mcpUIResourceRenderer.toastTitle": {
"defaultMessage": "Mensagem {messageType} do MCP-UI"
},
"mcpUIResourceRenderer.toastUnsupported": {
"defaultMessage": "Mensagem recebida para {message}. As mensagens {messageType} ainda não são suportadas, consulte o console para mais detalhes."
},
"mentionPopover.itemsFound": {
"defaultMessage": "{count,plural,one{# item encontrado} other{# itens encontrados}}"
},
@@ -4430,9 +4406,6 @@
"toolCallWithResponse.logs": {
"defaultMessage": "Registos"
},
"toolCallWithResponse.mcpUiExperimental": {
"defaultMessage": "A IU do MCP é experimental e pode mudar a qualquer momento."
},
"toolCallWithResponse.output": {
"defaultMessage": "Saída"
},
-27
View File
@@ -1949,30 +1949,6 @@
"mcpAppRenderer.playingInPip": {
"defaultMessage": "Воспроизведение в режиме «картинка в картинке»"
},
"mcpUIResourceRenderer.cancelButton": {
"defaultMessage": "Отмена"
},
"mcpUIResourceRenderer.openButton": {
"defaultMessage": "Открыть"
},
"mcpUIResourceRenderer.openExternalLinkTitle": {
"defaultMessage": "Открыть внешнюю ссылку"
},
"mcpUIResourceRenderer.openLinkDetail": {
"defaultMessage": "Будет открыто: {url}"
},
"mcpUIResourceRenderer.openProtocolLink": {
"defaultMessage": "Открыть ссылку {protocol}?"
},
"mcpUIResourceRenderer.toastMessageReceived": {
"defaultMessage": "Получено сообщение для {message}."
},
"mcpUIResourceRenderer.toastTitle": {
"defaultMessage": "Сообщение MCP-UI {messageType}"
},
"mcpUIResourceRenderer.toastUnsupported": {
"defaultMessage": "Получено сообщение для {message}. Сообщения {messageType} пока не поддерживаются; подробности смотрите в консоли."
},
"mentionPopover.itemsFound": {
"defaultMessage": "{count, plural, one {Найден # элемент} few {Найдено # элемента} many {Найдено # элементов} other {Найдено # элемента}}"
},
@@ -4430,9 +4406,6 @@
"toolCallWithResponse.logs": {
"defaultMessage": "Журналы"
},
"toolCallWithResponse.mcpUiExperimental": {
"defaultMessage": "MCP UI является экспериментальным и может измениться в любой момент."
},
"toolCallWithResponse.output": {
"defaultMessage": "Вывод"
},
-27
View File
@@ -1949,30 +1949,6 @@
"mcpAppRenderer.playingInPip": {
"defaultMessage": "Resim İçinde Resim'de Oynatma"
},
"mcpUIResourceRenderer.cancelButton": {
"defaultMessage": "İptal"
},
"mcpUIResourceRenderer.openButton": {
"defaultMessage": "Açık"
},
"mcpUIResourceRenderer.openExternalLinkTitle": {
"defaultMessage": "Dış Bağlantıyı Aç"
},
"mcpUIResourceRenderer.openLinkDetail": {
"defaultMessage": "Bu açılacak: {url}"
},
"mcpUIResourceRenderer.openProtocolLink": {
"defaultMessage": "{protocol} bağlantısı açılsın mı?"
},
"mcpUIResourceRenderer.toastMessageReceived": {
"defaultMessage": "{message} için mesaj alındı."
},
"mcpUIResourceRenderer.toastTitle": {
"defaultMessage": "MCP-UI {messageType} mesajı"
},
"mcpUIResourceRenderer.toastUnsupported": {
"defaultMessage": "{message} için mesaj alındı. {messageType} mesajları henüz desteklenmiyor; daha fazla ayrıntı için konsola bakın."
},
"mentionPopover.itemsFound": {
"defaultMessage": "{count,plural,one{# öğe bulundu} other{# öğe bulundu}}"
},
@@ -4430,9 +4406,6 @@
"toolCallWithResponse.logs": {
"defaultMessage": "Günlükler"
},
"toolCallWithResponse.mcpUiExperimental": {
"defaultMessage": "MCP Kullanıcı arayüzü deneyseldir ve herhangi bir zamanda değişebilir."
},
"toolCallWithResponse.output": {
"defaultMessage": "Çıkış"
},
-27
View File
@@ -1949,30 +1949,6 @@
"mcpAppRenderer.playingInPip": {
"defaultMessage": "Đang phát ở chế độ Hình-trong-hình"
},
"mcpUIResourceRenderer.cancelButton": {
"defaultMessage": "Hủy"
},
"mcpUIResourceRenderer.openButton": {
"defaultMessage": "Mở"
},
"mcpUIResourceRenderer.openExternalLinkTitle": {
"defaultMessage": "Mở liên kết bên ngoài"
},
"mcpUIResourceRenderer.openLinkDetail": {
"defaultMessage": "Thao tác này sẽ mở: {url}"
},
"mcpUIResourceRenderer.openProtocolLink": {
"defaultMessage": "Mở liên kết {protocol}?"
},
"mcpUIResourceRenderer.toastMessageReceived": {
"defaultMessage": "Đã nhận thông báo cho {message}."
},
"mcpUIResourceRenderer.toastTitle": {
"defaultMessage": "Thông báo MCP-UI {messageType}"
},
"mcpUIResourceRenderer.toastUnsupported": {
"defaultMessage": "Đã nhận thông báo cho {message}. Thông báo {messageType} chưa được hỗ trợ, hãy tham khảo console để biết thêm chi tiết."
},
"mentionPopover.itemsFound": {
"defaultMessage": "{count,plural,one{# mục được tìm thấy} other{# mục được tìm thấy}}"
},
@@ -4430,9 +4406,6 @@
"toolCallWithResponse.logs": {
"defaultMessage": "Nhật ký"
},
"toolCallWithResponse.mcpUiExperimental": {
"defaultMessage": "MCP UI là thử nghiệm và có thể thay đổi bất kỳ lúc nào."
},
"toolCallWithResponse.output": {
"defaultMessage": "Đầu ra"
},
-27
View File
@@ -1949,30 +1949,6 @@
"mcpAppRenderer.playingInPip": {
"defaultMessage": "正在以画中画播放"
},
"mcpUIResourceRenderer.cancelButton": {
"defaultMessage": "取消"
},
"mcpUIResourceRenderer.openButton": {
"defaultMessage": "打开"
},
"mcpUIResourceRenderer.openExternalLinkTitle": {
"defaultMessage": "打开外部链接"
},
"mcpUIResourceRenderer.openLinkDetail": {
"defaultMessage": "这将打开:{url}"
},
"mcpUIResourceRenderer.openProtocolLink": {
"defaultMessage": "打开 {protocol} 链接?"
},
"mcpUIResourceRenderer.toastMessageReceived": {
"defaultMessage": "已收到 {message} 的消息。"
},
"mcpUIResourceRenderer.toastTitle": {
"defaultMessage": "MCP-UI {messageType} 消息"
},
"mcpUIResourceRenderer.toastUnsupported": {
"defaultMessage": "已收到 {message} 的消息。目前尚不支持 {messageType} 类型的消息,详见控制台。"
},
"mentionPopover.itemsFound": {
"defaultMessage": "{count,plural,one{找到 # 项} other{找到 # 项}}"
},
@@ -4430,9 +4406,6 @@
"toolCallWithResponse.logs": {
"defaultMessage": "日志"
},
"toolCallWithResponse.mcpUiExperimental": {
"defaultMessage": "MCP UI 是实验性功能,随时可能更改。"
},
"toolCallWithResponse.output": {
"defaultMessage": "输出"
},
-27
View File
@@ -1949,30 +1949,6 @@
"mcpAppRenderer.playingInPip": {
"defaultMessage": "正在子母畫面中播放"
},
"mcpUIResourceRenderer.cancelButton": {
"defaultMessage": "取消"
},
"mcpUIResourceRenderer.openButton": {
"defaultMessage": "開啟"
},
"mcpUIResourceRenderer.openExternalLinkTitle": {
"defaultMessage": "開啟外部連結"
},
"mcpUIResourceRenderer.openLinkDetail": {
"defaultMessage": "這會開啟:{url}"
},
"mcpUIResourceRenderer.openProtocolLink": {
"defaultMessage": "要開啟 {protocol} 連結嗎?"
},
"mcpUIResourceRenderer.toastMessageReceived": {
"defaultMessage": "已收到 {message} 的訊息。"
},
"mcpUIResourceRenderer.toastTitle": {
"defaultMessage": "MCP-UI {messageType} 訊息"
},
"mcpUIResourceRenderer.toastUnsupported": {
"defaultMessage": "已收到 {message} 的訊息。目前尚不支援 {messageType} 訊息,詳情請參閱主控台。"
},
"mentionPopover.itemsFound": {
"defaultMessage": "{count,plural,one{找到 # 個項目} other{找到 # 個項目}}"
},
@@ -4430,9 +4406,6 @@
"toolCallWithResponse.logs": {
"defaultMessage": "記錄"
},
"toolCallWithResponse.mcpUiExperimental": {
"defaultMessage": "MCP UI 為實驗性功能,可能隨時變更。"
},
"toolCallWithResponse.output": {
"defaultMessage": "輸出"
},