feat: add fail-closed Aider development skill
This commit is contained in:
@@ -4,6 +4,7 @@ import {
|
||||
createAgentRunEventsHandler,
|
||||
createGetAgentRunHandler,
|
||||
createPostAgentRunsHandler,
|
||||
enforceSelectedSkillRuntime,
|
||||
} from './agent-run-routes.mjs';
|
||||
|
||||
function createResponseRecorder() {
|
||||
@@ -100,6 +101,102 @@ test('POST /agent/runs creates a run and returns 202', async () => {
|
||||
]);
|
||||
});
|
||||
|
||||
test('selected Aider development skill forces code mode, task type, and Aider executor', async () => {
|
||||
const userMessage = {
|
||||
role: 'user',
|
||||
content: [{ type: 'text', text: '修改页面并测试' }],
|
||||
metadata: {
|
||||
memindRun: {
|
||||
selectedChatSkill: 'aider-development',
|
||||
executor: 'openhands',
|
||||
validation: { expectedFile: '.memind/agent-runs/req-aider.json' },
|
||||
},
|
||||
},
|
||||
};
|
||||
const enforced = enforceSelectedSkillRuntime(userMessage, {
|
||||
rawToolMode: 'chat',
|
||||
taskType: 'page_data_dev_complex',
|
||||
});
|
||||
assert.equal(enforced.rawToolMode, 'code');
|
||||
assert.equal(enforced.taskType, 'h5_chat_code_task');
|
||||
assert.equal(enforced.requiredExecutor, 'aider');
|
||||
assert.equal(enforced.userMessage.metadata.memindRun.executor, 'aider');
|
||||
|
||||
const created = [];
|
||||
const handler = createPostAgentRunsHandler({
|
||||
userAuth: {
|
||||
async getUserSkills() {
|
||||
return { skills: { 'aider-development': true } };
|
||||
},
|
||||
},
|
||||
agentRunGateway: {
|
||||
async createRun(userId, payload) {
|
||||
created.push({ userId, payload });
|
||||
return { id: 'run-aider', status: 'queued' };
|
||||
},
|
||||
},
|
||||
codeRunsEnabled: true,
|
||||
requireCodeRunValidation: true,
|
||||
});
|
||||
const res = createResponseRecorder();
|
||||
await handler(
|
||||
{
|
||||
currentUser: { id: 'user-1' },
|
||||
body: {
|
||||
request_id: 'req-aider',
|
||||
user_message: userMessage,
|
||||
tool_mode: 'chat',
|
||||
task_type: 'page_data_dev_complex',
|
||||
},
|
||||
},
|
||||
res,
|
||||
);
|
||||
|
||||
assert.equal(res.statusCode, 202);
|
||||
assert.equal(created[0].payload.toolMode, 'code');
|
||||
assert.equal(created[0].payload.taskType, 'h5_chat_code_task');
|
||||
assert.equal(created[0].payload.userMessage.metadata.memindRun.executor, 'aider');
|
||||
});
|
||||
|
||||
test('selected Aider development skill fails closed when code runs are disabled', async () => {
|
||||
const handler = createPostAgentRunsHandler({
|
||||
userAuth: {
|
||||
async getUserSkills() {
|
||||
return { skills: { 'aider-development': true } };
|
||||
},
|
||||
},
|
||||
agentRunGateway: {
|
||||
async createRun() {
|
||||
throw new Error('must not fall back to a normal run');
|
||||
},
|
||||
},
|
||||
codeRunsEnabled: false,
|
||||
});
|
||||
const res = createResponseRecorder();
|
||||
await handler(
|
||||
{
|
||||
currentUser: { id: 'user-1' },
|
||||
body: {
|
||||
request_id: 'req-aider-disabled',
|
||||
user_message: {
|
||||
role: 'user',
|
||||
content: [{ type: 'text', text: '修复代码' }],
|
||||
metadata: {
|
||||
memindRun: {
|
||||
selectedChatSkill: 'aider-development',
|
||||
validation: { expectedFile: '.memind/agent-runs/req-aider-disabled.json' },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
res,
|
||||
);
|
||||
|
||||
assert.equal(res.statusCode, 403);
|
||||
assert.match(res.body.message, /代码任务灰度未开启/);
|
||||
});
|
||||
|
||||
test('POST /agent/runs forwards deep reasoning flag to the run gateway', async () => {
|
||||
const created = [];
|
||||
const handler = createPostAgentRunsHandler({
|
||||
|
||||
Reference in New Issue
Block a user