pinokiod 7.3.10 → 7.3.11

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/bin/brew.js +12 -2
  2. package/kernel/bin/caddy.js +24 -20
  3. package/kernel/bin/huggingface.js +2 -2
  4. package/kernel/bin/setup.js +2 -3
  5. package/kernel/bin/uv.js +13 -6
  6. package/kernel/connect/index.js +5 -1
  7. package/kernel/connect/providers/huggingface/index.js +213 -75
  8. package/kernel/environment.js +16 -1
  9. package/kernel/router/localhost_home_router.js +7 -0
  10. package/kernel/shell.js +1 -5
  11. package/kernel/util.js +1 -0
  12. package/package.json +1 -1
  13. package/server/index.js +75 -33
  14. package/server/public/common.js +45 -71
  15. package/server/public/install.js +20 -2
  16. package/server/public/layout.js +1 -1
  17. package/server/public/style.css +1432 -511
  18. package/server/public/tab-link-popover.css +162 -18
  19. package/server/public/tab-link-popover.js +230 -21
  20. package/server/public/task-launcher.css +121 -84
  21. package/server/public/terminal-settings.js +121 -45
  22. package/server/public/universal-launcher.css +42 -33
  23. package/server/public/urldropdown.css +284 -0
  24. package/server/views/app.ejs +1595 -308
  25. package/server/views/autolaunch.ejs +4 -5
  26. package/server/views/checkpoints.ejs +223 -50
  27. package/server/views/connect/huggingface.ejs +406 -325
  28. package/server/views/connect.ejs +0 -1
  29. package/server/views/github.ejs +277 -324
  30. package/server/views/index.ejs +53 -1
  31. package/server/views/install.ejs +119 -19
  32. package/server/views/logs.ejs +10 -9
  33. package/server/views/net.ejs +341 -64
  34. package/server/views/network.ejs +85 -63
  35. package/server/views/partials/main_sidebar.ejs +237 -12
  36. package/server/views/plugins.ejs +141 -3
  37. package/server/views/settings.ejs +103 -7
  38. package/server/views/setup.ejs +0 -5
  39. package/server/views/skills.ejs +0 -1
  40. package/server/views/task_list.ejs +0 -1
  41. package/server/views/terminal.ejs +142 -1
  42. package/server/views/terminals.ejs +346 -6
  43. package/server/views/tools.ejs +828 -1691
  44. package/test/caddy-install.test.js +53 -0
  45. package/test/connect-setup.test.js +16 -0
  46. package/test/github-connection.test.js +1 -1
  47. package/test/huggingface-bin.test.js +4 -4
  48. package/test/huggingface-connect.test.js +73 -0
  49. package/test/main-sidebar.test.js +31 -0
  50. package/test/shell-run-template.test.js +5 -1
  51. package/test/uv-bin.test.js +29 -0
@@ -14,10 +14,10 @@
14
14
  <% } %>
15
15
  <style>
16
16
  body.autolaunch-page .task-container {
17
- padding: 20px 28px 32px;
17
+ padding: 0;
18
18
  }
19
19
  body.autolaunch-page .task-shell {
20
- width: min(1140px, 100%);
20
+ width: 100%;
21
21
  margin: 0;
22
22
  background: transparent;
23
23
  border: 0;
@@ -27,7 +27,7 @@ body.autolaunch-page .task-shell {
27
27
  backdrop-filter: none;
28
28
  }
29
29
  body.autolaunch-page .task-shell-header {
30
- padding-bottom: 18px;
30
+ padding: 12px 18px 14px;
31
31
  }
32
32
  body.autolaunch-page .task-shell-body {
33
33
  padding: 0 28px 28px;
@@ -479,9 +479,8 @@ body.autolaunch-page .autolaunch-loading i {
479
479
  <section class="task-shell autolaunch-shell">
480
480
  <header class="task-shell-header">
481
481
  <div class="task-shell-header-main">
482
- <p class="task-eyebrow">Autolaunch</p>
483
482
  <h1 class="task-title">Startup scripts</h1>
484
- <p class="task-description">Choose which installed app script runs when Pinokio starts. Script choices load when you select an app.</p>
483
+ <p class="task-description">Choose which installed app script runs when Pinokio starts.</p>
485
484
  </div>
486
485
  <div class="task-header-actions autolaunch-summary">
487
486
  <span class="autolaunch-summary-item"><strong data-enabled-count><%= enabledCount %></strong> enabled</span>
@@ -155,13 +155,8 @@ body.dark .backup-modal-description {
155
155
  padding: 2px 6px 6px 2px;
156
156
  overscroll-behavior: contain;
157
157
  }
158
- .line.backup-row {
158
+ body.checkpoints-page .backup-row {
159
159
  cursor: pointer;
160
- transition: background 0.15s ease, box-shadow 0.15s ease;
161
- }
162
- .line.backup-row:hover {
163
- background: royalblue;
164
- box-shadow: 0 4px 10px rgba(15, 23, 42, 0.08);
165
160
  }
166
161
  .snapshot-option {
167
162
  display: flex;
@@ -385,10 +380,10 @@ body.dark .backup-loading .backup-loading-text {
385
380
  color: rgba(226, 232, 240, 0.95);
386
381
  }
387
382
  body.checkpoints-page .task-container {
388
- padding: 20px 28px 32px;
383
+ padding: 0;
389
384
  }
390
385
  body.checkpoints-page .task-shell {
391
- width: min(1080px, 100%);
386
+ width: 100%;
392
387
  margin: 0;
393
388
  background: transparent;
394
389
  border: 0;
@@ -398,7 +393,7 @@ body.checkpoints-page .task-shell {
398
393
  backdrop-filter: none;
399
394
  }
400
395
  body.checkpoints-page .task-shell-header {
401
- padding-bottom: 18px;
396
+ padding: 12px 18px 14px;
402
397
  }
403
398
  body.checkpoints-page .task-shell-body {
404
399
  padding: 28px 28px 28px;
@@ -417,31 +412,40 @@ body.checkpoints-page .checkpoints-toolbar {
417
412
  margin: 0 0 18px;
418
413
  }
419
414
  body.checkpoints-page .checkpoints-list {
420
- display: grid;
415
+ display: flex;
416
+ flex-direction: column;
421
417
  gap: 0;
418
+ overflow: hidden;
419
+ border: 1px solid var(--task-border);
420
+ border-radius: 8px;
421
+ background: transparent;
422
422
  }
423
423
  body.checkpoints-page .backup-row {
424
- padding: 16px 0;
425
- border-top: 1px solid var(--task-border);
424
+ display: block;
425
+ padding: 7px 12px;
426
+ border-bottom: 1px solid var(--task-border);
427
+ background: transparent;
428
+ color: var(--task-text);
429
+ text-decoration: none;
430
+ transform: none;
426
431
  }
427
- body.checkpoints-page .checkpoints-list > .backup-row:first-child {
428
- padding-top: 0;
429
- border-top: 0;
432
+ body.checkpoints-page .backup-row:last-child {
433
+ border-bottom: 0;
430
434
  }
431
435
  body.checkpoints-page .backup-row h3 {
432
436
  margin: 0;
433
437
  display: grid;
434
- grid-template-columns: 52px minmax(0, 1fr);
435
- gap: 14px;
436
- align-items: start;
438
+ grid-template-columns: auto minmax(0, 1fr) auto;
439
+ gap: 12px;
440
+ align-items: center;
437
441
  }
438
442
  body.checkpoints-page .backup-row .item-icon {
439
- width: 52px;
440
- height: 52px;
441
- border-radius: 14px;
443
+ width: 28px;
444
+ height: 28px;
445
+ border-radius: 6px;
442
446
  overflow: hidden;
443
- background: color-mix(in srgb, var(--task-panel) 94%, var(--task-soft));
444
447
  border: 1px solid var(--task-border);
448
+ background: color-mix(in srgb, var(--task-text) 5%, transparent);
445
449
  display: flex;
446
450
  align-items: center;
447
451
  justify-content: center;
@@ -459,44 +463,71 @@ body.checkpoints-page .backup-row .title {
459
463
  display: flex;
460
464
  align-items: center;
461
465
  gap: 8px;
462
- font-size: 18px;
463
- font-weight: 700;
466
+ overflow: hidden;
467
+ font-size: 13px;
468
+ font-weight: 450;
469
+ letter-spacing: 0;
470
+ line-height: 1.2;
464
471
  color: var(--task-text);
465
- }
466
- body.checkpoints-page .backup-row .title i {
467
- font-size: 10px;
468
- color: var(--task-accent);
472
+ text-overflow: ellipsis;
473
+ white-space: nowrap;
469
474
  }
470
475
  body.checkpoints-page .backup-row .uri {
471
- margin-top: 3px;
472
- font-size: 13px;
473
- line-height: 1.45;
476
+ overflow: hidden;
477
+ margin-top: 1px;
478
+ font-size: 11px;
479
+ line-height: 1.2;
474
480
  color: var(--task-muted);
475
- word-break: break-word;
481
+ text-overflow: ellipsis;
482
+ white-space: nowrap;
476
483
  }
477
484
  body.checkpoints-page .backup-row .description {
478
- margin-top: 6px;
479
- font-size: 13px;
480
- line-height: 1.5;
485
+ overflow: hidden;
486
+ margin-top: 2px;
487
+ font-size: 11px;
488
+ line-height: 1.2;
481
489
  color: var(--task-muted);
490
+ text-overflow: ellipsis;
491
+ white-space: nowrap;
482
492
  }
483
493
  body.checkpoints-page .backup-row .backup-meta {
484
494
  display: flex;
485
495
  align-items: center;
486
- gap: 8px;
496
+ gap: 7px;
487
497
  flex-wrap: wrap;
498
+ min-width: 0;
488
499
  }
489
500
  body.checkpoints-page .backup-row .badge {
490
501
  display: inline-flex;
491
502
  align-items: center;
492
- min-height: 24px;
493
- padding: 0 9px;
494
- border-radius: 999px;
495
- border: 1px solid var(--task-border);
496
- background: color-mix(in srgb, var(--task-panel) 94%, var(--task-soft));
497
- color: var(--task-text);
503
+ min-height: 0;
504
+ padding: 0;
505
+ border: 0;
506
+ border-radius: 0;
507
+ background: transparent;
508
+ color: var(--task-muted);
498
509
  font-size: 11px;
499
- font-weight: 600;
510
+ font-weight: 500;
511
+ }
512
+ body.checkpoints-page .checkpoint-row-action {
513
+ display: inline-flex;
514
+ align-items: center;
515
+ gap: 6px;
516
+ color: var(--task-muted);
517
+ font-size: 11px;
518
+ line-height: 1;
519
+ opacity: 0.7;
520
+ transition: color 140ms ease, opacity 140ms ease, transform 140ms ease;
521
+ }
522
+ body.checkpoints-page .backup-row:hover .checkpoint-row-action,
523
+ body.checkpoints-page .backup-row:focus-visible .checkpoint-row-action,
524
+ body.checkpoints-page .backup-row:focus-within .checkpoint-row-action {
525
+ color: var(--task-text);
526
+ opacity: 1;
527
+ transform: translateX(1px);
528
+ }
529
+ body.checkpoints-page .checkpoint-row-action i {
530
+ font-size: 12px;
500
531
  }
501
532
  body.checkpoints-page .backups-empty {
502
533
  margin: 0;
@@ -516,15 +547,155 @@ body.checkpoints-page .backups-empty {
516
547
  padding: 16px 14px 24px;
517
548
  }
518
549
  body.checkpoints-page .backup-row h3 {
519
- grid-template-columns: 44px minmax(0, 1fr);
550
+ grid-template-columns: auto minmax(0, 1fr) auto;
520
551
  gap: 12px;
521
552
  }
522
553
  body.checkpoints-page .backup-row .item-icon {
523
- width: 44px;
524
- height: 44px;
525
- border-radius: 12px;
554
+ width: 28px;
555
+ height: 28px;
556
+ border-radius: 6px;
557
+ }
558
+ body.checkpoints-page .checkpoint-row-action span {
559
+ display: none;
526
560
  }
527
561
  }
562
+ /* Minimal modal normalization for backup install/rename dialogs. */
563
+ .swal2-popup.backup-modal-shell {
564
+ background: transparent !important;
565
+ box-shadow: none !important;
566
+ }
567
+
568
+ .backup-modal-content {
569
+ border: 1px solid rgba(24, 24, 27, 0.12) !important;
570
+ border-radius: 8px !important;
571
+ background: #ffffff !important;
572
+ color: #18181b !important;
573
+ box-shadow: 0 18px 50px rgba(15, 23, 42, 0.16) !important;
574
+ padding: 18px !important;
575
+ }
576
+
577
+ body.dark .backup-modal-content {
578
+ border-color: rgba(255, 255, 255, 0.1) !important;
579
+ background: #1b1c1d !important;
580
+ color: rgba(250, 250, 250, 0.94) !important;
581
+ box-shadow: 0 24px 72px rgba(0, 0, 0, 0.42) !important;
582
+ }
583
+
584
+ .backup-modal-header h3 {
585
+ font-size: 16px !important;
586
+ line-height: 1.25 !important;
587
+ font-weight: 600 !important;
588
+ color: inherit !important;
589
+ }
590
+
591
+ .backup-modal-description,
592
+ body.dark .backup-modal-description,
593
+ .backup-meta {
594
+ color: #71717a !important;
595
+ font-size: 12px !important;
596
+ line-height: 1.45 !important;
597
+ }
598
+
599
+ body.dark .backup-modal-description,
600
+ body.dark .backup-meta {
601
+ color: rgba(229, 231, 235, 0.62) !important;
602
+ }
603
+
604
+ .backup-modal input[type="text"],
605
+ body.dark .backup-modal input[type="text"] {
606
+ height: 36px !important;
607
+ border-radius: 6px !important;
608
+ border: 1px solid rgba(24, 24, 27, 0.16) !important;
609
+ background: #ffffff !important;
610
+ color: #18181b !important;
611
+ box-shadow: none !important;
612
+ font-size: 13px !important;
613
+ }
614
+
615
+ body.dark .backup-modal input[type="text"] {
616
+ border-color: rgba(255, 255, 255, 0.14) !important;
617
+ background: rgba(255, 255, 255, 0.04) !important;
618
+ color: rgba(250, 250, 250, 0.94) !important;
619
+ }
620
+
621
+ .backup-modal input[type="text"]:focus {
622
+ border-color: rgba(24, 24, 27, 0.42) !important;
623
+ box-shadow: 0 0 0 3px rgba(24, 24, 27, 0.12) !important;
624
+ outline: none !important;
625
+ }
626
+
627
+ body.dark .backup-modal input[type="text"]:focus {
628
+ border-color: rgba(255, 255, 255, 0.38) !important;
629
+ box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.14) !important;
630
+ }
631
+
632
+ .backup-modal-content .url-modal-close {
633
+ width: 28px !important;
634
+ height: 28px !important;
635
+ border-radius: 6px !important;
636
+ color: #71717a !important;
637
+ }
638
+
639
+ body.dark .backup-modal-content .url-modal-close {
640
+ color: rgba(229, 231, 235, 0.58) !important;
641
+ }
642
+
643
+ .backup-modal-content .url-modal-close:hover,
644
+ .backup-modal-content .url-modal-close:focus-visible {
645
+ background: rgba(24, 24, 27, 0.06) !important;
646
+ color: #18181b !important;
647
+ outline: none !important;
648
+ }
649
+
650
+ body.dark .backup-modal-content .url-modal-close:hover,
651
+ body.dark .backup-modal-content .url-modal-close:focus-visible {
652
+ background: rgba(255, 255, 255, 0.07) !important;
653
+ color: rgba(250, 250, 250, 0.94) !important;
654
+ }
655
+
656
+ .backup-modal-content .url-modal-button {
657
+ min-height: 32px !important;
658
+ padding: 0 12px !important;
659
+ border-radius: 6px !important;
660
+ box-shadow: none !important;
661
+ font-size: 13px !important;
662
+ font-weight: 600 !important;
663
+ }
664
+
665
+ .backup-modal-content .url-modal-button.confirm {
666
+ border: 1px solid #18181b !important;
667
+ background: #18181b !important;
668
+ color: #ffffff !important;
669
+ }
670
+
671
+ body.dark .backup-modal-content .url-modal-button.confirm {
672
+ border-color: rgba(250, 250, 250, 0.94) !important;
673
+ background: rgba(250, 250, 250, 0.94) !important;
674
+ color: #1b1c1d !important;
675
+ }
676
+
677
+ .backup-modal-content .url-modal-button.cancel {
678
+ border: 1px solid rgba(24, 24, 27, 0.12) !important;
679
+ background: transparent !important;
680
+ color: #52525b !important;
681
+ }
682
+
683
+ body.dark .backup-modal-content .url-modal-button.cancel {
684
+ border-color: rgba(255, 255, 255, 0.1) !important;
685
+ color: rgba(229, 231, 235, 0.7) !important;
686
+ }
687
+
688
+ .backup-modal-content .url-modal-button.danger {
689
+ border: 1px solid rgba(220, 38, 38, 0.22) !important;
690
+ background: rgba(220, 38, 38, 0.08) !important;
691
+ color: #b91c1c !important;
692
+ }
693
+
694
+ body.dark .backup-modal-content .url-modal-button.danger {
695
+ border-color: rgba(248, 113, 113, 0.28) !important;
696
+ background: rgba(239, 68, 68, 0.13) !important;
697
+ color: #fecaca !important;
698
+ }
528
699
  </style>
529
700
  <script src="/window_storage.js"></script>
530
701
  <script src="/hotkeys.min.js"></script>
@@ -1049,7 +1220,6 @@ document.addEventListener("DOMContentLoaded", () => {
1049
1220
  <section class='task-shell checkpoints-shell'>
1050
1221
  <header class='task-shell-header'>
1051
1222
  <div class='task-shell-header-main'>
1052
- <p class='task-eyebrow'>Checkpoints</p>
1053
1223
  <h1 class='task-title'>Checkpoints</h1>
1054
1224
  <p class='task-description'>Local version history for workspaces on this machine.</p>
1055
1225
  </div>
@@ -1068,7 +1238,7 @@ document.addEventListener("DOMContentLoaded", () => {
1068
1238
  <% if (items && items.length > 0) { %>
1069
1239
  <div class="checkpoints-list">
1070
1240
  <% items.forEach((item) => { %>
1071
- <div class='line align-top backup-row' data-remote-key="<%=item.remoteKey%>">
1241
+ <div class='backup-row' data-remote-key="<%=item.remoteKey%>">
1072
1242
  <h3>
1073
1243
  <div class='item-icon'>
1074
1244
  <% if (item.icon) { %>
@@ -1079,7 +1249,6 @@ document.addEventListener("DOMContentLoaded", () => {
1079
1249
  </div>
1080
1250
  <div class='col'>
1081
1251
  <div class='title'>
1082
- <i class="fa-solid fa-circle"></i>
1083
1252
  <span><%= item.title || item.displayName %></span>
1084
1253
  </div>
1085
1254
  <div class='uri'><%= item.remoteUrl %></div>
@@ -1104,6 +1273,10 @@ document.addEventListener("DOMContentLoaded", () => {
1104
1273
  </div>
1105
1274
  <% } %>
1106
1275
  </div>
1276
+ <div class="checkpoint-row-action" aria-hidden="true">
1277
+ <i class="fa-solid fa-clock-rotate-left"></i>
1278
+ <span>Manage</span>
1279
+ </div>
1107
1280
  </h3>
1108
1281
  </div>
1109
1282
  <% }) %>