feat: 完善智能体图片聊天与会话恢复

- 增加私有图片上传、绑定、历史回显与生命周期清理

- 支持输入草稿恢复、图片交互和模型图片能力约束

- 修复旧脏会话幂等删除与前端会话恢复
This commit is contained in:
2026-07-17 19:54:26 +08:00
parent 62d763199f
commit 1e6158be77
62 changed files with 5333 additions and 189 deletions

View File

@@ -0,0 +1,62 @@
import { nextTick, watchEffect } from 'vue';
import { afterEach, describe, expect, it, vi } from 'vitest';
import { useChatImageUploads } from './useChatImageUploads';
const mediaApi = vi.hoisted(() => ({
deleteAgentChatImage: vi.fn(),
uploadAgentChatImage: vi.fn(),
}));
vi.mock('./mediaApi', () => mediaApi);
describe('useChatImageUploads', () => {
afterEach(() => {
vi.restoreAllMocks();
mediaApi.deleteAgentChatImage.mockReset();
mediaApi.uploadAgentChatImage.mockReset();
});
it('reactively exposes the ready state after upload', async () => {
let resolveUpload: (value: any) => void = () => undefined;
mediaApi.uploadAgentChatImage.mockReturnValue(
new Promise((resolve) => {
resolveUpload = resolve;
}),
);
vi.spyOn(URL, 'createObjectURL').mockReturnValue('blob:test-image');
vi.spyOn(URL, 'revokeObjectURL').mockImplementation(() => undefined);
const uploads = useChatImageUploads();
const observedStatuses: (string | undefined)[] = [];
const stop = watchEffect(() => {
observedStatuses.push(uploads.items.value[0]?.status);
});
const pending = uploads.addFiles(
[new File(['image'], 'test.png', { type: 'image/png' })],
{ agentId: 'agent-1', mode: 'FORMAL', sessionId: 'session-1' },
);
await nextTick();
resolveUpload({
data: {
height: 1,
mimeType: 'image/png',
name: 'test.png',
previewUrl: '/api/v1/agent/media/content?reference=draft%3Atest',
size: 5,
uploadId: 'upload-1',
width: 1,
},
errorCode: 0,
});
await pending;
await nextTick();
stop();
expect(observedStatuses).toContain('uploading');
expect(observedStatuses.at(-1)).toBe('ready');
expect(uploads.uploadIds.value).toEqual(['upload-1']);
});
});