(
modelName: string,
signal: AbortSignal,
progressReporter?: (task: string, increment: number, total: number) => void,
)
| 162 | } |
| 163 | |
| 164 | async installModel( |
| 165 | modelName: string, |
| 166 | signal: AbortSignal, |
| 167 | progressReporter?: (task: string, increment: number, total: number) => void, |
| 168 | ): Promise<any> { |
| 169 | const targetModel = this.modelMap[modelName] || modelName; |
| 170 | |
| 171 | const release = await Docker.modelsBeingInstalledMutex.acquire(); |
| 172 | try { |
| 173 | if (Docker.modelsBeingInstalled.has(modelName)) { |
| 174 | throw new Error(`Model '${modelName}' is already being installed.`); |
| 175 | } |
| 176 | Docker.modelsBeingInstalled.add(modelName); |
| 177 | } finally { |
| 178 | release(); |
| 179 | } |
| 180 | |
| 181 | try { |
| 182 | // Report starting the installation |
| 183 | progressReporter?.(`Installing Docker model ${targetModel}`, 0, 100); |
| 184 | |
| 185 | // Pull the model |
| 186 | const { stdout, stderr } = await this.executeDockerCommand( |
| 187 | ["model", "pull", targetModel], |
| 188 | signal, |
| 189 | ); |
| 190 | |
| 191 | // Report completion |
| 192 | progressReporter?.( |
| 193 | `Docker model ${targetModel} installed successfully`, |
| 194 | 100, |
| 195 | 100, |
| 196 | ); |
| 197 | |
| 198 | return { success: true, stdout, stderr }; |
| 199 | } catch (error) { |
| 200 | console.error(`Failed to install Docker model ${targetModel}:`, error); |
| 201 | // Fix: Type check the error before accessing message property |
| 202 | const errorMessage = |
| 203 | error instanceof Error ? error.message : String(error); |
| 204 | throw new Error( |
| 205 | `Failed to install Docker model ${targetModel}: ${errorMessage}`, |
| 206 | ); |
| 207 | } finally { |
| 208 | const release = await Docker.modelsBeingInstalledMutex.acquire(); |
| 209 | try { |
| 210 | Docker.modelsBeingInstalled.delete(modelName); |
| 211 | } finally { |
| 212 | release(); |
| 213 | } |
| 214 | } |
| 215 | } |
| 216 | |
| 217 | public async isInstallingModel(modelName: string): Promise<boolean> { |
| 218 | const release = await Docker.modelsBeingInstalledMutex.acquire(); |
nothing calls this directly
no test coverage detected