diff --git a/packages/gitea-mcp/src/index.ts b/packages/gitea-mcp/src/index.ts index abbe7af..761c447 100644 --- a/packages/gitea-mcp/src/index.ts +++ b/packages/gitea-mcp/src/index.ts @@ -562,14 +562,25 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { jobs.map(async (job: any) => { let console_log = undefined; - // Fetch log text if job failed to provide context - if (job.conclusion === "failure" || job.status === "failure") { + // Fetch log text for failed, running, or stuck jobs + if ( + job.conclusion === "failure" || + job.status === "failure" || + job.status === "in_progress" || + job.status === "running" + ) { try { const logResponse = await giteaClient.get( `/repos/${owner}/${repo}/actions/jobs/${job.id}/logs`, ); if (typeof logResponse.data === "string") { let fullLog = logResponse.data; + + // First, truncate to 20000 characters to prevent OOM / regex crashes on multi-megabyte strings and avoid docker exec pipe buffer limits + if (fullLog.length > 20000) { + fullLog = "...[truncated]...\n" + fullLog.slice(-20000); + } + // Strip ANSI escape codes fullLog = fullLog.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, ""); @@ -577,10 +588,6 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { // DO NOT strip characters > 0x7F, as they are part of valid UTF-8 multibyte characters (like emojis 🧹). fullLog = fullLog.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, ""); - // Truncate to 10000 characters to prevent message size limits - if (fullLog.length > 10000) { - fullLog = "...[truncated]...\n" + fullLog.slice(-10000); - } console_log = fullLog; } } catch (err: any) {