Skip to content

Commit 38b4dff

Browse files
author
SolonCode
committed
优化重新运行命令,基于runId删除同一运行的所有UI元素;添加runId跟踪到消息和工具卡片。
1 parent de5baba commit 38b4dff

2 files changed

Lines changed: 39 additions & 3 deletions

File tree

soloncode-cli/src/main/resources/static/js/app-message.js

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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>'

soloncode-cli/src/main/resources/static/js/app-streaming.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,11 @@ function onWebChunk(sess, chunk) {
161161

162162
removeInlineThinking(sess);
163163

164+
// 存储当前 chunk 的 runId,用于后续消息渲染
165+
if (chunk.runId) {
166+
sess.currentRunId = chunk.runId;
167+
}
168+
164169
switch (chunk.type) {
165170
case 'command': finishThinkingBlock(sess); finishPendingTool(sess); appendCommandOutput(sess, chunk.text); break;
166171
case 'rewind': finishThinkingBlock(sess); finishPendingTool(sess); handleRewind(sess, parseInt(chunk.text) || 1); break;

0 commit comments

Comments
 (0)