Skip to main content
Glama
base.ts5.73 kB
/** * Base interfaces and types for file handling system * All file handlers implement the FileHandler interface */ // ============================================================================ // Core Interfaces // ============================================================================ /** * Base interface that all file handlers must implement */ export interface FileHandler { /** * Read file content * @param path Validated file path * @param options Read options (offset, length, sheet, etc.) * @returns File result with content and metadata */ read(path: string, options?: ReadOptions): Promise<FileResult>; /** * Write file (complete rewrite or append) * @param path Validated file path * @param content Content to write * @param mode Write mode: 'rewrite' (default) or 'append' */ write(path: string, content: any, mode?: 'rewrite' | 'append'): Promise<void>; /** * Edit a specific range (bulk rewrite) * PRIMARY METHOD for structured file editing (Excel, etc.) * Simpler and more powerful than location-based edits * Supports: * - Cell ranges: "Sheet1!A1:C10" with 2D array content * - Whole sheets: "Sheet1" to replace entire sheet * - Chunking: Update 1000 rows at a time for large files * * Currently implemented by: ExcelFileHandler * TECHNICAL DEBT: TextFileHandler should also implement this for search/replace * (logic currently in src/tools/edit.ts - see comments there) * * @param path Validated file path * @param range Range identifier (e.g., "Sheet1!A1:C10" or "Sheet1") * @param content New content for the range (2D array for Excel) * @param options Additional format-specific options * @returns Result with success status */ editRange?(path: string, range: string, content: any, options?: Record<string, any>): Promise<EditResult>; /** * Get file metadata * @param path Validated file path * @returns File information including type-specific metadata */ getInfo(path: string): Promise<FileInfo>; /** * Check if this handler can handle the given file * @param path File path * @returns true if this handler supports this file type (can be async for content-based checks) */ canHandle(path: string): boolean | Promise<boolean>; } // ============================================================================ // Read Operations // ============================================================================ /** * Options for reading files */ export interface ReadOptions { /** Whether the path is a URL */ isUrl?: boolean; /** Starting line/row number (for text/excel) */ offset?: number; /** Maximum number of lines/rows to read */ length?: number; /** Excel-specific: Sheet name or index */ sheet?: string | number; /** Excel-specific: Cell range (e.g., "A1:C10") */ range?: string; /** Whether to include status messages (default: true) */ includeStatusMessage?: boolean; } /** * Result from reading a file */ export interface FileResult { /** File content (string for text/csv, Buffer for binary, base64 string for images) */ content: string | Buffer; /** MIME type of the content */ mimeType: string; /** Type-specific metadata */ metadata?: FileMetadata; } /** * File-type specific metadata */ export interface FileMetadata { /** For images */ isImage?: boolean; /** For binary files */ isBinary?: boolean; /** For Excel files */ isExcelFile?: boolean; sheets?: ExcelSheet[]; fileSize?: number; isLargeFile?: boolean; /** For text files */ lineCount?: number; /** For PDF files */ isPdf?: boolean; author?: string; title?: string; totalPages?: number; pages?: PdfPageItem[]; /** Error information if operation failed */ error?: boolean; errorMessage?: string; } /** * PDF page content item */ export interface PdfPageItem { pageNumber: number; text: string; images: Array<{ data: string; mimeType: string; }>; } /** * Excel sheet metadata */ export interface ExcelSheet { /** Sheet name */ name: string; /** Number of rows in sheet */ rowCount: number; /** Number of columns in sheet */ colCount: number; } // ============================================================================ // Edit Operations // ============================================================================ /** * Result from edit operation (used by editRange) */ export interface EditResult { /** Whether all edits succeeded */ success: boolean; /** Number of edits successfully applied */ editsApplied: number; /** Errors that occurred during editing */ errors?: Array<{ location: string; error: string; }>; } // ============================================================================ // File Information // ============================================================================ /** * File information and metadata */ export interface FileInfo { /** File size in bytes */ size: number; /** Creation time */ created: Date; /** Last modification time */ modified: Date; /** Last access time */ accessed: Date; /** Is this a directory */ isDirectory: boolean; /** Is this a regular file */ isFile: boolean; /** File permissions (octal string) */ permissions: string; /** File type classification */ fileType: 'text' | 'excel' | 'image' | 'binary'; /** Type-specific metadata */ metadata?: FileMetadata; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/wonderwhy-er/DesktopCommanderMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server