UNPKG

alwaysai

Version:

The alwaysAI command-line interface (CLI)

72 lines 2.81 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = require("path"); const model_id_1 = require("../util/model-id"); const model_config_file_1 = require("../subcommands/model/model-config-file"); const get_random_string_1 = require("../util/get-random-string"); const package_stream_from_cache_1 = require("../model-manager/package-stream-from-cache"); const MODELS_DIR = 'models'; function runBestEffortBackgroundTask(fn, ...args) { (async () => { try { await fn(...args); } catch (ex) { } })(); } function InstallModels(spawner) { return async function installModels(models) { let changed = false; if (models) { await Promise.all(Object.entries(models).map(async ([id, version]) => { changed = changed || (await installModel(id, version)).changed; })); } return { changed }; }; async function installModel(id, version) { let changed = false; const { publisher, name } = model_id_1.ModelId.parse(id); const modelDir = path_1.posix.join(MODELS_DIR, publisher, name); let installedVersion = undefined; try { const output = await spawner.run({ exe: 'cat', args: [spawner.resolvePath(modelDir, model_config_file_1.MODEL_CONFIG_FILE_NAME)], }); const parsed = JSON.parse(output); installedVersion = parsed.version; } catch (_) { // TODO finer-grained error handling } if (installedVersion !== version) { changed = true; const tmpId = get_random_string_1.getRandomString(); const tmpDir = `${modelDir}.${tmpId}.download`; await spawner.mkdirp(tmpDir); try { await spawner.untar(await package_stream_from_cache_1.PackageStreamFromCache({ id, version }), tmpDir); const fileNames = await spawner.readdir(tmpDir); if (fileNames.length !== 1 || !fileNames[0]) { throw new Error('Expected package to contain single directory'); } await spawner.rimraf(modelDir); await spawner.mkdirp(path_1.dirname(modelDir)); await spawner.run({ exe: 'mv', args: [ spawner.resolvePath(tmpDir, fileNames[0]), spawner.resolvePath(modelDir), ], }); } finally { runBestEffortBackgroundTask(spawner.rimraf, tmpDir); } } return { changed }; } } exports.InstallModels = InstallModels; //# sourceMappingURL=install-models.js.map