pinokiod 3.16.3 → 3.17.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.
@@ -957,7 +957,6 @@ class Bin {
957
957
  let dependencies
958
958
  if (r.name === "conda") {
959
959
  dependencies = config.bin.conda_requirements
960
- console.log("check dependencies", dependencies)
961
960
  requirements[i].dependencies = dependencies
962
961
  }
963
962
  let installed = await this.check_installed(r, dependencies)
@@ -980,8 +979,6 @@ class Bin {
980
979
  this.install_required = install_required
981
980
  this.requirements_pending = requirements_pending
982
981
 
983
- console.log("check_bin finished 2")
984
-
985
982
  requirements = requirements.filter((r) => {
986
983
  return r.relevant
987
984
  })
package/kernel/bin/py.js CHANGED
@@ -34,7 +34,6 @@ class Py {
34
34
  break;
35
35
  }
36
36
  }
37
- console.log({ exists, exists2, exists3, exists4 })
38
37
  return exists && exists2 && exists3 && exists4
39
38
  }
40
39
  async uninstall(req, ondata) {
package/kernel/peer.js CHANGED
@@ -107,6 +107,7 @@ class PeerDiscovery {
107
107
  })
108
108
  return res.data
109
109
  } catch (e) {
110
+ console.log("_refresh error", { host , e })
110
111
  return null
111
112
  }
112
113
  }
package/kernel/procs.js CHANGED
@@ -31,6 +31,11 @@ class Procs {
31
31
  // this.cache[localAddress] = false
32
32
  // return false;
33
33
  //}
34
+
35
+ // ignore caddy
36
+ if (parseInt(port) === 2019) {
37
+ return false
38
+ }
34
39
  if (this.cache.hasOwnProperty("" + port)) {
35
40
  return this.cache["" + port]
36
41
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pinokiod",
3
- "version": "3.16.3",
3
+ "version": "3.17.0",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/server/index.js CHANGED
@@ -3416,7 +3416,6 @@ class Server {
3416
3416
  bin: this.kernel.bin.preset("network"),
3417
3417
  })
3418
3418
 
3419
- console.log({ requirements_pending, install_required })
3420
3419
  if (!requirements_pending && install_required) {
3421
3420
  console.log("redirect to /setup/network")
3422
3421
  res.redirect("/setup/network?callback=/network")
Binary file
Binary file
Binary file
@@ -267,6 +267,20 @@ footer .toggle-expand {
267
267
  footer pre {
268
268
  background: none !important;
269
269
  }
270
+ .swal2-popup.full-popup img {
271
+ width: 100%;
272
+ }
273
+ .swal2-popup.full-popup {
274
+ max-width: 1024px;
275
+ width: 100%;
276
+ }
277
+ .full-modal {
278
+ font-size: 14px;
279
+ text-align: left;
280
+ }
281
+ .swal2-title.full-title {
282
+ text-align: left;
283
+ }
270
284
  .swal2-popup.min-popup a {
271
285
  outline: none;
272
286
  }
@@ -743,7 +743,7 @@ body.dark .appcanvas {
743
743
  <body class='<%=theme%>' data-platform="<%=platform%>" data-agent="<%=agent%>">
744
744
  <header class='navheader grabbable'>
745
745
  <h1>
746
- <a class='home' href="/"><i class="fa-solid fa-house"></i></a>
746
+ <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
747
747
  <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div><div>Prev</div></button>
748
748
  <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div><div>Next</div></button>
749
749
  <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
@@ -191,7 +191,7 @@ pre {
191
191
  <body class='<%=theme%>' data-agent="<%=agent%>">
192
192
  <header class='navheader grabbable'>
193
193
  <h1>
194
- <a class='home' href="/"><i class="fa-solid fa-house"></i></a>
194
+ <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
195
195
  <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div><div>Prev</div></button>
196
196
  <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div><div>Next</div></button>
197
197
  <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
@@ -226,7 +226,7 @@ body.dark .config {
226
226
  <body class='<%=theme%>' data-agent="<%=agent%>">
227
227
  <header class='navheader grabbable'>
228
228
  <h1>
229
- <a class='home' href="/"><i class="fa-solid fa-house"></i></a>
229
+ <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
230
230
  <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div><div>Prev</div></button>
231
231
  <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div><div>Next</div></button>
232
232
  <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
@@ -111,7 +111,7 @@ body.frozen {
111
111
  <% } %>
112
112
  <header class='grabbable'>
113
113
  <h1>
114
- <a class='home' href="/"><i class="fa-solid fa-house"></i></a>
114
+ <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
115
115
  <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div><div>Prev</div></button>
116
116
  <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div><div>Next</div></button>
117
117
  <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
@@ -120,7 +120,7 @@ body main iframe {
120
120
  <body class='<%=theme%>' data-agent="<%=agent%>">
121
121
  <header class='navheader grabbable'>
122
122
  <h1>
123
- <a class='home' href="/"><i class="fa-solid fa-house"></i></a>
123
+ <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
124
124
  <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div><div>Prev</div></button>
125
125
  <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div><div>Next</div></button>
126
126
  <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
@@ -162,7 +162,7 @@ body.dark .browser-options-row {
162
162
  <header class='navheader grabbable'>
163
163
  <h1>
164
164
  <% if (ishome) { %>
165
- <a class='home' href="/"><i class="fa-solid fa-house"></i></a>
165
+ <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
166
166
  <button class='btn2' id='back'><i class="fa-solid fa-chevron-left"></i></button>
167
167
  <button class='btn2' id='forward'><i class="fa-solid fa-chevron-right"></i></button>
168
168
  <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
@@ -205,7 +205,7 @@ hr {
205
205
  <body class='<%=theme%>' data-agent="<%=agent%>">
206
206
  <header class='navheader grabbable'>
207
207
  <h1>
208
- <a class='home' href="/"><i class="fa-solid fa-house"></i></a>
208
+ <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
209
209
  <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div><div>Prev</div></button>
210
210
  <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div><div>Next</div></button>
211
211
  <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
@@ -253,7 +253,7 @@ body.dark .item .tile .badge {
253
253
  <body class='<%=theme%>' data-agent="<%=agent%>">
254
254
  <header class='navheader grabbable'>
255
255
  <h1>
256
- <a class='home' href="/"><i class="fa-solid fa-house"></i></a>
256
+ <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
257
257
  <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div><div>Prev</div></button>
258
258
  <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div><div>Next</div></button>
259
259
  <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
@@ -243,7 +243,7 @@ body.dark .open-menu, body.dark .browse {
243
243
  <header class='navheader grabbable'>
244
244
  <h1>
245
245
  <% if (ishome) { %>
246
- <a class='home' href="/"><i class="fa-solid fa-house"></i></a>
246
+ <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
247
247
  <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div><div>Prev</div></button>
248
248
  <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div><div>Next</div></button>
249
249
  <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
@@ -27,6 +27,14 @@
27
27
  text-decoration: none;
28
28
  color: black;
29
29
  }
30
+ ol {
31
+ padding-inline-start: 15px;
32
+ }
33
+ a.explain {
34
+ color: royalblue;
35
+ text-decoration: underline;
36
+ cursor: pointer;
37
+ }
30
38
  .status {
31
39
  padding: 10px;
32
40
  margin: 10px;
@@ -245,7 +253,7 @@ td:first-child, th:first-child {
245
253
  vertical-align: top;
246
254
  border-bottom: 1px solid rgba(0,0,0,0.05);
247
255
  text-align: left;
248
- padding: 20px 0;
256
+ padding: 20px 5px;
249
257
  font-weight: normal;
250
258
  font-size: 12px;
251
259
  margin-bottom: 10px;
@@ -256,7 +264,7 @@ td:first-child, th:first-child {
256
264
  .container-row td {
257
265
  vertical-align: top;
258
266
  font-size: 14px;
259
- padding: 5px 2px;
267
+ padding: 5px;
260
268
  word-wrap: break-word;
261
269
  }
262
270
 
@@ -379,6 +387,9 @@ input:checked + .slider:before {
379
387
  flex-grow: 1;
380
388
  padding: 10px;
381
389
  }
390
+ table h3 {
391
+ margin: 0;
392
+ }
382
393
 
383
394
 
384
395
  @media only screen and (max-width: 480px) {
@@ -401,7 +412,7 @@ input:checked + .slider:before {
401
412
  <body class='<%=theme%>' data-agent="<%=agent%>">
402
413
  <header class='navheader grabbable'>
403
414
  <h1>
404
- <a class='home' href="/"><i class="fa-solid fa-house"></i></a>
415
+ <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
405
416
  <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div><div>Prev</div></button>
406
417
  <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div><div>Next</div></button>
407
418
  <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
@@ -423,7 +434,11 @@ input:checked + .slider:before {
423
434
  <div class='config'>
424
435
  <div class='config-header'>
425
436
  <div class='header-label'><i class='fa-solid fa-wifi'></i> Network</div>
426
- <div class='desc'>Instant HTTPS for every app on your local network.</div>
437
+ <div class='desc'>Instant HTTPS and Peer network for every app on your local network.</div>
438
+ <ol>
439
+ <li><strong>Instant HTTPS</strong> <a class='explain' data-type='https'>Learn more</a></li>
440
+ <li><strong>Local Peer-to-Peer Network</strong> <a class='explain' data-type='peer'>Learn more</a></li>
441
+ </ol>
427
442
  </div>
428
443
  <div class='config-body'>
429
444
  <div class='config-row'>
@@ -465,121 +480,73 @@ input:checked + .slider:before {
465
480
  </div>
466
481
  <% } else { %>
467
482
  <div class='header-label-sub'>
468
- <h1><i class="fa-solid fa-wifi"></i> <%=name%></h1>
483
+ <h1><i class="fa-solid fa-wifi"></i> <%=name%> (peer)</h1>
469
484
  <div class='s'><i class="fa-brands fa-<%=brands[platform]%>"></i> <%=platform%> <%=host%></div>
470
485
  </div>
471
486
  <% } %>
472
487
  <table>
473
- <tr>
474
- <th><h2>Server</h2><div>Running apps</div></th>
475
- <th><h2>Shared</h2><div>Use on any machine on the network</div></th>
476
- <th><h2>Local</h2><div>Use on <%=current_host%></div></th>
477
- </tr>
478
- <% processes.forEach((item) => { %>
479
- <tr>
480
- <td class='title'><%=item.name%></td>
481
- <td>
482
- <% item.external_router.forEach((domain) => { %>
483
- <div>
484
- <a class='ln' target="_blank" href="https://<%=domain%>">https://<%=domain%></a>
485
- </div>
486
- <% }) %>
487
- <% if (item.external_ip) { %>
488
- <div>
489
- <a class='ln' target="_blank" href="http://<%=item.external_ip%>">http://<%=item.external_ip%></a>
490
- </div>
491
- <% } %>
492
- </td>
493
- <td>
494
- <% item.internal_router.forEach((domain) => { %>
488
+ <% if (current_host === host) { %>
489
+ <tr>
490
+ <th><h2>App</h2><div>All servers on this machine</div></th>
491
+ <th><h2>Local</h2><div>endpoints accessible from this machine</div></th>
492
+ <th><h2>Network</h2><div>endpoints accessible from any machine on the local network</div></th>
493
+ <th><h2>Peer</h2><div>endpoints accessible from any pinokio peer on the local network <a class='explain' data-type='peer'>How to start a peer</a></div></th>
494
+ </tr>
495
+ <% processes.forEach((item) => { %>
496
+ <tr>
497
+ <td class='title'><%=item.name%></td>
498
+ <td>
499
+ <% item.internal_router.forEach((domain) => { %>
500
+ <div>
501
+ <a class='ln' target="_blank" href="https://<%=domain%>">https://<%=domain%></a>
502
+ </div>
503
+ <% }) %>
495
504
  <div>
496
- <a class='ln' target="_blank" href="https://<%=domain%>">https://<%=domain%></a>
505
+ <a class='ln' target="_blank" href="http://localhost:<%=item.port%>">http://localhost:<%=item.port%></a>
497
506
  </div>
498
- <% }) %>
499
- <div>
500
- <a class='ln' target="_blank" href="http://localhost:<%=item.port%>">http://localhost:<%=item.port%></a>
501
- </div>
502
- </td>
507
+ </td>
508
+ <td>
509
+ <% if (item.external_ip) { %>
510
+ <div>
511
+ <a class='ln' target="_blank" href="http://<%=item.external_ip%>">http://<%=item.external_ip%></a>
512
+ </div>
513
+ <% } %>
514
+ </td>
515
+ <td>
516
+ <% item.external_router.forEach((domain) => { %>
517
+ <div>
518
+ <a class='ln' target="_blank" href="https://<%=domain%>">https://<%=domain%></a>
519
+ </div>
520
+ <% }) %>
521
+ </td>
522
+ </tr>
523
+ <% }) %>
524
+ <% } else { %>
525
+ <tr>
526
+ <th><h2>App</h2><div>All servers on this machine</div></th>
527
+ <th><h2>Endpoints</h2><div>accessible through peer network</div></th>
503
528
  </tr>
504
- <% }) %>
529
+ <% processes.forEach((item) => { %>
530
+ <tr>
531
+ <td class='title'><%=item.name%></td>
532
+ <td>
533
+ <% if (item.external_ip) { %>
534
+ <div>
535
+ <a class='ln' target="_blank" href="http://<%=item.external_ip%>">http://<%=item.external_ip%></a>
536
+ </div>
537
+ <% } %>
538
+ <% item.external_router.forEach((domain) => { %>
539
+ <div>
540
+ <a class='ln' target="_blank" href="https://<%=domain%>">https://<%=domain%></a>
541
+ </div>
542
+ <% }) %>
543
+ </td>
544
+ </tr>
545
+ <% }) %>
546
+ <% } %>
505
547
  </table>
506
548
  </div>
507
549
  <% }) %>
508
- <div class='container-row hidden'>
509
- <div class='header-label-sub'><i class="fa-solid fa-microchip"></i> System Programs</div>
510
- <div class='line align-top'>
511
- <h3>
512
- <img class='icon' src="<%=icon%>">
513
- <div class='col'>
514
- <div class='title'>Pinokio</div>
515
- <% if (proxy) { %>
516
- <div class='description'><a href="<%=proxy.proxy%>" target="_blank"><%=proxy.proxy%></a> → <a href="<%=localhost%>" target="_blank"><%=localhost%></a></div>
517
- <a class='wifi-qr badge' data-qr="<%=qr%>" data-url="<%=proxy.proxy%>"><i class="fa-solid fa-qrcode"></i> Scan QR Code</a>
518
- <% } else { %>
519
- <div class='description'>Share Pinokio <a href="<%=localhost%>" target="_blank"><%=localhost%></a> with other devices on the same network</div>
520
- <% } %>
521
- <div class='btn-container'>
522
- <% if (proxy) { %>
523
- <div id='wifi-stop' data-proxy="<%=proxy.proxy%>" class='btn'><div><i class="fa-solid fa-stop"></i> Stop</div></div>
524
- <% } else { %>
525
- <div id='wifi' class='btn'><div><i class="fa-solid fa-play"></i> Start</div></div>
526
- <div id='wifi-starting' class='btn disabled hidden'><div><i class="fa-solid fa-circle-notch fa-spin"></i> Starting</div></div>
527
- <% } %>
528
- </div>
529
- </div>
530
- </h3>
531
- </div>
532
- <% items.forEach((item) => { %>
533
- <div class='line align-top'>
534
- <h3>
535
- <img class='icon' src="<%=item.icon%>">
536
- <div class='col'>
537
- <div class='title'><%=item.name%></div>
538
- <% if (item.proxy) { %>
539
- <div class='description'><a href="<%=item.proxy%>" target="_blank"><%=item.proxy%></a> → <a href="<%=item.target%>" target="_blank"><%=item.target%></a></div>
540
- <a class='wifi-qr badge' data-qr="<%=item.qr%>" data-url="<%=item.proxy%>"><i class="fa-solid fa-qrcode"></i> Scan QR Code</a>
541
- <% } else { %>
542
- <div class='description'>Share <%=item.target%> with other devices on the same network</div>
543
- <% } %>
544
- <div class='btn-container'>
545
- <% if (item.running) { %>
546
- <div data-port="<%=item.port%>" data-name="<%=item.name%>" data-target="<%=item.target%>" class='stop btn'><i class="fa-solid fa-stop"></i> Stop</div>
547
- <% } else { %>
548
- <div data-port="<%=item.port%>" data-name="<%=item.name%>" data-target="<%=item.target%>" class='start btn'><i class="fa-solid fa-play"></i> Start at port <%=item.port%></div>
549
- <% } %>
550
- </div>
551
- </div>
552
- </h3>
553
- </div>
554
- <% }) %>
555
- </div>
556
- <!--
557
- <div class='container-row'>
558
- <div class='header-label-sub'><i class="fa-solid fa-dice-d6"></i> Pinokio</div>
559
- <% apps.forEach((item) => { %>
560
- <a class='line align-top' href="<%=item.link%>">
561
- <h3>
562
- <% if (item.icon) { %>
563
- <img class='icon' src="<%=item.icon%>">
564
- <% } else { %>
565
- <% if (theme === 'dark') { %>
566
- <img class='icon' src="/pinokio-white.png">
567
- <% } else { %>
568
- <img class='icon' src="/pinokio-black.png">
569
- <% } %>
570
- <% } %>
571
- <div class='col'>
572
- <div class='title'><%=item.name%></div>
573
- <div class='description'><%=item.description%></div>
574
- </div>
575
- <div class='spinner'>
576
- <i class="fa-solid fa-chevron-right"></i>
577
- </div>
578
- </h3>
579
- </a>
580
- <% }) %>
581
- </div>
582
- -->
583
550
  </div>
584
551
  <% } %>
585
552
  </main>
@@ -663,6 +630,60 @@ document.querySelector("#active").addEventListener("change", (e)=> {
663
630
  document.querySelector("main").addEventListener("click", async (e) => {
664
631
  let target
665
632
 
633
+ if (e.target.classList.contains("explain")) {
634
+ target = e.target
635
+ } else {
636
+ target = e.target.closest(".explain")
637
+ }
638
+ if (target) {
639
+ e.preventDefault()
640
+ e.stopPropagation()
641
+ let type = target.getAttribute("data-type")
642
+ if (type === "https") {
643
+ await Swal.fire({
644
+ title: "Instant HTTPS",
645
+ customClass: {
646
+ popup: "full-popup",
647
+ title: "full-title"
648
+ },
649
+ showConfirmButton: false,
650
+ html: `<div class='full-modal'>
651
+ <div>Pinokio automatically turns ALL your local applications into HTTPS.</div>
652
+ <br>
653
+ <div>Instant HTTPS automagically works for ALL your local apps and APIs system-wide (not just those installed on pinokio)</div>
654
+ <br>
655
+ <div>This means, even the apps that have nothing to do with Pinokio (such as Ollama, LMStudio, or really anything) become HTTPS-ified.</div>
656
+ <br>
657
+ <div>Exposing localhost apps over HTTPS unlocks powerful new possibilities. It enables a completely new application architecture where public websites can securely leverage your local APIs as backend services.</div>
658
+ <br>
659
+ <img src="/https.png"/>
660
+ <br>
661
+ </div>`
662
+ })
663
+ } else if (type === "peer") {
664
+ await Swal.fire({
665
+ title: "Peer to Peer Local Network",
666
+ customClass: {
667
+ popup: "full-popup",
668
+ title: "full-title"
669
+ },
670
+ showConfirmButton: false,
671
+ html: `<div class='full-modal'>
672
+ <div>Peers can access each other over HTTPS. It's like a whole internet, but among your local machines.</div>
673
+ <br>
674
+ <img src="/peernet.png"/>
675
+ <div>To start a peer, install Pinokio on any other machine on the same network.</div>
676
+ <br>
677
+ <div>Peers automatically discover each other and display accessible apps and endpoints from other machines:</div>
678
+ <br>
679
+ <img src="/peers.png"/>
680
+ <br>
681
+ </div>`
682
+ })
683
+ }
684
+ return
685
+ }
686
+
666
687
  if (e.target.classList.contains("save")) {
667
688
  target = e.target
668
689
  } else {