cui-server
Version:
Web UI Agent Platform based on Claude Code
86 lines • 3.32 kB
JavaScript
import { Router } from 'express';
import { CUIError } from '../types/index.js';
import { createLogger } from '../services/logger.js';
export function createFileSystemRoutes(fileSystemService) {
const router = Router();
const logger = createLogger('FileSystemRoutes');
// Helper to strictly parse boolean query params (accepts "true"/"false" and booleans)
const parseBooleanParam = (value, paramName) => {
if (value === undefined)
return undefined;
if (typeof value === 'boolean')
return value;
if (typeof value === 'string') {
if (value.toLowerCase() === 'true')
return true;
if (value.toLowerCase() === 'false')
return false;
}
throw new CUIError('INVALID_PARAM', `${paramName} must be boolean (true/false)`, 400);
};
// List directory contents
router.get('/list', async (req, res, next) => {
const requestId = req.requestId;
logger.debug('List directory request', {
requestId,
path: req.query.path,
recursive: req.query.recursive,
respectGitignore: req.query.respectGitignore
});
try {
// Validate required parameters
if (!req.query.path) {
throw new CUIError('MISSING_PATH', 'path query parameter is required', 400);
}
// Parse boolean query parameters
const recursive = parseBooleanParam(req.query.recursive, 'recursive') ?? false;
const respectGitignore = parseBooleanParam(req.query.respectGitignore, 'respectGitignore') ?? false;
const result = await fileSystemService.listDirectory(req.query.path, recursive, respectGitignore);
logger.debug('Directory listed successfully', {
requestId,
path: result.path,
entryCount: result.entries.length
});
res.json(result);
}
catch (error) {
logger.debug('List directory failed', {
requestId,
path: req.query.path,
error: error instanceof Error ? error.message : String(error)
});
next(error);
}
});
// Read file contents
router.get('/read', async (req, res, next) => {
const requestId = req.requestId;
logger.debug('Read file request', {
requestId,
path: req.query.path
});
try {
// Validate required parameters
if (!req.query.path) {
throw new CUIError('MISSING_PATH', 'path query parameter is required', 400);
}
const result = await fileSystemService.readFile(req.query.path);
logger.debug('File read successfully', {
requestId,
path: result.path,
size: result.size
});
res.json(result);
}
catch (error) {
logger.debug('Read file failed', {
requestId,
path: req.query.path,
error: error instanceof Error ? error.message : String(error)
});
next(error);
}
});
return router;
}
//# sourceMappingURL=filesystem.routes.js.map