* ui : fix MCP image attachments not displayed in tool block (#25789) Fixes regression from #25450 where ChatMessageAgenticContent passed message.extra instead of section.toolResultExtras to tool blocks, leaving tool images invisible. Also fixes TOOL_RESULT_JSON_OPEN_REGEX which misclassified "[Attachment saved: ...]" as JSON. Fixes #25789 Assisted-by: Muse Spark * Addressed PR comments: 1.- Removed ·?? mesage?extra· as it has no case left to cover 2.- Added ·[\· to cover the case of ·[[1, 2], [3, 4]]· case suggested in the PR comment 3.- Added unit test for covering up this regex case * ui : fix MCP image attachments not displayed in tool block (ggml-org#25789) - Addressed lint error on regex (redundant \)
This commit is contained in:
@@ -194,7 +194,7 @@
|
|||||||
/>
|
/>
|
||||||
{:else if section.type === AgenticSectionType.TOOL_CALL || section.type === AgenticSectionType.TOOL_CALL_PENDING || section.type === AgenticSectionType.TOOL_CALL_STREAMING}
|
{:else if section.type === AgenticSectionType.TOOL_CALL || section.type === AgenticSectionType.TOOL_CALL_PENDING || section.type === AgenticSectionType.TOOL_CALL_STREAMING}
|
||||||
<ChatMessageToolCallBlock
|
<ChatMessageToolCallBlock
|
||||||
attachments={message?.extra}
|
attachments={section.toolResultExtras}
|
||||||
isExecuting={section.toolCallId !== undefined &&
|
isExecuting={section.toolCallId !== undefined &&
|
||||||
section.toolCallId === currentlyExecutingToolCallId}
|
section.toolCallId === currentlyExecutingToolCallId}
|
||||||
{isStreaming}
|
{isStreaming}
|
||||||
|
|||||||
@@ -2,8 +2,11 @@ import type { AgenticConfig } from '$lib/types/agentic';
|
|||||||
|
|
||||||
export const ATTACHMENT_SAVED_REGEX = /\[Attachment saved: ([^\]]+)\]/;
|
export const ATTACHMENT_SAVED_REGEX = /\[Attachment saved: ([^\]]+)\]/;
|
||||||
|
|
||||||
// JSON detection: trimmed content opens with an object or array literal.
|
// JSON detection: an attachment placeholder also starts with `[`, but is
|
||||||
export const TOOL_RESULT_JSON_OPEN_REGEX = /^[[{]/;
|
// plain text (`[Attachment saved: ...]`), not an array literal. Require the
|
||||||
|
// first array value (or the closing bracket for an empty array) to look like
|
||||||
|
// a valid JSON token before attempting JSON.parse.
|
||||||
|
export const TOOL_RESULT_JSON_OPEN_REGEX = /^(?:\{|\[\s*(?:[[\]"{\-0-9]|true|false|null))/;
|
||||||
|
|
||||||
// Search-summary wire format used by file-glob and grep tools:
|
// Search-summary wire format used by file-glob and grep tools:
|
||||||
// <matches>
|
// <matches>
|
||||||
|
|||||||
@@ -37,6 +37,10 @@ describe('classifyToolResult', () => {
|
|||||||
expect(classifyToolResult('["a", "b", "c"]')).toBe('json');
|
expect(classifyToolResult('["a", "b", "c"]')).toBe('json');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('classifies a nested JSON array', () => {
|
||||||
|
expect(classifyToolResult('[[1, 2], [3, 4]]')).toBe('json');
|
||||||
|
});
|
||||||
|
|
||||||
it('classifies a pretty-printed JSON object', () => {
|
it('classifies a pretty-printed JSON object', () => {
|
||||||
expect(classifyToolResult('{\n "key": "value"\n}')).toBe('json');
|
expect(classifyToolResult('{\n "key": "value"\n}')).toBe('json');
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user