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
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:
@@ -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) }],
|
||||
|
||||
Reference in New Issue
Block a user