@2501-ai/cli
Version:
[](https://www.npmjs.com/package/@2501-ai/cli) [](https://www.2501.ai/research/full-humaneval-benchmark) [); } 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),
},
];
});
}