From a270b19eeeb4eb76f11978c0af5165b00895c576 Mon Sep 17 00:00:00 2001 From: Lyon <88232613+pikasTech@users.noreply.github.com> Date: Thu, 25 Jun 2026 05:36:28 +0800 Subject: [PATCH] fix: preserve trace-frame sample lifecycle (#853) Co-authored-by: Codex --- scripts/src/hwlab-node-web-observe-collect.ts | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/scripts/src/hwlab-node-web-observe-collect.ts b/scripts/src/hwlab-node-web-observe-collect.ts index 686592de..bd21b62f 100644 --- a/scripts/src/hwlab-node-web-observe-collect.ts +++ b/scripts/src/hwlab-node-web-observe-collect.ts @@ -165,16 +165,22 @@ function parseElapsed(text){ function parseRecent(text){const m=String(text||'').match(/最近\\s*(\\d+)\\s*(秒|分钟|分|小时)前/u); if(!m)return null; const n=Number(m[1]); return m[2]==='小时'?n*3600:m[2]==='秒'?n:n*60} function fmtDuration(seconds){if(seconds===null||seconds===undefined||!Number.isFinite(Number(seconds)))return '-'; const value=Math.max(0,Math.round(Number(seconds))); const h=Math.floor(value/3600), m=Math.floor((value%3600)/60), s=value%60; return (h>0?String(h).padStart(2,'0')+':':'')+String(m).padStart(2,'0')+':'+String(s).padStart(2,'0')} function terminalText(text){return /轮次完成|轮次失败|轮次取消|已记录|final response|sealed final response|turn completed|turn failed|turn canceled|completed|failed|canceled|cancelled|terminal/iu.test(String(text||''))} +function normalizeLifecycleStatus(value){ + const raw=String(value||'').trim().toLowerCase(); + if(/^(canceled|cancelled)$/u.test(raw))return 'canceled'; + if(/^(failed|failure|error)$/u.test(raw))return 'failed'; + if(/^(completed|complete|succeeded|success|terminal)$/u.test(raw))return 'completed'; + if(/^(running|admitting|queued|pending|in_progress|in-progress)$/u.test(raw))return 'running'; + return null; +} function statusFor(items,traceId=null){ - const texts=textsFor(items,traceId); - const joined=texts.join('\\n'); const matchedEntries=traceId?traceEntries(items,traceId):items.flatMap((sample)=>entryGroups(sample).map((entry)=>({...entry,sample,text:textOf(entry.item)}))); const lastTurn=matchedEntries.filter((entry)=>entry.group==='turn').slice(-1)[0]?.item||null; - const raw=String(lastTurn?.status||'').toLowerCase(); - if(/cancel/iu.test(joined)||raw.includes('cancel'))return 'canceled'; - if(/failed|error|agentrun:error/iu.test(joined)||raw.includes('fail'))return 'failed'; - if(texts.some(terminalText)||raw.includes('complete'))return 'completed'; - if(/running|运行中|Code Agent\\s*耗时|最近\\s*\\d+/iu.test(joined)||raw.includes('running'))return 'running'; + const turnStatus=normalizeLifecycleStatus(lastTurn?.status); + if(turnStatus)return turnStatus; + const lastMessage=matchedEntries.filter((entry)=>entry.group==='message').slice(-1)[0]?.item||null; + const messageStatus=normalizeLifecycleStatus(lastMessage?.status); + if(messageStatus)return messageStatus; return 'unknown'; } function userMessageFor(items,prompt){ @@ -189,6 +195,7 @@ function userMessageFor(items,prompt){ function cleanFinalResponseText(text){ const raw=String(text||'').trim(); if(!raw) return ''; + if(/^Code Agent$/iu.test(raw)) return ''; if(/Code Agent\\s*耗时[\\s\\S]*运行记录/iu.test(raw)) return ''; if(/^sent\\s+当前 AgentRun 请求已取消/u.test(raw)) return ''; if(/^(admitted|run|ok|error)\\s+/iu.test(raw)) return '';