chore: Remove legacy MCP-UI proxy support (#10086)
This commit is contained in:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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;
|
||||
|
||||
@@ -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 && (
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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": "आउटपुट"
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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": "出力"
|
||||
},
|
||||
|
||||
@@ -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": "출력"
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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": "Вывод"
|
||||
},
|
||||
|
||||
@@ -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ış"
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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": "输出"
|
||||
},
|
||||
|
||||
@@ -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": "輸出"
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user