Luigit
repositories / pi-ext

pi-ext

bugabingas pi extensions

owned by admin

extensions/ephemlets/src/loader.ts

Raw
import { dirname, join } from "node:path";
import { fileURLToPath } from "node:url";
import * as ai from "@earendil-works/pi-ai";
import * as pi from "@earendil-works/pi-coding-agent";
import * as tui from "@earendil-works/pi-tui";
import * as typebox from "typebox";
import { boundedText } from "./store.ts";
import type { EphemletFactory } from "./types.ts";

/** In-memory source evaluation: no generated file or reload is needed. Not a sandbox. */
export async function loadFactory(source: string): Promise<EphemletFactory> {
	boundedText(source, "Source");
	const { createJiti } = await import("jiti");
	const jiti = createJiti(import.meta.url, {
		fsCache: false,
		moduleCache: false,
		debug: false,
		interopDefault: false,
		virtualModules: {
			"@earendil-works/pi-coding-agent": pi,
			"@earendil-works/pi-tui": tui,
			"@earendil-works/pi-ai": ai,
			typebox,
		},
	});
	const module = (await jiti.evalModule(source, {
		filename: join(
			dirname(fileURLToPath(import.meta.url)),
			"ephemlet.generated.ts",
		),
		async: true,
		forceTranspile: true,
	})) as { default?: unknown };
	if (typeof module?.default !== "function")
		throw new Error("Ephemlet must export a default component factory");
	return module.default as EphemletFactory;
}