From f24b3c5b53c623c91277fa40394b5b4e60d4727a Mon Sep 17 00:00:00 2001 From: balin-ar Date: Thu, 5 Feb 2026 14:39:40 +0000 Subject: [PATCH 1/3] feat: add file explorer with built-in text editor - File Explorer screen with sidebar navigation, breadcrumb, toolbar - Browse, upload, download, rename, delete files and folders - Built-in text editor for 30+ file types (yaml, json, md, py, js, etc.) - Direct filesystem access via Node.js fs (no FileBrowser dependency) - Path jailing with symlink escape protection (FILES_ROOT env var) - Right-click context menu (Open, Edit, Download, Rename, Delete) - Double-click to open folders or edit text files - Ctrl+S to save, Esc to close editor - Link to file explorer from chat sidebar - Updated README with file explorer docs and .env configuration --- .env.example | 4 + README.md | 70 ++++- apps/webclaw/src/lib/file-types.ts | 27 ++ apps/webclaw/src/routeTree.gen.ts | 168 ++++++++++ apps/webclaw/src/routes/api/files/delete.ts | 86 +++++ apps/webclaw/src/routes/api/files/download.ts | 159 ++++++++++ apps/webclaw/src/routes/api/files/info.ts | 67 ++++ apps/webclaw/src/routes/api/files/list.ts | 57 ++++ apps/webclaw/src/routes/api/files/mkdir.ts | 115 +++++++ apps/webclaw/src/routes/api/files/read.ts | 81 +++++ apps/webclaw/src/routes/api/files/rename.ts | 141 +++++++++ apps/webclaw/src/routes/api/files/save.ts | 69 ++++ apps/webclaw/src/routes/api/files/upload.ts | 141 +++++++++ apps/webclaw/src/routes/files.tsx | 10 + .../screens/chat/components/chat-sidebar.tsx | 43 ++- apps/webclaw/src/server/filesystem.ts | 294 ++++++++++++++++++ apps/webclaw/src/server/path-utils.ts | 125 ++++++++ 17 files changed, 1646 insertions(+), 11 deletions(-) create mode 100644 apps/webclaw/src/lib/file-types.ts create mode 100644 apps/webclaw/src/routes/api/files/delete.ts create mode 100644 apps/webclaw/src/routes/api/files/download.ts create mode 100644 apps/webclaw/src/routes/api/files/info.ts create mode 100644 apps/webclaw/src/routes/api/files/list.ts create mode 100644 apps/webclaw/src/routes/api/files/mkdir.ts create mode 100644 apps/webclaw/src/routes/api/files/read.ts create mode 100644 apps/webclaw/src/routes/api/files/rename.ts create mode 100644 apps/webclaw/src/routes/api/files/save.ts create mode 100644 apps/webclaw/src/routes/api/files/upload.ts create mode 100644 apps/webclaw/src/routes/files.tsx create mode 100644 apps/webclaw/src/server/filesystem.ts create mode 100644 apps/webclaw/src/server/path-utils.ts diff --git a/.env.example b/.env.example index 48dadc9..bd61d84 100644 --- a/.env.example +++ b/.env.example @@ -8,3 +8,7 @@ CLAWDBOT_GATEWAY_URL=ws://127.0.0.1:18789 CLAWDBOT_GATEWAY_TOKEN= # Alternative: # CLAWDBOT_GATEWAY_PASSWORD= + +# File Explorer - root directory for file browsing +# Defaults to the user's home directory if not set. +FILES_ROOT=/home/agustin diff --git a/README.md b/README.md index 67350ba..a076c09 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,71 @@ # WebClaw -![Cover](https://raw.githubusercontent.com/ibelick/webclaw/main/apps/webclaw/public/cover.jpg) +![Cover](./public/cover.webp) -Fast web client for OpenClaw. - -[webclaw.dev](https://webclaw.dev) +Fast web client for OpenClaw Currently in beta. +## Features + +- πŸ’¬ **Chat** β€” Real-time chat with your OpenClaw agent +- πŸ“ **File Explorer** β€” Browse, upload, download, rename and delete files on the host filesystem +- ✏️ **Text Editor** β€” Edit YAML, JSON, Markdown, Python, JavaScript, and 30+ file types directly in the browser (Ctrl+S to save) + ## Setup -Create `apps/webclaw/.env.local` with `CLAWDBOT_GATEWAY_URL` and either -`CLAWDBOT_GATEWAY_TOKEN` (recommended) or `CLAWDBOT_GATEWAY_PASSWORD`. These map -to your OpenClaw Gateway auth (`gateway.auth.token` or `gateway.auth.password`). -Default URL is `ws://127.0.0.1:18789`. Docs: https://docs.openclaw.ai/gateway +### 1. Install dependencies ```bash -pnpm install -pnpm dev +npm install +``` + +### 2. Configure environment + +Create a `.env` file in the project root: + +```env +# Gateway connection (required) +CLAWDBOT_GATEWAY_URL=ws://127.0.0.1:18789 +CLAWDBOT_GATEWAY_TOKEN=your_gateway_token_here +# Or use password auth: +# CLAWDBOT_GATEWAY_PASSWORD=your_password_here + +# File Explorer β€” root directory for browsing (optional) +# Defaults to the current user's home directory if not set. +FILES_ROOT=/home/your_user ``` + +| Variable | Required | Description | +|---|---|---| +| `CLAWDBOT_GATEWAY_URL` | No | WebSocket URL for the OpenClaw Gateway. Default: `ws://127.0.0.1:18789` | +| `CLAWDBOT_GATEWAY_TOKEN` | Yes* | Gateway auth token (`gateway.auth.token` in OpenClaw config) | +| `CLAWDBOT_GATEWAY_PASSWORD` | Yes* | Alternative: Gateway password (`gateway.auth.password`) | +| `FILES_ROOT` | No | Absolute path to the root directory for the file explorer. Default: `$HOME` | + +\* One of `CLAWDBOT_GATEWAY_TOKEN` or `CLAWDBOT_GATEWAY_PASSWORD` is required. + +### 3. Run + +```bash +npm run dev +``` + +The app will be available at `http://localhost:3000`. Use `--host` to expose on the network: + +```bash +npm run dev -- --host +``` + +## File Explorer + +The file explorer reads and writes directly to the host filesystem under the `FILES_ROOT` directory. Key points: + +- **Security**: All paths are jailed to `FILES_ROOT` β€” directory traversal and symlink escapes are blocked. +- **Hidden files**: Visible by default (dotfiles are shown). +- **Text editing**: Double-click any supported text file to open the built-in editor. Supported extensions include `.yaml`, `.yml`, `.json`, `.md`, `.txt`, `.py`, `.js`, `.ts`, `.sh`, `.html`, `.css`, and many more. +- **Context menu**: Right-click any file or folder for actions (Open, Edit, Download, Rename, Delete). + +## Docs + +Gateway auth docs: https://docs.openclaw.ai/gateway diff --git a/apps/webclaw/src/lib/file-types.ts b/apps/webclaw/src/lib/file-types.ts new file mode 100644 index 0000000..46020c8 --- /dev/null +++ b/apps/webclaw/src/lib/file-types.ts @@ -0,0 +1,27 @@ +export type FileItem = { + path: string + name: string + size: number + extension: string + modified: string + mode: number + isDir: boolean + isSymlink: boolean + type: string // 'directory' | 'text' | 'image' | 'video' | 'audio' | 'blob' +} + +export type FileListing = { + items: FileItem[] + path: string + name: string + isDir: boolean + size: number + modified: string + mode: number + numDirs: number + numFiles: number + sorting: { + by: string + asc: boolean + } +} diff --git a/apps/webclaw/src/routeTree.gen.ts b/apps/webclaw/src/routeTree.gen.ts index 97661c6..0553190 100644 --- a/apps/webclaw/src/routeTree.gen.ts +++ b/apps/webclaw/src/routeTree.gen.ts @@ -10,6 +10,7 @@ import { Route as rootRouteImport } from './routes/__root' import { Route as NewRouteImport } from './routes/new' +import { Route as FilesRouteImport } from './routes/files' import { Route as ConnectRouteImport } from './routes/connect' import { Route as IndexRouteImport } from './routes/index' import { Route as ChatSessionKeyRouteImport } from './routes/chat/$sessionKey' @@ -18,12 +19,24 @@ import { Route as ApiSendRouteImport } from './routes/api/send' import { Route as ApiPingRouteImport } from './routes/api/ping' import { Route as ApiPathsRouteImport } from './routes/api/paths' import { Route as ApiHistoryRouteImport } from './routes/api/history' +import { Route as ApiFilesListRouteImport } from './routes/api/files/list' +import { Route as ApiFilesInfoRouteImport } from './routes/api/files/info' +import { Route as ApiFilesDownloadRouteImport } from './routes/api/files/download' +import { Route as ApiFilesUploadRouteImport } from './routes/api/files/upload' +import { Route as ApiFilesDeleteRouteImport } from './routes/api/files/delete' +import { Route as ApiFilesMkdirRouteImport } from './routes/api/files/mkdir' +import { Route as ApiFilesRenameRouteImport } from './routes/api/files/rename' const NewRoute = NewRouteImport.update({ id: '/new', path: '/new', getParentRoute: () => rootRouteImport, } as any) +const FilesRoute = FilesRouteImport.update({ + id: '/files', + path: '/files', + getParentRoute: () => rootRouteImport, +} as any) const ConnectRoute = ConnectRouteImport.update({ id: '/connect', path: '/connect', @@ -64,10 +77,46 @@ const ApiHistoryRoute = ApiHistoryRouteImport.update({ path: '/api/history', getParentRoute: () => rootRouteImport, } as any) +const ApiFilesListRoute = ApiFilesListRouteImport.update({ + id: '/api/files/list', + path: '/api/files/list', + getParentRoute: () => rootRouteImport, +} as any) +const ApiFilesInfoRoute = ApiFilesInfoRouteImport.update({ + id: '/api/files/info', + path: '/api/files/info', + getParentRoute: () => rootRouteImport, +} as any) +const ApiFilesDownloadRoute = ApiFilesDownloadRouteImport.update({ + id: '/api/files/download', + path: '/api/files/download', + getParentRoute: () => rootRouteImport, +} as any) +const ApiFilesUploadRoute = ApiFilesUploadRouteImport.update({ + id: '/api/files/upload', + path: '/api/files/upload', + getParentRoute: () => rootRouteImport, +} as any) +const ApiFilesDeleteRoute = ApiFilesDeleteRouteImport.update({ + id: '/api/files/delete', + path: '/api/files/delete', + getParentRoute: () => rootRouteImport, +} as any) +const ApiFilesMkdirRoute = ApiFilesMkdirRouteImport.update({ + id: '/api/files/mkdir', + path: '/api/files/mkdir', + getParentRoute: () => rootRouteImport, +} as any) +const ApiFilesRenameRoute = ApiFilesRenameRouteImport.update({ + id: '/api/files/rename', + path: '/api/files/rename', + getParentRoute: () => rootRouteImport, +} as any) export interface FileRoutesByFullPath { '/': typeof IndexRoute '/connect': typeof ConnectRoute + '/files': typeof FilesRoute '/new': typeof NewRoute '/api/history': typeof ApiHistoryRoute '/api/paths': typeof ApiPathsRoute @@ -75,10 +124,18 @@ export interface FileRoutesByFullPath { '/api/send': typeof ApiSendRoute '/api/sessions': typeof ApiSessionsRoute '/chat/$sessionKey': typeof ChatSessionKeyRoute + '/api/files/list': typeof ApiFilesListRoute + '/api/files/info': typeof ApiFilesInfoRoute + '/api/files/download': typeof ApiFilesDownloadRoute + '/api/files/upload': typeof ApiFilesUploadRoute + '/api/files/delete': typeof ApiFilesDeleteRoute + '/api/files/mkdir': typeof ApiFilesMkdirRoute + '/api/files/rename': typeof ApiFilesRenameRoute } export interface FileRoutesByTo { '/': typeof IndexRoute '/connect': typeof ConnectRoute + '/files': typeof FilesRoute '/new': typeof NewRoute '/api/history': typeof ApiHistoryRoute '/api/paths': typeof ApiPathsRoute @@ -86,11 +143,19 @@ export interface FileRoutesByTo { '/api/send': typeof ApiSendRoute '/api/sessions': typeof ApiSessionsRoute '/chat/$sessionKey': typeof ChatSessionKeyRoute + '/api/files/list': typeof ApiFilesListRoute + '/api/files/info': typeof ApiFilesInfoRoute + '/api/files/download': typeof ApiFilesDownloadRoute + '/api/files/upload': typeof ApiFilesUploadRoute + '/api/files/delete': typeof ApiFilesDeleteRoute + '/api/files/mkdir': typeof ApiFilesMkdirRoute + '/api/files/rename': typeof ApiFilesRenameRoute } export interface FileRoutesById { __root__: typeof rootRouteImport '/': typeof IndexRoute '/connect': typeof ConnectRoute + '/files': typeof FilesRoute '/new': typeof NewRoute '/api/history': typeof ApiHistoryRoute '/api/paths': typeof ApiPathsRoute @@ -98,12 +163,20 @@ export interface FileRoutesById { '/api/send': typeof ApiSendRoute '/api/sessions': typeof ApiSessionsRoute '/chat/$sessionKey': typeof ChatSessionKeyRoute + '/api/files/list': typeof ApiFilesListRoute + '/api/files/info': typeof ApiFilesInfoRoute + '/api/files/download': typeof ApiFilesDownloadRoute + '/api/files/upload': typeof ApiFilesUploadRoute + '/api/files/delete': typeof ApiFilesDeleteRoute + '/api/files/mkdir': typeof ApiFilesMkdirRoute + '/api/files/rename': typeof ApiFilesRenameRoute } export interface FileRouteTypes { fileRoutesByFullPath: FileRoutesByFullPath fullPaths: | '/' | '/connect' + | '/files' | '/new' | '/api/history' | '/api/paths' @@ -111,10 +184,18 @@ export interface FileRouteTypes { | '/api/send' | '/api/sessions' | '/chat/$sessionKey' + | '/api/files/list' + | '/api/files/info' + | '/api/files/download' + | '/api/files/upload' + | '/api/files/delete' + | '/api/files/mkdir' + | '/api/files/rename' fileRoutesByTo: FileRoutesByTo to: | '/' | '/connect' + | '/files' | '/new' | '/api/history' | '/api/paths' @@ -122,10 +203,18 @@ export interface FileRouteTypes { | '/api/send' | '/api/sessions' | '/chat/$sessionKey' + | '/api/files/list' + | '/api/files/info' + | '/api/files/download' + | '/api/files/upload' + | '/api/files/delete' + | '/api/files/mkdir' + | '/api/files/rename' id: | '__root__' | '/' | '/connect' + | '/files' | '/new' | '/api/history' | '/api/paths' @@ -133,11 +222,19 @@ export interface FileRouteTypes { | '/api/send' | '/api/sessions' | '/chat/$sessionKey' + | '/api/files/list' + | '/api/files/info' + | '/api/files/download' + | '/api/files/upload' + | '/api/files/delete' + | '/api/files/mkdir' + | '/api/files/rename' fileRoutesById: FileRoutesById } export interface RootRouteChildren { IndexRoute: typeof IndexRoute ConnectRoute: typeof ConnectRoute + FilesRoute: typeof FilesRoute NewRoute: typeof NewRoute ApiHistoryRoute: typeof ApiHistoryRoute ApiPathsRoute: typeof ApiPathsRoute @@ -145,6 +242,13 @@ export interface RootRouteChildren { ApiSendRoute: typeof ApiSendRoute ApiSessionsRoute: typeof ApiSessionsRoute ChatSessionKeyRoute: typeof ChatSessionKeyRoute + ApiFilesListRoute: typeof ApiFilesListRoute + ApiFilesInfoRoute: typeof ApiFilesInfoRoute + ApiFilesDownloadRoute: typeof ApiFilesDownloadRoute + ApiFilesUploadRoute: typeof ApiFilesUploadRoute + ApiFilesDeleteRoute: typeof ApiFilesDeleteRoute + ApiFilesMkdirRoute: typeof ApiFilesMkdirRoute + ApiFilesRenameRoute: typeof ApiFilesRenameRoute } declare module '@tanstack/react-router' { @@ -156,6 +260,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof NewRouteImport parentRoute: typeof rootRouteImport } + '/files': { + id: '/files' + path: '/files' + fullPath: '/files' + preLoaderRoute: typeof FilesRouteImport + parentRoute: typeof rootRouteImport + } '/connect': { id: '/connect' path: '/connect' @@ -212,12 +323,62 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof ApiHistoryRouteImport parentRoute: typeof rootRouteImport } + '/api/files/list': { + id: '/api/files/list' + path: '/api/files/list' + fullPath: '/api/files/list' + preLoaderRoute: typeof ApiFilesListRouteImport + parentRoute: typeof rootRouteImport + } + '/api/files/info': { + id: '/api/files/info' + path: '/api/files/info' + fullPath: '/api/files/info' + preLoaderRoute: typeof ApiFilesInfoRouteImport + parentRoute: typeof rootRouteImport + } + '/api/files/download': { + id: '/api/files/download' + path: '/api/files/download' + fullPath: '/api/files/download' + preLoaderRoute: typeof ApiFilesDownloadRouteImport + parentRoute: typeof rootRouteImport + } + '/api/files/upload': { + id: '/api/files/upload' + path: '/api/files/upload' + fullPath: '/api/files/upload' + preLoaderRoute: typeof ApiFilesUploadRouteImport + parentRoute: typeof rootRouteImport + } + '/api/files/delete': { + id: '/api/files/delete' + path: '/api/files/delete' + fullPath: '/api/files/delete' + preLoaderRoute: typeof ApiFilesDeleteRouteImport + parentRoute: typeof rootRouteImport + } + '/api/files/mkdir': { + id: '/api/files/mkdir' + path: '/api/files/mkdir' + fullPath: '/api/files/mkdir' + preLoaderRoute: typeof ApiFilesMkdirRouteImport + parentRoute: typeof rootRouteImport + } + '/api/files/rename': { + id: '/api/files/rename' + path: '/api/files/rename' + fullPath: '/api/files/rename' + preLoaderRoute: typeof ApiFilesRenameRouteImport + parentRoute: typeof rootRouteImport + } } } const rootRouteChildren: RootRouteChildren = { IndexRoute: IndexRoute, ConnectRoute: ConnectRoute, + FilesRoute: FilesRoute, NewRoute: NewRoute, ApiHistoryRoute: ApiHistoryRoute, ApiPathsRoute: ApiPathsRoute, @@ -225,6 +386,13 @@ const rootRouteChildren: RootRouteChildren = { ApiSendRoute: ApiSendRoute, ApiSessionsRoute: ApiSessionsRoute, ChatSessionKeyRoute: ChatSessionKeyRoute, + ApiFilesListRoute: ApiFilesListRoute, + ApiFilesInfoRoute: ApiFilesInfoRoute, + ApiFilesDownloadRoute: ApiFilesDownloadRoute, + ApiFilesUploadRoute: ApiFilesUploadRoute, + ApiFilesDeleteRoute: ApiFilesDeleteRoute, + ApiFilesMkdirRoute: ApiFilesMkdirRoute, + ApiFilesRenameRoute: ApiFilesRenameRoute, } export const routeTree = rootRouteImport ._addFileChildren(rootRouteChildren) diff --git a/apps/webclaw/src/routes/api/files/delete.ts b/apps/webclaw/src/routes/api/files/delete.ts new file mode 100644 index 0000000..6e75826 --- /dev/null +++ b/apps/webclaw/src/routes/api/files/delete.ts @@ -0,0 +1,86 @@ +import { createFileRoute } from '@tanstack/react-router' +import { json } from '@tanstack/react-start' +import { deleteFile } from '../../../server/filesystem' +import { validatePath } from '../../../server/path-utils' +import type { FileSystemError } from '../../../server/filesystem' + +type DeleteResponse = { + ok: true + message: string + path: string +} + +type ErrorResponse = { + error: string + code: string +} + +export const Route = createFileRoute('/api/files/delete')({ + server: { + handlers: { + DELETE: async ({ request }) => { + try { + const url = new URL(request.url) + const rawPath = url.searchParams.get('path') + + if (!rawPath) { + return json( + { + error: 'path parameter is required', + code: 'MISSING_PATH', + }, + { status: 400 } + ) + } + + // Validate and sanitize the path + const path = validatePath(rawPath, 'Path parameter') + + // Prevent deleting root path + if (path === '/' || path === '') { + return json( + { + error: 'Cannot delete the root directory', + code: 'FORBIDDEN_DELETE_ROOT', + }, + { status: 403 } // Forbidden + ) + } + + await deleteFile(path) + + return json({ + ok: true, + message: 'File deleted successfully', + path, + }) + } catch (err) { + const error = err as Error & FileSystemError + + if (error.message.includes('invalid characters') || + error.message.includes('traversal attempts') || + error.message.includes('Cannot delete')) { + return json( + { + error: error.message, + code: 'VALIDATION_ERROR', + }, + { status: 400 }, + ) + } + + const status = error.status || 500 + const code = error.code || 'INTERNAL_ERROR' + + return json( + { + error: error.message || 'An unexpected error occurred', + code, + }, + { status }, + ) + } + }, + }, + }, +}) \ No newline at end of file diff --git a/apps/webclaw/src/routes/api/files/download.ts b/apps/webclaw/src/routes/api/files/download.ts new file mode 100644 index 0000000..7a47b55 --- /dev/null +++ b/apps/webclaw/src/routes/api/files/download.ts @@ -0,0 +1,159 @@ +import { createFileRoute } from '@tanstack/react-router' +import { downloadFile, getFileInfo } from '../../../server/filesystem' +import { validatePath } from '../../../server/path-utils' +import type { FileSystemError } from '../../../server/filesystem' + +type ErrorResponse = { + error: string + code: string +} + +// Expanded MIME type map +function getContentType(filename: string): string { + const ext = filename.split('.').pop()?.toLowerCase() || '' + const mimeTypes: Record = { + // Text files + 'txt': 'text/plain', + 'md': 'text/markdown', + 'html': 'text/html', + 'css': 'text/css', + 'js': 'text/javascript', + 'json': 'application/json', + 'xml': 'application/xml', + 'csv': 'text/csv', + 'yaml': 'application/x-yaml', + 'yml': 'application/x-yaml', + + // Programming languages + 'ts': 'application/typescript', + 'tsx': 'application/typescript', + 'py': 'text/x-python', + + // Images + 'png': 'image/png', + 'jpg': 'image/jpeg', + 'jpeg': 'image/jpeg', + 'gif': 'image/gif', + 'webp': 'image/webp', + 'svg': 'image/svg+xml', + + // Audio/Video + 'mp3': 'audio/mpeg', + 'mp4': 'video/mp4', + + // Documents + 'pdf': 'application/pdf', + 'doc': 'application/msword', + 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'xls': 'application/vnd.ms-excel', + 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'ppt': 'application/vnd.ms-powerpoint', + 'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + + // Archives + 'zip': 'application/zip', + 'tar.gz': 'application/gzip', + 'gz': 'application/gzip', + + // Fonts + 'woff': 'font/woff', + 'woff2': 'font/woff2', + 'ttf': 'font/ttf', + 'otf': 'font/otf', + } + + return mimeTypes[ext] || 'application/octet-stream' +} + +function encodeFilename(filename: string): string { + // RFC 6266 compliant UTF-8 filename encoding + const encodedFilename = encodeURIComponent(filename) + return `filename*=UTF-8''${encodedFilename}` +} + +function isStaticAsset(filename: string): boolean { + const ext = filename.split('.').pop()?.toLowerCase() || '' + const staticExts = ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'css', 'js', 'woff', 'woff2', 'ttf', 'otf'] + return staticExts.includes(ext) +} + +export const Route = createFileRoute('/api/files/download')({ + server: { + handlers: { + GET: async ({ request }) => { + try { + const url = new URL(request.url) + const rawPath = url.searchParams.get('path') + + if (!rawPath) { + return new Response( + JSON.stringify({ + error: 'path parameter is required', + code: 'MISSING_PATH', + } as ErrorResponse), + { + status: 400, + headers: { 'Content-Type': 'application/json' }, + } + ) + } + + // Validate and sanitize the path + const path = validatePath(rawPath, 'Path parameter') + + // Get file info to determine mime type and filename + const fileInfo = await getFileInfo(path) + const content = await downloadFile(path) + + const contentType = getContentType(fileInfo.name) + const contentDisposition = `attachment; ${encodeFilename(fileInfo.name)}` + + const headers: Record = { + 'Content-Type': contentType, + 'Content-Disposition': contentDisposition, + 'Content-Length': content.byteLength.toString(), + } + + // Add cache control for static assets + if (isStaticAsset(fileInfo.name)) { + headers['Cache-Control'] = 'public, max-age=31536000' // 1 year + } else { + headers['Cache-Control'] = 'no-cache' + } + + return new Response(content, { headers }) + } catch (err) { + const error = err as Error & FileSystemError + + if (error.message.includes('invalid characters') || + error.message.includes('traversal attempts')) { + return new Response( + JSON.stringify({ + error: error.message, + code: 'INVALID_PATH', + } as ErrorResponse), + { + status: 400, + headers: { 'Content-Type': 'application/json' }, + } + ) + } + + const status = error.status || 500 + const code = error.code || 'INTERNAL_ERROR' + + return new Response( + JSON.stringify({ + error: error.message || 'An unexpected error occurred', + code, + } as ErrorResponse), + { + status, + headers: { 'Content-Type': 'application/json' }, + } + ) + } + }, + }, + }, +}) \ No newline at end of file diff --git a/apps/webclaw/src/routes/api/files/info.ts b/apps/webclaw/src/routes/api/files/info.ts new file mode 100644 index 0000000..5faa28e --- /dev/null +++ b/apps/webclaw/src/routes/api/files/info.ts @@ -0,0 +1,67 @@ +import { createFileRoute } from '@tanstack/react-router' +import { json } from '@tanstack/react-start' +import { getFileInfo } from '../../../server/filesystem' +import { validatePath } from '../../../server/path-utils' +import type { FileItem } from '../../../lib/file-types' +import type { FileSystemError } from '../../../server/filesystem' + +type InfoResponse = FileItem + +type ErrorResponse = { + error: string + code: string +} + +export const Route = createFileRoute('/api/files/info')({ + server: { + handlers: { + GET: async ({ request }) => { + try { + const url = new URL(request.url) + const rawPath = url.searchParams.get('path') + + if (!rawPath) { + return json( + { + error: 'path parameter is required', + code: 'MISSING_PATH', + }, + { status: 400 } + ) + } + + // Validate and sanitize the path + const path = validatePath(rawPath, 'Path parameter') + + const fileInfo = await getFileInfo(path) + + return json(fileInfo) + } catch (err) { + const error = err as Error & FileSystemError + + if (error.message.includes('invalid characters') || + error.message.includes('traversal attempts')) { + return json( + { + error: error.message, + code: 'INVALID_PATH', + }, + { status: 400 }, + ) + } + + const status = error.status || 500 + const code = error.code || 'INTERNAL_ERROR' + + return json( + { + error: error.message || 'An unexpected error occurred', + code, + }, + { status }, + ) + } + }, + }, + }, +}) \ No newline at end of file diff --git a/apps/webclaw/src/routes/api/files/list.ts b/apps/webclaw/src/routes/api/files/list.ts new file mode 100644 index 0000000..ef9505e --- /dev/null +++ b/apps/webclaw/src/routes/api/files/list.ts @@ -0,0 +1,57 @@ +import { createFileRoute } from '@tanstack/react-router' +import { json } from '@tanstack/react-start' +import { listFiles } from '../../../server/filesystem' +import { validatePath } from '../../../server/path-utils' +import type { FileListing } from '../../../lib/file-types' +import type { FileSystemError } from '../../../server/filesystem' + +type ListResponse = FileListing + +type ErrorResponse = { + error: string + code: string +} + +export const Route = createFileRoute('/api/files/list')({ + server: { + handlers: { + GET: async ({ request }) => { + try { + const url = new URL(request.url) + const rawPath = url.searchParams.get('path') || '/' + + // Validate and sanitize the path + const path = validatePath(rawPath, 'Path parameter') + + const listing = await listFiles(path) + + return json(listing) + } catch (err) { + const error = err as Error & FileSystemError + + if (error.message.includes('invalid characters') || + error.message.includes('traversal attempts')) { + return json( + { + error: error.message, + code: 'INVALID_PATH', + }, + { status: 400 }, + ) + } + + const status = error.status || 500 + const code = error.code || 'INTERNAL_ERROR' + + return json( + { + error: error.message || 'An unexpected error occurred', + code, + }, + { status }, + ) + } + }, + }, + }, +}) \ No newline at end of file diff --git a/apps/webclaw/src/routes/api/files/mkdir.ts b/apps/webclaw/src/routes/api/files/mkdir.ts new file mode 100644 index 0000000..5917be4 --- /dev/null +++ b/apps/webclaw/src/routes/api/files/mkdir.ts @@ -0,0 +1,115 @@ +import { createFileRoute } from '@tanstack/react-router' +import { json } from '@tanstack/react-start' +import { createFolder } from '../../../server/filesystem' +import { validatePath } from '../../../server/path-utils' +import type { FileSystemError } from '../../../server/filesystem' + +type MkdirResponse = { + ok: true + message: string + path: string +} + +type ErrorResponse = { + error: string + code: string +} + +function validateFolderName(path: string): void { + // Extract folder name from path + const folderName = path.split('/').pop() || '' + + if (!folderName) { + throw new Error('Folder name cannot be empty') + } + + // Check for invalid characters in folder name + const invalidChars = /[<>:"|*?]/ + if (invalidChars.test(folderName)) { + throw new Error(`Folder name contains invalid characters: ${folderName}`) + } + + // Prevent creating system-like paths + const systemPaths = [ + 'bin', 'boot', 'dev', 'etc', 'lib', 'lib64', 'mnt', 'opt', 'proc', + 'root', 'run', 'sbin', 'srv', 'sys', 'tmp', 'usr', 'var', + 'System', 'Windows', 'Program Files', 'Program Files (x86)' + ] + + if (systemPaths.includes(folderName)) { + throw new Error(`Cannot create system directory: ${folderName}`) + } + + // Prevent names that are just dots or whitespace + if (folderName.trim() === '' || /^\.+$/.test(folderName)) { + throw new Error('Invalid folder name') + } +} + +export const Route = createFileRoute('/api/files/mkdir')({ + server: { + handlers: { + POST: async ({ request }) => { + try { + const body = (await request.json().catch(() => ({}))) as Record< + string, + unknown + > + + const rawPath = typeof body.path === 'string' ? body.path.trim() : '' + + if (!rawPath) { + return json( + { + error: 'path is required', + code: 'MISSING_PATH', + }, + { status: 400 } + ) + } + + // Validate and sanitize the path + const path = validatePath(rawPath, 'Path parameter') + + // Additional validation for folder names + validateFolderName(path) + + await createFolder(path) + + return json({ + ok: true, + message: 'Directory created successfully', + path, + }) + } catch (err) { + const error = err as Error & FileSystemError + + if (error.message.includes('invalid characters') || + error.message.includes('traversal attempts') || + error.message.includes('Invalid folder') || + error.message.includes('Cannot create system') || + error.message.includes('Folder name')) { + return json( + { + error: error.message, + code: 'VALIDATION_ERROR', + }, + { status: 400 }, + ) + } + + const status = error.status || 500 + const code = error.code || 'INTERNAL_ERROR' + + return json( + { + error: error.message || 'An unexpected error occurred', + code, + }, + { status }, + ) + } + }, + }, + }, +}) \ No newline at end of file diff --git a/apps/webclaw/src/routes/api/files/read.ts b/apps/webclaw/src/routes/api/files/read.ts new file mode 100644 index 0000000..566e47c --- /dev/null +++ b/apps/webclaw/src/routes/api/files/read.ts @@ -0,0 +1,81 @@ +import { createFileRoute } from '@tanstack/react-router' +import { downloadFile, getFileInfo } from '../../../server/filesystem' +import { validatePath } from '../../../server/path-utils' +import type { FileSystemError } from '../../../server/filesystem' + +type ErrorResponse = { + error: string + code: string +} + +const MAX_TEXT_SIZE = 5 * 1024 * 1024 // 5MB max for text editing + +const TEXT_EXTENSIONS = new Set([ + 'txt', 'md', 'log', 'json', 'xml', 'yaml', 'yml', 'csv', 'ini', 'conf', 'cfg', + 'js', 'ts', 'jsx', 'tsx', 'py', 'java', 'cpp', 'c', 'h', 'css', 'html', 'htm', + 'php', 'rb', 'go', 'rs', 'sh', 'bash', 'zsh', 'toml', 'env', 'gitignore', + 'dockerfile', 'makefile', 'sql', 'graphql', 'svelte', 'vue', 'scss', 'less', + 'diff', 'patch', +]) + +export const Route = createFileRoute('/api/files/read')({ + server: { + handlers: { + GET: async ({ request }) => { + try { + const url = new URL(request.url) + const rawPath = url.searchParams.get('path') + + if (!rawPath) { + return new Response( + JSON.stringify({ error: 'path parameter is required', code: 'MISSING_PATH' } as ErrorResponse), + { status: 400, headers: { 'Content-Type': 'application/json' } }, + ) + } + + const path = validatePath(rawPath, 'Path parameter') + const fileInfo = await getFileInfo(path) + + if (fileInfo.isDir) { + return new Response( + JSON.stringify({ error: 'Cannot read a directory', code: 'IS_DIRECTORY' } as ErrorResponse), + { status: 400, headers: { 'Content-Type': 'application/json' } }, + ) + } + + // Check extension + const ext = fileInfo.extension.toLowerCase() + if (!TEXT_EXTENSIONS.has(ext) && ext !== '') { + return new Response( + JSON.stringify({ error: 'File type not supported for text editing', code: 'UNSUPPORTED_TYPE' } as ErrorResponse), + { status: 400, headers: { 'Content-Type': 'application/json' } }, + ) + } + + if (fileInfo.size > MAX_TEXT_SIZE) { + return new Response( + JSON.stringify({ error: 'File too large for text editing (max 5MB)', code: 'FILE_TOO_LARGE' } as ErrorResponse), + { status: 413, headers: { 'Content-Type': 'application/json' } }, + ) + } + + const content = await downloadFile(path) + const text = new TextDecoder('utf-8', { fatal: false }).decode(new Uint8Array(content)) + + return new Response( + JSON.stringify({ content: text, name: fileInfo.name, extension: fileInfo.extension, size: fileInfo.size }), + { headers: { 'Content-Type': 'application/json' } }, + ) + } catch (err) { + const error = err as Error & FileSystemError + const status = error.status || 500 + const code = error.code || 'INTERNAL_ERROR' + return new Response( + JSON.stringify({ error: error.message || 'An unexpected error occurred', code } as ErrorResponse), + { status, headers: { 'Content-Type': 'application/json' } }, + ) + } + }, + }, + }, +}) diff --git a/apps/webclaw/src/routes/api/files/rename.ts b/apps/webclaw/src/routes/api/files/rename.ts new file mode 100644 index 0000000..834f42b --- /dev/null +++ b/apps/webclaw/src/routes/api/files/rename.ts @@ -0,0 +1,141 @@ +import { createFileRoute } from '@tanstack/react-router' +import { json } from '@tanstack/react-start' +import { renameFile, getFileInfo } from '../../../server/filesystem' +import { validatePath, validateFilename } from '../../../server/path-utils' +import type { FileSystemError } from '../../../server/filesystem' + +type RenameResponse = { + ok: true + message: string + src: string + dst: string +} + +type ErrorResponse = { + error: string + code: string +} + +export const Route = createFileRoute('/api/files/rename')({ + server: { + handlers: { + POST: async ({ request }) => { + try { + const body = (await request.json().catch(() => ({}))) as Record< + string, + unknown + > + + const rawSrc = typeof body.src === 'string' ? body.src.trim() : '' + const rawDst = typeof body.dst === 'string' ? body.dst.trim() : '' + + if (!rawSrc) { + return json( + { + error: 'src path is required', + code: 'MISSING_SRC_PATH', + }, + { status: 400 } + ) + } + + if (!rawDst) { + return json( + { + error: 'dst path is required', + code: 'MISSING_DST_PATH', + }, + { status: 400 } + ) + } + + // Validate and sanitize both paths + const src = validatePath(rawSrc, 'Source path') + const dst = validatePath(rawDst, 'Destination path') + + // Prevent renaming root + if (src === '/' || src === '') { + return json( + { + error: 'Cannot rename the root directory', + code: 'FORBIDDEN_RENAME_ROOT', + }, + { status: 403 } + ) + } + + // Check if it's just a filename (for validation) + const dstFilename = dst.split('/').pop() || '' + if (dstFilename && !validateFilename(dstFilename)) { + return json( + { + error: `Invalid destination filename: "${dstFilename}". Filenames cannot contain path separators or control characters`, + code: 'INVALID_FILENAME', + }, + { status: 400 } + ) + } + + // Check if destination already exists to prevent overwriting + let overwriteWarning = false + try { + await getFileInfo(dst) + overwriteWarning = true + } catch (err) { + // File doesn't exist, which is what we want for rename + } + + // Allow override with explicit query parameter + const url = new URL(request.url) + const allowOverwrite = url.searchParams.get('override') === 'true' + + if (overwriteWarning && !allowOverwrite) { + return json( + { + error: `Destination "${dst}" already exists. Use ?override=true to overwrite`, + code: 'DESTINATION_EXISTS', + }, + { status: 409 } // Conflict + ) + } + + await renameFile(src, dst) + + return json({ + ok: true, + message: overwriteWarning ? 'File renamed successfully (existing file overwritten)' : 'File renamed successfully', + src, + dst, + }) + } catch (err) { + const error = err as Error & FileSystemError + + if (error.message.includes('invalid characters') || + error.message.includes('traversal attempts') || + error.message.includes('Invalid destination') || + error.message.includes('Cannot rename') || + error.message.includes('already exists')) { + return json( + { + error: error.message, + code: 'VALIDATION_ERROR', + }, + { status: 400 }, + ) + } + + const status = error.status || 500 + const code = error.code || 'INTERNAL_ERROR' + + return json( + { + error: error.message || 'An unexpected error occurred', + code, + }, + { status }, + ) + } + }, + }, + }, +}) \ No newline at end of file diff --git a/apps/webclaw/src/routes/api/files/save.ts b/apps/webclaw/src/routes/api/files/save.ts new file mode 100644 index 0000000..eadbd35 --- /dev/null +++ b/apps/webclaw/src/routes/api/files/save.ts @@ -0,0 +1,69 @@ +import { createFileRoute } from '@tanstack/react-router' +import { json } from '@tanstack/react-start' +import { uploadFile } from '../../../server/filesystem' +import { validatePath } from '../../../server/path-utils' +import type { FileSystemError } from '../../../server/filesystem' + +type SaveResponse = { + ok: true + message: string + path: string + size: number +} + +type ErrorResponse = { + error: string + code: string +} + +const MAX_TEXT_SIZE = 5 * 1024 * 1024 // 5MB + +export const Route = createFileRoute('/api/files/save')({ + server: { + handlers: { + POST: async ({ request }) => { + try { + const body = (await request.json().catch(() => ({}))) as Record + + const rawPath = typeof body.path === 'string' ? body.path.trim() : '' + const content = typeof body.content === 'string' ? body.content : null + + if (!rawPath) { + return json({ error: 'path is required', code: 'MISSING_PATH' }, { status: 400 }) + } + + if (content === null) { + return json({ error: 'content is required', code: 'MISSING_CONTENT' }, { status: 400 }) + } + + const path = validatePath(rawPath, 'Path parameter') + + const encoded = new TextEncoder().encode(content) + if (encoded.byteLength > MAX_TEXT_SIZE) { + return json( + { error: 'Content too large (max 5MB)', code: 'CONTENT_TOO_LARGE' }, + { status: 413 }, + ) + } + + await uploadFile(path, encoded.buffer as ArrayBuffer) + + return json({ + ok: true, + message: 'File saved successfully', + path, + size: encoded.byteLength, + }) + } catch (err) { + const error = err as Error & FileSystemError + const status = error.status || 500 + const code = error.code || 'INTERNAL_ERROR' + return json( + { error: error.message || 'An unexpected error occurred', code }, + { status }, + ) + } + }, + }, + }, +}) diff --git a/apps/webclaw/src/routes/api/files/upload.ts b/apps/webclaw/src/routes/api/files/upload.ts new file mode 100644 index 0000000..93761d1 --- /dev/null +++ b/apps/webclaw/src/routes/api/files/upload.ts @@ -0,0 +1,141 @@ +import { createFileRoute } from '@tanstack/react-router' +import { json } from '@tanstack/react-start' +import { uploadFile } from '../../../server/filesystem' +import { validatePath, validateFilename } from '../../../server/path-utils' +import type { FileSystemError } from '../../../server/filesystem' + +const MAX_FILE_SIZE = 100 * 1024 * 1024 // 100MB + +type UploadedFileInfo = { + filename: string + size: number + path: string +} + +type UploadResponse = { + ok: true + message: string + files: UploadedFileInfo[] +} + +type ErrorResponse = { + error: string + code: string +} + +export const Route = createFileRoute('/api/files/upload')({ + server: { + handlers: { + POST: async ({ request }) => { + try { + const formData = await request.formData() + const rawPath = formData.get('path') as string | null + + if (!rawPath) { + return json( + { + error: 'path parameter is required', + code: 'MISSING_PATH', + }, + { status: 400 } + ) + } + + // Validate and sanitize the path + const path = validatePath(rawPath, 'Path parameter') + + // Get all files from FormData (supports multiple file uploads) + const files: File[] = [] + for (const [key, value] of formData.entries()) { + if (key === 'file' || key.startsWith('file')) { + if (value instanceof File) { + files.push(value) + } + } + } + + if (files.length === 0) { + return json( + { + error: 'At least one file is required', + code: 'NO_FILES', + }, + { status: 400 } + ) + } + + const uploadedFiles: UploadedFileInfo[] = [] + + for (const file of files) { + // Validate file size + if (file.size > MAX_FILE_SIZE) { + return json( + { + error: `File "${file.name}" is too large. Maximum size is ${MAX_FILE_SIZE / 1024 / 1024}MB`, + code: 'FILE_TOO_LARGE', + }, + { status: 413 } // Payload Too Large + ) + } + + // Validate filename + if (!validateFilename(file.name)) { + return json( + { + error: `Invalid filename: "${file.name}". Filenames cannot contain path separators or control characters`, + code: 'INVALID_FILENAME', + }, + { status: 400 } + ) + } + + // Convert file to ArrayBuffer + const content = await file.arrayBuffer() + + // Construct full file path + const fullPath = path.endsWith('/') ? `${path}${file.name}` : `${path}/${file.name}` + + await uploadFile(fullPath, content) + + uploadedFiles.push({ + filename: file.name, + size: content.byteLength, + path: fullPath, + }) + } + + return json({ + ok: true, + message: `${uploadedFiles.length} file(s) uploaded successfully`, + files: uploadedFiles, + }) + } catch (err) { + const error = err as Error & FileSystemError + + if (error.message.includes('invalid characters') || + error.message.includes('traversal attempts') || + error.message.includes('Invalid filename')) { + return json( + { + error: error.message, + code: 'VALIDATION_ERROR', + }, + { status: 400 }, + ) + } + + const status = error.status || 500 + const code = error.code || 'INTERNAL_ERROR' + + return json( + { + error: error.message || 'An unexpected error occurred', + code, + }, + { status }, + ) + } + }, + }, + }, +}) \ No newline at end of file diff --git a/apps/webclaw/src/routes/files.tsx b/apps/webclaw/src/routes/files.tsx new file mode 100644 index 0000000..5e7bda9 --- /dev/null +++ b/apps/webclaw/src/routes/files.tsx @@ -0,0 +1,10 @@ +import { createFileRoute } from '@tanstack/react-router' +import { FileExplorerScreen } from '../screens/files/file-explorer-screen' + +export const Route = createFileRoute('/files')({ + component: FilesRoute, +}) + +function FilesRoute() { + return +} \ No newline at end of file diff --git a/apps/webclaw/src/screens/chat/components/chat-sidebar.tsx b/apps/webclaw/src/screens/chat/components/chat-sidebar.tsx index 58f5d7a..011958b 100644 --- a/apps/webclaw/src/screens/chat/components/chat-sidebar.tsx +++ b/apps/webclaw/src/screens/chat/components/chat-sidebar.tsx @@ -1,5 +1,6 @@ import { HugeiconsIcon } from '@hugeicons/react' import { + Folder01Icon, PencilEdit02Icon, Search01Icon, Settings01Icon, @@ -200,7 +201,7 @@ function ChatSidebarComponent({ + + + + + + + + {!isCollapsed && ( + + Files + + )} + + + + {isCollapsed && ( + + Files + + )} + + diff --git a/apps/webclaw/src/server/filesystem.ts b/apps/webclaw/src/server/filesystem.ts new file mode 100644 index 0000000..941f055 --- /dev/null +++ b/apps/webclaw/src/server/filesystem.ts @@ -0,0 +1,294 @@ +import { readdir, stat, readFile, writeFile, rm, mkdir, rename, lstat, realpath } from 'node:fs/promises' +import { join, resolve, relative, extname } from 'node:path' +import type { FileListing, FileItem } from '../lib/file-types' + +export type FileSystemError = { + message: string + status: number + code: string +} + +function createError(message: string, status: number, code: string): Error & FileSystemError { + const err = new Error(message) as Error & FileSystemError + err.status = status + err.code = code + return err +} + +/** Cache the resolved root so we only realpath once */ +let _cachedRoot: string | null = null + +/** + * Get the root directory for file operations. + * Configurable via FILES_ROOT env var. + * Defaults to the user's home directory. + */ +function getFilesRoot(): string { + if (_cachedRoot) return _cachedRoot + const root = process.env.FILES_ROOT?.trim() + _cachedRoot = root ? resolve(root) : (process.env.HOME || '/home') + return _cachedRoot +} + +/** + * Resolve a virtual path to an absolute filesystem path, + * ensuring it stays within the root directory (jail). + * Checks both the logical path and the real path (following symlinks). + */ +async function resolveSafePath(virtualPath: string): Promise { + const root = getFilesRoot() + + // Reject null bytes early + if (virtualPath.includes('\0')) { + throw createError('Invalid path', 400, 'INVALID_PATH') + } + + // Strip leading slashes and normalize + const cleaned = virtualPath.replace(/^\/+/, '') + const resolved = resolve(root, cleaned) + + // Check logical path stays within root + const rel = relative(root, resolved) + if (rel.startsWith('..') || resolve(root, rel) !== resolved) { + throw createError('Path is outside the allowed directory', 403, 'FORBIDDEN') + } + + // If the path exists, also verify the real path (following symlinks) + try { + const real = await realpath(resolved) + const realRoot = await realpath(root) + if (!real.startsWith(realRoot + '/') && real !== realRoot) { + throw createError('Path is outside the allowed directory', 403, 'FORBIDDEN') + } + } catch (err: any) { + // ENOENT is OK β€” path doesn't exist yet (upload, mkdir) + if (err.code !== 'ENOENT' && err.status !== 403) { + // For other errors, just continue with the logical path check + } + if (err.status === 403) throw err + } + + return resolved +} + +/** + * Classify file type based on extension + */ +function classifyFile(name: string, isDirectory: boolean): string { + if (isDirectory) return 'directory' + + const ext = extname(name).toLowerCase().slice(1) + + const imageExts = new Set(['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'bmp', 'ico', 'tiff']) + const videoExts = new Set(['mp4', 'mkv', 'avi', 'mov', 'wmv', 'flv', 'webm']) + const audioExts = new Set(['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a', 'wma']) + const textExts = new Set([ + 'txt', 'md', 'log', 'json', 'xml', 'yaml', 'yml', 'csv', 'ini', 'conf', 'cfg', + 'js', 'ts', 'jsx', 'tsx', 'py', 'java', 'cpp', 'c', 'h', 'css', 'html', 'htm', + 'php', 'rb', 'go', 'rs', 'sh', 'bash', 'zsh', 'fish', 'toml', 'env', 'gitignore', + 'dockerfile', 'makefile', + ]) + + if (imageExts.has(ext)) return 'image' + if (videoExts.has(ext)) return 'video' + if (audioExts.has(ext)) return 'audio' + if (textExts.has(ext)) return 'text' + return 'blob' +} + +/** + * Build a FileItem from fs.Stats + */ +async function buildFileItem(absolutePath: string, name: string, virtualPath: string): Promise { + const [stats, linkStats] = await Promise.all([ + stat(absolutePath), + lstat(absolutePath), + ]) + const isDir = stats.isDirectory() + return { + path: virtualPath, + name, + size: stats.size, + extension: isDir ? '' : extname(name).slice(1).toLowerCase(), + modified: stats.mtime.toISOString(), + mode: stats.mode, + isDir, + isSymlink: linkStats.isSymbolicLink(), + type: classifyFile(name, isDir), + } +} + +// ── Public API ────────────────────────────────────────────────────── + +export async function listFiles(path: string = '/'): Promise { + const absolutePath = await resolveSafePath(path) + + let stats + try { + stats = await stat(absolutePath) + } catch (err: any) { + if (err.code === 'ENOENT') { + throw createError(`Path not found: ${path}`, 404, 'NOT_FOUND') + } + throw createError(`Failed to access path: ${err.message}`, 500, 'FS_ERROR') + } + + if (!stats.isDirectory()) { + throw createError('Path is not a directory', 400, 'NOT_DIRECTORY') + } + + let entries + try { + entries = await readdir(absolutePath, { withFileTypes: true }) + } catch (err: any) { + if (err.code === 'EACCES') { + throw createError('Permission denied', 403, 'PERMISSION_DENIED') + } + throw createError(`Failed to read directory: ${err.message}`, 500, 'FS_ERROR') + } + + const visibleEntries = entries + + const items: FileItem[] = [] + let numDirs = 0 + let numFiles = 0 + + for (const entry of visibleEntries) { + const entryPath = join(absolutePath, entry.name) + const virtualEntryPath = path === '/' ? `/${entry.name}` : `${path}/${entry.name}` + + try { + const item = await buildFileItem(entryPath, entry.name, virtualEntryPath) + items.push(item) + if (item.isDir) numDirs++ + else numFiles++ + } catch { + // Skip entries we can't stat (broken symlinks, permission issues, etc.) + } + } + + // Sort: directories first, then alphabetically + items.sort((a, b) => { + if (a.isDir !== b.isDir) return a.isDir ? -1 : 1 + return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' }) + }) + + const dirName = path === '/' ? '/' : path.split('/').pop() || '/' + + return { + items, + path, + name: dirName, + isDir: true, + size: stats.size, + modified: stats.mtime.toISOString(), + mode: stats.mode, + numDirs, + numFiles, + sorting: { by: 'name', asc: true }, + } +} + +export async function getFileInfo(path: string): Promise { + const absolutePath = await resolveSafePath(path) + + try { + const name = path.split('/').pop() || '' + return await buildFileItem(absolutePath, name, path) + } catch (err: any) { + if (err.code === 'ENOENT') { + throw createError(`File not found: ${path}`, 404, 'NOT_FOUND') + } + throw createError(`Failed to get file info: ${err.message}`, 500, 'FS_ERROR') + } +} + +export async function downloadFile(path: string): Promise { + const absolutePath = await resolveSafePath(path) + + try { + const buffer = await readFile(absolutePath) + return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength) + } catch (err: any) { + if (err.code === 'ENOENT') { + throw createError(`File not found: ${path}`, 404, 'NOT_FOUND') + } + if (err.code === 'EACCES') { + throw createError('Permission denied', 403, 'PERMISSION_DENIED') + } + throw createError(`Failed to read file: ${err.message}`, 500, 'FS_ERROR') + } +} + +export async function uploadFile( + path: string, + content: ArrayBuffer, +): Promise { + const absolutePath = await resolveSafePath(path) + + // Ensure parent directory exists + const parentDir = absolutePath.substring(0, absolutePath.lastIndexOf('/')) + await mkdir(parentDir, { recursive: true }).catch(() => {}) + + try { + await writeFile(absolutePath, Buffer.from(content)) + } catch (err: any) { + if (err.code === 'EACCES') { + throw createError('Permission denied', 403, 'PERMISSION_DENIED') + } + throw createError(`Failed to write file: ${err.message}`, 500, 'FS_ERROR') + } +} + +export async function deleteFile(path: string): Promise { + const absolutePath = await resolveSafePath(path) + + try { + await rm(absolutePath, { recursive: true }) + } catch (err: any) { + if (err.code === 'ENOENT') { + throw createError(`File not found: ${path}`, 404, 'NOT_FOUND') + } + if (err.code === 'EACCES') { + throw createError('Permission denied', 403, 'PERMISSION_DENIED') + } + throw createError(`Failed to delete: ${err.message}`, 500, 'FS_ERROR') + } +} + +export async function createFolder(path: string): Promise { + const absolutePath = await resolveSafePath(path) + + try { + await mkdir(absolutePath, { recursive: true }) + } catch (err: any) { + if (err.code === 'EACCES') { + throw createError('Permission denied', 403, 'PERMISSION_DENIED') + } + if (err.code === 'EEXIST') { + throw createError('Directory already exists', 409, 'ALREADY_EXISTS') + } + throw createError(`Failed to create directory: ${err.message}`, 500, 'FS_ERROR') + } +} + +export async function renameFile(src: string, dst: string): Promise { + const absoluteSrc = await resolveSafePath(src) + const absoluteDst = await resolveSafePath(dst) + + // Ensure destination parent exists + const parentDir = absoluteDst.substring(0, absoluteDst.lastIndexOf('/')) + await mkdir(parentDir, { recursive: true }).catch(() => {}) + + try { + await rename(absoluteSrc, absoluteDst) + } catch (err: any) { + if (err.code === 'ENOENT') { + throw createError(`Source not found: ${src}`, 404, 'NOT_FOUND') + } + if (err.code === 'EACCES') { + throw createError('Permission denied', 403, 'PERMISSION_DENIED') + } + throw createError(`Failed to rename: ${err.message}`, 500, 'FS_ERROR') + } +} diff --git a/apps/webclaw/src/server/path-utils.ts b/apps/webclaw/src/server/path-utils.ts new file mode 100644 index 0000000..de78b9e --- /dev/null +++ b/apps/webclaw/src/server/path-utils.ts @@ -0,0 +1,125 @@ +import { posix } from 'path' + +/** + * Sanitize and validate file paths to prevent directory traversal attacks + */ +export function sanitizePath(path: string): string { + if (typeof path !== 'string' || path.length === 0) { + return '/' + } + + // Normalize path using posix path handling (works consistently across platforms) + let normalized = posix.normalize(path) + + // Ensure path starts with / + if (!normalized.startsWith('/')) { + normalized = '/' + normalized + } + + // Remove any remaining .. components that might have escaped normalization + const parts = normalized.split('/').filter(part => part !== '' && part !== '.') + const safeParts: string[] = [] + + for (const part of parts) { + if (part === '..') { + // Remove the last safe part (go up one directory) + // but never go above root + if (safeParts.length > 0) { + safeParts.pop() + } + } else { + safeParts.push(part) + } + } + + // Reconstruct path + return '/' + safeParts.join('/') +} + +/** + * Check if a path is safe (no traversal attempts) + */ +export function isPathSafe(path: string): boolean { + if (typeof path !== 'string') { + return false + } + + // Check for obvious traversal attempts + if (path.includes('../') || path.includes('..\\') || path === '..') { + return false + } + + // Check for null bytes (security concern) + if (path.includes('\0')) { + return false + } + + // Check for Windows-style paths (security concern on Unix systems) + if (path.includes('\\')) { + return false + } + + // Sanitize and compare - if they differ, original was unsafe + const sanitized = sanitizePath(path) + return path === sanitized || (path.endsWith('/') && sanitized === path.slice(0, -1)) +} + +/** + * Validate that a path is safe for file operations + * Throws an error if the path is unsafe + */ +export function validatePath(path: string, context: string = 'Path'): string { + if (!path || typeof path !== 'string') { + throw new Error(`${context} is required`) + } + + if (!isPathSafe(path)) { + throw new Error(`${context} contains invalid characters or traversal attempts`) + } + + return sanitizePath(path) +} + +/** + * Validate filename to ensure it doesn't contain path separators or other dangerous chars + */ +export function validateFilename(filename: string): boolean { + if (typeof filename !== 'string' || filename.length === 0) { + return false + } + + // Reject filenames with path separators + if (filename.includes('/') || filename.includes('\\')) { + return false + } + + // Reject null bytes + if (filename.includes('\0')) { + return false + } + + // Reject control characters (0-31) + for (let i = 0; i < filename.length; i++) { + const code = filename.charCodeAt(i) + if (code >= 0 && code <= 31) { + return false + } + } + + // Reject reserved names on Windows (even on Unix, for consistency) + const reserved = ['CON', 'PRN', 'AUX', 'NUL', 'COM1', 'COM2', 'COM3', 'COM4', + 'COM5', 'COM6', 'COM7', 'COM8', 'COM9', 'LPT1', 'LPT2', + 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7', 'LPT8', 'LPT9'] + + const nameUpper = filename.toUpperCase() + if (reserved.includes(nameUpper) || reserved.some(res => nameUpper.startsWith(res + '.'))) { + return false + } + + // Reject names that are just dots + if (filename === '.' || filename === '..') { + return false + } + + return true +} \ No newline at end of file From 520d73eef01e2a29836ed397fe2b91ade2f63959 Mon Sep 17 00:00:00 2001 From: balin-ar Date: Thu, 5 Feb 2026 14:53:12 +0000 Subject: [PATCH 2/3] docs: add file explorer screenshot --- .../public/screenshot-file-explorer.png | Bin 0 -> 251077 bytes .../files/components/create-folder-dialog.tsx | 192 +++++++ .../files/components/file-breadcrumb.tsx | 80 +++ .../files/components/file-context-menu.tsx | 423 ++++++++++++++ .../screens/files/components/file-editor.tsx | 223 ++++++++ .../screens/files/components/file-list.tsx | 529 ++++++++++++++++++ .../screens/files/components/file-toolbar.tsx | 213 +++++++ .../files/components/file-upload-dialog.tsx | 328 +++++++++++ .../files/components/files-sidebar.tsx | 369 ++++++++++++ .../screens/files/file-explorer-screen.tsx | 135 +++++ .../files/hooks/use-file-explorer-state.ts | 81 +++ .../src/screens/files/hooks/use-files.ts | 271 +++++++++ apps/webclaw/src/screens/files/types.ts | 31 + .../files/components/create-folder-dialog.tsx | 192 +++++++ .../files/components/file-breadcrumb.tsx | 80 +++ .../files/components/file-context-menu.tsx | 423 ++++++++++++++ src/screens/files/components/file-editor.tsx | 223 ++++++++ src/screens/files/components/file-list.tsx | 529 ++++++++++++++++++ src/screens/files/components/file-toolbar.tsx | 213 +++++++ .../files/components/file-upload-dialog.tsx | 328 +++++++++++ .../files/components/files-sidebar.tsx | 369 ++++++++++++ src/screens/files/file-explorer-screen.tsx | 135 +++++ .../files/hooks/use-file-explorer-state.ts | 81 +++ src/screens/files/hooks/use-files.ts | 271 +++++++++ src/screens/files/types.ts | 31 + webclaw | 1 + 26 files changed, 5751 insertions(+) create mode 100644 apps/webclaw/public/screenshot-file-explorer.png create mode 100644 apps/webclaw/src/screens/files/components/create-folder-dialog.tsx create mode 100644 apps/webclaw/src/screens/files/components/file-breadcrumb.tsx create mode 100644 apps/webclaw/src/screens/files/components/file-context-menu.tsx create mode 100644 apps/webclaw/src/screens/files/components/file-editor.tsx create mode 100644 apps/webclaw/src/screens/files/components/file-list.tsx create mode 100644 apps/webclaw/src/screens/files/components/file-toolbar.tsx create mode 100644 apps/webclaw/src/screens/files/components/file-upload-dialog.tsx create mode 100644 apps/webclaw/src/screens/files/components/files-sidebar.tsx create mode 100644 apps/webclaw/src/screens/files/file-explorer-screen.tsx create mode 100644 apps/webclaw/src/screens/files/hooks/use-file-explorer-state.ts create mode 100644 apps/webclaw/src/screens/files/hooks/use-files.ts create mode 100644 apps/webclaw/src/screens/files/types.ts create mode 100644 src/screens/files/components/create-folder-dialog.tsx create mode 100644 src/screens/files/components/file-breadcrumb.tsx create mode 100644 src/screens/files/components/file-context-menu.tsx create mode 100644 src/screens/files/components/file-editor.tsx create mode 100644 src/screens/files/components/file-list.tsx create mode 100644 src/screens/files/components/file-toolbar.tsx create mode 100644 src/screens/files/components/file-upload-dialog.tsx create mode 100644 src/screens/files/components/files-sidebar.tsx create mode 100644 src/screens/files/file-explorer-screen.tsx create mode 100644 src/screens/files/hooks/use-file-explorer-state.ts create mode 100644 src/screens/files/hooks/use-files.ts create mode 100644 src/screens/files/types.ts create mode 160000 webclaw diff --git a/apps/webclaw/public/screenshot-file-explorer.png b/apps/webclaw/public/screenshot-file-explorer.png new file mode 100644 index 0000000000000000000000000000000000000000..43786a371de57fbe4e790f9778f7386d0f360567 GIT binary patch literal 251077 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 KS^k@_}KqcNschQ`{o43OQt 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

h>QOcd7$v~OImd7P#HLZ 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 z z{$EE15DKr*LvMM8y%Lug`j2@_?uUBwzhTQf1(%Wc@-U<1r_T`htb(m*Z-0^dem$9A zOCC89@NWPr`zt1Dk#FZo3GH(l|Md#LKT2ABz_^|BE(s|^EeZPlFTUNOKd$g|(?dp~ z$(O;0oc)L&nS47$8?7^*hlb(SGwk1gr8V*i5{-%f2?757Pk#V`$IfSYAmPN?ci3*x z{CGP0BFosDz(%tKNC<*z+m z$>;V24FN4Uf9qx-(ce~^*DB?Ewf}gUKce!AcgWcVwI(3^ZKbr}Bz>co|1pd|0>Zyd zWd&+Mi=Q|8*8$@{-!8wVvefdW?%yx?ePaJ{gYl=yWOSAOk35(y~j|LsovnxI+8i!I0Y-T`+cgyo#+Kee_0k?;DxqaiV$XiU_@ z-^cRnr~T_*?I}2dTsFInaX{?xyFF5u%KmkoqT`7TDb7KC79D3RbQ^){@NVK%TQeZ$6O^}Lz)Y?>UDm5kN%qx&TrG*)ARD>V*wNtl(Vyh jtP>aT1qSj-okvmJH{2K^8+i`CgCZ#^_aI;R@$>%&O0EyQ literal 0 HcmV?d00001 diff --git a/apps/webclaw/src/screens/files/components/create-folder-dialog.tsx b/apps/webclaw/src/screens/files/components/create-folder-dialog.tsx new file mode 100644 index 0000000..04d688e --- /dev/null +++ b/apps/webclaw/src/screens/files/components/create-folder-dialog.tsx @@ -0,0 +1,192 @@ +import { useState, useCallback } from 'react' +import { useCreateFolder } from '../hooks/use-files' +import { + DialogRoot, + DialogContent, + DialogTitle, + DialogDescription, + DialogClose, +} from '@/components/ui/dialog' +import { Button } from '@/components/ui/button' +import { cn } from '@/lib/utils' + +interface CreateFolderDialogProps { + open: boolean + onOpenChange: (open: boolean) => void + currentPath: string +} + +export function CreateFolderDialog({ open, onOpenChange, currentPath }: CreateFolderDialogProps) { + const [folderName, setFolderName] = useState('') + const [error, setError] = useState('') + const createFolderMutation = useCreateFolder() + + const handleCreate = useCallback(async () => { + if (!folderName.trim()) return + + setError('') + + try { + await createFolderMutation.mutateAsync({ + path: currentPath, + name: folderName.trim(), + }) + setFolderName('') + onOpenChange(false) + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Failed to create folder' + setError(errorMessage) + console.error('Create folder failed:', error) + } + }, [folderName, currentPath, createFolderMutation, onOpenChange]) + + const handleOpenChange = useCallback((newOpen: boolean) => { + if (!newOpen) { + setFolderName('') + setError('') + } + onOpenChange(newOpen) + }, [onOpenChange]) + + const handleKeyDown = useCallback((e: React.KeyboardEvent) => { + if (e.key === 'Enter') { + e.preventDefault() + handleCreate() + } + }, [handleCreate]) + + const handleInputChange = useCallback((e: React.ChangeEvent) => { + const value = e.target.value + setFolderName(value) + + // Clear error when user starts typing + if (error) { + setError('') + } + }, [error]) + + // Validate folder name + const isValidName = folderName.trim().length > 0 && + !/[<>:"/\\|?*]/.test(folderName) && + !folderName.includes('..') + + const getButtonText = () => { + if (createFolderMutation.isPending) { + return 'Creating…' + } + return 'Create Folder' + } + + const getValidationError = () => { + if (!folderName.trim()) { + return '' + } + + if (folderName.includes('..')) { + return 'Folder name cannot contain ".."' + } + + if (/[<>:"/\\|?*]/.test(folderName)) { + return 'Invalid characters: < > : " / \\ | ? *' + } + + return '' + } + + const validationError = getValidationError() + const showError = error || validationError + + return ( + + +

+ Create New Folder + + Create a new folder in {currentPath === '/' ? 'root directory' : currentPath} + + +
+ + + {showError ? ( + + ) : null} +
+ + {/* Loading indicator */} + {createFolderMutation.isPending ? ( +
+

Creating folder…

+
+ ) : null} + +
+ + Cancel + + +
+ + {!isValidName && folderName.length > 0 ? ( +

+ Please enter a valid folder name +

+ ) : null} +
+ + + ) +} \ No newline at end of file diff --git a/apps/webclaw/src/screens/files/components/file-breadcrumb.tsx b/apps/webclaw/src/screens/files/components/file-breadcrumb.tsx new file mode 100644 index 0000000..cebd817 --- /dev/null +++ b/apps/webclaw/src/screens/files/components/file-breadcrumb.tsx @@ -0,0 +1,80 @@ +import { HugeiconsIcon } from '@hugeicons/react' +import { ArrowRight01Icon, Home02Icon } from '@hugeicons/core-free-icons' +import { useCallback } from 'react' +import { useFileExplorerState } from '../hooks/use-file-explorer-state' +import { cn } from '@/lib/utils' + +interface FileBreadcrumbProps { + path: string +} + +export function FileBreadcrumb({ path }: FileBreadcrumbProps) { + const { navigateTo } = useFileExplorerState() + + const segments = path === '/' ? [] : path.split('/').filter(Boolean) + const breadcrumbs = [ + { name: 'Home', path: '/' }, + ...segments.map((segment, index) => ({ + name: segment, + path: '/' + segments.slice(0, index + 1).join('/'), + })), + ] + + const handleNavigate = useCallback((breadcrumbPath: string) => { + navigateTo(breadcrumbPath) + }, [navigateTo]) + + const handleKeyDown = useCallback((e: React.KeyboardEvent, breadcrumbPath: string) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault() + navigateTo(breadcrumbPath) + } + }, [navigateTo]) + + return ( + + ) +} \ No newline at end of file diff --git a/apps/webclaw/src/screens/files/components/file-context-menu.tsx b/apps/webclaw/src/screens/files/components/file-context-menu.tsx new file mode 100644 index 0000000..b5f5f88 --- /dev/null +++ b/apps/webclaw/src/screens/files/components/file-context-menu.tsx @@ -0,0 +1,423 @@ +import { HugeiconsIcon } from '@hugeicons/react' +import { + Download04Icon, + Edit02Icon, + Delete02Icon, + FolderOpenIcon, + FileEditIcon, +} from '@hugeicons/core-free-icons' +import { useState, useCallback, useRef, useEffect } from 'react' +import { useFileDownload, useFileDelete, useFileRename } from '../hooks/use-files' +import { useFileExplorerState } from '../hooks/use-file-explorer-state' +import type { FileAction } from '../types' + +const EDITABLE_EXTENSIONS = new Set([ + 'txt', 'md', 'log', 'json', 'xml', 'yaml', 'yml', 'csv', 'ini', 'conf', 'cfg', + 'js', 'ts', 'jsx', 'tsx', 'py', 'java', 'cpp', 'c', 'h', 'css', 'html', 'htm', + 'php', 'rb', 'go', 'rs', 'sh', 'bash', 'zsh', 'toml', 'env', 'gitignore', + 'dockerfile', 'makefile', 'sql', 'graphql', 'svelte', 'vue', 'scss', 'less', +]) +import { + DialogRoot, + DialogContent, + DialogTitle, + DialogDescription, + DialogClose, +} from '@/components/ui/dialog' +import { Button } from '@/components/ui/button' +import { cn } from '@/lib/utils' +import type { FileItem } from '../types' + +interface FileContextMenuProps { + item: FileItem + children: React.ReactNode + onOpenFile?: (filePath: string) => void +} + +export function FileContextMenu({ item, children, onOpenFile }: FileContextMenuProps) { + const [menuOpen, setMenuOpen] = useState(false) + const [menuPosition, setMenuPosition] = useState({ x: 0, y: 0 }) + const [renameDialogOpen, setRenameDialogOpen] = useState(false) + const [deleteDialogOpen, setDeleteDialogOpen] = useState(false) + const [newName, setNewName] = useState(item.name) + const [renameError, setRenameError] = useState('') + const renameInputRef = useRef(null) + + const { navigateTo } = useFileExplorerState() + const downloadMutation = useFileDownload() + const deleteMutation = useFileDelete() + const renameMutation = useFileRename() + + const handleAction = useCallback((action: FileAction) => { + switch (action) { + case 'open': + if (item.isDir) { + navigateTo(item.path) + } + break + case 'edit': + if (onOpenFile) { + onOpenFile(item.path) + } + break + case 'download': + if (!item.isDir) { + downloadMutation.mutate(item.path) + } + break + case 'rename': + setNewName(item.name) + setRenameError('') + setRenameDialogOpen(true) + break + case 'delete': + setDeleteDialogOpen(true) + break + } + }, [item, downloadMutation, navigateTo]) + + const handleContextMenu = useCallback((e: React.MouseEvent) => { + e.preventDefault() + e.stopPropagation() + setMenuPosition({ x: e.clientX, y: e.clientY }) + setMenuOpen(true) + }, []) + + const confirmRename = useCallback(async () => { + if (!newName || newName === item.name) { + setRenameDialogOpen(false) + return + } + + setRenameError('') + + try { + await renameMutation.mutateAsync({ + oldPath: item.path, + newName: newName.trim(), + }) + setRenameDialogOpen(false) + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Failed to rename' + setRenameError(errorMessage) + } + }, [newName, item, renameMutation]) + + const confirmDelete = useCallback(async () => { + try { + await deleteMutation.mutateAsync(item.path) + setDeleteDialogOpen(false) + } catch (error) { + console.error('Delete failed:', error) + // Error will be shown via the mutation's error handling + } + }, [item.path, deleteMutation]) + + const handleRenameKeyDown = useCallback((e: React.KeyboardEvent) => { + if (e.key === 'Enter') { + e.preventDefault() + confirmRename() + } else if (e.key === 'Escape') { + e.preventDefault() + setRenameDialogOpen(false) + } + }, [confirmRename]) + + const handleRenameInputChange = useCallback((e: React.ChangeEvent) => { + setNewName(e.target.value) + if (renameError) { + setRenameError('') + } + }, [renameError]) + + // Focus and select filename without extension when rename dialog opens + useEffect(() => { + if (renameDialogOpen && renameInputRef.current) { + const input = renameInputRef.current + input.focus() + + // Select filename without extension + if (!item.isDir && item.extension) { + const nameWithoutExt = item.name.replace(new RegExp(`\\.${item.extension}$`), '') + input.setSelectionRange(0, nameWithoutExt.length) + } else { + input.select() + } + } + }, [renameDialogOpen, item]) + + const isValidRename = newName.trim().length > 0 && + !/[<>:"/\\|?*]/.test(newName) && + !newName.includes('..') && + newName !== item.name + + const getDownloadText = () => { + return downloadMutation.isPending ? 'Downloading…' : 'Download' + } + + const getRenameText = () => { + return renameMutation.isPending ? 'Renaming…' : 'Rename' + } + + const getDeleteText = () => { + return deleteMutation.isPending ? 'Deleting…' : 'Delete' + } + + // Close menu on click outside or Escape + useEffect(() => { + if (!menuOpen) return + const handleClose = () => setMenuOpen(false) + const handleEsc = (e: KeyboardEvent) => { + if (e.key === 'Escape') setMenuOpen(false) + } + // Delay to avoid closing immediately from the same click + const timer = setTimeout(() => { + document.addEventListener('click', handleClose) + document.addEventListener('contextmenu', handleClose) + document.addEventListener('keydown', handleEsc) + }, 0) + return () => { + clearTimeout(timer) + document.removeEventListener('click', handleClose) + document.removeEventListener('contextmenu', handleClose) + document.removeEventListener('keydown', handleEsc) + } + }, [menuOpen]) + + const handleMenuItemClick = useCallback((action: FileAction) => { + setMenuOpen(false) + handleAction(action) + }, [handleAction]) + + return ( + <> +
+ {children} +
+ + {menuOpen ? ( +
+
e.stopPropagation()} + > + {item.isDir ? ( + + ) : null} + {!item.isDir ? ( + + ) : null} + {!item.isDir && EDITABLE_EXTENSIONS.has(item.extension.toLowerCase()) ? ( + + ) : null} + + + + +
+
+ ) : null} + + {/* Rename Dialog */} + + +
+ + Rename {item.isDir ? 'Folder' : 'File'} + + + Enter a new name for "{item.name}" + + +
+ + + {renameError ? ( + + ) : null} +
+ + {/* Loading indicator */} + {renameMutation.isPending ? ( +
+

Renaming…

+
+ ) : null} + +
+ + Cancel + + +
+
+
+
+ + {/* Delete Confirmation Dialog */} + + +
+ + Delete {item.isDir ? 'Folder' : 'File'} + + + Are you sure you want to delete "{item.name}"? + {item.isDir ? ' This will delete the folder and all its contents.' : ''} + {' '}This action cannot be undone. + + + {/* Loading indicator */} + {deleteMutation.isPending ? ( +
+

Deleting…

+
+ ) : null} + +
+ + Cancel + + +
+
+
+
+ + ) +} \ No newline at end of file diff --git a/apps/webclaw/src/screens/files/components/file-editor.tsx b/apps/webclaw/src/screens/files/components/file-editor.tsx new file mode 100644 index 0000000..5bd20b0 --- /dev/null +++ b/apps/webclaw/src/screens/files/components/file-editor.tsx @@ -0,0 +1,223 @@ +import { useState, useCallback, useEffect, useRef, useMemo } from 'react' +import { HugeiconsIcon } from '@hugeicons/react' +import { Cancel01Icon, FloppyDiskIcon } from '@hugeicons/core-free-icons' +import { useFileContent, useFileSave } from '../hooks/use-files' +import { Button } from '@/components/ui/button' +import { cn } from '@/lib/utils' + +interface FileEditorProps { + filePath: string + onClose: () => void +} + +const LANGUAGE_MAP: Record = { + js: 'JavaScript', + ts: 'TypeScript', + jsx: 'JSX', + tsx: 'TSX', + py: 'Python', + json: 'JSON', + yaml: 'YAML', + yml: 'YAML', + md: 'Markdown', + html: 'HTML', + css: 'CSS', + scss: 'SCSS', + sh: 'Shell', + bash: 'Bash', + sql: 'SQL', + xml: 'XML', + toml: 'TOML', + ini: 'INI', + conf: 'Config', + cfg: 'Config', + env: 'Env', + txt: 'Text', + log: 'Log', + csv: 'CSV', + go: 'Go', + rs: 'Rust', + rb: 'Ruby', + php: 'PHP', + java: 'Java', + c: 'C', + cpp: 'C++', + h: 'Header', + dockerfile: 'Dockerfile', + makefile: 'Makefile', + graphql: 'GraphQL', + svelte: 'Svelte', + vue: 'Vue', +} + +export function FileEditor({ filePath, onClose }: FileEditorProps) { + const contentQuery = useFileContent(filePath) + const saveMutation = useFileSave() + const textareaRef = useRef(null) + + const [editedContent, setEditedContent] = useState(null) + const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false) + + // Sync fetched content + useEffect(() => { + if (contentQuery.data && editedContent === null) { + setEditedContent(contentQuery.data.content) + } + }, [contentQuery.data, editedContent]) + + const language = useMemo(() => { + if (!contentQuery.data) return '' + return LANGUAGE_MAP[contentQuery.data.extension.toLowerCase()] || contentQuery.data.extension.toUpperCase() + }, [contentQuery.data]) + + const handleChange = useCallback((e: React.ChangeEvent) => { + setEditedContent(e.target.value) + setHasUnsavedChanges(e.target.value !== contentQuery.data?.content) + }, [contentQuery.data]) + + const handleSave = useCallback(async () => { + if (editedContent === null) return + try { + await saveMutation.mutateAsync({ path: filePath, content: editedContent }) + setHasUnsavedChanges(false) + } catch { + // Error shown via mutation state + } + }, [filePath, editedContent, saveMutation]) + + const handleClose = useCallback(() => { + if (hasUnsavedChanges) { + if (!window.confirm('You have unsaved changes. Discard them?')) return + } + onClose() + }, [hasUnsavedChanges, onClose]) + + // Ctrl+S to save + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + if ((e.ctrlKey || e.metaKey) && e.key === 's') { + e.preventDefault() + if (hasUnsavedChanges) handleSave() + } + if (e.key === 'Escape') { + handleClose() + } + } + window.addEventListener('keydown', handleKeyDown) + return () => window.removeEventListener('keydown', handleKeyDown) + }, [handleSave, handleClose, hasUnsavedChanges]) + + // Handle Tab key for indentation + const handleKeyDown = useCallback((e: React.KeyboardEvent) => { + if (e.key === 'Tab') { + e.preventDefault() + const textarea = e.currentTarget + const start = textarea.selectionStart + const end = textarea.selectionEnd + const value = textarea.value + + const newValue = value.substring(0, start) + ' ' + value.substring(end) + setEditedContent(newValue) + setHasUnsavedChanges(newValue !== contentQuery.data?.content) + + // Restore cursor position after React re-render + requestAnimationFrame(() => { + textarea.selectionStart = textarea.selectionEnd = start + 2 + }) + } + }, [contentQuery.data]) + + const fileName = filePath.split('/').pop() || filePath + + return ( +
+ {/* Toolbar */} +
+
+

{fileName}

+ {language ? ( + + {language} + + ) : null} + {hasUnsavedChanges ? ( + + Unsaved + + ) : null} + {saveMutation.isError ? ( + {saveMutation.error.message} + ) : null} +
+ +
+ + +
+
+ + {/* Editor area */} +
+ {contentQuery.isLoading ? ( +
+

Loading file…

+
+ ) : contentQuery.isError ? ( +
+
+

+ {contentQuery.error instanceof Error ? contentQuery.error.message : 'Failed to load file'} +

+ +
+
+ ) : ( +