import * as path from "node:path"; import { createRequire } from "node:module"; import { pathToFileURL } from "node:url"; import type { ExtensionAPI } from "@earendil-works/pi-coding-agent"; const require = createRequire(import.meta.url); type SubagentsOwner = "unknown" | "external" | "package-local"; let attempted = false; let owner: SubagentsOwner = "unknown"; function resolveSubagentsPackageRoot(): string { return path.dirname(require.resolve("pi-subagents/package.json")); } export function getPackageLocalSubagentsResourcePaths(): { skillPaths: string[]; promptPaths: string[] } { const packageRoot = resolveSubagentsPackageRoot(); return { skillPaths: [path.join(packageRoot, "skills")], promptPaths: [path.join(packageRoot, "prompts")], }; } function hasSubagentTool(pi: ExtensionAPI): boolean { return pi.getAllTools().some((tool) => tool.name === "subagent"); } async function registerPackageLocalSubagents(pi: ExtensionAPI): Promise { if (owner !== "unknown") return; if (hasSubagentTool(pi)) { owner = "external"; return; } const extensionUrl = pathToFileURL(path.join(resolveSubagentsPackageRoot(), "src", "extension", "index.ts")).href; const subagentsModule = await import(extensionUrl) as { default?: (api: ExtensionAPI) => void | Promise }; const registerSubagents = subagentsModule.default; if (typeof registerSubagents !== "function") { throw new Error("pi-subagents extension does not export a default factory function"); } try { await registerSubagents(pi); owner = "package-local"; } catch (error) { if (hasSubagentTool(pi)) { owner = "external"; return; } throw error; } } export default function dotdotgodSubagents(pi: ExtensionAPI): void { pi.on("session_start", async () => { if (attempted || owner !== "unknown") return; attempted = true; await registerPackageLocalSubagents(pi); }); pi.on("resources_discover", () => { if (owner !== "package-local") return {}; return getPackageLocalSubagentsResourcePaths(); }); }