Skip to content

Merge release/13.2 into main#15151

Merged
radical merged 90 commits intomicrosoft:mainfrom
radical:ankj/backmerge-13.2-to-main
Mar 12, 2026
Merged

Merge release/13.2 into main#15151
radical merged 90 commits intomicrosoft:mainfrom
radical:ankj/backmerge-13.2-to-main

Conversation

@radical
Copy link
Member

@radical radical commented Mar 11, 2026

Description

Backmerge origin/release/13.2 into main.

This carries the latest 13.2 servicing fixes forward and preserves the release-side behavior in the handful of places where the merge needed manual intervention.

Non-trivial merge conflicts resolved in this backmerge:

  • src/Aspire.Hosting/AspireEventSource.cs: kept both additions and renumbered DevelopmentCertificateTrustCheck* to event ids 45/46 so they do not collide with DcpServiceObjectPreparation* on 43/44.
  • src/Aspire.Hosting/Dashboard/DashboardEventHandlers.cs: kept KnownEndpointNames.OtlpGrpcEndpointName / KnownEndpointNames.OtlpHttpEndpointName so the dashboard endpoint annotations continue to match the current lookup call sites.
  • src/Aspire.Hosting/Dcp/DcpExecutor.cs: kept the release-side debugging flow where executable launch configurations are applied after endpoint allocation, which preserves the JS/Azure Functions debugging behavior from the 13.2 changes.
  • tests/Aspire.Hosting.Tests/ResourceDependencyTests.cs: combined the main-side multi-resource dependency coverage with the release-side conditional ReferenceExpression coverage.
  • tests/Shared/Hex1bTestHelpers.cs: combined the shared-helper baseline with the 13.2 aspire init/aspire new agent-init flow and newer CLI E2E bundle helpers.

Original PRs involved in those areas: #14557, #14666, #14478, #14919, #14629, #14992, #15091, #15118.

CC @karolz-ms @danegsta @adamint @JamesNK @mitchdenny @eerhardt @radical @sebastienros

Validation:

  • dotnet test tests/Aspire.Hosting.Tests/Aspire.Hosting.Tests.csproj -- --filter-class "*.ResourceDependencyTests" --filter-class "*.DashboardLifecycleHookTests" --filter-class "*.DcpExecutorTests" --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true"
  • dotnet test tests/Aspire.Cli.Tests/Aspire.Cli.Tests.csproj -- --filter-class "*.UpdateCommandTests" --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true"
  • dotnet build tests/Aspire.Cli.EndToEnd.Tests/Aspire.Cli.EndToEnd.Tests.csproj -nologo

Fixes # (issue)

Checklist

  • Is this feature complete?
    • Yes. Ready to ship.
    • No. Follow-up changes expected.
  • Are you including unit tests for the changes and scenario tests if relevant?
    • Yes
    • No
  • Did you add public API?
    • Yes
      • If yes, did you have an API Review for it?
        • Yes
        • No
      • Did you add <remarks /> and <code /> elements on your triple slash comments?
        • Yes
        • No
    • No
  • Does the change make any security assumptions or guarantees?
    • Yes
      • If yes, have you done a threat model and had a security review?
        • Yes
        • No
    • No
  • Does the change require an update in our Aspire docs?

adamint and others added 30 commits March 4, 2026 08:18
* Add better WithDebugSupport extensibility API (backport of microsoft#12711 to release/13.2)

Reworks the debug support API so it's not tied to VS Code. Lets any IDE plug in
their own debug configuration by extending a common base.

Key changes:
- New class hierarchy: DebugAdapterProperties -> VSCodeDebuggerPropertiesBase -> concrete classes
- IDE detection via AspireIde class and ASPIRE_IDE env var
- Filtered annotations with optional ideType parameter
- Polymorphic JSON serialization for derived types
- VS Code extension simplified to spread debugger_properties directly

* Fix BackchannelLoggerProvider DI registration and clear launch configs on restart

- Register BackchannelLoggerProvider as both ILoggerProvider and
  IBackchannelLoggerProvider so the logging pipeline can discover it.
- Clear launch configurations annotation before re-annotating in
  CreateExecutableAsync to prevent stale configs (with null
  debugger_properties due to abstract deserialization) from accumulating
  on resource restart.

* Make WithVSCodeDebugging internal, add public WithDebugging/WithBrowserDebugger

- Made WithVSCodeDebugging internal across all packages (Hosting, JavaScript, Python)
- Added public WithDebugging methods that delegate to internal WithVSCodeDebugging:
  - WithDebugging<T>(builder, projectPath) for ProjectResource
  - WithDebugging<T>(builder, scriptPath) for NodeAppResource
  - WithDebugging<T>(builder) for JavaScriptAppResource
  - WithDebugging<T>(builder) for PythonAppResource
- WithBrowserDebugger<T>(builder, browser) remains public for JavaScriptAppResource
- Python WithDebugging is no longer [Obsolete], now marked [Experimental]
- All underlying types/infrastructure remain internal
- Removed playground calls to now-internal methods

* Make WithVSCodeCSharpDebuggerProperties, WithVSCodeNodeDebuggerProperties, WithVSCodePythonDebuggerProperties internal; split WithBrowserDebugger into public (no config) + internal (with config)

* Fix JavaScript hosting: make WithVSCodeNodeDebuggerProperties internal, split WithBrowserDebugger into public/internal overloads

* Make all debug infrastructure types internal, fix csproj IVT entries and shared file includes

* Simplify debug infrastructure and add tests

- Fix Path.GetDirectoryName null-bypass with safe fallback
- Move JS debugger property defaults (SkipFiles, SourceMaps, AutoAttachChildProcesses) to field initializers
- Fix empty Python interpreter path: fallback to 'python' with warning
- Add 11 new tests across Hosting, JavaScript, and Python debug tests
…on (microsoft#14914)

* Add DebugSessionOptions type and thread through RPC layer

* Advertise CLI capabilities including pipelines in config info

* Add extension context interception and --start-debug-session to pipeline commands

* Support deploy/publish/do commands in AspireDebugSession

* Add deploy, publish, and do commands to VS Code extension

* Add DebugSessionOptions support and displayLines fallback in InteractionService

* Add SimplePipelines playground project

* Reduce noisy logging and validate single-file apphosts in ProjectLocator

* Prompt for missing pipeline step in DoCommand via interaction service

* Update extension README with deploy, publish, and do command documentation

* Add clarifying comment on NoExtensionLaunch flag
* Auto-register Aspire MCP server in VS Code extension

Register McpServerDefinitionProvider so the Aspire MCP server
(aspire agent mcp) appears automatically in VS Code's MCP tools
list for Aspire workspaces, eliminating the need for users to
run 'aspire agent init' or manually configure .vscode/mcp.json.

* Update extension/src/mcp/AspireMcpServerDefinitionProvider.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update extension/src/mcp/AspireMcpServerDefinitionProvider.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* add a setting whether to register mcp (false by default)

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…microsoft#14483)

* Make app provisioning wait for role assignments and private endpoints

* Update code to use DeploymentPrerequisitesAnnotation

* Add private endpoints to tests

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
* Complete polyglot exports for Aspire.Hosting.Redis

* Update settings.json to remove sdkVersion

Removed sdkVersion and cleared Aspire.Hosting.Redis version.

* PR feedback
* Fix TypeScriptAppHost playground app

Fixes microsoft#14927

* Fix ReferenceExpression to support handle-based construction in TypeScript SDK

The generated TypeScript SDK calls `new ReferenceExpression(handle, client)`
for server-returned properties like uriExpression and jdbcConnectionString,
but the constructor was private and only accepted (format, valueProviders).

This caused TS2673 compilation errors in all polyglot TypeScript apps.

Changes:
- Make constructor public with dual-mode support (expression + handle)
- Add constructor overloads to enforce valid parameter pairing at compile time
- Store _client field for forward compatibility with other handle-wrapping types
- Update toJSON() to delegate to handle serialization in handle mode
- Update verified snapshot to match

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Include TypeScriptAppHost .aspire/settings.json in source control

Add a local .gitignore to override the global .aspire/ exclusion,
so that integration packages are tracked for this playground app.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ourceWithConnectionString resources (microsoft#14953)

* Fix TypeScript codegen: merge options interface params across overloads

The RegisterOptionsInterface method used first-write-wins when the same
method name appeared on multiple resource types. This caused parameter
loss — e.g., WithDataVolumeOptions was missing isReadOnly because
RedisInsightResource.WithDataVolume (name only) was registered before
RedisResource.WithDataVolume (name + isReadOnly).

Now merges all optional parameters across registrations by name,
producing a union interface. Also regenerates base.ts (ReferenceExpression
handle-mode constructor) across all polyglot playground apps.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add test for options interface parameter merging across overloads

Adds WithDataVolume methods on both TestRedisResource (name + isReadOnly)
and TestDatabaseResource (name only) to reproduce the codegen bug where
first-write-wins caused parameters to be lost. The test verifies that
the generated WithDataVolumeOptions interface contains the union of all
parameters.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add ExposeProperties to all IResourceWithConnectionString resources and include ConnectionStringExpression

- Add [AspireExport(ExposeProperties = true)] to 15 resource classes (Garnet, Valkey,
  Kafka, Milvus×2, MongoDB×2, MySql×2, Nats, Qdrant, RabbitMQ, Seq, SqlServer×2)
- Remove [AspireExportIgnore] from ConnectionStringExpression on PostgreSQL and Oracle
  resources (4 files) to include connection strings in polyglot exports
- Add [AspireExportIgnore] on Databases dictionaries (non-ATS types) for server resources
- Regenerate TypeScript SDKs for all 14 affected integrations
- Add connectionStringExpression.get() access in all validation apphost.ts files
- All 14 apps pass TypeScript compilation

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ft#14931)

* refactor: use Sigstore attestation helper APIs for provenance checking

Replace manual JSON parsing in SigstoreNpmProvenanceChecker with the
new attestation APIs already available in Sigstore 0.3.0:

- Remove ParseAttestation (~80 lines) and ParseProvenanceFromStatement
  (~20 lines) methods and NpmAttestationParseResult class
- Add ExtractSlsaBundleJson to extract bundle JSON from npm response
- Add ExtractProvenanceFromResult using VerificationResult.Statement
  (InTotoStatement) and VerifiedIdentity.Extensions (FulcioCertificateExtensions)
- Use bundle.DsseEnvelope.Payload directly instead of manual base64 decode
- Prefer certificate extensions (cryptographically bound) over SLSA
  predicate values for source repository and ref
- Fix JsonArray safety: use pattern matching instead of AsArray()

Add comprehensive adversarial/security tests (68 total):
- Malformed JSON attacks (deeply nested, truncated, wrong types, null)
- Attestation structure manipulation (swapped predicates, mixed arrays)
- Provenance spoofing (homoglyph URLs, path traversal, null bytes)
- Build type spoofing (query params, wrong domains, empty values)
- URL parsing edge cases (subdomain attacks, non-absolute URIs)
- WorkflowRefInfo parsing edge cases (path traversal in names)
- Statement extraction edge cases (missing fields, empty predicates)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: remove non-Sigstore NpmProvenanceChecker codepath

Delete NpmProvenanceChecker and its tests — production code only uses
SigstoreNpmProvenanceChecker (registered in DI), so the non-Sigstore
fallback was dead code.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Address PR review: type-safe JSON handling and richer error reporting

- ExtractSlsaBundleJson now returns 'out bool parseFailed' to distinguish
  invalid JSON (AttestationParseFailed) from missing SLSA provenance
  (SlsaProvenanceNotFound)
- Add explicit JsonObject type checks when iterating attestation array
  elements so non-object values (strings, numbers, null) are safely skipped
- Replace GetProperty/GetString with TryGetProperty + ValueKind checks
  in ExtractProvenanceFromResult to handle wrong-typed predicate values
  without throwing InvalidOperationException
- Fix misleading comment about CertificateExtensionPolicy; the actual
  enforcement is CertificateIdentity.ForGitHubActions SAN/issuer matching
- Fix deeply nested JSON test to use valid JSON structure
- Add tests for non-object array elements, non-string predicateType,
  wrong-typed predicate values, and parseFailed assertions

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Apply pattern matching suggestion for JsonArray count check

Use property pattern matching (JsonArray { Count: >0 }) instead of
separate is-check and Count comparison, as suggested by @DamianEdwards.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add AspireExport coverage for Orleans

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Update src/Aspire.Hosting.Orleans/OrleansServiceExtensions.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/Aspire.Hosting.Orleans/OrleansServiceClientExtensions.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix XML documentation return tags in OrleansServiceExtensions

* Address review feedback for polyglot-orleans

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Rename Orleans WithReference export IDs to match naming conventions

Rename withSiloReference → withOrleansReference and
withClientReference → withOrleansClientReference to follow the pattern
used by other integrations (e.g., withServiceReference for
IResourceWithServiceDiscovery).

Update playground ValidationAppHost and regenerate TypeScript SDK.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Cleanup settings.json

Removed sdkVersion and cleared Aspire.Hosting.Orleans version.

* Regenerate Orleans playground after rebase on release/13.2

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…soft#14958)

The aspire init command now shows a language selection prompt when
multiple languages are available (C#, TypeScript). The 12 failing
deployment tests did not handle this new prompt, causing them to
timeout waiting for 'Aspire initialization complete'.

Adding --language csharp explicitly skips the language prompt,
restoring the expected test flow.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add notRequired parameter to PromptForSelectionsAsync

Add a notRequired parameter (default false) to PromptForSelectionsAsync across the interface, all implementations, and test services. When true, the Spectre.Console MultiSelectionPrompt allows submitting without selecting any items. Enable notRequired at all three existing call sites (InitCommand and AgentInitCommand) since they all handle empty selections gracefully.

* Rename TestConsoleInteractionService to TestInteractionService and consolidate duplicates

- Renamed TestConsoleInteractionService to TestInteractionService across all test files
- Enhanced shared implementation with response queue, call tracking, and cancellation support
- Removed TestConsoleInteractionServiceWithPromptTracking from PublishCommandPromptingIntegrationTests (merged into shared impl)
- Removed OrderTrackingInteractionService from NewCommandTests (replaced with shared impl + callback)
- Removed private TestInteractionService stub from DotNetTemplateFactoryTests (uses shared impl)
- Kept CancellationTrackingInteractionService as-is (decorator pattern, different purpose)

* Code clean up

* Rename notRequired parameter to optional in PromptForSelectionsAsync

The double-negative naming pattern (notRequired: false meaning 'required') was
confusing at call sites. Renamed to 'optional' for clarity across the interface,
all implementations, and call sites.
…microsoft#14967)

* Add TypeScript Express/React deployment E2E test

Add TypeScriptExpressDeploymentTests that deploys the ts-starter template to Azure Container Apps. Also:
- Export PublishWithContainerFiles via [AspireExport] for polyglot apphost usage
- Update Express API template to serve static files from ./static directory when present (deploy mode)

The deployment bundles the Vite frontend into the Express API container via publishWithContainerFiles, matching the pattern used by the Python FastAPI template.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add withExternalHttpEndpoints to ts-starter template

The API endpoint needs to be marked as external so it gets
exposed publicly when deployed (Docker Compose or ACA).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Rename ts-starter resource from 'api' to 'app' for consistency with Python template

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Simplify static file imports using import.meta.dirname

Node 22 supports import.meta.dirname natively, removing the
need for the fileURLToPath/dirname workaround.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add await to publishWithContainerFiles call in template

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Update codegen snapshots for PublishWithContainerFiles export

The [AspireExport] attribute on PublishWithContainerFiles causes
the method and IContainerFilesDestinationResource type to appear
in the TwoPassScanning codegen output for all languages.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix React template env vars to match resource name

The apphost names the resource 'app', so the environment variables
injected by Aspire are APP_HTTP/APP_HTTPS, not API_HTTP/API_HTTPS.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Write channel to settings.json during aspire new for CLI templates

When aspire new resolves a version from an explicit channel (e.g. local,
daily), persist the channel name in .aspire/settings.json so that
subsequent aspire add commands use the same channel without prompting.

Implicit channels (stable/nuget.org) are not written, keeping the
default behavior.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
* Fix Azure SQL Server private endpoints

Added support for Azure SQL Server deployment scripts in private endpoint scenarios, enabling secure, automated database role assignments for managed identities.

Deployment scripts need to be part of the vnet and need Azure Storage accounts to mount file shares.

Introduced resource annotations and preparer classes to detect and configure ACI subnet and storage account infrastructure, with both automatic and explicit configuration options. Implemented subnet address allocation logic, updated Bicep modules and manifest files, and ensured scripts run in delegated subnets with proper outbound rules and Azure Files access. Added tests to verify all configuration combinations. Updated project references and dependencies.

Fix microsoft#14421

* Add dependsOn for the private endpoints to the deploymentScript

The deploymentScript can't run until the private endpoints are ready.

* Add retries to the sql role assignment script

* Remove all implicit resources if the SQL Server doesn't have a DefaultRoleAssignmentsAnnotation.

This happens when ClearDefaultRoleAssignments is called on the sql server, which suppresses the deployment script. If the deployment script isn't needed, these resources aren't needed.
* Fail fast when CLI download fails in E2E tests

Add WaitForSuccessPromptFailFast to Hex1bTestHelpers that watches for
both OK and ERR prompts. When the CLI artifact download fails (e.g.
HTTP 502), the test now throws immediately instead of waiting the full
5-minute timeout.

Updated InstallAspireCliFromPullRequest, InstallAspireCliVersion,
InstallAspireBundleFromPullRequest, and InstallAspireCliRelease to
use the new fail-fast method.

Fixes microsoft#14933

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix InstallAspireCliFromPullRequest to use WaitForSuccessPromptFailFast (microsoft#14935)

* Initial plan

* Update InstallAspireCliFromPullRequest to use WaitForSuccessPromptFailFast

Co-authored-by: radical <1472+radical@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: radical <1472+radical@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: radical <1472+radical@users.noreply.github.com>
Also bump Azure.ResourceManager.Resources to the latest version - 1.11.2
* Chain aspire agent init from aspire init and aspire new on success

After successful project creation via 'aspire init' or 'aspire new', prompt
the user to configure AI agent environments. The prompt is skipped in
non-interactive mode.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

# Conflicts:
#	src/Aspire.Cli/Resources/InitCommandStrings.Designer.cs
#	src/Aspire.Cli/Resources/InitCommandStrings.resx
#	src/Aspire.Cli/Resources/xlf/InitCommandStrings.cs.xlf
#	src/Aspire.Cli/Resources/xlf/InitCommandStrings.de.xlf
#	src/Aspire.Cli/Resources/xlf/InitCommandStrings.es.xlf
#	src/Aspire.Cli/Resources/xlf/InitCommandStrings.fr.xlf
#	src/Aspire.Cli/Resources/xlf/InitCommandStrings.it.xlf
#	src/Aspire.Cli/Resources/xlf/InitCommandStrings.ja.xlf
#	src/Aspire.Cli/Resources/xlf/InitCommandStrings.ko.xlf
#	src/Aspire.Cli/Resources/xlf/InitCommandStrings.pl.xlf
#	src/Aspire.Cli/Resources/xlf/InitCommandStrings.pt-BR.xlf
#	src/Aspire.Cli/Resources/xlf/InitCommandStrings.ru.xlf
#	src/Aspire.Cli/Resources/xlf/InitCommandStrings.tr.xlf
#	src/Aspire.Cli/Resources/xlf/InitCommandStrings.zh-Hans.xlf
#	src/Aspire.Cli/Resources/xlf/InitCommandStrings.zh-Hant.xlf

* Set default test environment to non-interactive

Unit tests should not prompt for interactive input. This prevents the
agent init prompt from blocking tests that use ConsoleInteractionService.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Handle agent init prompt in E2E tests

Add DeclineAgentInitPrompt() shared helper to Hex1bTestHelpers.
Insert prompt handling in all CLI E2E and deployment E2E tests that
use aspire new or aspire init. Also add RunAspireInit helper to
DeploymentE2ETestHelpers.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Address PR feedback: consolidate agent init chaining logic

- Extract shared PromptAndChainAsync method on AgentInitCommand,
  removing duplicate PromptAndRunAgentInitAsync from InitCommand
  and NewCommand
- Remove unused ParseResult parameter from the chaining overload
- PR description will be updated to reflect defaultValue: true
  (opt-out behavior, pressing Enter accepts agent init)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Address round 2 feedback: move prompt to SharedCommandStrings, rename param

- Move PromptRunAgentInit from InitCommandStrings/NewCommandStrings to
  SharedCommandStrings and hardcode inside PromptAndChainAsync
- Remove promptString parameter from PromptAndChainAsync
- Rename previousResult to previousResultExitCode for clarity

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…/call (microsoft#14837)

* Update Aspire skill to use CLI commands, rework agent init, add aspire mcp tools/call

## Skill updates
- Replace all MCP server tool references with CLI command equivalents
- Use aspire start (not aspire run) for agents, --isolated for worktrees
- Add aspire wait, aspire mcp tools, aspire mcp call to command table
- Restore USE FOR/DO NOT USE FOR routing tags in frontmatter
- Explicit rules: never use aspire run, restart via aspire start

## Agent init rework
- Single flat prompt instead of 3 grouped prompts
- Skill file pre-selected (Recommended), MCP server opt-in (last)
- Playwright CLI shown as separate option
- Deprecated config migrations applied silently
- Categorization via McpInitPromptGroup (SkillFiles, Tools, AgentEnvironments)
- Shows which environments were configured after applying
- preSelected parameter added to PromptForSelectionsAsync

## New CLI commands
- aspire mcp tools: list MCP tools from running resources via backchannel
- aspire mcp call <resource> <tool> --input <json>: invoke resource MCP tools

Fixes microsoft#14619
Fixes microsoft#14856

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix review issues: JSON input validation, extension backchannel comment, restore TryDequeue

- McpCallCommand: Validate JSON input is an object before calling
  EnumerateObject() to avoid unhandled InvalidOperationException
  for array/primitive inputs.
- ExtensionInteractionService: Add comment documenting that the
  extension backchannel protocol does not yet support preSelected.
- TestInteractionService: Restore _responses.TryDequeue call to
  maintain queue consumption behavior for existing tests.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
…feature flag is disabled (microsoft#14997)

* Initial plan

* Hide staging channel from aspire update --self when feature flag is disabled

When the stagingChannelEnabled feature flag is not set, the staging
channel is now excluded from the channel selection prompt in
`aspire update --self`. Previously, staging was always shown regardless
of the feature flag, which caused failures when users selected it.

Co-authored-by: davidfowl <95136+davidfowl@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: davidfowl <95136+davidfowl@users.noreply.github.com>
* Refactor DefaultAzureCredential usage

Using the parameterless ctor of DefaultAzureCredential is not recommended. Instead try to detect when we are running in Azure and use Azure credentials. Fallback to using just development credentials when we can't detect we are in Azure.

Users can always provide their own to override this behavior.

* Update to latest Azure.Identity and use the correct ctor now that the parameterless ctor is obsolete.

* Update README docs with the latest information.
* Enhance aspire sdk dump: multi-integration args, PackageName@Version support, and DTO field descriptions

* Enhance SdkDumpCommand validation for package format and version, add tests for command behavior

* Enhance `aspire sdk dump` (microsoft#15005)

* Initial plan

* Address PR review feedback: --format option, debug logging, test improvements, allAdditionalSources cleanup

Co-authored-by: IEvangelist <7679720+IEvangelist@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: IEvangelist <7679720+IEvangelist@users.noreply.github.com>

---------

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: IEvangelist <7679720+IEvangelist@users.noreply.github.com>
…crosoft#15017)

* Hide available features in 'aspire config list' behind --available flag

The list of available feature flags was scrolling the set configuration
off the screen. Now 'aspire config list' shows a hint to use --available,
and 'aspire config list --available' shows the full feature list.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Address PR feedback: rename --available to --all, hoist header, add tests

- Rename --available flag to --all (matches established CLI conventions)
- Hoist shared empty line + header above the conditional to reduce duplication
- Add tests for both config list paths (hint without --all, details with --all)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ft#15016)

* Add per-OS custom GitHub runner support to test matrix

Allow test projects to override GitHub Actions runners per OS via
MSBuild properties (GithubActionsRunnerWindows/Linux/MacOS). The
custom runners flow through metadata JSON → canonical matrix → GitHub
expansion, falling back to defaults when unset.

Also switch run-tests.yml OS detection from inputs.os string matching
to runner.os, which works correctly with non-standard runner names.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* build cli with 8core

* Apply suggestions from code review

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Use 8-core Ubuntu runner for Aspire.Hosting.Tests in CI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix IDE2000: remove multiple blank lines

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add Qdrant polyglot export coverage

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Refine Qdrant polyglot export coverage

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix comments

* Fix Qdrant review feedback

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…persistence (microsoft#14988)

- Move InstallAspireBundleFromPullRequest and SourceAspireBundleEnvironment
  to shared Hex1bTestHelpers for use by both CLI E2E and deployment tests
- Update TS deployment test to install full bundle (needed for polyglot aspire add)
- Restore channel persistence in aspire new for explicit channels

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
sebastienros and others added 5 commits March 11, 2026 12:24
* Fix AspireExport coverage for hosting integrations

Enable the AspireExport analyzer for Aspire.Hosting projects and resolve the diagnostics it reported across the affected integrations.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Update src/Directory.Build.targets

Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>

* Limit AspireExport analyzer to integrations

Exclude helper Aspire.Hosting projects from the shared analyzer wiring so AppHostAnalyzer only runs on the intended integration-style projects.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Revert "Limit AspireExport analyzer to integrations"

This reverts commit 173298d.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Handle missing AppHost analyzer types

Make AppHostAnalyzer skip model-name analysis when Aspire.Hosting model-name types are unavailable, and add a regression test covering projects without the Aspire.Hosting reference.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix polyglot DevTunnels validation

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix ATS dump workflow failures

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix comments

* Fix YARP polyglot export validation

Refresh the YARP validation playground to use the exported helper surface and update code generation snapshots for the current exported APIs.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
…#15118)

* Add Azure Functions debugging support to VS Code extension

Enable debugging Azure Functions projects in the Aspire VS Code extension
by integrating with the Azure Functions extension API (startFuncProcess).

When the Azure Functions VS Code extension is installed, the extension
reports the 'azure-functions' capability. The hosting side uses a custom
SupportsDebuggingAnnotation with type 'azure-functions' so DcpExecutor
sends the launch configuration to the extension instead of using the
default ProjectLaunchConfiguration. The extension then calls the AF
extension's startFuncProcess API to launch func host start and attaches
a coreclr debugger to the worker process.

When the AF extension is not installed, the capability is not reported
and the resource falls back to ExecutionType.Process (dotnet run).

* Introduce generic run cleanup registry; replace killFuncProcess call sites

Replace direct killFuncProcess calls in AspireDcpServer and AspireDebugSession
with a generic cleanupRun(runId) abstraction backed by runCleanupRegistry.ts.
azureFunctions.ts registers its own cleanup handler via registerRunCleanup early
in createDebugSessionConfigurationCallback; killFuncProcess is now private.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add transient CI rerun workflow automation

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add C# tests for transient CI rerun workflow

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Tighten transient rerun workflow coverage

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Remove transient rerun zip fallback

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Conflict resolutions:
- kept both AspireEventSource additions and renumbered DevelopmentCertificateTrustCheck to event ids 45/46 to avoid duplicate EventSource ids with DcpServiceObjectPreparation 43/44
- kept KnownEndpointNames OTLP endpoint names in DashboardEventHandlers so the added endpoints match current endpoint lookup usage
- kept the release-side DcpExecutor debugging flow so executable launch configurations are applied after endpoint allocation
- combined main-side multi-resource dependency tests with release-side conditional ReferenceExpression tests
- combined the shared Hex1b helper baseline with release-side agent-init/new-flow and bundle helper additions

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions
Copy link
Contributor

github-actions bot commented Mar 11, 2026

🚀 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/dotnet/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 15151

Or

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

@radical radical marked this pull request as ready for review March 12, 2026 00:00
Copilot AI review requested due to automatic review settings March 12, 2026 00:00
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Backmerge of release/13.2 into main, carrying forward 13.2 servicing fixes and resolving merge conflicts, plus updates to TypeScript ATS transport behavior, VS Code extension capabilities/debugging, CI/test-matrix tooling, and multiple playground samples.

Changes:

  • Update ATS TypeScript transport to support DTO writeback semantics for void callbacks and extend ReferenceExpression to support handle-serialization mode.
  • Update playground validation AppHosts/samples (new role-assignment APIs, new Azure Kusto/AppService validation hosts, Foundry samples, pipelines sample, etc.).
  • Enhance VS Code extension with MCP server definition provider, new debugger types (node/browser/azure-functions), and CI/test runners with custom runner + os-split NuGet matrices.

Reviewed changes

Copilot reviewed 246 out of 1434 changed files in this pull request and generated 12 comments.

Show a summary per file
File Description
playground/polyglot/TypeScript/Aspire.Hosting.Azure.WebPubSub/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.WebPubSub/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.WebPubSub/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Storage/ValidationAppHost/apphost.ts Update to new storage role-assignment API
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Storage/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Storage/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Storage/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Sql/ValidationAppHost/apphost.ts Expand SQL validation coverage + storage dependency
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Sql/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Sql/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Sql/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Sql/ValidationAppHost/.aspire/settings.json Add Azure Storage package for SQL host
playground/polyglot/TypeScript/Aspire.Hosting.Azure.SignalR/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.SignalR/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.SignalR/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/polyglot/TypeScript/Aspire.Hosting.Azure.ServiceBus/ValidationAppHost/apphost.ts Update to new Service Bus role-assignment API
playground/polyglot/TypeScript/Aspire.Hosting.Azure.ServiceBus/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.ServiceBus/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.ServiceBus/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Search/ValidationAppHost/apphost.ts Update to new Search role-assignment API
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Search/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Search/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Search/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Redis/ValidationAppHost/apphost.ts Expand Redis validation scenarios/props
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Redis/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Redis/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Redis/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/polyglot/TypeScript/Aspire.Hosting.Azure.PostgreSQL/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.PostgreSQL/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.PostgreSQL/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/polyglot/TypeScript/Aspire.Hosting.Azure.OperationalInsights/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.OperationalInsights/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.OperationalInsights/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Kusto/ValidationAppHost/tsconfig.json New TS config for Kusto validation host
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Kusto/ValidationAppHost/package.json Node/TS deps for Kusto validation host
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Kusto/ValidationAppHost/apphost.ts New Kusto cluster emulator validation
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Kusto/ValidationAppHost/apphost.run.json Local run profile for Kusto validation
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Kusto/ValidationAppHost/.modules/.codegen-hash Codegen hash for Kusto modules
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Kusto/ValidationAppHost/.aspire/settings.json Aspire settings for Kusto validation
playground/polyglot/TypeScript/Aspire.Hosting.Azure.KeyVault/ValidationAppHost/apphost.ts Update to new KeyVault role-assignment API
playground/polyglot/TypeScript/Aspire.Hosting.Azure.KeyVault/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.KeyVault/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.KeyVault/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Functions/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Functions/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.Functions/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/polyglot/TypeScript/Aspire.Hosting.Azure.EventHubs/ValidationAppHost/apphost.ts Update to new EventHubs role-assignment API
playground/polyglot/TypeScript/Aspire.Hosting.Azure.EventHubs/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.EventHubs/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.EventHubs/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/polyglot/TypeScript/Aspire.Hosting.Azure.CosmosDB/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.CosmosDB/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.CosmosDB/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/polyglot/TypeScript/Aspire.Hosting.Azure.ContainerRegistry/ValidationAppHost/apphost.ts Expand ACR validation incl. env hookup + roles
playground/polyglot/TypeScript/Aspire.Hosting.Azure.ContainerRegistry/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.ContainerRegistry/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.ContainerRegistry/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/polyglot/TypeScript/Aspire.Hosting.Azure.ContainerRegistry/ValidationAppHost/.aspire/settings.json Add AppContainers package dependency
playground/polyglot/TypeScript/Aspire.Hosting.Azure.CognitiveServices/ValidationAppHost/apphost.ts Update to new CognitiveServices role-assignment API
playground/polyglot/TypeScript/Aspire.Hosting.Azure.CognitiveServices/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.CognitiveServices/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.CognitiveServices/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/polyglot/TypeScript/Aspire.Hosting.Azure.ApplicationInsights/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.ApplicationInsights/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.ApplicationInsights/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/polyglot/TypeScript/Aspire.Hosting.Azure.AppService/ValidationAppHost/tsconfig.json New TS config for AppService validation host
playground/polyglot/TypeScript/Aspire.Hosting.Azure.AppService/ValidationAppHost/package.json Node/TS deps for AppService validation host
playground/polyglot/TypeScript/Aspire.Hosting.Azure.AppService/ValidationAppHost/apphost.ts New AppService validation host
playground/polyglot/TypeScript/Aspire.Hosting.Azure.AppService/ValidationAppHost/apphost.run.json Local run profile for AppService validation
playground/polyglot/TypeScript/Aspire.Hosting.Azure.AppService/ValidationAppHost/.modules/transport.ts Transport comment/BOM + DTO writeback behavior
playground/polyglot/TypeScript/Aspire.Hosting.Azure.AppService/ValidationAppHost/.modules/.codegen-hash Codegen hash for AppService modules
playground/polyglot/TypeScript/Aspire.Hosting.Azure.AppService/ValidationAppHost/.aspire/settings.json Aspire settings for AppService validation
playground/polyglot/TypeScript/Aspire.Hosting.Azure.AppService/.aspire/settings.json Package language settings for AppService sample
playground/polyglot/TypeScript/Aspire.Hosting.Azure.AppContainers/ValidationAppHost/apphost.ts Use container app job API for executables
playground/polyglot/TypeScript/Aspire.Hosting.Azure.AppContainers/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.AppContainers/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.AppContainers/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/polyglot/TypeScript/Aspire.Hosting.Azure.AppConfiguration/ValidationAppHost/apphost.ts Update to new AppConfiguration role-assignment API
playground/polyglot/TypeScript/Aspire.Hosting.Azure.AppConfiguration/ValidationAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/polyglot/TypeScript/Aspire.Hosting.Azure.AppConfiguration/ValidationAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/polyglot/TypeScript/Aspire.Hosting.Azure.AppConfiguration/ValidationAppHost/.modules/.codegen-hash Regenerated module hash
playground/TypeScriptAppHost/vite-frontend/vite.config.ts Formatting/semicolons
playground/TypeScriptAppHost/vite-frontend/src/main.tsx Formatting/semicolons
playground/TypeScriptAppHost/vite-frontend/src/App.tsx Formatting/semicolons
playground/TypeScriptAppHost/package.json Add tsx dev dependency
playground/TypeScriptAppHost/apphost.ts Await env-var set
playground/TypeScriptAppHost/.modules/transport.ts DTO writeback protocol for callbacks
playground/TypeScriptAppHost/.modules/base.ts ReferenceExpression handle-mode serialization
playground/TypeScriptAppHost/.modules/.codegen-hash Regenerated module hash
playground/TypeScriptAppHost/.gitignore Keep .aspire settings but ignore DCP
playground/TypeScriptAppHost/.aspire/settings.json Add packages list for TS apphost
playground/Stress/Stress.AppHost/TestResource.cs Ignore ATS export for playground helpers
playground/Stress/Stress.AppHost/InteractionCommands.cs Ignore ATS export for non-compatible helpers
playground/SimplePipelines/SimplePipelines.AppHost/appsettings.json New logging settings
playground/SimplePipelines/SimplePipelines.AppHost/appsettings.Development.json New dev logging settings
playground/SimplePipelines/SimplePipelines.AppHost/SimplePipelines.AppHost.csproj New apphost project
playground/SimplePipelines/SimplePipelines.AppHost/Properties/launchSettings.json New launch settings
playground/SimplePipelines/SimplePipelines.AppHost/AppHost.cs New pipelines demo apphost
playground/FoundryEndToEnd/FoundryEndToEnd.WebStory/Program.cs Namespace rename to FoundryEndToEnd
playground/FoundryEndToEnd/FoundryEndToEnd.WebStory/Components/_Imports.razor Namespace rename + BOM cleanup
playground/FoundryEndToEnd/FoundryEndToEnd.WebStory/Components/App.razor Styles filename rename + BOM cleanup
playground/FoundryEndToEnd/FoundryEndToEnd.AppHost/aspire-manifest.json Update project path after rename
playground/FoundryEndToEnd/FoundryEndToEnd.AppHost/Program.cs Switch to Aspire.Hosting.Foundry API
playground/FoundryEndToEnd/FoundryEndToEnd.AppHost/FoundryEndToEnd.AppHost.csproj Update package and project references
playground/FoundryAgentEnterprise/frontend/vite.config.ts New Vite frontend
playground/FoundryAgentEnterprise/frontend/tsconfig.node.json New TS config
playground/FoundryAgentEnterprise/frontend/tsconfig.json New TS project refs
playground/FoundryAgentEnterprise/frontend/tsconfig.app.json New TS app config
playground/FoundryAgentEnterprise/frontend/src/main.tsx New React bootstrap
playground/FoundryAgentEnterprise/frontend/src/index.css New CSS baseline
playground/FoundryAgentEnterprise/frontend/package.json Frontend dependencies/tooling
playground/FoundryAgentEnterprise/frontend/index.html Frontend HTML shell
playground/FoundryAgentEnterprise/frontend/eslint.config.js Frontend lint config
playground/FoundryAgentEnterprise/frontend/.dockerignore Frontend docker ignore
playground/FoundryAgentEnterprise/app/telemetry.py OpenTelemetry setup helper
playground/FoundryAgentEnterprise/app/pyproject.toml Python deps + metadata
playground/FoundryAgentEnterprise/app/main.py FastAPI app + static mount
playground/FoundryAgentEnterprise/app/.python-version Pin Python version
playground/FoundryAgentEnterprise/app/.dockerignore Python docker ignore
playground/FoundryAgentEnterprise/FoundryAgentEnterprise.AppHost/appsettings.json Added run settings (file named as appsettings)
playground/FoundryAgentEnterprise/FoundryAgentEnterprise.AppHost/Program.cs Foundry agent enterprise apphost
playground/FoundryAgentEnterprise/FoundryAgentEnterprise.AppHost/FoundryAgentEnterprise.AppHost.csproj New apphost csproj
playground/FoundryAgentBasic/app/pyproject.toml Python deps + metadata
playground/FoundryAgentBasic/app/.python-version Pin Python version
playground/FoundryAgentBasic/app/.dockerignore Python docker ignore
playground/FoundryAgentBasic/FoundryAgentBasic.AppHost/appsettings.Production.json Production settings for sample
playground/FoundryAgentBasic/FoundryAgentBasic.AppHost/appsettings.Development.json Development settings for sample
playground/FoundryAgentBasic/FoundryAgentBasic.AppHost/Properties/launchSettings.json New launch settings
playground/FoundryAgentBasic/FoundryAgentBasic.AppHost/Program.cs Foundry agent basic apphost
playground/FoundryAgentBasic/FoundryAgentBasic.AppHost/FoundryAgentBasic.AppHost.csproj New apphost csproj
playground/FoundryAgentBasic/.vscode/settings.json Python env metadata
playground/Directory.Build.targets Avoid leaking runtime props into analyzer build
playground/CustomResources/CustomResources.AppHost/TestResource.cs Ignore ATS export for playground helpers
playground/CustomResources/CustomResources.AppHost/TalkingClockResource.cs Ignore ATS export for playground helpers
playground/AzureVirtualNetworkEndToEnd/AzureVirtualNetworkEndToEnd.AppHost/vnet.module.bicep Add SQL ACI subnet + outputs
playground/AzureVirtualNetworkEndToEnd/AzureVirtualNetworkEndToEnd.AppHost/sql.module.bicep Add SQL server + DB bicep
playground/AzureVirtualNetworkEndToEnd/AzureVirtualNetworkEndToEnd.AppHost/sql-store.module.bicep Add storage account for SQL scripts
playground/AzureVirtualNetworkEndToEnd/AzureVirtualNetworkEndToEnd.AppHost/sql-nsg.module.bicep Add SQL subnet NSG
playground/AzureVirtualNetworkEndToEnd/AzureVirtualNetworkEndToEnd.AppHost/sql-admin-identity.module.bicep Resolve SQL admin identity
playground/AzureVirtualNetworkEndToEnd/AzureVirtualNetworkEndToEnd.AppHost/sql-admin-identity-roles-sql-store.module.bicep Assign storage role to identity
playground/AzureVirtualNetworkEndToEnd/AzureVirtualNetworkEndToEnd.AppHost/privatelink-file-core-windows-net.module.bicep Add private DNS zone for file
playground/AzureVirtualNetworkEndToEnd/AzureVirtualNetworkEndToEnd.AppHost/privatelink-database-windows-net.module.bicep Add private DNS zone for SQL
playground/AzureVirtualNetworkEndToEnd/AzureVirtualNetworkEndToEnd.AppHost/private-endpoints-sql-pe.module.bicep Add SQL private endpoint
playground/AzureVirtualNetworkEndToEnd/AzureVirtualNetworkEndToEnd.AppHost/private-endpoints-files-pe.module.bicep Add storage file private endpoint
playground/AzureVirtualNetworkEndToEnd/AzureVirtualNetworkEndToEnd.AppHost/api-containerapp.module.bicep Inject SQL connection env vars
playground/AzureVirtualNetworkEndToEnd/AzureVirtualNetworkEndToEnd.AppHost/Program.cs Add Azure SQL + DB reference
playground/AzureVirtualNetworkEndToEnd/AzureVirtualNetworkEndToEnd.AppHost/AzureVirtualNetworkEndToEnd.AppHost.csproj Add Azure SQL hosting package
playground/AzureVirtualNetworkEndToEnd/AzureVirtualNetworkEndToEnd.ApiService/Program.cs Add SQL endpoint + client wiring
playground/AzureVirtualNetworkEndToEnd/AzureVirtualNetworkEndToEnd.ApiService/AzureVirtualNetworkEndToEnd.ApiService.csproj Add SqlClient component package
playground/AzureKusto/AzureKusto.AppHost/AzureKustoReadWriteDatabaseResourceBuilderExtensions.cs Ignore ATS export for control command helper
playground/AzureFunctionsEndToEnd/AzureFunctionsEndToEnd.Functions/AzureFunctionsEndToEnd.Functions.csproj Skip unstable emulators on macOS
playground/AzureFunctionsEndToEnd/AzureFunctionsEndToEnd.AppHost/AzureFunctionsEndToEnd.AppHost.csproj Skip unstable emulators on macOS
playground/AspireWithMaui/AspireWithMaui.slnx Update Foundry project references
playground/AspireWithJavaScript/AspireJavaScript.Vue/vite.config.ts Formatting/semicolons
playground/AspireWithJavaScript/AspireJavaScript.Vue/src/main.ts Formatting/semicolons
playground/AspireWithJavaScript/AspireJavaScript.Vite/vite.config.ts Formatting/semicolons
playground/AspireWithJavaScript/AspireJavaScript.Vite/src/main.tsx Formatting/semicolons
playground/AspireWithJavaScript/AspireJavaScript.React/webpack.config.js Enable source maps
playground/AspireWithJavaScript/AspireJavaScript.NodeApp/app.js Adjust 404 handler
playground/AspireWithJavaScript/AspireJavaScript.MinimalApi/Properties/launchSettings.json Remove swagger launchUrl
playground/AspireWithJavaScript/AspireJavaScript.MinimalApi/AppHost.cs Remove Swagger/OpenAPI setup
playground/AspireWithJavaScript/AspireJavaScript.AppHost/AppHost.cs Add browser debugger + pragmas
playground/AspireWithJavaScript/.vscode/settings.json Configure dashboard browser
extension/src/views/AspireStatusBarProvider.ts Remove status bar provider implementation
extension/src/utils/settings.ts Add setting helper getters
extension/src/utils/cliPath.ts Reduce logging noise in CLI resolution
extension/src/types/configInfo.ts Add Capabilities to config info
extension/src/test/rpc/interactionServiceTests.test.ts Update InteractionService tests for debug output/terminal fallback
extension/src/server/rpcClient.ts Pass terminal factory to InteractionService
extension/src/mcp/AspireMcpServerDefinitionProvider.ts Provide MCP server definition (stdio)
extension/src/loc/strings.ts Add tooltip strings; remove status bar strings
extension/src/debugger/runCleanupRegistry.ts Add run-scoped cleanup registry
extension/src/debugger/languages/node.ts Add Node debugger extension
extension/src/debugger/languages/cli.ts Reduce logging noise in CLI spawn
extension/src/debugger/languages/browser.ts Add browser debugger extension
extension/src/debugger/debuggerExtensions.ts Register new debugger extensions + add isApphost support
extension/src/debugger/adapterTracker.ts Handle apphost restart suppression
extension/src/dcp/types.ts Add node/browser/azure-functions launch config types
extension/src/commands/publish.ts Route publish via editor command provider
extension/src/commands/do.ts Add aspire do command support
extension/src/commands/deploy.ts Route deploy via editor command provider
extension/src/capabilities.ts Report node/browser/azure-functions capabilities
extension/schemas/aspire-settings.schema.json Remove deprecated schema settings
extension/schemas/aspire-global-settings.schema.json Remove deprecated schema settings
extension/README.md Document command/do in launch.json
eng/scripts/split-test-projects-for-ci.ps1 Exclude outerloop/quarantined in listing
eng/scripts/split-test-matrix-by-deps.ps1 Split nuget matrix by OS
eng/scripts/generate-specialized-test-projects-list.sh Improve OuterloopTest attribute matching
eng/scripts/expand-test-matrix-github.ps1 Support per-OS custom runners
eng/scripts/build-test-matrix.ps1 Pass through runners metadata
eng/Versions.props Bump DCP versions to 0.22.9
eng/Version.Details.xml Bump DCP dependency metadata + SHAs
eng/Testing.targets Document custom runner properties
eng/Testing.props Conditional macOS PR test gating
eng/TestEnumerationRunsheetBuilder/TestEnumerationRunsheetBuilder.targets Emit runners JSON metadata
eng/Signing.props Add signing for get-aspire-cli.ps1
eng/Publishing.props Publish CLI install scripts + checksums
docs/using-latest-daily.md Fix prompt formatting
docs/specs/polyglot-apphost-testing.md Update command usage to aspire start
docs/ci/auto-rerun-transient-ci-failures.md New workflow behavior contract doc
docs/azure.md New Azure integration notes
Directory.Packages.props Update/add Azure + Hex1b + Identity versions
Aspire.slnx Update Foundry refs + add new playground/tests projects
AGENTS.md Alignment guidance for workflow matcher + OuterloopTest usage
.vscode/mcp.json Update Hex1b MCP server version
.github/workflows/update-ai-foundry-models.yml Rename + new Foundry tooling paths
.github/workflows/specialized-test-runner.yml Add CLI archive build dependency
.github/workflows/polyglot-validation/Dockerfile.typescript Add telemetry opt-out + TS playground tests
.github/workflows/polyglot-validation/Dockerfile.rust Telemetry opt-out + --nologo
.github/workflows/polyglot-validation/Dockerfile.python Telemetry opt-out + --nologo
.github/workflows/polyglot-validation/Dockerfile.java Telemetry opt-out + --nologo
.github/workflows/polyglot-validation/Dockerfile.go Telemetry opt-out + --nologo
.github/workflows/generate-ats-diffs.yml Use sdk dump --format ci + set repo root env
.dockerignore New repo-level docker ignore
Files not reviewed (3)
  • playground/TypeScriptAppHost/package-lock.json: Language not supported
  • playground/polyglot/TypeScript/Aspire.Hosting.Azure.AppService/ValidationAppHost/package-lock.json: Language not supported
  • playground/polyglot/TypeScript/Aspire.Hosting.Azure.Kusto/ValidationAppHost/package-lock.json: Language not supported

Comment on lines +2 to +30
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://foundryagententerprise.dev.localhost:17107;http://foundryagententerprise.dev.localhost:15087",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"DOTNET_ENVIRONMENT": "Development",
"ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21185",
"ASPIRE_DASHBOARD_MCP_ENDPOINT_URL": "https://localhost:23160",
"ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22164"
}
},
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://foundryagententerprise.dev.localhost:15087",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"DOTNET_ENVIRONMENT": "Development",
"ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19052",
"ASPIRE_DASHBOARD_MCP_ENDPOINT_URL": "http://localhost:18189",
"ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20220"
}
}
}
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

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

This file is named appsettings.json but contains launchSettings.json schema and profiles. .NET will treat it as configuration (and it won’t be applied as launch settings), which is likely unintended. Move this content to Properties/launchSettings.json, and keep appsettings.json for app configuration.

Suggested change
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://foundryagententerprise.dev.localhost:17107;http://foundryagententerprise.dev.localhost:15087",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"DOTNET_ENVIRONMENT": "Development",
"ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21185",
"ASPIRE_DASHBOARD_MCP_ENDPOINT_URL": "https://localhost:23160",
"ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22164"
}
},
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://foundryagententerprise.dev.localhost:15087",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"DOTNET_ENVIRONMENT": "Development",
"ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19052",
"ASPIRE_DASHBOARD_MCP_ENDPOINT_URL": "http://localhost:18189",
"ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20220"
}
}
}

Copilot uses AI. Check for mistakes.
Comment on lines +21 to +25
if (handlers) {
for (const handler of handlers) {
handler();
}
runCleanupHandlers.delete(runId);
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

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

If any cleanup handler throws, later handlers won’t run and the runId entry won’t be removed (potential leak + incomplete cleanup). Consider wrapping each handler call in try/catch and ensuring the registry entry is deleted in a finally block so cleanup remains best-effort and deterministic.

Suggested change
if (handlers) {
for (const handler of handlers) {
handler();
}
runCleanupHandlers.delete(runId);
if (!handlers) {
return;
}
// Remove the handlers entry before invoking them so the registry is cleaned
// up even if any individual handler throws.
runCleanupHandlers.delete(runId);
for (const handler of handlers) {
try {
handler();
} catch (error) {
// Swallow errors from individual cleanup handlers to allow the rest
// of the handlers to run.
// eslint-disable-next-line no-console
console.error('Error during run cleanup for runId:', runId, error);
}

Copilot uses AI. Check for mistakes.
Comment on lines +6 to +9
export const browserDebuggerExtension: ResourceDebuggerExtension = {
resourceType: 'browser',
debugAdapter: 'pwa-msedge',
extensionId: null, // built-in to VS Code via js-debug
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

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

The extension registers a debugger extension/tracker under debugAdapter: 'pwa-msedge', but the actual launched debug session type is set dynamically via debugConfiguration.type = pwa-${browser}``. If launchConfig.browser is not `msedge`, the debug session will use a different adapter (e.g., `pwa-chrome`) and any adapter-specific wiring (like tracker factories) won’t apply. Either constrain `browser` to `msedge` here, or update the surrounding infrastructure to register trackers/handlers for all supported `pwa-*` adapters you might emit.

Copilot uses AI. Check for mistakes.
Comment on lines +24 to +26
// Map browser name to VS Code js-debug adapter type (pwa- prefix required)
const browser = launchConfig.browser || 'msedge';
debugConfiguration.type = `pwa-${browser}`;
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

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

The extension registers a debugger extension/tracker under debugAdapter: 'pwa-msedge', but the actual launched debug session type is set dynamically via debugConfiguration.type = pwa-${browser}``. If launchConfig.browser is not `msedge`, the debug session will use a different adapter (e.g., `pwa-chrome`) and any adapter-specific wiring (like tracker factories) won’t apply. Either constrain `browser` to `msedge` here, or update the surrounding infrastructure to register trackers/handlers for all supported `pwa-*` adapters you might emit.

Suggested change
// Map browser name to VS Code js-debug adapter type (pwa- prefix required)
const browser = launchConfig.browser || 'msedge';
debugConfiguration.type = `pwa-${browser}`;
// Use VS Code js-debug adapter type matching the registered debugAdapter
debugConfiguration.type = 'pwa-msedge';

Copilot uses AI. Check for mistakes.
// Re-evaluate when workspace folders change
this._workspaceFolderChangeDisposable = vscode.workspace.onDidChangeWorkspaceFolders(() => {
this.refresh();
});
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

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

The provider never calls refresh() initially, so _cliAvailable/_shouldProvide remain at defaults and provideMcpServerDefinitions will return [] until a configuration/workspace-folders change occurs. To avoid the MCP server definition never appearing in a stable workspace session, trigger an initial refresh (e.g., void this.refresh() in the constructor, or ensure activation code calls await provider.refresh() right after construction).

Suggested change
});
});
// Perform an initial evaluation so MCP server definitions are available
// even if no configuration or workspace folder changes occur.
void this.refresh();

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +13
import logging
import opentelemetry._logs as otel_logs
import opentelemetry.exporter.otlp.proto.grpc._log_exporter as log_exporter
import opentelemetry.exporter.otlp.proto.grpc.metric_exporter as metric_exporter
import opentelemetry.exporter.otlp.proto.grpc.trace_exporter as trace_exporter
import opentelemetry.metrics as otel_metrics
import opentelemetry.sdk._logs as otel_sdk_logs
import opentelemetry.sdk._logs.export as otel_logs_export
import opentelemetry.sdk.metrics as otel_sdk_metrics
import opentelemetry.sdk.metrics.export as otel_metrics_export
import opentelemetry.sdk.trace as otel_sdk_trace
import opentelemetry.sdk.trace.export as otel_trace_export
import opentelemetry.trace as otel_trace
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

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

This uses multiple underscore-prefixed OpenTelemetry modules (e.g., opentelemetry._logs, opentelemetry.sdk._logs, _log_exporter), which are typically internal/unstable APIs and may break across package updates. If possible, switch to the public/stable modules for logs/exporters (or gate this behind pinned versions) to reduce maintenance risk.

Copilot uses AI. Check for mistakes.
## CLI Primitives

### `aspire run --detach`
### `aspire start`
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

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

Within the same section, examples use both --apphost and --project for aspire start. This inconsistency makes it unclear which flag is correct. Standardize the examples to the intended CLI contract (and, if both are supported, call that out explicitly).

Copilot uses AI. Check for mistakes.

```bash
aspire run --detach --project ./MyApp.AppHost/MyApp.AppHost.csproj
aspire start --apphost ./MyApp.AppHost/MyApp.AppHost.csproj
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

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

Within the same section, examples use both --apphost and --project for aspire start. This inconsistency makes it unclear which flag is correct. Standardize the examples to the intended CLI contract (and, if both are supported, call that out explicitly).

Suggested change
aspire start --apphost ./MyApp.AppHost/MyApp.AppHost.csproj
aspire start --project ./MyApp.AppHost/MyApp.AppHost.csproj

Copilot uses AI. Check for mistakes.

```bash
aspire run --detach --format json --project ./MyApp.AppHost/MyApp.AppHost.csproj
aspire start --format json --project ./MyApp.AppHost/MyApp.AppHost.csproj
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

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

Within the same section, examples use both --apphost and --project for aspire start. This inconsistency makes it unclear which flag is correct. Standardize the examples to the intended CLI contract (and, if both are supported, call that out explicitly).

Suggested change
aspire start --format json --project ./MyApp.AppHost/MyApp.AppHost.csproj
aspire start --format json --apphost ./MyApp.AppHost/MyApp.AppHost.csproj

Copilot uses AI. Check for mistakes.
Comment on lines +35 to +39
async refresh(): Promise<void> {
const [cliResult, shouldProvide] = await Promise.all([
resolveCliPath(),
checkShouldProvideMcpServer(),
]);
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

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

New MCP server-definition logic (CLI path resolution + setting/workspace gating + change detection) is introduced here but there’s no corresponding unit test coverage shown. Adding tests for refresh() (state transitions, onDidChange firing, and provideMcpServerDefinitions gating) would help prevent regressions since this is activation/UX-critical behavior.

Copilot uses AI. Check for mistakes.
@radical
Copy link
Member Author

radical commented Mar 12, 2026

Conflict resolution: src/Aspire.Hosting/AspireEventSource.cs

Resolved code: https://github.com/radical/aspire/blob/0bbf752628495471ca071efcd5808587bc55378d/src/Aspire.Hosting/AspireEventSource.cs#L374-L406

Kept both event additions and renumbered the release-side trust-check events to avoid duplicate EventSource IDs.

[Event(43, Level = EventLevel.Informational, Message = "DCP Service object preparation starting...")]
public void DcpServiceObjectPreparationStart() { ... }

[Event(44, Level = EventLevel.Informational, Message = "DCP Service object preparation completed")]
public void DcpServiceObjectPreparationStop() { ... }

[Event(45, Level = EventLevel.Informational, Message = "Development certificate trust check is starting...")]
public void DevelopmentCertificateTrustCheckStart() { ... }

[Event(46, Level = EventLevel.Informational, Message = "Development certificate trust check completed")]
public void DevelopmentCertificateTrustCheckStop() { ... }

Main already used 43/44, so I moved the release-side events to 45/46 instead of dropping either side.

CC @karolz-ms @danegsta @mitchdenny

@radical
Copy link
Member Author

radical commented Mar 12, 2026

Conflict resolution: src/Aspire.Hosting/Dashboard/DashboardEventHandlers.cs

Resolved code: https://github.com/radical/aspire/blob/0bbf752628495471ca071efcd5808587bc55378d/src/Aspire.Hosting/Dashboard/DashboardEventHandlers.cs#L423-L438

Kept the centralized endpoint naming from main so the OTLP annotations match current lookup usage.

dashboardResource.Annotations.Add(new EndpointAnnotation(
    ProtocolType.Tcp,
    name: KnownEndpointNames.OtlpGrpcEndpointName,
    uriScheme: address.Scheme,
    port: address.Port,
    isProxied: true,
    transport: "http2")
{
    TargetHost = address.Host
});

dashboardResource.Annotations.Add(new EndpointAnnotation(
    ProtocolType.Tcp,
    name: KnownEndpointNames.OtlpHttpEndpointName,
    uriScheme: address.Scheme,
    port: address.Port,
    isProxied: true)
{
    TargetHost = address.Host
});

This avoids annotating under one name and resolving under another.

CC @karolz-ms @danegsta @mitchdenny

@radical
Copy link
Member Author

radical commented Mar 12, 2026

Conflict resolution: src/Aspire.Hosting/Dcp/DcpExecutor.cs

Resolved code: https://github.com/radical/aspire/blob/0bbf752628495471ca071efcd5808587bc55378d/src/Aspire.Hosting/Dcp/DcpExecutor.cs#L1417-L1423

Took the release-side executable debug flow here: mark the executable as IDE-launched during prepare, and defer launch configuration annotation until after endpoint allocation.

if (executable.SupportsDebugging(_configuration, out _))
{
    // Just mark as IDE execution here - the actual launch configuration callback
    // will be invoked in CreateExecutableAsync after endpoints are allocated.
    exe.Spec.ExecutionType = ExecutionType.IDE;
    exe.Spec.FallbackExecutionTypes = [ExecutionType.Process];
}

That preserves the newer 13.2 JS / Azure Functions debugging behavior.

CC @adamint @karolz-ms @mitchdenny

@radical
Copy link
Member Author

radical commented Mar 12, 2026

Conflict resolution: tests/Aspire.Hosting.Tests/ResourceDependencyTests.cs

Resolved code:

Kept both test additions because they cover different dependency-discovery paths.

#region Multi-Resource GetDependenciesAsync Tests
...
[Fact]
public async Task ConditionalReferenceExpressionIncludesBothBranchDependencies()

Main added multi-resource dependency coverage; release added conditional ReferenceExpression coverage. They’re complementary, so I merged both sets.

CC @karolz-ms @danegsta @sebastienros

@radical
Copy link
Member Author

radical commented Mar 12, 2026

Conflict resolution: tests/Shared/Hex1bTestHelpers.cs

Resolved code:

Combined the shared-helper baseline with the 13.2 CLI E2E helper additions instead of choosing one side.

internal static Hex1bTerminalInputSequenceBuilder DeclineAgentInitPrompt(
    this Hex1bTerminalInputSequenceBuilder builder,
    TimeSpan? timeout = null)

internal static Hex1bTerminalInputSequenceBuilder DeclineAgentInitPrompt(
    this Hex1bTerminalInputSequenceBuilder builder,
    SequenceCounter counter,
    TimeSpan? timeout = null)

This keeps the newer aspire init / aspire new agent-init flow and related E2E helper updates without losing the refactoring already on main.

CC @JamesNK @mitchdenny @eerhardt

@danegsta
Copy link
Member

Conflict resolution: src/Aspire.Hosting/AspireEventSource.cs

Resolved code: https://github.com/radical/aspire/blob/0bbf752628495471ca071efcd5808587bc55378d/src/Aspire.Hosting/AspireEventSource.cs#L374-L406

Kept both event additions and renumbered the release-side trust-check events to avoid duplicate EventSource IDs.

[Event(43, Level = EventLevel.Informational, Message = "DCP Service object preparation starting...")]
public void DcpServiceObjectPreparationStart() { ... }

[Event(44, Level = EventLevel.Informational, Message = "DCP Service object preparation completed")]
public void DcpServiceObjectPreparationStop() { ... }

[Event(45, Level = EventLevel.Informational, Message = "Development certificate trust check is starting...")]
public void DevelopmentCertificateTrustCheckStart() { ... }

[Event(46, Level = EventLevel.Informational, Message = "Development certificate trust check completed")]
public void DevelopmentCertificateTrustCheckStop() { ... }

Main already used 43/44, so I moved the release-side events to 45/46 instead of dropping either side.

CC @karolz-ms @danegsta @mitchdenny

As long as there's no concern with the event IDs changing between 13.2 and 13.3. If there's the possibility of an issue changing the ID after it's been used in a release we might want to consider bumping the IDs from main instead.

@radical
Copy link
Member Author

radical commented Mar 12, 2026

As long as there's no concern with the event IDs changing between 13.2 and 13.3. If there's the possibility of an issue changing the ID after it's been used in a release we might want to consider bumping the IDs from main instead.

@danegsta who can answer this? Should this merge wait till we figure that out?

@JamesNK
Copy link
Member

JamesNK commented Mar 12, 2026

We want stable numbers.

release/13.2 has this:

    [Event(43, Level = EventLevel.Informational, Message = "Development certificate trust check is starting...")]
    public void DevelopmentCertificateTrustCheckStart()
    {
        if (IsEnabled())
        {
            WriteEvent(43);
        }
    }

    [Event(44, Level = EventLevel.Informational, Message = "Development certificate trust check completed")]
    public void DevelopmentCertificateTrustCheckStop()
    {
        if (IsEnabled())
        {
            WriteEvent(44);
        }
    }

The merge to main should have this:

    [Event(43, Level = EventLevel.Informational, Message = "Development certificate trust check is starting...")]
    public void DevelopmentCertificateTrustCheckStart()
    {
        if (IsEnabled())
        {
            WriteEvent(43);
        }
    }

    [Event(44, Level = EventLevel.Informational, Message = "Development certificate trust check completed")]
    public void DevelopmentCertificateTrustCheckStop()
    {
        if (IsEnabled())
        {
            WriteEvent(44);
        }
    }

    [Event(45, Level = EventLevel.Informational, Message = "DCP Service object preparation starting...")]
    public void DcpServiceObjectPreparationStart()
    {
        if (IsEnabled())
        {
            WriteEvent(45);
        }
    }

    [Event(46, Level = EventLevel.Informational, Message = "DCP Service object preparation completed")]
    public void DcpServiceObjectPreparationStop()
    {
        if (IsEnabled())
        {
            WriteEvent(46);
        }
    }

Update the PR to main have this fix and then it's fine.

@radical
Copy link
Member Author

radical commented Mar 12, 2026

@copilot address #15151 (comment)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@radical
Copy link
Member Author

radical commented Mar 12, 2026

Fixed — I updated AspireEventSource so the stable/shipped event IDs are preserved in the backmerge.

DevelopmentCertificateTrustCheckStart/Stop now use 43/44, and DcpServiceObjectPreparationStart/Stop now use 45/46, matching the intended numbering from release/13.2.

I also rebuilt src/Aspire.Hosting/Aspire.Hosting.csproj after the change to verify it stays clean.

@radical radical enabled auto-merge March 12, 2026 17:30
@radical radical merged commit 8fdec5b into microsoft:main Mar 12, 2026
253 of 254 checks passed
@radical radical deleted the ankj/backmerge-13.2-to-main branch March 12, 2026 18:06
@dotnet-policy-service dotnet-policy-service bot added this to the 13.3 milestone Mar 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.