/** * Lazy loaders for the heavy module graphs. * * The Pi extension loader transpiles every extension module on every start * with no module cache, and a fresh jiti instance per extension. Loading * `@sakiko233/pi-agent-runtime` (imported for values by runner/attested/ * launch/budget) through that pipeline costs ~660-720 ms of module import on * Pi 0.84.2 — measured in `.sakiko/decisions/0007-subagent-startup-import-cost.md`. * * These four modules are therefore imported only when a subagent tool actually * executes. Each loader hands out the same module promise for the lifetime of * the process, so the transpile cost is paid exactly once per session, at * first use. */ let runnerModule: Promise | undefined; let launchModule: Promise | undefined; let budgetModule: Promise | undefined; let attestedModule: Promise | undefined; let heavyImportChain: Promise = Promise.resolve(); /** * Serialize lazy graph roots across Jiti's shared parent cache. * * Jiti publishes an async module into `parentCache` before evaluation finishes, * and a concurrent import returns that module's current `exports` immediately. * The runtime barrel installs re-exports sequentially, so overlapping heavy * roots can observe it before the token-budget exports exist. One import root at * a time keeps every named binding behind the completed barrel evaluation. */ function serializeHeavyImport(load: () => Promise): Promise { const loaded = heavyImportChain.then(load); heavyImportChain = loaded.then(() => undefined); return loaded; } export function loadRunnerModule(): Promise { runnerModule ??= serializeHeavyImport(() => import('./runner.js')); return runnerModule; } export function loadLaunchModule(): Promise { launchModule ??= serializeHeavyImport(() => import('./launch.js')); return launchModule; } export function loadBudgetModule(): Promise { budgetModule ??= serializeHeavyImport(() => import('./budget.js')); return budgetModule; } export function loadAttestedModule(): Promise { attestedModule ??= serializeHeavyImport(() => import('./attested.js')); return attestedModule; }