feat(cursor): wire executor through portal, admin, and wechat routes

Register cursor in LLM executor bindings, route page/code tasks through
cursor runtime selection, and bootstrap wechat cursor policy services.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
john
2026-08-27 09:33:47 +08:00
parent a29e1ec5c8
commit ad6dcc283f
17 changed files with 343 additions and 16 deletions
+39 -9
View File
@@ -23,6 +23,8 @@ import {
} from './agent-run-stream.mjs';
import { wrapRunStreamPayload, writeSseErrorAndEnd } from './sse-event-taxonomy.mjs';
import { resolveGoalBindingForAgentRun } from './goal-run-resolve.mjs';
import { enforcePageGenerationCursorRuntime } from './cursor-page-routing.mjs';
import { resolvePreferredCodeExecutor } from './cursor-agent-launch.mjs';
function envFlag(value) {
return ['1', 'true', 'yes', 'on'].includes(String(value ?? '').trim().toLowerCase());
@@ -160,12 +162,13 @@ export function enforceSelectedSkillRuntime(userMessage, {
: {};
const taskText = extractAiderDevelopmentTask(userMessage);
const requiresPageDataBuild = isPageDataIntent(taskText);
const codeExecutor = resolvePreferredCodeExecutor();
metadata.memindRun = {
...runMetadata,
selectedChatSkill: AIDER_DEVELOPMENT_SKILL_NAME,
...(requiresPageDataBuild
? { reviewExecutor: 'aider', pageDataAiderWorkflow: true }
: { executor: 'aider' }),
: { executor: codeExecutor }),
};
if (requiresPageDataBuild) delete metadata.memindRun.executor;
return {
@@ -174,7 +177,7 @@ export function enforceSelectedSkillRuntime(userMessage, {
: { ...message, metadata },
rawToolMode: requiresPageDataBuild ? 'chat' : 'code',
taskType: requiresPageDataBuild ? null : 'h5_chat_code_task',
requiredExecutor: requiresPageDataBuild ? null : 'aider',
requiredExecutor: requiresPageDataBuild ? null : codeExecutor,
requiredReviewExecutor: requiresPageDataBuild ? 'aider' : null,
};
}
@@ -253,15 +256,35 @@ export function createPostAgentRunsHandler({
userMessage = selectedSkillRuntime.userMessage;
rawToolMode = selectedSkillRuntime.rawToolMode;
taskType = selectedSkillRuntime.taskType;
let requiredExecutor = selectedSkillRuntime.requiredExecutor ?? null;
let requiredReviewExecutor = selectedSkillRuntime.requiredReviewExecutor ?? null;
if (!requiredExecutor && !requiredReviewExecutor) {
const pageCursorRuntime = enforcePageGenerationCursorRuntime(userMessage, {
rawToolMode,
taskType,
forceDeepReasoning,
env: process.env,
});
userMessage = pageCursorRuntime.userMessage;
rawToolMode = pageCursorRuntime.rawToolMode;
taskType = pageCursorRuntime.taskType;
if (pageCursorRuntime.requiredExecutor) {
requiredExecutor = pageCursorRuntime.requiredExecutor;
}
}
if (
(selectedSkillRuntime.requiredExecutor || selectedSkillRuntime.requiredReviewExecutor) &&
(requiredExecutor || requiredReviewExecutor) &&
selectedChatSkill(userMessage) === AIDER_DEVELOPMENT_SKILL_NAME &&
!extractAiderDevelopmentTask(userMessage)
) {
response.status(400).json({ message: '请输入需要 Aider 执行的具体开发任务' });
return;
}
if (
(selectedSkillRuntime.requiredExecutor || selectedSkillRuntime.requiredReviewExecutor) &&
(requiredExecutor || requiredReviewExecutor) &&
selectedChatSkill(userMessage) === AIDER_DEVELOPMENT_SKILL_NAME &&
userAuth?.getUserSkills
) {
const skillState = await userAuth.getUserSkills(request.currentUser.id);
@@ -279,9 +302,9 @@ export function createPostAgentRunsHandler({
});
return;
}
if (toolMode === 'code' || selectedSkillRuntime.requiredReviewExecutor) {
if (toolMode === 'code' || requiredReviewExecutor) {
const codeRunPolicy = await resolveCodeRunPolicy(request.currentUser.id);
const policyTaskType = selectedSkillRuntime.requiredReviewExecutor
const policyTaskType = requiredReviewExecutor
? 'h5_chat_code_task'
: taskType;
if (!codeRunPolicy.enabled) {
@@ -305,7 +328,12 @@ export function createPostAgentRunsHandler({
response.status(403).json({ message: '当前代码任务类型未开启灰度' });
return;
}
if (codeRunPolicy.requireValidation && !hasExpectedFileValidation(userMessage)) {
if (
codeRunPolicy.requireValidation
&& !hasExpectedFileValidation(userMessage)
&& !userMessage?.metadata?.memindRun?.pageCursorDefault
&& !userMessage?.metadata?.memindRun?.cursorAgentDefault
) {
response.status(400).json({ message: '代码任务必须声明产物校验规则' });
return;
}
@@ -372,10 +400,12 @@ export function createPostAgentRunsHandler({
response.status(202).json({ run });
} catch (err) {
if (err?.code === 'SESSION_RUN_CONFLICT') {
response.status(409).json({
const payload = {
message: err.message,
code: 'SESSION_RUN_CONFLICT',
});
};
if (err.existingRunId) payload.existingRunId = err.existingRunId;
response.status(409).json(payload);
return;
}
if (err?.code === 'GOAL_RUN_NOT_FOUND') {