'use strict';
const express = require('express');
const { CJbot } = require('../../model/minecraft');
function createRouter() {
const router = express.Router();
router.get('/api/ai/status', (req, res) => {
try {
const result = {};
for (const [name, bot] of Object.entries(CJbot.bots)) {
const ai = bot.plunginsLoaded['Ai'];
if (!ai) continue;
const config = ai.__getConfig();
result[name] = {
connected: bot.isReady,
provider: config.provider || 'unknown',
model: config.model || 'unknown',
interval: ai.intervalLength,
promptName: ai.promptName || 'unknown',
active: !!ai.intervalStop,
};
}
res.json({ bots: result });
} catch (error) {
console.error('API Error /api/ai/status:', error);
res.status(500).json({ error: error.message });
}
});
return router;
}
const webUI = {
tabId: 'ai',
tabLabel: 'AI',
tabOrder: 30,
html: `
`,
css: `
.ai-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:16px}
.ai-card{background:#111827;border:1px solid #374151;border-radius:8px;padding:16px;transition:border-color .2s}
.ai-card:hover{border-color:#a78bfa}
.ai-card h3{font-size:1em;color:#a78bfa;margin-bottom:12px;display:flex;align-items:center;gap:8px}
.ai-info{font-size:.85em;color:#9ca3af;margin:4px 0}
.ai-info .ai-label{color:#6b7280;display:inline-block;min-width:80px}
.ai-info .ai-value{color:#e5e7eb}
.ai-status-badge{padding:2px 8px;border-radius:10px;font-size:.75em;font-weight:600}
.ai-status-badge.active{background:#059669;color:#fff}
.ai-status-badge.inactive{background:#6b7280;color:#fff}
.ai-empty{padding:40px 20px;color:#6b7280;text-align:center;font-size:.9em}
`,
onTabActive: 'onAiTabActive',
js: `
let aiInterval=null;
function onAiTabActive() {
loadAiStatus();
if (!aiInterval) aiInterval = setInterval(() => { if (currentTab === 'ai') loadAiStatus(); }, 10000);
}
async function loadAiStatus() {
try {
const r = await fetch('/api/ai/status');
if (!r.ok) { document.getElementById('aiArea').innerHTML='Failed to load AI status
'; return; }
const d = await r.json();
renderAiStatus(d.bots || {});
} catch(e) {
document.getElementById('aiArea').innerHTML='Failed to load AI status
';
}
}
function renderAiStatus(bots) {
const area = document.getElementById('aiArea');
const names = Object.keys(bots);
if (names.length === 0) {
area.innerHTML='No bots with AI loaded
';
return;
}
area.innerHTML = '' + names.map(name => {
const ai = bots[name];
const badge = ai.active
? '
Active'
: '
Inactive';
return '
' +
'
' + escHtml(name) + ' ' + badge + '
' +
'
Provider: ' + escHtml(ai.provider) + '
' +
'
Model: ' + escHtml(ai.model) + '
' +
'
Interval: ' + ai.interval + 's
' +
'
Prompt: ' + escHtml(ai.promptName) + '
' +
'
';
}).join('') + '
';
}
`,
};
module.exports = { createRouter, webUI };