diff --git a/pkg/workflow/copilot_engine_execution.go b/pkg/workflow/copilot_engine_execution.go index 5a4634779a6..040d546a7d4 100644 --- a/pkg/workflow/copilot_engine_execution.go +++ b/pkg/workflow/copilot_engine_execution.go @@ -621,7 +621,39 @@ func (e *CopilotEngine) buildCopilotExecutionStep(workflowData *WorkflowData, co // Inject GH_TOKEN for CLI proxy (added after filtering since it uses a special // fallback expression that is always allowed when cli-proxy is enabled) addCliProxyGHTokenToEnv(filteredEnv, workflowData) - return GitHubActionStep(FormatStepWithCommandAndEnv(stepLines, command, filteredEnv)) + return GitHubActionStep(FormatStepWithCommandAndEnv(stepLines, buildCopilotCommandWithFailureDiagnostics(command), filteredEnv)) +} + +const ( + copilotExecutionStderrPath = logsFolder + "copilot-cli-exec.stderr.log" + copilotExecutionExitCodePath = logsFolder + "copilot-cli-exec.exitcode" +) + +func buildCopilotCommandWithFailureDiagnostics(command string) string { + // Capture command stderr to a dedicated artifact file while preserving stderr in the job log. + // Note: "%%s" is required below because this is a fmt.Sprintf template. + return fmt.Sprintf(`mkdir -p %s +rm -f %s %s +set +e +( +%s +) 2> >(tee -a %s >&2) +GH_AW_COPILOT_EXEC_EXIT_CODE=$? +set -e +if [ "$GH_AW_COPILOT_EXEC_EXIT_CODE" -ne 0 ]; then + printf '%%s\n' "$GH_AW_COPILOT_EXEC_EXIT_CODE" > %s +else + rm -f %s +fi +exit "$GH_AW_COPILOT_EXEC_EXIT_CODE"`, + logsFolder, + copilotExecutionStderrPath, + copilotExecutionExitCodePath, + command, + copilotExecutionStderrPath, + copilotExecutionExitCodePath, + copilotExecutionStderrPath, + ) } // copilotSupportsNoAskUser returns true when the effective Copilot CLI version supports the diff --git a/pkg/workflow/copilot_engine_test.go b/pkg/workflow/copilot_engine_test.go index 7199bcca871..a85cc521110 100644 --- a/pkg/workflow/copilot_engine_test.go +++ b/pkg/workflow/copilot_engine_test.go @@ -151,6 +151,15 @@ func TestCopilotEngineExecutionSteps(t *testing.T) { if !strings.Contains(stepContent, "/tmp/gh-aw/test.log") { t.Errorf("Expected command to contain log file name in step content:\n%s", stepContent) } + if !strings.Contains(stepContent, "copilot-cli-exec.stderr.log") { + t.Errorf("Expected execution step to capture stderr to copilot-cli-exec.stderr.log, got:\n%s", stepContent) + } + if !strings.Contains(stepContent, "copilot-cli-exec.exitcode") { + t.Errorf("Expected execution step to capture failure exit code to copilot-cli-exec.exitcode, got:\n%s", stepContent) + } + if !strings.Contains(stepContent, "GH_AW_COPILOT_EXEC_EXIT_CODE=$?") { + t.Errorf("Expected execution step to preserve Copilot CLI exit code, got:\n%s", stepContent) + } if !strings.Contains(stepContent, "--prompt-file /tmp/gh-aw/aw-prompts/prompt.txt") { t.Errorf("Expected command to pass prompt file path directly, got:\n%s", stepContent) diff --git a/pkg/workflow/testdata/TestWasmGolden_AllEngines/copilot.golden b/pkg/workflow/testdata/TestWasmGolden_AllEngines/copilot.golden index dd4f4419023..5119b10eb72 100644 --- a/pkg/workflow/testdata/TestWasmGolden_AllEngines/copilot.golden +++ b/pkg/workflow/testdata/TestWasmGolden_AllEngines/copilot.golden @@ -502,6 +502,10 @@ jobs: # Copilot CLI tool arguments (sorted): timeout-minutes: 10 run: | + mkdir -p /tmp/gh-aw/sandbox/agent/logs/ + rm -f /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.stderr.log /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.exitcode + set +e + ( set -o pipefail printf '%s' "$(date +%s%3N)" > /tmp/gh-aw/agent_cli_start_ms.txt trap 'rm -f "$HOME/.copilot/settings.json"' EXIT @@ -537,6 +541,15 @@ jobs: # shellcheck disable=SC1003,SC2016,SC2086 awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" ${GH_AW_TOOL_CACHE_MOUNT:+--mount "$GH_AW_TOOL_CACHE_MOUNT"} ${GH_AW_DOCKER_HOST:+--docker-host "$GH_AW_DOCKER_HOST"} ${GH_AW_DOCKER_HOST_PATH_PREFIX_ARGS} --env-all --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --log-level info --skip-pull \ -- /bin/bash -c 'set +o histexpand; : "${RUNNER_TOOL_CACHE:?RUNNER_TOOL_CACHE must be set}"; GH_AW_TOOL_CACHE="$RUNNER_TOOL_CACHE"; export PATH="$(find "$GH_AW_TOOL_CACHE" -maxdepth 5 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || true)"; fi; if [ -z "$GH_AW_NODE_EXEC" ]; then echo "node runtime missing on this runner — check runtimes.node in workflow YAML" >&2; exit 127; fi; GH_AW_NPM_GLOBAL_ROOT="$(npm root -g 2>/dev/null || true)"; if [ -n "$GH_AW_NPM_GLOBAL_ROOT" ]; then export NODE_PATH="${GH_AW_NPM_GLOBAL_ROOT}${NODE_PATH:+:${NODE_PATH}}"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --allow-all-paths --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log + ) 2> >(tee -a /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.stderr.log >&2) + GH_AW_COPILOT_EXEC_EXIT_CODE=$? + set -e + if [ "$GH_AW_COPILOT_EXEC_EXIT_CODE" -ne 0 ]; then + printf '%s\n' "$GH_AW_COPILOT_EXEC_EXIT_CODE" > /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.exitcode + else + rm -f /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.stderr.log + fi + exit "$GH_AW_COPILOT_EXEC_EXIT_CODE" env: AWF_REFLECT_ENABLED: 1 COPILOT_AGENT_RUNNER_TYPE: STANDALONE diff --git a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/basic-copilot.golden b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/basic-copilot.golden index 2d78f74cc47..b776dfa23b9 100644 --- a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/basic-copilot.golden +++ b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/basic-copilot.golden @@ -502,6 +502,10 @@ jobs: # Copilot CLI tool arguments (sorted): timeout-minutes: 10 run: | + mkdir -p /tmp/gh-aw/sandbox/agent/logs/ + rm -f /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.stderr.log /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.exitcode + set +e + ( set -o pipefail printf '%s' "$(date +%s%3N)" > /tmp/gh-aw/agent_cli_start_ms.txt trap 'rm -f "$HOME/.copilot/settings.json"' EXIT @@ -537,6 +541,15 @@ jobs: # shellcheck disable=SC1003,SC2016,SC2086 awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" ${GH_AW_TOOL_CACHE_MOUNT:+--mount "$GH_AW_TOOL_CACHE_MOUNT"} ${GH_AW_DOCKER_HOST:+--docker-host "$GH_AW_DOCKER_HOST"} ${GH_AW_DOCKER_HOST_PATH_PREFIX_ARGS} --env-all --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --log-level info --skip-pull \ -- /bin/bash -c 'set +o histexpand; : "${RUNNER_TOOL_CACHE:?RUNNER_TOOL_CACHE must be set}"; GH_AW_TOOL_CACHE="$RUNNER_TOOL_CACHE"; export PATH="$(find "$GH_AW_TOOL_CACHE" -maxdepth 5 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || true)"; fi; if [ -z "$GH_AW_NODE_EXEC" ]; then echo "node runtime missing on this runner — check runtimes.node in workflow YAML" >&2; exit 127; fi; GH_AW_NPM_GLOBAL_ROOT="$(npm root -g 2>/dev/null || true)"; if [ -n "$GH_AW_NPM_GLOBAL_ROOT" ]; then export NODE_PATH="${GH_AW_NPM_GLOBAL_ROOT}${NODE_PATH:+:${NODE_PATH}}"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --allow-all-paths --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log + ) 2> >(tee -a /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.stderr.log >&2) + GH_AW_COPILOT_EXEC_EXIT_CODE=$? + set -e + if [ "$GH_AW_COPILOT_EXEC_EXIT_CODE" -ne 0 ]; then + printf '%s\n' "$GH_AW_COPILOT_EXEC_EXIT_CODE" > /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.exitcode + else + rm -f /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.stderr.log + fi + exit "$GH_AW_COPILOT_EXEC_EXIT_CODE" env: AWF_REFLECT_ENABLED: 1 COPILOT_AGENT_RUNNER_TYPE: STANDALONE diff --git a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/playwright-cli-mode.golden b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/playwright-cli-mode.golden index 714fca5dbc7..2fd08592df9 100644 --- a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/playwright-cli-mode.golden +++ b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/playwright-cli-mode.golden @@ -522,6 +522,10 @@ jobs: # Copilot CLI tool arguments (sorted): timeout-minutes: 20 run: | + mkdir -p /tmp/gh-aw/sandbox/agent/logs/ + rm -f /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.stderr.log /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.exitcode + set +e + ( set -o pipefail printf '%s' "$(date +%s%3N)" > /tmp/gh-aw/agent_cli_start_ms.txt trap 'rm -f "$HOME/.copilot/settings.json"' EXIT @@ -557,6 +561,15 @@ jobs: # shellcheck disable=SC1003,SC2016,SC2086 awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" ${GH_AW_TOOL_CACHE_MOUNT:+--mount "$GH_AW_TOOL_CACHE_MOUNT"} ${GH_AW_DOCKER_HOST:+--docker-host "$GH_AW_DOCKER_HOST"} ${GH_AW_DOCKER_HOST_PATH_PREFIX_ARGS} --env-all --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --log-level info --skip-pull \ -- /bin/bash -c 'set +o histexpand; : "${RUNNER_TOOL_CACHE:?RUNNER_TOOL_CACHE must be set}"; GH_AW_TOOL_CACHE="$RUNNER_TOOL_CACHE"; export PATH="$(find "$GH_AW_TOOL_CACHE" -maxdepth 5 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || true)"; fi; if [ -z "$GH_AW_NODE_EXEC" ]; then echo "node runtime missing on this runner — check runtimes.node in workflow YAML" >&2; exit 127; fi; GH_AW_NPM_GLOBAL_ROOT="$(npm root -g 2>/dev/null || true)"; if [ -n "$GH_AW_NPM_GLOBAL_ROOT" ]; then export NODE_PATH="${GH_AW_NPM_GLOBAL_ROOT}${NODE_PATH:+:${NODE_PATH}}"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --allow-all-paths --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log + ) 2> >(tee -a /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.stderr.log >&2) + GH_AW_COPILOT_EXEC_EXIT_CODE=$? + set -e + if [ "$GH_AW_COPILOT_EXEC_EXIT_CODE" -ne 0 ]; then + printf '%s\n' "$GH_AW_COPILOT_EXEC_EXIT_CODE" > /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.exitcode + else + rm -f /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.stderr.log + fi + exit "$GH_AW_COPILOT_EXEC_EXIT_CODE" env: AWF_REFLECT_ENABLED: 1 COPILOT_AGENT_RUNNER_TYPE: STANDALONE diff --git a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/smoke-copilot.golden b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/smoke-copilot.golden index 71e6687381c..308b3a4427d 100644 --- a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/smoke-copilot.golden +++ b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/smoke-copilot.golden @@ -759,6 +759,10 @@ jobs: # Copilot CLI tool arguments (sorted): timeout-minutes: 15 run: | + mkdir -p /tmp/gh-aw/sandbox/agent/logs/ + rm -f /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.stderr.log /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.exitcode + set +e + ( set -o pipefail printf '%s' "$(date +%s%3N)" > /tmp/gh-aw/agent_cli_start_ms.txt trap 'rm -f "$HOME/.copilot/settings.json"' EXIT @@ -794,6 +798,15 @@ jobs: # shellcheck disable=SC1003,SC2016,SC2086 awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" ${GH_AW_TOOL_CACHE_MOUNT:+--mount "$GH_AW_TOOL_CACHE_MOUNT"} ${GH_AW_DOCKER_HOST:+--docker-host "$GH_AW_DOCKER_HOST"} ${GH_AW_DOCKER_HOST_PATH_PREFIX_ARGS} --env-all --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --log-level info --skip-pull \ -- /bin/bash -c 'set +o histexpand; : "${RUNNER_TOOL_CACHE:?RUNNER_TOOL_CACHE must be set}"; GH_AW_TOOL_CACHE="$RUNNER_TOOL_CACHE"; export PATH="$(find "$GH_AW_TOOL_CACHE" -maxdepth 5 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || true)"; fi; if [ -z "$GH_AW_NODE_EXEC" ]; then echo "node runtime missing on this runner — check runtimes.node in workflow YAML" >&2; exit 127; fi; GH_AW_NPM_GLOBAL_ROOT="$(npm root -g 2>/dev/null || true)"; if [ -n "$GH_AW_NPM_GLOBAL_ROOT" ]; then export NODE_PATH="${GH_AW_NPM_GLOBAL_ROOT}${NODE_PATH:+:${NODE_PATH}}"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --allow-all-paths --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log + ) 2> >(tee -a /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.stderr.log >&2) + GH_AW_COPILOT_EXEC_EXIT_CODE=$? + set -e + if [ "$GH_AW_COPILOT_EXEC_EXIT_CODE" -ne 0 ]; then + printf '%s\n' "$GH_AW_COPILOT_EXEC_EXIT_CODE" > /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.exitcode + else + rm -f /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.stderr.log + fi + exit "$GH_AW_COPILOT_EXEC_EXIT_CODE" env: AWF_REFLECT_ENABLED: 1 COPILOT_AGENT_RUNNER_TYPE: STANDALONE diff --git a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/with-imports.golden b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/with-imports.golden index a9ff21a1a57..3e53d4474dc 100644 --- a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/with-imports.golden +++ b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/with-imports.golden @@ -503,6 +503,10 @@ jobs: # Copilot CLI tool arguments (sorted): timeout-minutes: 10 run: | + mkdir -p /tmp/gh-aw/sandbox/agent/logs/ + rm -f /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.stderr.log /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.exitcode + set +e + ( set -o pipefail printf '%s' "$(date +%s%3N)" > /tmp/gh-aw/agent_cli_start_ms.txt trap 'rm -f "$HOME/.copilot/settings.json"' EXIT @@ -538,6 +542,15 @@ jobs: # shellcheck disable=SC1003,SC2016,SC2086 awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" ${GH_AW_TOOL_CACHE_MOUNT:+--mount "$GH_AW_TOOL_CACHE_MOUNT"} ${GH_AW_DOCKER_HOST:+--docker-host "$GH_AW_DOCKER_HOST"} ${GH_AW_DOCKER_HOST_PATH_PREFIX_ARGS} --env-all --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --log-level info --skip-pull \ -- /bin/bash -c 'set +o histexpand; : "${RUNNER_TOOL_CACHE:?RUNNER_TOOL_CACHE must be set}"; GH_AW_TOOL_CACHE="$RUNNER_TOOL_CACHE"; export PATH="$(find "$GH_AW_TOOL_CACHE" -maxdepth 5 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || true)"; fi; if [ -z "$GH_AW_NODE_EXEC" ]; then echo "node runtime missing on this runner — check runtimes.node in workflow YAML" >&2; exit 127; fi; GH_AW_NPM_GLOBAL_ROOT="$(npm root -g 2>/dev/null || true)"; if [ -n "$GH_AW_NPM_GLOBAL_ROOT" ]; then export NODE_PATH="${GH_AW_NPM_GLOBAL_ROOT}${NODE_PATH:+:${NODE_PATH}}"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --allow-all-paths --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log + ) 2> >(tee -a /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.stderr.log >&2) + GH_AW_COPILOT_EXEC_EXIT_CODE=$? + set -e + if [ "$GH_AW_COPILOT_EXEC_EXIT_CODE" -ne 0 ]; then + printf '%s\n' "$GH_AW_COPILOT_EXEC_EXIT_CODE" > /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.exitcode + else + rm -f /tmp/gh-aw/sandbox/agent/logs/copilot-cli-exec.stderr.log + fi + exit "$GH_AW_COPILOT_EXEC_EXIT_CODE" env: AWF_REFLECT_ENABLED: 1 COPILOT_AGENT_RUNNER_TYPE: STANDALONE