You can dump the entire frame tree in the REPL:

(:dump-subtree (get-in jwno/context [:window-manager :root]))

And the output would look like this:

Root Container
  Virtual Desktop (name="Desktop 1", id="{D76896BE-1324-C415-9A47-4D3F09DECEF2}")
    Monitor (primary=true,dir=horizontal,work-area={l:0,t:0,r:1920,b:1080},dpi=(96 96),device="\\\\.\\DISPLAY1")
      Frame (dir=none,rect={l:10,t:10,r:960,b:1070})
        Window (hwnd=<pointer 0x0000000705FE>)
          Name: D:\w\janet_code\jwno\build\jwno.exe
          Class: ConsoleWindowClass
          Exe: D:\w\janet_code\jwno\build\jwno.exe
          Rect: {l:13,t:20,r:957,b:1067}
          Extended Frame Bounds: {l:20,t:20,r:950,b:1060}
          Virtual Desktop ID: {D76896BE-1324-C415-9A47-4D3F09DECEF2}
      Frame (dir=none,rect={l:960,t:10,r:1910,b:1070})
        Window (hwnd=<pointer 0x00000010084C>)
          Name: frame-tree.mdz
          Class: Emacs
          Exe: D:\pf\emacs\bin\emacs.exe
          Rect: {l:963,t:20,r:1907,b:1067}
          Extended Frame Bounds: {l:970,t:20,r:1900,b:1060}
          Virtual Desktop ID: {D76896BE-1324-C415-9A47-4D3F09DECEF2}
    Monitor (primary=false,dir=none,work-area={l:-1440,t:0,r:0,b:1080},dpi=(144 144),device="\\\\.\\DISPLAY24")
      Window (hwnd=<pointer 0x00000008028C>)
        Name: pwsh.exe
        Class: CASCADIA_HOSTING_WINDOW_CLASS
        Exe: C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.21.2911.0_x64__8wekyb3d8bbwe\WindowsTerminal.exe
        Rect: {l:-1420,t:30,r:-20,b:1060}
        Extended Frame Bounds: {l:-1410,t:30,r:-30,b:1050}
        Virtual Desktop ID: {D76896BE-1324-C415-9A47-4D3F09DECEF2}
  Virtual Desktop (name="Desktop 3", id="{44137DB3-CE47-54F0-B204-5BA4FE6C91F2}")
    Monitor (primary=true,dir=none,work-area={l:0,t:0,r:1920,b:1080},dpi=(96 96),device="\\\\.\\DISPLAY1")
    Monitor (primary=false,dir=none,work-area={l:-1440,t:0,r:0,b:1080},dpi=(144 144),device="\\\\.\\DISPLAY24")
  ...

Here indentations mark different levels in the frame tree where an object comes from. The info presented is a little dense, but most of the field names are self-explanatory. You can just play with the windows/frames, and see how their properties change.

Note that Jwno populates the frame tree lazily, so your virtual desktops may not show up in the printed info, if you never opened any window in that virtual desktop since Jwno started running.

These printed info is mostly used for troubleshooting. You should traverse the frame tree directly if you want to access its nodes programmatically.