@@ -87,6 +87,10 @@ function ensureAssistantBubble(sess) {
8787 if ( ! sess . currentBubbleEl ) {
8888 removeThinking ( sess ) ;
8989 var row = $ ( '<div>' ) . addClass ( 'msg-row assistant' ) [ 0 ] ;
90+ // 存储当前 runId,用于后续删除同一运行的消息
91+ if ( sess . currentRunId ) {
92+ row . setAttribute ( 'data-run-id' , sess . currentRunId ) ;
93+ }
9094 row . innerHTML = '<div class="msg-bubble"><div class="md-content"></div>'
9195 + '<div class="msg-time" style="display:none"></div>'
9296 + '<div class="msg-actions">'
@@ -126,7 +130,7 @@ function ensureAssistantBubble(sess) {
126130 }
127131 } ) ;
128132 // 重新运行 / 继续运行:复用后端已有的 /rerun、/continue 命令。
129- // rerun:删除当前 AI 消息行(旧回复),新回复流式渲染到新气泡,与后端回退保持一致。
133+ // rerun:删除同一 runId 的所有 AI 消息行(旧回复),新回复流式渲染到新气泡,与后端回退保持一致。
130134 // continue:保留当前气泡,新内容自然追加到新气泡,呈现“接着往下写”的效果。
131135 var rerunBtn = $ ( row ) . find ( '.rerun-btn' ) [ 0 ] ;
132136 var continueBtn = $ ( row ) . find ( '.continue-btn' ) [ 0 ] ;
@@ -135,8 +139,19 @@ function ensureAssistantBubble(sess) {
135139 if ( typeof sendCommandSilent !== 'function' ) return ;
136140 sendCommandSilent ( cmd , function ( ) {
137141 if ( removeRow ) {
138- // 仅 rerun 同步删除当前 AI 消息行
139- $ ( row ) . remove ( ) ;
142+ // 删除同一 runId 的所有元素(消息行、工具卡片、思考块等)
143+ var runId = row . getAttribute ( 'data-run-id' ) ;
144+ if ( runId ) {
145+ // 删除所有具有相同 runId 的元素
146+ $ ( sess . container ) . find ( '[data-run-id="' + runId + '"]' ) . remove ( ) ;
147+ } else {
148+ // 兼容旧数据:如果没有 runId,只删除当前行
149+ $ ( row ) . remove ( ) ;
150+ }
151+ // 重置会话状态
152+ sess . currentBubbleEl = null ;
153+ sess . thinkingBlockEl = null ;
154+ sess . pendingToolCard = null ;
140155 }
141156 } ) ;
142157 }
@@ -158,6 +173,10 @@ function ensureThinkingBlock(sess) {
158173 ensureAssistantBubble ( sess ) ;
159174 var parent = sess . currentBubbleEl . parentNode ;
160175 var block = $ ( '<div>' ) . addClass ( 'thinking-block streaming expanded' ) [ 0 ] ;
176+ // 存储当前 runId,用于后续删除同一运行的消息
177+ if ( sess . currentRunId ) {
178+ block . setAttribute ( 'data-run-id' , sess . currentRunId ) ;
179+ }
161180 block . innerHTML = '<div class="thinking-block-header">'
162181 + '<span class="thinking-block-label">思考中</span>'
163182 + '<span class="thinking-timer-wrap" style="margin-left:4px">'
@@ -507,6 +526,10 @@ function appendActionStartChunk(sess, toolName, args, toolTitle) {
507526 var argsHtml = argsStr ? '<span class="tool-args">' + escapeHtml ( argsStr ) + '</span>' : '' ;
508527
509528 var card = $ ( '<div>' ) . addClass ( 'tool-card' ) [ 0 ] ;
529+ // 存储当前 runId,用于后续删除同一运行的消息
530+ if ( sess . currentRunId ) {
531+ card . setAttribute ( 'data-run-id' , sess . currentRunId ) ;
532+ }
510533 if ( window . cliPrintSimplified === false ) $ ( card ) . addClass ( 'expanded' ) ;
511534 card . innerHTML = '<div class="tool-card-header">'
512535 + '<span class="tool-status-icon loading"></span>'
@@ -615,6 +638,10 @@ function appendActionEndChunk(sess, toolName, text, args, toolTitle) {
615638 }
616639
617640 var card = $ ( '<div>' ) . addClass ( 'tool-card' ) [ 0 ] ;
641+ // 存储当前 runId,用于后续删除同一运行的消息
642+ if ( sess . currentRunId ) {
643+ card . setAttribute ( 'data-run-id' , sess . currentRunId ) ;
644+ }
618645 if ( window . cliPrintSimplified === false ) $ ( card ) . addClass ( 'expanded' ) ;
619646 card . innerHTML = '<div class="tool-card-header">'
620647 + '<span class="tool-status-icon loading"></span>'
@@ -800,6 +827,10 @@ function appendHitlCard(sess, toolName, command) {
800827 // 采用 tool-card 视觉体系:审批通过后原地复用为工具结果卡片
801828 var argsHtml = command ? '<span class="tool-args">' + escapeHtml ( command ) + '</span>' : '' ;
802829 var card = $ ( '<div>' ) . addClass ( 'tool-card hitl-pending expanded' ) [ 0 ] ;
830+ // 存储当前 runId,用于后续删除同一运行的消息
831+ if ( sess . currentRunId ) {
832+ card . setAttribute ( 'data-run-id' , sess . currentRunId ) ;
833+ }
803834 card . innerHTML = '<div class="tool-card-header">'
804835 + '<span class="tool-status-icon warn"><i class="layui-icon layui-icon-tips" style="font-size:13px"></i></span>'
805836 + '<span class="tool-name">\u9700\u8981\u6388\u6743\uff1a' + escapeHtml ( toolName || 'unknown' ) + '</span>'
0 commit comments