import assert from "node:assert/strict"; import * as fs from "node:fs"; import * as os from "node:os"; import * as path from "node:path"; import { test } from "node:test"; import { fauxAssistantMessage, fauxProvider, fauxToolCall, getCurrentTools, type FauxResponseFactory, type FauxResponseStep, } from "@earendil-works/pi-ai"; import { DefaultResourceLoader, ModelRuntime, SessionManager, SettingsManager, createAgentSession, createCodemodeExtension, } from "@selesai/code"; async function runNativeSession(config: Record | undefined, responses: FauxResponseStep[], prompts: string[]): Promise { const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-tool-activation-")); const cwd = path.join(root, "project"); const agentDir = path.join(root, "agent"); fs.mkdirSync(cwd); fs.mkdirSync(agentDir); if (config) { fs.mkdirSync(path.join(agentDir, "extensions", "subagent"), { recursive: true }); fs.writeFileSync(path.join(agentDir, "extensions", "subagent", "config.json"), JSON.stringify(config)); } const priorAgentDir = process.env.SELESAI_CODING_AGENT_DIR; const priorChild = process.env.SELESAI_SUBAGENT_CHILD; process.env.SELESAI_CODING_AGENT_DIR = agentDir; delete process.env.SELESAI_SUBAGENT_CHILD; let session: Awaited>["session"] | undefined; try { const { default: registerSubagentExtension } = await import(`../../index.ts?native-activation=${Date.now()}`); const faux = fauxProvider({ provider: "tool-activation", models: [{ id: "local" }], tokensPerSecond: 100_000 }); faux.setResponses(responses); const settingsManager = SettingsManager.inMemory({}); const resourceLoader = new DefaultResourceLoader({ cwd, agentDir, settingsManager, noExtensions: true, noSkills: true, noPromptTemplates: true, noThemes: true, noContextFiles: true, extensionFactories: [registerSubagentExtension, createCodemodeExtension({ inlineBudget: 0 }), (pi) => pi.registerProvider(faux.provider)], }); await resourceLoader.reload(); const modelRuntime = await ModelRuntime.create({ authPath: path.join(agentDir, "auth.json"), modelsPath: path.join(agentDir, "models.json"), allowModelNetwork: false }); ({ session } = await createAgentSession({ cwd, agentDir, settingsManager, resourceLoader, modelRuntime, model: faux.getModel("local"), sessionManager: SessionManager.inMemory(cwd), noTools: "builtin", })); await session.bindExtensions({}); session.setActiveToolsByName(["codemode"]); for (const prompt of prompts) await session.prompt(prompt); } finally { if (session) { await (session.extensionRunner as any).emit({ type: "session_shutdown", reason: "quit" }); session.dispose(); } if (priorAgentDir === undefined) delete process.env.SELESAI_CODING_AGENT_DIR; else process.env.SELESAI_CODING_AGENT_DIR = priorAgentDir; if (priorChild === undefined) delete process.env.SELESAI_SUBAGENT_CHILD; else process.env.SELESAI_SUBAGENT_CHILD = priorChild; fs.rmSync(root, { recursive: true, force: true }); } } test("codemode invokes subagent management without loading direct schemas", { timeout: 30_000 }, async () => { let requests = 0; const checkTools = (context: Parameters[0]) => { requests += 1; assert.deepEqual(getCurrentTools(context.messages).map((tool) => tool.name), ["codemode"]); }; await runNativeSession(undefined, [ (context) => { checkTools(context); return fauxAssistantMessage(fauxToolCall("codemode", { code: 'text(await tools.subagent({ action: "list", capabilities: true }));' }), { stopReason: "toolUse" }); }, (context) => { checkTools(context); const result = context.messages.findLast((message) => message.role === "toolResult" && message.toolName === "codemode"); assert.ok(result && result.role === "toolResult"); assert.equal(result.isError, false, "the nested management call must actually succeed"); assert.match(JSON.stringify(result.content), /delegate|Executable agents/); return fauxAssistantMessage("Listed without activation."); }, (context) => { checkTools(context); return fauxAssistantMessage("Still codemode-only."); }, ], ["Inspect installed agents without launching work.", "Continue."]); assert.equal(requests, 3); });