Skip to content

Component: HubWindow

Canonical source: SmrtApps/CSApps/HubWindow/README.md (mirrored below)


HubWindow — SmrtHub shell and tray front-end

HubWindow is the WinUI 3 shell that owns the visible UI, native system tray, Jump List, and high-contrast aware iconography for SmrtHub. This document is a canonical reference of current behavior and implementation.

Highlights

  • Single-instance guard with IPC and legacy restore event so secondary launches route actions (Jump List, shortcuts) to the running window.
  • Per-Monitor-V2 DPI enforcement end-to-end: process awareness at startup, thread scopes for tray/menu work, SVG rasterization bound to XamlRoot.RasterizationScale, and dynamic title-bar region recalculation for interactive controls.
  • Theme pipeline built on ThemeSettings, UISettings, and Win32 fallbacks to keep caption buttons, tray icon, and title logo in sync across light/dark and high-contrast schemes.
  • Native tray service with Jump List parity: Diagnostics submenu (Export Logs HTML, Support Bundle) plus Legal & Compliance submenu (Retention Evidence export, Compliance Report), all while preserving restore-on-click behavior.
  • Title bar composition is intentionally minimal: logo, divider, search, always-on-top pin, a small user profile chip, and the native caption buttons. Interactive controls in the title bar use passthrough regions (not custom drag-rectangle splitting) so caption interactions remain native.
  • Title bar now includes a centered search box (Smrt.UI.Controls.SmrtSearchBox) that provides lightweight command search (proof-of-concept) with suggestions and action invocation.
  • Logging everywhere via SmrtHub.Logging using the hub-window slug, surfacing key events such as IPC routing, theme transitions, DPI changes, tray commands, and Supervisor hand-offs.
  • HubWindow now includes a fixed-height window scaffold (48 DIP rows) used for the upcoming collapse/expand UX; build/staging + layout dimensions are tracked in README.BuildAndLayout.md.
  • vNext chat windowing split: HubWindow can open and own a Document Chat window (in-memory transcript UX; no transcript persistence) while the general chat shell remains a separate app (SmrtChat); both windows can be active at the same time.
    • Document Chat is implemented as an owned tool window (owned by HubWindow; no separate taskbar presence).
    • General chat remains a standalone window/app (SmrtChat) with its own taskbar presence.

Dependencies and integrations

  • Supervisor control plane: HubWindow routes certain diagnostics and lifecycle actions via Supervisor.
  • Settings Host: HubWindow launches SettingsHost for multi-page settings surfaces.
  • SmrtSpace catalog/active selection: HubWindow uses Settings Host IPC snapshots (no direct file reads).
  • Local bridge (python-net): polls GET /source for snapshot data and forwards certain actions.
  • Support Bundle: tray diagnostics generate bundles for local-first troubleshooting.

Support Bundle

  • HubWindow exposes Support Bundle generation via tray diagnostics; prefer this over manual log collection.
  • HubWindow logs use slug hub-window and should appear in bundle log exports.

Top Panel Bars (Bars0–2)

HubWindow includes three “info bars” in the top panel that mirror the legacy Flintr expandable rows:

  • Bar 0 (Row B0): Source name — current source label (app/window/web).
  • Bar 1 (Row B1): Source path — file path or URL.
  • Bar 2 (Row B2): Clipboard content (preview) — single-line preview of the clipboard; full text is available via tooltip.

Data source:

  • HubWindow polls the local Python bridge endpoint GET /source (component: python-net) on a short interval (currently ~750ms) via HubWindow.Services.HubWindowSnapshotClient.
  • The /source payload is additive: it preserves legacy keys (lblSourceName, lblPath, clipboardFragments) and adds richer fields (sourceType, appIdentity, sourceData, etc.). HubWindow consumes both to remain resilient across versions.
  • Polling is best-effort: if the bridge is unavailable or returns a non-success status, HubWindow keeps the last-known data or shows empty/unknown values.

Icon mapping:

  • Column A icons (A0–A2) are derived from snapshot state; A0 is driven by sourceType (e.g., web → globe).

Left rail layout note:

  • The Column A left rail is implemented as a WinUI SplitView in CompactInline mode:
    • Compact (IsPaneOpen=false): icons-only, visually identical to the prior fixed 48-DIP rail.
    • Expanded (IsPaneOpen=true): reveals static labels aligned to rows A0–A3 (Source Name, Source Path, Clipboard, Settings).
  • The pane is not a navigation surface; A0–A2 remain non-interactive and do not change the main content.

Window sizing note (no content reflow):

  • When the left rail pane opens/closes, HubWindow resizes the outer window by the rail delta so the main content region keeps a stable width.
  • Clipboard-driven auto-width (image clipboard) is pane-aware and will not shrink the window back below the open-pane delta.

Note: HubWindow intentionally does not implement custom window snapping/docking controls. We rely on the native Windows caption controls for all snapping.

Layout note (ribbon effect):

  • The top panel uses a dark “ribbon” backdrop (SmrtHub.Surface.SubChrome.Background).
  • Bars0–2 render as three separate light “card” surfaces in column B; each card uses full rounding (CornerRadius="8") and vertical spacing so the ribbon effect appears naturally against the ribbon backdrop.
  • Column C remains reserved as a fixed 48-DIP spacer over the ribbon backdrop (future use).

Title Bar, Fluent Iconography, and Caption Controls

  • HubWindow extends content into the title bar and lays out a small left-side group: logo → divider → pin. This keeps app controls visually independent of the native caption button alignment rules.
  • HubWindow also shows a small user profile chip immediately left of the native caption buttons. It uses WinUI PersonPicture with a best-effort profile picture and friendly name derived from the signed-in Windows identity.
  • The user profile chip acts as a trigger for a small flyout that mirrors the native Windows account card layout:
    • header with a larger profile picture + display name
    • optional email/UPN line when Windows exposes it (best-effort; may not be available for local accounts)
    • link-text account link (placeholder) and a few user-scoped action buttons (currently visual placeholders)
    • flyout is configured not to constrain to the window bounds so it can render outside the content area like a native menu.
  • Fallback behavior for the profile chip is owned by PersonPicture:
    • picture when available
    • otherwise initials when available
    • otherwise the platform-provided default glyph The app intentionally does not override the glyph visuals so it stays consistent with the OS.
  • The profile chip hover treatment is intentionally custom. HubWindow uses a theme-driven overlay behind the avatar to avoid hover-time layout nudging.
  • The always-on-top control is a ToggleButton that drives OverlappedPresenter.IsAlwaysOnTop.

UI Icon Strategy (Update)

  • HubWindow UI icons are implemented with Fluent UI System Icons via FluentIcons.WinUI (ic:FluentIcon).
  • Icons are theme-tinted (no baked colors) and follow the project interaction convention:
    • Default: Regular
    • Hover: tint only (no geometry swap)

Fluent UI System Icons reference: - Browse/search: https://fluenticons.co/

When requesting an icon change, provide: - Icon name + size + variant (example: Calendar 24 Regular) - Where it will be used (control/surface) and the intended meaning - Whether it must be monochrome (theme-tinted) or explicitly Color - Some UX surfaces may still require custom icons (per product/design) and will be added via the approved asset pipeline.

  • Hover/pressed colors are TBD in documentation. The canonical source of truth is the theme/palette dictionaries and their keys:
    • SmrtHub.Surface.Chrome.Content.Hover
    • SmrtHub.Surface.Chrome.Content.Pressed See SmrtApps/src/Smrt.UI/Themes/Palettes/*.xaml for current values.
  • Pin state: the checked/unchecked state is communicated by a glyph change (Pin → PinOff). Hover/pressed are communicated via theme-driven icon tint + subtle background.
  • Pressed animation convention: most icon buttons use a small scale-down press animation.
  • Caption button backgrounds are intentionally transparent for non-close buttons so hover is conveyed by glyph color. The Close button retains the native Windows hover/pressed background behavior (including the expected red hover treatment) because HubWindow does not set Close-button-specific background overrides.

Startup & Single Instance

  • App.xaml.cs applies SetProcessDpiAwarenessContext(PER_MONITOR_AWARE_V2) before any UI exists, sets the process AppUserModelID, and builds DI services (ITrayControllerFactory, INotificationService, and headless OCR via Smrt.ExtractText).
  • A global mutex (Global/SmrtHub.HubWindow) plus SingleInstanceIpc keeps only one instance running. Secondary instances parse --action arguments and post them to the primary (restore, Jump List verbs), falling back to a legacy EventWaitHandle if IPC fails.
  • The primary instance spins a restore loop and IPC listener before logging is initialized to ensure early actions succeed. All unhandled exception surfaces are wired into Logger.Fatal.
  • Jump List rebuild occurs once during first activation, then again explicitly after OnLaunched; the handler lives in ServicesUtilities.JumpListService.

Command Entry Points (Action Verbs)

HubWindow supports a small set of command entry points exposed via --action <verb>.

Important separation of responsibilities:

  • Global hotkeys are owned by TriggerManager, not HubWindow. HubWindow does not register system-wide hotkeys.
  • HubWindow surfaces (Jump List, tray menu, title-bar search) invoke action verbs which route through the single-instance IPC channel to the primary instance.

Current action verbs:

  • restore — Restore the HubWindow UI.
  • open-settings — Open the Settings Host (best-effort) or fall back to HubWindow.
  • open-settings?page=providers — Open Settings Host directly to Cloud Providers.
  • open-settings?page=providers&vendor=openai&profile=default — Open Cloud Providers to a specific vendor/profile.
  • Command-line passthrough (secondary launches): --action open-settings --page providers --vendor openai --profile default is converted into the equivalent query-style action so the primary instance receives vendor/profile targeting.
  • open-smrtspace-create — Open the HubWindow-owned Create New SmrtSpace window.
    • The name and root path are independent inputs; no auto-updates occur between fields.
    • Selecting a folder sets the root path to that exact folder.
  • open-smrtspace-folder — Open the active SmrtSpace root folder in Explorer (best-effort).
  • open-smartspace-archive — Open the SmartSpace Archive folder in Explorer (best-effort).
  • set-active-smrtspace?id=<id> — Request that Settings Host switches the active SmrtSpace (by catalog entry id).
  • open-quick-settings?feature=extract-text — Open Quick Settings → Extract Text (non-secret preferences only).
  • Command-line passthrough (secondary launches): --action open-quick-settings --feature extract-text is converted into the equivalent query-style action so the primary instance receives feature targeting.
  • open-quick-settings?feature=extract-structured-text — Open Quick Settings → Extract Structured Text (non-secret preferences only).
  • Command-line passthrough (secondary launches): --action open-quick-settings --feature extract-structured-text is converted into the equivalent query-style action so the primary instance receives feature targeting.
  • open-quick-settings?feature=chat — Open Quick Settings → Chat (non-secret preferences only).
  • Command-line passthrough (secondary launches): --action open-quick-settings --feature chat is converted into the equivalent query-style action so the primary instance receives feature targeting.
  • open-document-chat — Open the HubWindow-owned Document Chat window (metadata-only actions).
  • open-smrtchat — Open the separate SmrtChat shell (taskbar app).
    • Implementation detail: HubWindow launches SmrtChat.exe --action "restore".
  • create-chat-session — Create a new chat session (metadata-only; no prompt/response stored).
  • create-chat-session?kind=document — Create a document-focused chat session (metadata-only).
  • Command-line passthrough (secondary launches): --action create-chat-session --kind document is converted into the equivalent query-style action so the primary instance receives kind targeting.
  • list-chat-sessions — Copy chat session metadata to clipboard (metadata-only).
  • list-chat-sessions?kind=document — Copy document chat session metadata to clipboard.
  • Command-line passthrough (secondary launches): --action list-chat-sessions --kind document is converted into the equivalent query-style action so the primary instance receives kind targeting.
  • delete-chat-session?sessionId=<guid>&confirm=true — Delete a chat session (metadata-only state) by sessionId.
  • Safety: deletion requires confirm=true (or --confirm) and is not exposed via tray/Jump List/search.
  • Command-line passthrough (secondary launches): --action delete-chat-session --sessionId <guid> --confirm is converted into the equivalent query-style action so the primary instance receives the sessionId and confirmation.
  • set-chat-session-title?sessionId=<guid>&title=<text> — Set or clear a chat session title (metadata-only state).
    • Safety: title content is treated as potentially sensitive user input; HubWindow does not log it, and this action is not exposed via tray/Jump List/search.
  • Command-line passthrough (secondary launches): --action set-chat-session-title --sessionId <guid> --title "My title" is converted into the equivalent query-style action so the primary instance receives the sessionId and title.
  • Command-line passthrough (clear title): --action set-chat-session-title --sessionId <guid> --clear-title sets title= (clears the stored title).
  • export-chat-session?sessionId=<guid> — Copy a single chat session’s metadata to clipboard (metadata-only).
    • Safety: clipboard output is user-triggered and not logged; this action is not exposed via tray/Jump List/search.
  • Command-line passthrough (secondary launches): --action export-chat-session --sessionId <guid> is converted into the equivalent query-style action so the primary instance receives the sessionId.
  • purge-chat-sessions?kind=document&confirm=true — Delete all chat sessions of a specific kind (metadata-only state).
    • Safety: purge requires confirm=true (or --confirm) and is not exposed via tray/Jump List/search.
  • Command-line passthrough (secondary launches): --action purge-chat-sessions --kind document --confirm is converted into the equivalent query-style action so the primary instance receives kind targeting and confirmation.
  • HubWindow passes W3C traceparent to Settings Host for log correlation.
  • extract-clipboard-text — OCR clipboard image → copy text to clipboard.
  • open-screen-clip — Launch the Windows Snipping Tool capture UX (no OCR; clipboard is not modified by HubWindow).
  • snip-and-extract-clipboard-text — Snipping Tool capture → OCR snip → copy text to clipboard.
  • extract-clipboard-structured — Structured extraction → copy structured JSON to clipboard and save to active SmrtSpace.
  • send-clipboard-structured-to-ai — Structured extraction (clipboard image) → open Document Chat → send structured JSON (text/structure only).
    • Privacy: HubWindow does not persist or log prompt/response content; only safe metadata.
    • Attachment policy: no auto-attach from URLs; no raw document bytes/images sent by default.
    • Entry points: Jump List, tray menu, title-bar search.
  • send-documents-structured-to-ai — File picker (single-select) → structured extraction → best-effort save to active SmrtSpace → open Document Chat → send structured JSON (text/structure only).
    • UX decision (locked-in): “Send to AI” always opens the HubWindow-owned Document Chat window.
  • extract-documents-structured — File picker (multi-select) → structured extraction → save to active SmrtSpace.
    • If exactly one file is selected, the resulting structured JSON is also copied to clipboard.
    • Entry points: Jump List, tray menu, title-bar search.
  • extract-folder-structured — Folder picker → structured extraction for supported files → save to active SmrtSpace.
    • Safety: processes up to 500 supported files per run.
    • Entry points: Jump List, tray menu, title-bar search.

UX decisions (locked-in)

  • Files vs folder selection: when a UI control can operate on either files or folders, HubWindow will show a small prompt ("Files" vs "Folder") and then invoke the appropriate action verb (extract-documents-structured vs extract-folder-structured) and picker.
  • OCR group toggle (planned): the OCR/snipping button can toggle between:
    • Snip only (open-screen-clip)
    • Snip + OCR (snip-and-extract-clipboard-text)
  • exit-smrthub — Request shutdown + exit HubWindow.

Extract Text contracts (clipboard / file / network)

HubWindow is a primary consumer of Smrt.ExtractText. The following contracts are enforced and intentionally scoped to explicit user-triggered actions.

  • Clipboard contract:

    • HubWindow reads clipboard content only when the user invokes an Extract Text action verb.
    • HubWindow writes extracted plain text back to the clipboard (clipboard-out).
    • HubWindow does not rewrite ClipboardMonitor / Python shared state.
  • File contract:

    • HubWindow does not persist OCR payload bytes or extracted text by default.
    • Any file-path driven OCR flows (for developer validation) are explicit opt-in and must avoid logging file paths.
  • Network contract:

    • Cloud OCR is optional and credential-gated; local-first behavior is the default.
    • Logs must not include OCR payload bytes, extracted text, secrets, or file paths.

Validation notes:

  • Run extract-clipboard-text and snip-and-extract-clipboard-text against a known test image and confirm:
    • clipboard-out contains extracted text,
    • logs do not contain OCR payload bytes or extracted text.
  • When using the DEBUG ocr-file action, confirm HubWindow logs do not contain the input/output paths.

HubWindow can be registered as the handler for the SmrtHub URI scheme and will route deep links to the correct surface (for example, launching Settings Host).

Supported examples: - smrthub://settings?page=providers - smrthub://settings/providers - smrthub://settings?page=providers&vendor=openai&profile=default

Dev registration (current user, HKCU): - Register: Tools/Run/Register-SmrthubUriScheme.ps1 - Unregister: Tools/Run/Register-SmrthubUriScheme.ps1 -Unregister

SmrtHub is local-first for diagnostics: deep-link troubleshooting is done via local logs (and Support Bundles), not by assuming a telemetry server.

Primary log locations:

  • HubWindow: %LocalAppData%/SmrtHub/Logs/hub-window/
  • Settings Host: %LocalAppData%/SmrtHub/Logs/settings-host/

HubWindow emits stable event-name logs for Settings deep links:

  • hubwindow.deeplink.settings.parsed — Settings deep link parsed; routes to open-settings.
  • hubwindow.deeplink.settings.parse.failed — Parsing failed; includes failure={Failure} and whether a URI was present.
  • hubwindow.open-settings.resolved — Resolved Settings Host path / arguments.
  • hubwindow.open-settings.launched — Successfully launched Settings Host.
  • hubwindow.open-settings.launch_failed — Generic Settings Host launch failure.
  • hubwindow.open-settings.exe.not_found — Settings Host executable not found.
  • hubwindow.open-settings.process.start_failed — Process start threw.

Parsing failures are classified without logging the raw URI. The deep-link parser returns a stable reason:

  • RawUriMissing, InvalidUri, WrongScheme, WrongHost, MissingSection

Settings Host logs its parsed open arguments and trace correlation:

  • settingshost.open.args — selected page/vendor/profile and whether traceparent was present.
  • settingshost.open.traceparent.accepted / settingshost.open.traceparent.invalid
  • settingshost.providers.deeplink.args — Providers page received vendor/profile args.
  • settingshost.providers.deeplink.applied — Providers page applied vendor/profile targeting.

Cloud Providers (inside Settings Host) logs deep-link selection application best-effort:

  • cloudproviders.deeplink.requested, cloudproviders.deeplink.deferred, cloudproviders.deeplink.applied, cloudproviders.deeplink.failed

Failure outcomes for cloudproviders.deeplink.failed are stable codes:

  • invalid_vendor, vendor_not_found, profile_not_found

System Tray & Jump List

  • SystemTrayService runs under PMv2 scopes, loads DPI-appropriate icons, debounces theme changes, and groups commands into submenus:
    • Diagnostics:
      • SmrtSupport Logs: Logger.ExportUnifiedHtmlLogs() then shell-launches the viewer.
      • Generate Support Bundle (24h): DiagnosticsActions.GenerateSupportBundleAsync() writes into Desktop/SmrtHub-Bundles.
    • Extract:
      • Extract Clipboard as Text
      • Snip and Extract as Text
      • Extract Clipboard as Structured
      • Send Clipboard Structured to AI
      • Extract Documents as Structured
      • Extract Folder as Structured
    • Legal & Compliance:
      • Export Retention Evidence: DiagnosticsActions.ExportRetentionEvidenceAsync() copies the retention policy, legal holds, verification, and health artifacts into Desktop/SmrtHub-Legal/<timestamp> with a manifest identifying the operator.
      • Generate Compliance Report (7d): DiagnosticsActions.GenerateComplianceReportAsync() runs the Support Bundle compliance generator for the last seven days, dropping bundles + hashes under Desktop/SmrtHub-Compliance.
    • Exit SmrtHub: Root-level command that calls SupervisorControlClient.RequestShutdownAsync() then signals App.Exit() to mirror the tray.
  • Jump List verbs map to the same actions via the single-instance channel:

  • The tray root menu includes quick actions:

    • Settings
    • Cloud Providers
    • Extract Text Quick Settings
    • Extract Structured Text Quick Settings
    • Chat Quick Settings
    • Create Chat Session
    • List Chat Sessions
    • Extract (submenu)
  • Jump List verbs map to the same actions via the single-instance channel:

    • --action open-smartspace-archive → Open the SmartSpace Archive folder
    • --action open-settings → Settings
    • --action open-settings --page providers → Cloud Providers
    • --action open-quick-settings --feature extract-text → Extract Text Quick Settings
    • --action open-quick-settings --feature extract-structured-text → Extract Structured Text Quick Settings
    • --action open-quick-settings --feature chat → Chat Quick Settings
    • --action create-chat-session --kind general → Create Chat Session
    • --action list-chat-sessions → List Chat Sessions
    • --action extract-clipboard-text → Extract Clipboard as Text
    • --action snip-and-extract-clipboard-text → Snip and Extract as Text
    • --action extract-clipboard-structured → Extract Clipboard as Structured
    • --action send-clipboard-structured-to-ai → Send Clipboard Structured to AI
    • --action extract-documents-structured → Extract Documents as Structured
    • --action extract-folder-structured → Extract Folder as Structured
    • --action exit-smrthub → Request Supervisor shutdown + exit HubWindow

Note: HubWindow’s “Extract Documents/Folder as Structured” pickers allow a broader set of extensions for forward compatibility with future cloud structured-extraction executors. Local structured extraction (Windows OCR) is image/PDF-centric; additional formats (DOCX/HTML/etc.) require registering an appropriate cloud executor and enabling cloud execution in Quick Settings.

Diagnostics & Logging

  • Component slug: hub-window; logs land under %LocalAppData%/SmrtHub/Logs/hub-window/ with text + JSON sinks per logging policy.
  • Tray diagnostics log the icon path, DPI metrics, high-contrast detection, and Support Bundle export outcomes. IPC traffic is logged at info/debug levels for traceability when Jump List commands misbehave.
  • Support Bundle exports are intentionally headless. Use README.Files/Reference-Guides/Smrt.SupportBundle.README.md for detailed bundle expectations.

Privacy note: - The title bar profile chip is a UI-only convenience surface. It does not write identity data to disk and should not log names/emails/profile-picture paths.

Debug: Testing Profile Fallbacks

HubWindow includes a DEBUG-only test hook to simulate missing profile fields without modifying the actual Windows account.

  • Environment variable: SMRTHUB_HUBWINDOW_DEBUG_PROFILE_BLOCK
  • Values (comma/semicolon/space separated): picture, initials, name

Examples: - Force initials fallback: picture - Force built-in glyph fallback: picture,initials,name

This hook is intended for local UI validation only and should not be relied upon in production.

Debug: OCR Action Verb

HubWindow includes a DEBUG-only action verb for exercising Smrt.ExtractText without adding UI.

  • Action: --action ocr-file
  • Required: --path <imagePath> (or --file <imagePath>)
  • Optional: --out <outputPath> (writes extracted text; sensitive operational data)
  • Optional modes:
    • --cloud-first (prefer cloud, then local fallback)
    • --cloud-only (cloud only)
    • --local-only (local only)
  • Optional: --lang <language> (passed through to OCR providers when supported)

Examples: - Local-first (default): HubWindow.exe --action ocr-file --path "C:\temp\img.png" - Cloud-first (with local fallback): HubWindow.exe --action ocr-file --path "C:\temp\img.png" --cloud-first - Write output explicitly: HubWindow.exe --action ocr-file --path "C:\temp\img.png" --out "C:\temp\ocr.txt"

Privacy note: HubWindow does not log OCR payload bytes or extracted text. Writing output requires explicit --out.

Debug: Structured Extraction File Action Verb

HubWindow includes a DEBUG-only action verb for exercising Smrt.ExtractStructuredText against a file path without adding UI.

  • Action: --action extract-structured-file
  • Required: --path <documentPath> (or --file <documentPath>)

Example:

  • HubWindow.exe --action extract-structured-file --path "C:\temp\doc.pdf"

Privacy note: HubWindow does not log document payload bytes or extracted structured content. Output is copied to clipboard and may be saved to the active SmrtSpace via python-net when available.

Files & Responsibilities

  • App.xaml — global resources, UseLayoutRounding=True, theme dictionary staging.
  • App.xaml.cs — process DPI enforcement, single-instance guard, logging setup, DI container, Jump List scheduling, command-line action routing.
  • MainWindow.xaml / .cs — window creation, caption customization, DPI/theme event handling, tray initialization entry point, window restore path.
  • Services/SystemTrayService.cs — native tray icon hosting, theme/DPI refresh, context menu actions, support bundle/log export orchestration.
  • Services/SingleInstanceIpc.cs — named pipe server/client used by the mutex guard.
  • QuickSettings/* — feature-scoped quick settings windows (non-secret config/state only).
  • Services/SupervisorControlClient.cs — HTTP bridge to request shutdown from the Supervisor service.
  • Interop/NativeMethods.cs — P/Invoke surface, PerMonitorV2Scope, metrics, menu helpers.
  • ServicesUtilities/JumpListService.cs — builds the default Jump List with SmrtHub verbs.

Generated Output

  • bin/ and obj/ contain build artifacts produced by WinUI tooling. They are excluded from README coverage requirements per the Documentation Policy.

Build & Run (Staged)

HubWindow is typically launched from the staged output path to match the runtime footprint policy.

  • Script: SmrtApps/CSApps/HubWindow/Build-HubWindow.ps1
    • Supports -Mode Menu for an interactive menu.
    • Supports -Mode BuildStage|BuildRun|BuildRunInitialsFallback|BuildRunGlyphFallback.
  • Convenience wrapper: SmrtApps/CSApps/HubWindow/Build-HubWindow.bat
    • Runs -Mode Menu when no arguments are supplied.

Validation Checklist

  • Move the window between monitors at 125%/150% DPI: title logo remains crisp, drag regions stay aligned, and logs show [DPI] XamlRoot scale changed.
  • Drag the window from a wide landscape monitor to a narrow/portrait monitor: window sizing does not jump mid-drag; constraints apply after mouse release.
  • Switch Windows theme (Light/Dark) and High Contrast: caption buttons, tray icon, and title logo should all update; logs verify ApplyTheme sources and HC detection.
  • Hover/click the always-on-top pin and caption buttons: glyph hover/press is visible in both Light and Dark without background boxes; Close retains the native background hover behavior.
  • Trigger Jump List entries (Open SmartSpace Archive, Exit SmrtHub) while the app is running: one instance stays alive and actions log via IPC.
  • Use the tray menu to export logs and support bundles: exported files should appear, and the tray menu remains sharp.

Notes

  • The title bar control budget is intentionally small to stay “system-first”: logo, divider, search, pin, and native caption buttons. Search is a proof-of-concept command surface today and will be expanded later.

References

  • README.Files/System/Policies/SmrtHub-WinUI3-DPI-Discipline.README.md — canonical DPI guidance (implemented here)
  • README.Files/Capabilities/Shell-Surfaces/README.md — tray + taskbar + single-instance routing flow
  • README.Files/Reference-Guides/SmrtHub.Logging.README.md — unified logging and HTML export
  • README.Files/System/Policies/SmrtHub-Operational-Data-Policy-v1.0.README.md — paths and slug usage