426e9eeabd
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
ci / test (push) Has been cancelled
ci / lint-and-format (push) Has been cancelled
ci / build (push) Has been cancelled
ci / dev-startup (push) Has been cancelled
gitleaks / gitleaks (push) Has been cancelled
Markdown Links / Relative Markdown Links (push) Has been cancelled
Quality (Extended) / Homepage Build (PR smoke) (push) Has been cancelled
Quality (Extended) / Comment-only diff guard (push) Has been cancelled
Quality (Extended) / Format + Type Safety Ratchet (push) Has been cancelled
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Has been cancelled
Quality (Extended) / Develop Gate (lint) (push) Has been cancelled
Chat shell gestures / Chat shell gesture + parity e2e (push) Has been cancelled
Cloud Gateway Discord / Test (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Has been cancelled
Build Agent Image / build-and-push (push) Has been cancelled
Dev Smoke / bun run dev onboarding chat (push) Has been cancelled
Dev Smoke / Vite HMR dependency-level smoke (push) Has been cancelled
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Has been cancelled
Publish @elizaos/example-code / check_npm (push) Has been cancelled
Publish @elizaos/example-code / publish_npm (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / verify_version (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / publish_npm (push) Has been cancelled
Sandbox Live Smoke / Sandbox live smoke (push) Has been cancelled
Snap Build & Test / Build Snap (amd64) (push) Has been cancelled
Snap Build & Test / Build Snap (arm64) (push) Has been cancelled
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Has been cancelled
Cloud Gateway Webhook / Test (push) Has been cancelled
Cloud Tests / lint-and-types (push) Has been cancelled
Cloud Tests / unit-tests (push) Has been cancelled
Cloud Tests / integration-tests (push) Has been cancelled
Cloud Tests / e2e-tests (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Apps Worker (Product 2) / Determine environment (push) Has been cancelled
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Has been cancelled
Deploy Eliza Provisioning Worker / Determine environment (push) Has been cancelled
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Has been cancelled
Dev Smoke / Classify changed paths (push) Has been cancelled
supply-chain / sbom (push) Has been cancelled
supply-chain / vulnerability-scan (push) Has been cancelled
Build, Push & Deploy to Phala Cloud / build-and-push (push) Has been cancelled
Test Packaging / Validate Packaging Configs (push) Has been cancelled
Test Packaging / Build & Test PyPI Package (push) Has been cancelled
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Has been cancelled
Test Packaging / Pack & Test JS Tarballs (push) Has been cancelled
UI Fixture E2E / ui-fixture-e2e (push) Has been cancelled
UI Fixture E2E / fixture-e2e (push) Has been cancelled
UI Story Gate / story-gate (push) Has been cancelled
vault-ci / test (macos-latest) (push) Has been cancelled
vault-ci / test (ubuntu-latest) (push) Has been cancelled
vault-ci / test (windows-latest) (push) Has been cancelled
vault-ci / app-core wiring tests (push) Has been cancelled
verify-patches / verify patches/CHECKSUMS.sha256 (push) Has been cancelled
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Has been cancelled
Voice Benchmark Smoke / voice bench smoke summary (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Has been cancelled
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Has been cancelled
161 lines
4.5 KiB
JavaScript
161 lines
4.5 KiB
JavaScript
// Exercises lib test runtime automation behavior with deterministic script fixtures.
|
|
import { spawnSync } from "node:child_process";
|
|
import fs from "node:fs";
|
|
import os from "node:os";
|
|
import path from "node:path";
|
|
|
|
const CODEX_NODE_MARKER = `${path.sep}Applications${path.sep}Codex.app${path.sep}Contents${path.sep}Resources${path.sep}node`;
|
|
|
|
function splitPath(value) {
|
|
return String(value || "")
|
|
.split(path.delimiter)
|
|
.filter(Boolean);
|
|
}
|
|
|
|
function uniqueExistingDirs(paths) {
|
|
const seen = new Set();
|
|
const result = [];
|
|
for (const dir of paths) {
|
|
if (!dir || seen.has(dir) || !fs.existsSync(dir)) {
|
|
continue;
|
|
}
|
|
seen.add(dir);
|
|
result.push(dir);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function isExecutable(filePath) {
|
|
try {
|
|
fs.accessSync(filePath, fs.constants.X_OK);
|
|
return true;
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function compareNodeVersionDesc(left, right) {
|
|
const parse = (value) =>
|
|
value
|
|
.replace(/^v/, "")
|
|
.split(".")
|
|
.map((part) => Number.parseInt(part, 10) || 0);
|
|
const leftParts = parse(path.basename(path.dirname(path.dirname(left))));
|
|
const rightParts = parse(path.basename(path.dirname(path.dirname(right))));
|
|
for (let index = 0; index < 3; index += 1) {
|
|
if (leftParts[index] !== rightParts[index]) {
|
|
return rightParts[index] - leftParts[index];
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function readNvmrc(repoRoot) {
|
|
try {
|
|
return fs.readFileSync(path.join(repoRoot, ".nvmrc"), "utf8").trim();
|
|
} catch {
|
|
return "";
|
|
}
|
|
}
|
|
|
|
function nodeOptionsWithHeapLimit(value) {
|
|
const current = String(value || "").trim();
|
|
if (/(^|\s)--max-old-space-size=/.test(current)) {
|
|
return current;
|
|
}
|
|
return [current, "--max-old-space-size=8192"].filter(Boolean).join(" ");
|
|
}
|
|
|
|
function nvmNodeCandidates(homeDir, repoRoot) {
|
|
const versionsDir = path.join(homeDir, ".nvm", "versions", "node");
|
|
const candidates = [];
|
|
const nvmrc = readNvmrc(repoRoot);
|
|
if (nvmrc) {
|
|
const version = nvmrc.startsWith("v") ? nvmrc : `v${nvmrc}`;
|
|
candidates.push(path.join(versionsDir, version, "bin", "node"));
|
|
}
|
|
|
|
try {
|
|
for (const entry of fs.readdirSync(versionsDir, { withFileTypes: true })) {
|
|
if (entry.isDirectory()) {
|
|
candidates.push(path.join(versionsDir, entry.name, "bin", "node"));
|
|
}
|
|
}
|
|
} catch {
|
|
// nvm is optional.
|
|
}
|
|
|
|
return [...new Set(candidates)].sort(compareNodeVersionDesc);
|
|
}
|
|
|
|
function pathNodeCandidates(env) {
|
|
return splitPath(env.PATH).map((dir) => path.join(dir, "node"));
|
|
}
|
|
|
|
function canRunNode(nodePath, currentExecPath) {
|
|
if (!nodePath || path.resolve(nodePath) === path.resolve(currentExecPath)) {
|
|
return false;
|
|
}
|
|
if (!isExecutable(nodePath) || isCodexBundledNode(nodePath)) {
|
|
return false;
|
|
}
|
|
const result = spawnSync(
|
|
nodePath,
|
|
["-e", "process.stdout.write(`${process.platform}/${process.arch}`)"],
|
|
{ encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] },
|
|
);
|
|
return (
|
|
result.status === 0 &&
|
|
result.stdout.trim() === `${process.platform}/${process.arch}`
|
|
);
|
|
}
|
|
|
|
export function isCodexBundledNode(execPath = process.execPath) {
|
|
return process.platform === "darwin" && execPath.includes(CODEX_NODE_MARKER);
|
|
}
|
|
|
|
export function resolveExternalNode({
|
|
env = process.env,
|
|
repoRoot = process.cwd(),
|
|
execPath = process.execPath,
|
|
} = {}) {
|
|
const homeDir = os.homedir();
|
|
const candidates = [
|
|
env.ELIZA_VITEST_NODE,
|
|
env.ELIZA_TEST_NODE,
|
|
...pathNodeCandidates(env),
|
|
...nvmNodeCandidates(homeDir, repoRoot),
|
|
"/opt/homebrew/bin/node",
|
|
"/usr/local/bin/node",
|
|
].filter(Boolean);
|
|
|
|
return (
|
|
candidates.find((candidate) => canRunNode(candidate, execPath)) || null
|
|
);
|
|
}
|
|
|
|
export function buildTestRuntimeEnv(baseEnv = process.env, options = {}) {
|
|
const repoRoot = options.repoRoot ?? process.cwd();
|
|
const codexNode = isCodexBundledNode(options.execPath ?? process.execPath);
|
|
const externalNode = resolveExternalNode({
|
|
env: baseEnv,
|
|
repoRoot,
|
|
execPath: options.execPath ?? process.execPath,
|
|
});
|
|
const homeDir = os.homedir();
|
|
const pathPrefix = uniqueExistingDirs([
|
|
path.join(repoRoot, "node_modules", ".bin"),
|
|
codexNode && externalNode ? path.dirname(externalNode) : "",
|
|
path.join(homeDir, ".bun", "bin"),
|
|
codexNode ? "/opt/homebrew/bin" : "",
|
|
codexNode ? "/usr/local/bin" : "",
|
|
]);
|
|
|
|
return {
|
|
...baseEnv,
|
|
PATH: [...pathPrefix, ...splitPath(baseEnv.PATH)].join(path.delimiter),
|
|
NODE_OPTIONS: nodeOptionsWithHeapLimit(baseEnv.NODE_OPTIONS),
|
|
...(codexNode && externalNode ? { ELIZA_TEST_NODE: externalNode } : {}),
|
|
};
|
|
}
|