'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: `
Loading AI status...
`, 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 };