refactor(dialogue): naturalize multi-role conversations, close chat sessions with assistant response, and set URS to project shared

This commit is contained in:
WeiCHEN
2026-09-11 09:42:58 +08:00
parent 4a4f2592b8
commit 82d7fe1cdc
3 changed files with 616 additions and 238 deletions
File diff suppressed because it is too large Load Diff
+19 -3
View File
@@ -5,7 +5,7 @@ import { markdownToBlockAST } from '../engine/markdownToBlock';
import { DeliverableItem } from '../types/workbench';
describe('用户上传文档私密归档与共享流转测试', () => {
it('10 个评审项目均包含私密 URS 交付物与 AST,且初始为张工私密文档', () => {
it('10 个评审项目均包含已共享的 URS 交付物与 AST,支持跨角色合规查阅且会话均以 assistant 闭环', () => {
assert.equal(seed.projects.length, 10);
seed.projects.forEach((proj: any) => {
const pid = proj.id;
@@ -14,13 +14,15 @@ describe('用户上传文档私密归档与共享流转测试', () => {
// 1. 检查 deliverables
const deliv = seed.deliverables.find((d: any) => d.projectId === pid && d.docId === expectedDocId);
assert.ok(deliv, `项目 ${pid} 必须存在 URS 交付物`);
assert.equal(deliv.category, 'private', '初始必须为私密文档');
assert.equal(deliv.space, 'my_private', '初始必须在个人私密空间');
assert.equal(deliv.category, 'shared', '张工上传后已共享至项目协作参考库');
assert.equal(deliv.space, 'project_shared', '必须在项目共享参考空间');
assert.equal(deliv.creatorId, 1, '编制人必须为张工 (id=1)');
// 2. 检查 documents (AST)
const doc = (seed.documents as any)[expectedDocId];
assert.ok(doc, `项目 ${pid} 必须存在 URS AST 文档`);
assert.equal(doc.category, 'shared');
assert.equal(doc.space, 'project_shared');
assert.ok(doc.markdown.length > 500, 'URS Markdown 必须包含详实的临床与工程标准内容');
assert.match(doc.markdown, /用户需求说明书|URS|GB 9706|临床痛点/);
@@ -30,6 +32,20 @@ describe('用户上传文档私密归档与共享流转测试', () => {
);
assert.ok(attachedMsg, `项目 ${pid} 第一轮对话必须包含带 docId 的 URS 附件`);
});
// 4. 验证会话终态:所有会话必须以 assistant 消息闭环
seed.sessions.forEach((sess: any) => {
const sessMsgs = seed.messages.filter((m: any) => m.sessionId === sess.sessionId);
assert.ok(sessMsgs.length > 0, `会话 ${sess.sessionId} 消息数不能为空`);
const lastMsg = sessMsgs[sessMsgs.length - 1];
assert.equal(lastMsg.role, 'assistant', `会话 ${sess.sessionId} 最后一条消息必须为 assistant 闭环回复`);
});
// 5. 验证自然语气:绝不能存在机械报号与生硬套话
seed.messages.forEach((m: any) => {
assert.ok(!m.content.includes('我是审核人李主管'), `不得出现生硬自我介绍: ${m.content}`);
assert.ok(!m.content.includes('我是批准人王总监'), `不得出现生硬自我介绍: ${m.content}`);
});
});
it('用户上传附件自动生成私密交付物并在 AST 中建立隔离,支持流转至项目参考库', () => {