pinokiod 3.41.0 → 3.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/kernel/api/browser/index.js +3 -1
  2. package/kernel/api/cloudflare/index.js +3 -3
  3. package/kernel/api/index.js +187 -51
  4. package/kernel/api/loading/index.js +15 -0
  5. package/kernel/api/process/index.js +7 -0
  6. package/kernel/api/shell/index.js +0 -2
  7. package/kernel/bin/browserless.js +22 -0
  8. package/kernel/bin/caddy.js +36 -4
  9. package/kernel/bin/index.js +4 -1
  10. package/kernel/bin/setup.js +38 -5
  11. package/kernel/connect/backend.js +110 -0
  12. package/kernel/connect/config.js +171 -0
  13. package/kernel/connect/index.js +18 -7
  14. package/kernel/connect/providers/huggingface/index.js +98 -0
  15. package/kernel/connect/providers/x/index.js +0 -1
  16. package/kernel/environment.js +91 -19
  17. package/kernel/git.js +46 -3
  18. package/kernel/index.js +119 -39
  19. package/kernel/peer.js +40 -5
  20. package/kernel/plugin.js +3 -2
  21. package/kernel/procs.js +27 -20
  22. package/kernel/prototype.js +30 -16
  23. package/kernel/router/common.js +1 -1
  24. package/kernel/router/connector.js +1 -3
  25. package/kernel/router/index.js +38 -4
  26. package/kernel/router/localhost_home_router.js +5 -1
  27. package/kernel/router/localhost_port_router.js +27 -1
  28. package/kernel/router/localhost_static_router.js +93 -0
  29. package/kernel/router/localhost_variable_router.js +14 -9
  30. package/kernel/router/peer_peer_router.js +3 -0
  31. package/kernel/router/peer_static_router.js +43 -0
  32. package/kernel/router/peer_variable_router.js +15 -14
  33. package/kernel/router/processor.js +26 -1
  34. package/kernel/router/rewriter.js +59 -0
  35. package/kernel/scripts/git/commit +11 -1
  36. package/kernel/shell.js +8 -3
  37. package/kernel/util.js +65 -6
  38. package/package.json +2 -1
  39. package/server/index.js +1037 -964
  40. package/server/public/common.js +382 -1
  41. package/server/public/fscreator.js +0 -1
  42. package/server/public/loading.js +17 -0
  43. package/server/public/notifyinput.js +0 -1
  44. package/server/public/opener.js +4 -2
  45. package/server/public/style.css +310 -11
  46. package/server/socket.js +7 -1
  47. package/server/views/app.ejs +1747 -351
  48. package/server/views/columns.ejs +338 -0
  49. package/server/views/connect/huggingface.ejs +353 -0
  50. package/server/views/connect/index.ejs +410 -0
  51. package/server/views/connect/x.ejs +43 -9
  52. package/server/views/connect.ejs +709 -49
  53. package/server/views/container.ejs +357 -0
  54. package/server/views/d.ejs +251 -62
  55. package/server/views/download.ejs +54 -10
  56. package/server/views/editor.ejs +11 -0
  57. package/server/views/explore.ejs +40 -15
  58. package/server/views/file_explorer.ejs +25 -246
  59. package/server/views/form.ejs +44 -1
  60. package/server/views/frame.ejs +39 -1
  61. package/server/views/github.ejs +48 -11
  62. package/server/views/help.ejs +48 -7
  63. package/server/views/index.ejs +119 -58
  64. package/server/views/index2.ejs +3 -4
  65. package/server/views/init/index.ejs +651 -197
  66. package/server/views/install.ejs +1 -1
  67. package/server/views/mini.ejs +47 -18
  68. package/server/views/net.ejs +199 -67
  69. package/server/views/network.ejs +220 -94
  70. package/server/views/network2.ejs +3 -4
  71. package/server/views/old_network.ejs +3 -3
  72. package/server/views/prototype/index.ejs +48 -11
  73. package/server/views/review.ejs +1005 -0
  74. package/server/views/rows.ejs +341 -0
  75. package/server/views/screenshots.ejs +1020 -0
  76. package/server/views/settings.ejs +160 -23
  77. package/server/views/setup.ejs +49 -7
  78. package/server/views/setup_home.ejs +43 -10
  79. package/server/views/shell.ejs +7 -1
  80. package/server/views/start.ejs +14 -9
  81. package/server/views/terminal.ejs +13 -2
  82. package/server/views/tools.ejs +1015 -0
@@ -156,10 +156,7 @@ a.ln:hover {
156
156
  color: red !important;
157
157
  }
158
158
  .line.align-top h3 {
159
- /*
160
159
  align-items: flex-start;
161
- */
162
- align-items: center;
163
160
  }
164
161
  .line a:hover {
165
162
  color: red;
@@ -177,7 +174,6 @@ a.ln:hover {
177
174
  .header-label {
178
175
  padding: 0;
179
176
  font-size: 30px;
180
- font-weight: lighter;
181
177
  /*
182
178
  text-align: center;
183
179
  */
@@ -243,7 +239,7 @@ a.ln:hover {
243
239
  margin-right: 10px;
244
240
  padding-top: 5px;
245
241
  padding-bottom: 0 !important;
246
- text-decoration: underline;
242
+ text-decoration: none;
247
243
  color: royalblue;
248
244
  cursor: pointer;
249
245
  }
@@ -285,16 +281,11 @@ td:first-child, th:first-child {
285
281
 
286
282
  body.dark .config {
287
283
  color: white;
288
- background: rgba(255,255,255,0.04);
289
284
  }
290
285
  .config {
291
- /*
292
- background: rgba(0,0,0,0.9);
293
- */
294
286
  color: black;
295
- text-align: left;
296
- padding: 40px;
297
- background: rgba(0,0,0,0.04);
287
+ padding: 30px;
288
+ margin: 10px 0;
298
289
  }
299
290
  .config-header {
300
291
  }
@@ -309,6 +300,8 @@ body.dark .config .btn {
309
300
  font-size: 16px;
310
301
  font-weight: bold;
311
302
  width: 100px;
303
+ /*
304
+ */
312
305
  background: royalblue;
313
306
  flex-shrink: 0;
314
307
  }
@@ -325,7 +318,9 @@ body.dark .config-row input[type=text] {
325
318
  background: white;
326
319
  }
327
320
  .config-row input[type=text] {
328
- padding: 5px 10px;
321
+ padding: 5px 15px;
322
+ border-top-left-radius: 30px;
323
+ border-bottom-left-radius: 30px;
329
324
  }
330
325
  .app-btns .btn {
331
326
  border-radius: 4px;
@@ -363,9 +358,11 @@ body.dark .config-row input[type=text] {
363
358
  background-color: #ccc;
364
359
  -webkit-transition: .4s;
365
360
  transition: .4s;
361
+ border-radius: 50px;
366
362
  }
367
363
 
368
364
  .slider:before {
365
+ border-radius: 50px;
369
366
  position: absolute;
370
367
  content: "";
371
368
  height: 30px;
@@ -380,6 +377,7 @@ body.dark .config-row input[type=text] {
380
377
  input:checked + .slider {
381
378
  /*
382
379
  background-color: #2196F3;
380
+ background: black;
383
381
  */
384
382
  background-color: royalblue;
385
383
  }
@@ -453,14 +451,6 @@ body.dark .desc {
453
451
  background: none !important;
454
452
  padding: 0 !important;
455
453
  }
456
- .grid-1, .grid-2, .grid-3 {
457
- background: rgba(0,0,0,0.04);
458
- margin-top: 5px;
459
- }
460
- body.dark .grid-1, body.dark .grid-2, body.dark .grid-3 {
461
- background: rgba(255,255,255,0.03);
462
- margin-top: 5px;
463
- }
464
454
  main {
465
455
  display: flex;
466
456
  }
@@ -468,7 +458,6 @@ aside {
468
458
  width: 200px;
469
459
  display: block;
470
460
  flex-shrink: 0;
471
- border-right: 1px solid rgba(0,0,0,0.04);
472
461
  }
473
462
  aside .tab i {
474
463
  width: 20px;
@@ -482,7 +471,9 @@ body.dark aside .tab:hover, aside .tab:hover {
482
471
  opacity: 1;
483
472
  }
484
473
  aside .tab {
485
- display: block;
474
+ display: flex;
475
+ align-items: center;
476
+ gap: 5px;
486
477
  color: black;
487
478
  text-decoration: none;
488
479
  padding: 10px;
@@ -687,6 +678,7 @@ body.dark .context-menu-wrapper {
687
678
  flex-shrink: 0;
688
679
  }
689
680
  body.dark .section-header {
681
+ background: rgba(255,255,255,0.04);
690
682
  /*
691
683
  border-bottom: 1px solid rgba(255,255,255,0.07);
692
684
  */
@@ -697,17 +689,18 @@ body.dark .section-header {
697
689
  */
698
690
  font-weight: normal;
699
691
  font-size: 14px;
700
- padding: 15px 5px;
692
+ padding: 30px 5px;
701
693
  /*
702
694
  margin: 0 0 15px;
703
695
  */
696
+ background: rgba(0,0,0,0.04);
704
697
  }
705
698
  .section-header h2 {
706
699
  font-size: 20px;
707
700
  font-weight: lighter;
708
701
  }
709
702
  .section-header .section {
710
- padding: 0;
703
+ box-sizing: border-box;
711
704
  }
712
705
  .section-header .section div {
713
706
  font-weight: normal;
@@ -724,6 +717,9 @@ body.dark .section-header {
724
717
  min-width: 0;
725
718
  word-wrap: break-word;
726
719
  }
720
+ body.dark .btn {
721
+ background: rgba(255,255,255,0.05);
722
+ }
727
723
  /*
728
724
  body.dark .btn {
729
725
  background: rgba(255,255,255,0.05) !important;
@@ -780,15 +776,20 @@ body.dark .open-menu, body.dark .browse {
780
776
  }
781
777
  .section {
782
778
  display: block;
779
+ min-width: 0;
783
780
  }
784
- .section h2 {
785
- margin: 0;
781
+ .line {
782
+ padding: 10px;
786
783
  }
787
784
  .line.align-top h3 .col .btn {
788
785
  box-sizing: border-box;
789
786
  margin-top: 5px;
790
787
  width: 100%;
791
788
  }
789
+ .c {
790
+ flex-grow: 1;
791
+ min-width: 0;
792
+ }
792
793
  .desc {
793
794
  font-size: 14px;
794
795
  color: rgba(0, 0, 0, 0.7);
@@ -806,22 +807,31 @@ body.dark .open-menu, body.dark .browse {
806
807
  display: grid;
807
808
  grid-template-columns: repeat(3, 1fr); /* Three equal columns */
808
809
  gap: 1rem; /* Optional spacing between columns */
809
- padding: 10px;
810
+ padding: 5px 0;
810
811
  }
811
812
  .section-header .grid-1, .section-header .grid-2, .section-header .grid-3 {
812
813
  background: none !important;
813
814
  padding: 0 !important;
814
815
  }
815
- .grid-1, .grid-2, .grid-3 {
816
- background: rgba(0,0,0,0.04);
817
- margin-top: 5px;
816
+ .section-header .section {
817
+ text-align: center;
818
+ padding: 0 10px;
818
819
  }
819
- body.dark .grid-1, body.dark .grid-2, body.dark .grid-3 {
820
- background: rgba(255,255,255,0.03);
821
- margin-top: 5px;
820
+ .section-header .section h2 {
821
+ margin: 0;
822
+ font-weight: bold;
823
+ text-align: center;
824
+ }
825
+ .section-header .section h2 i {
826
+ font-size: 30px;
827
+ width: 100%;
828
+ display: block;
829
+ text-align: center;
830
+ padding: 10px;
822
831
  }
823
832
  main {
824
833
  display: flex;
834
+ min-width: 0;
825
835
  }
826
836
  .help {
827
837
  padding:30px;
@@ -832,7 +842,6 @@ aside {
832
842
  width: 200px;
833
843
  display: block;
834
844
  flex-shrink: 0;
835
- border-right: 1px solid rgba(0,0,0,0.04);
836
845
  }
837
846
  aside .tab i {
838
847
  width: 20px;
@@ -846,7 +855,9 @@ body.dark aside .tab:hover, aside .tab:hover {
846
855
  opacity: 1;
847
856
  }
848
857
  aside .tab {
849
- display: block;
858
+ display: flex;
859
+ align-items: center;
860
+ gap: 5px;
850
861
  color: black;
851
862
  text-decoration: none;
852
863
  padding: 10px;
@@ -906,14 +917,28 @@ body.dark .net {
906
917
  justify-content: center;
907
918
  align-items: center;
908
919
  }
920
+ body.dark .troubleshoot {
921
+ color: rgba(255,255,255,0.5);
922
+ }
923
+ .troubleshoot {
924
+ color: rgba(0,0,0,0.5);
925
+ }
926
+ .network-name.expanded .btn {
927
+ border-top-right-radius: 30px;
928
+ border-bottom-right-radius: 30px;
929
+ border-top-left-radius: 0px;
930
+ border-bottom-left-radius: 0px;
931
+ }
909
932
  .network-name {
910
933
  display: flex;
911
934
  }
912
935
  .network-name .btn {
913
- border-radius: 0;
936
+ border-top-left-radius: 30px;
937
+ border-bottom-left-radius: 30px;
938
+ border-top-right-radius: 30px;
939
+ border-bottom-right-radius: 30px;
914
940
  }
915
941
  .network-name input[type=text] {
916
- border-radius: 0;
917
942
  border: none;
918
943
  background: rgba(0,0,0,0.1);
919
944
  }
@@ -928,6 +953,46 @@ body.dark .net {
928
953
  color: silver !important;
929
954
  }
930
955
 
956
+ @media only screen and (max-width: 800px) {
957
+ body {
958
+ display: flex !important;
959
+ flex-direction: row !important;
960
+ }
961
+ }
962
+ @media only screen and (max-width: 600px) {
963
+ aside {
964
+ width: unset;
965
+ flex-shrink: unset;
966
+ }
967
+ aside {
968
+ padding: 0 10px;
969
+ }
970
+ aside .tab i {
971
+ width: 100%;
972
+ }
973
+ aside .tab .caption {
974
+ display: none;
975
+ }
976
+ aside .tab {
977
+ margin: 0;
978
+ padding: 10px;
979
+ border-left: none;
980
+ }
981
+ aside .btn-tab {
982
+ flex-direction: column;
983
+ padding: 10px 0;
984
+ }
985
+ aside .btn-tab .btn {
986
+ display: flex;
987
+ justify-content: center;
988
+ }
989
+ aside .btn-tab .btn .caption {
990
+ display: none;
991
+ }
992
+ header .flexible {
993
+ min-width: unset;
994
+ }
995
+ }
931
996
 
932
997
  @media only screen and (max-width: 480px) {
933
998
  .btn2 {
@@ -941,6 +1006,8 @@ body.dark .net {
941
1006
  }
942
1007
  }
943
1008
  </style>
1009
+ <script src="/popper.min.js"></script>
1010
+ <script src="/tippy-bundle.umd.min.js"></script>
944
1011
  <script src="/hotkeys.min.js"></script>
945
1012
  <script src="/sweetalert2.js"></script>
946
1013
  <script src="/common.js"></script>
@@ -951,26 +1018,49 @@ body.dark .net {
951
1018
  <header class='navheader grabbable'>
952
1019
  <h1>
953
1020
  <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
954
- <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div><div>Prev</div></button>
955
- <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div><div>Next</div></button>
956
- <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
957
- <div class='url-bar'>
958
- <% if (current_urls.https) { %>
959
- <a class='https-url' target="_blank" href="<%=current_urls.https%>"><i class="fa-solid fa-square-arrow-up-right"></i> <%=current_urls.https%></a>
960
- <% } %>
961
- <% if (current_urls.http) { %>
962
- <a class='http-url' target="_blank" href="<%=current_urls.http%>"><i class="fa-solid fa-square-arrow-up-right"></i> <%=current_urls.http%></a>
963
- <% } %>
964
- </div>
1021
+ <button class='btn2' id='back' data-tippy-content="back"><div><i class="fa-solid fa-chevron-left"></i></div></button>
1022
+ <button class='btn2' id='forward' data-tippy-content="forward"><div><i class="fa-solid fa-chevron-right"></i></div></button>
1023
+ <button class='btn2' id='refresh-page' data-tippy-content="refresh"><div><i class="fa-solid fa-rotate-right"></i></div></button>
1024
+ <button class='btn2' id='screenshot' data-tippy-content="take a screenshot"><i class="fa-solid fa-camera"></i></button>
965
1025
  <div class='flexible'></div>
966
- <a href="/connect" class='btn2'><div><i class="fa-solid fa-circle-user"></i></div><div>Connect</div></a>
967
- <div class='nav-btns'>
968
- <a class='btn2' href="<%=portal%>" target="_blank"><div><i class="fa-solid fa-question"></i></div><div>Help</div></a>
969
- <button class='btn2' id='genlog'><div><i class="fa-solid fa-laptop-code"></i></div><div>Logs</div></button>
970
- <a id='downloadlogs' download class='hidden btn2' href="/pinokio/logs.zip"><div><i class="fa-solid fa-download"></i></div><div>Download logs</div></a>
971
- <a class='btn2' href="/?mode=settings"><div><i class="fa-solid fa-gear"></i></div><div>Settings</div></a>
972
- <button id='new-window' title='open a new window' class='btn2' data-agent="<%=agent%>"><div><i class="fa-solid fa-plus"></i></div><div>Window</div></button>
1026
+ <a class='btn2' href="/columns" data-tippy-content="split into 2 columns">
1027
+ <div><i class="fa-solid fa-table-columns"></i></div>
1028
+ </a>
1029
+ <a class='btn2' href="/rows" data-tippy-content="split into 2 rows">
1030
+ <div><i class="fa-solid fa-table-columns fa-rotate-270"></i></div>
1031
+ </a>
1032
+ <div class="dropdown-content" id="dropdown-content">
1033
+ <button class='btn2' id='clone-win' data-tippy-content="clone this window">
1034
+ <div><i class="fa-solid fa-clone"></i><div>clone this window</div></div>
1035
+ </button>
1036
+ <button id='new-window' data-tippy-content="open a new window" title='open a new window' class='btn2' data-agent="<%=agent%>">
1037
+ <div><i class="fa-solid fa-plus"></i><div>new window</div></div>
1038
+ </button>
973
1039
  </div>
1040
+ <!--
1041
+ <div class="dropdown btn2">
1042
+ <button class='btn2' id='window-management'>
1043
+ <div><i class="fa-regular fa-window-restore"></i></div>
1044
+ </button>
1045
+ <div class="dropdown-content" id="dropdown-content">
1046
+ <button class='btn2' id='clone-win' data-tippy-content="clone this window">
1047
+ <div><i class="fa-solid fa-clone"></i><div>clone this window</div></div>
1048
+ </button>
1049
+ <a class='btn2' href="/columns" data-tippy-content="split into 2 columns">
1050
+ <div><i class="fa-solid fa-table-columns"></i><div>split columns</div></div>
1051
+ </a>
1052
+ <a class='btn2' href="/rows" data-tippy-content="split into 2 rows">
1053
+ <div><i class="fa-solid fa-table-columns fa-rotate-270"></i><div>split rows</div></div>
1054
+ </a>
1055
+ <button id='new-window' data-tippy-content="open a new window" title='open a new window' class='btn2' data-agent="<%=agent%>">
1056
+ <div><i class="fa-solid fa-plus"></i><div>new window</div></div>
1057
+ </button>
1058
+ </div>
1059
+ </div>
1060
+ -->
1061
+ <button class='btn2 hidden' id='close-window' data-tippy-content='close this section'>
1062
+ <div><i class="fa-solid fa-xmark"></i></div>
1063
+ </button>
974
1064
  </h1>
975
1065
  </header>
976
1066
  <!--
@@ -983,23 +1073,6 @@ body.dark .net {
983
1073
  </form>
984
1074
  -->
985
1075
  <main>
986
- <aside>
987
- <div class='btn-tab'>
988
- <a href="/init" class='btn'><i class="fa-solid fa-plus"></i> Create</a>
989
- <a class='btn' id='explore' href="/?mode=explore"><i class="fa-solid fa-globe"></i> Discover</a>
990
- </div>
991
- <a href="/" class='tab'><i class='fas fa-laptop-code'></i> Local</a>
992
- <a href="/network" class='tab selected'><i class="fa-solid fa-wifi"></i> Network</a>
993
- <% if (list.length > 0) { %>
994
- <% let brands = { win32: "windows", darwin: "apple", linux: "Linux" } %>
995
- <% list.forEach(({ host, name, platform, processes }, index) => { %>
996
- <!--
997
- <a href="http://<%=host%>:42000" class='submenu tab' target="_blank"><i class="fa-brands fa-<%=brands[platform]%>"></i> <%=name%> (<%=current_host === host ? 'this machine' : host%>)</a>
998
- -->
999
- <a href="/net/<%=name%>" class='submenu tab'><i class="fa-brands fa-<%=brands[platform]%>"></i> <%=name%> (<%=current_host === host ? 'this machine' : host%>)</a>
1000
- <% }) %>
1001
- <% } %>
1002
- </aside>
1003
1076
  <div class='c'>
1004
1077
  <div class='container'>
1005
1078
  <div class='config'>
@@ -1029,7 +1102,7 @@ body.dark .net {
1029
1102
  <div id='advanced-label' class='link-label label'>Advanced</div>
1030
1103
  <div id='reset-label' class='btn'>Reset</div>
1031
1104
  -->
1032
- <div>
1105
+ <div class='troubleshoot'>
1033
1106
  Not working properly? <span id='reset-label' class='link-label label'>Try reinstalling the Network Module & Certificates</span>
1034
1107
  </div>
1035
1108
  </div>
@@ -1039,18 +1112,6 @@ body.dark .net {
1039
1112
  </div>
1040
1113
  </div>
1041
1114
  <div class='container'>
1042
- <div class="section-header">
1043
- <h3>
1044
- <div class="col">
1045
- <div class="grid-1">
1046
- <div class="section">
1047
- <h2>Servers running on this machine</h2>
1048
- <div>Pinokio automatically creates a proxy that makes all your local servers accessible from other machines on the same network.</div>
1049
- </div>
1050
- </div>
1051
- </div>
1052
- </h3>
1053
- </div>
1054
1115
  <div class='running-apps'>
1055
1116
  <div class='section-header'>
1056
1117
  <h3>
@@ -1058,20 +1119,20 @@ body.dark .net {
1058
1119
  <div class='col'>
1059
1120
  <div class='grid-3'>
1060
1121
  <div class='section'>
1061
- <h2><i class='fas fa-laptop-code'></i> Local</h2>
1062
- <div>These urls work on this machine only.</div>
1122
+ <h2><i class='fas fa-laptop-code'></i> This machine</h2>
1123
+ <div>Use these URLs on this machine.</div>
1063
1124
  </div>
1064
1125
  <div class='section'>
1065
- <h2><i class="fa-solid fa-wifi"></i> Network</h2><div>These urls work on any machine on the same local network.</div>
1126
+ <h2><i class="fa-solid fa-wifi"></i> Local network</h2><div>Use these URLs from other machines on the same local network.</div>
1066
1127
  </div>
1067
1128
  <div class='section'>
1068
- <h2><i class="fa-solid fa-podcast"></i> Peer</h2><div>These urls work on other pinokio peers on the same local network <a class='explain' data-type='peer'>How to start a peer</a></div>
1129
+ <h2><i class="fa-solid fa-podcast"></i> Local HTTPS network</h2><div>Use these URLs from other pinokio peers on the same local network <a class='explain' data-type='peer'>How to start a peer</a></div>
1069
1130
  </div>
1070
1131
  </div>
1071
1132
  </div>
1072
1133
  </h3>
1073
1134
  </div>
1074
- <% if (requirements_pending) { %>
1135
+ <% if (requirements_pending || peer_active && processes.length === 0) { %>
1075
1136
  <div class='loader'>
1076
1137
  <i class="fa-solid fa-circle-notch fa-spin"></i>
1077
1138
  </div>
@@ -1081,7 +1142,9 @@ body.dark .net {
1081
1142
  <h3>
1082
1143
  <div class='item-icon'>
1083
1144
  <% if (item.icon) { %>
1084
- <img src="<%=item.icon%>">
1145
+ <div class='placeholder-icon'>
1146
+ <img src="<%=item.icon%>">
1147
+ </div>
1085
1148
  <% } else { %>
1086
1149
  <div class='placeholder-icon'>
1087
1150
  <i class="fa-solid fa-database"></i>
@@ -1109,12 +1172,68 @@ body.dark .net {
1109
1172
  </div>
1110
1173
  </div>
1111
1174
  </div>
1112
- </div>
1113
- </h3>
1175
+ </h3>
1176
+ </div>
1177
+ <% }) %>
1178
+ <% static_routes.forEach((route, index) => { %>
1179
+ <div class='line align-top' data-index="<%=processes.length+index%>" data-name="<%=route.name%>" data-title="<%=route.name%>" data-description="<%=route.internal_router.join(' ')%>">
1180
+ <h3>
1181
+ <div class='item-icon'>
1182
+ <div class='placeholder-icon'>
1183
+ <i class="fa-solid fa-database"></i>
1184
+ </div>
1185
+ </div>
1186
+ <div class='col'>
1187
+ <div class='title'><i class="fa-solid fa-circle"></i><span><%=route.name%></span></div>
1188
+ <div class='grid-3'>
1189
+ <div class='section'>
1190
+ <% route.internal_router.forEach((domain) => { %>
1191
+ <% if (domain.endsWith(".localhost")) { %>
1192
+ <a class='net' target="_blank" href="https://<%=domain%>">https://<%=domain%></a>
1193
+ <% } else { %>
1194
+ <a class='net' target="_blank" href="http://<%=domain%>">http://<%=domain%></a>
1195
+ <% } %>
1196
+ <% }) %>
1197
+ </div>
1198
+ <div class='section'>
1199
+ <% if (route.external_ip) { %>
1200
+ <a class='net' target="_blank" href="http://<%=route.external_ip%>">http://<%=route.external_ip%></a>
1201
+ <% } %>
1202
+ </div>
1203
+ <div class='section'>
1204
+ <% route.external_router.forEach((domain) => { %>
1205
+ <a class='net' target="_blank" href="https://<%=domain%>">https://<%=domain%></a>
1206
+ <% }) %>
1207
+ </div>
1208
+ </div>
1209
+ </div>
1210
+ </h3>
1211
+ </div>
1114
1212
  <% }) %>
1115
1213
  </div>
1116
1214
  </div>
1117
1215
  </div>
1216
+ <aside>
1217
+ <div class='btn-tab'>
1218
+ <a href="/init" class='btn'><i class="fa-solid fa-plus"></i><div class='caption'>Create</div></a>
1219
+ <a class='btn' id='explore' href="/?mode=explore"><i class="fa-solid fa-globe"></i><div class='caption'>Discover</div></a>
1220
+ </div>
1221
+ <a href="/" class='tab'><i class='fas fa-laptop-code'></i><div class='caption'>This machine</div></a>
1222
+ <a href="/network" class='tab selected'><i class="fa-solid fa-wifi"></i><div class='caption'>Local network</div></a>
1223
+ <% if (list.length > 0) { %>
1224
+ <% let brands = { win32: "windows", darwin: "apple", linux: "Linux" } %>
1225
+ <% list.forEach(({ host, name, platform, processes }, index) => { %>
1226
+ <a href="/net/<%=name%>" class='submenu tab'><i class="fa-brands fa-<%=brands[platform]%>"></i><div class='caption'><%=name%> (<%=current_host === host ? 'this machine' : host%>)</div></a>
1227
+ <% }) %>
1228
+ <% } %>
1229
+ <a href="/connect" class='tab'><i class="fa-solid fa-plug"></i><div class='caption'>Login</div></a>
1230
+ <a class='tab' href="<%=portal%>" target="_blank"><i class="fa-solid fa-question"></i><div class='caption'>Help</div></a>
1231
+ <a class='tab' id='genlog'><i class="fa-solid fa-laptop-code"></i><div class='caption'>Logs</div></a>
1232
+ <a id='downloadlogs' download class='hidden btn2' href="/pinokio/logs.zip"><i class="fa-solid fa-download"></i><div class='caption'>Download logs</div></a>
1233
+ <a class='tab' href="/screenshots"><i class="fa-solid fa-camera"></i><div class='caption'>Screenshots</div></a>
1234
+ <a class='tab' href="/tools"><i class="fa-solid fa-toolbox"></i><div class='caption'>Installed Tools</div></a>
1235
+ <a class='tab' href="/?mode=settings"><i class="fa-solid fa-gear"></i><div class='caption'>Settings</div></a>
1236
+ </aside>
1118
1237
  </main>
1119
1238
  <script>
1120
1239
  document.querySelector("#reset-label").addEventListener("click", async (e) => {
@@ -1181,17 +1300,23 @@ document.querySelector("#advanced-label").addEventListener("click", (e) => {
1181
1300
  if (document.querySelector("#active").checked) {
1182
1301
  console.log("checked")
1183
1302
  document.querySelector("#network_name").classList.remove("hidden")
1303
+ document.querySelector(".network-name").classList.add("expanded")
1184
1304
  } else {
1185
1305
  console.log("not checked")
1186
1306
  document.querySelector("#network_name").classList.add("hidden")
1307
+ document.querySelector(".network-name").classList.remove("expanded")
1187
1308
  }
1188
1309
  document.querySelector("#active").addEventListener("change", (e)=> {
1189
1310
  console.log(e.target.checked)
1190
1311
  if (e.target.checked) {
1191
1312
  document.querySelector("#network_name").classList.remove("hidden")
1313
+ document.querySelector(".network-name").classList.add("expanded")
1314
+ document.querySelector("#name").classList.remove("hidden")
1192
1315
  document.querySelector("#active-label").innerHTML = "On"
1193
1316
  } else {
1194
1317
  document.querySelector("#network_name").classList.add("hidden")
1318
+ document.querySelector(".network-name").classList.remove("expanded")
1319
+ document.querySelector("#name").classList.add("hidden")
1195
1320
  document.querySelector("#active-label").innerHTML = "Off"
1196
1321
  }
1197
1322
  })
@@ -1280,6 +1405,7 @@ document.querySelector("main").addEventListener("click", async (e) => {
1280
1405
  return res.json()
1281
1406
  })
1282
1407
  if (r.success) {
1408
+ document.querySelector("#network_name").classList.add("hidden")
1283
1409
  //alert("Successfully updated the pinokio home to " + val)
1284
1410
  document.querySelector(".loading").classList.remove("hidden")
1285
1411
  document.querySelector(".save").classList.add("hidden")
@@ -419,11 +419,10 @@ table h3 {
419
419
  <header class='navheader grabbable'>
420
420
  <h1>
421
421
  <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
422
- <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div><div>Prev</div></button>
423
- <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div><div>Next</div></button>
424
- <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
422
+ <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div></button>
423
+ <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div></button>
424
+ <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div></button>
425
425
  <div class='flexible'></div>
426
- <a href="/connect" class='btn2'><div><i class="fa-solid fa-circle-user"></i></div><div>Connect</div></a>
427
426
  <div class='nav-btns'>
428
427
  <a class='btn2' href="<%=portal%>" target="_blank"><div><i class="fa-solid fa-question"></i></div><div>Help</div></a>
429
428
  <button class='btn2' id='genlog'><div><i class="fa-solid fa-laptop-code"></i></div><div>Logs</div></button>
@@ -402,9 +402,9 @@ input:checked + .slider:before {
402
402
  <header class='navheader grabbable'>
403
403
  <h1>
404
404
  <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
405
- <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div><div>Prev</div></button>
406
- <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div><div>Next</div></button>
407
- <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
405
+ <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div></button>
406
+ <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div></button>
407
+ <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div></button>
408
408
  <a class='btn2 create-new' id='create-new-folder'><div><i class="fa-solid fa-folder-plus"></i></div><div>Create</div></a>
409
409
  <a href="/connect" class='btn2'><div><i class="fa-solid fa-circle-user"></i></div><div>Connect</div></a>
410
410
  <div class='flexible'></div>