feat: add fail-closed Aider development skill

This commit is contained in:
john
2026-07-24 19:48:04 +08:00
parent 1c82b34ad9
commit be9c25f1d0
15 changed files with 320 additions and 7 deletions
+97
View File
@@ -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({