Skip to content

[Automated] Update API Surface Area - #17846

Open
aspire-repo-bot[bot] wants to merge 1 commit into
mainfrom
update-api-diffs
Open

[Automated] Update API Surface Area#17846
aspire-repo-bot[bot] wants to merge 1 commit into
mainfrom
update-api-diffs

Conversation

@aspire-repo-bot

Copy link
Copy Markdown
Contributor

Auto-generated update to the API surface to compare current surface vs latest release. This should only be merged once this surface area ships in a new release.

Copilot AI balanced review requested due to automatic review settings June 2, 2026 18:05
@aspire-repo-bot aspire-repo-bot Bot added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Jun 2, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@github-actions

github-actions Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 17846

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 17846"

@github-actions

github-actions Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

CLI E2E Tests unknown — 110 passed, 0 failed, 2 unknown (commit eccac94)

View all recordings
- Test Detail
AddPackageInteractiveWhileAppHostRunningDetached Recording · Job · CLI logs
AddPackageWhileAppHostRunningDetached Recording · Job · CLI logs
AgentCommands_AllHelpOutputs_AreCorrect Recording · Job · CLI logs
AgentInitCommand_DefaultSelection_InstallsDefaultSkills Recording · Job · CLI logs
AgentInitCommand_MigratesDeprecatedConfig Recording · Job · CLI logs
AgentInit_NonInteractive_BundleOnlySkillsNotInCatalog Recording · Job · CLI logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp Recording · Job · CLI logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_DevLocalhost Recording · Job · CLI logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_Isolated Recording · Job · CLI logs
AllPublishMethodsBuildDockerImages Recording · Job · CLI logs
AspireAddAndStartWorkAgainstLegacyAppHostTs Recording · Job · CLI logs
AspireAddPackageVersionToDirectoryPackagesProps Recording · Job · CLI logs
AspireInitSingleFileAppHostRunsViaDotnetRunAppHost Recording · Job · CLI logs
AspireInit_ExistingAppHostDir_RecreatesNuGetConfigKeepsFiles Recording · Job · CLI logs
AspireInit_SolutionFile_BuildsAgainstChannelHive Recording · Job · CLI logs
AspireStartUpdatesStaleTypeScriptAppHostPath Recording · Job · CLI logs
AspireUpdateRemovesAppHostPackageVersionFromDirectoryPackagesProps Recording · Job · CLI logs
AspireUpdateRemovesOrphanAppHostPackageVersionWhenSdkAlreadyCurrent Recording · Job · CLI logs
Banner_DisplayedOnFirstRun Recording · Job · CLI logs
Banner_DisplayedWithExplicitFlag Recording · Job · CLI logs
Banner_NotDisplayedWithNoLogoFlag Recording · Job · CLI logs
CertificatesClean_RemovesCertificates Recording · Job · CLI logs
CertificatesTrust_WithNoCert_CreatesAndTrustsCertificate Recording · Job · CLI logs
CertificatesTrust_WithUntrustedCert_TrustsCertificate Recording · Job · CLI logs
ConfigSetGet_CreatesNestedJsonFormat Recording · Job · CLI logs
CreateAndRunAspireStarterProject Recording · Job · CLI logs
CreateAndRunAspireStarterProjectWithBundle Recording · Job · CLI logs
CreateAndRunEmptyAppHostProject Recording · Job · CLI logs
CreateAndRunJavaEmptyAppHostProject Recording · Job · CLI logs
CreateAndRunJsReactProject Recording · Job · CLI logs
CreateAndRunPolyglotAppHostWithDevLocalhostUrls Recording · Job · CLI logs
CreateAndRunPythonReactProject Recording · Job · CLI logs
CreateAndRunTypeScriptEmptyAppHostProject Recording · Job · CLI logs
CreateAndRunTypeScriptStarterProject Recording · Job · CLI logs
CreateJavaAppHostWithViteApp Recording · Job · CLI logs
CreateTypeScriptAppHostWithViteApp_UsesConfiguredToolchain Recording · Job · CLI logs
DashboardRunWithAgentMcpListTracesReturnsNoTraces Recording · Job · CLI logs
DashboardRunWithAgentMcpListTracesReturnsNoTraces_DevLocalhost Recording · Job · CLI logs
DashboardRunWithOtelTracesReturnsNoTraces Recording · Job · CLI logs
DashboardRunWithOtelTracesReturnsNoTraces_DevLocalhost Recording · Job · CLI logs
DeployK8sBasicApiService Recording · Job · CLI logs
DeployK8sWithExternalHelmChart Recording · Job · CLI logs
DeployK8sWithGarnet Recording · Job · CLI logs
DeployK8sWithMongoDB Recording · Job · CLI logs
DeployK8sWithMySql Recording · Job · CLI logs
DeployK8sWithPostgres Recording · Job · CLI logs
DeployK8sWithRabbitMQ Recording · Job · CLI logs
DeployK8sWithRedis Recording · Job · CLI logs
DeployK8sWithSqlServer Recording · Job · CLI logs
DeployK8sWithValkey Recording · Job · CLI logs
DeployTypeScriptAppToKubernetes Recording · Job · CLI logs
DescribeCommandResolvesReplicaNames Recording · Job · CLI logs
DescribeCommandShowsRunningResources Recording · Job · CLI logs
DetachFormatJsonProducesValidJson Recording · Job · CLI logs
DetachFormatJsonProducesValidJsonWhenRestartingExistingInstance Recording · Job · CLI logs
DoPublishAndDeployListStepsWork Recording · Job · CLI logs
DocsCommand_RendersInteractiveMarkdownFromLocalSource Recording · Job · CLI logs
DoctorCommand_DetectsDeprecatedAgentConfig Recording · Job · CLI logs
DoctorCommand_TypeScriptAppHostReportsMissingConfiguredToolchain Recording · Job · CLI logs
DoctorCommand_WithSslCertDir_ShowsTrusted Recording · Job · CLI logs
DoctorCommand_WithoutSslCertDir_ShowsPartiallyTrusted Recording · Job · CLI logs
GatewayWithoutExternalEndpoint_FailsPublishWithGuidance Recording · Job · CLI logs
GeneratedAspireDevScript_StartsWatchMode_WithConfiguredToolchain Recording · Job · CLI logs
GlobalMigration_HandlesCommentsAndTrailingCommas Recording · Job · CLI logs
GlobalMigration_HandlesMalformedLegacyJson Recording · Job · CLI logs
GlobalMigration_PreservesAllValueTypes Recording · Job · CLI logs
GlobalMigration_SkipsWhenNewConfigExists Recording · Job · CLI logs
GlobalSettings_MigratedFromLegacyFormat Recording · Job · CLI logs
IngressWithoutExternalEndpoint_FailsPublishWithGuidance Recording · Job · CLI logs
InitTypeScriptAppHost_AugmentsExistingViteRepoInWorkspaceSubdirectory Recording · Job · CLI logs
InteractiveCSharpInitCreatesExpectedFiles Recording · Job · CLI logs
InvalidAppHostPathWithComments_IsHealedOnRun Recording · Job · CLI logs
JavaScriptHostingApisRunFromTypeScriptAppHost Recording · Job · CLI logs
LatestCliCanStartStableChannelAppHost Recording · Job · CLI logs
LatestCliCanStartStableChannelTypeScriptAppHost Recording · Job · CLI logs
LegacySettingsMigration_AdjustsRelativeAppHostPath Recording · Job · CLI logs
LogsCommandShowsResourceLogs Recording · Job · CLI logs
OtelLogsReturnsStructuredLogsFromStarterApp Recording · Job · CLI logs
OtelLogsReturnsStructuredLogsFromStarterAppIsolated Recording · Job · CLI logs
PsCommandListsRunningAppHost Recording · Job · CLI logs
PsFormatJsonOutputsOnlyJsonToStdout Recording · Job · CLI logs
PublishJavaScriptPatternsGeneratesExpectedDockerComposeArtifacts Recording · Job · CLI logs
PublishWithConfigureEnvFileUpdatesEnvOutput Recording · Job · CLI logs
PublishWithDockerComposeServiceCallbackSucceeds Recording · Job · CLI logs
PublishWithoutOutputPathUsesAppHostDirectoryDefault Recording · Job · CLI logs
ResourceCommand_FailedExec_ShowsLogPathAndLogHasEntries Recording · Job · CLI logs
ResourceCommand_SetAndDeleteParameterUpdatesDescribeOutput Recording · Job · CLI logs
RestoreGeneratesSdkFiles Recording · Job · CLI logs
RestoreGeneratesSdkFiles_WithConfiguredToolchain Recording · Job · CLI logs
RestoreRefreshesGeneratedSdkAfterAddingIntegration Recording · Job · CLI logs
RestoreSupportsConfigOnlyHelperPackageAndCrossPackageTypes Recording · Job · CLI logs
RunFromParentDirectory_UsesExistingConfigNearAppHost Recording · Job · CLI logs
RunReportsSyntaxErrorsForDotNetAppHost Recording · Job · CLI logs
RunReportsSyntaxErrorsForTypeScriptAppHost Recording · Job · CLI logs
SecretCrudOnDotNetAppHost Recording · Job · CLI logs
SecretCrudOnTypeScriptAppHost Recording · Job · CLI logs
StagingChannel_ConfigureAndVerifySettings_ThenSwitchChannels Recording · Job · CLI logs
StartAndWaitForTypeScriptSqlServerAppHostWithNativeAssets Recording · Job · CLI logs
StartReportsSyntaxErrorsForDotNetAppHost Recording · Job · CLI logs
StartReportsSyntaxErrorsForTypeScriptAppHost Recording · Job · CLI logs
StopAllAppHostsFromAppHostDirectory Recording · Job · CLI logs
StopJavaPolyglotAppHostUsingApphostDirectory Recording · Job · CLI logs
StopNonInteractiveSingleAppHost Recording · Job · CLI logs
StopTypeScriptPolyglotAppHostUsingApphostDirectory Recording · Job · CLI logs
StopWithNoRunningAppHostExitsSuccessfully Recording · Job · CLI logs
TypeScriptAppHostRunDoesNotDeadlockWhenLazyOptionsInvokeAsyncCallback Recording · Job · CLI logs
TypeScriptAppHostWithVite_AllowsDifferentGuestPkgManager Recording · Job · CLI logs
UnAwaitedChainsCompileWithAutoResolvePromises Recording · Job · CLI logs
UpdateToStable_CSharpEmptyAppHost_KeepsConfigChannel Recording · Job · CLI logs
UpdateToStable_CSharpSingleFileInit_KeepsConfigChannel Recording · Job · CLI logs
UpdateToStable_TypeScriptSingleFileInit_KeepsConfigChannel Recording · Job · CLI logs
UpdateToStable_TypeScript_PreviewsStablePkgsAndKeepsChannel Recording · Job · CLI logs

📹 Recordings uploaded automatically from CI run #26838658119

@github-actions
github-actions Bot force-pushed the update-api-diffs branch 2 times, most recently from fe197aa to ac810bc Compare June 4, 2026 17:29
@github-actions
github-actions Bot force-pushed the update-api-diffs branch 2 times, most recently from cfe8b79 to 346b8cc Compare June 6, 2026 16:54
@github-actions
github-actions Bot force-pushed the update-api-diffs branch 3 times, most recently from fe5a901 to 84fffd3 Compare June 9, 2026 17:24
Copilot AI review requested due to automatic review settings June 10, 2026 17:40

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@github-actions
github-actions Bot force-pushed the update-api-diffs branch 2 times, most recently from e88df30 to 641f06c Compare June 12, 2026 17:32
Copilot AI review requested due to automatic review settings June 12, 2026 17:32

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Copilot AI review requested due to automatic review settings June 14, 2026 17:01

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 16 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (6)

src/Aspire.Hosting/api/Aspire.Hosting.cs:633

  • The Experimental(\"ASPIREINTERACTION001\") marker appears to have been removed from the IInteractionService type and many related interaction types, but is still applied to PromptProgressAsync (and some new progress types). This creates inconsistent analyzer behavior where older interaction APIs may become implicitly non-experimental while new ones remain experimental. If the interaction surface is intended to remain experimental, re-apply the attribute at the interface/type level (or consistently on all relevant members); if it’s intended to be stable now, remove the experimental marker from the newly added progress APIs to match.
    public partial interface IInteractionService
    {
        bool IsAvailable { get; }

src/Aspire.Hosting/api/Aspire.Hosting.cs:643

  • The Experimental(\"ASPIREINTERACTION001\") marker appears to have been removed from the IInteractionService type and many related interaction types, but is still applied to PromptProgressAsync (and some new progress types). This creates inconsistent analyzer behavior where older interaction APIs may become implicitly non-experimental while new ones remain experimental. If the interaction surface is intended to remain experimental, re-apply the attribute at the interface/type level (or consistently on all relevant members); if it’s intended to be stable now, remove the experimental marker from the newly added progress APIs to match.
        [System.Diagnostics.CodeAnalysis.Experimental("ASPIREINTERACTION001", UrlFormat = "https://aka.ms/aspire/diagnostics/{0}")]
        System.Threading.Tasks.Task<InteractionResult<bool>> PromptProgressAsync(string message, string? title = null, ProgressInteractionOptions? options = null, System.Threading.CancellationToken cancellationToken = default);
    }

src/Aspire.Hosting/api/Aspire.Hosting.cs:157

  • The [AspireExportIgnore] reason states that ContainerFileSystemCallbackContext has factory methods (createFile/createDirectory/createCertificateFile), but in this API file the ContainerFileSystemCallbackContext type (as shown later in the diff) only contains properties and no such factory methods. If those factory methods don’t exist on the public context type, the reason string should be updated to avoid referencing non-existent API; if they do exist, they should appear on the exported surface (or the reason should reference the correct type that provides them).
        [AspireExportIgnore(Reason = "Exposed to ATS via the WithContainerFilesCallbackExport shim, which accepts integer file-mode options and lets polyglot callbacks build the IEnumerable<ContainerFileSystemItem> result through ContainerFileSystemCallbackContext factory methods (createFile/createDirectory/createCertificateFile).")]
        public static ApplicationModel.IResourceBuilder<T> WithContainerFiles<T>(this ApplicationModel.IResourceBuilder<T> builder, string destinationPath, System.Func<ApplicationModel.ContainerFileSystemCallbackContext, System.Threading.CancellationToken, System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<ApplicationModel.ContainerFileSystemItem>>> callback, int? defaultOwner = null, int? defaultGroup = null, System.IO.UnixFileMode? umask = null)

src/Aspire.Hosting.Foundry/api/Aspire.Hosting.Foundry.cs:105

  • The ignore reason on the convenience overload says 'polyglot hosts must pass protocol and version explicitly', but the overload that does accept protocol and protocolVersion is also marked [AspireExportIgnore] in this diff hunk. If polyglot hosts are expected to be able to specify protocol/version via an exported API, consider exporting an ATS-friendly overload (or adjusting the reason text to reflect the actual supported polyglot entry point, e.g., the exported DTO/dispatcher shape).
        public static ApplicationModel.IResourceBuilder<T> AsHostedAgent<T>(this ApplicationModel.IResourceBuilder<T> builder, ApplicationModel.IResourceBuilder<Foundry.AzureCognitiveServicesProjectResource>? project, Foundry.HostedAgentProtocol protocol, string protocolVersion, System.Action<Foundry.HostedAgentConfiguration>? configure = null)
            where T : ApplicationModel.IResourceWithEndpoints, ApplicationModel.IResourceWithEnvironment, ApplicationModel.IComputeResource { throw null; }

        [AspireExportIgnore(Reason = "C# convenience overload; polyglot hosts must pass protocol and version explicitly.")]
        public static ApplicationModel.IResourceBuilder<T> AsHostedAgent<T>(this ApplicationModel.IResourceBuilder<T> builder, ApplicationModel.IResourceBuilder<Foundry.AzureCognitiveServicesProjectResource>? project, System.Action<Foundry.HostedAgentConfiguration>? configure = null)
            where T : ApplicationModel.IResourceWithEndpoints, ApplicationModel.IResourceWithEnvironment, ApplicationModel.IComputeResource { throw null; }

src/Aspire.Hosting/api/Aspire.Hosting.cs:688

  • Introducing a public FilePath on InteractionFile risks unintentionally exposing server-local filesystem paths (e.g., in logs/telemetry or UI rendering), which can leak sensitive environment details. Consider avoiding the raw path in the public API (e.g., make it internal, or expose a safer identifier + OpenRead()/ReadAllBytesAsync() only), or at minimum explicitly document that FilePath is server-local and should not be surfaced to untrusted clients.
    public sealed partial class InteractionFile
    {
        internal InteractionFile() { }

        public string FilePath { get { throw null; } }

src/Aspire.Hosting/api/Aspire.Hosting.cs:694

  • Introducing a public FilePath on InteractionFile risks unintentionally exposing server-local filesystem paths (e.g., in logs/telemetry or UI rendering), which can leak sensitive environment details. Consider avoiding the raw path in the public API (e.g., make it internal, or expose a safer identifier + OpenRead()/ReadAllBytesAsync() only), or at minimum explicitly document that FilePath is server-local and should not be surfaced to untrusted clients.
        public System.IO.Stream OpenRead() { throw null; }

Comment thread src/Aspire.Hosting.Go/api/Aspire.Hosting.Go.cs Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 16 changed files in this pull request and generated 2 comments.

Comments suppressed due to low confidence (3)

src/Aspire.Hosting/api/Aspire.Hosting.cs:667

  • With AspireExport(ExposeProperties = true) on InputsDialogValidationContext, the Services property will be part of the exported surface. Since it is typed as IServiceProvider (a runtime .NET type), this appears to reintroduce the exact ATS/polyglot incompatibility that the previously-present AspireExportIgnore comment indicated. Consider restoring [AspireExportIgnore] for Services (or replacing it with an ATS-safe abstraction) so the exported surface remains representable.
    [AspireExport(ExposeProperties = true)]
    public sealed partial class InputsDialogValidationContext
    {

src/Aspire.Hosting/api/Aspire.Hosting.cs:672

  • With AspireExport(ExposeProperties = true) on InputsDialogValidationContext, the Services property will be part of the exported surface. Since it is typed as IServiceProvider (a runtime .NET type), this appears to reintroduce the exact ATS/polyglot incompatibility that the previously-present AspireExportIgnore comment indicated. Consider restoring [AspireExportIgnore] for Services (or replacing it with an ATS-safe abstraction) so the exported surface remains representable.
        public required System.IServiceProvider Services { get { throw null; } init { } }

src/Aspire.Hosting/api/Aspire.Hosting.cs:1910

  • Marking ContainerBuildOptionsCallbackContext with AspireExport(ExposeProperties = true) risks exporting members that are inherently .NET-runtime-specific (IResource, IServiceProvider, ILogger, etc.). This conflicts with the earlier rationale for ignoring similar APIs for ATS. A safer approach is to avoid ExposeProperties = true here and instead explicitly export only ATS-safe properties/methods (and/or add AspireExportIgnore to runtime-typed members).
    [System.Diagnostics.CodeAnalysis.Experimental("ASPIREPIPELINES003", UrlFormat = "https://aka.ms/aspire/diagnostics/{0}")]
    [AspireExport(ExposeProperties = true)]
    public sealed partial class ContainerBuildOptionsCallbackContext
    {
        public ContainerBuildOptionsCallbackContext(IResource resource, System.IServiceProvider services, Microsoft.Extensions.Logging.ILogger logger, System.Threading.CancellationToken cancellationToken, DistributedApplicationExecutionContext executionContext) { }

Comment thread src/Aspire.Hosting/api/Aspire.Hosting.cs
Comment thread src/Aspire.Hosting.Foundry/api/Aspire.Hosting.Foundry.cs

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 16 changed files in this pull request and generated no new comments.

Suppressed comments (8)

src/Aspire.Hosting/api/Aspire.Hosting.cs:1

  • These contexts now expose both ServiceProvider (obsolete) and Services but the obsolete alias isn’t marked with AspireExportIgnore (unlike ExecuteCommandContext.ServiceProvider). If these contexts are part of the exported polyglot surface, this likely results in duplicated/ambiguous service-provider bindings. Recommend consistently applying AspireExportIgnore to the obsolete ServiceProvider aliases so polyglot consumers only see Services.
//------------------------------------------------------------------------------

src/Aspire.Hosting/api/Aspire.Hosting.cs:2867

  • These contexts now expose both ServiceProvider (obsolete) and Services but the obsolete alias isn’t marked with AspireExportIgnore (unlike ExecuteCommandContext.ServiceProvider). If these contexts are part of the exported polyglot surface, this likely results in duplicated/ambiguous service-provider bindings. Recommend consistently applying AspireExportIgnore to the obsolete ServiceProvider aliases so polyglot consumers only see Services.
        [System.Obsolete("Use Services instead.")]
        public System.IServiceProvider ServiceProvider { get { throw null; } init { } }

        public required System.IServiceProvider Services { get { throw null; } init { } }
    }

    public sealed partial class HttpCommandResultContext
    {
        public InteractionInputCollection Arguments { get { throw null; } init { } }

        public required System.Threading.CancellationToken CancellationToken { get { throw null; } init { } }

        public required EndpointReference Endpoint { get { throw null; } init { } }

src/Aspire.Hosting/api/Aspire.Hosting.cs:2004

  • In an [AspireExport] surface, keeping both ServiceProvider (obsolete) and Services risks exporting two equivalent service-provider properties to polyglot/ATS consumers, creating ambiguity and extra surface area. Consider adding AspireExportIgnore to the obsolete ServiceProvider alias (while keeping it for C# source compatibility) so Services is the single exported entry point.
    [AspireExport]
    public sealed partial class ContainerFileSystemCallbackContext
    {
        [System.Diagnostics.CodeAnalysis.Experimental("ASPIRECERTIFICATES001", UrlFormat = "https://aka.ms/aspire/diagnostics/{0}")]
        [AspireExportIgnore(Reason = "HttpsCertificateContext is an experimental certificate-specific type that is not yet part of the ATS surface.")]
        public ContainerFileSystemCallbackHttpsCertificateContext? HttpsCertificateContext { get { throw null; } set { } }

        [AspireExport]
        public required IResource Model { get { throw null; } init { } }

        [System.Obsolete("Use Services instead.")]
        public System.IServiceProvider ServiceProvider { get { throw null; } init { } }

        [AspireExport]
        public required System.IServiceProvider Services { get { throw null; } init { } }

src/Aspire.Hosting/api/Aspire.Hosting.cs:2877

  • These contexts now expose both ServiceProvider (obsolete) and Services but the obsolete alias isn’t marked with AspireExportIgnore (unlike ExecuteCommandContext.ServiceProvider). If these contexts are part of the exported polyglot surface, this likely results in duplicated/ambiguous service-provider bindings. Recommend consistently applying AspireExportIgnore to the obsolete ServiceProvider aliases so polyglot consumers only see Services.
        public required System.Net.Http.HttpResponseMessage Response { get { throw null; } init { } }

        [System.Obsolete("Use Services instead.")]
        public System.IServiceProvider ServiceProvider { get { throw null; } init { } }

        public required System.IServiceProvider Services { get { throw null; } init { } }

src/Aspire.Hosting/api/Aspire.Hosting.cs:3525

  • As with other callback contexts, consider marking the obsolete ServiceProvider alias with AspireExportIgnore to avoid exporting both serviceProvider and services to polyglot consumers. This keeps the polyglot contract smaller and reduces confusion while retaining C# compatibility via the obsolete property.
        public InteractionInputCollection Arguments { get { throw null; } init { } }

        public required System.Threading.CancellationToken CancellationToken { get { throw null; } init { } }

src/Aspire.Hosting/api/Aspire.Hosting.cs:3539

  • As with other callback contexts, consider marking the obsolete ServiceProvider alias with AspireExportIgnore to avoid exporting both serviceProvider and services to polyglot consumers. This keeps the polyglot contract smaller and reduces confusion while retaining C# compatibility via the obsolete property.
        public required string ResourceName { get { throw null; } init { } }

        [System.Obsolete("Use Services instead.")]
        public System.IServiceProvider ServiceProvider { get { throw null; } init { } }

        public required System.IServiceProvider Services { get { throw null; } init { } }

src/Aspire.Hosting/api/Aspire.Hosting.cs:700

  • Exposing a server-local FilePath on a publicly returned interaction result object can unintentionally leak internal filesystem details (absolute paths, usernames, directory structure) to consumers and logs. If callers only need to read file contents, consider removing FilePath from the public surface (or making it non-sensitive, e.g., a display name), and rely on OpenRead() / ReadAllBytesAsync() for access.
    public sealed partial class InteractionFile
    {
        internal InteractionFile() { }

        public string FilePath { get { throw null; } }

        public string Id { get { throw null; } }

        public string Name { get { throw null; } }

        public System.IO.Stream OpenRead() { throw null; }

src/Aspire.Hosting.Go/api/Aspire.Hosting.Go.cs:21

  • The new optional logOutput = \"\" default is ambiguous: an empty string can mean either “not specified” or “explicitly specify an empty log-output value”, and downstream command-line generation can end up emitting an invalid/undesired --log-output=. Consider changing this parameter to string? logOutput = null (or moving these flags into an options DTO) so callers can omit the setting cleanly.
        public static ApplicationModel.IResourceBuilder<T> WithDelveServer<T>(this ApplicationModel.IResourceBuilder<T> builder, int port = 2345, bool acceptMulticlient = true, bool? onlySameUser = null, bool continueOnStart = false, bool log = false, string logOutput = "")

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 16 changed files in this pull request and generated 1 comment.

Suppressed comments (8)

src/Aspire.Hosting/api/Aspire.Hosting.cs:1

  • The Experimental marker was removed from the IInteractionService type but is now applied only to PromptProgressAsync. This creates inconsistent analyzer/diagnostic behavior: callers may no longer see the experimental warning when using the other Prompt* APIs even though they are part of the same interaction surface. Consider either keeping the Experimental attribute on the interface (so all members are consistently marked) or applying it to each experimental member.
//------------------------------------------------------------------------------

src/Aspire.Hosting/api/Aspire.Hosting.cs:2844

  • Arguments is non-nullable but not marked required while many other init-only properties in these context types are required. That creates an inconsistent contract and allows consumers to instantiate these types without initializing Arguments (leading to null-state issues). If these contexts are framework-constructed only, consider making Arguments get-only; otherwise mark it required (or make it nullable if legitimately optional).
        public InteractionInputCollection Arguments { get { throw null; } init { } }

        public required System.Threading.CancellationToken CancellationToken { get { throw null; } init { } }

src/Aspire.Hosting/api/Aspire.Hosting.cs:2857

  • Arguments is non-nullable but not marked required while many other init-only properties in these context types are required. That creates an inconsistent contract and allows consumers to instantiate these types without initializing Arguments (leading to null-state issues). If these contexts are framework-constructed only, consider making Arguments get-only; otherwise mark it required (or make it nullable if legitimately optional).
        [System.Obsolete("Use Services instead.")]
        public System.IServiceProvider ServiceProvider { get { throw null; } init { } }

        public required System.IServiceProvider Services { get { throw null; } init { } }

src/Aspire.Hosting/api/Aspire.Hosting.cs:2864

  • Arguments is non-nullable but not marked required while many other init-only properties in these context types are required. That creates an inconsistent contract and allows consumers to instantiate these types without initializing Arguments (leading to null-state issues). If these contexts are framework-constructed only, consider making Arguments get-only; otherwise mark it required (or make it nullable if legitimately optional).
        public InteractionInputCollection Arguments { get { throw null; } init { } }

        public required System.Threading.CancellationToken CancellationToken { get { throw null; } init { } }

src/Aspire.Hosting/api/Aspire.Hosting.cs:2877

  • Arguments is non-nullable but not marked required while many other init-only properties in these context types are required. That creates an inconsistent contract and allows consumers to instantiate these types without initializing Arguments (leading to null-state issues). If these contexts are framework-constructed only, consider making Arguments get-only; otherwise mark it required (or make it nullable if legitimately optional).
        [System.Obsolete("Use Services instead.")]
        public System.IServiceProvider ServiceProvider { get { throw null; } init { } }

        public required System.IServiceProvider Services { get { throw null; } init { } }

src/Aspire.Hosting/api/Aspire.Hosting.cs:3524

  • Arguments is non-nullable but not marked required while many other init-only properties in these context types are required. That creates an inconsistent contract and allows consumers to instantiate these types without initializing Arguments (leading to null-state issues). If these contexts are framework-constructed only, consider making Arguments get-only; otherwise mark it required (or make it nullable if legitimately optional).
        public InteractionInputCollection Arguments { get { throw null; } init { } }

        public required System.Threading.CancellationToken CancellationToken { get { throw null; } init { } }

src/Aspire.Hosting/api/Aspire.Hosting.cs:3539

  • Arguments is non-nullable but not marked required while many other init-only properties in these context types are required. That creates an inconsistent contract and allows consumers to instantiate these types without initializing Arguments (leading to null-state issues). If these contexts are framework-constructed only, consider making Arguments get-only; otherwise mark it required (or make it nullable if legitimately optional).
        [System.Obsolete("Use Services instead.")]
        public System.IServiceProvider ServiceProvider { get { throw null; } init { } }

        public required System.IServiceProvider Services { get { throw null; } init { } }

src/Aspire.Hosting/api/Aspire.Hosting.cs:2004

  • ServiceProvider is now an obsolete alias for Services, but both are independently init-settable, which allows them to diverge (and ServiceProvider is non-nullable yet not required). To enforce the intended alias behavior, consider making ServiceProvider get-only and forward to Services (or otherwise ensure the two cannot be set inconsistently in the public contract).
        [AspireExport]
        public required IResource Model { get { throw null; } init { } }

        [System.Obsolete("Use Services instead.")]
        public System.IServiceProvider ServiceProvider { get { throw null; } init { } }

        [AspireExport]
        public required System.IServiceProvider Services { get { throw null; } init { } }

Comment thread src/Aspire.Hosting.Go/api/Aspire.Hosting.Go.cs Outdated
public object ResourceGroup { get { throw null; } }
public bool IsTenantScope { get { throw null; } }

public object? ResourceGroup { get { throw null; } }

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changing a readable public property from object to object? is a source-level breaking API contract change because callers must now account for null. It is not binary-breaking because nullable annotations do not change the CLR type. If it can actually return null, it is also behaviorally breaking because the range of returned values increased. See Microsoft’s nullable reference type guidance and .NET compatibility rules.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment thread src/Aspire.Hosting.Blazor/api/Aspire.Hosting.Blazor.cs
Comment thread src/Aspire.Hosting.Blazor/api/Aspire.Hosting.Blazor.cs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

API review findings — see the six inline comments for details.


public object? Subscription { get { throw null; } }

public static AzureBicepResourceScope ForSubscription(object subscription) { throw null; }

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cc David Fowler (@davidfowl)

[Naming] ForSubscription and ForTenant are static factory methods, but neither name is a verb phrase. Rename them to CreateForSubscription and CreateForTenant to follow .NET member naming conventions.

Ref: Member naming guidelines

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed by #18976

Comment thread src/Aspire.Hosting.Dotnet/api/Aspire.Hosting.Dotnet.cs Outdated
Comment thread src/Aspire.Hosting.Orleans/api/Aspire.Hosting.Orleans.cs Outdated
Comment thread src/Aspire.Hosting/api/Aspire.Hosting.cs Outdated
Comment thread src/Aspire.Hosting/api/Aspire.Hosting.cs
Comment thread src/Aspire.Hosting/api/Aspire.Hosting.cs Outdated
@sebastienros

Sébastien Ros (sebastienros) commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

API Review Summary

2 errors, 9 warnings, 0 info across 6 API files.

Top areas of concern:

  • Breaking C# and ATS compatibility changes
  • Experimental supporting types missing Experimental
  • Public annotation/orchestration types that appear assembly-internal
  • Namespace and exported-capability naming inconsistencies
  • Public API documentation that does not match runtime behavior
  • An unsealed options type without an extensibility scenario

Each finding is posted as a separate review comment for discussion.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Additional API review findings traced from the ATS surface review.

Comment thread src/Aspire.Hosting.Foundry/api/Aspire.Hosting.Foundry.cs Outdated
[AspireExport]
public static ApplicationModel.IResourceBuilder<Kubernetes.KubernetesPersistentVolumeResource> WithAccessMode(this ApplicationModel.IResourceBuilder<Kubernetes.KubernetesPersistentVolumeResource> builder, Kubernetes.PersistentVolumeAccessMode accessMode) { throw null; }

[AspireExport("withPvCapacityParam")]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cc Mitch Denny (@mitchdenny)

⚠️ [Naming] The ParameterResource overloads are exported as withPvCapacityParam and withPvStorageClassParam, while their literal overloads are withCapacity and withStorageClass. Keep overload naming parallel by using withCapacityParam / withStorageClassParam, or consistently use the full PersistentVolume term for both forms.

Ref: Member naming guidelines

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed by #18979

Comment thread src/Aspire.Hosting.Dotnet/api/Aspire.Hosting.Dotnet.cs Outdated
Comment thread src/Aspire.Hosting/api/Aspire.Hosting.cs
Comment thread src/Aspire.Hosting/api/Aspire.Hosting.cs

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 16 changed files in this pull request and generated 2 comments.

Suppressed comments (6)

src/Aspire.Hosting/api/Aspire.Hosting.cs:1

  • The Experimental(\"ASPIREINTERACTION001\") marker was removed from the interaction types (e.g., IInteractionService, InputLoadOptions, InteractionInput, etc.) and is now applied only to PromptProgressAsync. If the entire interaction surface is still considered experimental, this change makes most of the API appear stable (warnings no longer emitted) while still evolving (e.g., new InputType.File, InteractionFile, progress types). Consider restoring the Experimental attribute at the type level (or applying it consistently across all interaction-related public types) to keep the API stability signaling accurate.
//------------------------------------------------------------------------------

src/Aspire.Hosting/api/Aspire.Hosting.cs:2004

  • The obsolete ServiceProvider alias is not marked with AspireExportIgnore, unlike other contexts in this diff (e.g., ExecuteCommandContext.ServiceProvider / UpdateCommandStateContext.ServiceProvider). If the type is exported to ATS, this likely exposes two service-provider properties and undermines the intent of the rename. Consider adding AspireExportIgnore to ServiceProvider (keeping it for .NET source compatibility) and exporting only Services for polyglot surfaces.
        [AspireExport]
        public required IResource Model { get { throw null; } init { } }

        [System.Obsolete("Use Services instead.")]
        public System.IServiceProvider ServiceProvider { get { throw null; } init { } }

        [AspireExport]
        public required System.IServiceProvider Services { get { throw null; } init { } }

src/Aspire.Hosting/api/Aspire.Hosting.cs:649

  • The Experimental(\"ASPIREINTERACTION001\") marker was removed from the interaction types (e.g., IInteractionService, InputLoadOptions, InteractionInput, etc.) and is now applied only to PromptProgressAsync. If the entire interaction surface is still considered experimental, this change makes most of the API appear stable (warnings no longer emitted) while still evolving (e.g., new InputType.File, InteractionFile, progress types). Consider restoring the Experimental attribute at the type level (or applying it consistently across all interaction-related public types) to keep the API stability signaling accurate.
        [System.Diagnostics.CodeAnalysis.Experimental("ASPIREINTERACTION001", UrlFormat = "https://aka.ms/aspire/diagnostics/{0}")]
        System.Threading.Tasks.Task<InteractionResult<bool>> PromptProgressAsync(string message, string? title = null, ProgressInteractionOptions? options = null, System.Threading.CancellationToken cancellationToken = default);
    }

src/Aspire.Hosting.Kubernetes/api/Aspire.Hosting.Kubernetes.cs:187

  • AddPersistentVolume is exported and returns IResourceBuilder<KubernetesPersistentVolumeResource>, but KubernetesPersistentVolumeResource is not annotated with AspireExport (contrast with KubernetesResource which is [AspireExport(ExposeProperties = true)]). If polyglot hosts are expected to consume the returned resource/builder, the resource type typically needs an export annotation/projection; otherwise ATS bindings may be incomplete or inconsistent. Consider adding an appropriate AspireExport attribute (and exporting any required properties) for KubernetesPersistentVolumeResource.
    [System.Diagnostics.CodeAnalysis.Experimental("ASPIRECOMPUTE002", UrlFormat = "https://aka.ms/aspire/diagnostics/{0}")]
    public static partial class KubernetesPersistentVolumeExtensions
    {
        [AspireExport]
        public static ApplicationModel.IResourceBuilder<Kubernetes.KubernetesPersistentVolumeResource> AddPersistentVolume(this ApplicationModel.IResourceBuilder<Kubernetes.KubernetesEnvironmentResource> builder, string name) { throw null; }

src/Aspire.Hosting.Kubernetes/api/Aspire.Hosting.Kubernetes.cs:422

  • AddPersistentVolume is exported and returns IResourceBuilder<KubernetesPersistentVolumeResource>, but KubernetesPersistentVolumeResource is not annotated with AspireExport (contrast with KubernetesResource which is [AspireExport(ExposeProperties = true)]). If polyglot hosts are expected to consume the returned resource/builder, the resource type typically needs an export annotation/projection; otherwise ATS bindings may be incomplete or inconsistent. Consider adding an appropriate AspireExport attribute (and exporting any required properties) for KubernetesPersistentVolumeResource.
    [System.Diagnostics.CodeAnalysis.Experimental("ASPIRECOMPUTE002", UrlFormat = "https://aka.ms/aspire/diagnostics/{0}")]
    public sealed partial class KubernetesPersistentVolumeResource : ApplicationModel.Resource, ApplicationModel.IResourceWithParent<KubernetesEnvironmentResource>, ApplicationModel.IResourceWithParent, ApplicationModel.IResource
    {
        public KubernetesPersistentVolumeResource(string name, KubernetesEnvironmentResource environment) : base(default!) { }

src/Aspire.Hosting.DevTunnels/api/Aspire.Hosting.DevTunnels.cs:100

  • Enum member naming is inconsistent with common .NET acronym capitalization (e.g., UkSouth, EastUs, WestUs2). Since this is newly introduced API surface, consider using UKSouth, EastUS, EastUS2, WestUS2, WestUS3, etc., to align with established naming conventions and avoid locking in inconsistent names.
    public enum DevTunnelRegion : byte
    {
        WestEurope = 0,
        UkSouth = 1,
        NorthEurope = 2,
        EastUs = 3,
        EastUs2 = 4,
        CentralIndia = 5,
        WestUs3 = 6,
        WestUs2 = 7,
        SouthEastAsia = 8,
        BrazilSouth = 9,
        AustraliaCentral = 10,
        AustraliaEast = 11,
        JapanEast = 12
    }

Comment thread src/Aspire.Hosting/api/Aspire.Hosting.cs
public required ReferenceExpression CertificatePath { get { throw null; } init { } }

[AspireExport]
public required ReferenceExpression CertificateWithKeyPath { get { throw null; } init { } }

public required System.Collections.Generic.Dictionary<string, object> EnvironmentVariables { get { throw null; } init { } }

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 16 changed files in this pull request and generated 2 comments.

Suppressed comments (2)

src/Aspire.Hosting.Go/api/Aspire.Hosting.Go.cs:21

  • Using string logOutput = \"\" makes the default value indistinguishable from an explicit empty value. For option-style parameters where "unset" is meaningful, defaulting to null (i.e., string? logOutput = null) is typically safer and avoids accidentally emitting an empty --log-output value in downstream argument construction.
        public static ApplicationModel.IResourceBuilder<T> WithDelveServer<T>(this ApplicationModel.IResourceBuilder<T> builder, int port = 2345, bool acceptMulticlient = true, bool? onlySameUser = null, bool continueOnStart = false, bool log = false, string logOutput = "")

src/Aspire.Hosting.Foundry/api/Aspire.Hosting.Foundry.cs:988

  • It looks like HostedAgentConfiguration.ContainerProtocolVersions was removed and replaced with ProtocolVersions. Since the old member was a public API (even if AspireExportIgnore), removing it is a breaking change for .NET consumers. Consider keeping ContainerProtocolVersions as an [Obsolete] alias that forwards to ProtocolVersions to preserve binary/source compatibility.
        [AspireExportIgnore(Reason = "Azure SDK-specific type not usable from polyglot hosts.")]
        public System.Collections.Generic.IList<global::Azure.AI.Projects.Agents.ProtocolVersionRecord> ProtocolVersions { get { throw null; } init { } }

Comment thread src/Aspire.Hosting/api/Aspire.Hosting.cs
Comment thread src/Aspire.Hosting/api/Aspire.Hosting.cs

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 16 changed files in this pull request and generated 1 comment.

Suppressed comments (4)

src/Aspire.Hosting/api/Aspire.Hosting.cs:1

  • The [Experimental(\"ASPIREINTERACTION001\")] annotation appears to have been removed from the IInteractionService type itself (and from several other interaction-related types in this file), leaving only specific members marked experimental (e.g., PromptProgressAsync). Removing the attribute from the type changes the public API contract and warning behavior for consumers. If these APIs are still intended to be experimental, re-add the attribute at the type level (or apply it consistently across the interaction surface).
//------------------------------------------------------------------------------

src/Aspire.Hosting/api/Aspire.Hosting.cs:2846

  • The newly added Arguments property uses init but is not marked required, while the rest of the context uses required for init-only properties. For consistency and to avoid consumers seeing a possibly-uninitialized Arguments, consider marking Arguments as required (and similarly for the other newly added Arguments properties in result contexts, e.g., HttpCommandResultContext and ProcessCommandResultContext).
    public sealed partial class HttpCommandRequestContext
    {
        public InteractionInputCollection Arguments { get { throw null; } init { } }

        public required System.Threading.CancellationToken CancellationToken { get { throw null; } init { } }

        public required EndpointReference Endpoint { get { throw null; } init { } }

src/Aspire.Hosting/api/Aspire.Hosting.cs:2004

  • ServiceProvider is now an obsolete alias for Services, but it is still part of the exported surface of ContainerFileSystemCallbackContext (no AspireExportIgnore). This can create duplicate/ambiguous API projections for polyglot hosts. Consider adding AspireExportIgnore to ServiceProvider (while keeping it for .NET source compatibility) and exporting only Services.
        [AspireExport]
        public required IResource Model { get { throw null; } init { } }

        [System.Obsolete("Use Services instead.")]
        public System.IServiceProvider ServiceProvider { get { throw null; } init { } }

        [AspireExport]
        public required System.IServiceProvider Services { get { throw null; } init { } }

src/Aspire.Hosting.Azure/api/Aspire.Hosting.Azure.cs:527

  • The new constructor requires a non-null subscription, but the Subscription property is declared nullable (object?). This weakens the contract and makes it unclear when Subscription can actually be null. Consider making Subscription non-nullable (object) or adjusting the constructor/property/nullability semantics to match (e.g., only nullable when tenant-scope is used).
    public sealed partial class ExistingAzureResourceAnnotation : ApplicationModel.IResourceAnnotation
    {
        public ExistingAzureResourceAnnotation(object name, object? resourceGroup, object subscription) { }

        public ExistingAzureResourceAnnotation(object name, object? resourceGroup = null) { }

        public bool IsTenantScope { get { throw null; } }

        public object Name { get { throw null; } }

        public object? ResourceGroup { get { throw null; } }

        public object? Subscription { get { throw null; } }
    }

Comment thread src/Aspire.Hosting.Foundry/api/Aspire.Hosting.Foundry.cs
@github-actions

This comment has been minimized.

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Tests selector (audit mode)

The full test matrix and all jobs still run in audit mode. The tests and jobs below are what selective CI would run under enforcement.

48 / 100 test projects · 4 jobs, from 17 changed files.

Selected test projects (48 / 100)

Aspire.EndToEnd.Tests, Aspire.Hosting.Analyzers.Tests, Aspire.Hosting.Azure.Kubernetes.Tests, Aspire.Hosting.Azure.Kusto.Tests, Aspire.Hosting.Azure.Tests, Aspire.Hosting.Blazor.Tests, Aspire.Hosting.Browsers.Tests, Aspire.Hosting.CodeGeneration.Go.Tests, Aspire.Hosting.CodeGeneration.Java.Tests, Aspire.Hosting.CodeGeneration.Python.Tests, Aspire.Hosting.CodeGeneration.Rust.Tests, Aspire.Hosting.CodeGeneration.TypeScript.Tests, Aspire.Hosting.Containers.Tests, Aspire.Hosting.DevTunnels.Tests, Aspire.Hosting.Docker.Tests, Aspire.Hosting.Dotnet.Tests, Aspire.Hosting.DotnetTool.Tests, Aspire.Hosting.EntityFrameworkCore.Tests, Aspire.Hosting.Foundry.Tests, Aspire.Hosting.Garnet.Tests, Aspire.Hosting.GitHub.Models.Tests, Aspire.Hosting.Go.Tests, Aspire.Hosting.JavaScript.Tests, Aspire.Hosting.Kafka.Tests, Aspire.Hosting.Keycloak.Tests, Aspire.Hosting.Kubernetes.Tests, Aspire.Hosting.Maui.Tests, Aspire.Hosting.Milvus.Tests, Aspire.Hosting.MongoDB.Tests, Aspire.Hosting.MySql.Tests, Aspire.Hosting.Nats.Tests, Aspire.Hosting.OpenAI.Tests, Aspire.Hosting.Oracle.Tests, Aspire.Hosting.Orleans.Tests, Aspire.Hosting.PostgreSQL.Tests, Aspire.Hosting.Python.Tests, Aspire.Hosting.Qdrant.Tests, Aspire.Hosting.RabbitMQ.Tests, Aspire.Hosting.Radius.Tests, Aspire.Hosting.Redis.Tests, Aspire.Hosting.RemoteHost.Tests, Aspire.Hosting.Seq.Tests, Aspire.Hosting.SqlServer.Tests, Aspire.Hosting.Testing.Tests, Aspire.Hosting.Tests, Aspire.Hosting.Valkey.Tests, Aspire.Hosting.Yarp.Tests, Aspire.Playground.Tests

Selected jobs (4)

deployment-e2e, extension-e2e, polyglot, typescript-api-compat


How these were chosen — grouped by what changed

⚠️ 27 of the 48 selected test projects come from a single change — src/Aspire.Hosting/api/Aspire.Hosting.cs.

🔧 src/Aspire.Hosting/api/Aspire.Hosting.cs (changed source)
27 via the project graph

show 27

Aspire.Hosting.Analyzers.Tests (2 hops), Aspire.Hosting.Browsers.Tests (2 hops), Aspire.Hosting.CodeGeneration.Go.Tests, Aspire.Hosting.CodeGeneration.Java.Tests, Aspire.Hosting.CodeGeneration.Python.Tests, Aspire.Hosting.CodeGeneration.Rust.Tests, Aspire.Hosting.Containers.Tests (2 hops), Aspire.Hosting.DotnetTool.Tests (2 hops), Aspire.Hosting.Garnet.Tests (2 hops), Aspire.Hosting.JavaScript.Tests (2 hops), Aspire.Hosting.Kafka.Tests (2 hops), Aspire.Hosting.Keycloak.Tests (2 hops), Aspire.Hosting.Maui.Tests, Aspire.Hosting.Milvus.Tests (2 hops), Aspire.Hosting.MongoDB.Tests (2 hops), Aspire.Hosting.MySql.Tests (2 hops), Aspire.Hosting.Nats.Tests (2 hops), Aspire.Hosting.OpenAI.Tests (2 hops), Aspire.Hosting.Oracle.Tests (2 hops), Aspire.Hosting.PostgreSQL.Tests (2 hops), Aspire.Hosting.Python.Tests (2 hops), Aspire.Hosting.Qdrant.Tests (2 hops), Aspire.Hosting.RabbitMQ.Tests (2 hops), Aspire.Hosting.RemoteHost.Tests, Aspire.Hosting.Seq.Tests (2 hops), Aspire.Hosting.SqlServer.Tests (2 hops), Aspire.Hosting.Valkey.Tests (2 hops)

🔧 src/Aspire.Hosting.Azure.AppContainers/api/Aspire.Hosting.Azure.AppContainers.cs (changed source)
1 directly: Aspire.Hosting.Azure.Tests
2 via the project graph: Aspire.Hosting.CodeGeneration.TypeScript.Tests, Aspire.Hosting.Tests

🔧 src/Aspire.Hosting.Docker/api/Aspire.Hosting.Docker.cs (changed source)
1 directly: Aspire.Hosting.Docker.Tests
2 via the project graph: Aspire.Hosting.Kubernetes.Tests, Aspire.Hosting.Yarp.Tests

🔧 src/Aspire.Hosting.Redis/api/Aspire.Hosting.Redis.cs (changed source)
1 directly: Aspire.Hosting.Redis.Tests
2 via the project graph: Aspire.Hosting.EntityFrameworkCore.Tests (2 hops), Aspire.Hosting.Testing.Tests (2 hops)

🔧 src/Aspire.Hosting.Azure.Kubernetes/api/Aspire.Hosting.Azure.Kubernetes.cs (changed source)
2 directly: Aspire.Hosting.Azure.Kubernetes.Tests, Aspire.Hosting.Azure.Tests

🔧 src/Aspire.Hosting.Azure/api/Aspire.Hosting.Azure.cs (changed source)
1 directly: Aspire.Hosting.Azure.Tests
1 via the project graph: Aspire.Hosting.Azure.Kusto.Tests (2 hops)

🔧 src/Aspire.Hosting.Blazor/api/Aspire.Hosting.Blazor.cs (changed source)
1 directly: Aspire.Hosting.Blazor.Tests
1 via the project graph: Aspire.Playground.Tests

📦 affected project Aspire.Hosting.Redis
1 test: Aspire.EndToEnd.Tests

🔧 src/Aspire.Hosting.Azure.AppService/api/Aspire.Hosting.Azure.AppService.cs (changed source)
1 directly: Aspire.Hosting.Azure.Tests

🔧 src/Aspire.Hosting.DevTunnels/DevTunnelOptions.cs (changed source)
1 directly: Aspire.Hosting.DevTunnels.Tests

🔧 src/Aspire.Hosting.DevTunnels/api/Aspire.Hosting.DevTunnels.cs (changed source)
1 directly: Aspire.Hosting.DevTunnels.Tests

🔧 src/Aspire.Hosting.Dotnet/api/Aspire.Hosting.Dotnet.cs (changed source)
1 directly: Aspire.Hosting.Dotnet.Tests

🔧 src/Aspire.Hosting.Foundry/api/Aspire.Hosting.Foundry.cs (changed source)
1 directly: Aspire.Hosting.Foundry.Tests

🔧 src/Aspire.Hosting.GitHub.Models/api/Aspire.Hosting.GitHub.Models.cs (changed source)
1 directly: Aspire.Hosting.GitHub.Models.Tests

🔧 src/Aspire.Hosting.Go/api/Aspire.Hosting.Go.cs (changed source)
1 directly: Aspire.Hosting.Go.Tests

🔧 src/Aspire.Hosting.Kubernetes/api/Aspire.Hosting.Kubernetes.cs (changed source)
1 directly: Aspire.Hosting.Kubernetes.Tests

🔧 src/Aspire.Hosting.Orleans/api/Aspire.Hosting.Orleans.cs (changed source)
1 directly: Aspire.Hosting.Orleans.Tests

🔧 src/Aspire.Hosting.Radius/api/Aspire.Hosting.Radius.cs (changed source)
1 directly: Aspire.Hosting.Radius.Tests

Job reasons

Job Triggered by
deployment-e2e affected project Aspire.Hosting.Azure.AppContainers
extension-e2e src/Aspire.Hosting.Azure.AppContainers/api/Aspire.Hosting.Azure.AppContainers.cs, src/Aspire.Hosting.Azure.AppService/api/Aspire.Hosting.Azure.AppService.cs, src/Aspire.Hosting.Azure.Kubernetes/api/Aspire.Hosting.Azure.Kubernetes.cs, src/Aspire.Hosting.Azure/api/Aspire.Hosting.Azure.cs, src/Aspire.Hosting.Blazor/api/Aspire.Hosting.Blazor.cs, src/Aspire.Hosting.DevTunnels/DevTunnelOptions.cs, src/Aspire.Hosting.DevTunnels/api/Aspire.Hosting.DevTunnels.cs, src/Aspire.Hosting.Docker/api/Aspire.Hosting.Docker.cs, src/Aspire.Hosting.Dotnet/api/Aspire.Hosting.Dotnet.cs, src/Aspire.Hosting.Foundry/api/Aspire.Hosting.Foundry.cs, src/Aspire.Hosting.GitHub.Models/api/Aspire.Hosting.GitHub.Models.cs, src/Aspire.Hosting.Go/api/Aspire.Hosting.Go.cs, src/Aspire.Hosting.Kubernetes/api/Aspire.Hosting.Kubernetes.cs, src/Aspire.Hosting.Orleans/api/Aspire.Hosting.Orleans.cs, src/Aspire.Hosting.Radius/api/Aspire.Hosting.Radius.cs, src/Aspire.Hosting.Redis/api/Aspire.Hosting.Redis.cs, src/Aspire.Hosting/api/Aspire.Hosting.cs
• affected project Aspire.Hosting.Azure.AppContainers
polyglot affected project Aspire.Hosting.Go
typescript-api-compat affected project Aspire.Hosting.Azure.AppContainers

Selection computed for commit 1415ec4.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 16 out of 17 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/Aspire.Hosting/api/Aspire.Hosting.cs:648

  • cc @JamesNK

IInteractionService is being promoted to a stable interface, but this new abstract member remains experimental. External implementations of the stable interface are therefore forced to implement an experimental contract, and that contract cannot later evolve without breaking those implementers. Keep the interface experimental, or move progress support to a separate experimental interface/default implementation.

        System.Threading.Tasks.Task<InteractionResult<bool>> PromptProgressAsync(string message, string? title = null, ProgressInteractionOptions? options = null, System.Threading.CancellationToken cancellationToken = default);

src/Aspire.Hosting.Go/api/Aspire.Hosting.Go.cs:21

  • cc @air-hand

Replacing the existing overload with six scalar parameters leaves five optional settings on one API, making future additions difficult and producing a boolean-heavy call shape. Please preserve a small overload and move the Delve settings into an options type (or add a separate options overload) before this surface ships.

        public static ApplicationModel.IResourceBuilder<T> WithDelveServer<T>(this ApplicationModel.IResourceBuilder<T> builder, int port = 2345, bool acceptMulticlient = true, bool? onlySameUser = null, bool continueOnStart = false, bool log = false, string logOutput = "")

src/Aspire.Hosting.DevTunnels/api/Aspire.Hosting.DevTunnels.cs:85

  • cc @kola-tm

This generated baseline no longer matches the source included in this PR: DevTunnelRegion now uses the default int underlying type and defines UKSouth/SoutheastAsia, while this file still records : byte, UkSouth, and SouthEastAsia. Since this PR is specifically updating the shipped API surface, regenerate the DevTunnels baseline after the source correction.

    public enum DevTunnelRegion : byte

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 16 changed files in this pull request and generated 2 comments.

Suppressed comments (3)

src/Aspire.Hosting.Kubernetes/api/Aspire.Hosting.Kubernetes.cs:425

  • AddPersistentVolume(...) and related methods are marked [AspireExport] and return IResourceBuilder<KubernetesPersistentVolumeResource>, but the returned resource type itself isn’t annotated like other exported resource types in this file (e.g., KubernetesResource uses [AspireExport(ExposeProperties = true)]). If this resource is meant to be consumed by ATS/polyglot callers, consider adding [AspireExport(ExposeProperties = true)] to KubernetesPersistentVolumeResource so the type is part of the exportable surface consistently.
    public sealed partial class KubernetesPersistentVolumeResource : ApplicationModel.Resource, ApplicationModel.IResourceWithParent<KubernetesEnvironmentResource>, ApplicationModel.IResourceWithParent, ApplicationModel.IResource
    {
        public KubernetesPersistentVolumeResource(string name, KubernetesEnvironmentResource environment) : base(default!) { }

        public KubernetesEnvironmentResource Parent { get { throw null; } }
    }

src/Aspire.Hosting.DevTunnels/api/Aspire.Hosting.DevTunnels.cs:88

  • Enum member UkSouth is inconsistent with common .NET initialism casing (typically UKSouth). Consider renaming to UKSouth for consistency with PascalCase + initialisms (or align with whatever casing convention is already used for other region enums in the repo).
    public enum DevTunnelRegion : byte
    {
        WestEurope = 0,
        UkSouth = 1,

src/Aspire.Hosting/api/Aspire.Hosting.cs:1088

  • The exported name/method name (withRequiredCommandValidation) doesn’t match the actual API name WithRequiredCommand, which can be confusing for consumers and makes it harder to discover/align exports. If this is intended to represent a validation-specific overload, consider either (a) renaming the .NET method to reflect validation, or (b) exporting it under a name that stays consistent with WithRequiredCommand (and differentiating overloads via parameters/options).
        [AspireExport("withRequiredCommandValidation", MethodName = "withRequiredCommandValidation")]
        public static ApplicationModel.IResourceBuilder<T> WithRequiredCommand<T>(this ApplicationModel.IResourceBuilder<T> builder, string command, System.Func<ApplicationModel.RequiredCommandValidationContext, System.Threading.Tasks.Task<ApplicationModel.RequiredCommandValidationResult>> validationCallback, string? helpLink = null)

Comment thread src/Aspire.Hosting.Go/api/Aspire.Hosting.Go.cs Outdated
Comment thread src/Aspire.Hosting/api/Aspire.Hosting.cs

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 16 changed files in this pull request and generated 2 comments.

Suppressed comments (2)

src/Aspire.Hosting/api/Aspire.Hosting.cs:1

  • This change removes the prior AspireExportIgnore on InputsDialogValidationContext.Services. Since the type is exported with ExposeProperties = true, this will now export IServiceProvider to the ATS/polyglot surface. If IServiceProvider still has no ATS representation (as the removed reason text indicates), this will likely break export/codegen or produce an unusable API. Either re-add AspireExportIgnore for Services, or replace it with an ATS-compatible abstraction/handle that polyglot callers can actually consume.
//------------------------------------------------------------------------------

src/Aspire.Hosting.Azure.AppContainers/api/Aspire.Hosting.Azure.AppContainers.cs:67

  • The [Experimental(\"ASPIREACADOMAINS001\", ...)] annotation was removed from ConfigureCustomDomain. If this API is still considered experimental, dropping the attribute changes the API contract (and will remove the compile-time experimental warnings). Either restore the Experimental attribute or (if the API is now stable) consider updating release notes/changelog accordingly so consumers aren’t surprised by the behavioral change in analyzers.
        [AspireExport]
        public static void ConfigureCustomDomain(this global::Azure.Provisioning.AppContainers.ContainerApp app, ApplicationModel.IResourceBuilder<ApplicationModel.ParameterResource> customDomain, ApplicationModel.IResourceBuilder<ApplicationModel.ParameterResource> certificateName) { }

Comment on lines +987 to +988
[AspireExportIgnore(Reason = "Azure SDK-specific type not usable from polyglot hosts.")]
public System.Collections.Generic.IList<global::Azure.AI.Projects.Agents.ProtocolVersionRecord> ProtocolVersions { get { throw null; } init { } }
Comment on lines 500 to +503
[AspireValue("FoundryModels")]
public static readonly FoundryModel CohereCommandA;
[AspireValue("FoundryModels")]
public static readonly FoundryModel CohereCommandR082024;
[AspireValue("FoundryModels")]
public static readonly FoundryModel CohereCommandRPlus082024;
public static readonly FoundryModel CohereCommandAPlus052026;

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 16 changed files in this pull request and generated 1 comment.

Suppressed comments (3)

src/Aspire.Hosting/api/Aspire.Hosting.cs:1088

  • The exported name withRequiredCommandValidation doesn’t align with the method name WithRequiredCommand and (based on the signature) appears to configure both the required command and its validation callback. If the intended polyglot surface is the same concept as the .NET extension, consider exporting it under a name that matches the behavioral unit (e.g., withRequiredCommand) to avoid confusing/duplicative exports and improve discoverability.
        [System.Diagnostics.CodeAnalysis.Experimental("ASPIRECOMMAND001", UrlFormat = "https://aka.ms/aspire/diagnostics/{0}")]
        [AspireExport("withRequiredCommandValidation", MethodName = "withRequiredCommandValidation")]
        public static ApplicationModel.IResourceBuilder<T> WithRequiredCommand<T>(this ApplicationModel.IResourceBuilder<T> builder, string command, System.Func<ApplicationModel.RequiredCommandValidationContext, System.Threading.Tasks.Task<ApplicationModel.RequiredCommandValidationResult>> validationCallback, string? helpLink = null)

src/Aspire.Hosting/api/Aspire.Hosting.cs:1920

  • Setting ExposeProperties = true on a callback context can unintentionally export members whose types are not stable/serializable (e.g., logging abstractions), expanding the ATS contract more than necessary. Prefer exporting only the minimal required properties (either by omitting ExposeProperties = true and annotating specific properties with [AspireExport], or by explicitly [AspireExportIgnore]-ing any non-ATS-friendly properties) to keep the contract small and avoid export-generation failures.
    [System.Diagnostics.CodeAnalysis.Experimental("ASPIREPIPELINES003", UrlFormat = "https://aka.ms/aspire/diagnostics/{0}")]
    [AspireExport(ExposeProperties = true)]
    public sealed partial class ContainerBuildOptionsCallbackContext
    {
        public ContainerBuildOptionsCallbackContext(IResource resource, System.IServiceProvider services, Microsoft.Extensions.Logging.ILogger logger, System.Threading.CancellationToken cancellationToken, DistributedApplicationExecutionContext executionContext) { }

src/Aspire.Hosting.DevTunnels/api/Aspire.Hosting.DevTunnels.cs:93

  • Enum member naming appears inconsistent: EastUs/WestUs3 use Us, but UKSouth uses an all-caps acronym. For consistency with the surrounding members and .NET PascalCase conventions, consider renaming UKSouth to UkSouth (since this enum member is newly introduced, it’s best to correct it before consumers take a dependency).
    public enum DevTunnelRegion
    {
        WestEurope = 0,
        UKSouth = 1,
        NorthEurope = 2,
        EastUs = 3,
        EastUs2 = 4,
        CentralIndia = 5,
        WestUs3 = 6,

Comment on lines +987 to +988
[AspireExportIgnore(Reason = "Azure SDK-specific type not usable from polyglot hosts.")]
public System.Collections.Generic.IList<global::Azure.AI.Projects.Agents.ProtocolVersionRecord> ProtocolVersions { get { throw null; } init { } }

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 16 changed files in this pull request and generated 1 comment.

Suppressed comments (1)

src/Aspire.Hosting/api/Aspire.Hosting.cs:3922

  • These overrides are empty, which changes the behavior of Collection<T> (mutations become no-ops). In API/reference-assembly-style stubs elsewhere in this file, members use throw null;; these should follow the same pattern (or, if mutation is intentionally blocked at runtime, throw NotSupportedException so callers get a clear failure instead of silent no-ops).
    public sealed partial class ResourceAnnotationCollection : System.Collections.ObjectModel.Collection<IResourceAnnotation>
    {
        protected override void ClearItems() { }

        protected override void InsertItem(int index, IResourceAnnotation item) { }

        protected override void RemoveItem(int index) { }

        protected override void SetItem(int index, IResourceAnnotation item) { }

Comment on lines 20 to +31
[AspireExport]
public static ApplicationModel.IResourceBuilder<T> WithDelveServer<T>(this ApplicationModel.IResourceBuilder<T> builder, Go.DelveServerOptions? options = null)
where T : Go.GoAppResource { throw null; }

[System.Obsolete("Use WithDelveServer() or WithDelveServer(DelveServerOptions) instead.")]
[AspireExportIgnore(Reason = "This obsolete compatibility overload is C#-only. Polyglot AppHosts use the DelveServerOptions overload.")]
public static ApplicationModel.IResourceBuilder<T> WithDelveServer<T>(this ApplicationModel.IResourceBuilder<T> builder, int port = 2345)
where T : Go.GoAppResource { throw null; }

[AspireExportIgnore(Reason = "This C# convenience overload uses default options. Polyglot AppHosts use the DelveServerOptions overload.")]
public static ApplicationModel.IResourceBuilder<T> WithDelveServer<T>(this ApplicationModel.IResourceBuilder<T> builder)
where T : Go.GoAppResource { throw null; }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants