pinokiod 3.180.0 → 3.182.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 (51) hide show
  1. package/kernel/favicon.js +91 -34
  2. package/kernel/peer.js +73 -0
  3. package/kernel/util.js +28 -4
  4. package/package.json +1 -1
  5. package/server/index.js +237 -35
  6. package/server/public/common.js +677 -240
  7. package/server/public/files-app/app.css +64 -0
  8. package/server/public/files-app/app.js +87 -0
  9. package/server/public/install.js +8 -1
  10. package/server/public/layout.js +124 -0
  11. package/server/public/nav.js +227 -64
  12. package/server/public/sound/beep.mp3 +0 -0
  13. package/server/public/sound/bell.mp3 +0 -0
  14. package/server/public/sound/bright-ring.mp3 +0 -0
  15. package/server/public/sound/clap.mp3 +0 -0
  16. package/server/public/sound/deep-ring.mp3 +0 -0
  17. package/server/public/sound/gasp.mp3 +0 -0
  18. package/server/public/sound/hehe.mp3 +0 -0
  19. package/server/public/sound/levelup.mp3 +0 -0
  20. package/server/public/sound/light-pop.mp3 +0 -0
  21. package/server/public/sound/light-ring.mp3 +0 -0
  22. package/server/public/sound/meow.mp3 +0 -0
  23. package/server/public/sound/piano.mp3 +0 -0
  24. package/server/public/sound/pop.mp3 +0 -0
  25. package/server/public/sound/uhoh.mp3 +0 -0
  26. package/server/public/sound/whistle.mp3 +0 -0
  27. package/server/public/style.css +195 -4
  28. package/server/public/tab-idle-notifier.js +700 -4
  29. package/server/public/terminal-settings.js +1131 -0
  30. package/server/public/urldropdown.css +28 -1
  31. package/server/socket.js +71 -4
  32. package/server/views/{terminals.ejs → agents.ejs} +108 -32
  33. package/server/views/app.ejs +321 -104
  34. package/server/views/bootstrap.ejs +8 -0
  35. package/server/views/connect.ejs +10 -1
  36. package/server/views/d.ejs +172 -18
  37. package/server/views/editor.ejs +8 -0
  38. package/server/views/file_browser.ejs +4 -0
  39. package/server/views/index.ejs +10 -1
  40. package/server/views/init/index.ejs +18 -3
  41. package/server/views/install.ejs +8 -0
  42. package/server/views/layout.ejs +2 -0
  43. package/server/views/net.ejs +10 -1
  44. package/server/views/network.ejs +10 -1
  45. package/server/views/pro.ejs +8 -0
  46. package/server/views/prototype/index.ejs +8 -0
  47. package/server/views/screenshots.ejs +10 -2
  48. package/server/views/settings.ejs +10 -2
  49. package/server/views/shell.ejs +8 -0
  50. package/server/views/terminal.ejs +8 -0
  51. package/server/views/tools.ejs +10 -2
@@ -86,6 +86,7 @@ body {
86
86
  <script src="/xterm-theme.js"></script>
87
87
  <script src="/sweetalert2.js"></script>
88
88
  <script src="/Socket.js"></script>
89
+ <script src="/terminal-settings.js"></script>
89
90
  <script>
90
91
  function isASCII(str) {
91
92
  for (let i = 0; i < str.length; i++) {
@@ -145,7 +146,14 @@ document.addEventListener("DOMContentLoaded", () => {
145
146
  if (res && res.config) {
146
147
  config = res.config
147
148
  }
149
+ const baseConfig = Object.assign({}, config)
150
+ if (window.PinokioTerminalSettings && typeof window.PinokioTerminalSettings.applyToConfig === 'function') {
151
+ config = window.PinokioTerminalSettings.applyToConfig(config)
152
+ }
148
153
  const term = new Terminal(config)
154
+ if (window.PinokioTerminalSettings && typeof window.PinokioTerminalSettings.register === 'function') {
155
+ window.PinokioTerminalSettings.register(term, { baseConfig })
156
+ }
149
157
  const fitAddon = new FitAddon.FitAddon();
150
158
  term.loadAddon(fitAddon);
151
159
  term.loadAddon(new WebLinksAddon.WebLinksAddon());
@@ -922,8 +922,17 @@ document.addEventListener('DOMContentLoaded', function() {
922
922
  <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>
923
923
  <a class='tab' href="/screenshots"><i class="fa-solid fa-camera"></i><div class='caption'>Screenshots</div></a>
924
924
  <a class='tab' href="/tools"><i class="fa-solid fa-toolbox"></i><div class='caption'>Installed Tools</div></a>
925
- <a class='tab' href="/terminals"><i class="fa-solid fa-desktop"></i><div class='caption'>Terminals</div></a>
925
+ <a class='tab' href="/agents"><i class="fa-solid fa-robot"></i><div class='caption'>Agents</div></a>
926
926
  <a class='tab' href="/home?mode=settings"><i class="fa-solid fa-gear"></i><div class='caption'>Settings</div></a>
927
+ <% if (typeof peer_qr !== 'undefined' && peer_qr) { %>
928
+ <div class='qr' style='padding:12px 10px; text-align:center;'>
929
+ <a href="<%=peer_url%>" target="_blank" style="text-decoration:none; color:inherit; display:block;">
930
+ <img src="<%=peer_qr%>" alt="Open <%=peer_url%>" style="width:128px; height:128px; image-rendering: pixelated;"/>
931
+ <div class='caption'>Scan to open</div>
932
+ <div class='caption' style='font-size:10px; opacity:0.7;'><%=peer_url%></div>
933
+ </a>
934
+ </div>
935
+ <% } %>
927
936
  </aside>
928
937
  </main>
929
938
  </body>
@@ -84,6 +84,7 @@ body.dark .tab:focus-visible {
84
84
  margin-left: 10px;
85
85
  }
86
86
  .tab i.img {
87
+ flex-shrink: 0;
87
88
  height: 40px;
88
89
  width: 40px;
89
90
  background: white;
@@ -92,10 +93,10 @@ body.dark .tab:focus-visible {
92
93
  justify-content: center;
93
94
  font-size: 20px;
94
95
  align-items: center;
95
- border-radius: 5px;
96
+ border-radius: 40px;
96
97
  }
97
98
  .tab img {
98
- border-radius: 5px;
99
+ border-radius: 40px;
99
100
  height: 40px;
100
101
  width: 40px;
101
102
  background: white;
@@ -161,6 +162,47 @@ body.dark .menu-container {
161
162
  flex-direction: column;
162
163
  box-sizing: border-box;
163
164
  }
165
+ .column-subtitle {
166
+ font-size: 12px;
167
+ opacity: 0.7;
168
+ padding: 8px 10px 0;
169
+ }
170
+ body.dark .column-subtitle {
171
+ color: rgba(255, 255, 255, 0.75);
172
+ }
173
+ .menu-grid {
174
+ display: grid;
175
+ grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
176
+ }
177
+ .menu-column {
178
+ border: 1px solid rgba(0, 0, 0, 0.05);
179
+ overflow: hidden;
180
+ }
181
+ body.dark .menu-column {
182
+ border-color: rgba(255, 255, 255, 0.08);
183
+ }
184
+ .menu-column .tab-header {
185
+ background: rgba(0, 0, 0, 0.03);
186
+ }
187
+ body.dark .menu-column .tab-header {
188
+ background: rgba(255, 255, 255, 0.06);
189
+ }
190
+ .menu-column .tab-content {
191
+ padding-top: 4px;
192
+ display: flex;
193
+ flex-direction: column;
194
+ flex-wrap: nowrap;
195
+ align-items: stretch;
196
+ gap: 4px;
197
+ }
198
+ .menu-column .tab-content .tab {
199
+ flex: 0 0 auto;
200
+ }
201
+ @media (max-width: 700px) {
202
+ .menu-grid {
203
+ grid-template-columns: 1fr;
204
+ }
205
+ }
164
206
  body.dark .tab-header {
165
207
  background: rgba(255,255,255,0.04);
166
208
  }
@@ -367,28 +409,140 @@ body.dark #update-spec {
367
409
  </div>
368
410
  </div>
369
411
 
370
- <% index = 0 %>
371
- <% dynamic.forEach((item) => { %>
412
+ <%
413
+ let index = 0;
414
+ const userTerminal = dynamic && dynamic.length ? dynamic[0] : null;
415
+ const cliMenu = dynamic.find((item) => item && item.title === "Terminal Agents");
416
+ const ideMenu = dynamic.find((item) => item && item.title === "IDE Agents");
417
+ const handled = new Set();
418
+ if (userTerminal) handled.add(userTerminal);
419
+ if (cliMenu) handled.add(cliMenu);
420
+ if (ideMenu) handled.add(ideMenu);
421
+ const remaining = dynamic.filter((item) => !handled.has(item));
422
+ %>
423
+
424
+ <div class='menu-grid'>
425
+ <% if (userTerminal && userTerminal.menu && userTerminal.menu.length) { %>
426
+ <div class='menu-container menu-column user-terminal'>
427
+ <div class='tab-header'>
428
+ <h3><i class='<%= userTerminal.icon %>'></i> <%= userTerminal.title %></h3>
429
+ </div>
430
+ <% if (userTerminal.subtitle) { %>
431
+ <div class='column-subtitle'><%= userTerminal.subtitle %></div>
432
+ <% } %>
433
+ <div class='tab-content'>
434
+ <% userTerminal.menu.forEach((i) => { %>
435
+ <div class='tab' role="button" tabindex="0" data-index="<%= index++ %>" data-target="@<%= i.href %>" data-href="<%= i.href %>">
436
+ <% if (i.image) { %>
437
+ <img src="<%= i.image %>">
438
+ <% } else if (i.icon) { %>
439
+ <i class="img <%= i.icon %>"></i>
440
+ <% } %>
441
+ <h2><%= i.title %></h2>
442
+ <% if (i.subtitle) { %>
443
+ <div class='subtitle'><%= i.subtitle %></div>
444
+ <% } %>
445
+ <div class='flexible'></div>
446
+ <% if (i.link) { %>
447
+ <div target="_blank" data-href="<%= i.link %>"><i class="fa-solid fa-circle-info"></i></div>
448
+ <% } %>
449
+ <div class='disclosure-indicator' aria-hidden="true">
450
+ <i class="fa-solid fa-chevron-right"></i>
451
+ </div>
452
+ </div>
453
+ <% }) %>
454
+ </div>
455
+ </div>
456
+ <% } %>
457
+
458
+ <% if (cliMenu && cliMenu.menu && cliMenu.menu.length) { %>
459
+ <div class='menu-container menu-column cli-column'>
460
+ <div class='tab-header'>
461
+ <h3><i class='<%= cliMenu.icon %>'></i> Terminal Agents</h3>
462
+ </div>
463
+ <% if (cliMenu.subtitle) { %>
464
+ <div class='column-subtitle'><%= cliMenu.subtitle %></div>
465
+ <% } %>
466
+ <div class='tab-content'>
467
+ <% cliMenu.menu.forEach((i) => { %>
468
+ <div class='tab' role="button" tabindex="0" data-index="<%= index++ %>" data-target="@<%= i.href %>" data-href="<%= i.href %>">
469
+ <% if (i.image) { %>
470
+ <img src="<%= i.image %>">
471
+ <% } else if (i.icon) { %>
472
+ <i class="img <%= i.icon %>"></i>
473
+ <% } %>
474
+ <h2><%= i.title %></h2>
475
+ <% if (i.subtitle) { %>
476
+ <div class='subtitle'><%= i.subtitle %></div>
477
+ <% } %>
478
+ <div class='flexible'></div>
479
+ <% if (i.link) { %>
480
+ <div target="_blank" data-href="<%= i.link %>"><i class="fa-solid fa-circle-info"></i></div>
481
+ <% } %>
482
+ <div class='disclosure-indicator' aria-hidden="true">
483
+ <i class="fa-solid fa-chevron-right"></i>
484
+ </div>
485
+ </div>
486
+ <% }) %>
487
+ </div>
488
+ </div>
489
+ <% } %>
490
+
491
+ <% if (ideMenu && ideMenu.menu && ideMenu.menu.length) { %>
492
+ <div class='menu-container menu-column ide-column'>
493
+ <div class='tab-header'>
494
+ <h3><i class='<%= ideMenu.icon %>'></i> IDE Agents</h3>
495
+ </div>
496
+ <% if (ideMenu.subtitle) { %>
497
+ <div class='column-subtitle'><%= ideMenu.subtitle %></div>
498
+ <% } %>
499
+ <div class='tab-content'>
500
+ <% ideMenu.menu.forEach((i) => { %>
501
+ <div class='tab' role="button" tabindex="0" data-index="<%= index++ %>" data-target="@<%= i.href %>" data-href="<%= i.href %>">
502
+ <% if (i.image) { %>
503
+ <img src="<%= i.image %>">
504
+ <% } else if (i.icon) { %>
505
+ <i class="img <%= i.icon %>"></i>
506
+ <% } %>
507
+ <h2><%= i.title %></h2>
508
+ <% if (i.subtitle) { %>
509
+ <div class='subtitle'><%= i.subtitle %></div>
510
+ <% } %>
511
+ <div class='flexible'></div>
512
+ <% if (i.link) { %>
513
+ <div target="_blank" data-href="<%= i.link %>"><i class="fa-solid fa-circle-info"></i></div>
514
+ <% } %>
515
+ <div class='disclosure-indicator' aria-hidden="true">
516
+ <i class="fa-solid fa-chevron-right"></i>
517
+ </div>
518
+ </div>
519
+ <% }) %>
520
+ </div>
521
+ </div>
522
+ <% } %>
523
+ </div>
524
+
525
+ <% remaining.forEach((item) => { %>
372
526
  <% if (item.menu) { %>
373
527
  <div class='menu-container'>
374
528
  <div class='tab-header'>
375
- <h3><i class='<%=item.icon%>'></i> <%=item.title%></h3>
529
+ <h3><i class='<%= item.icon %>'></i> <%= item.title %></h3>
376
530
  </div>
377
531
  <div class='tab-content'>
378
532
  <% item.menu.forEach((i) => { %>
379
- <div class='tab' role="button" tabindex="0" data-index="<%=index++%>" data-target="@<%=i.href%>" data-href="<%=i.href%>">
533
+ <div class='tab' role="button" tabindex="0" data-index="<%= index++ %>" data-target="@<%= i.href %>" data-href="<%= i.href %>">
380
534
  <% if (i.image) { %>
381
- <img src="<%=i.image%>">
535
+ <img src="<%= i.image %>">
382
536
  <% } else if (i.icon) { %>
383
- <i class="img <%=i.icon%>"></i>
537
+ <i class="img <%= i.icon %>"></i>
384
538
  <% } %>
385
- <h2><%=i.title%></h1>
539
+ <h2><%= i.title %></h2>
386
540
  <% if (i.subtitle) { %>
387
- <div class='subtitle'><%=i.subtitle%></div>
541
+ <div class='subtitle'><%= i.subtitle %></div>
388
542
  <% } %>
389
543
  <div class='flexible'></div>
390
544
  <% if (i.link) { %>
391
- <div target="_blank" data-href="<%=i.link%>"><i class="fa-solid fa-circle-info"></i></div>
545
+ <div target="_blank" data-href="<%= i.link %>"><i class="fa-solid fa-circle-info"></i></div>
392
546
  <% } %>
393
547
  <div class='disclosure-indicator' aria-hidden="true">
394
548
  <i class="fa-solid fa-chevron-right"></i>
@@ -398,22 +552,22 @@ body.dark #update-spec {
398
552
  </div>
399
553
  </div>
400
554
  <% } else { %>
401
- <div class='tab' data-index="<%=index++%>">
555
+ <div class='tab' data-index="<%= index++ %>">
402
556
  <% if (item.image) { %>
403
- <img src="<%=item.image%>">
557
+ <img src="<%= item.image %>">
404
558
  <% } else if (item.icon) { %>
405
- <i class="img <%=item.icon%>"></i>
559
+ <i class="img <%= item.icon %>"></i>
406
560
  <% } %>
407
561
  <div class='col'>
408
- <h2><%=item.title%></h1>
562
+ <h2><%= item.title %></h2>
409
563
  <% if (item.subtitle) { %>
410
- <div class='subtitle'><%=item.subtitle%></div>
564
+ <div class='subtitle'><%= item.subtitle %></div>
411
565
  <% } %>
412
566
  <div class='btns'>
413
567
  <% if (item.link) { %>
414
- <a class='btn' target="_blank" href="<%=item.link%>"><i class="fa-solid fa-circle-info"></i></a>
568
+ <a class='btn' target="_blank" href="<%= item.link %>"><i class="fa-solid fa-circle-info"></i></a>
415
569
  <% } %>
416
- <a class='run-btn btn' href="<%=item.href%>"><i class="fa-solid <%=item.type === "Start" ? 'fa-play' : 'fa-rocket'%>"></i> <%=item.type%></a>
570
+ <a class='run-btn btn' href="<%= item.href %>"><i class="fa-solid <%= item.type === "Start" ? 'fa-play' : 'fa-rocket' %>"></i> <%= item.type %></a>
417
571
  </div>
418
572
  </div>
419
573
  </div>
@@ -13,6 +13,7 @@
13
13
  <script src="/xterm-addon-search-bar.js"></script>
14
14
  <script src="/sweetalert2.js"></script>
15
15
  <script src="/Socket.js"></script>
16
+ <script src="/terminal-settings.js"></script>
16
17
  <script src="/common.js"></script>
17
18
  <script src="/he.js"></script>
18
19
  <script src="/opener.js"></script>
@@ -680,7 +681,14 @@ document.addEventListener("DOMContentLoaded", async () => {
680
681
  if (res && res.config) {
681
682
  config = res.config
682
683
  }
684
+ const baseConfig = Object.assign({}, config)
685
+ if (window.PinokioTerminalSettings && typeof window.PinokioTerminalSettings.applyToConfig === 'function') {
686
+ config = window.PinokioTerminalSettings.applyToConfig(config)
687
+ }
683
688
  const term = new Terminal(config)
689
+ if (window.PinokioTerminalSettings && typeof window.PinokioTerminalSettings.register === 'function') {
690
+ window.PinokioTerminalSettings.register(term, { baseConfig })
691
+ }
684
692
  term.open(document.querySelector("#terminal"))
685
693
 
686
694
 
@@ -52,6 +52,10 @@
52
52
  </div>
53
53
  </aside>
54
54
  <main class="files-app__main">
55
+ <button class="files-app__sidebar-toggle" id="files-app-toggle-sidebar" type="button" aria-controls="files-app-tree" aria-expanded="true">
56
+ <span class="sr-only">Hide files</span>
57
+ <i class="fa-solid fa-chevron-left" aria-hidden="true"></i>
58
+ </button>
55
59
  <div class="files-app__tabs" id="files-app-tabs" role="tablist" aria-label="Open files"></div>
56
60
  <div class="files-app__editor" id="files-app-editor" role="presentation"></div>
57
61
  <div class="files-app__status" id="files-app-status" role="status" aria-live="polite"></div>
@@ -729,8 +729,17 @@ body.dark aside .current.selected {
729
729
  <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>
730
730
  <a class='tab' href="/screenshots"><i class="fa-solid fa-camera"></i><div class='caption'>Screenshots</div></a>
731
731
  <a class='tab' href="/tools"><i class="fa-solid fa-toolbox"></i><div class='caption'>Installed Tools</div></a>
732
- <a class='tab' href="/terminals"><i class="fa-solid fa-desktop"></i><div class='caption'>Terminals</div></a>
732
+ <a class='tab' href="/agents"><i class="fa-solid fa-robot"></i><div class='caption'>Agents</div></a>
733
733
  <a class='tab' href="/home?mode=settings"><i class="fa-solid fa-gear"></i><div class='caption'>Settings</div></a>
734
+ <% if (typeof peer_qr !== 'undefined' && peer_qr) { %>
735
+ <div class='qr' style='padding:12px 10px; text-align:center;'>
736
+ <a href="<%=peer_url%>" target="_blank" style="text-decoration:none; color:inherit; display:block;">
737
+ <img src="<%=peer_qr%>" alt="Open <%=peer_url%>" style="width:128px; height:128px; image-rendering: pixelated;"/>
738
+ <div class='caption'>Scan to open</div>
739
+ <div class='caption' style='font-size:10px; opacity:0.7;'><%=peer_url%></div>
740
+ </a>
741
+ </div>
742
+ <% } %>
734
743
  </aside>
735
744
  </main>
736
745
  <script>
@@ -1497,6 +1497,7 @@ body.dark .ace-editor {
1497
1497
  <script src="/report.js"></script>
1498
1498
  <script src="/normalize.js"></script>
1499
1499
  <script src="/Socket.js"></script>
1500
+ <script src="/terminal-settings.js"></script>
1500
1501
  <script src="/noty.js"></script>
1501
1502
  <script src="/notyq.js"></script>
1502
1503
  <script src="/xterm.js"></script>
@@ -1587,7 +1588,6 @@ body.dark .ace-editor {
1587
1588
  <div><h5>Download</h5></div>
1588
1589
  </div>
1589
1590
  </button>
1590
- <!--
1591
1591
  <div class='category-label'>Create a web domain</div>
1592
1592
  <button type="button" class="tab-button" data-tab="dns">
1593
1593
  <div class='row'>
@@ -1595,7 +1595,6 @@ body.dark .ace-editor {
1595
1595
  <div><h5>Web Domain</h5></div>
1596
1596
  </div>
1597
1597
  </button>
1598
- -->
1599
1598
  </div>
1600
1599
 
1601
1600
  <form id="bootstrap-form">
@@ -1951,8 +1950,17 @@ body.dark .ace-editor {
1951
1950
  <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>
1952
1951
  <a class='tab' href="/screenshots"><i class="fa-solid fa-camera"></i><div class='caption'>Screenshots</div></a>
1953
1952
  <a class='tab' href="/tools"><i class="fa-solid fa-toolbox"></i><div class='caption'>Installed Tools</div></a>
1954
- <a class='tab' href="/terminals"><i class="fa-solid fa-desktop"></i><div class='caption'>Terminals</div></a>
1953
+ <a class='tab' href="/agents"><i class="fa-solid fa-robot"></i><div class='caption'>Agents</div></a>
1955
1954
  <a class='tab' href="/home?mode=settings"><i class="fa-solid fa-gear"></i><div class='caption'>Settings</div></a>
1955
+ <% if (typeof peer_qr !== 'undefined' && peer_qr) { %>
1956
+ <div class='qr' style='padding:12px 10px; text-align:center;'>
1957
+ <a href="<%=peer_url%>" target="_blank" style="text-decoration:none; color:inherit; display:block;">
1958
+ <img src="<%=peer_qr%>" alt="Open <%=peer_url%>" style="width:128px; height:128px; image-rendering: pixelated;"/>
1959
+ <div class='caption'>Scan to open</div>
1960
+ <div class='caption' style='font-size:10px; opacity:0.7;'><%=peer_url%></div>
1961
+ </a>
1962
+ </div>
1963
+ <% } %>
1956
1964
  </aside>
1957
1965
  </main>
1958
1966
  <div id='terminal-container' class='hidden'>
@@ -2649,7 +2657,14 @@ const createTerm = async (_theme) => {
2649
2657
  if (res && res.config) {
2650
2658
  config = res.config
2651
2659
  }
2660
+ const baseConfig = Object.assign({}, config)
2661
+ if (window.PinokioTerminalSettings && typeof window.PinokioTerminalSettings.applyToConfig === 'function') {
2662
+ config = window.PinokioTerminalSettings.applyToConfig(config)
2663
+ }
2652
2664
  const term = new Terminal(config)
2665
+ if (window.PinokioTerminalSettings && typeof window.PinokioTerminalSettings.register === 'function') {
2666
+ window.PinokioTerminalSettings.register(term, { baseConfig })
2667
+ }
2653
2668
  term.open(document.querySelector("#terminal2"))
2654
2669
  document.querySelector("#terminal-container").classList.remove("hidden")
2655
2670
 
@@ -124,6 +124,7 @@ body {
124
124
  <script src="/xterm-addon-web-links.js"></script>
125
125
  <script src="/xterm-theme.js"></script>
126
126
  <script src="/Socket.js"></script>
127
+ <script src="/terminal-settings.js"></script>
127
128
  <!--
128
129
  <script src="/install.js"></script>
129
130
  -->
@@ -169,7 +170,14 @@ const createTerm = async (_theme) => {
169
170
  if (res && res.config) {
170
171
  config = res.config
171
172
  }
173
+ const baseConfig = Object.assign({}, config)
174
+ if (window.PinokioTerminalSettings && typeof window.PinokioTerminalSettings.applyToConfig === 'function') {
175
+ config = window.PinokioTerminalSettings.applyToConfig(config)
176
+ }
172
177
  const term = new Terminal(config)
178
+ if (window.PinokioTerminalSettings && typeof window.PinokioTerminalSettings.register === 'function') {
179
+ window.PinokioTerminalSettings.register(term, { baseConfig })
180
+ }
173
181
  term.open(document.querySelector("#terminal"))
174
182
 
175
183
  term.attachCustomKeyEventHandler(event => {
@@ -125,6 +125,8 @@
125
125
  sessionId: sessionId || null
126
126
  }) %>
127
127
  </script>
128
+ <script src="/Socket.js"></script>
129
+ <script src="/common.js"></script>
128
130
  <script src="/layout.js"></script>
129
131
  </body>
130
132
  </html>
@@ -821,8 +821,17 @@ document.addEventListener('DOMContentLoaded', function() {
821
821
  <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>
822
822
  <a class='tab' href="/screenshots"><i class="fa-solid fa-camera"></i><div class='caption'>Screenshots</div></a>
823
823
  <a class='tab' href="/tools"><i class="fa-solid fa-toolbox"></i><div class='caption'>Installed Tools</div></a>
824
- <a class='tab' href="/terminals"><i class="fa-solid fa-desktop"></i><div class='caption'>Terminals</div></a>
824
+ <a class='tab' href="/agents"><i class="fa-solid fa-robot"></i><div class='caption'>Agents</div></a>
825
825
  <a class='tab' href="/home?mode=settings"><i class="fa-solid fa-gear"></i><div class='caption'>Settings</div></a>
826
+ <% if (typeof peer_qr !== 'undefined' && peer_qr) { %>
827
+ <div class='qr' style='padding:12px 10px; text-align:center;'>
828
+ <a href="<%=peer_url%>" target="_blank" style="text-decoration:none; color:inherit; display:block;">
829
+ <img src="<%=peer_qr%>" alt="Open <%=peer_url%>" style="width:128px; height:128px; image-rendering: pixelated;"/>
830
+ <div class='caption'>Scan to open</div>
831
+ <div class='caption' style='font-size:10px; opacity:0.7;'><%=peer_url%></div>
832
+ </a>
833
+ </div>
834
+ <% } %>
826
835
  </aside>
827
836
  </main>
828
837
  <script>
@@ -1182,8 +1182,17 @@ document.addEventListener('DOMContentLoaded', function() {
1182
1182
  <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>
1183
1183
  <a class='tab' href="/screenshots"><i class="fa-solid fa-camera"></i><div class='caption'>Screenshots</div></a>
1184
1184
  <a class='tab' href="/tools"><i class="fa-solid fa-toolbox"></i><div class='caption'>Installed Tools</div></a>
1185
- <a class='tab' href="/terminals"><i class="fa-solid fa-desktop"></i><div class='caption'>Terminals</div></a>
1185
+ <a class='tab' href="/agents"><i class="fa-solid fa-robot"></i><div class='caption'>Agents</div></a>
1186
1186
  <a class='tab' href="/home?mode=settings"><i class="fa-solid fa-gear"></i><div class='caption'>Settings</div></a>
1187
+ <% if (typeof peer_qr !== 'undefined' && peer_qr) { %>
1188
+ <div class='qr' style='padding:12px 10px; text-align:center;'>
1189
+ <a href="<%=peer_url%>" target="_blank" style="text-decoration:none; color:inherit; display:block;">
1190
+ <img src="<%=peer_qr%>" alt="Open <%=peer_url%>" style="width:128px; height:128px; image-rendering: pixelated;"/>
1191
+ <div class='caption'>Scan to open</div>
1192
+ <div class='caption' style='font-size:10px; opacity:0.7;'><%=peer_url%></div>
1193
+ </a>
1194
+ </div>
1195
+ <% } %>
1187
1196
  </aside>
1188
1197
  </main>
1189
1198
  <script>
@@ -13,6 +13,7 @@
13
13
  <script src="/xterm-addon-search-bar.js"></script>
14
14
  <script src="/sweetalert2.js"></script>
15
15
  <script src="/Socket.js"></script>
16
+ <script src="/terminal-settings.js"></script>
16
17
  <script src="/common.js"></script>
17
18
  <script src="/he.js"></script>
18
19
  <script src="/opener.js"></script>
@@ -228,7 +229,14 @@ const createTerm = async (_theme) => {
228
229
  if (res && res.config) {
229
230
  config = res.config
230
231
  }
232
+ const baseConfig = Object.assign({}, config)
233
+ if (window.PinokioTerminalSettings && typeof window.PinokioTerminalSettings.applyToConfig === 'function') {
234
+ config = window.PinokioTerminalSettings.applyToConfig(config)
235
+ }
231
236
  const term = new Terminal(config)
237
+ if (window.PinokioTerminalSettings && typeof window.PinokioTerminalSettings.register === 'function') {
238
+ window.PinokioTerminalSettings.register(term, { baseConfig })
239
+ }
232
240
  term.open(document.querySelector("#terminal"))
233
241
 
234
242
  term.attachCustomKeyEventHandler(event => {
@@ -981,6 +981,7 @@ body.dark .appcanvas {
981
981
  <script src="/report.js"></script>
982
982
  <script src="/normalize.js"></script>
983
983
  <script src="/Socket.js"></script>
984
+ <script src="/terminal-settings.js"></script>
984
985
  <script src="/noty.js"></script>
985
986
  <script src="/notyq.js"></script>
986
987
  <script src="/xterm.js"></script>
@@ -1570,7 +1571,14 @@ async function displayResults(config) {
1570
1571
  term_config = res.config
1571
1572
  }
1572
1573
  let socket = new Socket()
1574
+ const baseConfig = Object.assign({}, term_config)
1575
+ if (window.PinokioTerminalSettings && typeof window.PinokioTerminalSettings.applyToConfig === 'function') {
1576
+ term_config = window.PinokioTerminalSettings.applyToConfig(term_config)
1577
+ }
1573
1578
  const term = new Terminal(term_config)
1579
+ if (window.PinokioTerminalSettings && typeof window.PinokioTerminalSettings.register === 'function') {
1580
+ window.PinokioTerminalSettings.register(term, { baseConfig })
1581
+ }
1574
1582
  term.open(document.querySelector("#terminal"))
1575
1583
  term.attachCustomKeyEventHandler(event => {
1576
1584
  console.log({ event })
@@ -198,7 +198,6 @@ body.dark header .home {
198
198
  */
199
199
  header .home {
200
200
  color: var(--light-color);
201
- padding: 10px;
202
201
  }
203
202
  body.dark hr {
204
203
  background: white;
@@ -774,8 +773,17 @@ document.addEventListener('DOMContentLoaded', function() {
774
773
  <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>
775
774
  <a class='tab selected' href="/screenshots"><i class="fa-solid fa-camera"></i><div class='caption'>Screenshots</div></a>
776
775
  <a class='tab' href="/tools"><i class="fa-solid fa-toolbox"></i><div class='caption'>Installed Tools</div></a>
777
- <a class='tab' href="/terminals"><i class="fa-solid fa-desktop"></i><div class='caption'>Terminals</div></a>
776
+ <a class='tab' href="/agents"><i class="fa-solid fa-robot"></i><div class='caption'>Agents</div></a>
778
777
  <a class='tab' href="/home?mode=settings"><i class="fa-solid fa-gear"></i><div class='caption'>Settings</div></a>
778
+ <% if (typeof peer_qr !== 'undefined' && peer_qr) { %>
779
+ <div class='qr' style='padding:12px 10px; text-align:center;'>
780
+ <a href="<%=peer_url%>" target="_blank" style="text-decoration:none; color:inherit; display:block;">
781
+ <img src="<%=peer_qr%>" alt="Open <%=peer_url%>" style="width:128px; height:128px; image-rendering: pixelated;"/>
782
+ <div class='caption'>Scan to open</div>
783
+ <div class='caption' style='font-size:10px; opacity:0.7;'><%=peer_url%></div>
784
+ </a>
785
+ </div>
786
+ <% } %>
779
787
  </aside>
780
788
  </main>
781
789
  <script>
@@ -198,7 +198,6 @@ body.dark header .home {
198
198
  */
199
199
  header .home {
200
200
  color: var(--light-color);
201
- padding: 10px;
202
201
  }
203
202
  body.dark hr {
204
203
  background: white;
@@ -569,8 +568,17 @@ document.addEventListener('DOMContentLoaded', function() {
569
568
  <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>
570
569
  <a class='tab' href="/screenshots"><i class="fa-solid fa-camera"></i><div class='caption'>Screenshots</div></a>
571
570
  <a class='tab' href="/tools"><i class="fa-solid fa-toolbox"></i><div class='caption'>Installed Tools</div></a>
572
- <a class='tab' href="/terminals"><i class="fa-solid fa-desktop"></i><div class='caption'>Terminals</div></a>
571
+ <a class='tab' href="/agents"><i class="fa-solid fa-robot"></i><div class='caption'>Agents</div></a>
573
572
  <a class='tab selected' href="/home?mode=settings"><i class="fa-solid fa-gear"></i><div class='caption'>Settings</div></a>
573
+ <% if (typeof peer_qr !== 'undefined' && peer_qr) { %>
574
+ <div class='qr' style='padding:12px 10px; text-align:center;'>
575
+ <a href="<%=peer_url%>" target="_blank" style="text-decoration:none; color:inherit; display:block;">
576
+ <img src="<%=peer_qr%>" alt="Open <%=peer_url%>" style="width:128px; height:128px; image-rendering: pixelated;"/>
577
+ <div class='caption'>Scan to open</div>
578
+ <div class='caption' style='font-size:10px; opacity:0.7;'><%=peer_url%></div>
579
+ </a>
580
+ </div>
581
+ <% } %>
574
582
  </aside>
575
583
  </main>
576
584
  <script>
@@ -14,6 +14,7 @@
14
14
  <script src="/sweetalert2.js"></script>
15
15
  <script src="/Socket.js"></script>
16
16
  <script src="/terminal_input_tracker.js"></script>
17
+ <script src="/terminal-settings.js"></script>
17
18
  <script src="/common.js"></script>
18
19
  <script src="/he.js"></script>
19
20
  <script src="/opener.js"></script>
@@ -927,7 +928,14 @@ document.addEventListener("DOMContentLoaded", async () => {
927
928
  if (res && res.config) {
928
929
  config = res.config
929
930
  }
931
+ const baseConfig = Object.assign({}, config)
932
+ if (window.PinokioTerminalSettings && typeof window.PinokioTerminalSettings.applyToConfig === 'function') {
933
+ config = window.PinokioTerminalSettings.applyToConfig(config)
934
+ }
930
935
  const term = new Terminal(config)
936
+ if (window.PinokioTerminalSettings && typeof window.PinokioTerminalSettings.register === 'function') {
937
+ window.PinokioTerminalSettings.register(term, { baseConfig })
938
+ }
931
939
  term.open(document.querySelector("#terminal"))
932
940
  const terminalContainer = document.querySelector("#terminal")
933
941
  const dropOverlay = document.createElement("div")
@@ -14,6 +14,7 @@
14
14
  <script src="/sweetalert2.js"></script>
15
15
  <script src="/Socket.js"></script>
16
16
  <script src="/terminal_input_tracker.js"></script>
17
+ <script src="/terminal-settings.js"></script>
17
18
  <script src="/common.js"></script>
18
19
  <script src="/he.js"></script>
19
20
  <script src="/opener.js"></script>
@@ -1011,7 +1012,14 @@ document.addEventListener("DOMContentLoaded", async () => {
1011
1012
  if (res && res.config) {
1012
1013
  config = res.config
1013
1014
  }
1015
+ const baseConfig = Object.assign({}, config)
1016
+ if (window.PinokioTerminalSettings && typeof window.PinokioTerminalSettings.applyToConfig === 'function') {
1017
+ config = window.PinokioTerminalSettings.applyToConfig(config)
1018
+ }
1014
1019
  const term = new Terminal(config)
1020
+ if (window.PinokioTerminalSettings && typeof window.PinokioTerminalSettings.register === 'function') {
1021
+ window.PinokioTerminalSettings.register(term, { baseConfig })
1022
+ }
1015
1023
  term.open(document.querySelector("#terminal"))
1016
1024
  const terminalContainer = document.querySelector("#terminal")
1017
1025
  const dropOverlay = document.createElement("div")