feat(kabelfachmann-mcp): add local Ollama support for KABELFACHMANN_LLM_PROVIDER
Some checks failed
Monorepo Pipeline / ⚡ Prioritize Release (push) Successful in 2s
Monorepo Pipeline / 🧪 Test (push) Successful in 1m4s
Monorepo Pipeline / 🏗️ Build (push) Successful in 2m53s
Monorepo Pipeline / 🧹 Lint (push) Successful in 3m2s
Monorepo Pipeline / 🚀 Release (push) Has been skipped
Monorepo Pipeline / 🐳 Build Gatekeeper (Product) (push) Has been skipped
Monorepo Pipeline / 🐳 Build Build-Base (push) Has been skipped
Monorepo Pipeline / 🐳 Build Production Runtime (push) Has been skipped
🏥 Server Maintenance / 🧹 Prune & Clean (push) Failing after 4s

This commit is contained in:
2026-03-08 14:01:37 +01:00
parent 541f1c17b7
commit 5e1f2669e6
6 changed files with 199 additions and 63 deletions

View File

@@ -503,7 +503,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
},
);
const runs = (runsResponse.data.workflow_runs || []) as any[];
const runs = (runsResponse.data.workflow_runs || []).slice(0, limit) as any[];
const enhancedRuns = await Promise.all(
runs.map(async (run: any) => {
try {
@@ -557,17 +557,50 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
`/repos/${owner}/${repo}/actions/runs/${run_id}/jobs`,
);
const jobs = (jobsResponse.data.jobs || []) as any[];
const logs = jobs.map((job: any) => ({
job_id: job.id,
job_name: job.name,
status: job.status,
conclusion: job.conclusion,
steps: (job.steps || []).map((step: any) => ({
name: step.name,
status: step.status,
conclusion: step.conclusion,
})),
}));
const logs = await Promise.all(
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") {
try {
const logResponse = await giteaClient.get(
`/repos/${owner}/${repo}/actions/jobs/${job.id}/logs`,
);
if (typeof logResponse.data === "string") {
let fullLog = logResponse.data;
// Strip ANSI escape codes
fullLog = fullLog.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, "");
// Safely strip non-printable ASCII control characters (0x00-0x1F, except 0x09 \t, 0x0A \n, 0x0D \r).
// 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) {
console_log = `Error fetching raw console log: ${err.message}`;
}
}
return {
job_id: job.id,
job_name: job.name,
status: job.status,
conclusion: job.conclusion,
console_log, // appended to the response
steps: (job.steps || []).map((step: any) => ({
name: step.name,
status: step.status,
conclusion: step.conclusion,
})),
};
}),
);
return {
content: [{ type: "text", text: JSON.stringify(logs, null, 2) }],