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:
+39
-9
@@ -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') {
|
||||
|
||||
Reference in New Issue
Block a user