UNPKG

@2501-ai/cli

Version:

[![npm version](https://img.shields.io/npm/v/@2501-ai/cli.svg)](https://www.npmjs.com/package/@2501-ai/cli) [![HumanEval Score](https://img.shields.io/badge/HumanEval-96.95%25-brightgreen.svg)](https://www.2501.ai/research/full-humaneval-benchmark) [![Lic

211 lines (210 loc) 8.49 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.resolveWorkspacePath = resolveWorkspacePath; exports.getWorkspaceConfName = getWorkspaceConfName; exports.clearWorkspaceState = clearWorkspaceState; exports.readWorkspaceState = readWorkspaceState; exports.writeWorkspaceState = writeWorkspaceState; exports.updateWorkspaceState = updateWorkspaceState; exports.getWorkspaceHash = getWorkspaceHash; exports.getWorkspaceChanges = getWorkspaceChanges; exports.getWorkspaceDiff = getWorkspaceDiff; exports.generateWorkspaceZip = generateWorkspaceZip; const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const constants_1 = require("../constants"); const remoteExecutor_1 = require("../remoteExecution/remoteExecutor"); const files_1 = require("../utils/files"); const ignore_1 = require("../utils/ignore"); const logger_1 = __importDefault(require("../utils/logger")); const platform_1 = require("../utils/platform"); const zip_1 = require("../utils/zip"); function resolveWorkspacePath(options) { logger_1.default.debug('Resolving workspace path:', options.workspace); let finalPath = options.workspace || process.cwd(); finalPath = path_1.default.isAbsolute(finalPath) ? finalPath : path_1.default.resolve(process.cwd(), finalPath); logger_1.default.debug('Resolved workspace path:', finalPath); return finalPath; } function getWorkspaceConfName(agentId) { return path_1.default.join(constants_1.CONFIG_DIR, `workspace_state_${agentId}.conf`); } function clearWorkspaceState(agentId) { const filePath = getWorkspaceConfName(agentId); if (fs_1.default.existsSync(filePath)) { logger_1.default.debug('Clearing workspace state:', filePath); fs_1.default.unlinkSync(filePath); } } function readWorkspaceState(workspace, agentId) { try { const filePath = getWorkspaceConfName(agentId); if (!fs_1.default.existsSync(filePath)) { fs_1.default.mkdirSync(path_1.default.dirname(filePath), { recursive: true, }); fs_1.default.writeFileSync(filePath, JSON.stringify({ file_hashes: new Map(), state_hash: '', path: workspace, agent_id: agentId, }, null, 2), 'utf8'); } const data = fs_1.default.readFileSync(filePath, 'utf8'); const state = JSON.parse(data); state.file_hashes = new Map(Object.entries(state.file_hashes)); return state; } catch (error) { logger_1.default.error('Error reading workspace state:', error); throw error; } } function writeWorkspaceState(state) { try { const filePath = getWorkspaceConfName(state.agent_id); const entries = Object.fromEntries(state.file_hashes); const data = JSON.stringify(Object.assign(Object.assign({}, state), { file_hashes: entries }), null, 2); fs_1.default.writeFileSync(filePath, data, 'utf8'); } catch (error) { logger_1.default.error('Error writing workspace state:', error); throw error; } } function updateWorkspaceState(workspace, agentId) { return __awaiter(this, void 0, void 0, function* () { logger_1.default.debug('Syncing workspace state:', workspace); const currentState = readWorkspaceState(workspace, agentId); const { md5, fileHashes } = (0, files_1.getDirectoryMd5Hash)({ directoryPath: workspace, }); const hasChanged = currentState.state_hash !== md5; currentState.state_hash = md5; currentState.file_hashes = fileHashes; writeWorkspaceState(currentState); return hasChanged; }); } function getWorkspaceHash(workspace, agentId) { return __awaiter(this, void 0, void 0, function* () { const executor = remoteExecutor_1.RemoteExecutor.instance; if (executor.isEnabled()) { return { hash: { md5: '', fileHashes: new Map(), directoryPath: workspace, totalSize: 0, }, diff: { added: [], removed: [], modified: [], hasChanges: false, isEmpty: true, }, }; } const currentState = (0, files_1.getDirectoryMd5Hash)({ directoryPath: workspace, }); const oldState = readWorkspaceState(workspace, agentId); const diff = getWorkspaceDiff(oldState, { state_hash: currentState.md5, file_hashes: currentState.fileHashes, path: workspace, agent_id: agentId, }); return { hash: currentState, diff, }; }); } function getWorkspaceChanges(workspace, agentId) { return __awaiter(this, void 0, void 0, function* () { const { diff } = yield getWorkspaceHash(workspace, agentId); return diff; }); } function getWorkspaceDiff(oldState, newState) { const added = []; const removed = []; const modified = []; newState.file_hashes.forEach((newHash, filePath) => { if (!oldState.file_hashes.has(filePath)) { added.push(filePath); } else if (oldState.file_hashes.get(filePath) !== newHash) { modified.push(filePath); } }); oldState.file_hashes.forEach((_, filePath) => { if (!newState.file_hashes.has(filePath)) { removed.push(filePath); } }); const hasChanges = added.length > 0 || removed.length > 0 || modified.length > 0; return { added, removed, modified, hasChanges, isEmpty: !newState.file_hashes.size, }; } function generateWorkspaceZip(workspace, workspaceFiles) { return __awaiter(this, void 0, void 0, function* () { const fileId = Math.floor(Math.random() * 100000); const outputFilePath = path_1.default.join((0, platform_1.getTempPath2501)('_files'), `workspace_${fileId}.zip`); const dir = path_1.default.dirname(outputFilePath); if (!fs_1.default.existsSync(dir)) { fs_1.default.mkdirSync(dir, { recursive: true }); } const files = workspaceFiles || (0, files_1.getDirectoryFiles)({ currentPath: '', currentDepth: 0, maxDepth: constants_1.DEFAULT_MAX_DEPTH, maxDirSize: constants_1.DEFAULT_MAX_DIR_SIZE, directoryPath: workspace, currentTotalSize: 0, ignoreManager: ignore_1.IgnoreManager.getInstance(), }); if (files.fileHashes.size === 0) { return []; } logger_1.default.debug('Total workspace size: ' + (0, files_1.toReadableSize)(files.totalSize)); logger_1.default.debug('Files in workspace: ' + files.fileHashes.size); const zipFiles = Array.from(files.fileHashes.keys()).map((relativePath) => ({ path: path_1.default.join(workspace, relativePath), relativePath, size: fs_1.default.statSync(path_1.default.join(workspace, relativePath)).size, })); yield zip_1.zipUtility.createZip(zipFiles, { outputPath: outputFilePath, maxTotalSize: constants_1.DEFAULT_MAX_DIR_SIZE, }); return [ { path: outputFilePath, data: fs_1.default.readFileSync(outputFilePath), }, ]; }); }