batch E: close tail checks and refresh smoke evidence

This commit is contained in:
lix-2026
2026-05-21 17:15:28 +08:00
parent 1e8f5c5816
commit cc91a56603
16 changed files with 1093 additions and 45 deletions
@@ -1,5 +1,6 @@
use crate::app::{AppConfig, AppState};
use crate::context::RequestContext;
use crate::document_buffer_store::{self};
use crate::error::WebError;
use crate::page_aggregate::PageAggregate;
use crate::routes::documents::{
@@ -69,6 +70,25 @@ pub async fn document_page_shell(
primary_root_uri,
)
.await?;
// 初始化 BufferStorelocal_folder 文档打开时记录 file_version
if primary_source_kind == Some("local_folder") {
if let Some(root_uri) = primary_root_uri {
let relative_path = document_id
.strip_prefix("local-md:")
.unwrap_or("")
.replace("~2F", "/");
let file_version = aggregate.body.file_version.as_str().map(|s| s.to_string());
let ws_path = document_buffer_store::build_local_folder_workspace_path(
&aggregate.identity.workspace_id,
root_uri,
&relative_path,
&document_id,
);
state.buffer_store.init_buffer(&ws_path, file_version, None);
}
}
let title = aggregate.head.title.as_str();
let workspace_id = aggregate.identity.workspace_id.clone();
let requested_secondary_document_id =
@@ -1552,6 +1572,8 @@ pub(crate) fn render_editor_island_adapter_script() -> &'static str {
workspaceId: session.workspaceId,
viewCount: session.views.size,
status: session.status,
lastExternalConflictEnvelope: session.lastExternalConflictEnvelope || null,
dirtyState: session.dirty ? 'Dirty' : (session.hasExternalConflict ? 'ExternalModified' : 'Clean'),
})),
localFolderChannelCount: localFolderEventRegistry.size,
localFolderRoots: Array.from(localFolderEventRegistry.keys()),
@@ -1782,6 +1804,25 @@ pub(crate) fn render_editor_island_adapter_script() -> &'static str {
return sourceLabel ? `${baseMessage}(来源:${sourceLabel}` : baseMessage;
};
const ensureSessionConflictEnvelope = (session, message) => {
if (!session) return null;
if (session.lastExternalConflictEnvelope) return session.lastExternalConflictEnvelope;
const envelope = {
code: 'local_markdown_external_change',
documentId: session.documentId,
rootUri: session.rootUri || null,
currentDiskVersion: session.conflictDetectionKey || session.fileVersion || null,
editorBaseVersion: session.lastExternalConflictDetectionKey || session.conflictDetectionKey || session.fileVersion || null,
externalActor: session.lastExternalWriteSource || null,
dirtyState: session.dirty ? 'Dirty' : (session.hasExternalConflict ? 'ExternalModified' : 'Clean'),
bufferFileVersion: session.fileVersion || session.conflictDetectionKey || null,
message: message || externalConflictMessage,
suggestedActions: ['accept_disk', 'keep_editor', 'open_diff', 'merge'],
};
session.lastExternalConflictEnvelope = envelope;
return envelope;
};
const clearSessionConflictSurface = (session) => {
sessionViews(session).forEach((view) => {
const host = view.runtimeDescriptor.root.closest('.document-pane') || view.runtimeDescriptor.root;
@@ -2047,6 +2088,7 @@ pub(crate) fn render_editor_island_adapter_script() -> &'static str {
const markSessionExternalConflict = (session, message) => {
session.externalChangePending = false;
ensureSessionConflictEnvelope(session, message);
session.hasExternalConflict = true;
if (session.saveTimer) {
window.clearTimeout(session.saveTimer);