From 1ce870db1be776cfd2caa96a1104584a6dec92f7 Mon Sep 17 00:00:00 2001 From: Sviatoslav Abakumov Date: Thu, 5 Mar 2026 10:08:30 +0400 Subject: [PATCH] fix(coding-agent): use ESM resolution for extension alias fallback (#1821) The previous fix (83b57924) replaced require.resolve() with bare specifier fallbacks to avoid ERR_PACKAGE_PATH_NOT_EXPORTED for ESM-only packages like pi-ai. However, bare specifiers are not valid jiti alias targets, breaking extension loading in global npm installs. Use import.meta.resolve() as the fallback instead. It respects the "import" exports condition and returns a real file path. --- packages/coding-agent/package.json | 2 +- packages/coding-agent/src/core/extensions/loader.ts | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/coding-agent/package.json b/packages/coding-agent/package.json index d20fda43..83144bd1 100644 --- a/packages/coding-agent/package.json +++ b/packages/coding-agent/package.json @@ -94,6 +94,6 @@ "directory": "packages/coding-agent" }, "engines": { - "node": ">=20.0.0" + "node": ">=20.6.0" } } diff --git a/packages/coding-agent/src/core/extensions/loader.ts b/packages/coding-agent/src/core/extensions/loader.ts index 8ff7228f..dc8ba5e5 100644 --- a/packages/coding-agent/src/core/extensions/loader.ts +++ b/packages/coding-agent/src/core/extensions/loader.ts @@ -65,20 +65,20 @@ function getAliases(): Record { const typeboxRoot = typeboxEntry.replace(/[\\/]build[\\/]cjs[\\/]index\.js$/, ""); const packagesRoot = path.resolve(__dirname, "../../../../"); - const resolveWorkspaceOrSpecifier = (workspaceRelativePath: string, specifier: string): string => { + const resolveWorkspaceOrImport = (workspaceRelativePath: string, specifier: string): string => { const workspacePath = path.join(packagesRoot, workspaceRelativePath); if (fs.existsSync(workspacePath)) { return workspacePath; } - return specifier; + return fileURLToPath(import.meta.resolve(specifier)); }; _aliases = { "@mariozechner/pi-coding-agent": packageIndex, - "@mariozechner/pi-agent-core": resolveWorkspaceOrSpecifier("agent/src/index.ts", "@mariozechner/pi-agent-core"), - "@mariozechner/pi-tui": resolveWorkspaceOrSpecifier("tui/src/index.ts", "@mariozechner/pi-tui"), - "@mariozechner/pi-ai": resolveWorkspaceOrSpecifier("ai/src/index.ts", "@mariozechner/pi-ai"), - "@mariozechner/pi-ai/oauth": resolveWorkspaceOrSpecifier("ai/src/oauth.ts", "@mariozechner/pi-ai/oauth"), + "@mariozechner/pi-agent-core": resolveWorkspaceOrImport("agent/src/index.ts", "@mariozechner/pi-agent-core"), + "@mariozechner/pi-tui": resolveWorkspaceOrImport("tui/src/index.ts", "@mariozechner/pi-tui"), + "@mariozechner/pi-ai": resolveWorkspaceOrImport("ai/src/index.ts", "@mariozechner/pi-ai"), + "@mariozechner/pi-ai/oauth": resolveWorkspaceOrImport("ai/src/oauth.ts", "@mariozechner/pi-ai/oauth"), "@sinclair/typebox": typeboxRoot, };