You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Upgrade the Aspire Dashboard terminal integration to Hex1b 0.171.0 across NuGet, npm, tool/MCP pins, and vendored web assets. The deployed assets are one bundled client-and-workers JavaScript file, one font, and two licenses. Hex1b's built-in canvas overlay scrollbar shows retained command marks over terminal content without a native gutter. The 0.171 producer retains up to 200 command marks even if older backing text remains in scrollback; older marks are evicted first. The palette-derived scrollbar track is explicitly configured to preserve its appearance when using 0.171.
The terminal header shows workload title, working directory, and progress. The full title/directory can be copied, with screen-reader announcements for copy success/failure. Long paths compact without losing a UNC server/share authority. Percentages appear in tooltips; the icon slot shows a progress ring while active and a resource/terminal icon otherwise. Dock tabs retain their creation-time titles and support drag/drop and keyboard reordering, horizontal scrolling, navigation controls, an insertion line, and an overflow fade. The terminal frame has a 1px border and 12px content padding (chromeless dock/window views keep their borderless, unpadded presentation). The footer has compact Fluent font/sizing controls and visible, associated Size and Palette labels; its controls wrap at narrow widths rather than clipping the palette selector.
Palette behavior: The terminal footer has an explicit Dark / Light palette selector. The browser-stored terminal palette defaults to Dark and is independent of the Dashboard theme. Changing Dashboard theme in Settings changes the surrounding chrome, not the selected terminal palette. Changing the terminal palette recolors content and markers without reconnecting. A former dashboard preference migrates to Dark; forced-colors mode uses system scrollbar colors.
Screen.Recording.2026-09-21.at.10.19.01.am.mov
User-facing usage
./dotnet.sh build src/Aspire.Managed
alias aspire="$PWD/run-aspire.sh"
aspire run --project playground/Terminals
Open the terminal-features resource's Terminal view. Drag the scrollbar thumb or select a command mark to navigate history; click the title/directory to copy its full value. Use the Palette dropdown in the footer to switch Dark/Light. The Settings theme controls Dashboard chrome separately.
Validation
Current 0.171.0: All three NuGet packages were available from approved dotnet-public (GET 200); the npm package was published. Restore with only approved package feeds succeeded with zero errors (52 pre-existing package-audit warnings). The four-file browser acquisition verified against the published npm package. Dashboard JavaScript tests passed 197/197; focused NuGet configuration 3/3, Hosting terminal 82/82, TerminalHost 51/51, and Dashboard terminal/dock component 115/115 tests passed. Dashboard and Playwright dependency builds passed without warnings.
Styling follow-up: Regenerated the Dashboard XLF files, built the Dashboard integration host without warnings, and passed focused terminal component tests 40/40 and JavaScript regression tests 126/126. Edge/WebGL2 exercised the resource and detached-window footers at 1200px and 420px in both Dashboard themes: font changes, size selection, fit, and popup interaction passed. The narrow footer no longer clips its controls. Fluent's dropdown shadow control enforces a 160px minimum width, so these controls retain that width and wrap at narrow widths instead of becoming smaller.
Current real-browser check: Edge/macOS with WebGL2 and WebGPU connected to a real 0.171.0 HMP/HWT producer. Both backends passed overlay/no gutter, wheel, thumb drag, marker details/tooltip/click navigation, reconnect with retained marks, read-only output/selection, input after read-only, both same-origin workers, font loading, and disposal. The browser captured light/dark and forced-color screenshots; the separate palette/resource harness passed theme transitions, palette input and link worker before its final unrelated dock step timed out waiting for the outdated Toggle terminal button selector. That full palette/dock harness was therefore not validated to completion. The focused JS palette renderer test verifies dark/light track colors and forced/more-contrast opacity. The full repository suite, non-Edge browsers, packaged Dashboard under PathBase, and internal pipeline were not run.
Historical 0.170.0 (not the pinned package): Earlier test counts and theme-following browser results were for a different build and do not validate 0.171.0. TerminalTitle.test.mjs and TerminalDock.test.mjs run in regular CI through Infrastructure.Tests.
Screenshots / Recordings
This PR includes UI changes. Please add screenshots or screen recordings so reviewers can evaluate the visual changes without running locally.
For before/after comparisons, place them side-by-side or label them clearly.
For interactive changes (animations, transitions, new flows), prefer a short screen recording (GIF or video).
If you cannot capture visuals now, note what scenario to test and mark this section as TODO.
TODO: Attach light/dark resource and detached-terminal screenshots and a short scrollbar/header recording. Local browser captures exist; reproduce with terminal-features above.
Security considerations
Workload-supplied titles, paths, and command-mark text are untrusted. They remain text rather than HTML or navigable links; copying preserves the original text. Both embedded workers load from the same-origin vendored module without Blob workers or eval. Existing terminal authentication, input authority, and read-only gates remain in place. NuGet packages restore from approved internal feeds; no public NuGet package source is configured.
Fixes # (issue)
Checklist
Is this feature complete?
Yes. Ready to ship.
No. Follow-up changes expected.
Are you including unit tests for the changes and scenario tests if relevant?
Yes
No
Did you add public API?
Yes
If yes, did you have an API Review for it?
Yes
No
Did you add <remarks /> and <code /> elements on your triple slash comments?
Yes
No
No
Does the change make any security assumptions or guarantees?
Yes
If yes, have you done a threat model and had a security review?
Adopt the published Hex1b alpha with bundled workers, themed overlay scrollbars, retained command marks, and live terminal metadata. Simplify vendored assets and add a continuously cycling terminal feature sample.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6bb79b75-08ac-4fcb-a432-921948a3a205
UNC roots include both the server and share, but this regex captures only the leading \\. For example, compacting \\server\share\projects\app to 24 characters currently returns \\server\…\projects\app, dropping the share and making the displayed location misleading. Parse \\server\share as part of root before omitting middle segments, and add this case to the path expectations.
This new JavaScript test is not executed by repository CI. DashboardTerminalScriptTests explicitly invokes only TerminalView.test.mjs, KeyboardShortcuts.test.mjs, and TerminalWindow.test.mjs, and no workflow invokes the package's broad npm test script. Add a [RequiresTools(["node"])] Infrastructure test that runs TerminalTitle.test.mjs; otherwise the path-compaction and observer regressions covered here can pass CI unnoticed.
If path-measurement initialization fails, the working directory becomes visually blank: the only full text is hidden by .terminal-directory-measure, while this display span starts empty and is populated only by observePath. The new error handling deliberately keeps the component usable after a JS/canvas/observer failure, so render the full path here as the fallback and let the observer replace it with the compacted value when available.
The reason will be displayed to describe this comment to others. Learn more.
Copilot review overview
🔵 Needs a closer look
The broad browser-runtime, accessibility, dependency, and Windows socket-security changes warrant final human review, particularly with the full browser harness, internal pipeline, and security review still incomplete.
The reason will be displayed to describe this comment to others. Learn more.
Copilot review overview
🔵 Needs a closer look
It combines a security-sensitive terminal dependency upgrade with extensive browser, transport, and Windows ACL changes, while full browser, PathBase, security, and pipeline validation remains incomplete.
Use accent icons and consistent header spacing, rename the shared icon container, and update dependent tests. Make bundle header validation newline-independent and correct terminal capability documentation.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The reason will be displayed to describe this comment to others. Learn more.
Copilot review overview
🔵 Needs a closer look
It combines a large dependency/runtime replacement with browser interaction, accessibility, and Windows security changes, while several platform and packaged-dashboard validations remain outstanding.
Observed in the playground/Terminals app on Windows: running the SQL Server REPL command opens a sqlcmd (sqlserver) dock tab, but the reported error is “Terminal view is not connected”.
Evidence gathered from the running app
The sqlserver resource was Running / Healthy.
The SQL Server dock view's diagnostic snapshot reported connected: false, ended: true, and no screen text available to the viewer. This does not establish whether the producer emitted output before the view attached.
The shared browser console also contained repeated warnings: Dashboard terminal connection failed. Timed out waiting for the terminal's first frame. These messages do not identify the terminal/view, so they cannot conclusively be attributed to the SQL Server REPL rather than another terminal on the page.
Searches of the dashboard's console logs found no matching Failed to attach terminal or Terminal view failed entries.
The exact disconnected message originates from a guard in the Hex1b web-terminal client. It is not, by itself, a SQL Server authentication or connectivity error.
Where to find diagnostics
Browser DevTools → Console: terminal connection failures, WebSocket close codes, first-frame timeouts, and input errors.
AppHost output: terminal lifecycle messages under Aspire.Hosting.ApplicationModel.TerminalService, including Starting terminal … (sqlcmd (sqlserver)) and unexpected workload exceptions.
Logging gap / follow-up
RunTerminalAsync logs unexpected exceptions and cancellation, but does not log a process exit code when the workload simply completes. The current diagnostics therefore do not establish why the REPL session ended.
Useful follow-up would be to correlate browser warnings with the terminal/view ID and surface launch/completion diagnostics (including exit status when available). Diagnostic output must not expose credentials or environment-variable values. The failure's root cause remains unconfirmed; no fix is claimed by this investigation.
Tracking the SQL Server REPL failure and diagnostic logging gap in #20645, assigned to Mitch Denny (@mitchdenny) for investigation in the 17.0 milestone. The issue includes the observed terminal state, relevant logs, reproduction scenario, and the unconfirmed-root-cause caveat.
The reason will be displayed to describe this comment to others. Learn more.
Reviewed the latest terminal dock styling changes. Scoped CSS generation passed. The SQL Server REPL failure and diagnostic investigation are tracked separately in #20645.
The reason will be displayed to describe this comment to others. Learn more.
Copilot review overview
🔵 Needs a closer look
It combines a security-sensitive dependency upgrade, vendored executable assets, Windows ACL changes, and extensive interactive UI behavior without full pipeline or cross-browser validation.
Updated src/frontend/src/content/docs/dashboard/terminals.mdx to document the Hex1b 0.171.0 dashboard terminal upgrade (PR #20255). Triggered signals and evidence: dashboard_user_facing_page_changed (ConsoleLogs.razor, TerminalWindow.razor[.cs] modified), new_public_type (new public partial class TerminalTitle : IAsyncDisposable), pr_body_has_cli_flag_mention/pr_body_has_user_facing_section (PR body's "User-facing usage" section demoing aspire run --project playground/Terminals and the terminal-features resource). Added two new sections: "Navigate scrollback and copy terminal metadata" (overlay scrollbar with up-to-200 retained command marks, click-to-jump, tooltips, copyable title/working-directory with UNC-safe compaction) and "Choose a terminal color palette" (Dark/Light footer selector, independent of dashboard theme, migration from the old theme-following preference, forced-colors behavior). Also extended the keyboard-navigation table and dock description with Alt+Shift+Left/Right tab reordering, drag-to-reorder, scroll buttons/overflow fade, and fixed creation-time tab titles.
Note
This draft PR needs human review before merging.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Upgrade the Aspire Dashboard terminal integration to Hex1b 0.171.0 across NuGet, npm, tool/MCP pins, and vendored web assets. The deployed assets are one bundled client-and-workers JavaScript file, one font, and two licenses. Hex1b's built-in canvas overlay scrollbar shows retained command marks over terminal content without a native gutter. The 0.171 producer retains up to 200 command marks even if older backing text remains in scrollback; older marks are evicted first. The palette-derived scrollbar track is explicitly configured to preserve its appearance when using 0.171.
The terminal header shows workload title, working directory, and progress. The full title/directory can be copied, with screen-reader announcements for copy success/failure. Long paths compact without losing a UNC server/share authority. Percentages appear in tooltips; the icon slot shows a progress ring while active and a resource/terminal icon otherwise. Dock tabs retain their creation-time titles and support drag/drop and keyboard reordering, horizontal scrolling, navigation controls, an insertion line, and an overflow fade. The terminal frame has a 1px border and 12px content padding (chromeless dock/window views keep their borderless, unpadded presentation). The footer has compact Fluent font/sizing controls and visible, associated Size and Palette labels; its controls wrap at narrow widths rather than clipping the palette selector.
Palette behavior: The terminal footer has an explicit Dark / Light palette selector. The browser-stored terminal palette defaults to Dark and is independent of the Dashboard theme. Changing Dashboard theme in Settings changes the surrounding chrome, not the selected terminal palette. Changing the terminal palette recolors content and markers without reconnecting. A former
dashboardpreference migrates to Dark; forced-colors mode uses system scrollbar colors.Screen.Recording.2026-09-21.at.10.19.01.am.mov
User-facing usage
Open the
terminal-featuresresource's Terminal view. Drag the scrollbar thumb or select a command mark to navigate history; click the title/directory to copy its full value. Use the Palette dropdown in the footer to switch Dark/Light. The Settings theme controls Dashboard chrome separately.Validation
dotnet-public(GET 200); the npm package was published. Restore with only approved package feeds succeeded with zero errors (52 pre-existing package-audit warnings). The four-file browser acquisition verified against the published npm package. Dashboard JavaScript tests passed 197/197; focused NuGet configuration 3/3, Hosting terminal 82/82, TerminalHost 51/51, and Dashboard terminal/dock component 115/115 tests passed. Dashboard and Playwright dependency builds passed without warnings.Toggle terminalbutton selector. That full palette/dock harness was therefore not validated to completion. The focused JS palette renderer test verifies dark/light track colors and forced/more-contrast opacity. The full repository suite, non-Edge browsers, packaged Dashboard under PathBase, and internal pipeline were not run.TerminalTitle.test.mjsandTerminalDock.test.mjsrun in regular CI through Infrastructure.Tests.Screenshots / Recordings
TODO: Attach light/dark resource and detached-terminal screenshots and a short scrollbar/header recording. Local browser captures exist; reproduce with
terminal-featuresabove.Security considerations
Workload-supplied titles, paths, and command-mark text are untrusted. They remain text rather than HTML or navigable links; copying preserves the original text. Both embedded workers load from the same-origin vendored module without Blob workers or eval. Existing terminal authentication, input authority, and read-only gates remain in place. NuGet packages restore from approved internal feeds; no public NuGet package source is configured.
Fixes # (issue)
Checklist
<remarks />and<code />elements on your triple slash comments?