From 55385634f2f65ce88917ddb0c06413f9e837462d Mon Sep 17 00:00:00 2001 From: "Claude (Chronicler #78)" Date: Sat, 11 Apr 2026 10:27:08 +0000 Subject: [PATCH] feat: Add REST API endpoints to Trinity Core (v2.2.0) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - GET /servers — list available servers (for Arbiter) - POST /exec — execute command on server (for Arbiter) - REST endpoints run alongside MCP protocol - MCP for Claude.ai connector, REST for Arbiter internal calls - Fixes Infrastructure module 404 errors - Version bump 2.1.0 → 2.2.0 Chronicler #78 | firefrost-services --- services/trinity-core/index.js | 34 ++++++++++++++++++++++++++++-- services/trinity-core/package.json | 2 +- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/services/trinity-core/index.js b/services/trinity-core/index.js index f0ff3ef..b8bed40 100644 --- a/services/trinity-core/index.js +++ b/services/trinity-core/index.js @@ -131,10 +131,40 @@ function setupToolHandlers(mcpServer) { const activeSessions = new Map(); +// ─── REST API (for Arbiter / internal services) ─── + +app.get('/servers', auth, (req, res) => { + log(`REST /servers`); + res.json({ servers: Object.keys(SERVERS) }); +}); + +app.post('/exec', auth, async (req, res) => { + const { server, command } = req.body; + if (!server || !command) { + return res.status(400).json({ error: 'Missing server or command' }); + } + if (!SERVERS[server]) { + return res.status(400).json({ error: `Unknown server: ${server}` }); + } + const target = SERVERS[server]; + const result = target.local + ? await executeLocal(command) + : await executeSSH(server, command); + log(`REST /exec [${server}] -> ${result.success ? 'OK' : 'FAIL'}`); + res.json({ + success: result.success, + output: result.stdout || '', + stderr: result.stderr || '', + error: result.error + }); +}); + +// ─── MCP Protocol (for Claude.ai connector) ─── + app.get('/mcp', auth, async (req, res) => { log(`SSE connection from ${req.ip}`); - const mcpServer = new Server({ name: "trinity-core", version: "2.1.0" }, { capabilities: { tools: {} } }); + const mcpServer = new Server({ name: "trinity-core", version: "2.2.0" }, { capabilities: { tools: {} } }); setupToolHandlers(mcpServer); mcpServer.onmessage = (msg) => log(`SERVER MSG: ${JSON.stringify(msg)}`); @@ -171,4 +201,4 @@ app.post('/mcp/messages', auth, async (req, res) => { } }); -app.listen(PORT, () => log(`Trinity Core MCP v2.1.0 started on port ${PORT}`)); +app.listen(PORT, () => log(`Trinity Core MCP v2.2.0 started on port ${PORT}`)); diff --git a/services/trinity-core/package.json b/services/trinity-core/package.json index bcafedb..fa12a6d 100644 --- a/services/trinity-core/package.json +++ b/services/trinity-core/package.json @@ -1,6 +1,6 @@ { "name": "trinity-core", - "version": "2.1.0", + "version": "2.2.0", "type": "module", "main": "index.js", "dependencies": {