When the user refers to the current document, keep task_key/doc_id on the selected registered doc_proj instead of rerouting by domain keywords. Co-authored-by: Cursor <cursoragent@cursor.com>
102 lines
3.5 KiB
TypeScript
102 lines
3.5 KiB
TypeScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { buildTaskRequest, buildResumeRequest } from './taskStream';
|
|
|
|
test('buildTaskRequest: maps five project fields + task_key + user identity', () => {
|
|
const req = buildTaskRequest({
|
|
taskKey: 'feasibility_reg',
|
|
projectName: '超声主机系统',
|
|
customerName: '北京水木东方',
|
|
deviceType: '超声吸引刀',
|
|
intendedUse: '外科手术导航',
|
|
targetMarket: '国内',
|
|
userId: 1,
|
|
projectId: 7,
|
|
});
|
|
assert.equal(req.task_key, 'feasibility_reg');
|
|
assert.equal(req.project_name, '超声主机系统');
|
|
assert.equal(req.customer_name, '北京水木东方');
|
|
assert.equal(req.device_type, '超声吸引刀');
|
|
assert.equal(req.intended_use, '外科手术导航');
|
|
assert.equal(req.target_market, '国内');
|
|
assert.equal(req.user_id, 1);
|
|
assert.equal(req.project_id, 7);
|
|
assert.equal('work_dir' in req, false);
|
|
});
|
|
|
|
test('buildTaskRequest: omits optional fields when absent', () => {
|
|
const req = buildTaskRequest({
|
|
taskKey: 'intake',
|
|
projectName: 'P',
|
|
customerName: 'C',
|
|
deviceType: 'D',
|
|
});
|
|
assert.equal('intended_use' in req, false);
|
|
assert.equal('target_market' in req, false);
|
|
assert.equal('user_id' in req, false);
|
|
assert.equal('project_id' in req, false);
|
|
assert.equal('materials' in req, false);
|
|
});
|
|
|
|
test('buildTaskRequest: includes materials when provided and non-empty', () => {
|
|
const req = buildTaskRequest({
|
|
taskKey: 'intake',
|
|
projectName: 'P',
|
|
customerName: 'C',
|
|
deviceType: 'D',
|
|
materials: [
|
|
{ filename: 'doc1.txt', content: 'b64content==' },
|
|
],
|
|
});
|
|
assert.equal('materials' in req, true);
|
|
assert.deepEqual(req.materials, [{ filename: 'doc1.txt', content: 'b64content==' }]);
|
|
});
|
|
|
|
test('buildResumeRequest: adds work_dir on top of task request', () => {
|
|
const req = buildResumeRequest(
|
|
{ taskKey: 'feasibility_reg', projectName: 'P', customerName: 'C', deviceType: 'D', userId: 2 },
|
|
'/tmp/ws-x'
|
|
);
|
|
assert.equal(req.work_dir, '/tmp/ws-x');
|
|
assert.equal(req.task_key, 'feasibility_reg');
|
|
assert.equal(req.user_id, 2);
|
|
assert.equal('add_steps' in req, false);
|
|
});
|
|
|
|
test('buildTaskRequest: canonicalizes legacy doc-p doc_id', () => {
|
|
const req = buildTaskRequest({
|
|
taskKey: 'research',
|
|
projectName: 'P',
|
|
customerName: 'C',
|
|
deviceType: 'D',
|
|
projectId: 56,
|
|
docId: 'doc-p56-research',
|
|
});
|
|
assert.equal(req.doc_id, 'doc_proj56_research');
|
|
});
|
|
|
|
test('buildTaskRequest: UI-05 pinned intake keeps task_key + doc_proj6109_intake', () => {
|
|
const req = buildTaskRequest({
|
|
taskKey: 'intake',
|
|
projectName: 'P',
|
|
customerName: 'C',
|
|
deviceType: 'D',
|
|
projectId: 6109,
|
|
docId: 'doc_proj6109_intake',
|
|
userMessage:
|
|
'请按 YY/T、GB 9706.1 与 NMPA 注册法规要求,大幅改写当前受控文档中的风险管理与电气安全章节,引用具体条款并重写适用性结论(二轮高风险候选-确认用例)。',
|
|
});
|
|
assert.equal(req.task_key, 'intake');
|
|
assert.equal(req.doc_id, 'doc_proj6109_intake');
|
|
assert.equal(req.project_id, 6109);
|
|
});
|
|
|
|
test('buildResumeRequest: forwards add_steps when provided', () => {
|
|
const req = buildResumeRequest(
|
|
{ taskKey: 'intake', projectName: 'P', customerName: 'C', deviceType: 'D' },
|
|
'/tmp/ws-y',
|
|
[{ id: 'step_dyn_1', role: 'regulatory', title: '补充条款' }]
|
|
);
|
|
assert.equal(req.work_dir, '/tmp/ws-y');
|
|
assert.deepEqual(req.add_steps, [{ id: 'step_dyn_1', role: 'regulatory', title: '补充条款' }]);
|
|
}); |