OSVauco/opax-web/backend/routes/consoleApi.js

114 lines
2.9 KiB
JavaScript

import { Router } from 'express';
import { callAgent } from '../agentClient.js';
const router = Router();
const unavailable = {
status: 'unavailable',
summary: null,
message: 'Unavailable',
};
const adaptHealthSummary = (raw) => {
if (raw?.status !== 'ok' || !raw.service || !raw.version) {
return null;
}
return {
status: raw.status,
service: raw.service,
version: raw.version,
};
};
router.get('/status', async (req, res) => {
let health;
try {
const rawHealth = await callAgent('get_health', {});
const summary = adaptHealthSummary(rawHealth);
if (summary) {
health = { status: 'success', summary, message: 'Available' };
} else {
health = unavailable;
console.warn('[Console API] Platform health data has an unexpected shape.');
}
} catch (error) {
console.warn('[Console API] Platform health data is unavailable.');
health = unavailable;
}
res.json({
health,
buildStatus: unavailable,
platformState: unavailable,
});
});
router.get('/projects', (req, res) => {
res.json({
status: 'unavailable',
message: 'No project registry configured yet.',
projects: [],
});
});
router.get('/work-queue', (req, res) => {
res.json({
status: 'unavailable',
message: 'No ticket read model configured yet.',
tickets: [],
});
});
router.get('/approvals', (req, res) => {
res.json({
status: 'unavailable',
message: 'No approval read model configured yet.',
approvals: [],
});
});
router.post('/emma/chat', async (req, res) => {
const { message, session_id, ticket_number } = req.body;
if (!message || typeof message !== 'string' || message.length > 4096) {
return res.status(400).json({ status: 'error', message: 'Invalid message.'});
}
if (ticket_number && (typeof ticket_number !== 'number' || !Number.isInteger(ticket_number) || ticket_number <= 0)) {
return res.status(400).json({ status: 'error', message: 'Invalid ticket number.'});
}
try {
const emmaData = await callAgent('run_emma', { prompt: message, history: [] });
res.json({
status: 'success',
reply: emmaData.response,
session_id,
ticket_number,
model_label: 'Emma Local',
message: 'Message processed by Emma.',
});
} catch (e) {
res.status(500).json({ status: 'error', message: 'Could not connect to Emma.' });
}
});
import { capabilities } from '../capabilityRegistry.js';
router.get('/capabilities', (req, res) => {
res.json(capabilities);
});
router.get('/emma/status', async (req, res) => {
try {
await callAgent('get_health', {});
res.json({ status: 'ready', label: 'Emma Local', message: 'Emma is ready.' });
} catch (e) {
res.status(500).json({ status: 'unavailable', label: 'Emma Local', message: 'Emma is unavailable.' });
}
});
export default router;