Audit core.warning/core.error usage (#269)

* Stop using command-based logs for warnings and errors

Co-authored-by: Cursor <cursoragent@cursor.com>

* revert

* tweak

* de-noise

* Remove redundant ts() timestamp prefix from log calls

* Restore timestamped logging and refine debug output routing.

Bring back timestamp prefixes for standard logs and make log.debug emit via core.debug when runner debug is enabled, while still surfacing debug lines for --debug runs.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Mateusz Burzyński <mateuszburzynski@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: pullfrog[bot] <226033991+pullfrog[bot]@users.noreply.github.com>
Co-authored-by: Colin McDonnell <colinmcd94@gmail.com>
This commit is contained in:
pullfrog[bot]
2026-02-19 23:11:47 +00:00
committed by pullfrog[bot]
parent 4ee1ae89a5
commit 70f1c47a28
20 changed files with 296 additions and 286 deletions
+6 -7
View File
@@ -173,8 +173,7 @@ export const claude = agent({
onStderr: (chunk) => {
const trimmed = chunk.trim();
if (trimmed) {
log.debug(`[claude stderr] ${trimmed}`);
log.warning(trimmed);
log.info(`[claude stderr] ${trimmed}`);
finalOutput += trimmed + "\n";
}
},
@@ -267,7 +266,7 @@ const messageHandlers: SDKMessageHandlers = {
// Log bash output in a collapsed group
log.startGroup(`bash output`);
if (content.is_error) {
log.warning(outputContent);
log.info(outputContent);
} else {
log.info(outputContent);
}
@@ -275,7 +274,7 @@ const messageHandlers: SDKMessageHandlers = {
// Clean up the tracked ID
bashToolIds.delete(toolUseId);
} else if (content.is_error) {
log.warning(`Tool error: ${outputContent}`);
log.info(`Tool error: ${outputContent}`);
} else {
// log successful non-bash tool result at debug level
log.debug(`tool output: ${outputContent}`);
@@ -310,11 +309,11 @@ const messageHandlers: SDKMessageHandlers = {
],
]);
} else if (data.subtype === "error_max_turns") {
log.error(`Max turns reached: ${JSON.stringify(data)}`);
log.info(`Max turns reached: ${JSON.stringify(data)}`);
} else if (data.subtype === "error_during_execution") {
log.error(`Execution error: ${JSON.stringify(data)}`);
log.info(`Execution error: ${JSON.stringify(data)}`);
} else {
log.error(`Failed: ${JSON.stringify(data)}`);
log.info(`Failed: ${JSON.stringify(data)}`);
}
},
system: () => {},
+7 -8
View File
@@ -43,7 +43,7 @@ async function isModelAvailable(ctx: { apiKey: string; model: string }): Promise
signal: AbortSignal.timeout(10_000),
});
if (!response.ok) {
log.warning(
log.info(
`failed to list models (HTTP ${response.status}), falling back to ${FALLBACK_MODEL}`
);
return false;
@@ -51,7 +51,7 @@ async function isModelAvailable(ctx: { apiKey: string; model: string }): Promise
const body = (await response.json()) as { data: Array<{ id: string }> };
return body.data.some((m) => m.id === ctx.model);
} catch (err) {
log.warning(`failed to list models: ${err}, falling back to ${FALLBACK_MODEL}`);
log.info(`failed to list models: ${err}, falling back to ${FALLBACK_MODEL}`);
return false;
}
}
@@ -262,8 +262,7 @@ export const codex = agent({
onStderr: (chunk) => {
const trimmed = chunk.trim();
if (trimmed) {
log.debug(`[codex stderr] ${trimmed}`);
log.warning(trimmed);
log.info(`[codex stderr] ${trimmed}`);
finalOutput += trimmed + "\n";
}
},
@@ -319,7 +318,7 @@ const messageHandlers: {
]);
},
"turn.failed": (event) => {
log.error(`Turn failed: ${event.error.message}`);
log.info(`Turn failed: ${event.error.message}`);
},
"item.started": (event, commandExecutionIds, thinkingTimer) => {
const item = event.item;
@@ -362,7 +361,7 @@ const messageHandlers: {
thinkingTimer.markToolResult();
log.startGroup(`bash output`);
if (item.status === "failed" || (item.exit_code !== undefined && item.exit_code !== 0)) {
log.warning(item.aggregated_output || "Command failed");
log.info(item.aggregated_output || "Command failed");
} else {
log.info(item.aggregated_output || "");
}
@@ -372,7 +371,7 @@ const messageHandlers: {
} else if (item.type === "mcp_tool_call") {
thinkingTimer.markToolResult();
if (item.status === "failed" && item.error) {
log.warning(`MCP tool call failed: ${item.error.message}`);
log.info(`MCP tool call failed: ${item.error.message}`);
} else if ((item as any).output) {
// log successful MCP tool call output so it appears in captured output
const output = (item as any).output;
@@ -388,6 +387,6 @@ const messageHandlers: {
}
},
error: (event) => {
log.error(`Error: ${event.message}`);
log.info(`Error: ${event.message}`);
},
};
+3 -3
View File
@@ -210,7 +210,7 @@ export const cursor = agent({
const result = event.tool_call?.mcpToolCall?.result?.success;
const isError = result?.isError;
if (isError) {
log.warning("Tool call failed");
log.info("Tool call failed");
} else {
// log successful tool result so it appears in output
// handle both formats: { text: string } or { text: { text: string } }
@@ -320,12 +320,12 @@ export const cursor = agent({
const text = data.toString();
stderr += text;
process.stderr.write(text);
log.warning(text);
log.info(text);
});
child.on("close", async (code, signal) => {
if (signal) {
log.warning(`Cursor CLI terminated by signal: ${signal}`);
log.info(`Cursor CLI terminated by signal: ${signal}`);
}
const duration = ((performance.now() - startTime) / 1000).toFixed(1);
+4 -5
View File
@@ -149,7 +149,7 @@ const messageHandlers = {
if (event.status === "error") {
const errorMsg =
typeof event.output === "string" ? event.output : JSON.stringify(event.output);
log.warning(`Tool call failed: ${errorMsg}`);
log.info(`Tool call failed: ${errorMsg}`);
} else if (event.output) {
// log successful tool result so it appears in output
const outputStr =
@@ -270,8 +270,7 @@ export const gemini = agent({
onStderr: (chunk) => {
const trimmed = chunk.trim();
if (trimmed) {
log.debug(`[gemini stderr] ${trimmed}`);
log.warning(trimmed);
log.info(`[gemini stderr] ${trimmed}`);
finalOutput += trimmed + "\n";
}
},
@@ -286,7 +285,7 @@ export const gemini = agent({
// retry on transient API errors (500, 503, INTERNAL, etc.)
if (attempt < MAX_ATTEMPTS && isTransientApiError(errorMessage)) {
log.warning(
log.info(
`» transient Gemini API error on attempt ${attempt}/${MAX_ATTEMPTS}, retrying in ${RETRY_DELAY_MS / 1000}s...`
);
await new Promise((resolve) => setTimeout(resolve, RETRY_DELAY_MS));
@@ -313,7 +312,7 @@ export const gemini = agent({
// retry on transient API errors from spawn exceptions too
if (attempt < MAX_ATTEMPTS && isTransientApiError(errorMessage)) {
log.warning(
log.info(
`» transient Gemini API error on attempt ${attempt}/${MAX_ATTEMPTS}, retrying in ${RETRY_DELAY_MS / 1000}s...`
);
await new Promise((resolve) => setTimeout(resolve, RETRY_DELAY_MS));
+10 -10
View File
@@ -154,7 +154,7 @@ export const opencode = agent({
activeToolCalls > 0
? ` (waiting for ${activeToolCalls} tool call${activeToolCalls > 1 ? "s" : ""})`
: " (OpenCode may be processing internally - LLM calls, planning, etc.)";
log.warning(
log.info(
`» no activity for ${(timeSinceLastActivity / 1000).toFixed(1)}s${toolCallInfo} (${eventCount} events processed so far)`
);
}
@@ -186,7 +186,7 @@ export const opencode = agent({
const providerError = detectProviderError(trimmed);
if (providerError) {
lastProviderError = providerError;
log.error(`» provider error detected (${providerError}): ${trimmed.substring(0, 500)}`);
log.info(`» provider error detected (${providerError}): ${trimmed.substring(0, 500)}`);
} else {
// OpenCode's --print-logs output goes to stderr. demote internal
// INFO/DEBUG bus traffic to debug so it doesn't drown out tool
@@ -207,9 +207,9 @@ export const opencode = agent({
const diagnosis = lastProviderError
? `provider error: ${lastProviderError}`
: "unknown cause (no stdout events received)";
log.error(`» OpenCode produced 0 events (${diagnosis})`);
log.info(`» OpenCode produced 0 events (${diagnosis})`);
if (stderrContext) {
log.error(`» last stderr output:\n${stderrContext}`);
log.info(`» last stderr output:\n${stderrContext}`);
}
}
@@ -263,12 +263,12 @@ export const opencode = agent({
? "OpenCode produced 0 stdout events - check if the model provider is reachable"
: `${eventCount} events were processed before the hang`;
log.error(
log.info(
`» OpenCode ${isActivityTimeout ? "hung" : "failed"} after ${(duration / 1000).toFixed(1)}s: ${errorMessage}`
);
log.error(`» diagnosis: ${diagnosis}`);
log.info(`» diagnosis: ${diagnosis}`);
if (stderrContext) {
log.error(
log.info(
`» recent stderr (last ${Math.min(recentStderr.length, 10)} lines):\n${stderrContext}`
);
}
@@ -600,7 +600,7 @@ const messageHandlers = {
log.debug(` output: ${typeof output === "string" ? output : JSON.stringify(output)}`);
}
if (toolDuration > 5000) {
log.warning(
log.info(
`» ⚠️ tool call took ${(toolDuration / 1000).toFixed(1)}s - this may indicate network latency or slow processing`
);
}
@@ -608,7 +608,7 @@ const messageHandlers = {
}
if (status === "error") {
const errorMsg = typeof output === "string" ? output : JSON.stringify(output);
log.error(`» ❌ tool call failed: ${errorMsg}`);
log.info(`» ❌ tool call failed: ${errorMsg}`);
} else if (output) {
// log successful tool result so it appears in captured output
const outputStr = typeof output === "string" ? output : JSON.stringify(output);
@@ -624,7 +624,7 @@ const messageHandlers = {
);
if (event.status === "error") {
log.error(`» OpenCode CLI failed: ${JSON.stringify(event)}`);
log.info(`» OpenCode CLI failed: ${JSON.stringify(event)}`);
} else {
// log tokens once at the end (use stats from result if available, otherwise use accumulated from step_finish)
const inputTokens = event.stats?.input_tokens || accumulatedTokens.input || 0;
+133 -134
View File
@@ -451,7 +451,7 @@ var require_tunnel = __commonJS({
connectOptions.headers = connectOptions.headers || {};
connectOptions.headers["Proxy-Authorization"] = "Basic " + new Buffer(connectOptions.proxyAuth).toString("base64");
}
debug2("making CONNECT request");
debug3("making CONNECT request");
var connectReq = self2.request(connectOptions);
connectReq.useChunkedEncodingByDefault = false;
connectReq.once("response", onResponse);
@@ -471,7 +471,7 @@ var require_tunnel = __commonJS({
connectReq.removeAllListeners();
socket.removeAllListeners();
if (res.statusCode !== 200) {
debug2(
debug3(
"tunneling socket could not be established, statusCode=%d",
res.statusCode
);
@@ -483,7 +483,7 @@ var require_tunnel = __commonJS({
return;
}
if (head.length > 0) {
debug2("got illegal response body from proxy");
debug3("got illegal response body from proxy");
socket.destroy();
var error49 = new Error("got illegal response body from proxy");
error49.code = "ECONNRESET";
@@ -491,13 +491,13 @@ var require_tunnel = __commonJS({
self2.removeSocket(placeholder);
return;
}
debug2("tunneling connection has established");
debug3("tunneling connection has established");
self2.sockets[self2.sockets.indexOf(placeholder)] = socket;
return cb(socket);
}
function onError(cause) {
connectReq.removeAllListeners();
debug2(
debug3(
"tunneling socket could not be established, cause=%s\n",
cause.message,
cause.stack
@@ -559,9 +559,9 @@ var require_tunnel = __commonJS({
}
return target;
}
var debug2;
var debug3;
if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) {
debug2 = function() {
debug3 = function() {
var args2 = Array.prototype.slice.call(arguments);
if (typeof args2[0] === "string") {
args2[0] = "TUNNEL: " + args2[0];
@@ -571,10 +571,10 @@ var require_tunnel = __commonJS({
console.error.apply(console, args2);
};
} else {
debug2 = function() {
debug3 = function() {
};
}
exports.debug = debug2;
exports.debug = debug3;
}
});
@@ -19785,10 +19785,10 @@ Support boolean input list: \`true | True | TRUE | false | False | FALSE\``);
return process.env["RUNNER_DEBUG"] === "1";
}
exports.isDebug = isDebug2;
function debug2(message) {
function debug3(message) {
(0, command_1.issueCommand)("debug", {}, message);
}
exports.debug = debug2;
exports.debug = debug3;
function error49(message, properties = {}) {
(0, command_1.issueCommand)("error", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message);
}
@@ -75490,11 +75490,11 @@ var require_common = __commonJS({
let enableOverride = null;
let namespacesCache;
let enabledCache;
function debug2(...args2) {
if (!debug2.enabled) {
function debug3(...args2) {
if (!debug3.enabled) {
return;
}
const self2 = debug2;
const self2 = debug3;
const curr = Number(/* @__PURE__ */ new Date());
const ms = curr - (prevTime || curr);
self2.diff = ms;
@@ -75524,12 +75524,12 @@ var require_common = __commonJS({
const logFn = self2.log || createDebug.log;
logFn.apply(self2, args2);
}
debug2.namespace = namespace;
debug2.useColors = createDebug.useColors();
debug2.color = createDebug.selectColor(namespace);
debug2.extend = extend3;
debug2.destroy = createDebug.destroy;
Object.defineProperty(debug2, "enabled", {
debug3.namespace = namespace;
debug3.useColors = createDebug.useColors();
debug3.color = createDebug.selectColor(namespace);
debug3.extend = extend3;
debug3.destroy = createDebug.destroy;
Object.defineProperty(debug3, "enabled", {
enumerable: true,
configurable: false,
get: () => {
@@ -75547,9 +75547,9 @@ var require_common = __commonJS({
}
});
if (typeof createDebug.init === "function") {
createDebug.init(debug2);
createDebug.init(debug3);
}
return debug2;
return debug3;
}
function extend3(namespace, delimiter) {
const newDebug = createDebug(this.namespace + (typeof delimiter === "undefined" ? ":" : delimiter) + namespace);
@@ -75959,11 +75959,11 @@ var require_node = __commonJS({
function load() {
return process.env.DEBUG;
}
function init(debug2) {
debug2.inspectOpts = {};
function init(debug3) {
debug3.inspectOpts = {};
const keys = Object.keys(exports.inspectOpts);
for (let i = 0; i < keys.length; i++) {
debug2.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
debug3.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
}
}
module.exports = require_common()(exports);
@@ -76100,13 +76100,13 @@ function mergeArrays(chunks) {
}
return mergedArray;
}
var import_debug, debug, syncBufferSize, ddSignatureArray, eocdSignatureBytes, ZipHandler;
var import_debug, debug2, syncBufferSize, ddSignatureArray, eocdSignatureBytes, ZipHandler;
var init_ZipHandler = __esm({
"node_modules/.pnpm/@tokenizer+inflate@0.4.1/node_modules/@tokenizer/inflate/lib/ZipHandler.js"() {
init_lib3();
import_debug = __toESM(require_src2(), 1);
init_ZipToken();
debug = (0, import_debug.default)("tokenizer:inflate");
debug2 = (0, import_debug.default)("tokenizer:inflate");
syncBufferSize = 256 * 1024;
ddSignatureArray = signatureToArray(Signature.DataDescriptor);
eocdSignatureBytes = signatureToArray(Signature.EndOfCentralDirectory);
@@ -76135,14 +76135,14 @@ var init_ZipHandler = __esm({
}
async readCentralDirectory() {
if (!this.tokenizer.supportsRandomAccess()) {
debug("Cannot reading central-directory without random-read support");
debug2("Cannot reading central-directory without random-read support");
return;
}
debug("Reading central-directory...");
debug2("Reading central-directory...");
const pos = this.tokenizer.position;
const offset = await this.findEndOfCentralDirectoryLocator();
if (offset > 0) {
debug("Central-directory 32-bit signature found");
debug2("Central-directory 32-bit signature found");
const eocdHeader = await this.tokenizer.readToken(EndOfCentralDirectoryRecordToken, offset);
const files = [];
this.tokenizer.setPosition(eocdHeader.offsetOfStartOfCd);
@@ -76155,7 +76155,7 @@ var init_ZipHandler = __esm({
await this.tokenizer.ignore(entry.extraFieldLength);
await this.tokenizer.ignore(entry.fileCommentLength);
files.push(entry);
debug(`Add central-directory file-entry: n=${n + 1}/${files.length}: filename=${files[n].filename}`);
debug2(`Add central-directory file-entry: n=${n + 1}/${files.length}: filename=${files[n].filename}`);
}
this.tokenizer.setPosition(pos);
return files;
@@ -76179,7 +76179,7 @@ var init_ZipHandler = __esm({
if (zipHeader.dataDescriptor && zipHeader.compressedSize === 0) {
const chunks = [];
let len = syncBufferSize;
debug("Compressed-file-size unknown, scanning for next data-descriptor-signature....");
debug2("Compressed-file-size unknown, scanning for next data-descriptor-signature....");
let nextHeaderIndex = -1;
while (nextHeaderIndex < 0 && len === syncBufferSize) {
len = await this.tokenizer.peekBuffer(this.syncBuffer, { mayBeLess: true });
@@ -76193,22 +76193,22 @@ var init_ZipHandler = __esm({
await this.tokenizer.ignore(size);
}
}
debug(`Found data-descriptor-signature at pos=${this.tokenizer.position}`);
debug2(`Found data-descriptor-signature at pos=${this.tokenizer.position}`);
if (next2.handler) {
await this.inflate(zipHeader, mergeArrays(chunks), next2.handler);
}
} else {
if (next2.handler) {
debug(`Reading compressed-file-data: ${zipHeader.compressedSize} bytes`);
debug2(`Reading compressed-file-data: ${zipHeader.compressedSize} bytes`);
fileData = new Uint8Array(zipHeader.compressedSize);
await this.tokenizer.readBuffer(fileData);
await this.inflate(zipHeader, fileData, next2.handler);
} else {
debug(`Ignoring compressed-file-data: ${zipHeader.compressedSize} bytes`);
debug2(`Ignoring compressed-file-data: ${zipHeader.compressedSize} bytes`);
await this.tokenizer.ignore(zipHeader.compressedSize);
}
}
debug(`Reading data-descriptor at pos=${this.tokenizer.position}`);
debug2(`Reading data-descriptor at pos=${this.tokenizer.position}`);
if (zipHeader.dataDescriptor) {
const dataDescriptor = await this.tokenizer.readToken(DataDescriptor);
if (dataDescriptor.signature !== 134695760) {
@@ -76241,7 +76241,7 @@ var init_ZipHandler = __esm({
if (zipHeader.compressedMethod !== 8) {
throw new Error(`Unsupported ZIP compression method: ${zipHeader.compressedMethod}`);
}
debug(`Decompress filename=${zipHeader.filename}, compressed-size=${fileData.length}`);
debug2(`Decompress filename=${zipHeader.filename}, compressed-size=${fileData.length}`);
const uncompressedData = await _ZipHandler.decompressDeflateRaw(fileData);
return cb(uncompressedData);
}
@@ -95716,9 +95716,9 @@ var require_constants11 = __commonJS({
var require_debug = __commonJS({
"node_modules/.pnpm/semver@7.7.3/node_modules/semver/internal/debug.js"(exports, module) {
"use strict";
var debug2 = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args2) => console.error("SEMVER", ...args2) : () => {
var debug3 = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args2) => console.error("SEMVER", ...args2) : () => {
};
module.exports = debug2;
module.exports = debug3;
}
});
@@ -95731,7 +95731,7 @@ var require_re = __commonJS({
MAX_SAFE_BUILD_LENGTH,
MAX_LENGTH
} = require_constants11();
var debug2 = require_debug();
var debug3 = require_debug();
exports = module.exports = {};
var re = exports.re = [];
var safeRe = exports.safeRe = [];
@@ -95754,7 +95754,7 @@ var require_re = __commonJS({
var createToken = (name, value2, isGlobal) => {
const safe = makeSafeRegex(value2);
const index = R++;
debug2(name, index, value2);
debug3(name, index, value2);
t[name] = index;
src[index] = value2;
safeSrc[index] = safe;
@@ -95858,7 +95858,7 @@ var require_identifiers = __commonJS({
var require_semver = __commonJS({
"node_modules/.pnpm/semver@7.7.3/node_modules/semver/classes/semver.js"(exports, module) {
"use strict";
var debug2 = require_debug();
var debug3 = require_debug();
var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants11();
var { safeRe: re, t } = require_re();
var parseOptions = require_parse_options();
@@ -95880,7 +95880,7 @@ var require_semver = __commonJS({
`version is longer than ${MAX_LENGTH} characters`
);
}
debug2("SemVer", version3, options);
debug3("SemVer", version3, options);
this.options = options;
this.loose = !!options.loose;
this.includePrerelease = !!options.includePrerelease;
@@ -95928,7 +95928,7 @@ var require_semver = __commonJS({
return this.version;
}
compare(other) {
debug2("SemVer.compare", this.version, this.options, other);
debug3("SemVer.compare", this.version, this.options, other);
if (!(other instanceof _SemVer)) {
if (typeof other === "string" && other === this.version) {
return 0;
@@ -95979,7 +95979,7 @@ var require_semver = __commonJS({
do {
const a = this.prerelease[i];
const b = other.prerelease[i];
debug2("prerelease compare", i, a, b);
debug3("prerelease compare", i, a, b);
if (a === void 0 && b === void 0) {
return 0;
} else if (b === void 0) {
@@ -96001,7 +96001,7 @@ var require_semver = __commonJS({
do {
const a = this.build[i];
const b = other.build[i];
debug2("build compare", i, a, b);
debug3("build compare", i, a, b);
if (a === void 0 && b === void 0) {
return 0;
} else if (b === void 0) {
@@ -96629,21 +96629,21 @@ var require_range = __commonJS({
const loose = this.options.loose;
const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE];
range2 = range2.replace(hr, hyphenReplace(this.options.includePrerelease));
debug2("hyphen replace", range2);
debug3("hyphen replace", range2);
range2 = range2.replace(re[t.COMPARATORTRIM], comparatorTrimReplace);
debug2("comparator trim", range2);
debug3("comparator trim", range2);
range2 = range2.replace(re[t.TILDETRIM], tildeTrimReplace);
debug2("tilde trim", range2);
debug3("tilde trim", range2);
range2 = range2.replace(re[t.CARETTRIM], caretTrimReplace);
debug2("caret trim", range2);
debug3("caret trim", range2);
let rangeList = range2.split(" ").map((comp) => parseComparator(comp, this.options)).join(" ").split(/\s+/).map((comp) => replaceGTE0(comp, this.options));
if (loose) {
rangeList = rangeList.filter((comp) => {
debug2("loose invalid filter", comp, this.options);
debug3("loose invalid filter", comp, this.options);
return !!comp.match(re[t.COMPARATORLOOSE]);
});
}
debug2("range list", rangeList);
debug3("range list", rangeList);
const rangeMap = /* @__PURE__ */ new Map();
const comparators = rangeList.map((comp) => new Comparator(comp, this.options));
for (const comp of comparators) {
@@ -96698,7 +96698,7 @@ var require_range = __commonJS({
var cache = new LRU();
var parseOptions = require_parse_options();
var Comparator = require_comparator();
var debug2 = require_debug();
var debug3 = require_debug();
var SemVer = require_semver();
var {
safeRe: re,
@@ -96724,15 +96724,15 @@ var require_range = __commonJS({
};
var parseComparator = (comp, options) => {
comp = comp.replace(re[t.BUILD], "");
debug2("comp", comp, options);
debug3("comp", comp, options);
comp = replaceCarets(comp, options);
debug2("caret", comp);
debug3("caret", comp);
comp = replaceTildes(comp, options);
debug2("tildes", comp);
debug3("tildes", comp);
comp = replaceXRanges(comp, options);
debug2("xrange", comp);
debug3("xrange", comp);
comp = replaceStars(comp, options);
debug2("stars", comp);
debug3("stars", comp);
return comp;
};
var isX = (id) => !id || id.toLowerCase() === "x" || id === "*";
@@ -96742,7 +96742,7 @@ var require_range = __commonJS({
var replaceTilde = (comp, options) => {
const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE];
return comp.replace(r, (_, M, m, p, pr) => {
debug2("tilde", comp, _, M, m, p, pr);
debug3("tilde", comp, _, M, m, p, pr);
let ret;
if (isX(M)) {
ret = "";
@@ -96751,12 +96751,12 @@ var require_range = __commonJS({
} else if (isX(p)) {
ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;
} else if (pr) {
debug2("replaceTilde pr", pr);
debug3("replaceTilde pr", pr);
ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
} else {
ret = `>=${M}.${m}.${p} <${M}.${+m + 1}.0-0`;
}
debug2("tilde return", ret);
debug3("tilde return", ret);
return ret;
});
};
@@ -96764,11 +96764,11 @@ var require_range = __commonJS({
return comp.trim().split(/\s+/).map((c) => replaceCaret(c, options)).join(" ");
};
var replaceCaret = (comp, options) => {
debug2("caret", comp, options);
debug3("caret", comp, options);
const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET];
const z2 = options.includePrerelease ? "-0" : "";
return comp.replace(r, (_, M, m, p, pr) => {
debug2("caret", comp, _, M, m, p, pr);
debug3("caret", comp, _, M, m, p, pr);
let ret;
if (isX(M)) {
ret = "";
@@ -96781,7 +96781,7 @@ var require_range = __commonJS({
ret = `>=${M}.${m}.0${z2} <${+M + 1}.0.0-0`;
}
} else if (pr) {
debug2("replaceCaret pr", pr);
debug3("replaceCaret pr", pr);
if (M === "0") {
if (m === "0") {
ret = `>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p + 1}-0`;
@@ -96792,7 +96792,7 @@ var require_range = __commonJS({
ret = `>=${M}.${m}.${p}-${pr} <${+M + 1}.0.0-0`;
}
} else {
debug2("no pr");
debug3("no pr");
if (M === "0") {
if (m === "0") {
ret = `>=${M}.${m}.${p}${z2} <${M}.${m}.${+p + 1}-0`;
@@ -96803,19 +96803,19 @@ var require_range = __commonJS({
ret = `>=${M}.${m}.${p} <${+M + 1}.0.0-0`;
}
}
debug2("caret return", ret);
debug3("caret return", ret);
return ret;
});
};
var replaceXRanges = (comp, options) => {
debug2("replaceXRanges", comp, options);
debug3("replaceXRanges", comp, options);
return comp.split(/\s+/).map((c) => replaceXRange(c, options)).join(" ");
};
var replaceXRange = (comp, options) => {
comp = comp.trim();
const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];
return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
debug2("xRange", comp, ret, gtlt, M, m, p, pr);
debug3("xRange", comp, ret, gtlt, M, m, p, pr);
const xM = isX(M);
const xm = xM || isX(m);
const xp = xm || isX(p);
@@ -96862,16 +96862,16 @@ var require_range = __commonJS({
} else if (xp) {
ret = `>=${M}.${m}.0${pr} <${M}.${+m + 1}.0-0`;
}
debug2("xRange return", ret);
debug3("xRange return", ret);
return ret;
});
};
var replaceStars = (comp, options) => {
debug2("replaceStars", comp, options);
debug3("replaceStars", comp, options);
return comp.trim().replace(re[t.STAR], "");
};
var replaceGTE0 = (comp, options) => {
debug2("replaceGTE0", comp, options);
debug3("replaceGTE0", comp, options);
return comp.trim().replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], "");
};
var hyphenReplace = (incPr) => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr) => {
@@ -96909,7 +96909,7 @@ var require_range = __commonJS({
}
if (version3.prerelease.length && !options.includePrerelease) {
for (let i = 0; i < set2.length; i++) {
debug2(set2[i].semver);
debug3(set2[i].semver);
if (set2[i].semver === Comparator.ANY) {
continue;
}
@@ -96946,7 +96946,7 @@ var require_comparator = __commonJS({
}
}
comp = comp.trim().split(/\s+/).join(" ");
debug2("comparator", comp, options);
debug3("comparator", comp, options);
this.options = options;
this.loose = !!options.loose;
this.parse(comp);
@@ -96955,7 +96955,7 @@ var require_comparator = __commonJS({
} else {
this.value = this.operator + this.semver.version;
}
debug2("comp", this);
debug3("comp", this);
}
parse(comp) {
const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR];
@@ -96977,7 +96977,7 @@ var require_comparator = __commonJS({
return this.value;
}
test(version3) {
debug2("Comparator.test", version3, this.options.loose);
debug3("Comparator.test", version3, this.options.loose);
if (this.semver === ANY || version3 === ANY) {
return true;
}
@@ -97034,7 +97034,7 @@ var require_comparator = __commonJS({
var parseOptions = require_parse_options();
var { safeRe: re, t } = require_re();
var cmp = require_cmp();
var debug2 = require_debug();
var debug3 = require_debug();
var SemVer = require_semver();
var Range = require_range();
}
@@ -135596,7 +135596,12 @@ var isGitHubActions = !!process.env.GITHUB_ACTIONS;
var isInsideDocker = existsSync("/.dockerenv");
// utils/log.ts
var isDebugEnabled = () => process.env.LOG_LEVEL === "debug" || process.env.ACTIONS_STEP_DEBUG === "true" || core.isDebug();
var isRunnerDebugEnabled = () => core.isDebug();
var isLocalDebugEnabled = () => process.env.LOG_LEVEL === "debug" || process.env.ACTIONS_STEP_DEBUG === "true";
var isDebugEnabled = () => isLocalDebugEnabled() || isRunnerDebugEnabled();
function ts() {
return isDebugEnabled() ? `[${(/* @__PURE__ */ new Date()).toISOString()}] ` : "";
}
function formatArgs(args2) {
return args2.map((arg) => {
if (typeof arg === "string") return arg;
@@ -135713,19 +135718,16 @@ function separator(length = 50) {
const separatorText = "\u2500".repeat(length);
core.info(separatorText);
}
function ts() {
return isDebugEnabled() ? `[${(/* @__PURE__ */ new Date()).toISOString()}] ` : "";
}
var log = {
/** Print info message */
info: (...args2) => {
core.info(`${ts()}${formatArgs(args2)}`);
},
/** Print warning message */
/** Print a warning message. Use only for warnings that should be displayed in the job summary. */
warning: (...args2) => {
core.warning(`${ts()}${formatArgs(args2)}`);
},
/** Print error message */
/** Print an error message. Use only for errors that should be displayed in the job summary. */
error: (...args2) => {
core.error(`${ts()}${formatArgs(args2)}`);
},
@@ -135733,10 +135735,14 @@ var log = {
success: (...args2) => {
core.info(`${ts()}\xBB ${formatArgs(args2)}`);
},
/** Print debug message (only if LOG_LEVEL=debug) */
/** Print debug message (only when debug mode is enabled) */
debug: (...args2) => {
if (isDebugEnabled()) {
core.info(`[${(/* @__PURE__ */ new Date()).toISOString()}] [DEBUG] ${formatArgs(args2)}`);
if (isRunnerDebugEnabled()) {
core.debug(formatArgs(args2));
return;
}
if (isLocalDebugEnabled()) {
core.info(`${ts()}[DEBUG] ${formatArgs(args2)}`);
}
},
/** Print a formatted box with text */
@@ -139476,9 +139482,7 @@ async function retry(fn2, options = {}) {
throw error49;
}
const delay2 = delayMs * attempt;
log.warning(
`\xBB ${label} failed (attempt ${attempt}/${maxAttempts}), retrying in ${delay2}ms...`
);
log.info(`\xBB ${label} failed (attempt ${attempt}/${maxAttempts}), retrying in ${delay2}ms...`);
await new Promise((resolve3) => setTimeout(resolve3, delay2));
}
}
@@ -139754,7 +139758,7 @@ async function revokeGitHubInstallationToken(token) {
});
log.debug("\xBB installation token revoked");
} catch (error49) {
log.warning(
log.info(
`Failed to revoke installation token: ${error49 instanceof Error ? error49.message : String(error49)}`
);
}
@@ -140173,7 +140177,7 @@ var execute = (fn2, toolName) => {
} catch (error49) {
const errorMessage = error49 instanceof Error ? error49.message : String(error49);
const prefix = toolName ? `[${toolName}]` : "tool";
log.error(`${prefix} error: ${errorMessage}`);
log.info(`${prefix} error: ${errorMessage}`);
log.debug(`${prefix} params: ${formatJsonValue(params)}`);
return handleToolError(error49);
}
@@ -140312,7 +140316,7 @@ function detectSandboxMethod() {
} catch {
}
detectedSandboxMethod = "none";
log.warning("PID namespace isolation not available - falling back to env filtering only");
log.info("PID namespace isolation not available - falling back to env filtering only");
return "none";
}
function spawnBash(params) {
@@ -140452,8 +140456,8 @@ ${stderr}` : stderr : stdout;
[timed out after ${timeout}ms]` : `[timed out after ${timeout}ms]`;
const finalExitCode = exitCode ?? (timedOut ? 124 : -1);
if (finalExitCode !== 0) {
log.error(`bash command failed with exit code ${finalExitCode}: ${params.command}`);
if (output) log.error(`output: ${output.trim()}`);
log.info(`bash command failed with exit code ${finalExitCode}: ${params.command}`);
if (output) log.info(`output: ${output.trim()}`);
}
return {
output: output.trim(),
@@ -140556,7 +140560,7 @@ function $git(subcommand, args2, options) {
});
if (result.status !== 0) {
const stderr = result.stderr?.trim() ?? "";
log.error(`git ${subcommand} failed: ${stderr}`);
log.info(`git ${subcommand} failed: ${stderr}`);
throw new Error(`git ${subcommand} failed: ${stderr}`);
}
return {
@@ -140729,7 +140733,7 @@ async function spawn2(options) {
if (idleMs > activityTimeoutMs) {
isActivityTimedOut = true;
const idleSec = Math.round(idleMs / 1e3);
log.error(`no output for ${idleSec}s from pid=${child.pid} (${cmd}), killing process`);
log.info(`no output for ${idleSec}s from pid=${child.pid} (${cmd}), killing process`);
child.kill("SIGKILL");
clearInterval(activityCheckIntervalId);
}
@@ -141231,7 +141235,7 @@ function GetCheckSuiteLogsTool(ctx) {
});
log.debug(`analyzed logs for job ${job.name}: ${analysis.index.length} indexed lines`);
} catch (error49) {
log.error(`failed to fetch logs for job ${job.id}: ${error49}`);
log.info(`failed to fetch logs for job ${job.id}: ${error49}`);
}
}
}
@@ -142010,7 +142014,7 @@ function DelegateTool(ctx) {
};
} catch (err) {
const errorMessage = err instanceof Error ? err.message : String(err);
log.error(`\xBB delegation to ${selectedMode.name} crashed: ${errorMessage}`);
log.info(`\xBB delegation to ${selectedMode.name} crashed: ${errorMessage}`);
return {
success: false,
mode: selectedMode.name,
@@ -144046,7 +144050,7 @@ function ResolveReviewThreadTool(ctx) {
const errorMessage = error49 instanceof Error ? error49.message : String(error49);
const isResolved = errorMessage.includes("already resolved") || errorMessage.includes("isResolved");
const message = isResolved ? `thread ${params.thread_id} was already resolved` : `failed to resolve thread ${params.thread_id}: ${errorMessage}`;
log.warning(message);
log.info(message);
return {
thread_id: params.thread_id,
is_resolved: isResolved,
@@ -144965,8 +144969,7 @@ var claude = agent({
onStderr: (chunk) => {
const trimmed = chunk.trim();
if (trimmed) {
log.debug(`[claude stderr] ${trimmed}`);
log.warning(trimmed);
log.info(`[claude stderr] ${trimmed}`);
finalOutput2 += trimmed + "\n";
}
}
@@ -145022,14 +145025,14 @@ var messageHandlers = {
if (isBashTool) {
log.startGroup(`bash output`);
if (content.is_error) {
log.warning(outputContent);
log.info(outputContent);
} else {
log.info(outputContent);
}
log.endGroup();
bashToolIds.delete(toolUseId);
} else if (content.is_error) {
log.warning(`Tool error: ${outputContent}`);
log.info(`Tool error: ${outputContent}`);
} else {
log.debug(`tool output: ${outputContent}`);
}
@@ -145062,11 +145065,11 @@ var messageHandlers = {
]
]);
} else if (data.subtype === "error_max_turns") {
log.error(`Max turns reached: ${JSON.stringify(data)}`);
log.info(`Max turns reached: ${JSON.stringify(data)}`);
} else if (data.subtype === "error_during_execution") {
log.error(`Execution error: ${JSON.stringify(data)}`);
log.info(`Execution error: ${JSON.stringify(data)}`);
} else {
log.error(`Failed: ${JSON.stringify(data)}`);
log.info(`Failed: ${JSON.stringify(data)}`);
}
},
system: () => {
@@ -145101,7 +145104,7 @@ async function isModelAvailable(ctx) {
signal: AbortSignal.timeout(1e4)
});
if (!response.ok) {
log.warning(
log.info(
`failed to list models (HTTP ${response.status}), falling back to ${FALLBACK_MODEL}`
);
return false;
@@ -145109,7 +145112,7 @@ async function isModelAvailable(ctx) {
const body = await response.json();
return body.data.some((m) => m.id === ctx.model);
} catch (err) {
log.warning(`failed to list models: ${err}, falling back to ${FALLBACK_MODEL}`);
log.info(`failed to list models: ${err}, falling back to ${FALLBACK_MODEL}`);
return false;
}
}
@@ -145252,8 +145255,7 @@ var codex = agent({
onStderr: (chunk) => {
const trimmed = chunk.trim();
if (trimmed) {
log.debug(`[codex stderr] ${trimmed}`);
log.warning(trimmed);
log.info(`[codex stderr] ${trimmed}`);
finalOutput2 += trimmed + "\n";
}
}
@@ -145294,7 +145296,7 @@ var messageHandlers2 = {
]);
},
"turn.failed": (event) => {
log.error(`Turn failed: ${event.error.message}`);
log.info(`Turn failed: ${event.error.message}`);
},
"item.started": (event, commandExecutionIds, thinkingTimer) => {
const item = event.item;
@@ -145334,7 +145336,7 @@ var messageHandlers2 = {
thinkingTimer.markToolResult();
log.startGroup(`bash output`);
if (item.status === "failed" || item.exit_code !== void 0 && item.exit_code !== 0) {
log.warning(item.aggregated_output || "Command failed");
log.info(item.aggregated_output || "Command failed");
} else {
log.info(item.aggregated_output || "");
}
@@ -145344,7 +145346,7 @@ var messageHandlers2 = {
} else if (item.type === "mcp_tool_call") {
thinkingTimer.markToolResult();
if (item.status === "failed" && item.error) {
log.warning(`MCP tool call failed: ${item.error.message}`);
log.info(`MCP tool call failed: ${item.error.message}`);
} else if (item.output) {
const output = item.output;
const outputStr = typeof output === "string" ? output : JSON.stringify(output);
@@ -145357,7 +145359,7 @@ var messageHandlers2 = {
}
},
error: (event) => {
log.error(`Error: ${event.message}`);
log.info(`Error: ${event.message}`);
}
};
@@ -145458,7 +145460,7 @@ var cursor = agent({
const result = event.tool_call?.mcpToolCall?.result?.success;
const isError = result?.isError;
if (isError) {
log.warning("Tool call failed");
log.info("Tool call failed");
} else {
const contentItem = result?.content?.[0];
const textValue = contentItem?.text;
@@ -145534,11 +145536,11 @@ var cursor = agent({
const text = data.toString();
stderr += text;
process.stderr.write(text);
log.warning(text);
log.info(text);
});
child.on("close", async (code, signal) => {
if (signal) {
log.warning(`Cursor CLI terminated by signal: ${signal}`);
log.info(`Cursor CLI terminated by signal: ${signal}`);
}
const duration4 = ((performance6.now() - startTime) / 1e3).toFixed(1);
if (code === 0) {
@@ -145683,7 +145685,7 @@ var messageHandlers3 = {
thinkingTimer.markToolResult();
if (event.status === "error") {
const errorMsg = typeof event.output === "string" ? event.output : JSON.stringify(event.output);
log.warning(`Tool call failed: ${errorMsg}`);
log.info(`Tool call failed: ${errorMsg}`);
} else if (event.output) {
const outputStr = typeof event.output === "string" ? event.output : JSON.stringify(event.output);
log.debug(`tool output: ${outputStr}`);
@@ -145783,8 +145785,7 @@ var gemini = agent({
onStderr: (chunk) => {
const trimmed = chunk.trim();
if (trimmed) {
log.debug(`[gemini stderr] ${trimmed}`);
log.warning(trimmed);
log.info(`[gemini stderr] ${trimmed}`);
finalOutput2 += trimmed + "\n";
}
}
@@ -145792,7 +145793,7 @@ var gemini = agent({
if (result.exitCode !== 0) {
const errorMessage = result.stderr || finalOutput2 || result.stdout || "Unknown error - no output from Gemini CLI";
if (attempt < MAX_ATTEMPTS && isTransientApiError(errorMessage)) {
log.warning(
log.info(
`\xBB transient Gemini API error on attempt ${attempt}/${MAX_ATTEMPTS}, retrying in ${RETRY_DELAY_MS / 1e3}s...`
);
await new Promise((resolve3) => setTimeout(resolve3, RETRY_DELAY_MS));
@@ -145814,7 +145815,7 @@ var gemini = agent({
} catch (error49) {
const errorMessage = error49 instanceof Error ? error49.message : String(error49);
if (attempt < MAX_ATTEMPTS && isTransientApiError(errorMessage)) {
log.warning(
log.info(
`\xBB transient Gemini API error on attempt ${attempt}/${MAX_ATTEMPTS}, retrying in ${RETRY_DELAY_MS / 1e3}s...`
);
await new Promise((resolve3) => setTimeout(resolve3, RETRY_DELAY_MS));
@@ -145983,7 +145984,7 @@ var opencode = agent({
if (timeSinceLastActivity > 1e4) {
const activeToolCalls = toolCallTimings.size;
const toolCallInfo = activeToolCalls > 0 ? ` (waiting for ${activeToolCalls} tool call${activeToolCalls > 1 ? "s" : ""})` : " (OpenCode may be processing internally - LLM calls, planning, etc.)";
log.warning(
log.info(
`\xBB no activity for ${(timeSinceLastActivity / 1e3).toFixed(1)}s${toolCallInfo} (${eventCount} events processed so far)`
);
}
@@ -146009,7 +146010,7 @@ var opencode = agent({
const providerError = detectProviderError(trimmed);
if (providerError) {
lastProviderError = providerError;
log.error(`\xBB provider error detected (${providerError}): ${trimmed.substring(0, 500)}`);
log.info(`\xBB provider error detected (${providerError}): ${trimmed.substring(0, 500)}`);
} else {
log.debug(trimmed);
}
@@ -146022,9 +146023,9 @@ var opencode = agent({
if (eventCount === 0) {
const stderrContext = recentStderr.join("\n");
const diagnosis = lastProviderError ? `provider error: ${lastProviderError}` : "unknown cause (no stdout events received)";
log.error(`\xBB OpenCode produced 0 events (${diagnosis})`);
log.info(`\xBB OpenCode produced 0 events (${diagnosis})`);
if (stderrContext) {
log.error(`\xBB last stderr output:
log.info(`\xBB last stderr output:
${stderrContext}`);
}
}
@@ -146063,12 +146064,12 @@ ${stderrContext}`);
const isActivityTimeout = errorMessage.includes("activity timeout");
const stderrContext = recentStderr.slice(-10).join("\n");
const diagnosis = lastProviderError ? `likely cause: ${lastProviderError}` : eventCount === 0 ? "OpenCode produced 0 stdout events - check if the model provider is reachable" : `${eventCount} events were processed before the hang`;
log.error(
log.info(
`\xBB OpenCode ${isActivityTimeout ? "hung" : "failed"} after ${(duration4 / 1e3).toFixed(1)}s: ${errorMessage}`
);
log.error(`\xBB diagnosis: ${diagnosis}`);
log.info(`\xBB diagnosis: ${diagnosis}`);
if (stderrContext) {
log.error(
log.info(
`\xBB recent stderr (last ${Math.min(recentStderr.length, 10)} lines):
${stderrContext}`
);
@@ -146222,7 +146223,7 @@ var messageHandlers4 = {
log.debug(` output: ${typeof output === "string" ? output : JSON.stringify(output)}`);
}
if (toolDuration > 5e3) {
log.warning(
log.info(
`\xBB \u26A0\uFE0F tool call took ${(toolDuration / 1e3).toFixed(1)}s - this may indicate network latency or slow processing`
);
}
@@ -146230,7 +146231,7 @@ var messageHandlers4 = {
}
if (status === "error") {
const errorMsg = typeof output === "string" ? output : JSON.stringify(output);
log.error(`\xBB \u274C tool call failed: ${errorMsg}`);
log.info(`\xBB \u274C tool call failed: ${errorMsg}`);
} else if (output) {
const outputStr = typeof output === "string" ? output : JSON.stringify(output);
log.debug(`tool output: ${outputStr}`);
@@ -146244,7 +146245,7 @@ var messageHandlers4 = {
`\xBB OpenCode result: status=${status}, duration=${duration4}ms, tool_calls=${toolCalls}`
);
if (event.status === "error") {
log.error(`\xBB OpenCode CLI failed: ${JSON.stringify(event)}`);
log.info(`\xBB OpenCode CLI failed: ${JSON.stringify(event)}`);
} else {
const inputTokens = event.stats?.input_tokens || accumulatedTokens.input || 0;
const outputTokens = event.stats?.output_tokens || accumulatedTokens.output || 0;
@@ -146891,9 +146892,7 @@ async function setupGit(params) {
log.debug("\xBB git hooks disabled (bash=disabled)");
}
} catch (error49) {
log.warning(
`Failed to set git config: ${error49 instanceof Error ? error49.message : String(error49)}`
);
log.info(`Failed to set git config: ${error49 instanceof Error ? error49.message : String(error49)}`);
}
try {
execSync3("git config --local --unset-all http.https://github.com/.extraheader", {
+28 -24
View File
@@ -399,7 +399,7 @@ var require_tunnel = __commonJS({
connectOptions.headers = connectOptions.headers || {};
connectOptions.headers["Proxy-Authorization"] = "Basic " + new Buffer(connectOptions.proxyAuth).toString("base64");
}
debug2("making CONNECT request");
debug3("making CONNECT request");
var connectReq = self2.request(connectOptions);
connectReq.useChunkedEncodingByDefault = false;
connectReq.once("response", onResponse);
@@ -419,7 +419,7 @@ var require_tunnel = __commonJS({
connectReq.removeAllListeners();
socket.removeAllListeners();
if (res.statusCode !== 200) {
debug2(
debug3(
"tunneling socket could not be established, statusCode=%d",
res.statusCode
);
@@ -431,7 +431,7 @@ var require_tunnel = __commonJS({
return;
}
if (head.length > 0) {
debug2("got illegal response body from proxy");
debug3("got illegal response body from proxy");
socket.destroy();
var error2 = new Error("got illegal response body from proxy");
error2.code = "ECONNRESET";
@@ -439,13 +439,13 @@ var require_tunnel = __commonJS({
self2.removeSocket(placeholder);
return;
}
debug2("tunneling connection has established");
debug3("tunneling connection has established");
self2.sockets[self2.sockets.indexOf(placeholder)] = socket;
return cb(socket);
}
function onError(cause) {
connectReq.removeAllListeners();
debug2(
debug3(
"tunneling socket could not be established, cause=%s\n",
cause.message,
cause.stack
@@ -507,9 +507,9 @@ var require_tunnel = __commonJS({
}
return target;
}
var debug2;
var debug3;
if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) {
debug2 = function() {
debug3 = function() {
var args = Array.prototype.slice.call(arguments);
if (typeof args[0] === "string") {
args[0] = "TUNNEL: " + args[0];
@@ -519,10 +519,10 @@ var require_tunnel = __commonJS({
console.error.apply(console, args);
};
} else {
debug2 = function() {
debug3 = function() {
};
}
exports.debug = debug2;
exports.debug = debug3;
}
});
@@ -19733,10 +19733,10 @@ Support boolean input list: \`true | True | TRUE | false | False | FALSE\``);
return process.env["RUNNER_DEBUG"] === "1";
}
exports.isDebug = isDebug2;
function debug2(message) {
function debug3(message) {
(0, command_1.issueCommand)("debug", {}, message);
}
exports.debug = debug2;
exports.debug = debug3;
function error2(message, properties = {}) {
(0, command_1.issueCommand)("error", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message);
}
@@ -25515,7 +25515,12 @@ var isGitHubActions = !!process.env.GITHUB_ACTIONS;
var isInsideDocker = existsSync("/.dockerenv");
// utils/log.ts
var isDebugEnabled = () => process.env.LOG_LEVEL === "debug" || process.env.ACTIONS_STEP_DEBUG === "true" || core.isDebug();
var isRunnerDebugEnabled = () => core.isDebug();
var isLocalDebugEnabled = () => process.env.LOG_LEVEL === "debug" || process.env.ACTIONS_STEP_DEBUG === "true";
var isDebugEnabled = () => isLocalDebugEnabled() || isRunnerDebugEnabled();
function ts() {
return isDebugEnabled() ? `[${(/* @__PURE__ */ new Date()).toISOString()}] ` : "";
}
function formatArgs(args) {
return args.map((arg) => {
if (typeof arg === "string") return arg;
@@ -25626,19 +25631,16 @@ function separator(length = 50) {
const separatorText = "\u2500".repeat(length);
core.info(separatorText);
}
function ts() {
return isDebugEnabled() ? `[${(/* @__PURE__ */ new Date()).toISOString()}] ` : "";
}
var log = {
/** Print info message */
info: (...args) => {
core.info(`${ts()}${formatArgs(args)}`);
},
/** Print warning message */
/** Print a warning message. Use only for warnings that should be displayed in the job summary. */
warning: (...args) => {
core.warning(`${ts()}${formatArgs(args)}`);
},
/** Print error message */
/** Print an error message. Use only for errors that should be displayed in the job summary. */
error: (...args) => {
core.error(`${ts()}${formatArgs(args)}`);
},
@@ -25646,10 +25648,14 @@ var log = {
success: (...args) => {
core.info(`${ts()}\xBB ${formatArgs(args)}`);
},
/** Print debug message (only if LOG_LEVEL=debug) */
/** Print debug message (only when debug mode is enabled) */
debug: (...args) => {
if (isDebugEnabled()) {
core.info(`[${(/* @__PURE__ */ new Date()).toISOString()}] [DEBUG] ${formatArgs(args)}`);
if (isRunnerDebugEnabled()) {
core.debug(formatArgs(args));
return;
}
if (isLocalDebugEnabled()) {
core.info(`${ts()}[DEBUG] ${formatArgs(args)}`);
}
},
/** Print a formatted box with text */
@@ -25740,9 +25746,7 @@ async function retry(fn, options = {}) {
throw error2;
}
const delay = delayMs * attempt;
log.warning(
`\xBB ${label} failed (attempt ${attempt}/${maxAttempts}), retrying in ${delay}ms...`
);
log.info(`\xBB ${label} failed (attempt ${attempt}/${maxAttempts}), retrying in ${delay}ms...`);
await new Promise((resolve) => setTimeout(resolve, delay));
}
}
@@ -25925,7 +25929,7 @@ async function revokeGitHubInstallationToken(token) {
});
log.debug("\xBB installation token revoked");
} catch (error2) {
log.warning(
log.info(
`Failed to revoke installation token: ${error2 instanceof Error ? error2.message : String(error2)}`
);
}
+3 -3
View File
@@ -78,7 +78,7 @@ function detectSandboxMethod(): SandboxMethod {
}
detectedSandboxMethod = "none";
log.warning("PID namespace isolation not available - falling back to env filtering only");
log.info("PID namespace isolation not available - falling back to env filtering only");
return "none";
}
@@ -243,8 +243,8 @@ Use this tool to:
const finalExitCode = exitCode ?? (timedOut ? 124 : -1);
if (finalExitCode !== 0) {
log.error(`bash command failed with exit code ${finalExitCode}: ${params.command}`);
if (output) log.error(`output: ${output.trim()}`);
log.info(`bash command failed with exit code ${finalExitCode}: ${params.command}`);
if (output) log.info(`output: ${output.trim()}`);
}
return {
+1 -1
View File
@@ -213,7 +213,7 @@ export function GetCheckSuiteLogsTool(ctx: ToolContext) {
log.debug(`analyzed logs for job ${job.name}: ${analysis.index.length} indexed lines`);
} catch (error) {
log.error(`failed to fetch logs for job ${job.id}: ${error}`);
log.info(`failed to fetch logs for job ${job.id}: ${error}`);
}
}
}
+1 -1
View File
@@ -112,7 +112,7 @@ export function DelegateTool(ctx: ToolContext) {
} catch (err) {
// normalize agent crashes into the same return shape as clean failures
const errorMessage = err instanceof Error ? err.message : String(err);
log.error(`» delegation to ${selectedMode.name} crashed: ${errorMessage}`);
log.info(`» delegation to ${selectedMode.name} crashed: ${errorMessage}`);
return {
success: false,
mode: selectedMode.name,
+1 -1
View File
@@ -632,7 +632,7 @@ export function ResolveReviewThreadTool(ctx: ToolContext) {
const message = isResolved
? `thread ${params.thread_id} was already resolved`
: `failed to resolve thread ${params.thread_id}: ${errorMessage}`;
log.warning(message);
log.info(message);
return {
thread_id: params.thread_id,
+1 -1
View File
@@ -53,7 +53,7 @@ export const execute = <T, R extends Record<string, any> | string>(
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
const prefix = toolName ? `[${toolName}]` : "tool";
log.error(`${prefix} error: ${errorMessage}`);
log.info(`${prefix} error: ${errorMessage}`);
log.debug(`${prefix} params: ${formatJsonValue(params)}`);
return handleToolError(error);
}
+69 -63
View File
@@ -399,7 +399,7 @@ var require_tunnel = __commonJS({
connectOptions.headers = connectOptions.headers || {};
connectOptions.headers["Proxy-Authorization"] = "Basic " + new Buffer(connectOptions.proxyAuth).toString("base64");
}
debug("making CONNECT request");
debug2("making CONNECT request");
var connectReq = self2.request(connectOptions);
connectReq.useChunkedEncodingByDefault = false;
connectReq.once("response", onResponse);
@@ -419,7 +419,7 @@ var require_tunnel = __commonJS({
connectReq.removeAllListeners();
socket.removeAllListeners();
if (res.statusCode !== 200) {
debug(
debug2(
"tunneling socket could not be established, statusCode=%d",
res.statusCode
);
@@ -431,7 +431,7 @@ var require_tunnel = __commonJS({
return;
}
if (head.length > 0) {
debug("got illegal response body from proxy");
debug2("got illegal response body from proxy");
socket.destroy();
var error2 = new Error("got illegal response body from proxy");
error2.code = "ECONNRESET";
@@ -439,13 +439,13 @@ var require_tunnel = __commonJS({
self2.removeSocket(placeholder);
return;
}
debug("tunneling connection has established");
debug2("tunneling connection has established");
self2.sockets[self2.sockets.indexOf(placeholder)] = socket;
return cb(socket);
}
function onError(cause) {
connectReq.removeAllListeners();
debug(
debug2(
"tunneling socket could not be established, cause=%s\n",
cause.message,
cause.stack
@@ -507,9 +507,9 @@ var require_tunnel = __commonJS({
}
return target;
}
var debug;
var debug2;
if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) {
debug = function() {
debug2 = function() {
var args2 = Array.prototype.slice.call(arguments);
if (typeof args2[0] === "string") {
args2[0] = "TUNNEL: " + args2[0];
@@ -519,10 +519,10 @@ var require_tunnel = __commonJS({
console.error.apply(console, args2);
};
} else {
debug = function() {
debug2 = function() {
};
}
exports.debug = debug;
exports.debug = debug2;
}
});
@@ -19733,10 +19733,10 @@ Support boolean input list: \`true | True | TRUE | false | False | FALSE\``);
return process.env["RUNNER_DEBUG"] === "1";
}
exports.isDebug = isDebug2;
function debug(message) {
function debug2(message) {
(0, command_1.issueCommand)("debug", {}, message);
}
exports.debug = debug;
exports.debug = debug2;
function error2(message, properties = {}) {
(0, command_1.issueCommand)("error", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message);
}
@@ -26949,9 +26949,9 @@ var require_constants6 = __commonJS({
var require_debug = __commonJS({
"node_modules/.pnpm/semver@7.7.3/node_modules/semver/internal/debug.js"(exports, module) {
"use strict";
var debug = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args2) => console.error("SEMVER", ...args2) : () => {
var debug2 = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args2) => console.error("SEMVER", ...args2) : () => {
};
module.exports = debug;
module.exports = debug2;
}
});
@@ -26964,7 +26964,7 @@ var require_re = __commonJS({
MAX_SAFE_BUILD_LENGTH,
MAX_LENGTH
} = require_constants6();
var debug = require_debug();
var debug2 = require_debug();
exports = module.exports = {};
var re = exports.re = [];
var safeRe = exports.safeRe = [];
@@ -26987,7 +26987,7 @@ var require_re = __commonJS({
var createToken = (name, value2, isGlobal) => {
const safe = makeSafeRegex(value2);
const index = R++;
debug(name, index, value2);
debug2(name, index, value2);
t[name] = index;
src[index] = value2;
safeSrc[index] = safe;
@@ -27091,7 +27091,7 @@ var require_identifiers = __commonJS({
var require_semver = __commonJS({
"node_modules/.pnpm/semver@7.7.3/node_modules/semver/classes/semver.js"(exports, module) {
"use strict";
var debug = require_debug();
var debug2 = require_debug();
var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants6();
var { safeRe: re, t } = require_re();
var parseOptions = require_parse_options();
@@ -27113,7 +27113,7 @@ var require_semver = __commonJS({
`version is longer than ${MAX_LENGTH} characters`
);
}
debug("SemVer", version, options);
debug2("SemVer", version, options);
this.options = options;
this.loose = !!options.loose;
this.includePrerelease = !!options.includePrerelease;
@@ -27161,7 +27161,7 @@ var require_semver = __commonJS({
return this.version;
}
compare(other) {
debug("SemVer.compare", this.version, this.options, other);
debug2("SemVer.compare", this.version, this.options, other);
if (!(other instanceof _SemVer)) {
if (typeof other === "string" && other === this.version) {
return 0;
@@ -27212,7 +27212,7 @@ var require_semver = __commonJS({
do {
const a = this.prerelease[i];
const b = other.prerelease[i];
debug("prerelease compare", i, a, b);
debug2("prerelease compare", i, a, b);
if (a === void 0 && b === void 0) {
return 0;
} else if (b === void 0) {
@@ -27234,7 +27234,7 @@ var require_semver = __commonJS({
do {
const a = this.build[i];
const b = other.build[i];
debug("build compare", i, a, b);
debug2("build compare", i, a, b);
if (a === void 0 && b === void 0) {
return 0;
} else if (b === void 0) {
@@ -27862,21 +27862,21 @@ var require_range = __commonJS({
const loose = this.options.loose;
const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE];
range2 = range2.replace(hr, hyphenReplace(this.options.includePrerelease));
debug("hyphen replace", range2);
debug2("hyphen replace", range2);
range2 = range2.replace(re[t.COMPARATORTRIM], comparatorTrimReplace);
debug("comparator trim", range2);
debug2("comparator trim", range2);
range2 = range2.replace(re[t.TILDETRIM], tildeTrimReplace);
debug("tilde trim", range2);
debug2("tilde trim", range2);
range2 = range2.replace(re[t.CARETTRIM], caretTrimReplace);
debug("caret trim", range2);
debug2("caret trim", range2);
let rangeList = range2.split(" ").map((comp) => parseComparator(comp, this.options)).join(" ").split(/\s+/).map((comp) => replaceGTE0(comp, this.options));
if (loose) {
rangeList = rangeList.filter((comp) => {
debug("loose invalid filter", comp, this.options);
debug2("loose invalid filter", comp, this.options);
return !!comp.match(re[t.COMPARATORLOOSE]);
});
}
debug("range list", rangeList);
debug2("range list", rangeList);
const rangeMap = /* @__PURE__ */ new Map();
const comparators = rangeList.map((comp) => new Comparator(comp, this.options));
for (const comp of comparators) {
@@ -27931,7 +27931,7 @@ var require_range = __commonJS({
var cache = new LRU();
var parseOptions = require_parse_options();
var Comparator = require_comparator();
var debug = require_debug();
var debug2 = require_debug();
var SemVer = require_semver();
var {
safeRe: re,
@@ -27957,15 +27957,15 @@ var require_range = __commonJS({
};
var parseComparator = (comp, options) => {
comp = comp.replace(re[t.BUILD], "");
debug("comp", comp, options);
debug2("comp", comp, options);
comp = replaceCarets(comp, options);
debug("caret", comp);
debug2("caret", comp);
comp = replaceTildes(comp, options);
debug("tildes", comp);
debug2("tildes", comp);
comp = replaceXRanges(comp, options);
debug("xrange", comp);
debug2("xrange", comp);
comp = replaceStars(comp, options);
debug("stars", comp);
debug2("stars", comp);
return comp;
};
var isX = (id) => !id || id.toLowerCase() === "x" || id === "*";
@@ -27975,7 +27975,7 @@ var require_range = __commonJS({
var replaceTilde = (comp, options) => {
const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE];
return comp.replace(r, (_, M, m, p, pr) => {
debug("tilde", comp, _, M, m, p, pr);
debug2("tilde", comp, _, M, m, p, pr);
let ret;
if (isX(M)) {
ret = "";
@@ -27984,12 +27984,12 @@ var require_range = __commonJS({
} else if (isX(p)) {
ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;
} else if (pr) {
debug("replaceTilde pr", pr);
debug2("replaceTilde pr", pr);
ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
} else {
ret = `>=${M}.${m}.${p} <${M}.${+m + 1}.0-0`;
}
debug("tilde return", ret);
debug2("tilde return", ret);
return ret;
});
};
@@ -27997,11 +27997,11 @@ var require_range = __commonJS({
return comp.trim().split(/\s+/).map((c) => replaceCaret(c, options)).join(" ");
};
var replaceCaret = (comp, options) => {
debug("caret", comp, options);
debug2("caret", comp, options);
const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET];
const z = options.includePrerelease ? "-0" : "";
return comp.replace(r, (_, M, m, p, pr) => {
debug("caret", comp, _, M, m, p, pr);
debug2("caret", comp, _, M, m, p, pr);
let ret;
if (isX(M)) {
ret = "";
@@ -28014,7 +28014,7 @@ var require_range = __commonJS({
ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`;
}
} else if (pr) {
debug("replaceCaret pr", pr);
debug2("replaceCaret pr", pr);
if (M === "0") {
if (m === "0") {
ret = `>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p + 1}-0`;
@@ -28025,7 +28025,7 @@ var require_range = __commonJS({
ret = `>=${M}.${m}.${p}-${pr} <${+M + 1}.0.0-0`;
}
} else {
debug("no pr");
debug2("no pr");
if (M === "0") {
if (m === "0") {
ret = `>=${M}.${m}.${p}${z} <${M}.${m}.${+p + 1}-0`;
@@ -28036,19 +28036,19 @@ var require_range = __commonJS({
ret = `>=${M}.${m}.${p} <${+M + 1}.0.0-0`;
}
}
debug("caret return", ret);
debug2("caret return", ret);
return ret;
});
};
var replaceXRanges = (comp, options) => {
debug("replaceXRanges", comp, options);
debug2("replaceXRanges", comp, options);
return comp.split(/\s+/).map((c) => replaceXRange(c, options)).join(" ");
};
var replaceXRange = (comp, options) => {
comp = comp.trim();
const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];
return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
debug("xRange", comp, ret, gtlt, M, m, p, pr);
debug2("xRange", comp, ret, gtlt, M, m, p, pr);
const xM = isX(M);
const xm = xM || isX(m);
const xp = xm || isX(p);
@@ -28095,16 +28095,16 @@ var require_range = __commonJS({
} else if (xp) {
ret = `>=${M}.${m}.0${pr} <${M}.${+m + 1}.0-0`;
}
debug("xRange return", ret);
debug2("xRange return", ret);
return ret;
});
};
var replaceStars = (comp, options) => {
debug("replaceStars", comp, options);
debug2("replaceStars", comp, options);
return comp.trim().replace(re[t.STAR], "");
};
var replaceGTE0 = (comp, options) => {
debug("replaceGTE0", comp, options);
debug2("replaceGTE0", comp, options);
return comp.trim().replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], "");
};
var hyphenReplace = (incPr) => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr) => {
@@ -28142,7 +28142,7 @@ var require_range = __commonJS({
}
if (version.prerelease.length && !options.includePrerelease) {
for (let i = 0; i < set.length; i++) {
debug(set[i].semver);
debug2(set[i].semver);
if (set[i].semver === Comparator.ANY) {
continue;
}
@@ -28179,7 +28179,7 @@ var require_comparator = __commonJS({
}
}
comp = comp.trim().split(/\s+/).join(" ");
debug("comparator", comp, options);
debug2("comparator", comp, options);
this.options = options;
this.loose = !!options.loose;
this.parse(comp);
@@ -28188,7 +28188,7 @@ var require_comparator = __commonJS({
} else {
this.value = this.operator + this.semver.version;
}
debug("comp", this);
debug2("comp", this);
}
parse(comp) {
const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR];
@@ -28210,7 +28210,7 @@ var require_comparator = __commonJS({
return this.value;
}
test(version) {
debug("Comparator.test", version, this.options.loose);
debug2("Comparator.test", version, this.options.loose);
if (this.semver === ANY || version === ANY) {
return true;
}
@@ -28267,7 +28267,7 @@ var require_comparator = __commonJS({
var parseOptions = require_parse_options();
var { safeRe: re, t } = require_re();
var cmp = require_cmp();
var debug = require_debug();
var debug2 = require_debug();
var SemVer = require_semver();
var Range = require_range();
}
@@ -28854,7 +28854,12 @@ var isGitHubActions = !!process.env.GITHUB_ACTIONS;
var isInsideDocker = existsSync("/.dockerenv");
// utils/log.ts
var isDebugEnabled = () => process.env.LOG_LEVEL === "debug" || process.env.ACTIONS_STEP_DEBUG === "true" || core.isDebug();
var isRunnerDebugEnabled = () => core.isDebug();
var isLocalDebugEnabled = () => process.env.LOG_LEVEL === "debug" || process.env.ACTIONS_STEP_DEBUG === "true";
var isDebugEnabled = () => isLocalDebugEnabled() || isRunnerDebugEnabled();
function ts() {
return isDebugEnabled() ? `[${(/* @__PURE__ */ new Date()).toISOString()}] ` : "";
}
function formatArgs(args2) {
return args2.map((arg) => {
if (typeof arg === "string") return arg;
@@ -28965,19 +28970,16 @@ function separator(length = 50) {
const separatorText = "\u2500".repeat(length);
core.info(separatorText);
}
function ts() {
return isDebugEnabled() ? `[${(/* @__PURE__ */ new Date()).toISOString()}] ` : "";
}
var log = {
/** Print info message */
info: (...args2) => {
core.info(`${ts()}${formatArgs(args2)}`);
},
/** Print warning message */
/** Print a warning message. Use only for warnings that should be displayed in the job summary. */
warning: (...args2) => {
core.warning(`${ts()}${formatArgs(args2)}`);
},
/** Print error message */
/** Print an error message. Use only for errors that should be displayed in the job summary. */
error: (...args2) => {
core.error(`${ts()}${formatArgs(args2)}`);
},
@@ -28985,10 +28987,14 @@ var log = {
success: (...args2) => {
core.info(`${ts()}\xBB ${formatArgs(args2)}`);
},
/** Print debug message (only if LOG_LEVEL=debug) */
/** Print debug message (only when debug mode is enabled) */
debug: (...args2) => {
if (isDebugEnabled()) {
core.info(`[${(/* @__PURE__ */ new Date()).toISOString()}] [DEBUG] ${formatArgs(args2)}`);
if (isRunnerDebugEnabled()) {
core.debug(formatArgs(args2));
return;
}
if (isLocalDebugEnabled()) {
core.info(`${ts()}[DEBUG] ${formatArgs(args2)}`);
}
},
/** Print a formatted box with text */
@@ -41431,7 +41437,7 @@ async function validateStuckProgressComment(promptInput, octokit, owner, repo) {
return null;
} catch (error2) {
const errorMessage = error2 instanceof Error ? error2.message : String(error2);
log.error(`[post] failed to get comment ${commentId}: ${errorMessage}`);
log.info(`[post] failed to get comment ${commentId}: ${errorMessage}`);
return null;
}
}
@@ -41458,7 +41464,7 @@ async function getIsCancelled(params) {
}
log.info("[post] no cancellation found, assuming failure");
} catch (error2) {
log.warning(
log.info(
`[post] failed to get job status: ${error2 instanceof Error ? error2.message : String(error2)}`
);
}
@@ -41472,7 +41478,7 @@ async function runPostCleanup() {
const resolved = resolvePromptInput();
if (typeof resolved !== "string") promptInput = resolved;
} catch (error2) {
log.warning(
log.info(
`[post] failed to resolve prompt input: ${error2 instanceof Error ? error2.message : String(error2)}`
);
}
@@ -41503,7 +41509,7 @@ async function runPostCleanup() {
log.info("\xBB [post] successfully updated progress comment");
} catch (error2) {
const errorMessage = error2 instanceof Error ? error2.message : String(error2);
log.error(`[post] failed to update comment: ${errorMessage}`);
log.info(`[post] failed to update comment: ${errorMessage}`);
}
}
+1 -1
View File
@@ -161,7 +161,7 @@ export function $git(
if (result.status !== 0) {
const stderr = result.stderr?.trim() ?? "";
log.error(`git ${subcommand} failed: ${stderr}`);
log.info(`git ${subcommand} failed: ${stderr}`);
throw new Error(`git ${subcommand} failed: ${stderr}`);
}
+20 -12
View File
@@ -6,8 +6,17 @@ import * as core from "@actions/core";
import { table } from "table";
import { isGitHubActions, isInsideDocker } from "./globals.ts";
const isDebugEnabled = () =>
process.env.LOG_LEVEL === "debug" || process.env.ACTIONS_STEP_DEBUG === "true" || core.isDebug();
const isRunnerDebugEnabled = () => core.isDebug();
const isLocalDebugEnabled = () =>
process.env.LOG_LEVEL === "debug" || process.env.ACTIONS_STEP_DEBUG === "true";
const isDebugEnabled = () => isLocalDebugEnabled() || isRunnerDebugEnabled();
/** timestamp prefix for debug mode — empty string when debug is off */
function ts(): string {
return isDebugEnabled() ? `[${new Date().toISOString()}] ` : "";
}
/**
* Format arguments into a single string for logging
@@ -206,23 +215,18 @@ function separator(length: number = 50): void {
/**
* Main logging utility object - import this once and access all utilities
*/
/** timestamp prefix for debug mode — empty string when debug is off */
function ts(): string {
return isDebugEnabled() ? `[${new Date().toISOString()}] ` : "";
}
export const log = {
/** Print info message */
info: (...args: unknown[]): void => {
core.info(`${ts()}${formatArgs(args)}`);
},
/** Print warning message */
/** Print a warning message. Use only for warnings that should be displayed in the job summary. */
warning: (...args: unknown[]): void => {
core.warning(`${ts()}${formatArgs(args)}`);
},
/** Print error message */
/** Print an error message. Use only for errors that should be displayed in the job summary. */
error: (...args: unknown[]): void => {
core.error(`${ts()}${formatArgs(args)}`);
},
@@ -232,10 +236,14 @@ export const log = {
core.info(`${ts()}» ${formatArgs(args)}`);
},
/** Print debug message (only if LOG_LEVEL=debug) */
/** Print debug message (only when debug mode is enabled) */
debug: (...args: unknown[]): void => {
if (isDebugEnabled()) {
core.info(`[${new Date().toISOString()}] [DEBUG] ${formatArgs(args)}`);
if (isRunnerDebugEnabled()) {
core.debug(formatArgs(args));
return;
}
if (isLocalDebugEnabled()) {
core.info(`${ts()}[DEBUG] ${formatArgs(args)}`);
}
},
+4 -4
View File
@@ -50,7 +50,7 @@ async function validateStuckProgressComment(
return null;
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
log.error(`[post] failed to get comment ${commentId}: ${errorMessage}`);
log.info(`[post] failed to get comment ${commentId}: ${errorMessage}`);
return null;
}
}
@@ -97,7 +97,7 @@ async function getIsCancelled(params: {
}
log.info("[post] no cancellation found, assuming failure");
} catch (error) {
log.warning(
log.info(
`[post] failed to get job status: ${error instanceof Error ? error.message : String(error)}`
);
}
@@ -116,7 +116,7 @@ export async function runPostCleanup(): Promise<void> {
const resolved = resolvePromptInput();
if (typeof resolved !== "string") promptInput = resolved;
} catch (error) {
log.warning(
log.info(
`[post] failed to resolve prompt input: ${error instanceof Error ? error.message : String(error)}`
);
}
@@ -158,6 +158,6 @@ export async function runPostCleanup(): Promise<void> {
log.info("» [post] successfully updated progress comment");
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
log.error(`[post] failed to update comment: ${errorMessage}`);
log.info(`[post] failed to update comment: ${errorMessage}`);
}
}
+1 -3
View File
@@ -37,9 +37,7 @@ export async function retry<T>(fn: () => Promise<T>, options: RetryOptions = {})
}
const delay = delayMs * attempt;
log.warning(
`» ${label} failed (attempt ${attempt}/${maxAttempts}), retrying in ${delay}ms...`
);
log.info(`» ${label} failed (attempt ${attempt}/${maxAttempts}), retrying in ${delay}ms...`);
await new Promise((resolve) => setTimeout(resolve, delay));
}
}
+1 -3
View File
@@ -121,9 +121,7 @@ export async function setupGit(params: SetupGitParams): Promise<void> {
} catch (error) {
// If git config fails, log warning but don't fail the action
// This can happen if we're not in a git repo or git isn't available
log.warning(
`Failed to set git config: ${error instanceof Error ? error.message : String(error)}`
);
log.info(`Failed to set git config: ${error instanceof Error ? error.message : String(error)}`);
}
// 2. setup authentication
+1 -1
View File
@@ -157,7 +157,7 @@ export async function spawn(options: SpawnOptions): Promise<SpawnResult> {
if (idleMs > activityTimeoutMs) {
isActivityTimedOut = true;
const idleSec = Math.round(idleMs / 1000);
log.error(`no output for ${idleSec}s from pid=${child.pid} (${cmd}), killing process`);
log.info(`no output for ${idleSec}s from pid=${child.pid} (${cmd}), killing process`);
child.kill("SIGKILL");
clearInterval(activityCheckIntervalId);
}
+1 -1
View File
@@ -169,7 +169,7 @@ export async function revokeGitHubInstallationToken(token: string): Promise<void
});
log.debug("» installation token revoked");
} catch (error) {
log.warning(
log.info(
`Failed to revoke installation token: ${error instanceof Error ? error.message : String(error)}`
);
}