93 lines
3.6 KiB
JavaScript
93 lines
3.6 KiB
JavaScript
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
import { processManager } from '../../lib/processManager.js';
|
|
import { dockerManager } from '../docker/dockerManager.js';
|
|
function firstString(value) {
|
|
if (typeof value === 'string')
|
|
return value;
|
|
if (Array.isArray(value))
|
|
return value[0] ?? '';
|
|
return '';
|
|
}
|
|
export function registerResources(server) {
|
|
// Process log tail resource (already tracked in processManager).
|
|
server.registerResource('process-logs', new ResourceTemplate('workspace://logs/{processId}', { list: undefined }), {
|
|
title: 'Process Logs',
|
|
description: 'Live log tail for a background process started by start_dev_server or run_script.',
|
|
mimeType: 'text/plain',
|
|
}, async (uri, variables) => {
|
|
const processId = firstString(variables.processId);
|
|
try {
|
|
const { info, logs } = processManager.getLogs(processId, 500);
|
|
return {
|
|
contents: [
|
|
{
|
|
uri: uri.href,
|
|
mimeType: 'text/plain',
|
|
text: [
|
|
`Process: ${info.label}`,
|
|
`Command: ${info.command} ${info.args.join(' ')}`,
|
|
`Status: ${info.status}`,
|
|
`PID: ${info.pid ?? 'n/a'}`,
|
|
'---',
|
|
...logs,
|
|
].join('\n'),
|
|
},
|
|
],
|
|
};
|
|
}
|
|
catch (error) {
|
|
return {
|
|
contents: [
|
|
{
|
|
uri: uri.href,
|
|
mimeType: 'text/plain',
|
|
text: `Error reading process logs: ${error instanceof Error ? error.message : String(error)}`,
|
|
},
|
|
],
|
|
};
|
|
}
|
|
});
|
|
// Container log tail resource (tracked in dockerManager).
|
|
server.registerResource('container-logs', new ResourceTemplate('workspace://containers/{containerId}/logs', { list: undefined }), {
|
|
title: 'Container Logs',
|
|
description: 'Log tail for a Docker container started by docker_run_container.',
|
|
mimeType: 'text/plain',
|
|
}, async (uri, variables) => {
|
|
const containerId = firstString(variables.containerId);
|
|
try {
|
|
await dockerManager.ensureReachable();
|
|
const buffer = await dockerManager.getDocker().getContainer(containerId).logs({
|
|
stdout: true,
|
|
stderr: true,
|
|
tail: 500,
|
|
});
|
|
const raw = Buffer.isBuffer(buffer) ? buffer.toString('utf8') : String(buffer);
|
|
const tracked = dockerManager.getTracked(containerId);
|
|
return {
|
|
contents: [
|
|
{
|
|
uri: uri.href,
|
|
mimeType: 'text/plain',
|
|
text: [
|
|
tracked ? `Container: ${tracked.name} (${tracked.image})` : `Container: ${containerId}`,
|
|
'---',
|
|
raw,
|
|
].join('\n'),
|
|
},
|
|
],
|
|
};
|
|
}
|
|
catch (error) {
|
|
return {
|
|
contents: [
|
|
{
|
|
uri: uri.href,
|
|
mimeType: 'text/plain',
|
|
text: `Error reading container logs: ${error instanceof Error ? error.message : String(error)}`,
|
|
},
|
|
],
|
|
};
|
|
}
|
|
});
|
|
}
|
|
//# sourceMappingURL=index.js.map
|