fix: 修复 AI 设计任务栏同步与独立滚动

问题:生成任务未及时出现在右侧栏,任务区与会话区还会共享外层滚动。

实现:补齐 Agent 回合与 Quote 确认后的任务同步,锁定左右滚动容器并增加桌面布局和异步任务回归测试。
This commit is contained in:
2026-08-01 23:12:24 +08:00
parent 592bdfbc70
commit 83e21563dc
3 changed files with 118 additions and 8 deletions

View File

@@ -45,6 +45,12 @@ type ImageWorkspaceState = {
};
let inFlightLoad: Promise<DesignWorkspaceBootstrap | null> | null = null;
const GENERATION_TASK_SYNC_ATTEMPTS = 20;
const GENERATION_TASK_SYNC_DELAY_MS = 500;
function wait(milliseconds: number): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, milliseconds));
}
function unavailable(error: unknown): boolean {
return error instanceof ImageWorkspaceApiError
@@ -107,6 +113,21 @@ export const useImageWorkspaceStore = create<ImageWorkspaceState>((set, get) =>
return workspace;
};
const waitForGenerationTask = async (
workspaceId: string,
quoteId: string,
): Promise<DesignGenerationTask[]> => {
for (let attempt = 0; attempt < GENERATION_TASK_SYNC_ATTEMPTS; attempt += 1) {
if (get().activeWorkspaceId !== workspaceId) return [];
const tasks = await get().refreshTasks().catch(() => []);
if (tasks.some((task) => task.quoteId === quoteId)) return tasks;
if (attempt < GENERATION_TASK_SYNC_ATTEMPTS - 1) {
await wait(GENERATION_TASK_SYNC_DELAY_MS);
}
}
throw new Error('生成请求已确认,但任务列表尚未同步,请点击刷新重试');
};
const loadWorkspace = async (workspaceId: string): Promise<void> => {
const [workspace, tasks] = await Promise.all([
fetchImageWorkspaceProject(workspaceId),
@@ -251,11 +272,13 @@ export const useImageWorkspaceStore = create<ImageWorkspaceState>((set, get) =>
const workspace = get().workspace;
if (!workspace) throw new Error('请先选择设计项目');
try {
return applyWorkspace(await sendImageWorkspaceMessage(
const updated = applyWorkspace(await sendImageWorkspaceMessage(
workspace.workspaceId,
workspace.turnRevision,
message,
));
await get().refreshTasks().catch(() => []);
return updated;
} catch (error) {
set({ error: handleRequestError(error) });
return await recoverRevisionConflict(error);
@@ -271,7 +294,7 @@ export const useImageWorkspaceStore = create<ImageWorkspaceState>((set, get) =>
workspace.turnRevision,
quoteId,
));
await get().refreshTasks().catch(() => []);
await waitForGenerationTask(workspace.workspaceId, quoteId);
return updated;
} catch (error) {
set({ error: handleRequestError(error) });