Add !status command and web search tool
- !status: shows agent count, load, RAM, disk, uptime, Ollama model loaded - web_search tool: agents can search via SearXNG (searx.mymx.me) Works in both structured and text-based tool call paths Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -153,8 +153,50 @@ export async function runOverseer(config: OverseerConfig) {
|
||||
break;
|
||||
}
|
||||
|
||||
case "!status": {
|
||||
try {
|
||||
const os = await import("node:os");
|
||||
const { execFileSync } = await import("node:child_process");
|
||||
const agents = listAgents();
|
||||
const uptime = Math.floor(os.uptime() / 3600);
|
||||
const totalMem = (os.totalmem() / 1e9).toFixed(0);
|
||||
const freeMem = (os.freemem() / 1e9).toFixed(0);
|
||||
const load = os.loadavg()[0].toFixed(2);
|
||||
|
||||
// Disk free
|
||||
let diskFree = "?";
|
||||
try {
|
||||
const dfOut = execFileSync("df", ["-h", "/"], { encoding: "utf-8" });
|
||||
const parts = dfOut.split("\n")[1]?.split(/\s+/);
|
||||
if (parts) diskFree = `${parts[3]} free / ${parts[1]}`;
|
||||
} catch {}
|
||||
|
||||
// Ollama model loaded
|
||||
let ollamaModel = "none";
|
||||
try {
|
||||
const http = await import("node:http");
|
||||
const psData = await new Promise<string>((resolve, reject) => {
|
||||
http.get("http://localhost:11434/api/ps", (res) => {
|
||||
const chunks: Buffer[] = [];
|
||||
res.on("data", (c) => chunks.push(c));
|
||||
res.on("end", () => resolve(Buffer.concat(chunks).toString()));
|
||||
}).on("error", reject);
|
||||
});
|
||||
const running = JSON.parse(psData).models;
|
||||
if (running?.length > 0) {
|
||||
ollamaModel = running.map((m: { name: string }) => m.name).join(", ");
|
||||
}
|
||||
} catch {}
|
||||
|
||||
bot.say(event.target, `Agents: ${agents.length} running | Load: ${load} | RAM: ${freeMem}/${totalMem} GB free | Disk: ${diskFree} | Uptime: ${uptime}h | Ollama: ${ollamaModel}`);
|
||||
} catch (e) {
|
||||
bot.say(event.target, "Error getting status.");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "!help": {
|
||||
bot.say(event.target, "Commands: !invoke <template> [name] | !destroy <name> | !list | !model <name> <model> | !models | !templates | !help");
|
||||
bot.say(event.target, "Commands: !invoke <template> [name] | !destroy <name> | !list | !model <name> <model> | !models | !templates | !status | !help");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user