winget-cli

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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 }