blob: 8ca6a4c25398104a3b638de4cc4a2c04231c8d51 [file]
import { createHash } from 'node:crypto';
import {
prepareNodeCliToolchain,
validatePreparedNodeCliToolchain,
type PinnedNodeCliToolchainDefinition,
} from './node-cli-toolchain.js';
export const OPENCODE_TOOLCHAIN_CONTAINER_PATH = '/opt/maka-opencode-toolchain';
export const OPENCODE_TOOLCHAIN_SPEC = {
schemaVersion: 1,
platform: 'linux',
arch: 'x64',
node: {
version: '22.23.1',
archiveUrl: 'https://nodejs.org/dist/v22.23.1/node-v22.23.1-linux-x64.tar.gz',
archiveSha256: '7a8cb04b4a1df4eaf432125324b81b29a088e73570a23259a8de1c65d07fc129',
binarySha256: '93956de2e59480474a7b46571da1651180b1a050cdf32641ebec4ce6e478e068',
},
opencode: {
version: '1.17.18',
archiveUrl: 'https://registry.npmjs.org/opencode-linux-x64/-/opencode-linux-x64-1.17.18.tgz',
archiveIntegrity:
'sha512-8BmT22yp7pCXXu/HvAMaJsNNd6xhmlUrGs5YZSfU0neZfkSZg+Dkf9IGsuOugOtL0x2erDg2/6rRBpcJAGmTrA==',
binarySha256: '0cbfb6de55aa4ce3c74da12d8516376033693a88abca6238c5be32bf98130636',
},
} as const;
export const OPENCODE_TOOLCHAIN_FINGERPRINT = `sha256:${createHash('sha256')
.update(JSON.stringify(OPENCODE_TOOLCHAIN_SPEC))
.digest('hex')}`;
export interface PreparedOpenCodeToolchain {
path: string;
fingerprint: typeof OPENCODE_TOOLCHAIN_FINGERPRINT;
}
const DEFINITION: PinnedNodeCliToolchainDefinition<typeof OPENCODE_TOOLCHAIN_SPEC> = {
label: 'OpenCode',
fingerprint: OPENCODE_TOOLCHAIN_FINGERPRINT,
spec: OPENCODE_TOOLCHAIN_SPEC,
node: OPENCODE_TOOLCHAIN_SPEC.node,
packageArchive: {
url: OPENCODE_TOOLCHAIN_SPEC.opencode.archiveUrl,
integrity: OPENCODE_TOOLCHAIN_SPEC.opencode.archiveIntegrity,
},
packageFiles: [
{
archivePath: 'package/bin/opencode',
installedPath: 'bin/opencode',
sha256: OPENCODE_TOOLCHAIN_SPEC.opencode.binarySha256,
executable: true,
},
],
};
export async function validatePreparedOpenCodeToolchain(
path: string,
): Promise<PreparedOpenCodeToolchain> {
await validatePreparedNodeCliToolchain(path, DEFINITION);
return { path, fingerprint: OPENCODE_TOOLCHAIN_FINGERPRINT };
}
export async function prepareOpenCodeToolchain(
path: string,
options: { fetchFn?: typeof fetch } = {},
): Promise<PreparedOpenCodeToolchain> {
await prepareNodeCliToolchain(path, DEFINITION, options);
return { path, fingerprint: OPENCODE_TOOLCHAIN_FINGERPRINT };
}