|
|
@@ -47,20 +47,109 @@ if (!arch) {
|
|
|
const base = "opencode-" + platform + "-" + arch
|
|
|
const binary = platform === "windows" ? "opencode.exe" : "opencode"
|
|
|
|
|
|
+function supportsAvx2() {
|
|
|
+ if (arch !== "x64") return false
|
|
|
+
|
|
|
+ if (platform === "linux") {
|
|
|
+ try {
|
|
|
+ return /(^|\s)avx2(\s|$)/i.test(fs.readFileSync("/proc/cpuinfo", "utf8"))
|
|
|
+ } catch {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (platform === "darwin") {
|
|
|
+ try {
|
|
|
+ const result = childProcess.spawnSync("sysctl", ["-n", "hw.optional.avx2_0"], {
|
|
|
+ encoding: "utf8",
|
|
|
+ timeout: 1500,
|
|
|
+ })
|
|
|
+ if (result.status !== 0) return false
|
|
|
+ return (result.stdout || "").trim() === "1"
|
|
|
+ } catch {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (platform === "windows") {
|
|
|
+ const cmd =
|
|
|
+ '(Add-Type -MemberDefinition "[DllImport(""kernel32.dll"")] public static extern bool IsProcessorFeaturePresent(int ProcessorFeature);" -Name Kernel32 -Namespace Win32 -PassThru)::IsProcessorFeaturePresent(40)'
|
|
|
+
|
|
|
+ for (const exe of ["powershell.exe", "pwsh.exe", "pwsh", "powershell"]) {
|
|
|
+ try {
|
|
|
+ const result = childProcess.spawnSync(exe, ["-NoProfile", "-NonInteractive", "-Command", cmd], {
|
|
|
+ encoding: "utf8",
|
|
|
+ timeout: 3000,
|
|
|
+ windowsHide: true,
|
|
|
+ })
|
|
|
+ if (result.status !== 0) continue
|
|
|
+ const out = (result.stdout || "").trim().toLowerCase()
|
|
|
+ if (out === "true" || out === "1") return true
|
|
|
+ if (out === "false" || out === "0") return false
|
|
|
+ } catch {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
+ return false
|
|
|
+}
|
|
|
+
|
|
|
+const names = (() => {
|
|
|
+ const avx2 = supportsAvx2()
|
|
|
+ const baseline = arch === "x64" && !avx2
|
|
|
+
|
|
|
+ if (platform === "linux") {
|
|
|
+ const musl = (() => {
|
|
|
+ try {
|
|
|
+ if (fs.existsSync("/etc/alpine-release")) return true
|
|
|
+ } catch {
|
|
|
+ // ignore
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ const result = childProcess.spawnSync("ldd", ["--version"], { encoding: "utf8" })
|
|
|
+ const text = ((result.stdout || "") + (result.stderr || "")).toLowerCase()
|
|
|
+ if (text.includes("musl")) return true
|
|
|
+ } catch {
|
|
|
+ // ignore
|
|
|
+ }
|
|
|
+
|
|
|
+ return false
|
|
|
+ })()
|
|
|
+
|
|
|
+ if (musl) {
|
|
|
+ if (arch === "x64") {
|
|
|
+ if (baseline) return [`${base}-baseline-musl`, `${base}-musl`, `${base}-baseline`, base]
|
|
|
+ return [`${base}-musl`, `${base}-baseline-musl`, base, `${base}-baseline`]
|
|
|
+ }
|
|
|
+ return [`${base}-musl`, base]
|
|
|
+ }
|
|
|
+
|
|
|
+ if (arch === "x64") {
|
|
|
+ if (baseline) return [`${base}-baseline`, base, `${base}-baseline-musl`, `${base}-musl`]
|
|
|
+ return [base, `${base}-baseline`, `${base}-musl`, `${base}-baseline-musl`]
|
|
|
+ }
|
|
|
+ return [base, `${base}-musl`]
|
|
|
+ }
|
|
|
+
|
|
|
+ if (arch === "x64") {
|
|
|
+ if (baseline) return [`${base}-baseline`, base]
|
|
|
+ return [base, `${base}-baseline`]
|
|
|
+ }
|
|
|
+ return [base]
|
|
|
+})()
|
|
|
+
|
|
|
function findBinary(startDir) {
|
|
|
let current = startDir
|
|
|
for (;;) {
|
|
|
const modules = path.join(current, "node_modules")
|
|
|
if (fs.existsSync(modules)) {
|
|
|
- const entries = fs.readdirSync(modules)
|
|
|
- for (const entry of entries) {
|
|
|
- if (!entry.startsWith(base)) {
|
|
|
- continue
|
|
|
- }
|
|
|
- const candidate = path.join(modules, entry, "bin", binary)
|
|
|
- if (fs.existsSync(candidate)) {
|
|
|
- return candidate
|
|
|
- }
|
|
|
+ for (const name of names) {
|
|
|
+ const candidate = path.join(modules, name, "bin", binary)
|
|
|
+ if (fs.existsSync(candidate)) return candidate
|
|
|
}
|
|
|
}
|
|
|
const parent = path.dirname(current)
|
|
|
@@ -74,9 +163,9 @@ function findBinary(startDir) {
|
|
|
const resolved = findBinary(scriptDir)
|
|
|
if (!resolved) {
|
|
|
console.error(
|
|
|
- 'It seems that your package manager failed to install the right version of the opencode CLI for your platform. You can try manually installing the "' +
|
|
|
- base +
|
|
|
- '" package',
|
|
|
+ "It seems that your package manager failed to install the right version of the opencode CLI for your platform. You can try manually installing " +
|
|
|
+ names.map((n) => `\"${n}\"`).join(" or ") +
|
|
|
+ " package",
|
|
|
)
|
|
|
process.exit(1)
|
|
|
}
|