import { mkdirSync, rmSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { getBundledSkillsDir } from "../src/config.js"; import type { PythonSkillRuntimeInfo } from "../src/core/skills.js"; import { IpythonKernelProvisioner } from "../src/core/tools/ipython.js"; function bundledDisplaySkill(): PythonSkillRuntimeInfo { const packagePath = join(getBundledSkillsDir(), "display"); return { name: "display", importName: "display", packagePath, pyprojectPath: join(packagePath, "pyproject.toml"), }; } describe("display skill in persistent kernel", () => { let tempDir: string; let provisioner: IpythonKernelProvisioner | undefined; beforeEach(() => { tempDir = join(tmpdir(), `pi-display-test-${Date.now()}-${Math.random().toString(36).slice(2)}`); mkdirSync(tempDir, { recursive: true }); }); afterEach(async () => { await provisioner?.dispose(); provisioner = undefined; rmSync(tempDir, { recursive: true, force: true }); }); it("emits markdown displays and excludes full content from execution result", async () => { provisioner = new IpythonKernelProvisioner(tempDir, { pythonSkills: [bundledDisplaySkill()], }); const manager = await provisioner.ensure(); const result = await manager.execute('await display("# Title\\n\\nSome markdown content", title="Audit Report")'); expect(result.status).toBe("ok"); expect(result.result).toContain("Displayed markdown"); expect(result.displays).toHaveLength(1); expect(result.displays?.[0]).toEqual({ content: "# Title\n\nSome markdown content", title: "Audit Report", format: "markdown", }); }); it("emits diff displays with display.diff helper", async () => { provisioner = new IpythonKernelProvisioner(tempDir, { pythonSkills: [bundledDisplaySkill()], }); const manager = await provisioner.ensure(); const diffText = "diff --git a/a.txt b/a.txt\n--- a/a.txt\n+++ b/a.txt\n@@ -1 +1 @@\n-a\n+b\n"; const result = await manager.execute(`await display.diff(${JSON.stringify(diffText)}, title="Fix spelling")`); expect(result.status).toBe("ok"); expect(result.displays?.[0]).toEqual({ content: diffText, title: "Fix spelling", format: "diff", }); }); it("emits json displays with display.json helper", async () => { provisioner = new IpythonKernelProvisioner(tempDir, { pythonSkills: [bundledDisplaySkill()], }); const manager = await provisioner.ensure(); const result = await manager.execute('await display.json({"hello": "world", "num": 42}, title="Config")'); expect(result.status).toBe("ok"); expect(result.displays?.[0]?.title).toBe("Config"); expect(result.displays?.[0]?.format).toBe("json"); expect(JSON.parse(result.displays?.[0]?.content ?? "")).toEqual({ hello: "world", num: 42 }); }); });