Files
boss/tests/local-agent-master-task-completion.test.mjs
2026-05-11 23:12:47 +08:00

70 lines
2.5 KiB
JavaScript

import test from "node:test";
import assert from "node:assert/strict";
import {
buildComputerUseCompletionPayload,
buildMasterAgentTaskCompletionRequestBody,
buildRemoteExecutionCompletionPayload,
} from "../local-agent/master-task-completion.mjs";
test("computer use needs_user_action is preserved for server dialog guard completion", () => {
const task = {
taskId: "desktop-task-dialog",
taskType: "desktop_control",
projectId: "master-agent",
targetThreadId: "thread-1",
dispatchExecutionId: "dispatch-1",
};
const runtimeResult = {
status: "needs_user_action",
requestId: "runtime-request-1",
kind: "dialog_intervention_required",
dialogId: "dialog-permission-1",
appName: "System Settings",
platform: "darwin",
risk: "high",
summary: "System Settings 弹窗需要用户确认。",
recommendedAction: "handled_on_device",
availableActions: ["handled_on_device", "cancel_task"],
};
const completion = buildComputerUseCompletionPayload(task, runtimeResult);
assert.equal(completion.status, "needs_user_action");
assert.equal(completion.taskId, "desktop-task-dialog");
assert.equal(completion.kind, "dialog_intervention_required");
assert.equal(completion.dialogId, "dialog-permission-1");
assert.equal(completion.summary, "System Settings 弹窗需要用户确认。");
assert.deepEqual(completion.availableActions, ["handled_on_device", "cancel_task"]);
const requestBody = buildMasterAgentTaskCompletionRequestBody(
{ deviceId: "mac-studio" },
completion,
);
assert.equal(requestBody.deviceId, "mac-studio");
assert.equal(requestBody.status, "needs_user_action");
assert.equal(requestBody.kind, "dialog_intervention_required");
assert.equal(requestBody.dialogId, "dialog-permission-1");
assert.equal(requestBody.appName, "System Settings");
assert.equal(requestBody.platform, "darwin");
assert.equal(requestBody.risk, "high");
assert.deepEqual(requestBody.availableActions, ["handled_on_device", "cancel_task"]);
});
test("remote execution completion payload does not coerce waiting state into completed", () => {
const payload = buildRemoteExecutionCompletionPayload(
{ taskId: "desktop-task-dialog" },
{
status: "needs_user_action",
requestId: "runtime-request-2",
kind: "dialog_intervention_required",
dialogId: "dialog-2",
summary: "需要确认。",
},
);
assert.equal(payload.status, "needs_user_action");
assert.equal(payload.kind, "dialog_intervention_required");
assert.equal(payload.dialogId, "dialog-2");
});