Files
boss/tests/browser-desktop-runtime-config-defaults.test.mjs
2026-06-05 15:14:43 +08:00

194 lines
10 KiB
JavaScript

import test from "node:test";
import assert from "node:assert/strict";
import { readFile } from "node:fs/promises";
import path from "node:path";
import { fileURLToPath } from "node:url";
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
test("shipped local-agent configs include browser and desktop runtime defaults", async () => {
const exampleConfig = JSON.parse(
await readFile(path.join(repoRoot, "local-agent", "config.example.json"), "utf8"),
);
const cloudConfig = JSON.parse(
await readFile(path.join(repoRoot, "local-agent", "config.cloud.json"), "utf8"),
);
assert.equal(exampleConfig.browserControlEnabled, true);
assert.equal(cloudConfig.browserControlEnabled, true);
assert.equal(exampleConfig.browserControlCommand, "node");
assert.equal(cloudConfig.browserControlCommand, "node");
assert.deepEqual(exampleConfig.browserControlArgs, ["scripts/browser-control-smoke.mjs"]);
assert.deepEqual(cloudConfig.browserControlArgs, ["scripts/browser-control-smoke.mjs"]);
assert.equal(exampleConfig.browserAutomationConnected, true);
assert.equal(cloudConfig.browserAutomationConnected, true);
assert.equal(exampleConfig.computerUseEnabled, true);
assert.equal(cloudConfig.computerUseEnabled, true);
assert.equal(exampleConfig.codexAppServerEnabled, true);
assert.equal(cloudConfig.codexAppServerEnabled, true);
assert.equal(exampleConfig.codexComputerUseEnabled, true);
assert.equal(cloudConfig.codexComputerUseEnabled, true);
assert.equal(exampleConfig.codexComputerUseCommand, "node");
assert.equal(cloudConfig.codexComputerUseCommand, "node");
assert.deepEqual(exampleConfig.codexComputerUseArgs, ["scripts/codex-computer-use-runtime.mjs"]);
assert.deepEqual(cloudConfig.codexComputerUseArgs, ["scripts/codex-computer-use-runtime.mjs"]);
assert.equal(exampleConfig.codexComputerUseFallbackToCua, true);
assert.equal(cloudConfig.codexComputerUseFallbackToCua, true);
assert.equal(exampleConfig.computerUseCommand, "node");
assert.equal(cloudConfig.computerUseCommand, "node");
assert.deepEqual(exampleConfig.computerUseArgs, ["scripts/cua-driver-computer-use-runtime.mjs"]);
assert.deepEqual(cloudConfig.computerUseArgs, ["scripts/cua-driver-computer-use-runtime.mjs"]);
assert.equal(exampleConfig.cuaDriverCommand, "cua-driver");
assert.equal(cloudConfig.cuaDriverCommand, "cua-driver");
assert.deepEqual(exampleConfig.cuaDriverArgs, []);
assert.deepEqual(cloudConfig.cuaDriverArgs, []);
assert.equal(exampleConfig.cuaDriverTimeoutMs, 45000);
assert.equal(cloudConfig.cuaDriverTimeoutMs, 45000);
assert.equal(exampleConfig.computerUseConnected, true);
assert.equal(cloudConfig.computerUseConnected, true);
assert.equal(exampleConfig.dialogGuardEnabled, true);
assert.equal(cloudConfig.dialogGuardEnabled, true);
assert.equal(exampleConfig.dialogGuardConsentRequired, true);
assert.equal(cloudConfig.dialogGuardConsentRequired, true);
assert.deepEqual(exampleConfig.dialogGuardPlatformAdapters, ["darwin", "win32"]);
assert.deepEqual(cloudConfig.dialogGuardPlatformAdapters, ["darwin", "win32"]);
assert.equal(exampleConfig.dialogGuardMacActionCommand, "");
assert.equal(cloudConfig.dialogGuardMacActionCommand, "");
assert.deepEqual(exampleConfig.dialogGuardMacActionArgs, []);
assert.deepEqual(cloudConfig.dialogGuardMacActionArgs, []);
assert.equal(exampleConfig.dialogGuardWindowsActionCommand, "");
assert.equal(cloudConfig.dialogGuardWindowsActionCommand, "");
assert.deepEqual(exampleConfig.dialogGuardWindowsActionArgs, []);
assert.deepEqual(cloudConfig.dialogGuardWindowsActionArgs, []);
assert.equal(exampleConfig.bossAgentOtaEnabled, true);
assert.equal(cloudConfig.bossAgentOtaEnabled, true);
assert.equal(exampleConfig.bossAgentVersion, "dev");
assert.equal(cloudConfig.bossAgentVersion, "dev");
assert.equal(exampleConfig.bossAgentOtaAutoInstall, false);
assert.equal(cloudConfig.bossAgentOtaAutoInstall, false);
assert.equal(exampleConfig.bossAgentOtaCheckIntervalMs, 300000);
assert.equal(cloudConfig.bossAgentOtaCheckIntervalMs, 300000);
assert.equal(exampleConfig.codexDesktopRefreshEnabled, true);
assert.equal(cloudConfig.codexDesktopRefreshEnabled, true);
assert.equal(exampleConfig.codexDesktopRefreshCommand, "node");
assert.equal(cloudConfig.codexDesktopRefreshCommand, "node");
assert.deepEqual(exampleConfig.codexDesktopRefreshArgs, ["scripts/codex-desktop-refresh-hint.mjs"]);
assert.deepEqual(cloudConfig.codexDesktopRefreshArgs, ["scripts/codex-desktop-refresh-hint.mjs"]);
assert.equal(exampleConfig.codexDesktopRefreshEndpoint, "http://127.0.0.1:4318/api/v1/codex-desktop/refresh");
assert.equal(cloudConfig.codexDesktopRefreshEndpoint, "http://127.0.0.1:4318/api/v1/codex-desktop/refresh");
assert.equal(exampleConfig.codexDesktopRefreshAppName, "Codex");
assert.equal(cloudConfig.codexDesktopRefreshAppName, "Codex");
assert.equal(exampleConfig.codexDesktopRefreshMode, "deeplink-reload");
assert.equal(cloudConfig.codexDesktopRefreshMode, "deeplink-reload");
assert.equal(exampleConfig.codexDesktopRefreshRetryCount, 2);
assert.equal(cloudConfig.codexDesktopRefreshRetryCount, 2);
assert.equal(exampleConfig.codexDesktopRefreshRetryDelayMs, 120);
assert.equal(cloudConfig.codexDesktopRefreshRetryDelayMs, 120);
});
test("repo ships browser and desktop runtime scripts", async () => {
const browserSmoke = await readFile(path.join(repoRoot, "scripts", "browser-control-smoke.mjs"), "utf8");
const computerSmoke = await readFile(path.join(repoRoot, "scripts", "computer-use-smoke.mjs"), "utf8");
const cuaComputerUseRuntime = await readFile(
path.join(repoRoot, "scripts", "cua-driver-computer-use-runtime.mjs"),
"utf8",
);
const codexComputerUseRuntime = await readFile(
path.join(repoRoot, "scripts", "codex-computer-use-runtime.mjs"),
"utf8",
);
const codexDesktopRefreshHint = await readFile(
path.join(repoRoot, "scripts", "codex-desktop-refresh-hint.mjs"),
"utf8",
);
const codexDesktopRefreshBridgeDaemon = await readFile(
path.join(repoRoot, "scripts", "codex-desktop-refresh-bridge-daemon.mjs"),
"utf8",
);
const codexDesktopEventConsumer = await readFile(
path.join(repoRoot, "scripts", "codex-desktop-event-consumer.mjs"),
"utf8",
);
const codexDesktopIntegrationProbe = await readFile(
path.join(repoRoot, "scripts", "codex-desktop-integration-probe.mjs"),
"utf8",
);
const codexDesktopBridgeLaunchAgent = await readFile(
path.join(repoRoot, "deployment", "launchd", "com.hyzq.boss.codex-desktop-bridge.plist"),
"utf8",
);
const bossAgentPackageScript = await readFile(
path.join(repoRoot, "scripts", "package-boss-agent-mac-runtime.sh"),
"utf8",
);
const startLocalAgent = await readFile(
path.join(repoRoot, "scripts", "start-local-agent.sh"),
"utf8",
);
const installLocalLaunchAgent = await readFile(
path.join(repoRoot, "scripts", "install-local-launchagent.sh"),
"utf8",
);
assert.match(browserSmoke, /status/);
assert.match(browserSmoke, /replyBody/);
assert.match(browserSmoke, /BOSS_BROWSER_AUTOMATION_MODE/);
assert.match(computerSmoke, /status/);
assert.match(computerSmoke, /replyBody/);
assert.match(computerSmoke, /resolveOpenAppPrefixArgs/);
assert.match(computerSmoke, /BOSS_COMPUTER_USE_MODE/);
assert.match(computerSmoke, /osascript/);
assert.match(cuaComputerUseRuntime, /runCuaDriverComputerUseTask/);
assert.match(cuaComputerUseRuntime, /BOSS_CUA_DRIVER_COMMAND/);
assert.match(cuaComputerUseRuntime, /launch_app/);
assert.match(cuaComputerUseRuntime, /get_window_state/);
assert.match(cuaComputerUseRuntime, /needs_user_action/);
assert.match(codexComputerUseRuntime, /Codex Computer Use/);
assert.match(codexComputerUseRuntime, /executeCodexAppServerTask/);
assert.match(codexDesktopRefreshHint, /codex_desktop_refresh_hint/);
assert.match(codexDesktopRefreshHint, /osascript/);
assert.match(codexDesktopRefreshHint, /activate/);
assert.match(codexDesktopRefreshHint, /refreshMode/);
assert.match(codexDesktopRefreshHint, /codex:\/\/threads\//);
assert.match(codexDesktopRefreshHint, /BOSS_CODEX_DESKTOP_REFRESH_DRY_RUN/);
assert.match(codexDesktopRefreshHint, /key code 15/);
assert.match(codexDesktopRefreshBridgeDaemon, /api\/v1\/codex-desktop\/refresh/);
assert.match(codexDesktopRefreshBridgeDaemon, /api\/v1\/codex-desktop\/events/);
assert.match(codexDesktopRefreshBridgeDaemon, /text\/event-stream/);
assert.match(codexDesktopRefreshBridgeDaemon, /127\.0\.0\.1/);
assert.match(codexDesktopEventConsumer, /BOSS_CODEX_DESKTOP_EVENTS_URL/);
assert.match(codexDesktopEventConsumer, /BOSS_CODEX_DESKTOP_EVENTS_ONCE/);
assert.match(codexDesktopEventConsumer, /codex_desktop_refresh/);
assert.match(codexDesktopIntegrationProbe, /BOSS_CODEX_DESKTOP_APP_PATH/);
assert.match(codexDesktopIntegrationProbe, /codex:\/\/threads\/\{threadId\}/);
assert.match(codexDesktopIntegrationProbe, /packagePatch/);
assert.match(codexDesktopBridgeLaunchAgent, /codex-desktop-refresh-bridge-daemon\.mjs/);
assert.match(codexDesktopBridgeLaunchAgent, /BOSS_CODEX_DESKTOP_BRIDGE_PORT/);
assert.match(bossAgentPackageScript, /boss-agent-mac-latest\.zip/);
assert.match(bossAgentPackageScript, /boss-agent-mac-latest\.json/);
assert.match(bossAgentPackageScript, /bossAgentVersion = version/);
assert.match(bossAgentPackageScript, /config\*\.json/);
assert.match(bossAgentPackageScript, /codexComputerUseArgs/);
assert.match(bossAgentPackageScript, /PlistBuddy/);
assert.match(bossAgentPackageScript, /ACTIVE_CONFIG_PATH/);
assert.match(bossAgentPackageScript, /CUSTOM_CONFIGS/);
assert.match(bossAgentPackageScript, /config\.installed\.json\|config\.cloud\.json\|config\.example\.json/);
assert.match(bossAgentPackageScript, /BOSS_AGENT_INSTALL_ROOT/);
assert.match(installLocalLaunchAgent, /resolve_default_config_source/);
assert.match(installLocalLaunchAgent, /PlistBuddy/);
assert.match(installLocalLaunchAgent, /ACTIVE_CONFIG_PATH/);
assert.match(installLocalLaunchAgent, /CONFIG_SOURCE_ARG/);
assert.match(installLocalLaunchAgent, /codexAppServerWorkdir/);
assert.match(installLocalLaunchAgent, /codexComputerUseWorkdir/);
assert.match(startLocalAgent, /BOSS_NODE_BIN/);
assert.match(startLocalAgent, /\.boss-runtime\/node-\*\/bin\/node/);
assert.match(
startLocalAgent,
/\/Applications\/Codex\.app\/Contents\/Resources/,
"local-agent launchd startup must include Codex.app CLI in PATH so Master Codex Node can spawn codex",
);
});