@toolprint/hypertool-mcp
Version:
HyperTool MCP proxy server for routing requests between clients and multiple underlying MCP servers
173 lines • 5.87 kB
JavaScript
/**
* Main menu implementation for interactive configuration navigation
*/
import inquirer from "inquirer";
import { theme } from "../../../utils/theme.js";
import { output } from "../../../utils/output.js";
import { ViewType, } from "./types.js";
/**
* Calculate summary statistics from configuration data
*/
export async function calculateSummaryStats(data) {
// Server statistics
const serverStats = {
total: data.servers.length,
healthy: data.servers.filter((s) => s.healthy).length,
byType: data.servers.reduce((acc, server) => {
acc[server.type] = (acc[server.type] || 0) + 1;
return acc;
}, {}),
};
// Application statistics
const appStats = {
total: data.applications.length,
installed: data.applications.filter((app) => app.installed).length,
linked: data.applications.filter((app) => app.hasConfig).length,
};
// Toolset statistics
const toolsetStats = {
total: data.toolsets.length,
inUse: data.toolsets.filter((ts) => ts.apps && ts.apps.length > 0).length,
};
// Group statistics (if database is enabled)
let groupStats;
const nedbEnabled = false; // NeDB removed - using file-based configuration
if (data.groups && nedbEnabled) {
groupStats = {
total: data.groups.length,
active: data.groups.filter((g) => g.serverIds && g.serverIds.length > 0)
.length,
};
}
return {
servers: serverStats,
applications: appStats,
groups: groupStats,
toolsets: toolsetStats,
};
}
/**
* Format the header for the main menu
*/
function formatHeader() {
const title = "HyperTool Configuration Overview";
const separator = "=".repeat(47);
return `
${theme.primary(separator)}
${theme.primary(title)}
${theme.primary(separator)}`;
}
/**
* Format server statistics section
*/
function formatServerStats(stats) {
const { servers } = stats;
// First row: Total and Healthy
const firstRow = ` Total: ${theme.value(servers.total.toString())} servers | Healthy: ${theme.success(servers.healthy.toString())}`;
// Second row: Transport types
const transportTypes = ["stdio", "http", "sse", "websocket"];
const transportCounts = transportTypes
.map((type) => {
const count = servers.byType[type] || 0;
const typeLabel = type.toUpperCase();
return `${typeLabel}: ${count}`;
})
.join(" | ");
const secondRow = ` ${theme.muted(transportCounts)}`;
return `${theme.warning("📡 MCP Servers")}\n${firstRow}\n${secondRow}`;
}
/**
* Format application statistics section
*/
function formatApplicationStats(stats) {
const { applications } = stats;
return `${theme.warning("🖥️ Applications")}
Detected: ${theme.value(`${applications.installed}/${applications.total}`)} | Linked: ${theme.value(`${applications.linked}/${applications.installed}`)}`;
}
/**
* Format server groups statistics section
*/
async function formatGroupStats(stats) {
const nedbEnabled = false; // NeDB removed - using file-based configuration
if (!stats.groups || !nedbEnabled) {
return "";
}
const { groups } = stats;
return `
${theme.warning("👥 Server Groups")} ${theme.muted("(Database Feature)")}
Total: ${theme.value(groups.total.toString())} | Active: ${theme.value(groups.active.toString())}`;
}
/**
* Format toolsets statistics section
*/
function formatToolsetStats(stats) {
const { toolsets } = stats;
return `${theme.warning("🧰 Toolsets")}
Total: ${theme.value(toolsets.total.toString())} | In Use: ${theme.value(toolsets.inUse.toString())}`;
}
/**
* Display the main menu and handle selection
*/
export async function showMainMenu(data) {
const stats = await calculateSummaryStats(data);
// Clear screen and display header
console.clear();
output.log(formatHeader());
output.displaySpaceBuffer(1);
// Display statistics sections
output.log(formatServerStats(stats));
output.displaySpaceBuffer(1);
output.log(formatApplicationStats(stats));
output.displaySpaceBuffer(1);
// Only show groups if database is enabled
const nedbEnabled = false; // NeDB removed - using file-based configuration
if (nedbEnabled && stats.groups) {
output.log(await formatGroupStats(stats));
output.displaySpaceBuffer(1);
}
output.log(formatToolsetStats(stats));
output.displaySpaceBuffer(2);
// Create menu choices
const choices = [
{
name: "View MCP Servers",
value: { action: "navigate", view: ViewType.SERVERS_LIST },
},
{
name: "View Applications",
value: { action: "navigate", view: ViewType.APPLICATIONS_LIST },
},
];
// Add server groups option if database is enabled
if (nedbEnabled && stats.groups) {
choices.push({
name: "View Server Groups",
value: { action: "navigate", view: ViewType.GROUPS_LIST },
});
}
choices.push({
name: "View Toolsets",
value: { action: "navigate", view: ViewType.TOOLSETS_LIST },
}, new inquirer.Separator(), {
name: "Refresh Data",
value: { action: "refresh" },
}, {
name: "[Exit]",
value: { action: "exit" },
});
// Show the menu
const { selection } = await inquirer.prompt([
{
type: "list",
name: "selection",
message: "What would you like to explore? (Use [Back] to navigate up, Ctrl+C to exit)",
choices,
pageSize: 15, // Increased page size for main menu
},
]);
return {
action: selection.action,
nextView: selection.view,
};
}
//# sourceMappingURL=main-menu.js.map