synabun 2026.4.26 → 2026.4.27

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.
@@ -5094,15 +5094,51 @@
5094
5094
  }
5095
5095
  .update-backup-btn:hover { background: rgba(52,199,89,0.16); }
5096
5096
  .update-backup-btn:disabled { opacity: 0.5; pointer-events: none; }
5097
- .update-backup-status {
5098
- display: flex;
5099
- align-items: center;
5100
- gap: 8px;
5097
+ .update-backup-status {
5098
+ display: flex;
5099
+ align-items: center;
5100
+ gap: 8px;
5101
5101
  font-size: 11px;
5102
5102
  color: var(--t-muted);
5103
- padding: 4px 0;
5104
- }
5105
- .update-backup-icon { font-size: 14px; font-weight: 700; }
5103
+ padding: 4px 0;
5104
+ }
5105
+ .update-run-status {
5106
+ align-items: flex-start;
5107
+ gap: 10px;
5108
+ padding: 10px 12px;
5109
+ border-radius: var(--r-card);
5110
+ border: 1px solid rgba(255,255,255,0.08);
5111
+ background: rgba(255,255,255,0.045);
5112
+ color: var(--t-secondary);
5113
+ font-size: 12px;
5114
+ line-height: 1.4;
5115
+ }
5116
+ .update-run-status .update-backup-icon {
5117
+ flex: 0 0 auto;
5118
+ margin-top: 1px;
5119
+ }
5120
+ .update-run-status strong {
5121
+ display: block;
5122
+ color: var(--t-primary);
5123
+ font-size: 12px;
5124
+ font-weight: 600;
5125
+ margin-bottom: 2px;
5126
+ }
5127
+ .update-run-detail,
5128
+ .update-run-hint {
5129
+ display: block;
5130
+ color: var(--t-muted);
5131
+ }
5132
+ .update-run-hint {
5133
+ margin-top: 5px;
5134
+ opacity: .82;
5135
+ }
5136
+ .update-run-status code {
5137
+ font-family: var(--ff-mono);
5138
+ font-size: 11px;
5139
+ color: var(--t-secondary);
5140
+ }
5141
+ .update-backup-icon { font-size: 14px; font-weight: 700; }
5106
5142
  .update-backup-icon.spin { animation: updateSpin 1s linear infinite; }
5107
5143
  @keyframes updateSpin {
5108
5144
  from { transform: rotate(0deg); }
@@ -19449,150 +19485,150 @@
19449
19485
  }
19450
19486
  .sched-sidebar-new:hover { background: rgba(255,255,255,0.07); color: var(--t-bright); }
19451
19487
  .sched-sidebar-empty { color: var(--t-muted); font-size: 11px; padding: 8px 6px; }
19452
- .sched-sidebar-prompt {
19453
- margin-top: auto; display: inline-flex; align-items: center; justify-content: center; gap: 6px;
19454
- border: 1px solid rgba(255,255,255,0.09); border-radius: 8px;
19455
- background: rgba(255,255,255,0.04);
19456
- color: var(--t-secondary); min-height: 34px; cursor: pointer; font-family: inherit;
19457
- font-size: 12px; font-weight: 600; letter-spacing: 0;
19458
- box-shadow: var(--shadow-highlight);
19459
- transition: border-color 160ms ease, color 160ms ease, background 160ms ease, transform 120ms ease;
19460
- }
19461
- .sched-sidebar-prompt:hover {
19462
- background: rgba(255,255,255,0.075);
19463
- border-color: rgba(255,255,255,0.14);
19464
- color: var(--t-bright);
19465
- transform: translateY(-1px);
19466
- }
19467
- .sched-sidebar-prompt svg { width: 13px; height: 13px; color: var(--t-muted); }
19468
-
19469
- .sched-prompt-backdrop {
19470
- position: fixed; inset: 0; background: rgba(5,7,12,0.58);
19471
- backdrop-filter: blur(7px); -webkit-backdrop-filter: blur(7px);
19472
- z-index: 300010; opacity: 0; transition: opacity 160ms ease-out;
19473
- pointer-events: auto;
19474
- }
19475
- .sched-prompt-backdrop.open { opacity: 1; }
19476
- .sched-prompt-modal {
19477
- position: fixed; left: 50%; top: 50%; transform: translate(-50%, -52%) scale(0.98);
19478
- width: min(512px, calc(100vw - 32px)); padding: 0;
19479
- border-radius: 12px; z-index: 300011;
19480
- opacity: 0; transition: opacity 160ms ease-out, transform 200ms ease-out;
19481
- background:
19482
- linear-gradient(to bottom, rgba(255,255,255,0.035), rgba(255,255,255,0.01)),
19483
- rgba(13,15,20,0.96);
19484
- border: 1px solid rgba(255,255,255,0.085);
19485
- box-shadow: 0 22px 64px rgba(0,0,0,0.58), var(--shadow-highlight);
19486
- overflow: hidden;
19487
- }
19488
- .sched-prompt-modal.open { opacity: 1; transform: translate(-50%, -50%) scale(1); }
19489
- .sched-prompt-head {
19490
- display: flex; align-items: center; justify-content: space-between; gap: 12px;
19491
- padding: 15px 16px 13px;
19492
- border-bottom: 1px solid rgba(255,255,255,0.055);
19493
- }
19494
- .sched-prompt-head-text {
19495
- display: flex; align-items: center; gap: 10px; min-width: 0;
19496
- }
19497
- .sched-prompt-icon {
19498
- display: inline-flex; align-items: center; justify-content: center;
19499
- width: 30px; height: 30px; border-radius: 8px; flex: 0 0 auto;
19500
- background: rgba(255,255,255,0.055);
19501
- border: 1px solid rgba(255,255,255,0.075);
19502
- color: var(--t-secondary);
19503
- box-shadow: var(--shadow-highlight);
19504
- }
19505
- .sched-prompt-icon svg { width: 14px; height: 14px; }
19506
- .sched-prompt-head h3 {
19507
- margin: 0; font-family: var(--ff-heading); font-size: 14px; font-weight: 650;
19508
- color: var(--t-bright); letter-spacing: 0;
19509
- }
19510
- .sched-prompt-head p {
19511
- margin: 2px 0 0; font-size: 11.5px; line-height: 1.35; color: var(--t-muted);
19512
- }
19513
- .sched-prompt-close {
19514
- display: inline-flex; align-items: center; justify-content: center;
19515
- width: 28px; height: 28px; flex: 0 0 auto;
19516
- background: transparent; border: 1px solid transparent; border-radius: 7px;
19517
- color: var(--t-muted); cursor: pointer; padding: 0;
19518
- transition: background 150ms ease, border-color 150ms ease, color 150ms ease;
19519
- }
19520
- .sched-prompt-close:hover {
19521
- background: rgba(255,255,255,0.055);
19522
- border-color: rgba(255,255,255,0.075);
19523
- color: var(--t-bright);
19524
- }
19525
- .sched-prompt-close svg { width: 14px; height: 14px; }
19526
- .sched-prompt-tiles {
19527
- display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px;
19528
- padding: 14px 16px 16px;
19529
- }
19530
- @media (max-width: 560px) { .sched-prompt-tiles { grid-template-columns: 1fr; } }
19531
- .sched-prompt-tile {
19532
- position: relative; display: grid; grid-template-columns: 32px minmax(0, 1fr);
19533
- grid-template-areas: "logo pill" "body body"; align-content: start; gap: 10px 8px;
19534
- min-height: 96px; padding: 12px; border-radius: 10px; cursor: pointer; font-family: inherit;
19535
- background: rgba(255,255,255,0.032);
19536
- border: 1px solid rgba(255,255,255,0.065);
19537
- color: var(--t-secondary); text-align: left;
19538
- backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
19539
- transition: background 180ms ease, border-color 180ms ease, transform 160ms ease, box-shadow 180ms ease;
19540
- overflow: hidden;
19541
- }
19542
- .sched-prompt-tile:not(.disabled) {
19543
- background: rgba(255,255,255,0.045);
19544
- border-color: rgba(255,255,255,0.095);
19545
- box-shadow: var(--shadow-highlight);
19546
- }
19547
- .sched-prompt-tile:not(.disabled):hover {
19548
- background: rgba(255,255,255,0.065);
19549
- border-color: rgba(255,255,255,0.13);
19550
- color: var(--t-bright); transform: translateY(-1px);
19551
- box-shadow: var(--shadow-xs), var(--shadow-highlight);
19552
- }
19553
- .sched-prompt-tile:not(.disabled):active { transform: translateY(0); }
19554
- .sched-prompt-tile:focus-visible {
19555
- outline: none;
19556
- border-color: rgba(255,255,255,0.18);
19557
- box-shadow: 0 0 0 2px rgba(255,255,255,0.14), var(--shadow-highlight);
19558
- }
19559
- .sched-prompt-tile.disabled { opacity: 0.58; cursor: not-allowed; pointer-events: none; }
19560
- .sched-prompt-tile-logo {
19561
- grid-area: logo;
19562
- display: inline-flex; align-items: center; justify-content: center;
19563
- width: 32px; height: 32px; border-radius: 8px;
19564
- background: rgba(255,255,255,0.045);
19565
- border: 1px solid rgba(255,255,255,0.075);
19566
- color: color-mix(in srgb, var(--provider-color, #fff) 62%, var(--t-secondary));
19567
- box-shadow: var(--shadow-highlight);
19568
- }
19569
- .sched-prompt-tile-logo svg { width: 16px; height: 16px; display: block; }
19570
- .sched-prompt-tile-body {
19571
- grid-area: body; display: flex; flex-direction: column; gap: 2px; min-width: 0;
19572
- }
19573
- .sched-prompt-tile-title {
19574
- font-size: 12.5px; font-weight: 650; color: var(--t-secondary); letter-spacing: 0;
19575
- line-height: 1.2; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
19576
- }
19577
- .sched-prompt-tile:not(.disabled) .sched-prompt-tile-title {
19578
- color: color-mix(in srgb, var(--provider-color, #fff) 56%, var(--t-bright));
19579
- }
19580
- .sched-prompt-tile-sub {
19581
- font-size: 10.5px; color: var(--t-muted); letter-spacing: 0; line-height: 1.2;
19582
- white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
19583
- }
19584
- .sched-prompt-pill {
19585
- grid-area: pill; justify-self: end; align-self: start;
19586
- font-size: 10px; font-weight: 600; letter-spacing: 0;
19587
- padding: 2px 6px; border-radius: var(--r-pill);
19588
- background: rgba(255,255,255,0.045); color: var(--t-muted);
19589
- border: 1px solid rgba(255,255,255,0.06);
19590
- }
19591
- .sched-prompt-pill--active {
19592
- background: rgba(255,255,255,0.075);
19593
- border-color: rgba(255,255,255,0.12);
19594
- color: var(--t-secondary);
19595
- }
19488
+ .sched-sidebar-prompt {
19489
+ margin-top: auto; display: inline-flex; align-items: center; justify-content: center; gap: 6px;
19490
+ border: 1px solid rgba(255,255,255,0.09); border-radius: 8px;
19491
+ background: rgba(255,255,255,0.04);
19492
+ color: var(--t-secondary); min-height: 34px; cursor: pointer; font-family: inherit;
19493
+ font-size: 12px; font-weight: 600; letter-spacing: 0;
19494
+ box-shadow: var(--shadow-highlight);
19495
+ transition: border-color 160ms ease, color 160ms ease, background 160ms ease, transform 120ms ease;
19496
+ }
19497
+ .sched-sidebar-prompt:hover {
19498
+ background: rgba(255,255,255,0.075);
19499
+ border-color: rgba(255,255,255,0.14);
19500
+ color: var(--t-bright);
19501
+ transform: translateY(-1px);
19502
+ }
19503
+ .sched-sidebar-prompt svg { width: 13px; height: 13px; color: var(--t-muted); }
19504
+
19505
+ .sched-prompt-backdrop {
19506
+ position: fixed; inset: 0; background: rgba(5,7,12,0.58);
19507
+ backdrop-filter: blur(7px); -webkit-backdrop-filter: blur(7px);
19508
+ z-index: 300010; opacity: 0; transition: opacity 160ms ease-out;
19509
+ pointer-events: auto;
19510
+ }
19511
+ .sched-prompt-backdrop.open { opacity: 1; }
19512
+ .sched-prompt-modal {
19513
+ position: fixed; left: 50%; top: 50%; transform: translate(-50%, -52%) scale(0.98);
19514
+ width: min(512px, calc(100vw - 32px)); padding: 0;
19515
+ border-radius: 12px; z-index: 300011;
19516
+ opacity: 0; transition: opacity 160ms ease-out, transform 200ms ease-out;
19517
+ background:
19518
+ linear-gradient(to bottom, rgba(255,255,255,0.035), rgba(255,255,255,0.01)),
19519
+ rgba(13,15,20,0.96);
19520
+ border: 1px solid rgba(255,255,255,0.085);
19521
+ box-shadow: 0 22px 64px rgba(0,0,0,0.58), var(--shadow-highlight);
19522
+ overflow: hidden;
19523
+ }
19524
+ .sched-prompt-modal.open { opacity: 1; transform: translate(-50%, -50%) scale(1); }
19525
+ .sched-prompt-head {
19526
+ display: flex; align-items: center; justify-content: space-between; gap: 12px;
19527
+ padding: 15px 16px 13px;
19528
+ border-bottom: 1px solid rgba(255,255,255,0.055);
19529
+ }
19530
+ .sched-prompt-head-text {
19531
+ display: flex; align-items: center; gap: 10px; min-width: 0;
19532
+ }
19533
+ .sched-prompt-icon {
19534
+ display: inline-flex; align-items: center; justify-content: center;
19535
+ width: 30px; height: 30px; border-radius: 8px; flex: 0 0 auto;
19536
+ background: rgba(255,255,255,0.055);
19537
+ border: 1px solid rgba(255,255,255,0.075);
19538
+ color: var(--t-secondary);
19539
+ box-shadow: var(--shadow-highlight);
19540
+ }
19541
+ .sched-prompt-icon svg { width: 14px; height: 14px; }
19542
+ .sched-prompt-head h3 {
19543
+ margin: 0; font-family: var(--ff-heading); font-size: 14px; font-weight: 650;
19544
+ color: var(--t-bright); letter-spacing: 0;
19545
+ }
19546
+ .sched-prompt-head p {
19547
+ margin: 2px 0 0; font-size: 11.5px; line-height: 1.35; color: var(--t-muted);
19548
+ }
19549
+ .sched-prompt-close {
19550
+ display: inline-flex; align-items: center; justify-content: center;
19551
+ width: 28px; height: 28px; flex: 0 0 auto;
19552
+ background: transparent; border: 1px solid transparent; border-radius: 7px;
19553
+ color: var(--t-muted); cursor: pointer; padding: 0;
19554
+ transition: background 150ms ease, border-color 150ms ease, color 150ms ease;
19555
+ }
19556
+ .sched-prompt-close:hover {
19557
+ background: rgba(255,255,255,0.055);
19558
+ border-color: rgba(255,255,255,0.075);
19559
+ color: var(--t-bright);
19560
+ }
19561
+ .sched-prompt-close svg { width: 14px; height: 14px; }
19562
+ .sched-prompt-tiles {
19563
+ display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px;
19564
+ padding: 14px 16px 16px;
19565
+ }
19566
+ @media (max-width: 560px) { .sched-prompt-tiles { grid-template-columns: 1fr; } }
19567
+ .sched-prompt-tile {
19568
+ position: relative; display: grid; grid-template-columns: 32px minmax(0, 1fr);
19569
+ grid-template-areas: "logo pill" "body body"; align-content: start; gap: 10px 8px;
19570
+ min-height: 96px; padding: 12px; border-radius: 10px; cursor: pointer; font-family: inherit;
19571
+ background: rgba(255,255,255,0.032);
19572
+ border: 1px solid rgba(255,255,255,0.065);
19573
+ color: var(--t-secondary); text-align: left;
19574
+ backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
19575
+ transition: background 180ms ease, border-color 180ms ease, transform 160ms ease, box-shadow 180ms ease;
19576
+ overflow: hidden;
19577
+ }
19578
+ .sched-prompt-tile:not(.disabled) {
19579
+ background: rgba(255,255,255,0.045);
19580
+ border-color: rgba(255,255,255,0.095);
19581
+ box-shadow: var(--shadow-highlight);
19582
+ }
19583
+ .sched-prompt-tile:not(.disabled):hover {
19584
+ background: rgba(255,255,255,0.065);
19585
+ border-color: rgba(255,255,255,0.13);
19586
+ color: var(--t-bright); transform: translateY(-1px);
19587
+ box-shadow: var(--shadow-xs), var(--shadow-highlight);
19588
+ }
19589
+ .sched-prompt-tile:not(.disabled):active { transform: translateY(0); }
19590
+ .sched-prompt-tile:focus-visible {
19591
+ outline: none;
19592
+ border-color: rgba(255,255,255,0.18);
19593
+ box-shadow: 0 0 0 2px rgba(255,255,255,0.14), var(--shadow-highlight);
19594
+ }
19595
+ .sched-prompt-tile.disabled { opacity: 0.58; cursor: not-allowed; pointer-events: none; }
19596
+ .sched-prompt-tile-logo {
19597
+ grid-area: logo;
19598
+ display: inline-flex; align-items: center; justify-content: center;
19599
+ width: 32px; height: 32px; border-radius: 8px;
19600
+ background: rgba(255,255,255,0.045);
19601
+ border: 1px solid rgba(255,255,255,0.075);
19602
+ color: color-mix(in srgb, var(--provider-color, #fff) 62%, var(--t-secondary));
19603
+ box-shadow: var(--shadow-highlight);
19604
+ }
19605
+ .sched-prompt-tile-logo svg { width: 16px; height: 16px; display: block; }
19606
+ .sched-prompt-tile-body {
19607
+ grid-area: body; display: flex; flex-direction: column; gap: 2px; min-width: 0;
19608
+ }
19609
+ .sched-prompt-tile-title {
19610
+ font-size: 12.5px; font-weight: 650; color: var(--t-secondary); letter-spacing: 0;
19611
+ line-height: 1.2; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
19612
+ }
19613
+ .sched-prompt-tile:not(.disabled) .sched-prompt-tile-title {
19614
+ color: color-mix(in srgb, var(--provider-color, #fff) 56%, var(--t-bright));
19615
+ }
19616
+ .sched-prompt-tile-sub {
19617
+ font-size: 10.5px; color: var(--t-muted); letter-spacing: 0; line-height: 1.2;
19618
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
19619
+ }
19620
+ .sched-prompt-pill {
19621
+ grid-area: pill; justify-self: end; align-self: start;
19622
+ font-size: 10px; font-weight: 600; letter-spacing: 0;
19623
+ padding: 2px 6px; border-radius: var(--r-pill);
19624
+ background: rgba(255,255,255,0.045); color: var(--t-muted);
19625
+ border: 1px solid rgba(255,255,255,0.06);
19626
+ }
19627
+ .sched-prompt-pill--active {
19628
+ background: rgba(255,255,255,0.075);
19629
+ border-color: rgba(255,255,255,0.12);
19630
+ color: var(--t-secondary);
19631
+ }
19596
19632
 
19597
19633
  .sched-main { flex: 1; min-width: 0; min-height: 0; display: flex; flex-direction: column; }
19598
19634
  .sched-tabs {
@@ -24315,3 +24351,73 @@
24315
24351
  .ig-lb-prev { left: 16px; }
24316
24352
  .ig-lb-next { right: 16px; }
24317
24353
 
24354
+ /* ── Update-check toast (Apps > Check for updates) ── */
24355
+ .update-check-toast {
24356
+ position: fixed;
24357
+ right: 20px;
24358
+ bottom: 80px;
24359
+ z-index: 300050;
24360
+ display: flex;
24361
+ gap: 12px;
24362
+ align-items: flex-start;
24363
+ min-width: 240px;
24364
+ max-width: 360px;
24365
+ padding: 12px 14px;
24366
+ border-radius: 14px;
24367
+ background: rgba(20, 20, 24, 0.85);
24368
+ backdrop-filter: blur(20px) saturate(160%);
24369
+ -webkit-backdrop-filter: blur(20px) saturate(160%);
24370
+ border: 1px solid rgba(255, 255, 255, 0.08);
24371
+ color: var(--t-text);
24372
+ font-size: 12px;
24373
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
24374
+ opacity: 0;
24375
+ transform: translateY(8px);
24376
+ transition: opacity 0.25s ease, transform 0.25s ease, background 0.15s ease;
24377
+ pointer-events: auto;
24378
+ }
24379
+ .update-check-toast.show { opacity: 1; transform: translateY(0); }
24380
+ .update-check-toast--clickable { cursor: pointer; }
24381
+ .update-check-toast--clickable:hover { background: rgba(28, 28, 32, 0.92); }
24382
+ .update-check-toast .utc-icon {
24383
+ width: 24px; height: 24px;
24384
+ border-radius: 50%;
24385
+ display: flex; align-items: center; justify-content: center;
24386
+ font-weight: 700; font-size: 14px;
24387
+ flex-shrink: 0;
24388
+ }
24389
+ .update-check-toast .utc-icon--up { background: rgba(52, 199, 89, 0.18); color: #34c759; }
24390
+ .update-check-toast .utc-icon--ok { background: rgba(52, 199, 89, 0.18); color: #34c759; }
24391
+ .update-check-toast .utc-icon--err { background: rgba(255, 69, 58, 0.18); color: #ff453a; }
24392
+ .update-check-toast .utc-body { flex: 1; min-width: 0; }
24393
+ .update-check-toast .utc-title { font-weight: 600; margin-bottom: 4px; }
24394
+ .update-check-toast .utc-list { list-style: none; margin: 0; padding: 0; }
24395
+ .update-check-toast .utc-list li { padding: 2px 0; color: var(--t-muted); }
24396
+ .update-check-toast .utc-list li .utc-src {
24397
+ display: inline-block;
24398
+ padding: 1px 6px;
24399
+ margin-left: 6px;
24400
+ border-radius: 6px;
24401
+ font-size: 10px;
24402
+ background: rgba(255, 255, 255, 0.08);
24403
+ color: var(--t-text);
24404
+ }
24405
+ .update-check-toast .utc-sub { color: var(--t-muted); }
24406
+ .update-check-toast .utc-hint { color: var(--t-muted); opacity: 0.7; margin-top: 6px; font-size: 11px; }
24407
+
24408
+ .update-channel-pill {
24409
+ display: inline-block;
24410
+ padding: 2px 8px;
24411
+ margin-left: 8px;
24412
+ font-size: 10px;
24413
+ font-weight: 600;
24414
+ letter-spacing: 0.04em;
24415
+ text-transform: uppercase;
24416
+ border-radius: 6px;
24417
+ vertical-align: middle;
24418
+ background: rgba(255, 159, 10, 0.18);
24419
+ color: #ff9f0a;
24420
+ }
24421
+ .update-channel-pill--beta { background: rgba(255, 159, 10, 0.18); color: #ff9f0a; }
24422
+
24423
+
@@ -439,7 +439,7 @@ function injectStyles() {
439
439
  grid-template-columns: auto 1fr auto;
440
440
  gap: 10px;
441
441
  align-items: center;
442
- margin: 8px 12px 0;
442
+ margin: 6px 8px 0;
443
443
  padding: 10px 12px;
444
444
  border: 1px solid rgba(255,180,80,0.45);
445
445
  border-radius: 8px;
@@ -7331,8 +7331,8 @@ let _cliInstallFailureForced = false;
7331
7331
  function _ensureCliBannerEl() {
7332
7332
  if (!_panel) return null;
7333
7333
  const container = _panel.querySelector('#cp-messages-container');
7334
- if (!container) return null;
7335
- let banner = container.querySelector(':scope > .cp-cli-banner');
7334
+ if (!container || !container.parentNode) return null;
7335
+ let banner = container.parentNode.querySelector(':scope > .cp-cli-banner');
7336
7336
  if (banner) return banner;
7337
7337
  const label = getCliLabel('claude-code');
7338
7338
  const cmd = getCliInstallCommand('claude-code');
@@ -7350,7 +7350,7 @@ function _ensureCliBannerEl() {
7350
7350
  <button class="cp-cli-banner-recheck" type="button">Re-check</button>
7351
7351
  </div>
7352
7352
  `;
7353
- container.insertBefore(banner, container.firstChild);
7353
+ container.parentNode.insertBefore(banner, container);
7354
7354
  const btn = banner.querySelector('.cp-cli-banner-recheck');
7355
7355
  btn?.addEventListener('click', async () => {
7356
7356
  btn.disabled = true;
@@ -7368,7 +7368,7 @@ function _ensureCliBannerEl() {
7368
7368
 
7369
7369
  function _removeCliBannerEl() {
7370
7370
  if (!_panel) return;
7371
- const banner = _panel.querySelector('#cp-messages-container > .cp-cli-banner');
7371
+ const banner = _panel.querySelector(':scope > .cp-cli-banner');
7372
7372
  banner?.remove();
7373
7373
  }
7374
7374
 
@@ -12,7 +12,8 @@ import { openHelp } from './ui-help.js';
12
12
  import { registerAction } from './ui-keybinds.js';
13
13
  import { isGuest, hasPermission } from './ui-sync.js';
14
14
  import { sendToPanel } from './ui-claude-panel.js';
15
- import { forceCheckToolUpdates } from './ui-tool-updates.js';
15
+ import { forceCheckToolUpdates, showUpdateToast, TOOL_LABELS } from './ui-tool-updates.js';
16
+ import { forceCheckSynabunUpdate, openSynabunUpdateModal } from './ui-update.js';
16
17
 
17
18
  const $ = (id) => document.getElementById(id);
18
19
 
@@ -127,12 +128,12 @@ export function initMenubar() {
127
128
  'menu-open-skills-studio': 'skills',
128
129
  'menu-skills-new': 'skills',
129
130
  'menu-skills-import': 'skills',
130
- 'menu-open-automation-studio': 'automations',
131
- 'menu-automations-schedule-new': 'automations',
132
- 'menu-automations-quick-timer': 'automations',
133
- 'menu-automations-schedule-groups': 'automations',
134
- 'menu-automations-new': 'automations',
135
- 'menu-automations-import': 'automations',
131
+ 'menu-open-automation-studio': 'automations',
132
+ 'menu-automations-schedule-new': 'automations',
133
+ 'menu-automations-quick-timer': 'automations',
134
+ 'menu-automations-schedule-groups': 'automations',
135
+ 'menu-automations-new': 'automations',
136
+ 'menu-automations-import': 'automations',
136
137
  'menu-terminal-claude': 'terminal',
137
138
  'menu-terminal-codex': 'terminal',
138
139
  'menu-terminal-gemini': 'terminal',
@@ -316,34 +317,34 @@ function wireAutomationsMenu() {
316
317
  emit('automations:open');
317
318
  });
318
319
  }
319
- const schedulesItem = $('menu-automations-schedules');
320
- if (schedulesItem) {
321
- schedulesItem.addEventListener('click', () => {
322
- closeAll();
323
- emit('automations:open-schedules');
324
- });
325
- }
326
- const newScheduleItem = $('menu-automations-schedule-new');
327
- if (newScheduleItem) {
328
- newScheduleItem.addEventListener('click', () => {
329
- closeAll();
330
- emit('automations:open-schedules', { action: 'new-schedule' });
331
- });
332
- }
333
- const quickTimerItem = $('menu-automations-quick-timer');
334
- if (quickTimerItem) {
335
- quickTimerItem.addEventListener('click', () => {
336
- closeAll();
337
- emit('automations:open-schedules', { action: 'quick-timer' });
338
- });
339
- }
340
- const scheduleGroupsItem = $('menu-automations-schedule-groups');
341
- if (scheduleGroupsItem) {
342
- scheduleGroupsItem.addEventListener('click', () => {
343
- closeAll();
344
- emit('automations:open-schedules', { tab: 'groups' });
345
- });
346
- }
320
+ const schedulesItem = $('menu-automations-schedules');
321
+ if (schedulesItem) {
322
+ schedulesItem.addEventListener('click', () => {
323
+ closeAll();
324
+ emit('automations:open-schedules');
325
+ });
326
+ }
327
+ const newScheduleItem = $('menu-automations-schedule-new');
328
+ if (newScheduleItem) {
329
+ newScheduleItem.addEventListener('click', () => {
330
+ closeAll();
331
+ emit('automations:open-schedules', { action: 'new-schedule' });
332
+ });
333
+ }
334
+ const quickTimerItem = $('menu-automations-quick-timer');
335
+ if (quickTimerItem) {
336
+ quickTimerItem.addEventListener('click', () => {
337
+ closeAll();
338
+ emit('automations:open-schedules', { action: 'quick-timer' });
339
+ });
340
+ }
341
+ const scheduleGroupsItem = $('menu-automations-schedule-groups');
342
+ if (scheduleGroupsItem) {
343
+ scheduleGroupsItem.addEventListener('click', () => {
344
+ closeAll();
345
+ emit('automations:open-schedules', { tab: 'groups' });
346
+ });
347
+ }
347
348
  const newItem = $('menu-automations-new');
348
349
  if (newItem) {
349
350
  newItem.addEventListener('click', () => {
@@ -370,7 +371,34 @@ function wireTerminalMenu() {
370
371
  'menu-terminal-codex': () => emit('terminal:open', { profile: 'codex' }),
371
372
  'menu-terminal-gemini': () => emit('terminal:open', { profile: 'gemini' }),
372
373
  'menu-terminal-opencode': () => emit('terminal:open', { profile: 'opencode' }),
373
- 'menu-check-cli-updates': () => forceCheckToolUpdates(),
374
+ 'menu-check-cli-updates': async () => {
375
+ const [tools, syn] = await Promise.all([
376
+ forceCheckToolUpdates(),
377
+ forceCheckSynabunUpdate(),
378
+ ]);
379
+
380
+ const updates = [];
381
+ for (const [key, info] of Object.entries(tools?.tools || {})) {
382
+ if (info?.updateAvailable) {
383
+ const label = `${TOOL_LABELS[key] || key} v${info.installed} → v${info.latest}`;
384
+ updates.push({ label });
385
+ }
386
+ }
387
+ if (syn?.updateAvailable) {
388
+ const srcLabel = syn.source === 'both' ? 'npm + GitHub' : syn.source === 'github' ? 'GitHub' : 'npm';
389
+ updates.push({ label: `SynaBun v${syn.current} → v${syn.latest}`, source: srcLabel });
390
+ }
391
+
392
+ const errors = [];
393
+ if (!tools) errors.push('CLI versions');
394
+ if (!syn) errors.push('SynaBun version');
395
+
396
+ showUpdateToast({
397
+ updates,
398
+ errors,
399
+ onClick: syn?.updateAvailable ? () => openSynabunUpdateModal() : null,
400
+ });
401
+ },
374
402
  'menu-terminal-shell': () => emit('terminal:open', { profile: 'shell' }),
375
403
  'menu-terminal-browser': () => emit('browser:open'),
376
404
  'menu-terminal-youtube': () => emit('browser:open', { url: 'https://www.youtube.com' }),