naisys
Version:
NAISYS - Autonomous AI agent runner with built-in context management and cost tracking
110 lines • 4.06 kB
JavaScript
import * as fs from "fs";
import path from "path";
import stringArgv from "string-argv";
import { workspaceCmd } from "../../command/commandDefs.js";
import * as utilities from "../../utils/utilities.js";
export function createWorkspacesFeature(shellWrapper) {
// In-memory storage of tracked file paths (absolute paths)
const _trackedFiles = new Set();
async function handleCommand(args) {
const argv = stringArgv(args);
const subCommand = argv[0]?.toLowerCase();
const filePath = argv[1];
switch (subCommand) {
case "add":
return await _addFile(filePath);
case "remove":
return await _removeFile(filePath);
case "list":
return listFiles();
case "clear":
return _clearFiles();
default: {
const subs = workspaceCmd.subcommands;
return `Usage: ${workspaceCmd.name} <add|remove|list|clear> [filepath]
${subs.add.usage.padEnd(20)}${subs.add.description}
${subs.remove.usage.padEnd(20)}${subs.remove.description}
${subs.list.usage.padEnd(20)}${subs.list.description}
${subs.clear.usage.padEnd(20)}${subs.clear.description}`;
}
}
}
async function _addFile(filePath) {
if (!filePath) {
return "Error: filepath is required for add command";
}
const absolutePath = await _resolveToAbsolutePath(filePath);
if (!fs.existsSync(absolutePath)) {
return `Error: File not found: ${absolutePath}`;
}
if (!fs.statSync(absolutePath).isFile()) {
return `Error: Path is not a file: ${absolutePath}`;
}
if (_trackedFiles.has(absolutePath)) {
return `File already in workspace: ${absolutePath}`;
}
_trackedFiles.add(absolutePath);
return `Added to workspace: ${absolutePath}`;
}
async function _removeFile(filePath) {
if (!filePath) {
return "Error: filepath is required for remove command";
}
const absolutePath = await _resolveToAbsolutePath(filePath);
if (!_trackedFiles.has(absolutePath)) {
return `File not in workspace: ${absolutePath}`;
}
_trackedFiles.delete(absolutePath);
return `Removed from workspace: ${absolutePath}`;
}
function listFiles() {
if (_trackedFiles.size === 0) {
return "Workspace is empty";
}
const files = Array.from(_trackedFiles);
return `Workspace files:\n${files.map((f) => ` ${f}`).join("\n")}`;
}
function _clearFiles() {
const count = _trackedFiles.size;
_trackedFiles.clear();
return `Cleared ${count} file(s) from workspace`;
}
async function _resolveToAbsolutePath(filePath) {
if (path.isAbsolute(filePath)) {
return path.normalize(filePath);
}
const cwd = await shellWrapper.getCurrentPath();
if (!cwd) {
throw new Error("Unable to get current working directory");
}
return path.normalize(path.join(cwd, filePath));
}
function getContext() {
if (_trackedFiles.size === 0) {
return "";
}
let response = `Current Workspaces:`;
for (const filePath of _trackedFiles) {
if (!fs.existsSync(filePath)) {
response += `\n${filePath}: [FILE NOT FOUND]`;
continue;
}
const fileContents = fs.readFileSync(filePath, "utf8");
response += `\n${filePath} (${utilities.getTokenCount(fileContents)} tokens):`;
response += `\n${fileContents}`;
response += `\nEOF\n`;
}
return response;
}
const registrableCommand = {
command: workspaceCmd,
handleCommand,
};
return {
...registrableCommand,
hasFiles: () => _trackedFiles.size > 0,
listFiles,
getContext,
};
}
//# sourceMappingURL=workspaces.js.map