From 70f1c47a282f74c36727f87cfcdd7f353535f96e Mon Sep 17 00:00:00 2001 From: "pullfrog[bot]" <226033991+pullfrog[bot]@users.noreply.github.com> Date: Thu, 19 Feb 2026 23:11:47 +0000 Subject: [PATCH] Audit `core.warning`/`core.error` usage (#269) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Stop using command-based logs for warnings and errors Co-authored-by: Cursor * 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 --------- Co-authored-by: Mateusz Burzyński Co-authored-by: Cursor Co-authored-by: pullfrog[bot] <226033991+pullfrog[bot]@users.noreply.github.com> Co-authored-by: Colin McDonnell --- agents/claude.ts | 13 +- agents/codex.ts | 15 +- agents/cursor.ts | 6 +- agents/gemini.ts | 9 +- agents/opencode.ts | 20 +-- entry | 267 +++++++++++++++++------------------ get-installation-token/entry | 52 +++---- mcp/bash.ts | 6 +- mcp/checkSuite.ts | 2 +- mcp/delegate.ts | 2 +- mcp/reviewComments.ts | 2 +- mcp/shared.ts | 2 +- post | 132 ++++++++--------- utils/gitAuth.ts | 2 +- utils/log.ts | 32 +++-- utils/postCleanup.ts | 8 +- utils/retry.ts | 4 +- utils/setup.ts | 4 +- utils/subprocess.ts | 2 +- utils/token.ts | 2 +- 20 files changed, 296 insertions(+), 286 deletions(-) diff --git a/agents/claude.ts b/agents/claude.ts index 8bf82cb..9bc5934 100644 --- a/agents/claude.ts +++ b/agents/claude.ts @@ -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: () => {}, diff --git a/agents/codex.ts b/agents/codex.ts index d228362..7635179 100644 --- a/agents/codex.ts +++ b/agents/codex.ts @@ -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}`); }, }; diff --git a/agents/cursor.ts b/agents/cursor.ts index f72ec8a..55e1467 100644 --- a/agents/cursor.ts +++ b/agents/cursor.ts @@ -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); diff --git a/agents/gemini.ts b/agents/gemini.ts index b28bc06..5bd99d4 100644 --- a/agents/gemini.ts +++ b/agents/gemini.ts @@ -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)); diff --git a/agents/opencode.ts b/agents/opencode.ts index b399cb9..0e908b5 100644 --- a/agents/opencode.ts +++ b/agents/opencode.ts @@ -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; diff --git a/entry b/entry index a31527e..1492b53 100755 --- a/entry +++ b/entry @@ -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", { diff --git a/get-installation-token/entry b/get-installation-token/entry index ef66160..8abf8ed 100755 --- a/get-installation-token/entry +++ b/get-installation-token/entry @@ -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)}` ); } diff --git a/mcp/bash.ts b/mcp/bash.ts index b7a5e82..62072d8 100644 --- a/mcp/bash.ts +++ b/mcp/bash.ts @@ -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 { diff --git a/mcp/checkSuite.ts b/mcp/checkSuite.ts index d2a45a9..f8ae13b 100644 --- a/mcp/checkSuite.ts +++ b/mcp/checkSuite.ts @@ -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}`); } } } diff --git a/mcp/delegate.ts b/mcp/delegate.ts index edfd7bc..5068523 100644 --- a/mcp/delegate.ts +++ b/mcp/delegate.ts @@ -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, diff --git a/mcp/reviewComments.ts b/mcp/reviewComments.ts index 25debe5..f15cc6b 100644 --- a/mcp/reviewComments.ts +++ b/mcp/reviewComments.ts @@ -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, diff --git a/mcp/shared.ts b/mcp/shared.ts index 9b9f652..99d9c42 100644 --- a/mcp/shared.ts +++ b/mcp/shared.ts @@ -53,7 +53,7 @@ export const execute = | 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); } diff --git a/post b/post index edf4a51..7eb1b82 100755 --- a/post +++ b/post @@ -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}`); } } diff --git a/utils/gitAuth.ts b/utils/gitAuth.ts index 6634fc1..afe90de 100644 --- a/utils/gitAuth.ts +++ b/utils/gitAuth.ts @@ -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}`); } diff --git a/utils/log.ts b/utils/log.ts index df46fe4..3063933 100644 --- a/utils/log.ts +++ b/utils/log.ts @@ -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)}`); } }, diff --git a/utils/postCleanup.ts b/utils/postCleanup.ts index 6515527..df4756b 100644 --- a/utils/postCleanup.ts +++ b/utils/postCleanup.ts @@ -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 { 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 { 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}`); } } diff --git a/utils/retry.ts b/utils/retry.ts index 4be177b..fa64d69 100644 --- a/utils/retry.ts +++ b/utils/retry.ts @@ -37,9 +37,7 @@ export async function retry(fn: () => Promise, 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)); } } diff --git a/utils/setup.ts b/utils/setup.ts index bfc03c8..769aa4a 100644 --- a/utils/setup.ts +++ b/utils/setup.ts @@ -121,9 +121,7 @@ export async function setupGit(params: SetupGitParams): Promise { } 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 diff --git a/utils/subprocess.ts b/utils/subprocess.ts index ae2a371..02e3bd0 100644 --- a/utils/subprocess.ts +++ b/utils/subprocess.ts @@ -157,7 +157,7 @@ export async function spawn(options: SpawnOptions): Promise { 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); } diff --git a/utils/token.ts b/utils/token.ts index 887c5a7..fe17bba 100644 --- a/utils/token.ts +++ b/utils/token.ts @@ -169,7 +169,7 @@ export async function revokeGitHubInstallationToken(token: string): Promise