Skip to content
Open
Show file tree
Hide file tree
Changes from 31 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
43cfef6
Rebuild chat shell as native WinUI
PrzemyslawKlys Jun 20, 2026
f8e64fe
Use shared runtime for persisted native conversations
PrzemyslawKlys Jul 16, 2026
6fb0d0c
Use typed shared artifact contracts
PrzemyslawKlys Jul 16, 2026
7f69f8d
Remove obsolete native UI planning artifacts
PrzemyslawKlys Jul 16, 2026
c334e00
Preserve typed fence diagnostics in native rendering
PrzemyslawKlys Jul 16, 2026
5b909f6
Harden native shell startup and history rendering
PrzemyslawKlys Jul 16, 2026
146ef07
Reuse the workspace empty chat draft
PrzemyslawKlys Jul 16, 2026
6475dbe
Share desktop service launch profile mapping
PrzemyslawKlys Jul 16, 2026
c12b17f
Block sign-in races during native turns
PrzemyslawKlys Jul 16, 2026
baed0a3
Support offline OfficeIMO release validation
PrzemyslawKlys Jul 16, 2026
472856a
Share image override activation across desktop shells
PrzemyslawKlys Jul 16, 2026
c638802
Unify native desktop state and request policy
PrzemyslawKlys Jul 17, 2026
f7483d0
Order chat admission before execution
PrzemyslawKlys Jul 17, 2026
e945b08
Harden native chat state and request handling
PrzemyslawKlys Jul 17, 2026
92302c7
Preserve concurrent desktop conversation updates
PrzemyslawKlys Jul 17, 2026
6d67a74
Synchronize merged desktop conversation metadata
PrzemyslawKlys Jul 17, 2026
773da02
Refresh live metadata from persisted conversations
PrzemyslawKlys Jul 17, 2026
95101ca
Restore native WinUI chat interaction
PrzemyslawKlys Jul 17, 2026
b23649b
Scope chat send shortcut to composer
PrzemyslawKlys Jul 17, 2026
bf0f7d5
Improve native chat rendering and scrolling
PrzemyslawKlys Jul 17, 2026
94e862e
Unify native and legacy chat behavior
PrzemyslawKlys Jul 17, 2026
838dc03
Complete shared chat parity and scrolling
PrzemyslawKlys Jul 17, 2026
e79ed99
Polish native chat tables and visual workspaces
PrzemyslawKlys Jul 17, 2026
6703062
Fix WinUI chat interaction and streaming fidelity
PrzemyslawKlys Jul 17, 2026
9700a5d
Complete native chat review follow-through
PrzemyslawKlys Jul 17, 2026
b157099
Fix WinUI runtime profile authority and artifact rendering
PrzemyslawKlys Jul 17, 2026
677f6d0
Fix WinUI settings and authentication handoff
PrzemyslawKlys Jul 17, 2026
7950680
Fix WinUI state merge and export parity
PrzemyslawKlys Jul 17, 2026
6a00512
Fix native chat scrolling and startup readiness
PrzemyslawKlys Jul 17, 2026
f3cee24
Preserve settings and queued turns across windows
PrzemyslawKlys Jul 17, 2026
8dcb9a0
Centralize desktop conversation state merging
PrzemyslawKlys Jul 17, 2026
e9a865b
Centralize desktop profile prompt behavior
PrzemyslawKlys Jul 18, 2026
c8efc3c
Harden native chat state transitions
PrzemyslawKlys Jul 18, 2026
640f05e
Harden first native request safety
PrzemyslawKlys Jul 18, 2026
340324d
Harden native WinUI chat baseline
PrzemyslawKlys Jul 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 17 additions & 4 deletions IntelligenceX.Chat/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,22 @@
<DbaClientXRepoRoot Condition="'$(DbaClientXRepoRoot)' == '' and Exists('$(DbaClientXRepoRootCandidate2)DbaClientX.SQLite\\DbaClientX.SQLite.csproj')">$(DbaClientXRepoRootCandidate2)</DbaClientXRepoRoot>
<DbaClientXRepoRoot Condition="'$(DbaClientXRepoRoot)' == ''">$(DbaClientXRepoRootCandidate1)</DbaClientXRepoRoot>

<OfficeImoMarkdownNuGetVersion Condition="'$(OfficeImoMarkdownNuGetVersion)' == ''">0.6.28</OfficeImoMarkdownNuGetVersion>
<OfficeImoMarkdownRendererNuGetVersion Condition="'$(OfficeImoMarkdownRendererNuGetVersion)' == ''">0.2.28</OfficeImoMarkdownRendererNuGetVersion>
<OfficeImoExcelNuGetVersion Condition="'$(OfficeImoExcelNuGetVersion)' == ''">0.6.41</OfficeImoExcelNuGetVersion>
<OfficeImoWordMarkdownNuGetVersion Condition="'$(OfficeImoWordMarkdownNuGetVersion)' == ''">1.0.37</OfficeImoWordMarkdownNuGetVersion>
<UseLocalOfficeImoProjects Condition="'$(UseLocalOfficeImoProjects)' == '' and '$(UseLocalNativeMarkdownEngines)' == 'true'">true</UseLocalOfficeImoProjects>
<OfficeImoRepoRootForChat Condition="'$(OfficeImoRepoRoot)' != ''">$([MSBuild]::EnsureTrailingSlash($([System.IO.Path]::GetFullPath('$(OfficeImoRepoRoot)\'))))</OfficeImoRepoRootForChat>
<OfficeImoMarkdownProject>$(OfficeImoRepoRootForChat)OfficeIMO.Markdown\OfficeIMO.Markdown.csproj</OfficeImoMarkdownProject>
<OfficeImoMarkdownRendererProject>$(OfficeImoRepoRootForChat)OfficeIMO.MarkdownRenderer\OfficeIMO.MarkdownRenderer.csproj</OfficeImoMarkdownRendererProject>
<OfficeImoMarkdownRendererIntelligenceXProject>$(OfficeImoRepoRootForChat)OfficeIMO.MarkdownRenderer.IntelligenceX\OfficeIMO.MarkdownRenderer.IntelligenceX.csproj</OfficeImoMarkdownRendererIntelligenceXProject>
<OfficeImoExcelProject>$(OfficeImoRepoRootForChat)OfficeIMO.Excel\OfficeIMO.Excel.csproj</OfficeImoExcelProject>
<OfficeImoWordMarkdownProject>$(OfficeImoRepoRootForChat)OfficeIMO.Word.Markdown\OfficeIMO.Word.Markdown.csproj</OfficeImoWordMarkdownProject>

<OfficeImoMarkdownNuGetVersion Condition="'$(OfficeImoMarkdownNuGetVersion)' == ''">2.0.2</OfficeImoMarkdownNuGetVersion>
<OfficeImoMarkdownRendererNuGetVersion Condition="'$(OfficeImoMarkdownRendererNuGetVersion)' == ''">2.0.2</OfficeImoMarkdownRendererNuGetVersion>
<OfficeImoMarkdownRendererIntelligenceXNuGetVersion Condition="'$(OfficeImoMarkdownRendererIntelligenceXNuGetVersion)' == ''">2.0.2</OfficeImoMarkdownRendererIntelligenceXNuGetVersion>
<OfficeImoExcelNuGetVersion Condition="'$(OfficeImoExcelNuGetVersion)' == ''">2.0.2</OfficeImoExcelNuGetVersion>
<OfficeImoWordMarkdownNuGetVersion Condition="'$(OfficeImoWordMarkdownNuGetVersion)' == ''">2.0.2</OfficeImoWordMarkdownNuGetVersion>
Comment on lines +28 to +32

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Use published OfficeIMO versions for package-mode builds

With the normal package-mode path (UseLocalNativeMarkdownEngines unset or no sibling OfficeIMO checkout), the app and export projects consume these defaults. The commit's own InternalDocs/chat-native-winui/native-chat-product-plan.md states that the public OfficeIMO packages remain on 2.0.1 while 2.0.2 is only validated from local source, so a clean package-mode restore requests unavailable 2.0.2 packages and cannot build or package the desktop app. Keep the NuGet defaults at published versions and reserve 2.0.2 for the explicit local-project path.

Useful? React with 👍 / 👎.

<ChartForgeXNuGetVersion Condition="'$(ChartForgeXNuGetVersion)' == ''">1.0.2</ChartForgeXNuGetVersion>
<ChartForgeXMarkupNuGetVersion Condition="'$(ChartForgeXMarkupNuGetVersion)' == ''">1.0.2</ChartForgeXMarkupNuGetVersion>
<ChartForgeXMermaidNuGetVersion Condition="'$(ChartForgeXMermaidNuGetVersion)' == ''">1.0.2</ChartForgeXMermaidNuGetVersion>
<ChartForgeXMarkupMermaidNuGetVersion Condition="'$(ChartForgeXMarkupMermaidNuGetVersion)' == ''">1.0.2</ChartForgeXMarkupMermaidNuGetVersion>
</PropertyGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,11 @@ public sealed record SessionPolicyDto {
/// </summary>
public SessionRuntimePolicyDto? RuntimePolicy { get; init; }

/// <summary>
/// Provider runtime identity active inside the service process.
/// </summary>
public SessionRuntimeIdentityDto? RuntimeIdentity { get; init; }

/// <summary>
/// Structured routing catalog diagnostics for the active registry.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
namespace IntelligenceX.Chat.Abstractions.Policy;

/// <summary>
/// Identifies the provider runtime that is active inside the chat service.
/// </summary>
public sealed record SessionRuntimeIdentityDto {
/// <summary>
/// Optional persisted service profile that supplied the runtime settings.
/// </summary>
public string? ProfileName { get; init; }

/// <summary>
/// Canonical provider transport token such as native or compatible-http.
/// </summary>
public required string Transport { get; init; }

/// <summary>
/// Effective service model, when the runtime exposes one.
/// </summary>
public string? Model { get; init; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ namespace IntelligenceX.Chat.Abstractions.Serialization;
[JsonSerializable(typeof(TurnPhaseTimingDto))]
[JsonSerializable(typeof(AutonomyTelemetryDto))]
[JsonSerializable(typeof(SessionPolicyDto))]
[JsonSerializable(typeof(SessionRuntimeIdentityDto))]
[JsonSerializable(typeof(SessionCapabilityBackgroundSchedulerDto))]
[JsonSerializable(typeof(SessionCapabilityBackgroundSchedulerActivityDto))]
[JsonSerializable(typeof(SessionCapabilityBackgroundSchedulerContinuationHintDto))]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ Run fresh AD replication summary now
Assert.Single(actions);
Assert.Equal("act_repl_now", actions[0].Id);
Assert.Equal(string.Empty, cleaned);

var visible = ActionModelProtocol.MergeVisibleTextWithPendingActions(cleaned, actions);
Assert.Contains("Run fresh AD replication summary now", visible, StringComparison.Ordinal);
Assert.Contains("/act act_repl_now", visible, StringComparison.Ordinal);
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
using System;
using System.Collections.Generic;
using IntelligenceX.Chat.App;
using Xunit;

namespace IntelligenceX.Chat.App.Tests;

/// <summary>
/// Tests the app launch contract without constructing WinUI windows.
/// </summary>
public sealed class ChatAppLaunchModeResolverTests {
/// <summary>
/// Ensures normal launches use the native WinUI shell instead of the legacy WebView shell.
/// </summary>
[Fact]
public void Resolve_DefaultsToNativeWinUi() {
var mode = ChatAppLaunchModeResolver.Resolve(_ => null);

Assert.Equal(ChatAppLaunchMode.NativeWinUI, mode);
}

/// <summary>
/// Ensures the legacy WebView shell remains available only as an explicit escape hatch.
/// </summary>
[Fact]
public void Resolve_UsesLegacyWebViewWhenExplicitlyRequested() {
var mode = ChatAppLaunchModeResolver.Resolve(CreateEnvironment(
(ChatAppLaunchModeResolver.LegacyWebViewEnvVar, "1")));

Assert.Equal(ChatAppLaunchMode.LegacyWebView, mode);
}

/// <summary>
/// Ensures diagnostic launch modes continue to outrank the normal shell selection.
/// </summary>
[Theory]
[InlineData(ChatAppLaunchModeResolver.MinimalWindowEnvVar, nameof(ChatAppLaunchMode.MinimalWindow))]
[InlineData(ChatAppLaunchModeResolver.WebViewSmokeEnvVar, nameof(ChatAppLaunchMode.WebViewSmoke))]
public void Resolve_PreservesDiagnosticLaunchModes(string variableName, string expectedName) {
var mode = ChatAppLaunchModeResolver.Resolve(CreateEnvironment(
(variableName, "true"),
(ChatAppLaunchModeResolver.LegacyWebViewEnvVar, "true")));

Assert.Equal(expectedName, mode.ToString());
}

/// <summary>
/// Ensures the old native opt-in flag is harmless because native WinUI is now the default.
/// </summary>
[Fact]
public void Resolve_TreatsNativeWinUiFlagAsNoOpCompatibilitySignal() {
var mode = ChatAppLaunchModeResolver.Resolve(CreateEnvironment(
(ChatAppLaunchModeResolver.NativeWinUiEnvVar, "1")));

Assert.Equal(ChatAppLaunchMode.NativeWinUI, mode);
}

private static Func<string, string?> CreateEnvironment(params (string Name, string Value)[] values) {
var map = new Dictionary<string, string?>(StringComparer.OrdinalIgnoreCase);
foreach (var value in values) {
map[value.Name] = value.Value;
}

return name => map.TryGetValue(name, out var value) ? value : null;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using IntelligenceX.Chat.App;
using IntelligenceX.Chat.App.Launch;
using Xunit;

namespace IntelligenceX.Chat.App.Tests;
Expand Down Expand Up @@ -26,27 +27,41 @@ public void Constructor_DefaultsTranscriptDebugVisibilityToOff() {
/// Ensures old persisted disabled image-generation state keeps emitting an explicit disable override.
/// </summary>
[Fact]
public void ResolveLocalProviderImageGenerationOverrideActive_MigratesLegacyPersistedDisable() {
public void ResolveImageGenerationOverrideActive_MigratesLegacyPersistedDisable() {
var state = new ChatAppState {
LocalProviderImageGenerationEnabled = false,
LocalProviderImageGenerationOverrideActive = false,
LocalProviderImageGenerationOverrideActiveWasPresent = false
};

Assert.True(MainWindow.ResolveLocalProviderImageGenerationOverrideActive(state, isLoadedProfile: true));
Assert.True(ChatServiceLaunchProfileMapper.ResolveImageGenerationOverrideActive(state, isLoadedProfile: true));
}

/// <summary>
/// Ensures old persisted enabled image-generation state also remains an explicit override.
/// </summary>
[Fact]
public void ResolveImageGenerationOverrideActive_MigratesLegacyPersistedEnable() {
var state = new ChatAppState {
LocalProviderImageGenerationEnabled = true,
LocalProviderImageGenerationOverrideActive = false,
LocalProviderImageGenerationOverrideActiveWasPresent = false
};

Assert.True(ChatServiceLaunchProfileMapper.ResolveImageGenerationOverrideActive(state, isLoadedProfile: true));
}

/// <summary>
/// Ensures new persisted state can intentionally keep image-generation override unset.
/// </summary>
[Fact]
public void ResolveLocalProviderImageGenerationOverrideActive_PreservesNewPersistedUnsetDisable() {
public void ResolveImageGenerationOverrideActive_PreservesNewPersistedUnsetDisable() {
var state = new ChatAppState {
LocalProviderImageGenerationEnabled = false,
LocalProviderImageGenerationOverrideActive = false,
LocalProviderImageGenerationOverrideActiveWasPresent = true
};

Assert.False(MainWindow.ResolveLocalProviderImageGenerationOverrideActive(state, isLoadedProfile: true));
Assert.False(ChatServiceLaunchProfileMapper.ResolveImageGenerationOverrideActive(state, isLoadedProfile: true));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Threading;
using System.Threading.Tasks;
using IntelligenceX.Chat.App;
using IntelligenceX.Chat.App.Conversation;
using Xunit;

namespace IntelligenceX.Chat.App.Tests;
Expand Down Expand Up @@ -35,8 +36,12 @@ public async Task UpsertAndGet_PreservesQueuedTurnState_WithBoundedRetention() {
Assert.NotNull(loaded);
Assert.NotNull(loaded!.PendingTurns);
Assert.NotNull(loaded.QueuedTurnsAfterLogin);
Assert.True(loaded.PendingTurns.Count <= 24);
Assert.True(loaded.QueuedTurnsAfterLogin.Count <= 24);
Assert.True(loaded.PendingTurns.Count <= ChatQueueContract.MaxTurns);
Assert.True(loaded.QueuedTurnsAfterLogin.Count <= ChatQueueContract.MaxTurns);
Assert.Equal("pending-turn-0", loaded.PendingTurns[0].Text);
Assert.Equal("pending-turn-7", loaded.PendingTurns[^1].Text);
Assert.Equal("signin-turn-0", loaded.QueuedTurnsAfterLogin[0].Text);
Assert.Equal("signin-turn-7", loaded.QueuedTurnsAfterLogin[^1].Text);
Assert.All(loaded.PendingTurns, item => Assert.False(string.IsNullOrWhiteSpace(item.Text)));
Assert.All(loaded.QueuedTurnsAfterLogin, item => Assert.False(string.IsNullOrWhiteSpace(item.Text)));
} finally {
Expand Down
Loading
Loading