PackageResponse.cs (7592B)
1 // ----------------------------------------------------------------------------- 2 // <copyright file="PackageResponse.cs" company="Microsoft Corporation"> 3 // Copyright (c) Microsoft Corporation. Licensed under the MIT License. 4 // </copyright> 5 // ----------------------------------------------------------------------------- 6 7 namespace WinGetMCPServer.Response 8 { 9 using Microsoft.Management.Deployment; 10 using ModelContextProtocol.Protocol; 11 using WinGetMCPServer.Extensions; 12 13 /// <summary> 14 /// Contains reusable responses for package tools. 15 /// </summary> 16 internal static class PackageResponse 17 { 18 /// <summary> 19 /// Creates a response for a ConnectResult error. 20 /// </summary> 21 /// <param name="connectResult">The connect result.</param> 22 /// <returns>The response.</returns> 23 public static CallToolResult ForConnectError(ConnectResult connectResult) 24 { 25 return new CallToolResult() 26 { 27 IsError = true, 28 Content = [new TextContentBlock() { Text = $"Failed when connecting to the package source with error: {connectResult.ExtendedErrorCode.Message} [0x{connectResult.ExtendedErrorCode.HResult:X8}]" }], 29 }; 30 } 31 32 /// <summary> 33 /// Creates a response for a FindPackagesResult error. 34 /// </summary> 35 /// <param name="findResult">The find packages result.</param> 36 /// <returns>The response.</returns> 37 public static CallToolResult ForFindError(FindPackagesResult findResult) 38 { 39 return new CallToolResult() 40 { 41 IsError = true, 42 Content = [new TextContentBlock() { Text = $"Failed when finding packages with reason {findResult.Status} and error: {findResult.ExtendedErrorCode.Message} [0x{findResult.ExtendedErrorCode.HResult:X8}]" }], 43 }; 44 } 45 46 /// <summary> 47 /// Creates a response that indicates the operation was cancelled before any changes were made. 48 /// </summary> 49 /// <returns>The response.</returns> 50 public static CallToolResult ForCancelBeforeSystemChange() 51 { 52 return new CallToolResult() 53 { 54 IsError = true, 55 Content = [new TextContentBlock() { Text = $"The operation was cancelled before any system change was started" }], 56 }; 57 } 58 59 /// <summary> 60 /// Creates a response for not finding any packages. 61 /// </summary> 62 /// <param name="identifer">The identifier used when searching.</param> 63 /// <param name="source">The source that was searched.</param> 64 /// <returns>The response.</returns> 65 public static CallToolResult ForEmptyFind(string identifer, string? source) 66 { 67 PackageIdentityErrorResult result = new() 68 { 69 Message = "Did not find a package with the requested identifier", 70 Identifier = identifer, 71 Source = source, 72 }; 73 74 return ToolResponse.FromObject(result); 75 } 76 77 /// <summary> 78 /// Creates a response for finding multiple packages when only 1 is required. 79 /// </summary> 80 /// <param name="identifer">The identifier used when searching.</param> 81 /// <param name="source">The source that was searched.</param> 82 /// <param name="findResult">The result that contains multiple packages.</param> 83 /// <returns>The response.</returns> 84 public static CallToolResult ForMultiFind(string identifer, string? source, FindPackagesResult findResult) 85 { 86 PackageIdentityErrorResult result = new() 87 { 88 Message = "Found multiple packages matching the requested identifier; provide a more specific identifier and/or source", 89 Identifier = identifer, 90 Source = source, 91 }; 92 93 result.Packages.AddPackages(findResult); 94 95 return ToolResponse.FromObject(result); 96 } 97 98 /// <summary> 99 /// Creates a response for an install operation. 100 /// </summary> 101 /// <param name="installResult">The install operation result.</param> 102 /// <param name="findResult">The post-install package data.</param> 103 /// <returns>The response.</returns> 104 public static CallToolResult ForInstallOperation(InstallResult installResult, FindPackagesResult? findResult) 105 { 106 InstallOperationResult result = new InstallOperationResult(); 107 108 switch (installResult.Status) 109 { 110 case InstallResultStatus.Ok: 111 result.Message = "Install completed successfully"; 112 break; 113 case InstallResultStatus.BlockedByPolicy: 114 result.Message = "Installation was blocked by policy"; 115 break; 116 case InstallResultStatus.CatalogError: 117 result.Message = "An error occurred with the source"; 118 break; 119 case InstallResultStatus.InternalError: 120 result.Message = "An internal WinGet error occurred"; 121 break; 122 case InstallResultStatus.InvalidOptions: 123 result.Message = "The install options were invalid"; 124 break; 125 case InstallResultStatus.DownloadError: 126 result.Message = "An error occurred while downloading the package installer"; 127 break; 128 case InstallResultStatus.InstallError: 129 result.Message = "The package installer failed during installation"; 130 break; 131 case InstallResultStatus.ManifestError: 132 result.Message = "The package manifest was invalid"; 133 break; 134 case InstallResultStatus.NoApplicableInstallers: 135 result.Message = "No applicable package installers were available for this system"; 136 break; 137 case InstallResultStatus.NoApplicableUpgrade: 138 result.Message = "No applicable upgrade was available for this system"; 139 break; 140 case InstallResultStatus.PackageAgreementsNotAccepted: 141 result.Message = "The package requires accepting agreements; please install manually"; 142 break; 143 default: 144 result.Message = "Unknown install status"; 145 break; 146 } 147 148 if (installResult.RebootRequired) 149 { 150 result.RebootRequired = true; 151 } 152 153 result.ErrorCode = installResult.ExtendedErrorCode?.HResult; 154 155 if (installResult.Status == InstallResultStatus.InstallError) 156 { 157 result.InstallerErrorCode = installResult.InstallerErrorCode; 158 } 159 160 if (findResult != null && findResult.Status == FindPackagesResultStatus.Ok && findResult.Matches?.Count == 1) 161 { 162 result.InstalledPackageInformation = PackageListExtensions.FindPackageResultFromCatalogPackage(findResult.Matches[0].CatalogPackage); 163 } 164 165 return ToolResponse.FromObject(result, installResult.Status != InstallResultStatus.Ok); 166 } 167 } 168 }