oh-my-opencode-unguarded 3.9.2 → 3.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +82 -82
- package/README.ja.md +347 -347
- package/README.ko.md +346 -346
- package/README.md +43 -43
- package/README.ru.md +367 -367
- package/README.zh-cn.md +346 -346
- package/bin/oh-my-opencode.js +142 -142
- package/bin/platform.d.ts +14 -14
- package/bin/platform.js +82 -82
- package/bin/platform.test.ts +203 -203
- package/dist/cli/index.js +1 -1
- package/package.json +99 -99
- package/postinstall.mjs +59 -59
package/bin/oh-my-opencode.js
CHANGED
|
@@ -1,142 +1,142 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// bin/oh-my-opencode.js
|
|
3
|
-
// Wrapper script that detects platform and spawns the correct binary
|
|
4
|
-
|
|
5
|
-
import { spawnSync } from "node:child_process";
|
|
6
|
-
import { readFileSync } from "node:fs";
|
|
7
|
-
import { createRequire } from "node:module";
|
|
8
|
-
import { getPlatformPackageCandidates, getBinaryPath } from "./platform.js";
|
|
9
|
-
|
|
10
|
-
const require = createRequire(import.meta.url);
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Detect libc family on Linux
|
|
14
|
-
* @returns {string | null} 'glibc', 'musl', or null if detection fails
|
|
15
|
-
*/
|
|
16
|
-
function getLibcFamily() {
|
|
17
|
-
if (process.platform !== "linux") {
|
|
18
|
-
return undefined; // Not needed on non-Linux
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
try {
|
|
22
|
-
const detectLibc = require("detect-libc");
|
|
23
|
-
return detectLibc.familySync();
|
|
24
|
-
} catch {
|
|
25
|
-
// detect-libc not available
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function supportsAvx2() {
|
|
31
|
-
if (process.arch !== "x64") {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
if (process.env.OH_MY_OPENCODE_FORCE_BASELINE === "1") {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if (process.platform === "linux") {
|
|
40
|
-
try {
|
|
41
|
-
const cpuInfo = readFileSync("/proc/cpuinfo", "utf8").toLowerCase();
|
|
42
|
-
return cpuInfo.includes("avx2");
|
|
43
|
-
} catch {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
if (process.platform === "darwin") {
|
|
49
|
-
const probe = spawnSync("sysctl", ["-n", "machdep.cpu.leaf7_features"], {
|
|
50
|
-
encoding: "utf8",
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
if (probe.error || probe.status !== 0) {
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return probe.stdout.toUpperCase().includes("AVX2");
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function getSignalExitCode(signal) {
|
|
64
|
-
const signalCodeByName = {
|
|
65
|
-
SIGINT: 2,
|
|
66
|
-
SIGILL: 4,
|
|
67
|
-
SIGKILL: 9,
|
|
68
|
-
SIGTERM: 15,
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
return 128 + (signalCodeByName[signal] ?? 1);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
function main() {
|
|
75
|
-
const { platform, arch } = process;
|
|
76
|
-
const libcFamily = getLibcFamily();
|
|
77
|
-
const avx2Supported = supportsAvx2();
|
|
78
|
-
|
|
79
|
-
let packageCandidates;
|
|
80
|
-
try {
|
|
81
|
-
packageCandidates = getPlatformPackageCandidates({
|
|
82
|
-
platform,
|
|
83
|
-
arch,
|
|
84
|
-
libcFamily,
|
|
85
|
-
preferBaseline: avx2Supported === false,
|
|
86
|
-
});
|
|
87
|
-
} catch (error) {
|
|
88
|
-
console.error(`\noh-my-opencode: ${error.message}\n`);
|
|
89
|
-
process.exit(1);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
const resolvedBinaries = packageCandidates
|
|
93
|
-
.map((pkg) => {
|
|
94
|
-
try {
|
|
95
|
-
return { pkg, binPath: require.resolve(getBinaryPath(pkg, platform)) };
|
|
96
|
-
} catch {
|
|
97
|
-
return null;
|
|
98
|
-
}
|
|
99
|
-
})
|
|
100
|
-
.filter((entry) => entry !== null);
|
|
101
|
-
|
|
102
|
-
if (resolvedBinaries.length === 0) {
|
|
103
|
-
console.error(`\noh-my-opencode: Platform binary not installed.`);
|
|
104
|
-
console.error(`\nYour platform: ${platform}-${arch}${libcFamily === "musl" ? "-musl" : ""}`);
|
|
105
|
-
console.error(`Expected packages (in order): ${packageCandidates.join(", ")}`);
|
|
106
|
-
console.error(`\nTo fix, run:`);
|
|
107
|
-
console.error(` npm install ${packageCandidates[0]}\n`);
|
|
108
|
-
process.exit(1);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
for (let index = 0; index < resolvedBinaries.length; index += 1) {
|
|
112
|
-
const currentBinary = resolvedBinaries[index];
|
|
113
|
-
const hasFallback = index < resolvedBinaries.length - 1;
|
|
114
|
-
const result = spawnSync(currentBinary.binPath, process.argv.slice(2), {
|
|
115
|
-
stdio: "inherit",
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
if (result.error) {
|
|
119
|
-
if (hasFallback) {
|
|
120
|
-
continue;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
console.error(`\noh-my-opencode: Failed to execute binary.`);
|
|
124
|
-
console.error(`Error: ${result.error.message}\n`);
|
|
125
|
-
process.exit(2);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
if (result.signal === "SIGILL" && hasFallback) {
|
|
129
|
-
continue;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
if (result.signal) {
|
|
133
|
-
process.exit(getSignalExitCode(result.signal));
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
process.exit(result.status ?? 1);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
process.exit(1);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
main();
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// bin/oh-my-opencode.js
|
|
3
|
+
// Wrapper script that detects platform and spawns the correct binary
|
|
4
|
+
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
import { readFileSync } from "node:fs";
|
|
7
|
+
import { createRequire } from "node:module";
|
|
8
|
+
import { getPlatformPackageCandidates, getBinaryPath } from "./platform.js";
|
|
9
|
+
|
|
10
|
+
const require = createRequire(import.meta.url);
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Detect libc family on Linux
|
|
14
|
+
* @returns {string | null} 'glibc', 'musl', or null if detection fails
|
|
15
|
+
*/
|
|
16
|
+
function getLibcFamily() {
|
|
17
|
+
if (process.platform !== "linux") {
|
|
18
|
+
return undefined; // Not needed on non-Linux
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
const detectLibc = require("detect-libc");
|
|
23
|
+
return detectLibc.familySync();
|
|
24
|
+
} catch {
|
|
25
|
+
// detect-libc not available
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function supportsAvx2() {
|
|
31
|
+
if (process.arch !== "x64") {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (process.env.OH_MY_OPENCODE_FORCE_BASELINE === "1") {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (process.platform === "linux") {
|
|
40
|
+
try {
|
|
41
|
+
const cpuInfo = readFileSync("/proc/cpuinfo", "utf8").toLowerCase();
|
|
42
|
+
return cpuInfo.includes("avx2");
|
|
43
|
+
} catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (process.platform === "darwin") {
|
|
49
|
+
const probe = spawnSync("sysctl", ["-n", "machdep.cpu.leaf7_features"], {
|
|
50
|
+
encoding: "utf8",
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
if (probe.error || probe.status !== 0) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return probe.stdout.toUpperCase().includes("AVX2");
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function getSignalExitCode(signal) {
|
|
64
|
+
const signalCodeByName = {
|
|
65
|
+
SIGINT: 2,
|
|
66
|
+
SIGILL: 4,
|
|
67
|
+
SIGKILL: 9,
|
|
68
|
+
SIGTERM: 15,
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
return 128 + (signalCodeByName[signal] ?? 1);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function main() {
|
|
75
|
+
const { platform, arch } = process;
|
|
76
|
+
const libcFamily = getLibcFamily();
|
|
77
|
+
const avx2Supported = supportsAvx2();
|
|
78
|
+
|
|
79
|
+
let packageCandidates;
|
|
80
|
+
try {
|
|
81
|
+
packageCandidates = getPlatformPackageCandidates({
|
|
82
|
+
platform,
|
|
83
|
+
arch,
|
|
84
|
+
libcFamily,
|
|
85
|
+
preferBaseline: avx2Supported === false,
|
|
86
|
+
});
|
|
87
|
+
} catch (error) {
|
|
88
|
+
console.error(`\noh-my-opencode: ${error.message}\n`);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const resolvedBinaries = packageCandidates
|
|
93
|
+
.map((pkg) => {
|
|
94
|
+
try {
|
|
95
|
+
return { pkg, binPath: require.resolve(getBinaryPath(pkg, platform)) };
|
|
96
|
+
} catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
})
|
|
100
|
+
.filter((entry) => entry !== null);
|
|
101
|
+
|
|
102
|
+
if (resolvedBinaries.length === 0) {
|
|
103
|
+
console.error(`\noh-my-opencode: Platform binary not installed.`);
|
|
104
|
+
console.error(`\nYour platform: ${platform}-${arch}${libcFamily === "musl" ? "-musl" : ""}`);
|
|
105
|
+
console.error(`Expected packages (in order): ${packageCandidates.join(", ")}`);
|
|
106
|
+
console.error(`\nTo fix, run:`);
|
|
107
|
+
console.error(` npm install ${packageCandidates[0]}\n`);
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
for (let index = 0; index < resolvedBinaries.length; index += 1) {
|
|
112
|
+
const currentBinary = resolvedBinaries[index];
|
|
113
|
+
const hasFallback = index < resolvedBinaries.length - 1;
|
|
114
|
+
const result = spawnSync(currentBinary.binPath, process.argv.slice(2), {
|
|
115
|
+
stdio: "inherit",
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
if (result.error) {
|
|
119
|
+
if (hasFallback) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
console.error(`\noh-my-opencode: Failed to execute binary.`);
|
|
124
|
+
console.error(`Error: ${result.error.message}\n`);
|
|
125
|
+
process.exit(2);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (result.signal === "SIGILL" && hasFallback) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (result.signal) {
|
|
133
|
+
process.exit(getSignalExitCode(result.signal));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
process.exit(result.status ?? 1);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
main();
|
package/bin/platform.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
export declare function getPlatformPackage(options: {
|
|
2
|
-
platform: string;
|
|
3
|
-
arch: string;
|
|
4
|
-
libcFamily?: string | null;
|
|
5
|
-
}): string;
|
|
6
|
-
|
|
7
|
-
export declare function getPlatformPackageCandidates(options: {
|
|
8
|
-
platform: string;
|
|
9
|
-
arch: string;
|
|
10
|
-
libcFamily?: string | null;
|
|
11
|
-
preferBaseline?: boolean;
|
|
12
|
-
}): string[];
|
|
13
|
-
|
|
14
|
-
export declare function getBinaryPath(pkg: string, platform: string): string;
|
|
1
|
+
export declare function getPlatformPackage(options: {
|
|
2
|
+
platform: string;
|
|
3
|
+
arch: string;
|
|
4
|
+
libcFamily?: string | null;
|
|
5
|
+
}): string;
|
|
6
|
+
|
|
7
|
+
export declare function getPlatformPackageCandidates(options: {
|
|
8
|
+
platform: string;
|
|
9
|
+
arch: string;
|
|
10
|
+
libcFamily?: string | null;
|
|
11
|
+
preferBaseline?: boolean;
|
|
12
|
+
}): string[];
|
|
13
|
+
|
|
14
|
+
export declare function getBinaryPath(pkg: string, platform: string): string;
|
package/bin/platform.js
CHANGED
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
// bin/platform.js
|
|
2
|
-
// Shared platform detection module - used by wrapper and postinstall
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Get the platform-specific package name
|
|
6
|
-
* @param {{ platform: string, arch: string, libcFamily?: string | null }} options
|
|
7
|
-
* @returns {string} Package name like "oh-my-opencode-darwin-arm64"
|
|
8
|
-
* @throws {Error} If libc cannot be detected on Linux
|
|
9
|
-
*/
|
|
10
|
-
export function getPlatformPackage({ platform, arch, libcFamily }) {
|
|
11
|
-
let suffix = "";
|
|
12
|
-
if (platform === "linux") {
|
|
13
|
-
if (libcFamily === null || libcFamily === undefined) {
|
|
14
|
-
throw new Error(
|
|
15
|
-
"Could not detect libc on Linux. " +
|
|
16
|
-
"Please ensure detect-libc is installed or report this issue."
|
|
17
|
-
);
|
|
18
|
-
}
|
|
19
|
-
if (libcFamily === "musl") {
|
|
20
|
-
suffix = "-musl";
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// Map platform names: win32 -> windows (for package name)
|
|
25
|
-
const os = platform === "win32" ? "windows" : platform;
|
|
26
|
-
return `oh-my-opencode-${os}-${arch}${suffix}`;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** @param {{ platform: string, arch: string, libcFamily?: string | null, preferBaseline?: boolean }} options */
|
|
30
|
-
export function getPlatformPackageCandidates({ platform, arch, libcFamily, preferBaseline = false }) {
|
|
31
|
-
const primaryPackage = getPlatformPackage({ platform, arch, libcFamily });
|
|
32
|
-
const baselinePackage = getBaselinePlatformPackage({ platform, arch, libcFamily });
|
|
33
|
-
|
|
34
|
-
if (!baselinePackage) {
|
|
35
|
-
return [primaryPackage];
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return preferBaseline ? [baselinePackage, primaryPackage] : [primaryPackage, baselinePackage];
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/** @param {{ platform: string, arch: string, libcFamily?: string | null }} options */
|
|
42
|
-
function getBaselinePlatformPackage({ platform, arch, libcFamily }) {
|
|
43
|
-
if (arch !== "x64") {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
if (platform === "darwin") {
|
|
48
|
-
return "oh-my-opencode-darwin-x64-baseline";
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (platform === "win32") {
|
|
52
|
-
return "oh-my-opencode-windows-x64-baseline";
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if (platform === "linux") {
|
|
56
|
-
if (libcFamily === null || libcFamily === undefined) {
|
|
57
|
-
throw new Error(
|
|
58
|
-
"Could not detect libc on Linux. " +
|
|
59
|
-
"Please ensure detect-libc is installed or report this issue."
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if (libcFamily === "musl") {
|
|
64
|
-
return "oh-my-opencode-linux-x64-musl-baseline";
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return "oh-my-opencode-linux-x64-baseline";
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return null;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Get the path to the binary within a platform package
|
|
75
|
-
* @param {string} pkg Package name
|
|
76
|
-
* @param {string} platform Process platform
|
|
77
|
-
* @returns {string} Relative path like "oh-my-opencode-darwin-arm64/bin/oh-my-opencode"
|
|
78
|
-
*/
|
|
79
|
-
export function getBinaryPath(pkg, platform) {
|
|
80
|
-
const ext = platform === "win32" ? ".exe" : "";
|
|
81
|
-
return `${pkg}/bin/oh-my-opencode${ext}`;
|
|
82
|
-
}
|
|
1
|
+
// bin/platform.js
|
|
2
|
+
// Shared platform detection module - used by wrapper and postinstall
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Get the platform-specific package name
|
|
6
|
+
* @param {{ platform: string, arch: string, libcFamily?: string | null }} options
|
|
7
|
+
* @returns {string} Package name like "oh-my-opencode-darwin-arm64"
|
|
8
|
+
* @throws {Error} If libc cannot be detected on Linux
|
|
9
|
+
*/
|
|
10
|
+
export function getPlatformPackage({ platform, arch, libcFamily }) {
|
|
11
|
+
let suffix = "";
|
|
12
|
+
if (platform === "linux") {
|
|
13
|
+
if (libcFamily === null || libcFamily === undefined) {
|
|
14
|
+
throw new Error(
|
|
15
|
+
"Could not detect libc on Linux. " +
|
|
16
|
+
"Please ensure detect-libc is installed or report this issue."
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
if (libcFamily === "musl") {
|
|
20
|
+
suffix = "-musl";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Map platform names: win32 -> windows (for package name)
|
|
25
|
+
const os = platform === "win32" ? "windows" : platform;
|
|
26
|
+
return `oh-my-opencode-${os}-${arch}${suffix}`;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** @param {{ platform: string, arch: string, libcFamily?: string | null, preferBaseline?: boolean }} options */
|
|
30
|
+
export function getPlatformPackageCandidates({ platform, arch, libcFamily, preferBaseline = false }) {
|
|
31
|
+
const primaryPackage = getPlatformPackage({ platform, arch, libcFamily });
|
|
32
|
+
const baselinePackage = getBaselinePlatformPackage({ platform, arch, libcFamily });
|
|
33
|
+
|
|
34
|
+
if (!baselinePackage) {
|
|
35
|
+
return [primaryPackage];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return preferBaseline ? [baselinePackage, primaryPackage] : [primaryPackage, baselinePackage];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** @param {{ platform: string, arch: string, libcFamily?: string | null }} options */
|
|
42
|
+
function getBaselinePlatformPackage({ platform, arch, libcFamily }) {
|
|
43
|
+
if (arch !== "x64") {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (platform === "darwin") {
|
|
48
|
+
return "oh-my-opencode-darwin-x64-baseline";
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (platform === "win32") {
|
|
52
|
+
return "oh-my-opencode-windows-x64-baseline";
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (platform === "linux") {
|
|
56
|
+
if (libcFamily === null || libcFamily === undefined) {
|
|
57
|
+
throw new Error(
|
|
58
|
+
"Could not detect libc on Linux. " +
|
|
59
|
+
"Please ensure detect-libc is installed or report this issue."
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (libcFamily === "musl") {
|
|
64
|
+
return "oh-my-opencode-linux-x64-musl-baseline";
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return "oh-my-opencode-linux-x64-baseline";
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Get the path to the binary within a platform package
|
|
75
|
+
* @param {string} pkg Package name
|
|
76
|
+
* @param {string} platform Process platform
|
|
77
|
+
* @returns {string} Relative path like "oh-my-opencode-darwin-arm64/bin/oh-my-opencode"
|
|
78
|
+
*/
|
|
79
|
+
export function getBinaryPath(pkg, platform) {
|
|
80
|
+
const ext = platform === "win32" ? ".exe" : "";
|
|
81
|
+
return `${pkg}/bin/oh-my-opencode${ext}`;
|
|
82
|
+
}
|