feat: 支持 AI 设计项目多会话交互

需求:用户可在同一设计项目中新建和切换会话,任务列表保持项目级共享。

实现:
- 增加会话选择、新建入口及本地数据迁移
- Conversation 独立消息、Brief、Quote 与流式状态
- 保留项目任务并修复 Task revision 与 ABA 异步竞态
- 保持 Enter 发送、Shift+Enter 换行及 IME 保护
This commit is contained in:
2026-08-06 18:22:15 +08:00
parent 4980894017
commit 03dae62cf3
18 changed files with 1810 additions and 702 deletions

View File

@@ -87,7 +87,7 @@ describe('local AI design workspace', () => {
const reloaded = new LocalImageWorkspace({ userDataDir });
await expect(reloaded.bootstrap()).resolves.toMatchObject({
workspaces: [{ title: '角色设计第二版', turnRevision: 0, viewRevision: 1 }],
workspaces: [{ title: '角色设计第二版', conversationCount: 1, viewRevision: 1 }],
});
});
@@ -97,8 +97,10 @@ describe('local AI design workspace', () => {
clientWorkspaceId: 'client-flow',
title: '海洋公益海报',
});
const conversationId = created.conversations[0].conversationId;
const discussed = await service.submitMessage({
workspaceId: created.workspaceId,
conversationId,
clientTurnId: 'turn-one',
expectedTurnRevision: 0,
message: '做一张保护海洋的竖版公益海报',
@@ -111,6 +113,7 @@ describe('local AI design workspace', () => {
const confirmed = await service.confirmGeneration({
workspaceId: created.workspaceId,
conversationId,
clientTurnId: 'turn-two',
expectedTurnRevision: 1,
quoteId: quote!.quoteId,
@@ -141,15 +144,17 @@ describe('local AI design workspace', () => {
clientWorkspaceId: 'client-reset',
title: '可重置项目',
});
const conversationId = created.conversations[0].conversationId;
await expect(service.submitMessage({
workspaceId: created.workspaceId,
conversationId,
clientTurnId: 'stale-turn',
expectedTurnRevision: 3,
message: '测试',
})).rejects.toMatchObject<LocalImageWorkspaceError>({
status: 409,
code: 'workspace_revision_conflict',
code: 'conversation_revision_conflict',
});
expect(existsSync(getLocalImageWorkspaceDirectory(userDataDir))).toBe(true);