Files
2026-07-31 13:12:54 -04:00

57 lines
2.3 KiB
JavaScript

import { z } from 'zod';
import { config } from '../../config.js';
import { runCommand } from '../../lib/runCommand.js';
import { errorResult, jsonResult, toErrorMessage } from '../shared.js';
import { requireLaravel } from './requireLaravel.js';
export function registerLaravelQueueStatusTool(server) {
server.registerTool('laravel_queue_status', {
title: 'Laravel Queue Status',
description: 'Summarize Laravel queue health via `php artisan queue:failed` (and optionally `queue:batches` when available). Read-only.',
inputSchema: {
includeBatches: z
.boolean()
.optional()
.default(false)
.describe('If true, also run `php artisan queue:batches` when supported.'),
},
}, async ({ includeBatches }) => {
try {
const laravel = requireLaravel();
const failed = await runCommand('php', ['artisan', 'queue:failed', '--no-interaction'], {
cwd: laravel.root,
timeoutMs: config.defaultCommandTimeoutMs,
});
let batches = null;
if (includeBatches) {
batches = await runCommand('php', ['artisan', 'queue:batches', '--no-interaction'], {
cwd: laravel.root,
timeoutMs: config.defaultCommandTimeoutMs,
});
}
const failedLines = failed.output
.split(/\r?\n/)
.map((line) => line.trim())
.filter(Boolean);
const failedCount = failedLines.filter((line) => /^\d+\s+/.test(line) || /\|/.test(line)).length;
return jsonResult({
failed: {
exitCode: failed.exitCode,
failed: failed.failed,
approxRows: failedCount,
output: failed.output,
},
batches: batches
? {
exitCode: batches.exitCode,
failed: batches.failed,
output: batches.output,
}
: null,
});
}
catch (error) {
return errorResult(toErrorMessage(error));
}
});
}
//# sourceMappingURL=queueStatus.js.map