@@ -35,25 +35,103 @@ const prettyPrintToolJson = (value: unknown): string => {
3535 return JSON . stringify ( value ) ;
3636} ;
3737
38- export const formatToolResponseForMarkdown = ( raw : string ) : string => {
39- if ( raw === null ) return '' ;
40- const trimmed = raw . trim ( ) ;
41- if ( ! trimmed ) return '' ;
38+ const tryParseJson = ( value : string ) => {
39+ try {
40+ return JSON . parse ( value ) ;
41+ } catch {
42+ return undefined ;
43+ }
44+ } ;
4245
43- if ( / ^ ` ` ` / m. test ( trimmed ) ) {
44- return raw ;
46+ const deepParseJson = ( value : unknown ) : unknown => {
47+ let current = value ;
48+
49+ while ( typeof current === 'string' ) {
50+ try {
51+ const parsed = JSON . parse ( current ) ;
52+
53+ // stop if parsing doesn't change type
54+ if ( parsed === current ) break ;
55+
56+ current = parsed ;
57+ } catch {
58+ break ;
59+ }
4560 }
4661
47- let parsed : unknown ;
48- try {
49- parsed = JSON . parse ( trimmed ) ;
50- } catch {
51- if ( trimmed . length > 120 || trimmed . includes ( '\n' ) ) {
52- return `\`\`\`\n${ trimmed } \n\`\`\`` ;
62+ return current ;
63+ } ;
64+
65+ const formatPayload = ( payload : unknown ) : string => {
66+ if ( typeof payload === 'string' ) {
67+ const nested = deepParseJson ( payload ) ;
68+ if ( nested !== undefined && nested !== null && typeof nested === 'object' ) {
69+ return `\`\`\`json\n${ JSON . stringify ( nested , null , 2 ) } \n\`\`\`` ;
70+ }
71+ if ( payload . length > 120 || payload . includes ( '\n' ) ) {
72+ return `\`\`\`\n${ payload } \n\`\`\`` ;
5373 }
54- return trimmed ;
74+ return payload ;
5575 }
5676
57- const body = prettyPrintToolJson ( parsed ) ;
77+ const body = prettyPrintToolJson ( payload ) ;
5878 return `\`\`\`json\n${ body } \n\`\`\`` ;
5979} ;
80+
81+ const STATUS_PREFIX_REGEX = / ^ \[ ( [ ^ \] ] + ) \] \s + ( [ \s \S ] + ) $ / ;
82+
83+ const extractToolResultPayload = ( raw : string ) : unknown | undefined => {
84+ const trimmed = raw . trim ( ) ;
85+
86+ const match = STATUS_PREFIX_REGEX . exec ( trimmed ) ;
87+ if ( match ) {
88+ const [ , , payload ] = match ;
89+
90+ const parsed = tryParseJson ( payload . trim ( ) ) ;
91+ if ( parsed !== undefined ) {
92+ return parsed ;
93+ }
94+ }
95+
96+ const jsonSegment = trimmed . startsWith ( 'data:' )
97+ ? trimmed . slice ( 'data:' . length ) . trim ( )
98+ : trimmed ;
99+
100+ const parsed = tryParseJson ( jsonSegment ) ;
101+ if ( ! parsed || typeof parsed !== 'object' ) {
102+ return undefined ;
103+ }
104+
105+ const parsedRecord = parsed as Record < string , unknown > ;
106+
107+ if (
108+ parsedRecord . event === 'tool_result' &&
109+ parsedRecord . data &&
110+ typeof parsedRecord . data === 'object' &&
111+ 'content' in parsedRecord . data
112+ ) {
113+ const content = ( parsedRecord . data as Record < string , unknown > ) . content ;
114+
115+ if ( typeof content === 'string' ) {
116+ return deepParseJson ( content ) ;
117+ }
118+
119+ return content ;
120+ }
121+
122+ return parsed ;
123+ } ;
124+
125+ export const formatToolResponseForMarkdown = ( raw : string ) : string => {
126+ if ( ! raw ?. trim ( ) ) return '' ;
127+
128+ if ( / ^ ` ` ` / . test ( raw ) ) return raw ;
129+
130+ const payload = extractToolResultPayload ( raw ) ;
131+
132+ if ( payload !== undefined ) {
133+ return formatPayload ( payload ) ;
134+ }
135+
136+ return formatPayload ( raw ) ;
137+ } ;
0 commit comments