@@ -81,6 +81,8 @@ export default function RunDetail({
8181 const [ toolCallsLoading , setToolCallsLoading ] = useState ( false ) ;
8282 const [ planningContracts , setPlanningContracts ] = useState < Array < Record < string , unknown > > > ( [ ] ) ;
8383 const [ planningContractsError , setPlanningContractsError ] = useState ( "" ) ;
84+ const [ unblockTasks , setUnblockTasks ] = useState < Array < Record < string , unknown > > > ( [ ] ) ;
85+ const [ unblockTasksError , setUnblockTasksError ] = useState ( "" ) ;
8486 const [ chainSpecError , setChainSpecError ] = useState ( "" ) ;
8587 const [ chainSpecLoading , setChainSpecLoading ] = useState ( false ) ;
8688 const [ liveEnabled , setLiveEnabled ] = useState ( true ) ;
@@ -139,6 +141,12 @@ export default function RunDetail({
139141 const path = toStringOr ( record . path , "" ) ;
140142 return name === "planning_worker_prompt_contracts" || path === "artifacts/planning_worker_prompt_contracts.json" ;
141143 } ) ;
144+ const hasUnblockTasksArtifact = manifestArtifacts . some ( ( item ) => {
145+ const record = toObject ( item ) ;
146+ const name = toStringOr ( record . name , "" ) ;
147+ const path = toStringOr ( record . path , "" ) ;
148+ return name === "planning_unblock_tasks" || path === "artifacts/planning_unblock_tasks.json" ;
149+ } ) ;
142150 const observability = toObject ( run ?. manifest ?. observability ) ;
143151 const summaryGroups = [ "reports/" , "events.jsonl" , "contract.json" , "other" ] ;
144152 const summary = summaryGroups . map ( ( group ) => {
@@ -276,6 +284,41 @@ export default function RunDetail({
276284 } ;
277285 } , [ hasPlanningContractsArtifact , run ?. run_id ] ) ;
278286
287+ useEffect ( ( ) => {
288+ let alive = true ;
289+ async function loadUnblockTasks ( ) {
290+ if ( ! run ?. run_id || ! hasUnblockTasksArtifact ) {
291+ if ( alive ) {
292+ setUnblockTasks ( [ ] ) ;
293+ setUnblockTasksError ( "" ) ;
294+ }
295+ return ;
296+ }
297+ try {
298+ const artifact = await fetchArtifact ( run . run_id , "planning_unblock_tasks.json" ) ;
299+ const rows = Array . isArray ( artifact ?. data ) ? artifact . data : [ ] ;
300+ if ( alive ) {
301+ setUnblockTasks (
302+ rows
303+ . map ( ( item ) => ( item && typeof item === "object" && ! Array . isArray ( item ) ? ( item as Record < string , unknown > ) : null ) )
304+ . filter ( ( item ) : item is Record < string , unknown > => item !== null ) ,
305+ ) ;
306+ setUnblockTasksError ( "" ) ;
307+ }
308+ } catch ( err : unknown ) {
309+ if ( alive ) {
310+ setUnblockTasks ( [ ] ) ;
311+ console . error ( `[run-detail] load unblock tasks failed: ${ uiErrorDetail ( err ) } ` ) ;
312+ setUnblockTasksError ( sanitizeUiError ( err , "Unblock task summary unavailable" ) ) ;
313+ }
314+ }
315+ }
316+ void loadUnblockTasks ( ) ;
317+ return ( ) => {
318+ alive = false ;
319+ } ;
320+ } , [ hasUnblockTasksArtifact , run ?. run_id ] ) ;
321+
279322 useEffect ( ( ) => {
280323 let alive = true ;
281324 async function loadChainSpec ( ) {
@@ -491,6 +534,8 @@ export default function RunDetail({
491534 manifestArtifacts = { manifestArtifacts }
492535 planningContracts = { planningContracts }
493536 planningContractsError = { planningContractsError }
537+ unblockTasks = { unblockTasks }
538+ unblockTasksError = { unblockTasksError }
494539 onOpenLogs = { ( ) => handleFailedTerminalAction ( "logs" ) }
495540 onOpenReports = { ( ) => handleFailedTerminalAction ( "reports" ) }
496541 failedTerminalActionFeedback = { failedTerminalActionFeedback }
0 commit comments