// umami's tools — moved here from the shared sdk (novox/hq ADR 0044). They import umami's own // client (../client) and plug into the mesh through the sdk's tool harness. Editing them rebuilds // umami and nothing else. import { registerModuleTools, type ToolDefinition } from "@novox/mesh-sdk/tools"; import { UmamiClient } from "../client.js"; export function getUmamiTools(umami: UmamiClient): ToolDefinition[] { return [ { name: "umami_create_site", description: "Register a website in umami and return its tracking snippet.", input: { domain: { type: "string", description: "the site domain, e.g. my-app.example" }, name: { type: "string", description: "display name (defaults to the domain)" }, }, run: async (args) => { const domain = String(args.domain); const name = args.name ? String(args.name) : domain; const token = await umami.getToken(); const existing = await umami.findWebsite(token, domain); const site = existing ?? (await umami.createWebsite(token, domain, name)); return { created: !existing, id: site.id, name: site.name, domain: site.domain, snippet: umami.snippet(site.id), dashboard: umami.dashboard(site.id), }; }, }, { name: "umami_delete_site", description: "Delete a website from umami (destructive).", input: { domain: { type: "string", description: "the site domain to delete" }, confirm: { type: "boolean", description: "must be true to delete" }, }, run: async (args) => { if (args.confirm !== true) return { deleted: false, reason: "confirm must be true" }; const domain = String(args.domain); const token = await umami.getToken(); const site = await umami.findWebsite(token, domain); if (!site) return { deleted: false, reason: `no website with domain ${domain}` }; await umami.deleteWebsite(token, site.id); return { deleted: true, id: site.id, domain: site.domain }; }, }, ]; } // The module contributes its tools as a function of its resolved environment; the client lives in // the module, so a token being absent simply yields no tools rather than a failure. registerModuleTools("umami", (env) => { try { return getUmamiTools(UmamiClient.fromEnv(env)); } catch { return []; } });