Skip to content

WithTerminal(): per-replica interactive terminal sessions (Aspire side, draft) - #17866

Merged
Mitch Denny (mitchdenny) merged 96 commits into
mainfrom
feature/with-terminal
Jun 10, 2026
Merged

WithTerminal(): per-replica interactive terminal sessions (Aspire side, draft)#17866
Mitch Denny (mitchdenny) merged 96 commits into
mainfrom
feature/with-terminal

Conversation

@mitchdenny

Copy link
Copy Markdown
Member

Migration note: This PR continues #16760, which had to be closed because GitHub does not allow changing a PR's head repo. All review feedback has been re-posted below as inline comments, with resolutions noted for the four already-fixed Critical/High items.

Description

Adds the Aspire-side implementation of WithTerminal(...) — letting an
AppHost author opt a resource into a real interactive terminal session
that the dashboard, the aspire CLI, or any other HMP v1 viewer can
attach to and detach from at will.

End-to-end pipeline (Windows executables today; container/Linux/macOS
follow-ups tracked separately):

your process (cmd.exe / dotnet run / repl)
      ↓ stdout/stdin via ConPTY
DCP process_executable_runner_terminal       ← microsoft/dcp#133
      ↓ HMP1 server on dcp/r{i}.sock
Aspire.TerminalHost (Hex1bTerminal per replica)
   - WithHmp1UdsClient(producer)             ← consumes from DCP
   - WithHmp1UdsServer(consumer)             ← serves to viewers
      ↓ HMP1 server on host/r{i}.sock
viewers: dashboard /api/terminal proxy, `aspire terminal <name>`, …

This is a draft because:

  • DCP-side support is in microsoft/dcp#133 and not yet merged or version-bumped here.
  • IDE/debug execution is not terminal-attached yet (see "Known limitations").
  • Containers and Linux/macOS executables are follow-ups.

Tracks #16317.

What's in this PR

Public API (src/Aspire.Hosting/ApplicationModel)

  • WithTerminal() extension method + TerminalAnnotation / TerminalOptions /
    TerminalHostResource. Per-replica producer + consumer UDS layout owned by
    the TerminalHostResource; lifecycle is wired through
    TerminalHostEventingSubscriber.

DCP wire-up (src/Aspire.Hosting/Dcp/Model/TerminalSpec.cs,
src/Aspire.Hosting/Dcp/ExecutableCreator.cs)

  • New TerminalSpec mirrors the DCP API (Enabled / UdsPath / Cols / Rows).
  • ExecutableCreator populates spec.Terminal per replica from the layout
    on Windows when a TerminalAnnotation is present.
  • Bug fix in PreparePlainExecutables: plain executables now get
    ResourceReplicaCount=1 / ResourceReplicaIndex=0 annotations so the
    per-replica UDS lookup succeeds (without this, WithTerminal() on
    AddExecutable(...) silently no-op'd).

Out-of-process Terminal Host (src/Aspire.TerminalHost)

  • One Hex1bTerminal per replica acting as an HMP v1 client to DCP and an
    HMP v1 server to viewers. Native AOT-compatible.

Backchannel (src/Aspire.Hosting.Cli/... + src/Aspire.Cli/...)

  • AppHost exposes per-replica terminal info (resource name, replica index,
    consumer UDS path) over the existing CLI backchannel.

CLI (src/Aspire.Cli/Commands/TerminalCommand.cs)

  • aspire terminal <resource> [--replica N] connects to the consumer UDS
    via Hex1b's HMP v1 client and bridges the local terminal.

Dashboard (src/Aspire.Dashboard/...)

  • New TerminalView Blazor component (xterm.js + a thin JS module).
  • New /api/terminal WebSocket proxy (Terminal/TerminalWebSocketProxy.cs)
    bridging the browser WebSocket to the per-replica consumer UDS.
  • ConsoleLogs page swaps the log viewer for the terminal view when the
    selected resource has a terminal session, and now correctly rebinds the
    view when the user switches between terminal-enabled resources/replicas.

Playground (playground/Terminals/...)

  • Terminals.Repl — interactive ANSI REPL (help, whoami, time,
    size, echo, rainbow, clear, exit).
  • Terminals.AppHost — hosts the REPL with WithReplicas(2) +
    WithTerminal(120x32) and a Windows-gated shell resource
    (AddExecutable("cmd.exe") + WithTerminal()).

Spec

  • docs/specs/with-terminal.md documents the architecture, the per-replica
    UDS layout, and the lifecycle.

Validation

End-to-end requires the matching DCP build from
microsoft/dcp#133 and the
freshly-built Aspire.TerminalHost, both pointed at via env vars:

# 1. Build DCP from the PR branch (Go 1.22+)
git clone https://github.com/microsoft/dcp.git
cd dcp
git fetch origin mitchdenny/with-terminal-pty
git checkout mitchdenny/with-terminal-pty
go build -o bin/dcp.exe ./cmd/dcp

# 2. Build Aspire from this PR
git clone https://github.com/microsoft/aspire.git aspire-with-terminal
cd aspire-with-terminal
git fetch origin feature/with-terminal
git checkout feature/with-terminal
.\restore.cmd
.\build.cmd

# 3. Point Aspire at the local DCP and TerminalHost binaries
$env:ASPIRE_DCP_PATH           = "<path-to-dcp>\bin"
$env:ASPIRE_TERMINAL_HOST_PATH = "<path-to-aspire>\artifacts\bin\Aspire.TerminalHost\Debug\net8.0\Aspire.TerminalHost.exe"

# 4. Run the playground
cd playground\Terminals\Terminals.AppHost
dotnet run

Expected:

  • The dashboard shows three terminal-enabled resources: shell,
    repl-r0, repl-r1. Each entry's "Console Logs" tab renders a live
    xterm.js terminal instead of the log viewer.
  • Switching between resources/replicas in the resource selector swaps the
    attached terminal in place (state replay courtesy of Hex1bTerminal).
  • aspire terminal repl --replica 1 from a real conhost session attaches
    to replica 1 of the REPL with full interactivity.
  • Per-resource DCP logs at %LocalAppData%\Temp\aspire-dcp*\resource-executable-{guid}.log
    show Starting process under PTY... and Terminal session listening.

Unit / integration tests:

  • dotnet test tests\Aspire.Hosting.Tests\Aspire.Hosting.Tests.csproj -- --filter-class "*.WithTerminalTests" --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true" (15 pass)
  • --filter-method "*.Project_WithTerminal_PopulatesPerReplicaTerminalSpecOnWindows" --filter-method "*.Project_WithoutTerminal_HasNullTerminalSpec" --filter-method "*.PlainExecutable_WithTerminal_PopulatesTerminalSpecOnWindows" (3 pass)

Known limitations / non-goals (deferred)

  • Debugger attach: when ExecutionType.IDE is in effect (project
    resources running under VS / VS Code), DCP's IDE runner ignores
    spec.Terminal and forwards the launch to the IDE, which wires
    stdin/stdout to its own debug console. The terminal view in the
    dashboard will be empty in that case. The Process runner fallback
    (no-debug, CLI scenarios) honors spec.Terminal and works as designed.
    Proper fix is cross-component (Aspire + DCP + VS / VSCode extension).
  • Linux/macOS executables: tracked as a follow-up against DCP
    (creack/pty).
  • Containers: tracked as a follow-up against DCP (docker/podman --tty).
  • Hello-frame dimensions: consumer UDS reports width:80,height:24
    even when WithTerminal(Cols=120,Rows=32) is set — needs
    investigation of whether DCP's PTY allocation or Hex1b's headless
    presentation is overriding the configured dims. Doesn't break
    rendering (xterm.js auto-fits), but should be fixed before shipping.
  • Persistent resources were called out in the issue — not in scope
    here, follow-up.

Checklist

  • Is this feature complete?
    • Yes. Ready to ship.
    • No. Follow-up changes expected (DCP PR merge + version bump,
      Linux/macOS, containers, debugger-attach support).
  • 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 (deferred until non-draft)
      • 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 (UDS in user-owned temp dir; no network surface)
  • Does the change require an update in our Aspire docs?
    • Yes (after non-draft)
      • Link to aspire.dev issue: TBD
    • No

Companion PR

DCP-side: microsoft/dcp#133 — Add Windows PTY support for executables (HMP v1 over UDS)

@mitchdenny Mitch Denny (mitchdenny) left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Re-posting the 20 code-review findings from #16760 (closed because GitHub doesn't let us change the head repo). The 4 Critical/High items already fixed in this branch have resolution details inline with the original concern.

Summary by severity:

  • 🔴 Critical: 1 (✅ fixed)
  • 🟠 High: 3 (✅ fixed)
  • 🟡 Medium: 8 (open)
  • 🔵 Low: 8 (open)

Comment thread src/Aspire.Dashboard/Terminal/TerminalWebSocketProxy.cs
Comment thread src/Aspire.TerminalHost/TerminalHostControlListener.cs Outdated
Comment thread src/Aspire.Hosting/TerminalResourceBuilderExtensions.cs Outdated
Comment thread src/Aspire.TerminalHost/TerminalReplica.cs
Comment thread src/Aspire.Hosting/TerminalResourceBuilderExtensions.cs
Comment thread src/Aspire.Cli/Tui/TerminalViewerApp.cs Outdated
Comment thread tests/Aspire.Hosting.Tests/WithTerminalTests.cs
Comment thread tests/Aspire.Hosting.Tests/WithTerminalTests.cs
{
return ReadOnlyMemory<byte>.Empty;
}
}

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

[Low — Uncertain] ReadOutputAsync collapses three distinct end-states into ReadOnlyMemory<byte>.Empty

Empty is returned for: (a) already-disposed, (b) connect failure, (c) WaitToReadAsync returning false (channel completed = EOF), (d) TryRead race miss, and (e) ChannelClosedException. If IHex1bTerminalWorkloadAdapter's contract is that Empty means "EOF / shut down the workload", case (d) — a benign race after a wakeup with no successful TryRead — will cause Hex1b to tear down the workload spuriously. If Empty means "spurious, call me again", cases (b)/(c)/(e) will turn into a tight busy-loop. Couldn't verify the Hex1b contract from this repo.

Fix: confirm IHex1bTerminalWorkloadAdapter.ReadOutputAsync semantics; for (d) loop on TryRead until success or exit the wait; for (c)/(e) ensure the return value matches Hex1b's "workload terminated" sentinel.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Parked as a follow-up - tracking in #17894 because the fix shape depends on confirming Hex1b's contract for the workload adapter's read-output sentinels. Will revisit in a dedicated PR.

Comment thread src/Aspire.TerminalHost/Aspire.TerminalHost.csproj
@github-actions

github-actions Bot commented Jun 3, 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 -- 17866

Or

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

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

This PR introduces a draft, end-to-end “interactive terminals” feature (WithTerminal()) across Aspire.Hosting, DCP spec wiring, a new out-of-process Aspire.TerminalHost, and viewer integrations (Dashboard + CLI), using per-replica Unix domain sockets and Hex1b/HMP v1 as the transport.

Changes:

  • Adds WithTerminal() app-model surface area and lifecycle wiring to materialize per-replica terminal host resources and resolve the terminal-host executable path at BeforeStartEvent.
  • Extends DCP resource specs (executables/containers) with a terminal block and populates it from per-replica terminal layouts.
  • Adds Dashboard and CLI plumbing for discovering/attaching to terminal sessions, plus build/packaging work to ship a per-RID TerminalHost payload.
Show a summary per file
File Description
tests/Shared/Aspire.Templates.Testing.targets Excludes TerminalHost SDK packs from unexpected-package assertions.
tests/Aspire.TerminalHost.Tests/TerminalHostArgsTests.cs Unit tests for terminal host argument parsing.
tests/Aspire.TerminalHost.Tests/Aspire.TerminalHost.Tests.csproj New test project for Aspire.TerminalHost.
tests/Aspire.Templates.Tests/README.md Documents TerminalHost SDK pack as part of workload inputs.
tests/Aspire.Hosting.Tests/DistributedApplicationBuilderTests.cs Ensures terminal host subscriber is registered by default.
tests/Aspire.Hosting.Tests/Dcp/DcpExecutorTests.cs Adds tests for per-replica terminal spec population and executable replica annotations.
tests/Aspire.Hosting.Tests/Dcp/ConfigureDefaultDcpOptionsTests.cs Tests new dashboard→terminalhost bundle fallback behavior in DCP options.
tests/Aspire.Hosting.Tests/Backchannel/BackchannelContractTests.cs Adds terminal backchannel types to contract test coverage.
tests/Aspire.Dashboard.Tests/Terminal/TerminalWebSocketProxyOriginTests.cs Tests origin-validation logic for terminal WebSocket proxy.
tests/Aspire.Dashboard.Tests/Terminal/DefaultTerminalConnectionResolverTests.cs Tests resolver behavior for locating/connecting to per-replica sockets.
tests/Aspire.Dashboard.Tests/Model/ResourceViewModelExtensionsTerminalTests.cs Tests terminal-related snapshot property parsing helpers.
tests/Aspire.Cli.Tests/Utils/CliTestHelper.cs Registers new terminal commands in CLI test DI.
tests/Aspire.Cli.Tests/TestServices/TestAppHostAuxiliaryBackchannel.cs Adds terminal-related capability flags + RPC stubs to the test backchannel.
tests/Aspire.Cli.Tests/Commands/TerminalCommandViewerOptionTests.cs Tests CLI parsing/help text for --viewer behavior.
tests/Aspire.Cli.Tests/Backchannel/BackchannelJsonSerializerContextTests.cs Back-compat + roundtrip tests for new terminal backchannel payloads.
src/Shared/TerminalHost/TerminalHostControlProtocol.cs Shared JSON-RPC wire types for AppHost↔TerminalHost control channel.
src/Shared/Model/KnownProperties.cs Adds terminal.* snapshot property keys used by the dashboard.
src/Aspire.TerminalHost/TerminalHostControlRpcTarget.cs Implements control-plane RPC target methods for terminal host process.
src/Aspire.TerminalHost/TerminalHostControlListener.cs Hosts a StreamJsonRpc server over a control UDS with permission tightening.
src/Aspire.TerminalHost/TerminalHostArgs.cs Defines terminal host argument parsing and validation.
src/Aspire.TerminalHost/TerminalHostApp.cs Implements terminal host app lifecycle, control listener, and shutdown flow.
src/Aspire.TerminalHost/StderrLoggerProvider.cs Minimal stderr logger provider to avoid extra logging deps.
src/Aspire.TerminalHost/Program.cs Console entry point with Ctrl+C cancellation wiring.
src/Aspire.TerminalHost/Aspire.TerminalHost.csproj New per-RID terminal host executable project.
src/Aspire.Managed/Program.cs Adds terminalhost subcommand dispatch in the multi-mode managed binary.
src/Aspire.Managed/Aspire.Managed.csproj References Aspire.TerminalHost for bundle dispatch support.
src/Aspire.Hosting/Lifecycle/TerminalHostEventingSubscriber.cs Resolves terminal host binary + invocation args during BeforeStartEvent.
src/Aspire.Hosting/DistributedApplicationBuilder.cs Registers the terminal host eventing subscriber.
src/Aspire.Hosting/Dcp/Model/TerminalSpec.cs Adds DCP terminal spec model (udsPath/cols/rows).
src/Aspire.Hosting/Dcp/Model/Executable.cs Adds terminal block to executable spec model.
src/Aspire.Hosting/Dcp/Model/Container.cs Adds terminal block to container spec model.
src/Aspire.Hosting/Dcp/ExecutableCreator.cs Populates per-replica spec.Terminal and fixes replica annotations for plain executables.
src/Aspire.Hosting/Dcp/DcpOptions.cs Adds TerminalHostPath + invocation args, includes bundle fallback from dashboard path.
src/Aspire.Hosting/Dcp/ContainerCreator.cs Populates container spec.Terminal from terminal layout.
src/Aspire.Hosting/Dashboard/DashboardServiceData.cs Stamps terminal markers/replica info and (sensitive) consumer UDS path onto snapshots.
src/Aspire.Hosting/Backchannel/TerminalHostControlClient.cs Adds AppHost-side control RPC client over UDS with bounded retry.
src/Aspire.Hosting/Backchannel/BackchannelDataTypes.cs Adds terminal capability strings + request/response DTOs.
src/Aspire.Hosting/Backchannel/AuxiliaryBackchannelRpcTarget.cs Adds GetTerminalInfoAsync + ListTerminalsAsync RPCs and terminal capabilities.
src/Aspire.Hosting/Aspire.Hosting.csproj Links shared terminal control protocol types into hosting assembly.
src/Aspire.Hosting/ApplicationModel/TerminalHostResource.cs Defines hidden per-replica terminal host executable resource.
src/Aspire.Hosting/ApplicationModel/TerminalHostLayout.cs Defines per-replica socket layout (producer/consumer/control).
src/Aspire.Hosting/ApplicationModel/TerminalAnnotation.cs Adds terminal annotation + deferred per-replica host materialization.
src/Aspire.Hosting.Tasks/ResolveAspireCliBundle.cs Extends bundle resolution outputs for terminal host path/args.
src/Aspire.Hosting.AppHost/build/Aspire.Hosting.AppHost.in.targets Emits assembly metadata for terminal host discovery + bundle wiring.
src/Aspire.Dashboard/wwwroot/js/xterm/xterm.min.css Adds xterm.js CSS asset.
src/Aspire.Dashboard/wwwroot/js/xterm/addon-fit.min.js Adds xterm.js fit addon asset.
src/Aspire.Dashboard/wwwroot/fonts/cascadia-mono-nf/README.md Documents bundled terminal font choice and provenance.
src/Aspire.Dashboard/wwwroot/fonts/cascadia-mono-nf/LICENSE.txt Adds font license text for redistribution compliance.
src/Aspire.Dashboard/Terminal/NullTerminalConnectionResolver.cs Adds no-op resolver for non-AppHost dashboard scenarios.
src/Aspire.Dashboard/Terminal/ITerminalConnectionResolver.cs Defines dashboard abstraction for resolving terminal connections.
src/Aspire.Dashboard/Terminal/DefaultTerminalConnectionResolver.cs Implements resolver via snapshot properties + UDS connect.
src/Aspire.Dashboard/Program.cs Adds dashboard crash/heartbeat stderr diagnostics.
src/Aspire.Dashboard/Model/ResourceViewModelExtensions.cs Adds terminal-related helpers for snapshot properties.
src/Aspire.Dashboard/DashboardWebApplication.cs Registers terminal resolver and maps terminal WebSocket endpoint.
src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs Switches console logs page to terminal view when terminal-enabled resource selected.
src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor UI changes to host terminal view + terminal toolbar controls.
src/Aspire.Dashboard/Components/Controls/TerminalView.razor Adds Blazor host element for xterm.js terminal.
src/Aspire.Dashboard/Aspire.Dashboard.csproj Adds Hex1b dependency + adjusts content/none items for font README.
src/Aspire.Cli/Program.cs Registers terminal commands in CLI host.
src/Aspire.Cli/Commands/TerminalCommand.cs Adds terminal parent command.
src/Aspire.Cli/Commands/RootCommand.cs Adds terminal command to root.
src/Aspire.Cli/Backchannel/IAppHostAuxiliaryBackchannel.cs Extends backchannel interface for terminal capability + RPC methods.
src/Aspire.Cli/Backchannel/BackchannelJsonSerializerContext.cs Adds JSON source-gen entries for new terminal DTOs.
src/Aspire.Cli/Backchannel/AppHostAuxiliaryBackchannel.cs Implements terminal RPC calls + capability gating in the CLI backchannel.
src/Aspire.Cli/Aspire.Cli.csproj Adds Hex1b dependency for CLI terminal client functionality.
src/Aspire.AppHost.Sdk/SDK/Sdk.in.targets Adds implicit TerminalHost SDK pack reference alongside dashboard/DCP packs.
playground/Terminals/Terminals.Repl/Terminals.Repl.csproj Adds demo interactive REPL project.
playground/Terminals/Terminals.Repl/Program.cs Implements demo ANSI REPL commands for terminal testing.
playground/Terminals/Terminals.AppHost/Terminals.AppHost.csproj Adds demo AppHost project and optional inner-loop terminal host discovery.
playground/Terminals/Terminals.AppHost/Properties/launchSettings.json Adds launch profiles for playground AppHost.
playground/Terminals/Terminals.AppHost/appsettings.json Adds logging configuration for playground.
playground/Terminals/Terminals.AppHost/appsettings.Development.json Adds dev logging configuration for playground.
playground/Terminals/Terminals.AppHost/AppHost.cs Demonstrates terminal-enabled resources and replicas.
playground/Terminals/aspire.config.json Points aspire tooling to the playground AppHost.
eng/terminalhostpack/UnixFilePermissions.xml Defines Unix executable permissions for packed terminal host tools.
eng/terminalhostpack/Sdk.targets Adds transitive SDK targets for terminal host discovery properties.
eng/terminalhostpack/Sdk.props Adds placeholder SDK props.
eng/terminalhostpack/Common.projitems Adds RID-packaging project items to publish/pack terminal host.
eng/terminalhostpack/buildTransitive/Aspire.TerminalHost.Sdk.in.targets BuildTransitive target import for TerminalHost SDK pack.
eng/terminalhostpack/buildTransitive/Aspire.TerminalHost.Sdk.in.props BuildTransitive props import for TerminalHost SDK pack.
eng/terminalhostpack/buildMultiTargeting/Aspire.TerminalHost.Sdk.in.targets BuildMultiTargeting target import for TerminalHost SDK pack.
eng/terminalhostpack/buildMultiTargeting/Aspire.TerminalHost.Sdk.in.props BuildMultiTargeting props import for TerminalHost SDK pack.
eng/terminalhostpack/AutoImport.props Placeholder auto-import props for workload infra.
eng/terminalhostpack/Aspire.TerminalHost.Sdk.win-x64.csproj New RID-specific packaging project (win-x64).
eng/terminalhostpack/Aspire.TerminalHost.Sdk.win-arm64.csproj New RID-specific packaging project (win-arm64).
eng/terminalhostpack/Aspire.TerminalHost.Sdk.osx-x64.csproj New RID-specific packaging project (osx-x64).
eng/terminalhostpack/Aspire.TerminalHost.Sdk.osx-arm64.csproj New RID-specific packaging project (osx-arm64).
eng/terminalhostpack/Aspire.TerminalHost.Sdk.linux-x64.csproj New RID-specific packaging project (linux-x64).
eng/terminalhostpack/Aspire.TerminalHost.Sdk.linux-musl-x64.csproj New RID-specific packaging project (linux-musl-x64).
eng/terminalhostpack/Aspire.TerminalHost.Sdk.linux-arm64.csproj New RID-specific packaging project (linux-arm64).
eng/Publishing.props Publishes terminal host artifacts ZIPs alongside dashboard artifacts.
eng/Build.props Includes terminalhostpack in bundle-deps build logic and skip switches.
docs/specs/with-terminal.md Adds architecture/spec documentation for WithTerminal feature.
Directory.Packages.props Updates Hex1b package versions repo-wide.
Directory.Build.props Adds terminal host artifacts directory + inner-loop path property.
Aspire.slnx Adds TerminalHost projects and new playground/tests to the solution.
.github/workflows/build-cli-native-archives.yml Includes TerminalHost SDK nupkgs in native archive build artifacts.

Copilot's findings

  • Files reviewed: 110/113 changed files
  • Comments generated: 13

Comment thread src/Aspire.Hosting/Backchannel/AuxiliaryBackchannelRpcTarget.cs Outdated
Comment thread src/Aspire.Hosting/Backchannel/AuxiliaryBackchannelRpcTarget.cs
Comment thread src/Aspire.Cli/Backchannel/AppHostAuxiliaryBackchannel.cs Outdated
Comment thread src/Aspire.Hosting/Dashboard/DashboardServiceData.cs Outdated
Comment on lines +86 to +88
case "--control-uds":
control = ParseString(args, ref i, "--control-uds");
break;
Comment thread docs/specs/with-terminal.md
Comment thread src/Aspire.Dashboard/Program.cs Outdated
Comment thread src/Aspire.Dashboard/Terminal/ITerminalConnectionResolver.cs
Comment thread docs/specs/with-terminal.md Outdated
Comment thread docs/specs/with-terminal.md Outdated
Mitch Denny (mitchdenny) added a commit that referenced this pull request Jun 3, 2026
… ~/.aspire/trmnl/

Previously, each AppHost run created a Directory.CreateTempSubdirectory("aspire-term-")
in $TMPDIR and dropped per-replica subdirectories with the UDS triple inside. That:

  - did not match the repo convention for per-user runtime state (~/.aspire/cli/bch,
    ~/.aspire/dev-certs, ~/.aspire/deployments)
  - dropped sockets in the global /tmp on Linux where distros vary on /tmp perms
  - on macOS could push absolute paths close to sockaddr_un.sun_path (104 bytes)
  - made it impossible for external tools to enumerate live terminals on disk

This change introduces a flat layout where every per-replica file is named
{replicaId}.{purpose} under ~/.aspire/trmnl/, with replicaId = base64url(xxHash3(
NormalizePath(appHostPath) ++ NUL ++ resourceName ++ NUL ++ replicaIndex)). The
four files for a replica are:

  {id}.dcp.sock      — producer UDS (host listens, DCP dials)
  {id}.host.sock     — consumer UDS (host listens, viewers dial)
  {id}.control.sock  — control UDS  (host listens, AppHost dials)
  {id}.metadata.json — descriptor sidecar (schema, replica id, resource name,
                       replica index, AppHost path, AppHost PID, columns, rows,
                       socket paths, createdAtUtc)

Security and defense-in-depth:
  - ~/.aspire/trmnl/ is created 0700 on Unix
  - metadata sidecar is written 0600
  - producer / consumer sockets get a best-effort post-bind chmod 0600 from
    TerminalReplica.ApplyRestrictiveSocketPermissionsAsync (the control socket
    already had its own explicit 0600 chmod in TerminalHostControlListener)
  - cleanup deletes by {replicaId}.* glob on ApplicationStopped, not rmdir, so
    multiple AppHosts can safely share the trmnl directory

Resolves Medium finding #4 from PR #17866 (sun_path length not validated): the
new layout produces ~52-byte absolute paths on macOS, well under the 104-byte
sockaddr_un.sun_path limit, and TerminalHostPathsTests.GetSocketPathFitsInsideMacOsSunPathLimit
guards against future regressions.

New tests:
  - TerminalHostPathsTests (10 cases): replica id determinism, distinctness across
    {index, resource, AppHost path}, tuple-boundary collision guard, case-sensitivity
    on Unix, path layout shape, sun_path size guard
  - WithTerminalWritesMetadataSidecarWithExpectedShape: verifies on-disk JSON
    fields and 0600 perms
  - WithTerminalCleansUpPerReplicaFilesOnApplicationStopped: now asserts the
    production metadata write, no longer touches sentinels
  - ProducerAndConsumerSocketsAreRestrictedToOwningUser: verifies post-bind 0600

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Comment thread docs/specs/with-terminal.md Outdated
Comment thread src/Aspire.AppHost.Sdk/SDK/Sdk.in.targets Outdated
Mitch Denny (mitchdenny) and others added 12 commits June 4, 2026 14:07
…xtension method

Implements Phase 1 of the live terminal support feature (#16317).

- TerminalAnnotation: IResourceAnnotation with TerminalOptions (Columns, Rows, Shell)
  and a SocketPath property for the UDS path set by the orchestrator.

- TerminalHostResource: Internal hidden resource (IResourceWithParent) that will
  manage the Hex1b-based terminal host process for a parent resource.

- WithTerminal<T>(): Extension method that adds TerminalAnnotation to a resource,
  creates a hidden TerminalHostResource, and adds a WaitAnnotation so the parent
  waits for the terminal host to be started.

- Tests: 8 unit tests covering annotation creation, custom options, hidden resource
  creation, wait annotation wiring, chaining, container support, manifest exclusion,
  and null argument handling.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- docs/specs/terminal-protocol.md: Full protocol specification defining
  the binary framing format for terminal I/O over Unix domain sockets.
  Covers HELLO, DATA, RESIZE, EXIT, and CLOSE message types with wire
  examples and implementation notes for DCP (Go) and Aspire (C#).

- src/Shared/Terminal/: Shared protocol types (TerminalProtocol constants,
  TerminalFrameReader, TerminalFrameWriter, TerminalFrame) designed to be
  linked into Aspire.Hosting, Dashboard, and CLI projects.

- playground/Terminals/: Two-project playground demonstrating WithTerminal
  without DCP:
  - Terminals.TerminalHost: .NET console app using Hex1b with a custom
    IHex1bTerminalPresentationAdapter that implements the Aspire Terminal
    Protocol over UDS. Receives socket path via TERMINAL_SOCKET_PATH env var.
  - Terminals.AppHost: Aspire AppHost that launches the terminal host as
    a child process with a custom resource lifecycle (OnInitializeResource),
    demonstrating the full WithTerminal flow before DCP PTY support lands.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Terminals.Client: Standalone console app that connects to an Aspire
Terminal Protocol UDS server, performs the HELLO handshake, puts the
local console in raw mode, and bridges stdin/stdout bidirectionally.
Supports Ctrl+] to detach.

Verified end-to-end: TerminalHost starts pwsh with Hex1b PTY, listens
on UDS. Client connects, receives HELLO(v1, 80x24, Pty), and gets a
fully interactive PowerShell session with prompt rendering and command
execution working correctly.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
DCP Model:
- TerminalSpec: New model type with enabled, socketPath, columns, rows
- Added Terminal property to ExecutableSpec and ContainerSpec
- ExecutableCreator populates TerminalSpec from TerminalAnnotation

Backchannel:
- GetTerminalInfoRequest/Response in BackchannelDataTypes
- GetTerminalInfoAsync on AuxiliaryBackchannelRpcTarget (server)
- GetTerminalInfoAsync on AppHostAuxiliaryBackchannel (client)
- Added to IAppHostAuxiliaryBackchannel interface

CLI:
- New 'aspire terminal <resource>' command (TerminalCommand.cs)
- Connects to AppHost backchannel, gets terminal UDS path
- Connects to UDS, performs HELLO handshake
- Puts console in raw mode, bridges stdin/stdout bidirectionally
- Ctrl+] to detach, handles EXIT/CLOSE frames
- Registered in RootCommand and DI container

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds a second WithTerminal overload that accepts a
Func<CancellationToken, Task<string>> socketPathProvider for resources
that manage their own terminal server (e.g., remote SSH, cloud resources).

Unlike the standard overload, this does NOT create a hidden
TerminalHostResource — the caller is responsible for running a server
that speaks the Aspire Terminal Protocol on the provided socket path.

Also adds SocketPathProvider property to TerminalAnnotation and
two new tests (10 total, all passing).

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

Dashboard terminal view that replaces Console Logs for terminal-enabled resources:

- TerminalView.razor: Blazor component wrapping xterm.js via JS interop
- TerminalView.razor.js: xterm.js initialization, WebSocket connection, resize handling
- TerminalWebSocketProxy.cs: ASP.NET Core middleware at /api/terminal that bridges
  browser WebSocket to UDS using the Aspire Terminal Protocol (HELLO/DATA/RESIZE/EXIT/CLOSE)
- Vendored xterm.js 5.5.0 + fit addon in wwwroot/js/xterm/

ConsoleLogs integration:
- ConsoleLogs.razor: Conditionally renders TerminalView instead of LogViewer
  when the selected resource has terminal.enabled property
- ConsoleLogs.razor.cs: Detects terminal resources in SubscribeAsync,
  skips console log subscription for terminal resources

Infrastructure:
- KnownProperties.Terminal.Enabled/SocketPath constants in shared model
- DashboardServiceData: Injects terminal.enabled and terminal.socketPath
  properties into resource snapshots when TerminalAnnotation is present
- ResourceViewModelExtensions: HasTerminal() and TryGetTerminalSocketPath()

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

Two fixes for the Blazor unhandled error:
1. xterm.min.js is UMD format, not ES module — cannot use dynamic import().
   Changed to load via script tags into window.Terminal / window.FitAddon.
2. initTerminal returned a plain JS object which can't be marshaled as
   IJSObjectReference. Changed to return an int ID and use a Map-based
   registry on the JS side.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
New project: src/Aspire.TerminalHost/
- Console app using Hex1b with UnixDomainSocketPresentationAdapter
- Speaks Aspire Terminal Protocol over UDS
- Receives config via TERMINAL_SOCKET_PATH, TERMINAL_COLUMNS/ROWS/SHELL env vars
- Bridges PTY shell ↔ UDS clients

AppHost discovery (following Dashboard pattern):
- DcpOptions.TerminalHostPath for path resolution
- Three-tier discovery: env var (ASPIRE_TERMINAL_HOST_PATH) → config → assembly metadata
- Assembly metadata key: 'aspireterminalhostpath'
- MSBuild target SetTerminalHostDiscoveryAttributes in AppHost.in.targets
- Development path: artifacts/bin/Aspire.TerminalHost/{Config}/net8.0/

WithTerminal lifecycle:
- AddTerminalHostResource now generates UDS path and sets it on TerminalAnnotation
- OnInitializeResource resolves terminal host binary via DcpOptions
- Launches terminal host as child process with env var configuration
- Forwards stderr to resource logs
- Manages process lifecycle with clean shutdown

DCP flow:
- TerminalAnnotation.SocketPath → TerminalSpec on ExecutableSpec/ContainerSpec
- DCP receives terminal.enabled + terminal.socketPath in the CRD spec
- DCP can use socketPath to forward PTY I/O (Go implementation separate)

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

The playground's TerminalDemoResource manages its own terminal host
process lifecycle, so it should use WithTerminal(socketPathProvider)
instead of the bare WithTerminal() which now also launches a terminal
host. Using the custom overload avoids creating a conflicting hidden
TerminalHostResource.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replaces the presentation adapter approach with a presentation filter
architecture (modeled after Hex1b's DiagnosticsSocketListener):

- Terminal runs headless (Hex1b manages internal screen state)
- TerminalSocketServer is an IHex1bTerminalPresentationFilter that
  intercepts all output via OnOutputAsync and broadcasts to clients
- On client connect: CreateSnapshot().ToAnsi() captures current screen
  state and sends it as the first DATA frame after HELLO (with REPLAY flag)
- On client disconnect: terminal keeps running, accepts new connections
- On reconnect: fresh snapshot replayed, then live streaming resumes

This enables navigating away from the terminal in the Dashboard and
returning to find the same terminal state preserved.

Key changes:
- New TerminalSocketServer.cs (filter-based, session management)
- Program.cs: WithHeadless() + AddPresentationFilter(server) instead of
  WithPresentation(adapter)
- Old UnixDomainSocketPresentationAdapter kept for playground compatibility

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Refactor the WithTerminal API to match the new architecture decided for the
13.4 end-to-end work:

- TerminalAnnotation: drop SocketPath / SocketPathProvider; carry a strong
  reference to the hidden TerminalHostResource and the user-supplied
  TerminalOptions instead. The host owns its own UDS layout.

- TerminalHostResource: now public and derives from ExecutableResource so
  DCP launches it as a regular hidden executable. Carries a Parent
  reference plus the per-resource TerminalHostLayout. Constructed with a
  placeholder command (UnresolvedCommand) so we can rewrite it later.

- TerminalHostLayout (new): per-resource, per-run UDS layout — N producer
  paths under {tmp}/aspire-term-{guid}/dcp/, N consumer paths under
  host/, and one control.sock. Built via Directory.CreateTempSubdirectory
  per the repo temp-directory convention.

- TerminalHostEventingSubscriber (new): subscribes to BeforeStartEvent and
  resolves the real terminal host binary from DcpOptions.TerminalHostPath
  before DCP launches the resource. Emits a warning if the path is unset
  or if the parent's replica count drifted between WithTerminal() and
  start. Registered via TryAddEventingSubscriber in the builder.

- TerminalResourceBuilderExtensions: single overload, eager UDS layout,
  hidden host as ExecutableResource, args wired via a callback
  (--replica-count, --producer-uds xN, --consumer-uds xN, --control-uds,
  --columns, --rows, --shell). Adds a WaitAnnotation on the host
  (WaitUntilStarted for now; Phase 2 will upgrade to WaitUntilHealthy
  once the host exposes a health probe). Throws on double WithTerminal
  call.

- Stub leftovers in ExecutableCreator, AuxiliaryBackchannelRpcTarget, and
  DashboardServiceData for proper wire-up in Phases 4/5/7. Each stub is
  marked with a comment.

- Update WithTerminalTests to cover the new design (15 tests, all green).

- Drop playground/Terminals/Terminals.AppHost/TerminalDemoResource.cs and
  stub Terminals.AppHost itself; full playground rebuild lands in Phase 8.

- Add a GetTerminalInfoAsync stub on TestAppHostAuxiliaryBackchannel so
  the CLI test fake satisfies the interface.

Build is green with /p:SkipNativeBuild=true. WithTerminalTests pass 15/15.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replaces the custom binary frame protocol with Hex1b 0.137 HMP v1 and
adopts the per-replica UDS pair design from Phase 1.

The host now creates one independent Hex1bTerminal per replica using
WithHmp1UdsClient(producerUds[i]).WithHmp1UdsServer(consumerUds[i]).
DCP runs the HMP v1 producer side; viewers (CLI / Dashboard) connect
to the consumer side. State replay on reconnect is handled by Hex1b.

A small StreamJsonRpc control listener on a separate UDS exposes
GetReplicas() and Shutdown() so the AppHost backchannel can populate
GetTerminalInfoAsync() without sharing the data plane.

The host no longer auto-exits when all replicas exit -- DCP owns the
host lifetime via cancellation or the control protocol.

Removed: src/Shared/Terminal/* (custom protocol), TerminalSocketServer,
UnixDomainSocketPresentationAdapter, playground/Terminals.TerminalHost.

Added: tests/Aspire.TerminalHost.Tests with 17 tests (12 args, 5 app)
covering arg parsing edge cases plus end-to-end control-listener +
replica startup over real UDS sockets. All 17 pass on Windows.

Phase 1 WithTerminalTests (15/15) still pass.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Mitch Denny (mitchdenny) and others added 2 commits June 7, 2026 19:11
The control listener's accept loop bailed on any SocketException, which
caused ConcurrentControlConnectsAreRefusedDownToOne to fail intermittently
on Ubuntu CI: under load, AcceptAsync can surface EAGAIN even though it is
awaiting, which killed the control channel for the rest of the process.

Bump the listen backlog from 5 to 16 to absorb reconnect bursts (the
single-client contract still holds — extra accepts are immediately closed
by the existing 'one client wins' logic), and catch transient socket
errors (EAGAIN/EWOULDBLOCK/EINTR) so the loop retries instead of dying.

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

When running `dotnet run --project src/Aspire.Cli` inside the Aspire repo
checkout, the bundle layout discovered for terminal-host injection resolves
to the user's installed CLI cache (e.g. ~/.aspire/bundle/) whose
aspire-managed predates the `terminalhost` subcommand. That caused
WithTerminal() resources launched via the repo CLI to fail with a
confusing "older CLI" diagnostic, even though the repo had just built a
working aspire-managed in artifacts/bin/Aspire.Managed/Debug/net10.0/.

Prefer the repo-local artifact over the bundle layout when
AspireRepositoryDetector locates an Aspire repo root. The detector is
DEBUG-gated (walks for Aspire.slnx) and release-only honors
ASPIRE_REPO_ROOT, so installed CLIs are unaffected.

Also fall through to the terminal-host injection when no bundle layout
exists at all, so a clean dev machine (no `aspire` install) still gets
terminal host wired up from the repo build.

Adds a test seam (RepoLocalManagedPathProviderOverride) so existing tests
that build fake bundle layouts under temp paths don't get shadowed by the
real in-repo build artifact, plus a new test covering the repo-local
override path.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Mitch Denny (mitchdenny) added a commit to mitchdenny/aspire that referenced this pull request Jun 9, 2026
CLI (TerminalAttachCommand, TerminalPsCommand): route failed connection
results through AppHostConnectionResultHandler so bad --apphost paths,
missing SDKs, and other project-resolution errors propagate the proper
non-zero exit code instead of silently returning 0. For
'terminal ps --format json', JSON consumers still get '[]' on
'no running AppHost' (a normal state), but project-resolution errors
now error out with their real exit code.

Dashboard (ConsoleLogs terminal toolbar): pull the previously hard-coded
toolbar strings (Decrease/Increase font size, Terminal font size,
Terminal grid size, Current terminal grid, Take control, Primary,
Connecting…, primary/no-primary/viewer/connecting titles) into
ConsoleLogs.resx so they can be localized like the rest of the page.
Includes regenerated .Designer.cs and UpdateXlf-refreshed xlf files
for all 13 locales.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Mitch Denny (mitchdenny) and others added 2 commits June 10, 2026 09:34
…ample

The polyglot/guest AppHost path (DotNetBasedAppHostServerProject) generates
and runs AppHostServer.dll under ~/.aspire/hosts/, bypassing aspire-managed
entirely. Without injection, WithTerminal() from a TypeScript AppHost
resolves to <unresolved-aspire-terminalhost> when running from inside the
repo because no per-RID NuGet stamps the metadata path.

Inject ASPIRE_TERMINAL_HOST_PATH (+ invocation args) using the repo-local
aspire-managed artifact, mirroring DotNetAppHostProject. The hardcoded
artifact path now lives in exactly one place: the new shared helper
BundleDiscovery.TryGetRepoLocalManagedPath.

Adds playground/TerminalsJs: a TS AppHost with a dependency-free Node
guessing game wired up with .withTerminal() to exercise the polyglot path
end-to-end.

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

- WithTerminal<T>() now has [Experimental("ASPIRETERMINAL001")].
- Internal WithTerminalForPolyglot pragmas the diagnostic since it calls
  the now-experimental public method.
- New CLI feature flag KnownFeatures.TerminalCommandsEnabled (default off);
  RootCommand only registers 'aspire terminal' when enabled.
- Tests/playground updated:
  - Aspire.Hosting.Tests adds ASPIRETERMINAL001 to NoWarn.
  - Terminals.AppHost playground pragmas the diagnostic.
  - TerminalCommandTests / TerminalCommandViewerOptionTests enable the
    feature via CliTestHelper options (existing pattern).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 10, 2026 04:54

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's findings

Files not reviewed (1)
  • src/Aspire.Dashboard/Resources/ConsoleLogs.Designer.cs: Language not supported
  • Files reviewed: 133/137 changed files
  • Comments generated: 3

Comment thread src/Aspire.TerminalHost/Aspire.TerminalHost.csproj Outdated
Comment thread src/Aspire.Dashboard/Model/ResourceViewModelExtensions.cs Outdated
Comment thread tests/Aspire.Hosting.Tests/Backchannel/BackchannelContractTests.cs Outdated
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 10, 2026 05:00
Mitch Denny (mitchdenny) and others added 3 commits June 10, 2026 15:01
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
These assets were bundled with the dashboard for TerminalView (xterm.js
5.5.0 + addon-fit 0.10.0, MIT; Cascadia Mono NF v2407.24, SIL OFL 1.1)
but were missing from the top-level notices file. Per-folder LICENSE
files remain alongside the assets; this commit adds the same entries to
the repo-level THIRD-PARTY-NOTICES.TXT to match the existing pattern
(plotly.js, Bootstrap, etc.). Both licenses are compatible with Aspire's
MIT licensing for redistribution.

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

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's findings

Files not reviewed (1)
  • src/Aspire.Dashboard/Resources/ConsoleLogs.Designer.cs: Language not supported
  • Files reviewed: 134/138 changed files
  • Comments generated: 0 new

@github-actions

Copy link
Copy Markdown
Contributor

CLI E2E Tests unknown — 113 passed, 0 failed, 2 unknown (commit 7505af8)

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
DotNetRunFileBasedAppHostUsesAspireCliBundle Recording · Job · CLI logs
DotNetRunProjectAppHostUsesAspireCliBundle 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
ProcessCommandCallbackReceivesCliArguments 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 #27254630686

@mitchdenny
Mitch Denny (mitchdenny) merged commit 54f7e74 into main Jun 10, 2026
990 of 996 checks passed
@mitchdenny
Mitch Denny (mitchdenny) deleted the feature/with-terminal branch June 10, 2026 07:23
@microsoft-github-policy-service microsoft-github-policy-service Bot added this to the 13.5 milestone Jun 10, 2026
Mitch Denny (mitchdenny) added a commit to microsoft/aspire.dev that referenced this pull request Jun 11, 2026
* docs: add WithTerminal() interactive terminal sessions page

Documents the WithTerminal() experimental API introduced in Aspire 13.5:
- Basic usage (C# and TypeScript)
- Custom terminal dimensions
- Multi-replica support
- Dashboard terminal view
- aspire terminal attach / aspire terminal ps CLI commands

Closes microsoft/aspire#17866 (docs obligation)

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

* docs: address PR review feedback for withterminal docs

- remove redundant sidebar translations block
- clean up unused import and wording updates
- fix CLI reference link target
- remove duplicate build/run call in dimensions sample

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

---------

Co-authored-by: Mitch Denny <midenn@orangecake.local>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions github-actions Bot locked and limited conversation to collaborators Jul 10, 2026
David Pine (IEvangelist) added a commit to microsoft/aspire.dev that referenced this pull request Aug 18, 2026
* [docs] Document timestamp search qualifier for telemetry filtering (#1181)

* docs: document timestamp search qualifier for telemetry filtering

Documents the new 'timestamp' search qualifier added in
microsoft/aspire#17816. Users can now filter traces and structured
logs by date/time using ISO 8601 strings with comparison operators
(>, >=, <, <=) in the dashboard filter bar.

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

* Move timestamp qualifier docs to shared CLI references

Co-authored-by: JamesNK <303201+JamesNK@users.noreply.github.com>

* Fix severity casing in timestamp search example

Co-authored-by: JamesNK <303201+JamesNK@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: James Newton-King <james@newtonking.com>

* Apply suggestion from @JamesNK

* Apply suggestion from @JamesNK

* docs: clarify date-only timestamp search values

Co-authored-by: JamesNK <303201+JamesNK@users.noreply.github.com>

* Apply suggestion from @JamesNK

* Apply suggestion from @JamesNK

* Update timestamp example dates to use 2026

---------

Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: JamesNK <303201+JamesNK@users.noreply.github.com>
Co-authored-by: James Newton-King <james@newtonking.com>

* [docs] Fix persistent container endpoint proxy default docs (#1227)

* Fix persistent container endpoint proxy default docs

Persistent containers use proxied endpoints by default (same as session
containers), while persistent executables and projects default to proxyless
endpoints. Also document that proxyless container endpoints with only a
targetPort immediately allocate the targetPort as the host port.

Corrects docs that previously stated all persistent resources default to
proxyless endpoints.

Documents changes from microsoft/aspire#17960.

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

* Potential fix for pull request finding

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

---------

Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Negstad <50252651+danegsta@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Add Aspire 13.5 release scaffold

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

* [docs] Update Foundry Local docs to reflect CLI-based lifecycle (aspire#17889) (#1210)

* docs: update Foundry Local section to reflect CLI-based lifecycle

The Foundry Local integration now uses the installed 'foundry' CLI
(foundry service start/stop/list and foundry model download/load)
instead of the FoundryLocalManager in-proc APIs. Aspire manages the
entire service lifecycle automatically.

Update docs to:
- Clarify users do not need to pre-start Foundry Local
- State that the 'foundry' CLI must be on PATH
- Describe the automatic start/stop lifecycle management

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

* Potential fix for pull request finding

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

---------

Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Sébastien Ros <sebastienros@gmail.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* docs: document coding agent telemetry detection (aspire#18065)

Add a new row to the CLI telemetry data points table for Aspire CLI 13.5
documenting the new coding agent detection telemetry.

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

* [docs] Add WithTerminal() interactive terminal sessions page (#1244)

* docs: add WithTerminal() interactive terminal sessions page

Documents the WithTerminal() experimental API introduced in Aspire 13.5:
- Basic usage (C# and TypeScript)
- Custom terminal dimensions
- Multi-replica support
- Dashboard terminal view
- aspire terminal attach / aspire terminal ps CLI commands

Closes microsoft/aspire#17866 (docs obligation)

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

* docs: address PR review feedback for withterminal docs

- remove redundant sidebar translations block
- clean up unused import and wording updates
- fix CLI reference link target
- remove duplicate build/run call in dimensions sample

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

---------

Co-authored-by: Mitch Denny <midenn@orangecake.local>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update 13.5 banners and release notes

- Update all banners (18 files across English and 16 locale variants) from 13.4 to 13.5 with engaging messaging
- Replace 13.5 placeholder release notes with comprehensive content from the official changelog
- Include detailed release highlights covering AppHost, CLI, Dashboard, and Extensions improvements
- Document breaking changes (ServiceProvider renamed, PublishAsConnectionString obsolete, aspire ps --resources flag removed)
- Maintain consistent tone and voice with prior What's new articles

Changes cover:
- Interactive terminal sessions with WithTerminal()
- Polyglot IInteractionService across TypeScript, Python, Go, Java, Rust
- User-defined resource command arguments
- TypeScript AppHost stability fixes and optimizations
- Custom health checks for TypeScript AppHosts
- CLI enhancements (npm package, embedded skills bundle)
- Dashboard telemetry improvements (timestamp filtering, better error messages)
- VS Code extension enhancements (Dashboard side panel, Bun debugging, resource commands)
- Foundry Local integration CLI updates
- And more bug fixes and improvements

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

* Document OS information check in aspire doctor command

Add documentation for the new operating system check introduced in
microsoft/aspire#18252. The check appears in the Environment section
of `aspire doctor` output and includes structured metadata in JSON
format.

Changes:
- Update Environment checks description to mention OS reporting
- Add OS check to sample table output
- Add operating-system entry to JSON output example
- Document the osType/displayName/version/description metadata fields

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

* Fix broken WithTerminal link in 13.5 whats-new (#1281)

Point to /app-host/withterminal/ which is the correct slug for the
interactive terminal sessions page, fixing the starlight-links-validator
CI failure.

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

* Add dashboard troubleshooting page (#1255)

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

* [docs] Add deprecation notices to GitHub Models integration docs (#1279)

* Add deprecation notices to GitHub Models integration docs

The GitHub Models service is no longer available to new customers.
Aspire.Hosting.GitHub.Models is sunset in 13.5 — all public APIs are
marked [Obsolete] and the package is hidden from aspire add. Add a
:::caution callout to all three GitHub Models documentation pages to
surface this to existing users.

Documents changes from microsoft/aspire#18405.

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

* docs: add GitHub Models sunset to 13.5 breaking changes

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

* docs: recommend Azure AI Foundry integration as GitHub Models replacement

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

* Apply suggestions from code review

Co-authored-by: David Pine <david.pine@microsoft.com>

---------

Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Sebastien Ros <sebastienros@gmail.com>
Co-authored-by: David Pine <david.pine@microsoft.com>

* Fix forbidden phrases flagged by CI (#1301)

Replace 'app host' with 'AppHost' in dashboard troubleshooting docs and reword the VS Code extension branding note to avoid the literal '.NET Aspire' phrase.

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

* docs: mention Cohere and MistralAI model families in Foundry host docs (#1297)

Documents the available FoundryModel provider families including
Cohere and MistralAI, which gained new model descriptors
(CohereCommandAPlus052026 and MistralMedium35) in Aspire 13.5.

Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* [docs] Clarify C# file-based AppHost launch profile location (#1176)

* docs: clarify C# file-based AppHost launch profile location

The empty C# AppHost template (created with `aspire new`) stores launch
profiles in `apphost.run.json`, not in `aspire.config.json`. The
`aspire.config.json` for this template only contains the `appHost.path`
reference pointing at `apphost.cs`.

Update the AppHost configuration page to distinguish between:
- Project-based AppHosts: profiles in `Properties/launchSettings.json`
- File-based AppHosts: profiles in `apphost.run.json`, with
  `aspire.config.json` holding only the entry-point reference

This aligns the documentation with the fix in microsoft/aspire#17781,
which corrected a regression where the file-based template was
incorrectly emitting a duplicate `profiles` block in `aspire.config.json`.

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

* Apply suggestions from code review

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

---------

Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <david.pine@microsoft.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* [docs] Document icon fallback behavior for resource commands (#1277)

* docs: document icon fallback behavior for resource commands

When a resource command specifies an unrecognized iconName, the
dashboard now renders a QuestionCircle (question mark circle) icon
as a fallback instead of displaying the raw display-name text.
For highlighted commands (IsHighlighted = true) with no iconName,
the dashboard uses a Flash icon by default so the inline action
button stays compact and never overflows the resource row.

Documents changes from microsoft/aspire#18389.

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

* Apply suggestion from @JamesNK

---------

Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: James Newton-King <james@newtonking.com>

* [docs] Add Nix installation path for Aspire CLI (#1286)

* docs: Add Nix installation path for Aspire CLI

Documents the first-party Nix flake for the Aspire CLI introduced in
microsoft/aspire#18410:
- Adds a 'Nix' tab to the Install CLI package manager section, with
  nix run, nix profile add, and flake.nix usage examples
- Updates the 'aspire update --self' section to describe how Nix installs
  print profile/flake update guidance instead of a binary download

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

* docs: address Nix CLI review comments

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

* docs: fix Nix flake CLI example

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

---------

Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Fowler <davidfowl@gmail.com>

* Address aspire doctor doc feedback

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

* [docs] Document proxyless endpoint port pre-allocation (Aspire 13.5) (#1199)

* docs: document proxyless container endpoint on-demand allocation

Documents the on-demand port allocation behavior for dynamic proxyless
container endpoints introduced in Aspire 13.5 (microsoft/aspire#17851).

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

* docs: update proxyless endpoint port allocation

Co-authored-by: danegsta <50252651+danegsta@users.noreply.github.com>

* docs: align proxyless port allocation docs

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

* docs: clarify proxyless container port wording

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

* docs: remove redundant proxyless port text

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

---------

Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: danegsta <50252651+danegsta@users.noreply.github.com>
Co-authored-by: David Negstad <David.Negstad@microsoft.com>

* Add Aspire version placeholders to release docs (#1314)

* Add Aspire version placeholders to release docs

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

* Potential fix for pull request finding

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

* Potential fix for pull request finding

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

* Potential fix for pull request finding

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

* Potential fix for pull request finding

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

* Potential fix for pull request finding

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

* Remove generated Nix icon safelist entry

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

* Document release version placeholder checks

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

* Document current version placeholder review guidance

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

* Use version placeholder in seed database packages

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

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Fix OOM in aspire-version-placeholders build hook (#1318)

* Fix OOM in aspire-version-placeholders build hook

The astro:build:done hook re-walked the entire dist tree with a single
recursive Promise.all, holding the contents of every .html/.md/.txt file
(tens of thousands across all locales, including the large llms-full.txt
assets) in memory at once. On the full production build that exhausted the
default ~4 GB Node heap and crashed with 'JavaScript heap out of memory'.

That broad walk was almost entirely redundant. The remarkAspireVersionPlaceholders
remark plugin is already wired into markdown.remarkPlugins, so placeholders
are replaced before render: .html pages are correct, and llms*.txt is sourced
from rendered HTML via render(entry). The reference/**/*.md endpoints come from
API/sample data, not docs content. The only generated artifact that still
contains raw placeholders is the per-page .md copies emitted by
starlight-page-actions, which viteStaticCopy's raw src/content/docs/** through
a regex-only transform that bypasses the remark pipeline.

Scope the post-build pass to .md files only and stream them through a bounded
worker pool (default concurrency 16). Peak memory is now proportional to the
concurrency limit, and the bulk of dist (.html plus the large .txt assets) is
no longer re-read. Replacement semantics are unchanged.

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

* Address PR review: normalize concurrency and clarify test comment

- Guard against a non-finite/0/negative concurrency value: normalize to a
  finite positive integer (falling back to the default) before computing the
  worker count, so a stray NaN can't collapse the pool to an empty array and
  silently skip every file. Adds a regression test passing NaN.
- Reword the scoping test comment so it no longer implies the seeded
  .html/.txt/.mdx fixtures were already replaced; clarify the assertion is that
  this pass intentionally leaves every non-.md extension untouched.

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

---------

Co-authored-by: David Pine <7679720+IEvangelist@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Add Kubernetes persistent volume documentation (#1328)

* Add Kubernetes persistent volume documentation

Document the first-class KubernetesPersistentVolumeResource feature
(microsoft/aspire PR #16929): a dedicated Persistent volumes on
Kubernetes page under deployment/kubernetes, a concise pointer in the
Kubernetes integration reference, sidebar wiring, and cross-links from
related Kubernetes and data-persistence pages.

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

* Lead persistent volumes page with AddPersistentVolume API

Refocus the opening on the AddPersistentVolume fluent API with a minimal
example up front, rather than the KubernetesPersistentVolumeResource class
name, matching how developers think in terms of AppHost APIs.

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

* Fix TypeScript persistent-volume examples and parameter method names

- Correct withDataVolume TS calls to pass an options object
  (withDataVolume({ name: 'pg-data' })) instead of a name string; the
  TypeScript binding takes WithDataVolumeOptions, not a string.
- Clarify the config-method table: in TypeScript the parameter-accepting
  variants are separate methods (withPvStorageClassParam,
  withPvCapacityParam, withVolumeAnnotationParam), not overloads of the
  string methods.

Verified against the shipped Aspire 13.5.0-preview.1 package by compiling
and publishing both examples with the dev CLI.

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

---------

Co-authored-by: Mitch Denny <midenn@orangecake.local>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Mitch Denny <midenn@Mac.localdomain>

* Add WithTerminal docs and aspire terminal CLI reference (#1329)

* Add WithTerminal docs and aspire terminal CLI reference

Document the experimental WithTerminal() AppHost API for exposing
interactive terminal sessions on resources, plus the aspire terminal,
aspire terminal attach, and aspire terminal ps CLI commands. Wires the
new pages into the docs and reference sidebars and repoints the 13.5
what's-new link to the new slug.

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

* Frame no-auto-debugger as a temporary NOTE callout

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

* Give C# and TypeScript equal billing in with-terminal docs

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

* Consolidate WithTerminal docs onto with-terminal.mdx

Remove the duplicate withterminal.mdx (from #1244) in favor of the
kebab-case with-terminal.mdx, matching the app-host directory naming
convention. Fold in the dashboard section and the TypeScript config
tracking issue reference.

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

* Address PR review: self-contained snippets and ASPIRETERMINAL001 guidance

Add the #pragma warning disable ASPIRETERMINAL001 suppression to the C#
examples, make the Experimental aside actionable, and make the configure
and replicas snippets self-contained (full builder bootstrap + run) for
both C# and TypeScript.

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

---------

Co-authored-by: Mitch Denny <midenn@Mac.localdomain>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Document AI agent skill-usage telemetry (#1229)

* Document AI agent skill usage telemetry in CLI telemetry reference

Extend the Microsoft-collected CLI telemetry page to cover the agent telemetry
hooks installed by 'aspire agent init': the three event types
(skill_invocation, tool_invocation, reference_file_read), the exact
low-cardinality fields recorded, the privacy guarantees (only Aspire-owned
skill/tool names and skill-relative reference paths; never absolute paths, repo
or user names, file contents, or tool arguments), and the
ASPIRE_CLI_AGENT_TELEMETRY_OPTOUT / --no-telemetry-hooks opt-out paths.

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

* Simplify CLI telemetry docs to a single opt-out

Remove the AI-only opt-out section (ASPIRE_CLI_AGENT_TELEMETRY_OPTOUT) and the
'aspire agent init --no-telemetry-hooks' note. The single
ASPIRE_CLI_TELEMETRY_OPTOUT switch disables all CLI telemetry including AI
agent skill usage. Soften the over-claimed opt-out re-check wording.

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

* Apply suggestions from code review

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Alistair Matthews <alistairwebdojo@live.com>

---------

Co-authored-by: David Pine <7679720+IEvangelist@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Alistair Matthews <alistairwebdojo@live.com>

* Document --skills and --skill-locations flags for init and new commands (#1348)

Add documentation for the --skills and --skill-locations options on
aspire init and aspire new commands. These flags were added in
microsoft/aspire#18191 and microsoft/aspire#18192 to support
non-interactive mode for controlling which agent skills are installed
during initialization.

* Document PromptProgressAsync API and add TypeScript examples to interaction service (#1347)

- Add PromptProgressAsync to the interaction service docs with C# and TypeScript examples
- Add CommandProgressOptions section to custom resource commands page
- Integrate TypeScript tabs throughout interaction service documentation
- Update method table and context notes to include PromptProgressAsync

Documents changes from microsoft/aspire#18493

* [docs] CLI: mention 'Stopping Aspire...' feedback message on Ctrl+C (#1353)

* docs: mention 'Stopping Aspire...' feedback message on Ctrl+C

* Potential fix for pull request finding

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

---------

Co-authored-by: David Pine <IEvangelist@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* docs: note graceful backchannel stream cancellation during aspire run shutdown (#1356)

Co-authored-by: David Pine <IEvangelist@users.noreply.github.com>

* docs: document command return values for custom resource commands (#1161)

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

Address review feedback: add TypeScript Markdown example, fix heading style, imp

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

* [docs] Update Bun integration docs for first-party Aspire.Hosting.JavaScript support (#1354)

* docs: update Bun integration page for first-party Aspire.Hosting.JavaScript support

* Apply suggestion from @IEvangelist

* Update bun-apps.mdx

---------

Co-authored-by: David Pine <IEvangelist@users.noreply.github.com>

* Address PR review feedback for release 13.5 docs

- search-filter: fix 'stored with UTC' -> 'stored in UTC'
- configuration: move AppHost type into code-block titles, drop redundant labels
- with-terminal: reword title/seoTitle to 'using WithTerminal', scope experimental Aside to C#, move C#/TypeScript notes inside their TabItems, split dashboard sentence
- troubleshooting: clarify firewall/security software wording
- persistent-volumes: move experimental Aside into C# TabItem, add prerequisites intro, split StatefulSet sentence
- compute/kubernetes: clarify durable storage steps
- terminal command docs: 'using WithTerminal' wording and reworded descriptions

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

Copilot-Session: d03541af-fa62-4d7c-a158-4ece169249af

* [docs] Document automatic HTTPS certificate generation for non-.NET AppHosts (#1355)

* docs: document automatic HTTPS certificate generation for non-.NET AppHosts

Documents the new behavior introduced in microsoft/aspire#17454:
- When aspire run starts a non-.NET AppHost (e.g., TypeScript) in
  non-interactive mode and no HTTPS dev certificate exists, the CLI
  now automatically generates one.
- The ASPIRE_CLI_GENERATE_HTTPS_CERTIFICATE environment variable can
  be set to 'false' to opt out of automatic certificate generation.

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

* Update src/frontend/src/content/docs/app-host/certificate-configuration.mdx

---------

Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Document Go polyglot options flattening breaking change (#1360)

* Dcument Go polyglot options flattening breaking change

* Update documentation on DTOs and code generator behavior

Clarified the behavior of TypeScript and Go code generators regarding optional parameters and DTOs.

* [docs] Obsolete PublishAsConnectionString migration guidance (#1237)

* docs: document PublishAsConnectionString obsolete, update examples to use AddConnectionString

- Update 'Parameter example' in external-parameters.mdx to use
  execution-context-based pattern (IsRunMode) instead of the now-obsolete
  PublishAsConnectionString() API
- Update the Japanese localized version of external-parameters.mdx to match
- Mark PublishAsConnectionString as obsolete in the azure/overview.mdx API
  table and add a migration caution callout showing the AddConnectionString
  pattern with execution context

Relates to microsoft/aspire#18044

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

* Apply suggestions from code review

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <david.pine@microsoft.com>

* ci: retrigger CI run [skip-notes]

* docs: fix PublishAsConnectionString migration samples

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e7ae5d3e-2af9-48ae-8920-cb7c103217a3

---------

Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <david.pine@microsoft.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <7679720+IEvangelist@users.noreply.github.com>

* Document Aspire VS Code AppHost polling (#1382)

Add VS Code extension documentation for showing running AppHosts before workspace discovery completes, the new appHosts polling setting, and the deprecated global setting name.

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

* Document aspire stop --force resource cleanup (#1387)

* Document aspire stop force cleanup

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

Copilot-Session: 45afd624-6e7c-4ee8-84c2-6dbda91702f5

* Apply suggestions from code review

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

---------

Co-authored-by: David Pine <david.pine@microsoft.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* [docs] Update aspire run/stop graceful shutdown documentation (#1291)

* docs: update aspire run/stop graceful shutdown docs for #17814

- Expand aspire-run.mdx 'Stopping the AppHost' section with the full
  three-step shutdown ladder (cooperative cancellation → graceful wait →
  automatic force-kill) and clarify the second Ctrl+C behavior.
- Add a Windows note about isolated console session for tsx/npm AppHosts.
- Correct aspire-stop.mdx description: signal targets the AppHost process
  directly, not an intermediary CLI process.

Source: microsoft/aspire#17814

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

* docs: remove resource/AppHost shutdown conflation from aspire run and stop docs

Co-authored-by: danegsta <50252651+danegsta@users.noreply.github.com>

* Update aspire-run.mdx

---------

Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: danegsta <50252651+danegsta@users.noreply.github.com>
Co-authored-by: David Pine <david.pine@microsoft.com>

* [docs] Update 13.4 what's new: aspire.config.json template profiles regression fix (#1192)

* docs: clarify aspire.config.json template regression fix for C# empty AppHost

The C# empty AppHost template (aspire new aspire-empty) in Aspire 13.4
was generating a duplicate profiles block in aspire.config.json that
was also present in apphost.run.json. This regression is fixed in
microsoft/aspire#17820: launch profiles now live exclusively in
apphost.run.json and aspire.config.json is minimal (AppHost path only).

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

* Apply suggestions from code review

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

---------

Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <david.pine@microsoft.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* [docs] Document aspire stop socket cleanup for detached AppHosts (#1283)

* docs: document aspire stop socket cleanup for detached AppHosts

After aspire stop confirms the AppHost process has terminated, it now
removes the backchannel socket file. This prevents stale-socket errors
when running subsequent commands (aspire add, aspire describe, etc.)
after the stop/detach workflow.

Documents the fix from microsoft/aspire#18296 (fixes #17587).

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

* Potential fix for pull request finding

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

* docs: clarify aspire stop resource cleanup

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

Copilot-Session: 98420587-acfe-4dcc-863d-84663af05421

---------

Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <david.pine@microsoft.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <7679720+IEvangelist@users.noreply.github.com>
Copilot-Session: 98420587-acfe-4dcc-863d-84663af05421

* [docs] Document WithExplicitStart() callback deferral behavior (#1194)

* docs: document WithExplicitStart() callback deferral behavior

Add a new 'Defer resource start with explicit start' section to
resource-lifetimes.mdx explaining how WithExplicitStart() interacts
with execution configuration callbacks (WithEnvironment, WithArgs):

- Session-scoped explicit-start resources defer DCP registration until
  manual start, so callbacks run only when the user starts the resource
  from the dashboard.
- Persistent explicit-start resources are registered immediately (to
  detect existing instances), but use a Spec.Start patch on manual
  start so callbacks are not re-evaluated a second time.

Documents microsoft/aspire#17825.

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

* Apply suggestions from code review

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

* docs: add persistence diagnostic guidance

Clarify the explicit-start examples and document ASPIREPERSISTENCE001 suppression options.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ca76c036-8248-4cdc-a1b2-0d4a1bef31f3

---------

Co-authored-by: aspire-repo-bot[bot] <268009190+aspire-repo-bot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <david.pine@microsoft.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: David Pine <7679720+IEvangelist@users.noreply.github.com>
Copilot-Session: ca76c036-8248-4cdc-a1b2-0d4a1bef31f3

* Merge main into release/13.5 (#1427)

* Revise interaction service API documentation (#1408)

Updated section headings and clarified usage instructions for the interaction service API.

* [auto-sec] Consolidate aspire.dev frontend dependency security remediations (#1392)

* build(deps): bump the npm-all group across 1 directory with 32 updates

Bumps the npm-all group with 32 updates in the /src/frontend directory:

| Package | From | To |
| --- | --- | --- |
| [@astrojs/markdown-remark](https://github.com/withastro/astro/tree/HEAD/packages/markdown/remark) | `7.2.0` | `7.2.1` |
| [@astrojs/mdx](https://github.com/withastro/astro/tree/HEAD/packages/integrations/mdx) | `7.0.0` | `7.0.3` |
| [@astrojs/rss](https://github.com/withastro/astro/tree/HEAD/packages/astro-rss) | `4.0.18` | `4.0.19` |
| [@astrojs/starlight](https://github.com/withastro/starlight/tree/HEAD/packages/starlight) | `0.41.1` | `0.41.3` |
| [@catppuccin/starlight](https://github.com/catppuccin/starlight/tree/HEAD/packages/catppuccin-starlight) | `2.0.1` | `2.1.0` |
| [@expressive-code/plugin-collapsible-sections](https://github.com/expressive-code/expressive-code/tree/HEAD/packages/@expressive-code/plugin-collapsible-sections) | `0.44.0` | `0.44.1` |
| [@expressive-code/plugin-line-numbers](https://github.com/expressive-code/expressive-code/tree/HEAD/packages/@expressive-code/plugin-line-numbers) | `0.44.0` | `0.44.1` |
| [@fontsource-variable/fira-code](https://github.com/fontsource/font-files/tree/HEAD/fonts/variable/fira-code) | `5.2.7` | `5.3.0` |
| [@fontsource-variable/outfit](https://github.com/fontsource/font-files/tree/HEAD/fonts/variable/outfit) | `5.2.8` | `5.3.0` |
| [@fontsource-variable/rubik](https://github.com/fontsource/font-files/tree/HEAD/fonts/variable/rubik) | `5.2.8` | `5.3.0` |
| [@fontsource/poppins](https://github.com/fontsource/font-files/tree/HEAD/fonts/google/poppins) | `5.2.7` | `5.3.0` |
| [asciinema-player](https://github.com/asciinema/asciinema-player) | `3.16.0` | `3.17.0` |
| [astro](https://github.com/withastro/astro/tree/HEAD/packages/astro) | `7.0.3` | `7.1.3` |
| [astro-expressive-code](https://github.com/expressive-code/expressive-code/tree/HEAD/packages/astro-expressive-code) | `0.44.0` | `0.44.1` |
| [satori](https://github.com/vercel/satori) | `0.26.0` | `0.28.1` |
| [satteri](https://github.com/bruits/satteri) | `0.9.4` | `0.9.5` |
| [sharp](https://github.com/lovell/sharp) | `0.34.5` | `0.35.3` |
| [starlight-github-alerts](https://github.com/HiDeoo/starlight-github-alerts/tree/HEAD/packages/starlight-github-alerts) | `0.3.0` | `0.4.0` |
| [starlight-links-validator](https://github.com/HiDeoo/starlight-links-validator/tree/HEAD/packages/starlight-links-validator) | `0.25.1` | `0.25.2` |
| [starlight-llms-txt](https://github.com/delucis/starlight-llms-txt/tree/HEAD/packages/starlight-llms-txt) | `0.10.0` | `0.11.0` |
| [starlight-page-actions](https://github.com/dlcastillop/starlight-page-actions/tree/HEAD/packages/starlight-page-actions) | `0.6.2` | `0.7.0` |
| [@iconify-json/material-icon-theme](https://github.com/iconify/icon-sets) | `1.2.68` | `1.2.69` |
| [@types/hast](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/hast) | `3.0.4` | `3.0.5` |
| [@unocss/astro](https://github.com/unocss/unocss/tree/HEAD/packages-integrations/astro) | `66.6.8` | `66.7.5` |
| [astro-embed](https://github.com/delucis/astro-embed/tree/HEAD/packages/astro-embed) | `0.13.0` | `0.13.1` |
| [eslint](https://github.com/eslint/eslint) | `10.6.0` | `10.7.0` |
| [prettier](https://github.com/prettier/prettier) | `3.9.1` | `3.9.5` |
| [tsx](https://github.com/privatenumber/tsx) | `4.22.4` | `4.23.1` |
| [typescript](https://github.com/microsoft/TypeScript) | `6.0.3` | `7.0.2` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.62.0` | `8.65.0` |
| [unocss](https://github.com/unocss/unocss/tree/HEAD/packages-presets/unocss) | `66.6.8` | `66.7.5` |
| [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `4.1.9` | `4.1.10` |



Updates `@astrojs/markdown-remark` from 7.2.0 to 7.2.1
- [Release notes](https://github.com/withastro/astro/releases)
- [Changelog](https://github.com/withastro/astro/blob/main/packages/markdown/remark/CHANGELOG.md)
- [Commits](https://github.com/withastro/astro/commits/@astrojs/markdown-remark@7.2.1/packages/markdown/remark)

Updates `@astrojs/mdx` from 7.0.0 to 7.0.3
- [Release notes](https://github.com/withastro/astro/releases)
- [Changelog](https://github.com/withastro/astro/blob/main/packages/integrations/mdx/CHANGELOG.md)
- [Commits](https://github.com/withastro/astro/commits/@astrojs/mdx@7.0.3/packages/integrations/mdx)

Updates `@astrojs/rss` from 4.0.18 to 4.0.19
- [Release notes](https://github.com/withastro/astro/releases)
- [Changelog](https://github.com/withastro/astro/blob/main/packages/astro-rss/CHANGELOG.md)
- [Commits](https://github.com/withastro/astro/commits/@astrojs/rss@4.0.19/packages/astro-rss)

Updates `@astrojs/starlight` from 0.41.1 to 0.41.3
- [Release notes](https://github.com/withastro/starlight/releases)
- [Changelog](https://github.com/withastro/starlight/blob/main/packages/starlight/CHANGELOG.md)
- [Commits](https://github.com/withastro/starlight/commits/@astrojs/starlight@0.41.3/packages/starlight)

Updates `@catppuccin/starlight` from 2.0.1 to 2.1.0
- [Release notes](https://github.com/catppuccin/starlight/releases)
- [Changelog](https://github.com/catppuccin/starlight/blob/main/packages/catppuccin-starlight/CHANGELOG.md)
- [Commits](https://github.com/catppuccin/starlight/commits/v2.1.0/packages/catppuccin-starlight)

Updates `@expressive-code/plugin-collapsible-sections` from 0.44.0 to 0.44.1
- [Release notes](https://github.com/expressive-code/expressive-code/releases)
- [Changelog](https://github.com/expressive-code/expressive-code/blob/main/packages/@expressive-code/plugin-collapsible-sections/CHANGELOG.md)
- [Commits](https://github.com/expressive-code/expressive-code/commits/@expressive-code/plugin-collapsible-sections@0.44.1/packages/@expressive-code/plugin-collapsible-sections)

Updates `@expressive-code/plugin-line-numbers` from 0.44.0 to 0.44.1
- [Release notes](https://github.com/expressive-code/expressive-code/releases)
- [Changelog](https://github.com/expressive-code/expressive-code/blob/main/packages/@expressive-code/plugin-line-numbers/CHANGELOG.md)
- [Commits](https://github.com/expressive-code/expressive-code/commits/@expressive-code/plugin-line-numbers@0.44.1/packages/@expressive-code/plugin-line-numbers)

Updates `@fontsource-variable/fira-code` from 5.2.7 to 5.3.0
- [Changelog](https://github.com/fontsource/font-files/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fontsource/font-files/commits/HEAD/fonts/variable/fira-code)

Updates `@fontsource-variable/outfit` from 5.2.8 to 5.3.0
- [Changelog](https://github.com/fontsource/font-files/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fontsource/font-files/commits/HEAD/fonts/variable/outfit)

Updates `@fontsource-variable/rubik` from 5.2.8 to 5.3.0
- [Changelog](https://github.com/fontsource/font-files/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fontsource/font-files/commits/HEAD/fonts/variable/rubik)

Updates `@fontsource/poppins` from 5.2.7 to 5.3.0
- [Changelog](https://github.com/fontsource/font-files/blob/main/CHANGELOG.md)
- [Commits](https://github.com/fontsource/font-files/commits/HEAD/fonts/google/poppins)

Updates `asciinema-player` from 3.16.0 to 3.17.0
- [Release notes](https://github.com/asciinema/asciinema-player/releases)
- [Commits](https://github.com/asciinema/asciinema-player/compare/v3.16.0...v3.17.0)

Updates `astro` from 7.0.3 to 7.1.3
- [Release notes](https://github.com/withastro/astro/releases)
- [Changelog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md)
- [Commits](https://github.com/withastro/astro/commits/astro@7.1.3/packages/astro)

Updates `astro-expressive-code` from 0.44.0 to 0.44.1
- [Release notes](https://github.com/expressive-code/expressive-code/releases)
- [Changelog](https://github.com/expressive-code/expressive-code/blob/main/packages/astro-expressive-code/CHANGELOG.md)
- [Commits](https://github.com/expressive-code/expressive-code/commits/astro-expressive-code@0.44.1/packages/astro-expressive-code)

Updates `satori` from 0.26.0 to 0.28.1
- [Release notes](https://github.com/vercel/satori/releases)
- [Commits](https://github.com/vercel/satori/compare/0.26.0...0.28.1)

Updates `satteri` from 0.9.4 to 0.9.5
- [Release notes](https://github.com/bruits/satteri/releases)
- [Commits](https://github.com/bruits/satteri/compare/satteri-v0.9.4...satteri-v0.9.5)

Updates `sharp` from 0.34.5 to 0.35.3
- [Release notes](https://github.com/lovell/sharp/releases)
- [Commits](https://github.com/lovell/sharp/compare/v0.34.5...v0.35.3)

Updates `starlight-github-alerts` from 0.3.0 to 0.4.0
- [Release notes](https://github.com/HiDeoo/starlight-github-alerts/releases)
- [Changelog](https://github.com/HiDeoo/starlight-github-alerts/blob/main/packages/starlight-github-alerts/CHANGELOG.md)
- [Commits](https://github.com/HiDeoo/starlight-github-alerts/commits/starlight-github-alerts@0.4.0/packages/starlight-github-alerts)

Updates `starlight-links-validator` from 0.25.1 to 0.25.2
- [Release notes](https://github.com/HiDeoo/starlight-links-validator/releases)
- [Changelog](https://github.com/HiDeoo/starlight-links-validator/blob/main/packages/starlight-links-validator/CHANGELOG.md)
- [Commits](https://github.com/HiDeoo/starlight-links-validator/commits/starlight-links-validator@0.25.2/packages/starlight-links-validator)

Updates `starlight-llms-txt` from 0.10.0 to 0.11.0
- [Release notes](https://github.com/delucis/starlight-llms-txt/releases)
- [Changelog](https://github.com/delucis/starlight-llms-txt/blob/main/packages/starlight-llms-txt/CHANGELOG.md)
- [Commits](https://github.com/delucis/starlight-llms-txt/commits/starlight-llms-txt@0.11.0/packages/starlight-llms-txt)

Updates `starlight-page-actions` from 0.6.2 to 0.7.0
- [Release notes](https://github.com/dlcastillop/starlight-page-actions/releases)
- [Commits](https://github.com/dlcastillop/starlight-page-actions/commits/v0.7.0/packages/starlight-page-actions)

Updates `@iconify-json/material-icon-theme` from 1.2.68 to 1.2.69
- [Commits](https://github.com/iconify/icon-sets/commits)

Updates `@types/hast` from 3.0.4 to 3.0.5
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/hast)

Updates `@unocss/astro` from 66.6.8 to 66.7.5
- [Release notes](https://github.com/unocss/unocss/releases)
- [Commits](https://github.com/unocss/unocss/commits/v66.7.5/packages-integrations/astro)

Updates `astro-embed` from 0.13.0 to 0.13.1
- [Release notes](https://github.com/delucis/astro-embed/releases)
- [Changelog](https://github.com/delucis/astro-embed/blob/main/packages/astro-embed/CHANGELOG.md)
- [Commits](https://github.com/delucis/astro-embed/commits/astro-embed@0.13.1/packages/astro-embed)

Updates `eslint` from 10.6.0 to 10.7.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v10.6.0...v10.7.0)

Updates `prettier` from 3.9.1 to 3.9.5
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.9.1...3.9.5)

Updates `tsx` from 4.22.4 to 4.23.1
- [Release notes](https://github.com/privatenumber/tsx/releases)
- [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs)
- [Commits](https://github.com/privatenumber/tsx/compare/v4.22.4...v4.23.1)

Updates `typescript` from 6.0.3 to 7.0.2
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Commits](https://github.com/microsoft/TypeScript/commits)

Updates `typescript-eslint` from 8.62.0 to 8.65.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.65.0/packages/typescript-eslint)

Updates `unocss` from 66.6.8 to 66.7.5
- [Release notes](https://github.com/unocss/unocss/releases)
- [Commits](https://github.com/unocss/unocss/commits/v66.7.5/packages-presets/unocss)

Updates `vitest` from 4.1.9 to 4.1.10
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.10/packages/vitest)

---
updated-dependencies:
- dependency-name: "@astrojs/markdown-remark"
  dependency-version: 7.2.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-all
- dependency-name: "@astrojs/mdx"
  dependency-version: 7.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-all
- dependency-name: "@astrojs/rss"
  dependency-version: 4.0.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-all
- dependency-name: "@astrojs/starlight"
  dependency-version: 0.41.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-all
- dependency-name: "@catppuccin/starlight"
  dependency-version: 2.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-all
- dependency-name: "@expressive-code/plugin-collapsible-sections"
  dependency-version: 0.44.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-all
- dependency-name: "@expressive-code/plugin-line-numbers"
  dependency-version: 0.44.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-all
- dependency-name: "@fontsource-variable/fira-code"
  dependency-version: 5.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-all
- dependency-name: "@fontsource-variable/outfit"
  dependency-version: 5.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-all
- dependency-name: "@fontsource-variable/rubik"
  dependency-version: 5.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-all
- dependency-name: "@fontsource/poppins"
  dependency-version: 5.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-all
- dependency-name: asciinema-player
  dependency-version: 3.17.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-all
- dependency-name: astro
  dependency-version: 7.1.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-all
- dependency-name: astro-expressive-code
  dependency-version: 0.44.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-all
- dependency-name: satori
  dependency-version: 0.28.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-all
- dependency-name: satteri
  dependency-version: 0.9.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-all
- dependency-name: sharp
  dependency-version: 0.35.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-all
- dependency-name: starlight-github-alerts
  dependency-version: 0.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-all
- dependency-name: starlight-links-validator
  dependency-version: 0.25.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm-all
- dependency-name: starlight-llms-txt
  dependency-version: 0.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-all
- dependency-name: starlight-page-actions
  dependency-version: 0.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: npm-all
- dependency-name: "@iconify-json/material-icon-theme"
  dependency-version: 1.2.69
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm-all
- dependency-name: "@types/hast"
  dependency-version: 3.0.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm-all
- dependency-name: "@unocss/astro"
  dependency-version: 66.7.5
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm-all
- dependency-name: astro-embed
  dependency-version: 0.13.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm-all
- dependency-name: eslint
  dependency-version: 10.7.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm-all
- dependency-name: prettier
  dependency-version: 3.9.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm-all
- dependency-name: tsx
  dependency-version: 4.23.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm-all
- dependency-name: typescript
  dependency-version: 7.0.2
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: npm-all
- dependency-name: typescript-eslint
  dependency-version: 8.65.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm-all
- dependency-name: unocss
  dependency-version: 66.7.5
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm-all
- dependency-name: vitest
  dependency-version: 4.1.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm-all
...

Signed-off-by: dependabot[bot] <support@github.com>

* fix: revert typescript 7.x to 6.x to restore twoslash/expressive-code compatibility

TypeScript 7.0 ('Corsa') is a native Go rewrite that removes the programmatic
JS API entirely. twoslash accesses ts.ModuleKind.Cjs which is undefined in TS7,
causing ec.config.mjs -> expressive-code-twoslash -> twoslash to crash at build
time with: 'The requested module expressive-code-twoslash does not provide an
export named default' and related CJS/ESM resolution failures.

Fix:
- Revert typescript ^7.0.2 -> ^6.0.3 in package.json
- Update pnpm-lock.yaml: swap integrity hash, version specifier, remove the
  @typescript/typescript-* platform-native binaries (TS7-only), and fix all
  peer-dep snapshot keys to reference typescript@6.0.3

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

* fix(frontend): skip canonicalizing redirects while prerendering

Astro 7.1 runs middleware while prerendering the .md/.json API and schema endpoints, so the trailing-slash redirects were baked into dist/ as redirect stubs that shadowed the real prerendered markdown/JSON and broke the api-markdown-routes and schema-routes E2E checks. Guard the redirects behind context.isPrerendered so they only apply to on-demand (SSR/dev) requests.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 572347d9-75da-4b54-9a3d-f9589ef4e39b

* fix(security): bump dompurify to 3.4.12 (GHSA-c2j3-45gr-mqc4) and tighten brace-expansion override

- dompurify@<3.4.12: '>=3.4.12' — GHSA-c2j3-45gr-mqc4 (low): bypass in
  CUSTOM_ELEMENT_HANDLING, fixed in 3.4.12
- brace-expansion@<5.0.7: '>=5.0.7' — GHSA-3jxr-9vmj-r5cp (high): DoS via
  exponential-time expansion, 5.0.7 is the patched version
- postcss@8.5.20 already satisfies GHSA-r28c-9q8g-f849 (<=8.5.17) via existing
  override; no change needed
- GHSA-mh99-v99m-4gvg (brace-expansion <=5.0.7): no upstream fix available,
  documented as unfixable in canonical PR body

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

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: David Pine <7679720+IEvangelist@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 572347d9-75da-4b54-9a3d-f9589ef4e39b

* Redact connection-string passwords in generated package docs (#1410)

* Redact connection-string passwords in generated package docs

PackageJsonGenerator copies package XML doc comments verbatim into the frontend
data JSON. Several packages document example connection strings containing a
literal placeholder password (e.g. SqlServer's GetConnectionString returns
"Server=host,port;User ID=sa;Password=password;TrustServerCertificate=true").

These are not real secrets, but the literal Password=<value> token trips 1ES /
CredScan push protection (SEC101/037 SqlLegacyCredentials, VS403654) when the
public repo is mirrored to the internal AzDO remote, blocking the deploy and
deploy-vnext-release branch syncs.

Add DocumentationSanitizer.RedactConnectionStringPasswords, applied to text,
inline-code and code-block doc nodes, which rewrites connection-string
Password=/Pwd= literals to <password>. C# default parameter values
(password = null) are left untouched because the match requires no whitespace
around '='. Regenerate the four affected data files accordingly.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 4125af76-bbc2-4532-adee-98add8fdb6b7

* Address PR review: markdown-safe placeholder, cover example nodes, nullable API

- Use "{password}" instead of "<password>". Angle brackets are dropped as raw
  HTML when doc nodes render to Markdown (csharp-api-markdown.ts concatenates
  text without escaping), which would hide the value in connection-string
  examples. "{password}" is also the existing placeholder convention already
  used across the generated data (e.g. mysql://{user}:{password}@{host}).
- Sanitize the <example> extraction paths in ExtractDocExample (plain-text
  code, description text nodes, and example code) so connection-string
  passwords there cannot re-trigger CredScan in future data refreshes.
- Make DocumentationSanitizer.RedactConnectionStringPasswords nullable-aware
  (string? in/out) to match its behavior and drop the null-forgiving operator
  in tests. Exclude '{'/'}' from the value class to keep redaction idempotent.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 4125af76-bbc2-4532-adee-98add8fdb6b7

* Use "Placeholder" redaction token per 1ES recommendation

The connection-string password sanitizer redacted values to `{password}`.
Switch the token to a bare `Placeholder`, which is the value 1ES
recommends for scrubbed credential examples in generated content.

Update the sanitizer unit-test expectations to match, and update the four
affected package data files. The pre-existing `{password}` doc template
tokens in those files (author-written placeholders, not sanitizer output)
are intentionally left unchanged.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8c2fe46b-fcb4-48bf-8c62-5f9d3d7a470e

* fix(PackageJsonGenerator): tighten redaction regex and close doc gaps

Two hardening fixes to the connection-string password redaction added in
this PR.

F1 - the redaction regex over-consumed trailing delimiters. The value
character class only excluded ';', quotes, comma, whitespace, backslash,
and brace/angle markers. A value immediately followed by a markdown or
URI delimiter ('`', ')', ']', '&', '|') swallowed that delimiter into the
match, so an inline-code fence lost its closing backtick and a link label
lost its closing paren, corrupting the rendered doc. The class now also
stops at those delimiters. A trailing sentence period is preserved by
trimming it off the captured value in the replacement callback rather
than excluding '.' from the class, which would truncate legitimate dotted
values.

F4 - two documentation paths reached the generated JSON unsanitized. Enum
member descriptions (Description = ExtractSummary(f)) and <see href="...">
link labels were emitted verbatim, so a connection string in an enum
member's <summary> or a link label bypassed redaction. Both now run
through the sanitizer. This changes no committed data (no such values
exist in the current package set); the fix is preventive.

Also refreshes the sanitizer comment and XML docs to describe the
Placeholder token and the widened exclusion set.

Tests: added markdown/URI delimiter and trailing-period cases to the
sanitizer unit tests, and an end-to-end test asserting an enum member
whose summary contains a connection string is redacted in the generated
JSON. All 31 tests pass.

chore: sanitize placeholder connection strings in generated pkg JSON

**BYPASS_SECRET_SCANNING** — false-positive SEC101/037 placeholder in
generated pkgs/*.json, unblocking the internal mirror for historical
commit 6058fcf. Forward fix regenerates the affected files.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8c2fe46b-fcb4-48bf-8c62-5f9d3d7a470e

---------

Co-authored-by: David Pine <7679720+IEvangelist@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Ankit Jain <radical@gmail.com>
Copilot-Session: 4125af76-bbc2-4532-adee-98add8fdb6b7
Copilot-Session: 8c2fe46b-fcb4-48bf-8c62-5f9d3d7a470e

* fix: Normalize terminology in sample updates (#1397)

* fix: Normalize terminology in sample updates

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: febf329c-97d8-41aa-bd42-43273bc57fe7

* test: Preserve spacing in terminology updates

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: febf329c-97d8-41aa-bd42-43273bc57fe7

* fix: Handle Markdown wrappers and word boundaries in terminology normalizer

Address review feedback on #1397:

- Require .NET to sit at a non-word boundary so tokens like ASP.NET Aspire and Microsoft.NET Aspire are left intact instead of corrupted into ASPAspire / MicrosoftAspire.

- Consume Markdown emphasis/link openers (**, [) between the article and the term so 'a **.NET Aspire**' and 'a [.NET Aspire](url)' correct the article to 'an'.

- Add regression tests for bold/link article correction and word-boundary cases.

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

Copilot-Session: 020561bf-2df6-4f8b-a730-1c72d0f6cc5e

* refactor: Make terminology normalizer data-driven

Replace the hardcoded replace-chain with a small TerminologyRule table so a new deprecated term is a single entry (pattern/replacement/optional article). Article correction, Markdown-wrapper tolerance, and word-boundary guarding are now applied generically per rule.

Also add the 'dotnet aspire' -> 'Aspire' rule that was present in .github/forbidden-words.json but missing from the normalizer, and cover it with tests.

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

Copilot-Session: 020561bf-2df6-4f8b-a730-1c72d0f6cc5e

* fix: Bound terminology terms by alphanumeric edges and cover Markdown wrappers

Replaces the per-rule mix of \\b\/\(?<!\w)\ boundaries with uniform alphanumeric edge guards applied centrally, so a rule core can never fuse into a longer token (e.g. \.NET AspireX\) and authors cannot forget a boundary. Underscore and inline-code wrappers now normalize correctly (\_.NET Aspire_\, \\.NET Aspire\\), and the generated-data invariant now covers the \dotnet aspire\ spelling.

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

Copilot-Session: 020561bf-2df6-4f8b-a730-1c72d0f6cc5e

* fix: Skip code regions and leave C# untouched in terminology normalizer

The normalizer ran a plain pass over raw Markdown and appHostCode, which could rewrite runnable sample commands (e.g. 'dotnet aspire run' -> 'Aspire run') inside fenced/inline code and corrupt compilable C#. Now fenced blocks and inline code are copied through verbatim, appHostCode is left untouched (it renders as C#, not prose), and the entry point is null-safe. Adds code-skip, mixed prose+code, idempotence, and null tests, and replaces the deprecated-term scan with an idempotence-based invariant.

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

Copilot-Session: 020561bf-2df6-4f8b-a730-1c72d0f6cc5e

---------

Co-authored-by: David Pine <7679720+IEvangelist@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: febf329c-97d8-41aa-bd42-43273bc57fe7
Copilot-Session: 020561bf-2df6-4f8b-a730-1c72d0f6cc5e

* Switch cookie consent runtime to WCP API (#1403)

* Switch cookie consent runtime to WCP API

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

Copilot-Session: 4182d84d-5dc1-4c74-be09-15995a872350

* Theme WCP consent UI, add scroll-lock, prune obsolete cookie tests

Fully restyle the WCP cookie banner and preferences dialog to match the
Aspire theme via the team-owned wcp-consent.css (our colors, spacing,
WCAG AA contrast, and the brand icon). The dialog now re-themes live when
the user toggles light/dark, and the underlying page is scroll-locked
while the preferences dialog is open.

Remove the last remnants of the old vanilla-cookieconsent integration:
- delete config/cookie.config.ts and the old cookieconsent-custom.css
- drop @jop-software/astro-cookieconsent + vanilla-cookieconsent deps
- remove the 2 obsolete behavioral cookie e2e tests and their dead
  helpers; the WCP banner is geo-gated/CDN-loaded and can't be exercised
  in CI, so compliance is verified by the WCP scan instead
- rework the integrations-gallery banner suppression to hide the WCP
  banner element instead of pre-seeding the removed cc_cookie shape

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 4182d84d-5dc1-4c74-be09-15995a872350

* Hide "Manage cookies" buttons where consent isn't required

WCP reports whether consent is required for the visitor's region. Where it
is not (e.g. the US) there is nothing to manage, so hide the four "Manage
cookies" buttons instead of leaving inert controls on the page.

The WCP runtime sets a data-consent-not-required flag on <html> once it
knows the region; a CSS rule hides .cookie-consent-btn when the flag is
present. The flag is primed from localStorage before paint so returning
visitors in non-required regions don't see the buttons flash in. Defaulting
to visible keeps this failsafe: if WCP is slow or blocked we never hide a
control a required region needs. display:none also makes the site tour
auto-skip its cookie-preferences step, so no tour changes are needed.

Co-authored-by: Copilot App <223556219+Copi…
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants