@@ -18,6 +18,10 @@ function asTrimmedString(value: unknown): string | null {
1818 return trimmed . length > 0 ? trimmed : null ;
1919}
2020
21+ function asInteger ( value : unknown ) : number | null {
22+ return typeof value === "number" && Number . isInteger ( value ) ? value : null ;
23+ }
24+
2125function pushChangedFile ( target : string [ ] , seen : Set < string > , value : unknown ) : void {
2226 const normalized = asTrimmedString ( value ) ;
2327 if ( ! normalized || seen . has ( normalized ) ) {
@@ -90,15 +94,29 @@ function projectCommandData(data: Record<string, unknown>): Record<string, unkno
9094 if ( "command" in item ) {
9195 projectedItem . command = item . command ;
9296 }
97+ const exitCode = asInteger ( item . exitCode ) ;
98+ if ( exitCode !== null ) {
99+ projectedItem . exitCode = exitCode ;
100+ }
93101
94102 const input = asRecord ( item . input ) ;
95103 if ( input && "command" in input ) {
96104 projectedItem . input = { command : input . command } ;
97105 }
98106
99107 const result = asRecord ( item . result ) ;
100- if ( result && "command" in result ) {
101- projectedItem . result = { command : result . command } ;
108+ if ( result ) {
109+ const projectedResult : Record < string , unknown > = { } ;
110+ if ( "command" in result ) {
111+ projectedResult . command = result . command ;
112+ }
113+ const resultExitCode = asInteger ( result . exitCode ) ;
114+ if ( resultExitCode !== null ) {
115+ projectedResult . exitCode = resultExitCode ;
116+ }
117+ if ( Object . keys ( projectedResult ) . length > 0 ) {
118+ projectedItem . result = projectedResult ;
119+ }
102120 }
103121
104122 return Object . keys ( projectedItem ) . length > 0 ? projectedItem : undefined ;
@@ -237,26 +255,38 @@ function projectRawOutput(value: unknown): Record<string, unknown> | undefined {
237255 return undefined ;
238256 }
239257
258+ const projected : Record < string , unknown > = { } ;
259+ const exitCode = asInteger ( rawOutput . exitCode ) ;
260+ if ( exitCode !== null ) {
261+ projected . exitCode = exitCode ;
262+ }
263+
240264 if ( typeof rawOutput . totalFiles === "number" && Number . isFinite ( rawOutput . totalFiles ) ) {
241- return {
242- totalFiles : rawOutput . totalFiles ,
243- ...( rawOutput . truncated === true ? { truncated : true } : { } ) ,
244- } ;
265+ projected . totalFiles = rawOutput . totalFiles ;
266+ if ( rawOutput . truncated === true ) {
267+ projected . truncated = true ;
268+ }
269+ return projected ;
245270 }
246271
247272 const content = asTrimmedString ( rawOutput . content ) ;
248273 if ( content ) {
249274 const summary = summarizeToolTextOutput ( content ) ;
250- return summary ? { content : summary } : undefined ;
275+ if ( summary ) {
276+ projected . content = summary ;
277+ }
278+ return Object . keys ( projected ) . length > 0 ? projected : undefined ;
251279 }
252280
253281 const stdout = asTrimmedString ( rawOutput . stdout ) ;
254282 if ( stdout ) {
255283 const summary = summarizeToolTextOutput ( stdout ) ;
256- return summary ? { content : summary } : undefined ;
284+ if ( summary ) {
285+ projected . content = summary ;
286+ }
257287 }
258288
259- return undefined ;
289+ return Object . keys ( projected ) . length > 0 ? projected : undefined ;
260290}
261291
262292/**
@@ -290,6 +320,14 @@ export function projectActivityPayload(
290320 if ( "command" in data ) {
291321 projectedData . command = data . command ;
292322 }
323+ const exitCode = asInteger ( data . exitCode ) ;
324+ if ( exitCode !== null ) {
325+ projectedData . exitCode = exitCode ;
326+ }
327+ const resultExitCode = asInteger ( asRecord ( data . result ) ?. exitCode ) ;
328+ if ( resultExitCode !== null ) {
329+ projectedData . result = { exitCode : resultExitCode } ;
330+ }
293331
294332 const changedFiles : string [ ] = [ ] ;
295333 collectChangedFiles ( data , changedFiles , new Set < string > ( ) , 0 ) ;
0 commit comments