UNPKG

naisys

Version:

NAISYS - Autonomous AI agent runner with built-in context management and cost tracking

110 lines 4.06 kB
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