// plex's tools — moved here from the shared sdk (novox/hq ADR 0044), importing plex's own client. // They return structured data; the mesh serves them through the sdk's tool harness. import { registerModuleTools, type ToolDefinition } from "@novox/mesh-sdk/tools"; import { PlexClient } from "../client.js"; export function getPlexTools(plex: PlexClient): ToolDefinition[] { return [ { name: "plex_status", description: "Plex server status: server info, libraries, active sessions, recently added.", input: {}, run: async () => { const [server, libraries, sessions, recent] = await Promise.all([ plex.getServerInfo(), plex.getLibraries(), plex.getSessions(), plex.getRecentlyAdded(10), ]); return { server, libraries, sessions, recentlyAdded: recent }; }, }, { name: "plex_reachable", description: "Health probe: whether the Plex server answers, and which server it is. Never fails.", input: {}, run: async () => plex.reachable(), }, { name: "plex_search", description: "Search across all Plex libraries — movies, shows, episodes, music.", input: { query: { type: "string", description: "the search query" } }, run: async (args) => ({ query: String(args.query), results: await plex.search(String(args.query)) }), }, { name: "plex_sessions", description: "Active Plex playback sessions — who is watching what, and where.", input: {}, run: async () => { const sessions = await plex.getSessions(); return { count: sessions.length, sessions }; }, }, { name: "plex_recently_added", description: "Recently added media in Plex.", input: { limit: { type: "number", description: "how many items (default 20)" } }, run: async (args) => ({ items: await plex.getRecentlyAdded(args.limit ? Number(args.limit) : 20) }), }, { name: "plex_refresh", description: "Ask Plex to rescan its libraries so new files on disk become visible items.", input: { library: { type: "string", description: "a library section key; omitted rescans all" } }, run: async (args) => { if (args.library) { await plex.refreshLibrary(String(args.library)); return { refreshed: String(args.library) }; } await plex.refreshAll(); return { refreshed: "all" }; }, }, ]; } // The tools exist only when a token can be found; without one, plex contributes none rather than // failing the whole runtime. registerModuleTools("plex", (env) => { try { return getPlexTools(PlexClient.fromEnv(env)); } catch { return []; } });