import test from "node:test"; import assert from "node:assert/strict"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { buildComputerUseTaskExecution, canHandleComputerUseTask, executeComputerUseTask, getComputerUseTaskRunnerConfig, parseComputerUseTaskResult, } from "../local-agent/computer-use-task-runner.mjs"; const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); test("computer use runner handles desktop_control tasks", async () => { assert.equal( canHandleComputerUseTask({ taskType: "desktop_control", requestText: "打开系统设置", }), true, ); }); test("computer use runner derives config from explicit values", () => { const config = getComputerUseTaskRunnerConfig({}, { computerUseEnabled: true, computerUseCommand: "node", computerUseArgs: ["tests/fixtures/computer-use-runtime.mjs"], computerUseWorkdir: repoRoot, computerUseTimeoutMs: 12000, dialogGuardEnabled: true, dialogGuardConsentRequired: true, dialogGuardPlatformAdapters: ["darwin", "win32"], dialogGuardMacActionCommand: "/usr/local/bin/boss-mac-dialog-helper", dialogGuardMacActionArgs: ["click-dialog"], dialogGuardWindowsActionCommand: "powershell.exe", dialogGuardWindowsActionArgs: ["-File", "C:/Boss/dialog-helper.ps1"], }); assert.equal(config.enabled, true); assert.equal(config.command, "node"); assert.deepEqual(config.args, ["tests/fixtures/computer-use-runtime.mjs"]); assert.equal(config.cwd, repoRoot); assert.equal(config.timeoutMs, 12000); assert.equal(config.dialogGuardEnabled, true); assert.equal(config.dialogGuardConsentRequired, true); assert.deepEqual(config.dialogGuardPlatformAdapters, ["darwin", "win32"]); assert.equal(config.dialogGuardMacActionCommand, "/usr/local/bin/boss-mac-dialog-helper"); assert.deepEqual(config.dialogGuardMacActionArgs, ["click-dialog"]); assert.equal(config.dialogGuardWindowsActionCommand, "powershell.exe"); assert.deepEqual(config.dialogGuardWindowsActionArgs, ["-File", "C:/Boss/dialog-helper.ps1"]); }); test("computer use runner builds normalized stdin payload", () => { const execution = buildComputerUseTaskExecution( { enabled: true, command: "node", args: ["tests/fixtures/computer-use-runtime.mjs"], cwd: repoRoot, timeoutMs: 3000, }, { taskId: "desktop-task-1", taskType: "desktop_control", requestText: "打开系统设置", projectId: "boss-console", threadId: "thread-desktop", requestedByAccount: "17600001111", confirmationScopeKey: "thread:desktop", riskLevel: "high", }, ); assert.equal(execution.command, "node"); assert.equal(execution.cwd, repoRoot); assert.equal(execution.timeoutMs, 3000); assert.equal(execution.stdinPayload.requestKind, "desktop_control"); assert.equal(execution.stdinPayload.requestId, "desktop-task-1"); assert.equal(execution.stdinPayload.objective, "打开系统设置"); assert.equal(execution.stdinPayload.context.projectId, "boss-console"); assert.equal(execution.stdinPayload.context.threadId, "thread-desktop"); assert.equal(execution.stdinPayload.context.confirmationScopeKey, "thread:desktop"); assert.equal(execution.stdinPayload.context.riskLevel, "high"); }); test("computer use runner passes dialog guard config to runtime env", () => { const execution = buildComputerUseTaskExecution( { enabled: true, command: "node", args: ["tests/fixtures/computer-use-runtime.mjs"], cwd: repoRoot, timeoutMs: 3000, dialogGuardEnabled: true, dialogGuardConsentRequired: true, dialogGuardPlatformAdapters: ["darwin", "win32"], dialogGuardMacActionCommand: "/usr/local/bin/boss-mac-dialog-helper", dialogGuardMacActionArgs: ["click-dialog"], dialogGuardWindowsActionCommand: "powershell.exe", dialogGuardWindowsActionArgs: ["-File", "C:/Boss/dialog-helper.ps1"], }, { taskId: "desktop-dialog-env", taskType: "desktop_control", requestText: "打开 QQ", }, ); assert.equal(execution.env.BOSS_DIALOG_GUARD_ENABLED, "true"); assert.equal(execution.env.BOSS_DIALOG_GUARD_CONSENT_REQUIRED, "true"); assert.equal(execution.env.BOSS_DIALOG_GUARD_PLATFORM_ADAPTERS, "darwin,win32"); assert.equal(execution.env.BOSS_MAC_DIALOG_GUARD_ACTION_COMMAND, "/usr/local/bin/boss-mac-dialog-helper"); assert.equal(execution.env.BOSS_MAC_DIALOG_GUARD_ACTION_ARGS_JSON, JSON.stringify(["click-dialog"])); assert.equal(execution.env.BOSS_WINDOWS_DIALOG_GUARD_ACTION_COMMAND, "powershell.exe"); assert.equal( execution.env.BOSS_WINDOWS_DIALOG_GUARD_ACTION_ARGS_JSON, JSON.stringify(["-File", "C:/Boss/dialog-helper.ps1"]), ); }); test("computer use runner parses completed runtime payload", () => { const result = parseComputerUseTaskResult( '{"status":"completed","replyBody":"已打开系统设置","executionSummary":"desktop ok"}', ); assert.equal(result.status, "completed"); assert.equal(result.replyBody, "已打开系统设置"); assert.equal(result.executionSummary, "desktop ok"); }); test("computer use runner parses failed runtime payload", () => { const result = parseComputerUseTaskResult('{"status":"failed","error":"COMPUTER_USE_DENIED"}'); assert.equal(result.status, "failed"); assert.equal(result.errorMessage, "COMPUTER_USE_DENIED"); }); test("computer use runner parses dialog intervention runtime payload", () => { const result = parseComputerUseTaskResult( JSON.stringify({ status: "needs_user_action", requestId: "desktop-task-dialog", kind: "dialog_intervention_required", dialogId: "dialog-1", risk: "medium", summary: "QQ 弹窗需要确认", recommendedAction: "review", availableActions: ["allow_once", "deny"], platform: "darwin", appName: "QQ", }), ); assert.equal(result.status, "needs_user_action"); assert.equal(result.requestId, "desktop-task-dialog"); assert.equal(result.kind, "dialog_intervention_required"); assert.equal(result.dialogId, "dialog-1"); assert.equal(result.risk, "medium"); assert.equal(result.summary, "QQ 弹窗需要确认"); assert.deepEqual(result.availableActions, ["allow_once", "deny"]); }); test("computer use runner executes configured runtime command", async () => { const result = await executeComputerUseTask( { taskId: "desktop-task-exec", taskType: "desktop_control", requestText: "打开飞书", projectId: "boss-console", threadId: "thread-desktop", requestedByAccount: "17600002222", }, { computerUseEnabled: true, computerUseCommand: process.execPath, computerUseArgs: ["tests/fixtures/computer-use-runtime.mjs"], computerUseWorkdir: repoRoot, computerUseTimeoutMs: 4000, }, ); assert.equal(result.status, "completed"); assert.match(result.replyBody ?? "", /桌面运行时已执行/); assert.match(result.replyBody ?? "", /打开飞书/); }); test("computer use runner reports disabled runtime instead of pretending desktop work completed", async () => { const result = await executeComputerUseTask({ taskId: "task-desktop-control", requestText: "打开系统设置", }, {}); assert.equal(result.status, "failed"); assert.equal(result.errorMessage, "COMPUTER_USE_RUNTIME_DISABLED"); });