mirror of
https://github.com/openclaw/openclaw.git
synced 2026-10-03 01:29:56 +00:00
## What Problem This Solves Repository scripts retain private copies of shared tooling helpers and an unused translation subprocess runner, increasing maintenance work across sibling scripts. ## User Impact Internal tooling cleanup: existing flags, diagnostics, generated bytes, JSON formats, exit codes, and cleanup policies stay the same. The build wrapper additionally detects forbidden dynamic-import warnings when compiler output splits the warning marker across chunks. ## Why This Change Was Made - Remove the retired i18n process runner. Its final production caller moved to the shared formatter in #95534; retain real CLI/privacy/provider tests and run their subprocesses with the existing dependency. - Share Docker resource, signal-trap, platform, workspace-staging, and plugin-selection helpers while retaining each caller's environment precedence and lifecycle decisions. - Reuse existing E2E fixture JSON/assertion and package-path helpers; retain distinct write modes, recovery ordering, and mounted/frozen harness contracts. - Share macOS guest desktop-user/home resolution through its existing owner while preserving per-caller timeout policy. - Route release/mobile flags through the existing version flag specifications, preserving split-only values, duplicate/mode rules, help timing, and error text. Reuse existing retry sleep and comparator owners and remove an unreachable iOS output branch. - Reuse existing guard entrypoint, failure-trailer, diagnostic-line, and metadata-normalization owners. Measured reduction: **732 net production lines**, with test changes counted separately. PR tooling and its protected import closure, CI planners/shards, baselines, and generated artifacts are unchanged. ## Fixes Found Along the Way The tsdown scanner checked each raw output chunk for its warning marker. It now checks the existing combined-line buffer. The regression exercises every split inside the marker and fails on the original source for the intended missing-warning assertion. ## Evidence - Blacksmith Testbox `tbx_01m3tp4sabwd0807kj9jkqqmbr`: frozen dependency install and candidate source-byte verification; all nine changed test files and 59 selected sibling files passed, including real CLI, package fixture, recovery, Docker harness, and Parallels transport contracts. - Generated channel metadata is byte-identical; differential metadata normalization cases passed. - SDK surface check passed. Independent isolated Codex review completed with no P0–P2 findings. - Initial changed checks caught an invalid direct source import in a proposed snapshot-distance consolidation; that independent change was withdrawn. No boundary exception was added. The final changed checks pass, including script/test lint and Docker shell/scheduler checks; madge reports 0 cycles and the runtime import check reports 0 cycles. - Per-file single-worker wall time for changed suites: translation 9.92s; Docker helper 38.88s; live Docker auth 1.71s; mobile ref 2.36s; mobile release 6.23s; release preparation 2.42s; version 2.04s; installer 15.01s; tsdown 2.70s. The existing Docker helper suite executes shell/process cleanup and container-command boundary fixtures; new assertions reuse those fixtures. New parser/scanner cases use no sleeps or polling. Hosted CI will be verified against this PR's exact pushed head. No live deployment or release was performed.
381 lines
19 KiB
Bash
381 lines
19 KiB
Bash
#!/usr/bin/env bash
|
|
# Bash 5.3+ can deadlock writing heredoc pipes on macOS before the reader starts.
|
|
if [[ ${OSTYPE:-} == darwin* && $BASH != /bin/bash ]] && ((BASH_VERSINFO[0] > 5 || (BASH_VERSINFO[0] == 5 && BASH_VERSINFO[1] >= 3))); then
|
|
exec /bin/bash "$0" "$@"
|
|
fi
|
|
set -euo pipefail
|
|
|
|
SCRIPT_ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
ROOT_DIR="${OPENCLAW_LIVE_DOCKER_REPO_ROOT:-$SCRIPT_ROOT_DIR}"
|
|
ROOT_DIR="$(cd "$ROOT_DIR" && pwd)"
|
|
TRUSTED_HARNESS_DIR="${OPENCLAW_LIVE_DOCKER_TRUSTED_HARNESS_DIR:-${OPENCLAW_LIVE_CODEX_TRUSTED_HARNESS_DIR:-$SCRIPT_ROOT_DIR}}"
|
|
if [[ -z "$TRUSTED_HARNESS_DIR" || ! -d "$TRUSTED_HARNESS_DIR" ]]; then
|
|
echo "ERROR: trusted Codex harness directory not found: ${TRUSTED_HARNESS_DIR:-<empty>}." >&2
|
|
exit 1
|
|
fi
|
|
TRUSTED_HARNESS_DIR="$(cd "$TRUSTED_HARNESS_DIR" && pwd)"
|
|
source "$TRUSTED_HARNESS_DIR/scripts/lib/live-docker-auth.sh"
|
|
IMAGE_NAME="${OPENCLAW_IMAGE:-openclaw:local}"
|
|
LIVE_IMAGE_NAME="${OPENCLAW_LIVE_IMAGE:-${IMAGE_NAME}-live}"
|
|
CONFIG_DIR="${OPENCLAW_CONFIG_DIR:-$HOME/.openclaw}"
|
|
WORKSPACE_DIR="${OPENCLAW_WORKSPACE_DIR:-$HOME/.openclaw/workspace}"
|
|
PROFILE_FILE="$(openclaw_live_default_profile_file)"
|
|
CODEX_HARNESS_AUTH_MODE="${OPENCLAW_LIVE_CODEX_HARNESS_AUTH:-codex-auth}"
|
|
CODEX_CLI_PACKAGE_SPEC="${OPENCLAW_LIVE_CODEX_CLI_PACKAGE_SPEC:-}"
|
|
CODEX_HARNESS_SETUP_TIMEOUT_SECONDS="$(openclaw_live_read_positive_int_env OPENCLAW_LIVE_CODEX_HARNESS_SETUP_TIMEOUT_SECONDS 180)"
|
|
CODEX_HARNESS_TARGET_COUNT=1
|
|
if [[ -n "${OPENCLAW_LIVE_CODEX_HARNESS_TARGETS:-}" ]]; then
|
|
IFS=',' read -r -a CODEX_HARNESS_TARGET_ITEMS <<<"$OPENCLAW_LIVE_CODEX_HARNESS_TARGETS"
|
|
CODEX_HARNESS_TARGET_COUNT="${#CODEX_HARNESS_TARGET_ITEMS[@]}"
|
|
fi
|
|
# Each target starts an isolated 15-minute Vitest suite. Preserve the old
|
|
# 35-minute single-target budget while scaling matrix runs linearly.
|
|
CODEX_HARNESS_DOCKER_RUN_TIMEOUT="${OPENCLAW_LIVE_CODEX_HARNESS_DOCKER_RUN_TIMEOUT:-$((2100 * CODEX_HARNESS_TARGET_COUNT))s}"
|
|
DOCKER_TRUSTED_HARNESS_MOUNT=()
|
|
DOCKER_TRUSTED_HARNESS_CONTAINER_DIR=""
|
|
DOCKER_CACHE_CONTAINER_DIR="/tmp/openclaw-cache"
|
|
DOCKER_CLI_TOOLS_CONTAINER_DIR="/tmp/openclaw-npm-global"
|
|
DOCKER_EXTRA_ENV_FILES=()
|
|
DOCKER_AUTH_PRESTAGED=0
|
|
|
|
case "$CODEX_HARNESS_AUTH_MODE" in
|
|
codex-auth | api-key)
|
|
;;
|
|
*)
|
|
echo "ERROR: OPENCLAW_LIVE_CODEX_HARNESS_AUTH must be one of: codex-auth, api-key." >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
if [[ -f "$PROFILE_FILE" && -r "$PROFILE_FILE" ]]; then
|
|
set -a
|
|
# shellcheck disable=SC1090
|
|
source "$PROFILE_FILE"
|
|
set +a
|
|
fi
|
|
|
|
if [[ "$CODEX_HARNESS_AUTH_MODE" == "api-key" && -z "${OPENAI_API_KEY:-}" ]]; then
|
|
echo "ERROR: OPENCLAW_LIVE_CODEX_HARNESS_AUTH=api-key requires OPENAI_API_KEY." >&2
|
|
exit 1
|
|
fi
|
|
if [[ "$CODEX_HARNESS_AUTH_MODE" != "api-key" && ! -s "$HOME/.codex/auth.json" ]]; then
|
|
echo "ERROR: OPENCLAW_LIVE_CODEX_HARNESS_AUTH=codex-auth requires ~/.codex/auth.json before building the live Docker image." >&2
|
|
if [[ -n "${OPENAI_API_KEY:-}" ]]; then
|
|
echo "If this is a Testbox/API-key run, set OPENCLAW_LIVE_CODEX_HARNESS_AUTH=api-key and run through openclaw-testbox-env." >&2
|
|
fi
|
|
exit 1
|
|
fi
|
|
if [[ -z "$CODEX_CLI_PACKAGE_SPEC" ]]; then
|
|
CODEX_CLI_PACKAGE_SPEC="$(
|
|
node -e '
|
|
const pkg = require(process.argv[1]);
|
|
const version = pkg.dependencies?.["@openai/codex"];
|
|
if (!version || typeof version !== "string") process.exit(1);
|
|
process.stdout.write(`@openai/codex@${version}`);
|
|
' "$ROOT_DIR/extensions/codex/package.json"
|
|
)"
|
|
fi
|
|
|
|
openclaw_live_init_temp_dirs
|
|
openclaw_live_init_cli_tools_dir
|
|
openclaw_live_init_cache_home_dir
|
|
openclaw_live_init_managed_home
|
|
if [[ "$CODEX_HARNESS_AUTH_MODE" == "api-key" ]]; then
|
|
if [[ -z "${DOCKER_HOME_DIR:-}" ]]; then
|
|
DOCKER_HOME_DIR="$(mktemp -d "${RUNNER_TEMP:-/tmp}/openclaw-docker-home.XXXXXX")"
|
|
TEMP_DIRS+=("$DOCKER_HOME_DIR")
|
|
openclaw_live_prepare_bind_dir_for_container_user "$DOCKER_HOME_DIR"
|
|
DOCKER_HOME_MOUNT=(-v "$DOCKER_HOME_DIR":/home/node)
|
|
fi
|
|
CONFIG_DIR="$(mktemp -d "${RUNNER_TEMP:-/tmp}/openclaw-docker-config.XXXXXX")"
|
|
WORKSPACE_DIR="$(mktemp -d "${RUNNER_TEMP:-/tmp}/openclaw-docker-workspace.XXXXXX")"
|
|
TEMP_DIRS+=("$CONFIG_DIR" "$WORKSPACE_DIR")
|
|
chmod 0777 "$DOCKER_HOME_DIR" "$CONFIG_DIR" "$WORKSPACE_DIR" || true
|
|
DOCKER_CACHE_CONTAINER_DIR="/home/node/.cache"
|
|
DOCKER_CLI_TOOLS_CONTAINER_DIR="/home/node/.npm-global"
|
|
fi
|
|
|
|
if [[ "$CODEX_HARNESS_AUTH_MODE" == "api-key" ]]; then
|
|
PROFILE_MOUNT=()
|
|
PROFILE_STATUS="api-key-env"
|
|
else
|
|
openclaw_live_init_profile_mount
|
|
fi
|
|
|
|
DOCKER_TRUSTED_HARNESS_CONTAINER_DIR="/trusted-harness"
|
|
DOCKER_TRUSTED_HARNESS_MOUNT=(-v "$TRUSTED_HARNESS_DIR":"$DOCKER_TRUSTED_HARNESS_CONTAINER_DIR":ro)
|
|
|
|
AUTH_FILES=()
|
|
if [[ "$CODEX_HARNESS_AUTH_MODE" != "api-key" ]]; then
|
|
while IFS= read -r auth_file; do
|
|
[[ -n "$auth_file" ]] || continue
|
|
AUTH_FILES+=("$auth_file")
|
|
done < <(openclaw_live_collect_auth_files_from_csv "openai")
|
|
fi
|
|
|
|
AUTH_DIRS=()
|
|
openclaw_live_finalize_auth_mounts
|
|
|
|
DOCKER_AUTH_ENV=()
|
|
if [[ "$CODEX_HARNESS_AUTH_MODE" == "api-key" ]]; then
|
|
docker_env_dir="$(mktemp -d "${RUNNER_TEMP:-/tmp}/openclaw-codex-harness-env.XXXXXX")"
|
|
TEMP_DIRS+=("$docker_env_dir")
|
|
docker_env_file="$docker_env_dir/openai.env"
|
|
{
|
|
printf 'OPENAI_API_KEY=%s\n' "${OPENAI_API_KEY}"
|
|
printf 'CODEX_API_KEY=%s\n' "${CODEX_API_KEY:-$OPENAI_API_KEY}"
|
|
if [[ -n "${OPENAI_BASE_URL:-}" ]]; then
|
|
printf 'OPENAI_BASE_URL=%s\n' "${OPENAI_BASE_URL}"
|
|
fi
|
|
} >"$docker_env_file"
|
|
DOCKER_EXTRA_ENV_FILES+=(--env-file "$docker_env_file")
|
|
fi
|
|
|
|
read -r -d '' LIVE_TEST_CMD <<'EOF' || true
|
|
set -euo pipefail
|
|
[ -f "$HOME/.profile" ] && [ -r "$HOME/.profile" ] && source "$HOME/.profile" || true
|
|
export NPM_CONFIG_PREFIX="${NPM_CONFIG_PREFIX:-$HOME/.npm-global}"
|
|
export npm_config_prefix="$NPM_CONFIG_PREFIX"
|
|
export XDG_CACHE_HOME="${XDG_CACHE_HOME:-$HOME/.cache}"
|
|
export COREPACK_HOME="${COREPACK_HOME:-$XDG_CACHE_HOME/node/corepack}"
|
|
export NPM_CONFIG_CACHE="${NPM_CONFIG_CACHE:-$XDG_CACHE_HOME/npm}"
|
|
export npm_config_cache="$NPM_CONFIG_CACHE"
|
|
cleanup_codex_live_mounts() {
|
|
chmod -R a+rwX "$HOME" "$NPM_CONFIG_PREFIX" "$XDG_CACHE_HOME" 2>/dev/null || true
|
|
}
|
|
trap cleanup_codex_live_mounts EXIT
|
|
if [ "${OPENCLAW_LIVE_CODEX_HARNESS_DEBUG:-}" = "1" ]; then
|
|
id
|
|
mount | grep -E 'openclaw-cache|openclaw-npm|/home/node' || true
|
|
ls -ld "$HOME" "$XDG_CACHE_HOME" "$NPM_CONFIG_PREFIX" 2>/dev/null || true
|
|
fi
|
|
# Force the Codex harness to use the staged `~/.codex` auth files. This lane
|
|
# is not meant to exercise raw OpenAI API-key routing unless the lane
|
|
# explicitly opts into API-key auth for CI.
|
|
if [ "${OPENCLAW_LIVE_CODEX_HARNESS_AUTH:-codex-auth}" != "api-key" ]; then
|
|
unset OPENAI_API_KEY OPENAI_BASE_URL
|
|
fi
|
|
mkdir -p "$NPM_CONFIG_PREFIX" "$XDG_CACHE_HOME" "$COREPACK_HOME" "$NPM_CONFIG_CACHE"
|
|
chmod 700 "$XDG_CACHE_HOME" "$COREPACK_HOME" "$NPM_CONFIG_CACHE" || true
|
|
export PATH="$NPM_CONFIG_PREFIX/bin:$PATH"
|
|
trusted_scripts_dir="${OPENCLAW_LIVE_DOCKER_SCRIPTS_DIR:-/src/scripts}"
|
|
source "$trusted_scripts_dir/lib/live-docker-stage.sh"
|
|
openclaw_live_stage_mounted_auth
|
|
run_setup_command() {
|
|
openclaw_live_run_setup_command \
|
|
"${OPENCLAW_LIVE_CODEX_HARNESS_SETUP_TIMEOUT_SECONDS:?missing live Codex harness setup timeout seconds}" \
|
|
"live Codex harness setup" \
|
|
"$@"
|
|
}
|
|
if [ "${OPENCLAW_LIVE_CODEX_HARNESS_AUTH:-codex-auth}" != "api-key" ] && [ ! -s "$HOME/.codex/auth.json" ]; then
|
|
echo "ERROR: missing ~/.codex/auth.json for Codex harness live test." >&2
|
|
exit 1
|
|
fi
|
|
if [ "${OPENCLAW_LIVE_CODEX_HARNESS_AUTH:-codex-auth}" != "api-key" ]; then
|
|
node --import tsx "$trusted_scripts_dir/prepare-codex-ci-auth.ts" "$HOME/.codex/auth.json"
|
|
fi
|
|
run_setup_command npm install -g "$OPENCLAW_LIVE_CODEX_CLI_PACKAGE_SPEC"
|
|
"$NPM_CONFIG_PREFIX/bin/codex" --version
|
|
if [ "${OPENCLAW_LIVE_CODEX_HARNESS_AUTH:-codex-auth}" = "api-key" ]; then
|
|
printf '%s\n' "$OPENAI_API_KEY" | "$NPM_CONFIG_PREFIX/bin/codex" login --with-api-key >/dev/null
|
|
fi
|
|
tmp_dir="$(mktemp -d)"
|
|
openclaw_live_stage_source_tree "$tmp_dir"
|
|
openclaw_live_stage_node_modules "$tmp_dir"
|
|
openclaw_live_link_runtime_tree "$tmp_dir"
|
|
if [ ! -f "$tmp_dir/extensions/codex/openclaw.plugin.json" ]; then
|
|
echo "ERROR: staged Codex plugin not found for live harness." >&2
|
|
exit 1
|
|
fi
|
|
# Source Gateway and plugin must share one prepared-runtime owner; built artifacts own a
|
|
# separate lifecycle and are validated by the packaged-plugin Docker lane instead.
|
|
export OPENCLAW_BUNDLED_PLUGINS_DIR="$tmp_dir/extensions"
|
|
openclaw_live_stage_state_dir "$tmp_dir/.openclaw-state"
|
|
if [ -n "${OPENCLAW_LIVE_CODEX_TRUSTED_HARNESS_DIR:-}" ] && [ -d "$OPENCLAW_LIVE_CODEX_TRUSTED_HARNESS_DIR" ]; then
|
|
for harness_file in src/gateway/gateway-codex-harness.live-helpers.ts; do
|
|
if [ -f "$OPENCLAW_LIVE_CODEX_TRUSTED_HARNESS_DIR/$harness_file" ]; then
|
|
mkdir -p "$(dirname "$tmp_dir/$harness_file")"
|
|
cp "$OPENCLAW_LIVE_CODEX_TRUSTED_HARNESS_DIR/$harness_file" "$tmp_dir/$harness_file"
|
|
fi
|
|
done
|
|
fi
|
|
openclaw_live_prepare_staged_config
|
|
cd "$tmp_dir"
|
|
if [ "${OPENCLAW_LIVE_CODEX_HARNESS_USE_CI_SAFE_CODEX_CONFIG:-1}" = "1" ]; then
|
|
node --import tsx "$trusted_scripts_dir/prepare-codex-ci-config.ts" "$HOME/.codex/config.toml" "$tmp_dir"
|
|
fi
|
|
codex_preflight_log="$tmp_dir/codex-preflight.log"
|
|
codex_preflight_token="CODEX-PREFLIGHT-OK"
|
|
if ! "$NPM_CONFIG_PREFIX/bin/codex" exec \
|
|
--json \
|
|
--color never \
|
|
--skip-git-repo-check \
|
|
"Reply exactly: $codex_preflight_token" >"$codex_preflight_log" 2>&1; then
|
|
if grep -q "Failed to extract accountId from token" "$codex_preflight_log"; then
|
|
echo "ERROR: Codex auth cannot extract accountId from the available token; refresh OPENCLAW_CODEX_AUTH_JSON or use OPENCLAW_LIVE_CODEX_HARNESS_AUTH=api-key." >&2
|
|
exit 1
|
|
fi
|
|
tail -c 262144 "$codex_preflight_log" >&2 || true
|
|
exit 1
|
|
fi
|
|
run_codex_harness_target() {
|
|
local model="${1:?model required}"
|
|
local thinking="${2:?thinking required}"
|
|
export OPENCLAW_LIVE_CODEX_HARNESS_MODEL="$model"
|
|
export OPENCLAW_LIVE_CODEX_HARNESS_THINKING="$thinking"
|
|
echo "==> Codex harness target: model=$model thinking=$thinking"
|
|
openclaw_live_run_staged_script scripts/test-live -- ${OPENCLAW_LIVE_CODEX_TEST_FILES:-src/gateway/gateway-codex-harness.live.test.ts}
|
|
}
|
|
if [ -n "${OPENCLAW_LIVE_CODEX_HARNESS_TARGETS:-}" ]; then
|
|
IFS=',' read -r -a harness_targets <<<"$OPENCLAW_LIVE_CODEX_HARNESS_TARGETS"
|
|
for harness_target in "${harness_targets[@]}"; do
|
|
model="${harness_target%%=*}"
|
|
thinking="${harness_target##*=}"
|
|
if [ -z "$model" ] || [ -z "$thinking" ] || [ "$model" = "$thinking" ]; then
|
|
echo "ERROR: invalid Codex harness target '$harness_target'; expected provider/model=thinking." >&2
|
|
exit 1
|
|
fi
|
|
run_codex_harness_target "$model" "$thinking"
|
|
done
|
|
else
|
|
run_codex_harness_target \
|
|
"${OPENCLAW_LIVE_CODEX_HARNESS_MODEL:-openai/gpt-5.6-luna}" \
|
|
"${OPENCLAW_LIVE_CODEX_HARNESS_THINKING:-low}"
|
|
fi
|
|
EOF
|
|
|
|
openclaw_live_require_build_extension codex
|
|
# The release package image intentionally excludes externalized plugins such as
|
|
# Codex. This lane must rebuild the live image so the plugin-owned harness is
|
|
# present under the bundled plugin runtime directory.
|
|
OPENCLAW_SKIP_DOCKER_BUILD=0
|
|
export OPENCLAW_SKIP_DOCKER_BUILD
|
|
OPENCLAW_LIVE_DOCKER_REPO_ROOT="$ROOT_DIR" "$TRUSTED_HARNESS_DIR/scripts/test-live-build-docker.sh"
|
|
if openclaw_live_uses_managed_bind_dirs; then
|
|
openclaw_live_chown_bind_dirs_for_container_user \
|
|
"$LIVE_IMAGE_NAME" \
|
|
"$DOCKER_USER" \
|
|
"$CLI_TOOLS_DIR" \
|
|
"$CACHE_HOME_DIR" \
|
|
"$CONFIG_DIR" \
|
|
"$WORKSPACE_DIR" \
|
|
"${DOCKER_HOME_DIR:-}"
|
|
fi
|
|
|
|
echo "==> Run Codex harness live test in Docker"
|
|
echo "==> Model: ${OPENCLAW_LIVE_CODEX_HARNESS_MODEL:-openai/gpt-5.6-luna}"
|
|
echo "==> Thinking: ${OPENCLAW_LIVE_CODEX_HARNESS_THINKING:-low}"
|
|
echo "==> Expected native effort: ${OPENCLAW_LIVE_CODEX_HARNESS_EXPECTED_EFFORT:-auto}"
|
|
echo "==> Targets: ${OPENCLAW_LIVE_CODEX_HARNESS_TARGETS:-single model}"
|
|
echo "==> Target count: $CODEX_HARNESS_TARGET_COUNT"
|
|
echo "==> Docker run timeout: $CODEX_HARNESS_DOCKER_RUN_TIMEOUT"
|
|
echo "==> Chat image probe: ${OPENCLAW_LIVE_CODEX_HARNESS_CHAT_IMAGE_PROBE:-0}"
|
|
echo "==> Image probe: ${OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE:-1}"
|
|
echo "==> MCP probe: ${OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE:-1}"
|
|
echo "==> Multi-session probe: ${OPENCLAW_LIVE_CODEX_HARNESS_MULTI_SESSION_PROBE:-0}"
|
|
echo "==> Subagent probe: ${OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE:-1}"
|
|
echo "==> Subagent count: ${OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_COUNT:-1}"
|
|
echo "==> Subagent-only fast path: ${OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY:-auto}"
|
|
echo "==> Guardian probe: ${OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE:-1}"
|
|
echo "==> Code-mode-only probe: ${OPENCLAW_LIVE_CODEX_HARNESS_CODE_MODE_ONLY:-0}"
|
|
echo "==> Loop relay disabled: ${OPENCLAW_LIVE_CODEX_HARNESS_DISABLE_LOOP_RELAY:-0}"
|
|
echo "==> Resume stress: ${OPENCLAW_LIVE_CODEX_HARNESS_RESUME_STRESS:-0}"
|
|
echo "==> Resume stress history turns: ${OPENCLAW_LIVE_CODEX_HARNESS_RESUME_STRESS_HISTORY_TURNS:-4}"
|
|
echo "==> Resume stress restarts: ${OPENCLAW_LIVE_CODEX_HARNESS_RESUME_STRESS_RESTARTS:-3}"
|
|
echo "==> Compaction stress: ${OPENCLAW_LIVE_CODEX_HARNESS_COMPACTION_STRESS:-0}"
|
|
echo "==> Compaction stress turns: ${OPENCLAW_LIVE_CODEX_HARNESS_COMPACTION_STRESS_TURNS:-4}"
|
|
echo "==> Large output bytes: ${OPENCLAW_LIVE_CODEX_HARNESS_LARGE_OUTPUT_BYTES:-300000}"
|
|
echo "==> Auth mode: $CODEX_HARNESS_AUTH_MODE"
|
|
echo "==> Profile file: $PROFILE_STATUS"
|
|
echo "==> CI-safe Codex config: ${OPENCLAW_LIVE_CODEX_HARNESS_USE_CI_SAFE_CODEX_CONFIG:-1}"
|
|
echo "==> Test files: ${OPENCLAW_LIVE_CODEX_TEST_FILES:-src/gateway/gateway-codex-harness.live.test.ts}"
|
|
echo "==> Codex CLI package: $CODEX_CLI_PACKAGE_SPEC"
|
|
echo "==> Harness fallback: none"
|
|
echo "==> Auth files: ${AUTH_FILES_CSV:-none}"
|
|
DOCKER_RUN_ARGS=()
|
|
openclaw_live_init_docker_run_args DOCKER_RUN_ARGS "$CODEX_HARNESS_DOCKER_RUN_TIMEOUT"
|
|
DOCKER_RUN_ARGS+=(--rm -t \
|
|
-u "$DOCKER_USER" \
|
|
--entrypoint bash \
|
|
-e COREPACK_ENABLE_DOWNLOAD_PROMPT=0 \
|
|
-e HOME=/home/node \
|
|
-e NPM_CONFIG_PREFIX="$DOCKER_CLI_TOOLS_CONTAINER_DIR" \
|
|
-e npm_config_prefix="$DOCKER_CLI_TOOLS_CONTAINER_DIR" \
|
|
-e XDG_CACHE_HOME="$DOCKER_CACHE_CONTAINER_DIR" \
|
|
-e COREPACK_HOME="$DOCKER_CACHE_CONTAINER_DIR/node/corepack" \
|
|
-e NPM_CONFIG_CACHE="$DOCKER_CACHE_CONTAINER_DIR/npm" \
|
|
-e npm_config_cache="$DOCKER_CACHE_CONTAINER_DIR/npm" \
|
|
-e NODE_OPTIONS="$(openclaw_live_container_node_options)" \
|
|
-e OPENCLAW_AGENT_HARNESS_FALLBACK=none \
|
|
-e OPENCLAW_DOCKER_AUTH_PRESTAGED="$DOCKER_AUTH_PRESTAGED" \
|
|
-e OPENCLAW_CODEX_APP_SERVER_BIN="${OPENCLAW_CODEX_APP_SERVER_BIN:-codex}" \
|
|
-e OPENCLAW_DOCKER_AUTH_FILES_RESOLVED="$AUTH_FILES_CSV" \
|
|
-e OPENCLAW_LIVE_DOCKER_SOURCE_STAGE_MODE="${OPENCLAW_LIVE_DOCKER_SOURCE_STAGE_MODE:-copy}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_AUTH="$CODEX_HARNESS_AUTH_MODE" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS=1 \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_CHAT_IMAGE_PROBE="${OPENCLAW_LIVE_CODEX_HARNESS_CHAT_IMAGE_PROBE:-0}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_CODE_MODE_ONLY="${OPENCLAW_LIVE_CODEX_HARNESS_CODE_MODE_ONLY:-0}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_COMPACTION_STRESS="${OPENCLAW_LIVE_CODEX_HARNESS_COMPACTION_STRESS:-0}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_COMPACTION_STRESS_TURNS="${OPENCLAW_LIVE_CODEX_HARNESS_COMPACTION_STRESS_TURNS:-4}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_DEBUG="${OPENCLAW_LIVE_CODEX_HARNESS_DEBUG:-}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_DISABLE_LOOP_RELAY="${OPENCLAW_LIVE_CODEX_HARNESS_DISABLE_LOOP_RELAY:-0}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE="${OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE:-1}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE="${OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE:-1}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_LARGE_OUTPUT_BYTES="${OPENCLAW_LIVE_CODEX_HARNESS_LARGE_OUTPUT_BYTES:-300000}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE="${OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE:-1}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_MULTI_SESSION_PROBE="${OPENCLAW_LIVE_CODEX_HARNESS_MULTI_SESSION_PROBE:-0}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_MODEL="${OPENCLAW_LIVE_CODEX_HARNESS_MODEL:-openai/gpt-5.6-luna}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_TARGETS="${OPENCLAW_LIVE_CODEX_HARNESS_TARGETS:-}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_THINKING="${OPENCLAW_LIVE_CODEX_HARNESS_THINKING:-low}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_EXPECTED_EFFORT="${OPENCLAW_LIVE_CODEX_HARNESS_EXPECTED_EFFORT:-}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_REQUIRE_GUARDIAN_EVENTS="${OPENCLAW_LIVE_CODEX_HARNESS_REQUIRE_GUARDIAN_EVENTS:-1}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_REQUEST_TIMEOUT_MS="${OPENCLAW_LIVE_CODEX_HARNESS_REQUEST_TIMEOUT_MS:-}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_RESUME_STRESS="${OPENCLAW_LIVE_CODEX_HARNESS_RESUME_STRESS:-0}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_RESUME_STRESS_HISTORY_TURNS="${OPENCLAW_LIVE_CODEX_HARNESS_RESUME_STRESS_HISTORY_TURNS:-4}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_RESUME_STRESS_RESTARTS="${OPENCLAW_LIVE_CODEX_HARNESS_RESUME_STRESS_RESTARTS:-3}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_SETUP_TIMEOUT_SECONDS="$CODEX_HARNESS_SETUP_TIMEOUT_SECONDS" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY="${OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY:-}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_COUNT="${OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_COUNT:-1}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE="${OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE:-1}" \
|
|
-e OPENCLAW_LIVE_CODEX_HARNESS_USE_CI_SAFE_CODEX_CONFIG="${OPENCLAW_LIVE_CODEX_HARNESS_USE_CI_SAFE_CODEX_CONFIG:-1}" \
|
|
-e OPENCLAW_LIVE_CODEX_CLI_PACKAGE_SPEC="$CODEX_CLI_PACKAGE_SPEC" \
|
|
-e OPENCLAW_CLI_BACKEND_LOG_OUTPUT="${OPENCLAW_CLI_BACKEND_LOG_OUTPUT:-}" \
|
|
-e OPENCLAW_TEST_CONSOLE="${OPENCLAW_TEST_CONSOLE:-}" \
|
|
-e OPENCLAW_LIVE_DOCKER_SCRIPTS_DIR="${DOCKER_TRUSTED_HARNESS_CONTAINER_DIR}/scripts" \
|
|
-e OPENCLAW_LIVE_DOCKER_TRUSTED_HARNESS_DIR="$DOCKER_TRUSTED_HARNESS_CONTAINER_DIR" \
|
|
-e OPENCLAW_LIVE_CODEX_TRUSTED_HARNESS_DIR="$DOCKER_TRUSTED_HARNESS_CONTAINER_DIR" \
|
|
-e OPENCLAW_LIVE_CODEX_BIND="${OPENCLAW_LIVE_CODEX_BIND:-}" \
|
|
-e OPENCLAW_LIVE_CODEX_BIND_MODEL="${OPENCLAW_LIVE_CODEX_BIND_MODEL:-}" \
|
|
-e OPENCLAW_LIVE_CODEX_BIND_PROVIDER="${OPENCLAW_LIVE_CODEX_BIND_PROVIDER:-}" \
|
|
-e OPENCLAW_LIVE_CODEX_BIND_REQUEST_TIMEOUT_MS="${OPENCLAW_LIVE_CODEX_BIND_REQUEST_TIMEOUT_MS:-}" \
|
|
-e OPENCLAW_LIVE_CODEX_BIND_TIMEOUT_MS="${OPENCLAW_LIVE_CODEX_BIND_TIMEOUT_MS:-}" \
|
|
-e OPENCLAW_LIVE_CODEX_TEST_FILES="${OPENCLAW_LIVE_CODEX_TEST_FILES:-}" \
|
|
-e OPENCLAW_LIVE_TEST=1 \
|
|
-e OPENCLAW_VITEST_FS_MODULE_CACHE=0)
|
|
openclaw_live_append_array DOCKER_RUN_ARGS DOCKER_AUTH_ENV
|
|
openclaw_live_append_array DOCKER_RUN_ARGS DOCKER_EXTRA_ENV_FILES
|
|
openclaw_live_append_array DOCKER_RUN_ARGS DOCKER_HOME_MOUNT
|
|
openclaw_live_append_array DOCKER_RUN_ARGS DOCKER_TRUSTED_HARNESS_MOUNT
|
|
DOCKER_RUN_ARGS+=(\
|
|
-v "$ROOT_DIR":/src:ro \
|
|
-v "$CONFIG_DIR":/home/node/.openclaw \
|
|
-v "$WORKSPACE_DIR":/home/node/.openclaw/workspace)
|
|
if [[ "$CODEX_HARNESS_AUTH_MODE" != "api-key" ]]; then
|
|
DOCKER_RUN_ARGS+=(\
|
|
-v "$CACHE_HOME_DIR":"$DOCKER_CACHE_CONTAINER_DIR" \
|
|
-v "$CLI_TOOLS_DIR":"$DOCKER_CLI_TOOLS_CONTAINER_DIR")
|
|
fi
|
|
openclaw_live_append_array DOCKER_RUN_ARGS EXTERNAL_AUTH_MOUNTS
|
|
openclaw_live_append_array DOCKER_RUN_ARGS PROFILE_MOUNT
|
|
DOCKER_RUN_ARGS+=(\
|
|
"$LIVE_IMAGE_NAME" \
|
|
-lc "$LIVE_TEST_CMD")
|
|
if [[ "${OPENCLAW_LIVE_CODEX_HARNESS_DEBUG:-}" == "1" ]]; then
|
|
echo "==> Docker debug: host ids and mounted dirs"
|
|
id
|
|
ls -ld "$CACHE_HOME_DIR" "$CLI_TOOLS_DIR" "${DOCKER_HOME_DIR:-$HOME}" 2>/dev/null || true
|
|
printf '==> Docker debug args:'
|
|
printf ' %q' "${DOCKER_RUN_ARGS[@]}"
|
|
printf '\n'
|
|
fi
|
|
"${DOCKER_RUN_ARGS[@]}"
|