fix: keep compression toast persistent and align summary layout

This commit is contained in:
JOJO 2026-04-06 17:09:36 +08:00
parent bc939a0098
commit b29e6a67f8
6 changed files with 59 additions and 5 deletions

View File

@ -130,7 +130,15 @@ async def _generate_summary(web_terminal, prompt: str, retries: int = 5) -> Tupl
return f"生成总结失败({last_reason or '未知原因'}", last_reason return f"生成总结失败({last_reason or '未知原因'}", last_reason
def _write_compact_file(project_path: Path, *, compression_index: int, summary_text: str, user_inputs: List[str], last_tools: List[Dict[str, Any]]) -> str: def _write_compact_file(
project_path: Path,
*,
compression_index: int,
summary_text: str,
user_inputs: List[str],
last_tools: List[Dict[str, Any]],
latest_user_input: str,
) -> str:
compact_dir = project_path / "compact_result" compact_dir = project_path / "compact_result"
compact_dir.mkdir(parents=True, exist_ok=True) compact_dir.mkdir(parents=True, exist_ok=True)
filename = f"compact_{datetime.now().strftime('%Y%m%d_%H%M%S')}_{compression_index:03d}.md" filename = f"compact_{datetime.now().strftime('%Y%m%d_%H%M%S')}_{compression_index:03d}.md"
@ -166,6 +174,11 @@ def _write_compact_file(project_path: Path, *, compression_index: int, summary_t
]) ])
else: else:
lines.append("- (无)") lines.append("- (无)")
lines.extend(["", "## 用户最新的一次输入"])
if (latest_user_input or "").strip():
lines.append(latest_user_input.strip())
else:
lines.append("(无)")
file_path.write_text("\n".join(lines).strip() + "\n", encoding="utf-8") file_path.write_text("\n".join(lines).strip() + "\n", encoding="utf-8")
return str(file_path.relative_to(project_path)) return str(file_path.relative_to(project_path))
@ -226,6 +239,7 @@ async def run_deep_compression(
messages = conv_data.get("messages") or [] messages = conv_data.get("messages") or []
user_inputs = _collect_user_texts(messages) user_inputs = _collect_user_texts(messages)
latest_user_input = user_inputs[-1] if user_inputs else ""
last_tools = _collect_last_tool_entries(messages, limit=5, max_content_chars=3000) last_tools = _collect_last_tool_entries(messages, limit=5, max_content_chars=3000)
relative_compact_path = _write_compact_file( relative_compact_path = _write_compact_file(
Path(workspace.project_path), Path(workspace.project_path),
@ -233,6 +247,7 @@ async def run_deep_compression(
summary_text=summary_text, summary_text=summary_text,
user_inputs=user_inputs, user_inputs=user_inputs,
last_tools=last_tools, last_tools=last_tools,
latest_user_input=latest_user_input,
) )
cm.set_compression_state( cm.set_compression_state(

View File

@ -235,6 +235,10 @@ export const conversationMethods = {
this.compressing = false; this.compressing = false;
this.compressionMode = ''; this.compressionMode = '';
this.compressionStage = ''; this.compressionStage = '';
if (this.compressionToastId) {
this.uiDismissToast(this.compressionToastId);
this.compressionToastId = null;
}
} }
// 应用个性化设置中的默认模型和思考模式 // 应用个性化设置中的默认模型和思考模式
@ -400,6 +404,10 @@ export const conversationMethods = {
this.compressing = false; this.compressing = false;
this.compressionMode = ''; this.compressionMode = '';
this.compressionStage = ''; this.compressionStage = '';
if (this.compressionToastId) {
this.uiDismissToast(this.compressionToastId);
this.compressionToastId = null;
}
} }
debugLog('创建新对话...'); debugLog('创建新对话...');

View File

@ -456,11 +456,16 @@ export const messageMethods = {
this.compressionMode = 'manual'; this.compressionMode = 'manual';
this.compressionStage = 'requesting'; this.compressionStage = 'requesting';
this.compressionError = ''; this.compressionError = '';
this.uiPushToast({ if (this.compressionToastId) {
this.uiDismissToast(this.compressionToastId);
this.compressionToastId = null;
}
this.compressionToastId = this.uiPushToast({
title: '压缩中', title: '压缩中',
message: '对话正在压缩,请稍候…', message: '对话正在压缩,请稍候…',
type: 'info', type: 'info',
duration: 2500 duration: null,
closable: false
}); });
try { try {
@ -526,6 +531,10 @@ export const messageMethods = {
type: 'error' type: 'error'
}); });
} finally { } finally {
if (this.compressionToastId) {
this.uiDismissToast(this.compressionToastId);
this.compressionToastId = null;
}
this.compressing = false; this.compressing = false;
this.compressionInProgress = false; this.compressionInProgress = false;
this.compressionMode = ''; this.compressionMode = '';

View File

@ -946,19 +946,32 @@ export const taskPollingMethods = {
this.compressionStage = data.stage || ''; this.compressionStage = data.stage || '';
if (this.compressionInProgress && !wasInProgress) { if (this.compressionInProgress && !wasInProgress) {
const modeLabel = this.compressionMode === 'manual' ? '手动' : '自动'; const modeLabel = this.compressionMode === 'manual' ? '手动' : '自动';
this.uiPushToast({ if (this.compressionToastId) {
this.uiDismissToast(this.compressionToastId);
this.compressionToastId = null;
}
this.compressionToastId = this.uiPushToast({
title: '压缩中', title: '压缩中',
message: `对话正在${modeLabel}压缩,请稍候…`, message: `对话正在${modeLabel}压缩,请稍候…`,
type: 'info', type: 'info',
duration: 2600 duration: null,
closable: false
}); });
} }
if (!this.compressionInProgress) { if (!this.compressionInProgress) {
this.compressionError = data.error || ''; this.compressionError = data.error || '';
if (this.compressionToastId) {
this.uiDismissToast(this.compressionToastId);
this.compressionToastId = null;
}
} }
}, },
async handleCompressionFinished(data: any) { async handleCompressionFinished(data: any) {
if (this.compressionToastId) {
this.uiDismissToast(this.compressionToastId);
this.compressionToastId = null;
}
this.compressionInProgress = false; this.compressionInProgress = false;
this.compressionMode = ''; this.compressionMode = '';
this.compressionStage = ''; this.compressionStage = '';

View File

@ -44,6 +44,7 @@ export function dataState() {
compressionMode: '', compressionMode: '',
compressionStage: '', compressionStage: '',
compressionError: '', compressionError: '',
compressionToastId: null,
skipConversationLoadedEvent: false, skipConversationLoadedEvent: false,
skipConversationHistoryReload: false, skipConversationHistoryReload: false,
_scrollListenerReady: false, _scrollListenerReady: false,

View File

@ -607,6 +607,14 @@ watch(() => props.actions, () => {
padding: 0 6px 0 6px; padding: 0 6px 0 6px;
} }
/* 桌面端与正式文本输出左边距保持一致text-content: 0 20px 0 15px */
@media (min-width: 769px) {
.summary-line-text,
.steps-container {
padding: 0 20px 0 15px;
}
}
.steps-wrapper { .steps-wrapper {
overflow: hidden; overflow: hidden;
min-height: 0; min-height: 0;