@@ -18,6 +18,41 @@ assert.equal(succeeded.schema, AGENT_TASK_RUN_RESULT_SCHEMA)
1818assert . equal ( succeeded . status , "succeeded" )
1919assert . equal ( agentTaskRunExitCode ( { success : true , agent_task_run_result : succeeded } ) , 0 )
2020
21+ const toolObservability = normalizeAgentTaskRunResult ( {
22+ success : true ,
23+ metadata : {
24+ agents_api : {
25+ tool_observability : {
26+ version : 1 ,
27+ calls : [
28+ { sequence : 1 , turn : 1 , tool_call_id : "call-success" , tool_name : "workspace.read" , status : "succeeded" , arguments : { keys : [ "path" ] , count : 1 , redacted : true } , result : { type : "object" , count : 2 } , result_body : "secret-sentinel" } ,
29+ { sequence : 2 , turn : 1 , tool_call_id : "call-failure" , tool_name : "workspace.write" , status : "failed" , arguments : { keys : [ ] , count : 0 , redacted : true } , error : { code : "raw-secret" , message : "secret-sentinel" } } ,
30+ { sequence : 3 , turn : 2 , tool_call_id : "call-rejected" , tool_name : "workspace.delete" , status : "rejected" , arguments : { keys : [ "path" ] , count : 1 , redacted : true } } ,
31+ { sequence : 4 , turn : 2 , tool_call_id : "call-pending" , tool_name : "workspace.grep" , status : "pending" , arguments : { keys : [ "query" ] , count : 1 , redacted : true } } ,
32+ { sequence : 5 , turn : 2 , tool_call_id : "malformed" , tool_name : "workspace.read" , status : "succeeded" , arguments : { keys : [ "path" ] , count : 2 , redacted : true } } ,
33+ { sequence : 6 , turn : 2 , tool_call_id : "untrusted secret sentinel" , tool_name : "workspace.read" , status : "pending" , arguments : { keys : [ ] , count : 0 , redacted : true } } ,
34+ { sequence : 7 , turn : 2 , tool_call_id : "call-secret-name" , tool_name : "untrusted secret sentinel" , status : "pending" , arguments : { keys : [ ] , count : 0 , redacted : true } } ,
35+ { sequence : 8 , turn : 2 , tool_call_id : "call-secret-key" , tool_name : "workspace.read" , status : "pending" , arguments : { keys : [ "untrusted secret sentinel" ] , count : 1 , redacted : true } } ,
36+ { sequence : 9 , turn : 2 , tool_call_id : "call-secret-type" , tool_name : "workspace.read" , status : "succeeded" , arguments : { keys : [ ] , count : 0 , redacted : true } , result : { type : "untrusted secret sentinel" , count : 1 } } ,
37+ ] ,
38+ } ,
39+ } ,
40+ } ,
41+ } )
42+ assert . deepEqual ( ( toolObservability . metadata . tool_observability as any ) ?. calls . map ( ( call : any ) => call . status ) , [ "succeeded" , "failed" , "rejected" , "pending" ] )
43+ assert . deepEqual ( ( toolObservability . metadata . tool_observability as any ) ?. calls [ 0 ] . result , { type : "object" , count : 2 } )
44+ assert . deepEqual ( ( toolObservability . metadata . tool_observability as any ) ?. calls [ 1 ] . error , { code : "tool_call_failed" , message : "Tool call failed." } )
45+ assert . equal ( JSON . stringify ( toolObservability ) . includes ( "secret-sentinel" ) , false , "normalized tool observability never retains payloads or raw errors" )
46+ assert . equal ( JSON . stringify ( toolObservability ) . includes ( "untrusted secret sentinel" ) , false , "normalized tool observability rejects non-identifier summary strings" )
47+ for ( const resultShape of [ { type : "string" , size : 12 } , { type : "integer" } ] ) {
48+ const normalized = normalizeAgentTaskRunResult ( { metadata : { agents_api : { tool_observability : { version : 1 , calls : [ { sequence : 1 , turn : 1 , tool_call_id : "call-shape" , tool_name : "workspace.read" , status : "succeeded" , arguments : { keys : [ ] , count : 0 , redacted : true } , result : resultShape } ] } } } } )
49+ assert . deepEqual ( ( normalized . metadata . tool_observability as any ) ?. calls [ 0 ] . result , resultShape )
50+ }
51+ for ( const unsupported of [ 0 , 2 , "1" ] ) {
52+ const result = normalizeAgentTaskRunResult ( { metadata : { agents_api : { tool_observability : { version : unsupported , calls : [ { sequence : 1 , turn : 1 , tool_call_id : "call" , tool_name : "tool" , status : "pending" , arguments : { keys : [ ] , count : 0 , redacted : true } } ] } } } } )
53+ assert . equal ( "tool_observability" in result . metadata , false , "only canonical version 1 tool observability is consumed" )
54+ }
55+
2156const resultFileDirectory = mkdtempSync ( join ( tmpdir ( ) , "wp-codebox-agent-task-result-file-" ) )
2257const resultFilePath = join ( resultFileDirectory , "result.json" )
2358const atomicResult = { schema : "wp-codebox/agent-task-run/v1" , success : true , status : "succeeded" , padding : "x" . repeat ( 40 * 1024 ) }
0 commit comments