Files
mesh-catalog/modules/plex/tools/index.ts

75 lines
2.7 KiB
TypeScript

// plex's tools — moved here from the shared sdk (novox/hq ADR 0039), 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 [];
}
});