test: harden remote control stress flow

This commit is contained in:
AI Bot
2026-05-11 23:12:47 +08:00
parent a311280238
commit 9c8ffebb92
7 changed files with 884 additions and 40 deletions

View File

@@ -0,0 +1,100 @@
function trimToUndefined(value) {
return typeof value === "string" && value.trim() ? value.trim() : undefined;
}
function normalizeCompletionStatus(status) {
if (status === "failed") return "failed";
if (status === "needs_user_action") return "needs_user_action";
return "completed";
}
function normalizeStringArray(value) {
return Array.isArray(value)
? value.map((item) => String(item).trim()).filter(Boolean)
: undefined;
}
export function buildRemoteExecutionCompletionPayload(task, payload) {
return {
taskId: task.taskId,
status: normalizeCompletionStatus(payload.status),
requestId: trimToUndefined(payload.requestId),
replyBody: trimToUndefined(payload.replyBody),
errorMessage: trimToUndefined(payload.errorMessage),
kind: trimToUndefined(payload.kind),
dialogId: trimToUndefined(payload.dialogId),
appName: trimToUndefined(payload.appName),
platform: trimToUndefined(payload.platform),
risk: trimToUndefined(payload.risk),
summary: trimToUndefined(payload.summary),
recommendedAction: trimToUndefined(payload.recommendedAction),
availableActions: normalizeStringArray(payload.availableActions),
dispatchExecutionId: trimToUndefined(payload.dispatchExecutionId),
targetProjectId: trimToUndefined(payload.targetProjectId),
targetThreadId: trimToUndefined(payload.targetThreadId),
targetUrl: trimToUndefined(payload.targetUrl),
targetApp: trimToUndefined(payload.targetApp),
rawThreadReply: trimToUndefined(payload.rawThreadReply),
executionProgress:
payload.executionProgress && typeof payload.executionProgress === "object"
? payload.executionProgress
: undefined,
};
}
export function buildComputerUseCompletionPayload(task, result) {
if (result?.status === "needs_user_action") {
return buildRemoteExecutionCompletionPayload(task, {
status: "needs_user_action",
requestId: result.requestId,
kind: result.kind,
dialogId: result.dialogId,
appName: result.appName,
platform: result.platform,
risk: result.risk,
summary: result.summary,
recommendedAction: result.recommendedAction,
availableActions: result.availableActions,
dispatchExecutionId: task.dispatchExecutionId,
targetProjectId: task.targetProjectId,
targetThreadId: task.targetThreadId,
targetApp: result.targetApp ?? result.appName,
});
}
return buildRemoteExecutionCompletionPayload(task, {
status: result?.status === "failed" ? "failed" : "completed",
requestId: result?.requestId,
replyBody: result?.replyBody,
errorMessage: result?.errorMessage,
dispatchExecutionId: task.dispatchExecutionId,
targetProjectId: task.targetProjectId,
targetThreadId: task.targetThreadId,
targetApp: result?.targetApp,
});
}
export function buildMasterAgentTaskCompletionRequestBody(config, payload) {
return {
deviceId: config.deviceId,
status: payload.status,
replyBody: payload.replyBody,
errorMessage: payload.errorMessage,
requestId: payload.requestId,
kind: payload.kind,
dialogId: payload.dialogId,
appName: payload.appName,
platform: payload.platform,
risk: payload.risk,
summary: payload.summary,
recommendedAction: payload.recommendedAction,
availableActions: payload.availableActions,
dispatchExecutionId: payload.dispatchExecutionId,
targetProjectId: payload.targetProjectId,
targetThreadId: payload.targetThreadId,
targetUrl: payload.targetUrl,
targetApp: payload.targetApp,
rawThreadReply: payload.rawThreadReply,
executionProgress: payload.executionProgress,
};
}