diff options
| -rw-r--r-- | package-lock.json | 1 | ||||
| -rw-r--r-- | packages/cli/src/zed-integration/fileSystemService.ts | 4 | ||||
| -rw-r--r-- | packages/core/package.json | 1 | ||||
| -rw-r--r-- | packages/core/src/services/fileSystemService.ts | 14 | ||||
| -rw-r--r-- | packages/core/src/utils/fileUtils.ts | 15 | 
5 files changed, 34 insertions, 1 deletions
diff --git a/package-lock.json b/package-lock.json index 797a80c6..afb511db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12691,6 +12691,7 @@          "mnemonist": "^0.40.3",          "open": "^10.1.2",          "picomatch": "^4.0.1", +        "protobufjs": "^7.3.2",          "shell-quote": "^1.8.3",          "simple-git": "^3.28.0",          "strip-ansi": "^7.1.0", diff --git a/packages/cli/src/zed-integration/fileSystemService.ts b/packages/cli/src/zed-integration/fileSystemService.ts index deb9857f..8e9bd9a4 100644 --- a/packages/cli/src/zed-integration/fileSystemService.ts +++ b/packages/cli/src/zed-integration/fileSystemService.ts @@ -33,6 +33,10 @@ export class AcpFileSystemService implements FileSystemService {      return response.content;    } +  async readProtoFile(filePath: string): Promise<string> { +    return this.fallback.readProtoFile(filePath); +  } +    async writeTextFile(filePath: string, content: string): Promise<void> {      if (!this.capabilities.writeTextFile) {        return this.fallback.writeTextFile(filePath, content); diff --git a/packages/core/package.json b/packages/core/package.json index a694924c..a5ca0fb8 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -54,6 +54,7 @@      "strip-ansi": "^7.1.0",      "undici": "^7.10.0",      "ws": "^8.18.0", +    "protobufjs": "^7.3.2",      "@xterm/headless": "5.5.0"    },    "optionalDependencies": { diff --git a/packages/core/src/services/fileSystemService.ts b/packages/core/src/services/fileSystemService.ts index e2f30cf4..3e4cd30f 100644 --- a/packages/core/src/services/fileSystemService.ts +++ b/packages/core/src/services/fileSystemService.ts @@ -5,6 +5,7 @@   */  import fs from 'fs/promises'; +import protobuf from 'protobufjs';  /**   * Interface for file system operations that may be delegated to different implementations @@ -19,6 +20,14 @@ export interface FileSystemService {    readTextFile(filePath: string): Promise<string>;    /** +   * Read and parse a proto file +   * +   * @param filePath - The path to the file to read +   * @returns The file content as a JSON string +   */ +  readProtoFile(filePath: string): Promise<string>; + +  /**     * Write text content to a file     *     * @param filePath - The path to the file to write @@ -35,6 +44,11 @@ export class StandardFileSystemService implements FileSystemService {      return fs.readFile(filePath, 'utf-8');    } +  async readProtoFile(filePath: string): Promise<string> { +    const root = await protobuf.load(filePath); +    return JSON.stringify(root.toJSON(), null, 2); +  } +    async writeTextFile(filePath: string, content: string): Promise<void> {      await fs.writeFile(filePath, content, 'utf-8');    } diff --git a/packages/core/src/utils/fileUtils.ts b/packages/core/src/utils/fileUtils.ts index f0b491ed..009a4d72 100644 --- a/packages/core/src/utils/fileUtils.ts +++ b/packages/core/src/utils/fileUtils.ts @@ -121,7 +121,9 @@ export async function isBinaryFile(filePath: string): Promise<boolean> {   */  export async function detectFileType(    filePath: string, -): Promise<'text' | 'image' | 'pdf' | 'audio' | 'video' | 'binary' | 'svg'> { +): Promise< +  'text' | 'image' | 'pdf' | 'audio' | 'video' | 'binary' | 'svg' | 'proto' +> {    const ext = path.extname(filePath).toLowerCase();    // The mimetype for various TypeScript extensions (ts, mts, cts, tsx) can be @@ -135,6 +137,10 @@ export async function detectFileType(      return 'svg';    } +  if (ext === '.proto') { +    return 'proto'; +  } +    const lookedUpMimeType = mime.lookup(filePath); // Returns false if not found, or the mime type string    if (lookedUpMimeType) {      if (lookedUpMimeType.startsWith('image/')) { @@ -280,6 +286,13 @@ export async function processSingleFileContent(            returnDisplay: `Read SVG as text: ${relativePathForDisplay}`,          };        } +      case 'proto': { +        const content = await fileSystemService.readProtoFile(filePath); +        return { +          llmContent: content, +          returnDisplay: `Read proto file: ${relativePathForDisplay}`, +        }; +      }        case 'text': {          const content = await fileSystemService.readTextFile(filePath);          const lines = content.split('\n');  | 
