UNPKG

zignet

Version:

MCP server for Zig — AI-powered code analysis, validation, and documentation with fine-tuned LLM

1 lines 5.69 kB
{"version":3,"file":"model-downloader-ioH3AphD.cjs","names":["MODEL_PATH","Readable"],"sources":["../src/llm/model-downloader.ts"],"sourcesContent":["import { mkdir, unlink } from \"node:fs/promises\";\nimport { createWriteStream } from \"node:fs\";\nimport { existsSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { MODEL_PATH } from \"../config.js\";\n\nconst MODEL_REPO = \"fulgidus/zignet-qwen2.5-coder-7b\";\nconst MODEL_FILE = \"gguf/zignet-qwen-7b-q4km.gguf\";\nconst MODEL_SIZE_MB = 4400; // 4.4GB\n\nexport interface DownloadProgress {\n downloaded: number;\n total: number;\n percent: number;\n}\n\nexport class ModelDownloader {\n private readonly modelPath: string;\n\n constructor() {\n this.modelPath = MODEL_PATH;\n }\n\n /**\n * Get the path to the model file\n */\n getModelPath(): string {\n return this.modelPath;\n }\n\n /**\n * Check if model is already downloaded\n */\n isModelAvailable(): boolean {\n return existsSync(this.modelPath);\n }\n\n /**\n * Download the GGUF model from HuggingFace\n */\n async downloadModel(\n onProgress?: (progress: DownloadProgress) => void,\n ): Promise<void> {\n if (this.isModelAvailable()) {\n console.log(\"✅ Model already downloaded:\", this.modelPath);\n return;\n }\n\n console.log(\"📥 Downloading ZigNet model from HuggingFace...\");\n console.log(`📦 Size: ${MODEL_SIZE_MB}MB`);\n console.log(`📍 Repo: ${MODEL_REPO}`);\n\n // Ensure models directory exists\n const modelsDir = dirname(this.modelPath);\n await mkdir(modelsDir, { recursive: true });\n\n // HuggingFace CDN URL\n const url = `https://huggingface.co/${MODEL_REPO}/resolve/main/${MODEL_FILE}`;\n\n try {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(\n `Failed to download model: ${response.statusText}`,\n );\n }\n\n const totalBytes = parseInt(\n response.headers.get(\"content-length\") || \"0\",\n 10,\n );\n\n if (!response.body) {\n throw new Error(\"Response body is null\");\n }\n\n const fileStream = createWriteStream(this.modelPath);\n let downloadedBytes = 0;\n\n // Convert Web ReadableStream to Node Readable\n const nodeStream = Readable.fromWeb(\n response.body as ReadableStream<Uint8Array>,\n );\n\n // Track progress\n nodeStream.on(\"data\", (chunk: Buffer) => {\n downloadedBytes += chunk.length;\n\n if (onProgress && totalBytes > 0) {\n onProgress({\n downloaded: downloadedBytes,\n total: totalBytes,\n percent: (downloadedBytes / totalBytes) * 100,\n });\n }\n });\n\n // Pipe to file\n await new Promise<void>((resolve, reject) => {\n nodeStream.pipe(fileStream);\n nodeStream.on(\"error\", reject);\n fileStream.on(\"error\", reject);\n fileStream.on(\"finish\", resolve);\n });\n\n console.log(\"✅ Model downloaded successfully!\");\n console.log(`📁 Location: ${this.modelPath}`);\n } catch (error) {\n // Clean up partial download\n if (existsSync(this.modelPath)) {\n await unlink(this.modelPath);\n }\n\n throw new Error(\n `Failed to download model: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Ensure model is downloaded, download if needed\n */\n async ensureModel(\n onProgress?: (progress: DownloadProgress) => void,\n ): Promise<string> {\n if (!this.isModelAvailable()) {\n await this.downloadModel(onProgress);\n }\n\n return this.modelPath;\n }\n}\n\n/**\n * Singleton instance\n */\nexport const modelDownloader = new ModelDownloader();\n"],"mappings":";;;;;;;;;;;;AAOA,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,gBAAgB;AAQtB,IAAa,kBAAb,MAA6B;CACzB,AAAiB;CAEjB,cAAc;AACV,OAAK,YAAYA;;;;;CAMrB,eAAuB;AACnB,SAAO,KAAK;;;;;CAMhB,mBAA4B;AACxB,iCAAkB,KAAK,UAAU;;;;;CAMrC,MAAM,cACF,YACa;AACb,MAAI,KAAK,kBAAkB,EAAE;AACzB,WAAQ,IAAI,+BAA+B,KAAK,UAAU;AAC1D;;AAGJ,UAAQ,IAAI,kDAAkD;AAC9D,UAAQ,IAAI,YAAY,cAAc,IAAI;AAC1C,UAAQ,IAAI,YAAY,aAAa;AAIrC,2DAD0B,KAAK,UAAU,EAClB,EAAE,WAAW,MAAM,CAAC;EAG3C,MAAM,MAAM,0BAA0B,WAAW,gBAAgB;AAEjE,MAAI;GACA,MAAM,WAAW,MAAM,MAAM,IAAI;AAEjC,OAAI,CAAC,SAAS,GACV,OAAM,IAAI,MACN,6BAA6B,SAAS,aACzC;GAGL,MAAM,aAAa,SACf,SAAS,QAAQ,IAAI,iBAAiB,IAAI,KAC1C,GACH;AAED,OAAI,CAAC,SAAS,KACV,OAAM,IAAI,MAAM,wBAAwB;GAG5C,MAAM,4CAA+B,KAAK,UAAU;GACpD,IAAI,kBAAkB;GAGtB,MAAM,aAAaC,qBAAS,QACxB,SAAS,KACZ;AAGD,cAAW,GAAG,SAAS,UAAkB;AACrC,uBAAmB,MAAM;AAEzB,QAAI,cAAc,aAAa,EAC3B,YAAW;KACP,YAAY;KACZ,OAAO;KACP,SAAU,kBAAkB,aAAc;KAC7C,CAAC;KAER;AAGF,SAAM,IAAI,SAAe,SAAS,WAAW;AACzC,eAAW,KAAK,WAAW;AAC3B,eAAW,GAAG,SAAS,OAAO;AAC9B,eAAW,GAAG,SAAS,OAAO;AAC9B,eAAW,GAAG,UAAU,QAAQ;KAClC;AAEF,WAAQ,IAAI,mCAAmC;AAC/C,WAAQ,IAAI,gBAAgB,KAAK,YAAY;WACxC,OAAO;AAEZ,+BAAe,KAAK,UAAU,CAC1B,oCAAa,KAAK,UAAU;AAGhC,SAAM,IAAI,MACN,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACtF;;;;;;CAOT,MAAM,YACF,YACe;AACf,MAAI,CAAC,KAAK,kBAAkB,CACxB,OAAM,KAAK,cAAc,WAAW;AAGxC,SAAO,KAAK;;;;;;AAOpB,MAAa,kBAAkB,IAAI,iBAAiB"}