diff --git a/packages/opencode/script/build.ts b/packages/opencode/script/build.ts index 2a17f7f7a32..86172e640ba 100755 --- a/packages/opencode/script/build.ts +++ b/packages/opencode/script/build.ts @@ -287,35 +287,25 @@ for (const item of targets) { const bunfsRoot = item.os === "win32" ? "B:/~BUN/root/" : "/$bunfs/root/" const workerRelativePath = path.relative(dir, parserWorker).replaceAll("\\", "/") - // kilocode_change start - redirect @morphllm/morphsdk ESM barrel to self-contained CJS bundle - // Bun 1.3.14 (with conditions:["browser"]) resolves via the "import" condition, pulling in the - // pre-split ESM barrel (client.js) whose 52 chunk-*.js side-imports make the ESM splitter emit - // invalid minified output: SyntaxError: Exported binding 'G9' needs to refer to a top-level... - // Redirecting onResolve to client.cjs (2300-line self-contained CJS bundle) bypasses the splitter. - // require.resolve uses the package's "require" condition, which maps the warp-grep/client - // subpath straight to client.cjs. The deep dist path is not an exported subpath, so resolving - // it directly throws "Cannot find module" — go through the public specifier instead. - const morphsdkCjs = require.resolve("@morphllm/morphsdk/tools/warp-grep/client") - const morphsdkCjsPlugin: import("bun").BunPlugin = { - name: "morphsdk-cjs", - setup(build) { - build.onResolve({ filter: /^@morphllm\/morphsdk\/tools\/warp-grep\/client$/ }, () => ({ - path: morphsdkCjs, - })) - }, - } - // kilocode_change end await Bun.build({ conditions: ["browser"], tsconfig: "./tsconfig.json", - plugins: [plugin, morphsdkCjsPlugin], // kilocode_change + plugins: [plugin], // kilocode_change start - skip sourcemaps for release builds (each .js.map adds ~50 MB per target → ~600 MB total) sourcemap: Script.release ? "none" : "external", // kilocode_change end external: ["node-gyp", ...LanceDBRuntime.external], // kilocode_change format: "esm", minify: true, - splitting: true, + // kilocode_change start - disable code-splitting to avoid a Bun 1.3.14 codegen bug. + // With splitting:true Bun emits cross-chunk re-exports like `import{vn as G9}` whose + // binding isn't top-level, so the compiled binary crashes at startup on the baseline + // target: "SyntaxError: Exported binding 'G9' needs to refer to a top-level declared + // variable." (Bun oven-sh/bun#25621, #5344, #7265; also opencode#23349). Fixed upstream + // in Bun#26089, post-1.3.14. Splitting only deduped shared code between the entrypoints; + // turning it off inlines per entrypoint and produces a valid binary. + splitting: false, + // kilocode_change end compile: { autoloadBunfig: false, autoloadDotenv: false, diff --git a/packages/opencode/src/kilocode/compat/morphsdk.ts b/packages/opencode/src/kilocode/compat/morphsdk.ts deleted file mode 100644 index 73223d28261..00000000000 --- a/packages/opencode/src/kilocode/compat/morphsdk.ts +++ /dev/null @@ -1,32 +0,0 @@ -// kilocode_change - new file -// Re-exports from @morphllm/morphsdk/tools/warp-grep/client. -// -// WHY THIS INDIRECTION EXISTS -// ---------------------------- -// @morphllm/morphsdk ships a pre-split ESM distribution for this path: -// dist/tools/warp_grep/client.js (805-byte barrel) -// └─ imports from ../../chunk-P7G3CJB2.js ... (52 total pre-split chunks) -// -// Bun 1.3.14 bundling with `conditions: ["browser"]` resolves via the "import" condition -// (ESM barrel) even inside createRequire() calls. When its ESM splitter merges those -// external pre-split chunks into the bundle, it generates invalid minified output: -// SyntaxError: Exported binding 'G9' needs to refer to a top-level declared variable. -// -// FIX: script/build.ts adds a morphsdkCjsPlugin (onResolve) that redirects this module -// specifier to client.cjs — a fully self-contained CJS bundle (~2300 lines, no chunk-*.js -// imports). The plugin runs at bundle time before the ESM splitter is invoked. It resolves -// client.cjs via require.resolve("@morphllm/morphsdk/tools/warp-grep/client") (the package's -// "require" export condition); the raw dist/.../client.cjs path is not an exported subpath -// and throws "Cannot find module". -// -// HOW TO DETECT THIS FOR FUTURE DEPS -// ------------------------------------ -// If a new dependency causes the SyntaxError above in release builds, check whether its -// ESM entry point is a barrel that re-imports from internal `chunk-*.js` files: -// -// head -5 node_modules//dist/index.js -// → imports { ... } from "./chunk-XYZ123.js" ← pre-split ESM -// -// If so, add a matching onResolve redirect to the CJS counterpart in build.ts. - -export { WarpGrepClient } from "@morphllm/morphsdk/tools/warp-grep/client" diff --git a/packages/opencode/src/tool/warpgrep.ts b/packages/opencode/src/tool/warpgrep.ts index 5ee3a3ff329..16ffb474157 100644 --- a/packages/opencode/src/tool/warpgrep.ts +++ b/packages/opencode/src/tool/warpgrep.ts @@ -1,6 +1,6 @@ import { Effect, Schema } from "effect" import * as Tool from "./tool" -import { WarpGrepClient } from "@/kilocode/compat/morphsdk" // kilocode_change +import { WarpGrepClient } from "@morphllm/morphsdk/tools/warp-grep/client" // kilocode_change import { Telemetry } from "@kilocode/kilo-telemetry" // kilocode_change import { Instance } from "../project/instance" import { Bus } from "../bus"