41 lines
3.2 KiB
JavaScript
41 lines
3.2 KiB
JavaScript
import { createHash } from 'node:crypto';
|
|
import { mkdirSync, writeFileSync, readFileSync } from 'node:fs';
|
|
import { execFileSync } from 'node:child_process';
|
|
import { createRequire } from 'node:module';
|
|
const root = '/usr/local/lib/dsh-mgr';
|
|
const packages = [
|
|
['dsh-free-search', '0.9.15', 'https://registry.npmjs.org/dsh-free-search/-/dsh-free-search-0.9.15.tgz', 'T6YxSR4NOK3c7ivdqDxrOdgdORGYBFmGbM7oZNpFUVZg2KIbU0f4TSOO99wjG0NnSrwqjdc1i/yK8pviZHtVhA=='],
|
|
['@deepseek-ai/schemastery', '3.18.4', 'https://registry.npmjs.org/@deepseek-ai/schemastery/-/schemastery-3.18.4.tgz', 'SSXO6tYuyrIqKVbmOnIq0s+riUywYzouFMcnBluHF9n4KMo2G8HvEzhCYj6pj2617/glOjbJuVInJ9hfONsjkg=='],
|
|
['@deepseek-ai/cosmokit', '1.8.5', 'https://registry.npmjs.org/@deepseek-ai/cosmokit/-/cosmokit-1.8.5.tgz', 'LXsrlem9z8dq4sLflj2yuCuYX7KqhdzF5hZly3eZyuTo8d6oDSOXuEgC5DbQWKW+lksm6zmOutQLsP/ma6wR6A=='],
|
|
['@standard-schema/spec', '1.1.0', 'https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz', 'l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=='],
|
|
];
|
|
for (const [name, version, url, integrity] of packages) {
|
|
const response = await fetch(url, { signal: AbortSignal.timeout(120000) });
|
|
if (!response.ok) throw new Error('download failed: ' + name);
|
|
const data = Buffer.from(await response.arrayBuffer());
|
|
if (createHash('sha512').update(data).digest('base64') !== integrity) throw new Error('integrity mismatch: ' + name);
|
|
const archive = `${root}/${name.split('/').pop()}-${version}.tgz`;
|
|
writeFileSync(archive, data, { mode: 0o644 });
|
|
}
|
|
const hostManifest = '/usr/local/lib/node_modules/@deepseek-ai/dsh/package.json';
|
|
const destination = '/usr/local/lib/node_modules/@deepseek-ai/dsh/node_modules/dsh-free-search';
|
|
mkdirSync(destination, { recursive: true });
|
|
execFileSync('tar', ['-xzf', `${root}/dsh-free-search-0.9.15.tgz`, '--strip-components=1', '--no-same-owner', '-C', destination]);
|
|
execFileSync('chmod', ['-R', 'a+rX', destination]);
|
|
const pkg = JSON.parse(readFileSync(destination + '/package.json'));
|
|
if (pkg.name !== 'dsh-free-search' || pkg.version !== '0.9.15' || JSON.stringify(pkg.dependencies) !== JSON.stringify({ '@deepseek-ai/schemastery': '^3.18.4' })) throw new Error('unexpected free-search metadata');
|
|
const require = createRequire(hostManifest);
|
|
const semver = createRequire('/usr/local/lib/node_modules/npm/package.json')('semver');
|
|
for (const [name, range] of Object.entries({ ...pkg.peerDependencies, ...pkg.dependencies })) {
|
|
if (name === 'react') {
|
|
if (require('./package.json').version !== '0.2.1-rc.3') throw new Error('unverified browser React host');
|
|
continue;
|
|
}
|
|
const peer = require(name + '/package.json');
|
|
if (!(semver.satisfies(peer.version, range) || (peer.version === "0.2.1-rc.3" && name.startsWith("@deepseek-ai/dsh-") && semver.satisfies(peer.version, range, { includePrerelease: true })))) throw new Error('incompatible free-search host dependency: ' + name);
|
|
}
|
|
const host = JSON.parse(readFileSync(hostManifest));
|
|
host.dependencies = { ...host.dependencies, 'dsh-free-search': '0.9.15' };
|
|
writeFileSync(hostManifest, JSON.stringify(host, null, 2));
|
|
console.log('Installed [email protected] and pinned offline dependency archives (SHA-512 verified; no lifecycle scripts)');
|