using Cosmos.Kernel.System; using Cosmos.Kernel.System.Diagnostics; using Cosmos.Kernel.System.Input; using ConsoleKeyEx = Cosmos.Kernel.System.Input.Key; using XFESystem.Core; using XFESystem.Desktop; using XFESystem.ConsoleDemo; using XFESystem.Console; using XFESystem.ManagedRuntime; using XFESystem.Browser; using System.Text; using Cosmos.Kernel.System.Network; using Cosmos.Kernel.System.Timers; using System.Diagnostics; namespace XFESystem.Kernel; /// NativeAOT bare-metal kernel with explicit, bounded managed application compatibility. public sealed class Kernel : Cosmos.Kernel.System.Kernel { private DesktopSession? desktop; private TerminalSnapshot? demonstration; private int lastWindow; private MemoryWorkspace? workspace; private CanvasAdapter? display; private FramePacer? framePacer; private readonly NativeDesktopInput desktopInput = new(); private readonly NativePointerFrameProbe pointerFrameProbe = new(); private bool pointerProbeKeyDown; private string lastWindowState = ""; private long lastRenderReport; private long lastChromeFrameReport; private string lastChromeFrame = ""; private bool previousLeftButton; private string lastBrowserState = ""; private long lastBrowserStateReport; private string lastBrowserInput = ""; private long lastBrowserProofRevision = -1, lastBrowserProofReport; private int lastBrowserProofWindow; private string lastMonacoProof = ""; private readonly EditorReadbackTracker basicEditorReadback = new(); private bool lastPointerReportLeft; private NativeManagedWorkScheduler? editorWorker; private NativeManagedWorkScheduler? navigationWorker; private System.Threading.Thread? uiThread; private System.Threading.Thread? networkThread; private const string ManagedDemoPath = "X:\\Programs\\ManagedHello\\ManagedHello.dll"; // Only the bounded serial byte write masks interrupts; formatting and all // kernel/network work happen before entering the runtime's atomic log API. private static void WriteDiagnostic(string message) => Log.WriteBytes(Encoding.UTF8.GetBytes("\n" + message)); public override void Start() { NativeBootProgress.Begin(); NativeBootProgress.Stage("A10", "Starting devices and drivers"); try { base.Start(); } catch (Exception error) when (error is not OutOfMemoryException and not StackOverflowException) { NativeBootProgress.Failed(error.Message); WriteDiagnostic("[FAILFAST] Kernel lifecycle failed: " + error.Message + "\n"); while (true) Power.Halt(); } } protected override void OnBoot() { NativeBootProgress.Stage("A20", "Drivers completed; initializing console"); base.OnBoot(); NativeBootProgress.Stage("A21", "Console initialized"); } protected override void BeforeRun() { NativeBootProgress.Resume("B00", "Managed desktop startup entered"); InitializeDesktop(); } private void InitializeDesktop() { NativeBootProgress.Stage("B10", "Preparing input and packaged resources"); desktopInput.Trace = WriteDiagnostic; desktopInput.NavigationDispatched = () => { // Navigation diagnostics inspect only the UI-owned Browser. The // background editor proxy never exposes its worker-owned engine. if (desktop?.ActiveWindow is { Application: DesktopApplication.Browser, BrowserSession: BrowserService navigation } && Uri.TryCreate(navigation.CurrentPage.Address, UriKind.Absolute, out var address) && BrowserService.IsMonacoAddress(address)) WriteDiagnostic("XFE_NATIVE_NAV_SELECTION_BEGIN\n" + navigation.ReadEditorNavigationProof() + "\nXFE_NATIVE_NAV_SELECTION_END\n"); }; NativeKeyboardCapture.Prepare(); NativePointerCapture.Prepare(); NativeNvidiaDiscovery.Report(WriteDiagnostic); WriteDiagnostic("XFE_CPU_TOPOLOGY|Physical|" + NativeBootProgress.PhysicalCpuCount() + "|Scheduler|" + NativeBootProgress.SchedulerCpuCount() + "|StartedCpus|1|BootstrapLogicalCpu|0\n"); WriteDiagnostic("XFE_CSHARP_NATIVEAOT_BOOT_OK\n"); int documentTextResources = XFESystem.Documents.WebsiteAssets.PrewarmTextResources(); int browserTextResources = PackagedBrowserResources.PrewarmTextResources(); WriteDiagnostic("XFE_PACKAGED_TEXT_PREWARM|Documents|" + documentTextResources + "|Browser|" + browserTextResources + "|Immutable|1\n"); NativeBootProgress.Stage("B20", "Checking managed runtime"); if (!RuntimeVarianceRegression.Run()) throw new InvalidOperationException("The managed generic variance runtime regression failed."); WriteDiagnostic("XFE_RUNTIME_VARIANCE_OK\n"); WriteDiagnostic("XFE_GC_DEEP_BEGIN\n"); NativeBootProgress.Stage("B21", "Checking garbage collector"); bool deepGc = NativeGcRegression.Run(); WriteDiagnostic("XFE_GC_DEEP_RESULT|" + deepGc + "|Frames|"+NativeGcRegression.FramesVerified+"|Collections|"+NativeGcRegression.CollectionsRequested+"|FailureDepth|"+NativeGcRegression.FailureDepth+"\n"); if (!deepGc) throw new InvalidOperationException("The native deep-stack GC root regression failed."); WriteDiagnostic("XFE_EH_DEEP_RETHROW_BEGIN\n"); NativeBootProgress.Stage("B22", "Checking exception handling"); if (!NativeEhRegression.Run()) throw new InvalidOperationException("The native deep catch/rethrow recovery regression failed."); WriteDiagnostic("XFE_EH_DEEP_RETHROW_OK|Frames|" + NativeEhRegression.FramesCaught + "|Post|" + NativeEhRegression.PostCatchFrames + "\n"); WriteDiagnostic("XFE_THREAD_EH_GC_BEGIN\n"); NativeBootProgress.Stage("B30", "Checking timer, scheduler and thread runtime"); bool threadRuntimeReady = NativeThreadRegression.Run(); WriteDiagnostic("XFE_THREAD_EH_GC_RESULT|" + threadRuntimeReady + "|Steps|" + NativeThreadRegression.Steps + "|Collections|" + NativeThreadRegression.Collections + "|SingleCpu|1|GcStopTheWorld|1\n"); WriteDiagnostic("XFE_THREAD_PREEMPTION|Checks|" + NativeThreadRegression.PreemptionChecks + "|FirstId|" + NativeThreadRegression.FirstThreadId + "|SecondId|" + NativeThreadRegression.SecondThreadId + "|FirstFailure|" + NativeThreadRegression.FirstFailure + "|SecondFailure|" + NativeThreadRegression.SecondFailure + "\n"); WriteDiagnostic("XFE_THREAD_TLS|Checks|" + NativeThreadRegression.ThreadStaticChecks + "|FirstManagedId|" + NativeThreadRegression.FirstManagedThreadId + "|SecondManagedId|" + NativeThreadRegression.SecondManagedThreadId + "|OrdinaryThreadsOnly|1\n"); WriteDiagnostic("XFE_NATIVE_SLEEP_TIMING|RequestedMilliseconds|25|ElapsedTicks|" + NativeThreadRegression.SleepElapsedTicks + "|Frequency|" + Stopwatch.Frequency + "\n"); if (!threadRuntimeReady) { NativeBootProgress.Failed("Thread, timer or preemption contract failed."); WriteDiagnostic("[FAILFAST] Native thread EH/GC/preemption contract failed; background work and desktop startup remain disabled.\n"); while (true) Power.Halt(); } NativeBootProgress.Stage("B40", "Checking weak references and frozen memory"); bool weakRuntimeReady = NativeWeakLifetimeRegression.Run(NativeRuntimeMemoryDiagnostics.DependentHandleCount); WriteDiagnostic("XFE_WEAK_LIFETIME_RESULT|" + weakRuntimeReady + "|Checks|" + NativeWeakLifetimeRegression.ChecksPassed + "|Weak|" + (NativeWeakLifetimeRegression.WeakTargetCleared ? 1 : 0) + "|Live|" + (NativeWeakLifetimeRegression.LiveValuePreserved ? 1 : 0) + "|Cycle|" + (NativeWeakLifetimeRegression.CycleCleared ? 1 : 0) + "|FixedPoint|" + (NativeWeakLifetimeRegression.FixedPointPreserved ? 1 : 0) + "|Disposed|" + (NativeWeakLifetimeRegression.HandlesDisposed ? 1 : 0) + "|HandlesBefore|" + NativeWeakLifetimeRegression.DependentHandlesBefore + "|HandlesAfter|" + NativeWeakLifetimeRegression.DependentHandlesAfter + "|Failure|" + NativeWeakLifetimeRegression.Failure + "\n"); if (!weakRuntimeReady) { NativeBootProgress.Failed("Weak reference lifetime contract failed."); WriteDiagnostic("[FAILFAST] Native weak/dependent handle contract failed; browser and desktop remain disabled.\n"); while (true) Power.Halt(); } bool frozenRuntimeReady = NativeFrozenRangeRegression.Run(NativeRuntimeMemoryDiagnostics.ValidateFrozenRange, NativeRuntimeMemoryDiagnostics.RegisteredFrozenRangesValid); WriteDiagnostic("XFE_FROZEN_RANGE_RESULT|" + frozenRuntimeReady + "|Checks|" + NativeFrozenRangeRegression.ChecksPassed + "|RegisteredValid|" + (NativeFrozenRangeRegression.RegisteredRangesValid ? 1 : 0) + "|Failure|" + NativeFrozenRangeRegression.Failure + "\n"); if (!frozenRuntimeReady) { NativeBootProgress.Failed("Frozen memory range contract failed."); WriteDiagnostic("[FAILFAST] Native frozen-object range contract failed; browser and desktop remain disabled.\n"); while (true) Power.Halt(); } bool weakCollectionsReady = NativeWeakCollectionsRegression.Run(NativeRuntimeMemoryDiagnostics.DependentHandleCount); WriteDiagnostic("XFE_OWNED_WEAK_COLLECTIONS_RESULT|" + weakCollectionsReady + "|Checks|" + NativeWeakCollectionsRegression.ChecksPassed + "|NativeCountChecked|" + (NativeWeakCollectionsRegression.NativeHandleCountChecked ? 1 : 0) + "|HandlesBefore|" + NativeWeakCollectionsRegression.DependentHandlesBefore + "|HandlesAfter|" + NativeWeakCollectionsRegression.DependentHandlesAfter + "|Failure|" + NativeWeakCollectionsRegression.Failure + "\n"); if (!weakCollectionsReady) { NativeBootProgress.Failed("Owned weak collection contract failed."); WriteDiagnostic("[FAILFAST] Native owned weak collection contract failed; browser and desktop remain disabled.\n"); while (true) Power.Halt(); } NativeBootProgress.Stage("B50", "Checking JavaScript engine lifetime"); var weakJavaScriptWarmup = BrowserWeakCollectionsRegression.Run(); if (!weakJavaScriptWarmup.Passed || !weakJavaScriptWarmup.EngineCachesExercised || !weakJavaScriptWarmup.ConstructorFailureReleased || !weakJavaScriptWarmup.ConstructorExceptionPreserved) throw new InvalidOperationException("The JavaScript weak collection warmup failed."); var weakJavaScript = BrowserWeakCollectionsRegression.Run(NativeRuntimeMemoryDiagnostics.DependentHandleCount); bool weakJavaScriptReady = weakJavaScript.Passed && weakJavaScript.EngineCachesExercised && weakJavaScript.ConstructorFailureReleased && weakJavaScript.ConstructorExceptionPreserved; WriteDiagnostic("XFE_JS_WEAK_COLLECTIONS_RESULT|" + weakJavaScriptReady + "|NativeCountChecked|" + (weakJavaScript.NativeHandleCountChecked ? 1 : 0) + "|HandlesBefore|" + weakJavaScript.NativeHandlesBefore + "|HandlesAfter|" + weakJavaScript.NativeHandlesAfter + "|Created|" + weakJavaScript.AfterRelease.Created + "|Disposed|" + weakJavaScript.AfterRelease.Disposed + "|Tables|" + weakJavaScript.AfterRelease.Tables + "|Entries|" + weakJavaScript.AfterRelease.Entries + "|EngineCachesExercised|" + (weakJavaScript.EngineCachesExercised ? 1 : 0) + "|ConstructorFailureReleased|" + (weakJavaScript.ConstructorFailureReleased ? 1 : 0) + "|ConstructorExceptionPreserved|" + (weakJavaScript.ConstructorExceptionPreserved ? 1 : 0) + "|Actual|" + weakJavaScript.Actual + "\n"); if (!weakJavaScriptReady) { NativeBootProgress.Failed("JavaScript weak collection contract failed."); WriteDiagnostic("[FAILFAST] Native JavaScript weak collection contract failed; browser and desktop remain disabled.\n"); while (true) Power.Halt(); } NativeBootProgress.Stage("B60", "Preparing memory workspace and console programs"); RunConsoleDemo(); workspace = new MemoryWorkspace(); workspace.WriteText(SystemPaths.Combine(SystemPaths.Documents, "Readme.md"), "# XFESystem Markdown\n\n**Website renderer** is active.\n\n- C# desktop\n- JavaScript preview\n"); workspace.WriteText(SystemPaths.Combine(SystemPaths.Documents, "WebsiteParity.md"), XFESystem.Documents.WebsiteAssets.ReadText("Fixtures/WebsiteParity.md")); workspace.WriteText(SystemPaths.Combine(SystemPaths.Documents, "ZCSharp.cs"), "using System;\nnamespace XFEstudio;\npublic sealed class Preview\n{\n public string Message { get; set; } = \"Hello XFESystem\";\n public static int Run(int value)\n {\n if (value > 0) return Math.Max(value, 42);\n Console.WriteLine(\"Ready\");\n return 0;\n }\n}"); workspace.CreateDirectory("X:\\Programs\\ManagedHello"); using (var application = typeof(Kernel).Assembly.GetManifestResourceStream("XFESystem.Programs.ManagedHello.dll") ?? throw new InvalidOperationException("The independent C# example assembly is missing.")) { var bytes = new byte[application.Length]; application.ReadExactly(bytes); workspace.WriteBytes(ManagedDemoPath, bytes); } RunManagedApplicationCore(ManagedDemoPath, verifyDemonstration: true); NativeBootProgress.Stage("B70", "Network starts in background after desktop"); WriteDiagnostic("XFE_NETWORK_DEFERRED|StartAfterDesktop|1\n"); WriteDiagnostic("XFE_BROWSER_CONSTRUCT_BEGIN\n"); NativeBootProgress.Stage("B80", "Preparing browser and document renderer"); // Admit the real Monaco core, but reject larger optional dependencies // before AST preparation can exhaust a fragmented native heap. var browser = new BrowserService(new NativeWebTransport(), new BrowserLimits { MaximumExternalResourceCharacters = 2_500_000 }) { Trace = WriteDiagnostic }; WriteDiagnostic("XFE_BROWSER_CONSTRUCT_OK\nXFE_BROWSER_NAVIGATE_BEGIN\n"); var constrainedJavaScript = new JavaScriptRuntime(new BrowserLimits { MaximumStatements = 50 }); if (constrainedJavaScript.Evaluate("while (true) {}").Success) throw new InvalidOperationException("The guest JavaScript statement budget was not enforced."); var recoveredJavaScript = constrainedJavaScript.Evaluate("6 * 7"); if (!recoveredJavaScript.Success || recoveredJavaScript.Text != "42") throw new InvalidOperationException("The guest JavaScript runtime could not recover after its statement limit."); WriteDiagnostic("XFE_JAVASCRIPT_LIMIT_RECOVERY_OK\n"); constrainedJavaScript.Dispose(); var page = browser.Navigate("about:Start"); BrowserNativeEventRegression.Run(browser,WriteDiagnostic); WriteDiagnostic("XFE_BROWSER_NAVIGATE_OK\n"); if (!page.Text.Contains("JavaScript ready: 12", StringComparison.Ordinal)) throw new InvalidOperationException("The guest browser JavaScript/DOM test failed: " + page.Text); WriteDiagnostic("XFE_BROWSER_MARKDOWN_BEGIN\n"); var markdown = browser.PreviewMarkdown("# XFESystem\n\n**Markdown** from the website renderer."); if (!markdown.Contains("Markdown", StringComparison.Ordinal)) throw new InvalidOperationException("The guest Markdown preview test failed."); WriteDiagnostic("XFE_CSHARP_JAVASCRIPT_DOM_OK\nXFE_CSHARP_MARKDOWN_OK\n"); NativeBootProgress.Stage("B90", "Creating desktop display surface"); var canvas = new CanvasAdapter(); canvas.PointerFrameProbe = pointerFrameProbe; display = canvas; editorWorker = new NativeManagedWorkScheduler(WriteDiagnostic, canvas.ScalePercent / 100); navigationWorker = new NativeManagedWorkScheduler(WriteDiagnostic, canvas.ScalePercent / 100); IEditorPreparationService editorPreparation = new BrowserEditorPreparationService(browser, editorWorker, editorWorker, WriteDiagnostic, NativeThreadRegression.CurrentThreadId, monotonicMilliseconds: MonotonicMilliseconds, navigationScheduler: navigationWorker); WriteDiagnostic("XFE_WEB_FONT_METRICS|" + canvas.WebFontMetricsEvidence + "\n"); MouseManager.SetScreenSize(canvas.NativeWidth, canvas.NativeHeight); MouseManager.SetPosition(canvas.NativeWidth / 2, canvas.NativeHeight / 2); var monitor = NativeDisplayInfo.Read(canvas.NativeWidth, canvas.NativeHeight); int refreshTarget = canvas.DriverRefreshHz > 0 ? canvas.DriverRefreshHz * 1000 : monitor.Timing.HasAdvertisedTiming ? monitor.Timing.AdvertisedRefreshMilliHz : 60_000; framePacer = new FramePacer(Stopwatch.Frequency, refreshTarget); // Wake the input/render loop often enough to service high-refresh input. // This is a timer cadence, not a claim of display scanout or VSync. if (TimerManager.IsInitialized && TimerManager.Frequency < 1000) TimerManager.Frequency = 1000; desktop = new DesktopSession(canvas, workspace, browser, consoleDemo: () => RunManagedApplication(ManagedDemoPath), managedApplication: RunManagedApplication, monotonicMilliseconds: MonotonicMilliseconds, editorPreparation: editorPreparation, threadIdentity: NativeThreadRegression.CurrentThreadId) { Trace = WriteDiagnostic }; desktop.Pointer(canvas.ToLayout(MouseManager.X), canvas.ToLayout(MouseManager.Y), false); while (NativePointerCapture.TryRead(out _)) { } desktop.PointerReportsLost(canvas.ToLayout(MouseManager.X),canvas.ToLayout(MouseManager.Y),MouseManager.LeftButton,MonotonicMilliseconds()); NativeBootProgress.Stage("B99", "Presenting desktop"); NativeBootProgress.DesktopOwnsDisplay(); desktop.Render(); WriteDiagnostic("XFE_BOOT_SCREEN|Stages|" + NativeBootProgress.StageCount + "|DisabledBeforeDesktop|" + (NativeBootProgress.IsVisible ? 0 : 1) + "\n"); WriteDiagnostic("XFE_SERIAL_BOUNDED|PollLimit|4096|Absent|" + NativeBootProgress.SerialAbsentCount() + "|Timeout|" + NativeBootProgress.SerialTimeoutCount() + "|Dropped|" + NativeBootProgress.SerialDroppedCount() + "\n"); WriteDiagnostic("XFE_RENDER_BACKEND|Rasterization|CPU|GpuAcceleration|0|CudaAcceleration|0|Reason|No initialized native GPU or CUDA command backend\n"); WriteDiagnostic("XFE_MONITOR_TIMING|" + monitor.Timing.AdvertisedRefreshMilliHz + "|TargetMilliHz|" + refreshTarget + "|DriverConfirmedHz|" + canvas.DriverRefreshHz + "|VSync|0|Origin|" + monitor.Origin + "|" + monitor.Timing.Source + "\n"); WriteDiagnostic("XFE_INPUT_RAW_HOOK_EXPECTED\n"); WriteDiagnostic("XFE_DISPLAY_NATIVE|" + canvas.NativeWidth + "|" + canvas.NativeHeight + "|ScalePercent|" + canvas.ScalePercent + "\n"); WriteDiagnostic("XFE_CSHARP_DESKTOP_READY\n"); } private static void InitializeNetwork() { // Driver-kit workers publish adapters asynchronously. The manager itself // is initialized by Cosmos before the driver stage, not by this kernel. long waitStarted = Stopwatch.GetTimestamp(); bool ready = NativeNetworkBootWait.WaitUntilReady( () => NetworkManager.DeviceCount > 0 && NetworkManager.Ready && NetworkManager.LinkUp, Stopwatch.GetTimestamp, Stopwatch.Frequency, Power.Halt); WriteDiagnostic("XFE_NETWORK_BOOT_WAIT|Ready|" + ready + "|ElapsedTicks|" + (Stopwatch.GetTimestamp() - waitStarted) + "|Frequency|" + Stopwatch.Frequency + "|PitWait|0\n"); if (!ready) { WriteDiagnostic("XFE_NETWORK_UNAVAILABLE\n"); return; } try { var dhcp = new DhcpClient(); try { dhcp.SendDiscoverPacket(); } catch { dhcp.Close(); throw; } dhcp.Close(); if (NetworkManager.Primary.IPConfig is { } config && !config.Address.IsZero) { WriteDiagnostic("XFE_NETWORK_DHCP_OK|" + config.Address + "|DnsServers|" + DnsConfig.Nameservers.Count + "\n"); } else WriteDiagnostic("XFE_NETWORK_DHCP_FAILED\n"); } catch (Exception error) when (error is not OutOfMemoryException and not StackOverflowException) { WriteDiagnostic("XFE_NETWORK_DHCP_FAILED|" + error.Message + "\n"); } } protected override void Run() { if (!NativeThreadRegression.Passed) { WriteDiagnostic("[FAILFAST] The native desktop requires its verified thread runtime.\n"); while (true) Power.Halt(); } // The boot thread is the scheduler's idle fallback. A CPU-bound worker // would starve it, so the UI must itself be an ordinary runnable thread. uiThread = new System.Threading.Thread(RunDesktopLoop, NativeManagedWorkScheduler.StackBytes); uiThread.Start(); // Adapter and DHCP waits cannot hold the desktop's boot or UI thread. // The thread/runtime contract has already passed before either starts. networkThread = new System.Threading.Thread(InitializeNetwork, NativeManagedWorkScheduler.StackBytes); networkThread.Start(); while (true) Power.Halt(); } private void RunDesktopLoop() { WriteDiagnostic("XFE_DESKTOP_UI_THREAD|" + NativeThreadRegression.CurrentThreadId() + "|StackBytes|" + NativeManagedWorkScheduler.StackBytes + "\n"); while (true) { if (desktop is { } session) { long inputMilliseconds = MonotonicMilliseconds(); if (MouseManager.ScrollDelta != 0) MouseManager.ResetScrollDelta(); bool leftButton = MouseManager.LeftButton, processedKey = false; NativePointerReport? pendingMotion = null; bool packetLeft = lastPointerReportLeft; // Bound one drain so continuous input cannot starve rendering, // animation, keyboard handling or diagnostics. int pointerBudget = 64; while (pointerBudget-- > 0 && NativePointerCapture.TryRead(out var pointerReport)) { if (pointerReport.LostReports) { pendingMotion = null; packetLeft = leftButton; session.PointerReportsLost(display!.ToLayout(MouseManager.X),display.ToLayout(MouseManager.Y),leftButton,inputMilliseconds); WriteDiagnostic("XFE_POINTER_REPORTS_LOST\n"); continue; } if (pointerReport.LeftButton == packetLeft && pointerReport.Wheel == 0) { pendingMotion = pointerReport; continue; } if (pendingMotion is { } motion) { DispatchPointer(session,motion); pendingMotion = null; } DispatchPointer(session,pointerReport); packetLeft = pointerReport.LeftButton; } if (pendingMotion is { } finalMotion) DispatchPointer(session,finalMotion); // Preserve the upstream queue for its other consumers but drain // our copy: desktop input must include modifier break reports. while (KeyboardManager.TryReadKey(out _)) { } while (NativeKeyboardCapture.TryRead(out var scanCode, out var released, out var lostReports)) { if (lostReports) pointerProbeKeyDown = false; // Reserved opt-in native timing probe. F12 emits no // per-frame logs; stop formats only after capture ends. if (scanCode == 0x58 && !lostReports) { if (released) pointerProbeKeyDown = false; else if (!pointerProbeKeyDown) { pointerProbeKeyDown = true; var counters = new NativePointerTimingCounters(NativePointerCapture.ObservedReports, NativePointerCapture.ConsumedReports, NativePointerCapture.LostReports); long at = Stopwatch.GetTimestamp(); if (pointerFrameProbe.IsCapturing) pointerFrameProbe.Stop(at, display!.FramesPresented, counters, WriteDiagnostic); else { pointerFrameProbe.Start(Stopwatch.Frequency, at, display!.FramesPresented, counters); WriteDiagnostic("XFE_POINTER_TIMING_STARTED\n"); } } continue; } if (desktopInput.Translate(scanCode, released, lostReports, session, out var character) is { } mapped) { processedKey = true; session.Key(mapped, character); if (mapped == DesktopKey.Enter && session.ActiveWindow is { Application: DesktopApplication.Browser } navigated) { // WriteBytes is the runtime's atomic serial protocol API. // The plain string logger truncates UTF-16 to bytes and // permits IRQ logs to split acceptance frame markers. var body = navigated.Content.Length <= 4_096 ? navigated.Content : navigated.Content[..4_096]; var report = "XFE_BROWSER_NAVIGATED|" + navigated.Location + "\nXFE_BROWSER_TEXT_BEGIN\n" + body + "\nXFE_BROWSER_TEXT_END\n"; if (navigated.Content.Contains("中文 HTTP 正文", StringComparison.Ordinal)) report += "XFE_BROWSER_UTF8_BODY_OK\n"; WriteDiagnostic(report); } if (mapped == DesktopKey.Save && session.ActiveWindow is { IsDirty: false } saved && saved.BrowserSession is not IBackgroundEditorSession) { WriteDiagnostic("XFE_DESKTOP_SAVED|" + saved.Location + "|" + saved.Content.Length + "\n"); } } } // Already queued input takes priority over a cooperative page // loading phase. In particular Win+D/close can hide or remove // the page before an indivisible script evaluation starts. session.AdvanceFeedback(inputMilliseconds); var active = session.ActiveWindow; bool activeChanged = (active?.Id ?? 0) != lastWindow; // A queued readback can open a preview without another input // report. Publish its actual geometry before any DOM evidence. if (activeChanged) ReportWindowState(session); if (active is not null && VisiblePage(active) is not null) { basicEditorReadback.Reset(); ReportBrowserState(active); } else if (active is { Application: DesktopApplication.Editor }) ReportBasicEditorState(active); else basicEditorReadback.Reset(); if (activeChanged) { lastWindow = active?.Id ?? 0; WriteDiagnostic("XFE_DESKTOP_ACTIVE|" + (active?.Application.ToString() ?? "Desktop") + "\n"); if (active is { Application: DesktopApplication.Browser }) { if (active.Content.Contains("JavaScript ready: 12", StringComparison.Ordinal)) WriteDiagnostic("XFE_BROWSER_START_DOM_RENDER_OK\n"); if (active.Content.Contains("Hello from XFESystem!", StringComparison.Ordinal)) WriteDiagnostic("XFE_EDITOR_JAVASCRIPT_PREVIEW_OK\n"); if (active.Content.Contains("Website renderer", StringComparison.Ordinal)) WriteDiagnostic("XFE_EDITOR_MARKDOWN_PREVIEW_OK\n"); } } if (!leftButton && (processedKey || previousLeftButton || lastWindowState.Length == 0)) ReportWindowState(session); previousLeftButton = leftButton; long now = Stopwatch.GetTimestamp(); if (framePacer!.ShouldRender(now, session.NeedsRender)) { session.Render(); if (session.LastFrameCompleted) { framePacer.Rendered(now, Stopwatch.GetTimestamp()); ReportChromeFrame(session, now); } } if (now - lastRenderReport >= Stopwatch.Frequency) { lastRenderReport = now; WriteDiagnostic("XFE_RENDER_STATS|" + now + "|Frames|" + framePacer.FramesRendered + "|Partial|" + display!.PartialFrames + "|Pixels|" + display.PixelsPresented + "|Glyphs|" + display.CachedGlyphCount + "|Fallback|" + display.FullCopyFallbackFrames + "|LastRenderTicks|" + framePacer.LastRenderDurationTicks + "|Frequency|" + Stopwatch.Frequency + "|MotionReuses|" + display.MotionReuseCount + "|MotionPixels|" + display.MotionPixelsReused + "|ScanoutPixelsSaved|" + display.ScanoutPixelsSaved + "|RenderYields|" + session.RenderYieldCount + "|RawFreePages|" + NativeRuntimeMemoryDiagnostics.FreePages() + "|RawTotalPages|" + NativeRuntimeMemoryDiagnostics.TotalPages() + "|RawLargestFreeRunPages|" + NativeRuntimeMemoryDiagnostics.LargestFreeRunPages() + "|LastGcIndex|" + NativeRuntimeMemoryDiagnostics.LastGcCollectionIndex() + "|LastGcHeapSpanBytes|" + NativeRuntimeMemoryDiagnostics.LastGcHeapSpanBytes() + "|LastGcFragmentedBytes|" + NativeRuntimeMemoryDiagnostics.LastGcFragmentedBytes() + "|LastGcCommittedBytes|" + NativeRuntimeMemoryDiagnostics.LastGcCommittedBytes() + "|DependentHandles|" + NativeRuntimeMemoryDiagnostics.DependentHandleCount() + "|WebFrameChunks|" + display.WebFramePixelChunkAllocations + "|WebFrameLargestChunkBytes|" + display.WebFrameLargestPixelChunkBytes + "|WebFrameStorageReuses|" + display.WebFramePixelStorageReuses + "\n"); if (active?.BrowserSession is BrowserService measuredPage) WriteDiagnostic("XFE_WEB_WORK|Window|" + active.Id + "|Layout|" + measuredPage.LayoutPassCount + "|ScrollReuse|" + measuredPage.ScrollLayoutReuseCount + "|Raster|" + measuredPage.RasterPaintCount + "|CachedPaint|" + measuredPage.CachedPaintCount + "|AstHits|" + measuredPage.PackagedScriptCacheHits + "|AstPrepared|" + measuredPage.PackagedScriptPreparations + "\n"); else if (active?.BrowserSession is IBackgroundEditorSession backgroundPage) { var published = backgroundPage.Diagnostics; WriteDiagnostic("XFE_WEB_WORK|Window|" + active.Id + "|Layout|" + published.LayoutPassCount + "|ScrollReuse|" + published.ScrollLayoutReuseCount + "|Raster|" + backgroundPage.RasterPaintCount + "|CachedPaint|" + backgroundPage.CachedPaintCount + "|AstHits|" + published.PackagedScriptCacheHits + "|AstPrepared|" + published.PackagedScriptPreparations + "|EngineThread|" + published.WorkerThreadId + "|PaintSource|Snapshot\n"); } } } Power.Halt(); } } private static long MonotonicMilliseconds() => (long)(Stopwatch.GetTimestamp() / (double)Stopwatch.Frequency * 1000); private void DispatchPointer(DesktopSession session,NativePointerReport report) { int x = display!.ToLayout(report.X), y = display.ToLayout(report.Y); pointerFrameProbe.ObserveConsumed(report.Sequence, report.TimestampTicks, Stopwatch.GetTimestamp(), x, y); bool released = lastPointerReportLeft && !report.LeftButton; // Button transitions are enough for click evidence. Per-wheel serial // formatting at high input rates would distort the measured rendering. if (report.LeftButton != lastPointerReportLeft) { lastPointerReportLeft = report.LeftButton; WriteDiagnostic("XFE_NATIVE_POINTER|X|" + x + "|Y|" + y + "|Left|" + (report.LeftButton ? 1 : 0) + "|Wheel|" + report.Wheel + "|Ticks|" + report.TimestampTicks + "\n"); } session.Pointer(x,y,report.LeftButton,report.DesktopWheel,(long)(report.TimestampTicks/(double)Stopwatch.Frequency*1000)); // A complete down/move/up can be drained in one UI iteration. The // MouseManager snapshot taken before that drain may already be up, // so publish final bounds from the actual release transition. if (released) ReportWindowState(session); } private void ReportBasicEditorState(DesktopWindow window) { const int limit = EditorReadbackTracker.MaximumPrefixCharacters; if (!basicEditorReadback.TryUpdate(window.Id, window.Location, window.Content, out string source)) return; WriteDiagnostic("XFE_BASIC_EDITOR_VALUE_BEGIN\nWindow|" + window.Id + "|Path|" + window.Location + "|SourceCharacters|" + window.Content.Length + "|Truncated|" + (window.Content.Length > limit ? 1 : 0) + "\n" + source + "\nXFE_BASIC_EDITOR_VALUE_END\n"); } private void ReportBrowserState(DesktopWindow window) { long now = MonotonicMilliseconds(); var visiblePage = VisiblePage(window); // Background editors publish immutable diagnostics. Never unwrap their // engine or ask a worker-owned BrowserService to acquire its page gate. var background = visiblePage as IBackgroundEditorSession; var published = background?.Diagnostics; string? inputTrace = visiblePage is BrowserService traced ? traced.LastInputTrace : published?.LastInputTrace; if (inputTrace is not null && inputTrace != lastBrowserInput) { lastBrowserInput = inputTrace; WriteDiagnostic("XFE_BROWSER_INPUT|" + lastBrowserInput + "\n"); } if (visiblePage is BrowserService documentBrowser && now - lastBrowserProofReport >= 500 && (lastBrowserProofWindow != window.Id || lastBrowserProofRevision != documentBrowser.Revision)) { lastBrowserProofWindow = window.Id; lastBrowserProofRevision = documentBrowser.Revision; lastBrowserProofReport = now; var documentProof = documentBrowser.ReadWebsiteDocumentProof(); if (documentProof != "{}") WriteDiagnostic("XFE_WEBSITE_DOCUMENT_PROOF_BEGIN\n" + documentProof + "\nXFE_WEBSITE_DOCUMENT_PROOF_END\n"); if (Uri.TryCreate(documentBrowser.CurrentPage.Address, UriKind.Absolute, out var proofUri) && BrowserService.IsMonacoAddress(proofUri)) { // Background tokenization can change span classes without changing // textContent. Read real view state after each changed revision. var colorProof = documentBrowser.ReadMonacoProof(); if (colorProof != "{}" && colorProof != lastMonacoProof) { lastMonacoProof = colorProof; WriteDiagnostic("XFE_MONACO_CSHARP_PROOF_BEGIN\n" + colorProof + "\nXFE_MONACO_CSHARP_PROOF_END\n"); } } } else if (background is not null && published is not null && now - lastBrowserProofReport >= 500 && (lastBrowserProofWindow != window.Id || lastBrowserProofRevision != background.Revision)) { lastBrowserProofWindow = window.Id; lastBrowserProofRevision = background.Revision; lastBrowserProofReport = now; string colorProof = published.MonacoProof; if (colorProof != "{}" && colorProof != lastMonacoProof) { lastMonacoProof = colorProof; WriteDiagnostic("XFE_MONACO_CSHARP_PROOF_BEGIN\n" + colorProof + "\nXFE_MONACO_CSHARP_PROOF_END\n"); } } if (now - lastBrowserStateReport < 200) return; lastBrowserStateReport = now; string content = window.IsMarkdown && window.MarkdownView != MarkdownViewMode.Edit && visiblePage is not null ? visiblePage.CurrentPage.Text : window.Content; var body = content.Length <= 4096 ? content : content[..4096]; string state = window.Id + "|" + window.Location + "\n" + body; if (state == lastBrowserState) return; lastBrowserState = state; WriteDiagnostic("XFE_BROWSER_STATE_BEGIN\n" + state + "\nXFE_BROWSER_STATE_END\n"); if (background is not null && background.ReadEditorText() is not null || visiblePage is BrowserService browser && Uri.TryCreate(browser.CurrentPage.Address, UriKind.Absolute, out var browserUri) && BrowserService.IsMonacoAddress(browserUri) && (window.Application == DesktopApplication.Editor || body.Contains("Official Monaco 0.52.2 - ready", StringComparison.Ordinal) || body.Contains("Monaco - edited", StringComparison.Ordinal) || body.Contains("Monaco C# - website grammar and palette", StringComparison.Ordinal))) { var value = visiblePage!.ReadEditorText() ?? "Editor unavailable"; WriteDiagnostic("XFE_MONACO_VALUE_BEGIN\n" + value + "\nXFE_MONACO_VALUE_END\n"); } } private static IInteractiveBrowserSession? VisiblePage(DesktopWindow window) => window.IsMarkdown && window.MarkdownView == MarkdownViewMode.Preview ? window.PreviewSession : window.BrowserSession; private void ReportChromeFrame(DesktopSession session, long now) { if (now - lastChromeFrameReport < Stopwatch.Frequency / 25) return; var active = session.ActiveWindow; if (active is null) return; var chrome = active.ChromeAnimation; string state = "XFE_CHROME_FRAME|" + active.Id + "|Min|" + (int)Math.Round(chrome.MinimizeProgress * 1000) + "|Close|" + (int)Math.Round(chrome.CloseProgress * 1000) + "|Title|" + (int)Math.Round(chrome.TitleHintProgress * 1000) + "|Resize|" + (int)Math.Round(chrome.ResizeProgress * 1000); if (state == lastChromeFrame) return; lastChromeFrame = state; lastChromeFrameReport = now; WriteDiagnostic(state + "\n"); } private void ReportWindowState(DesktopSession session) { string report = "XFE_DESKTOP_FLAGS|" + (session.IsStartMenuOpen ? 1 : 0) + "|" + (session.IsWindowSwitching ? 1 : 0) + "|Active|" + (session.ActiveWindow?.Id ?? 0) + "\n" + "XFE_DESKTOP_APPEARANCE|" + session.Theme.Mode + "|" + session.Theme.Accent.ToString("X6") + "|Persistent|" + (session.IsAppearancePersistent ? 1 : 0) + "\n"; foreach (var window in session.Windows) { var b = window.Bounds; report += "XFE_WINDOW_STATE|" + window.Id + "|" + window.Application + "|" + b.X + "|" + b.Y + "|" + b.Width + "|" + b.Height + "|" + (window.IsMinimized ? 1 : 0) + "|" + (window.IsMaximized ? 1 : 0) + "|" + (window.IsSnapped ? 1 : 0) + "\n"; } if (report == lastWindowState) return; lastWindowState = report; WriteDiagnostic(report); } private void RunConsoleDemo() { var buffer = new TerminalBuffer(90, 18); var writer = new TerminalTextWriter(buffer); ConsoleDemoScenario.Run(writer); ConsoleDemoScenario.RunXfeConsoleApi(writer); writer.Complete(); demonstration = writer.Snapshot(); if (!buffer.GetText().Contains(ConsoleDemoScenario.SuccessMarker, StringComparison.Ordinal)) throw new InvalidOperationException("The guest console application did not complete."); if (!buffer.GetText().Contains("XFEConsole API: Real NuGet 2.6.0", StringComparison.Ordinal)) throw new InvalidOperationException("The real XFEConsole API did not write to the guest terminal."); var rgb = buffer.GetCell(0, 1).Style.Foreground; if (rgb != TerminalColor.ThemeForeground) throw new InvalidOperationException("The guest ANSI true color output was not preserved."); ConsoleDemoScenario.RunSystemConsoleColors(); var previousForeground = global::System.Console.ForegroundColor; global::System.Console.ForegroundColor = ConsoleColor.Cyan; if (global::System.Console.ForegroundColor != ConsoleColor.Cyan) throw new InvalidOperationException("The guest Console color PAL did not preserve its state."); global::System.Console.ForegroundColor = previousForeground; desktop?.SetTerminalSnapshot(demonstration); WriteDiagnostic("XFE_CSHARP_CONSOLE_DEMO_OK\nXFE_CSHARP_ANSI_RGB_OK\nXFE_CSHARP_CONSOLE_PAL_COLOR_OK\nXFE_CSHARP_XFECONSOLE_API_OK\n"); } private void RunManagedApplication(string path) { try { RunManagedApplicationCore(path); } catch (Exception error) when (error is not OutOfMemoryException and not StackOverflowException) { var buffer = new TerminalBuffer(90, 18); buffer.Write("The program cannot run in this compatibility profile.\r\n" + error.Message); desktop?.SetTerminalSnapshot(buffer.Snapshot()); WriteDiagnostic("XFE_MANAGED_APP_REJECTED\n"); } } private void RunManagedApplicationCore(string path, bool verifyDemonstration = false) { var bytes = (workspace ?? throw new InvalidOperationException("The workspace is not initialized.")).ReadBytes(path); var buffer = new TerminalBuffer(90, 18); var writer = new TerminalTextWriter(buffer); var result = new ManagedApplicationRunner().Execute(bytes, new TerminalManagedConsole(writer)); writer.Complete(); bool demonstrationSucceeded = result.ExitCode == 0 && buffer.GetText().Contains("XFE_MANAGED_APP_OK", StringComparison.Ordinal) && buffer.GetText().Contains("XFE_MANAGED_XFECONSOLE_OK", StringComparison.Ordinal) && buffer.GetCell(0, 1).Style.Foreground == TerminalColor.ThemeForeground; if (verifyDemonstration && !demonstrationSucceeded) throw new InvalidOperationException("The independent C# example assembly did not complete its console/ANSI scenario."); desktop?.SetTerminalSnapshot(buffer.Snapshot()); if (demonstrationSucceeded) WriteDiagnostic("XFE_MANAGED_APP_OK\nXFE_MANAGED_XFECONSOLE_OK\nXFE_MANAGED_ANSI_RGB_OK\n"); WriteDiagnostic("XFE_MANAGED_APPLICATION_EXIT|" + result.AssemblyName + "|" + result.ExitCode + "\n"); WriteDiagnostic("XFE_MANAGED_IL_INSTRUCTIONS|" + result.Instructions + "|InteropCalls|" + result.InteropCalls + "\n"); } private static DesktopKey? MapKey(KeyEvent key) { if ((key.Modifiers & ConsoleModifiers.Control) != 0 && key.Key == ConsoleKeyEx.S) return DesktopKey.Save; if ((key.Modifiers & ConsoleModifiers.Control) != 0 && key.Key == ConsoleKeyEx.L) return DesktopKey.FocusAddress; return key.Key switch { ConsoleKeyEx.Enter => DesktopKey.Enter, ConsoleKeyEx.Backspace => DesktopKey.Backspace, ConsoleKeyEx.Delete => DesktopKey.Delete, ConsoleKeyEx.LeftArrow => DesktopKey.Left, ConsoleKeyEx.RightArrow => DesktopKey.Right, ConsoleKeyEx.UpArrow => DesktopKey.Up, ConsoleKeyEx.DownArrow => DesktopKey.Down, ConsoleKeyEx.Home => DesktopKey.Home, ConsoleKeyEx.End => DesktopKey.End, ConsoleKeyEx.Tab => DesktopKey.Tab, ConsoleKeyEx.Escape => DesktopKey.Escape, ConsoleKeyEx.F5 => DesktopKey.Run, _ => key.KeyChar >= ' ' ? DesktopKey.Character : null }; } }