claude-code-kanban 7.4.0 → 7.6.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 (48) hide show
  1. package/README.md +5 -3
  2. package/cli.js +95 -29
  3. package/hub-app.json +5 -0
  4. package/lib/panes.js +41 -6
  5. package/lib/parsers.js +42 -3
  6. package/lib/retention.js +54 -6
  7. package/lib/scratchpad-dir.js +19 -2
  8. package/lib/session-cache.js +1 -1
  9. package/lib/session-events.js +174 -47
  10. package/lib/show.js +385 -0
  11. package/lib/task-dir.js +26 -0
  12. package/lib/terminal-client.js +14 -1
  13. package/lib/terminal-host.js +2 -1
  14. package/lib/terminal.js +28 -8
  15. package/package.json +1 -1
  16. package/plugin/plugins/claude-code-kanban/.claude-plugin/plugin.json +2 -5
  17. package/plugin/plugins/claude-code-kanban/hooks/doorbell.ts +136 -0
  18. package/plugin/plugins/claude-code-kanban/hooks/index.ts +4 -0
  19. package/plugin/plugins/claude-code-kanban/hooks/show.ts +120 -0
  20. package/plugin/plugins/claude-code-kanban/skills/dispatch/SKILL.md +2 -0
  21. package/plugin/plugins/claude-code-kanban/skills/kanban/SKILL.md +3 -3
  22. package/plugin/plugins/claude-code-kanban/skills/show/SKILL.md +45 -0
  23. package/plugin/plugins/claude-code-kanban/skills/show/references/NOTICE.md +27 -0
  24. package/plugin/plugins/claude-code-kanban/skills/show/references/chart.md +58 -0
  25. package/plugin/plugins/claude-code-kanban/skills/show/references/diagram/architecture.md +18 -0
  26. package/plugin/plugins/claude-code-kanban/skills/show/references/diagram/er.md +10 -0
  27. package/plugin/plugins/claude-code-kanban/skills/show/references/diagram/flow.md +13 -0
  28. package/plugin/plugins/claude-code-kanban/skills/show/references/diagram/layers.md +10 -0
  29. package/plugin/plugins/claude-code-kanban/skills/show/references/diagram/sequence.md +19 -0
  30. package/plugin/plugins/claude-code-kanban/skills/show/references/diagram/state.md +12 -0
  31. package/plugin/plugins/claude-code-kanban/skills/show/references/diagram/swimlane.md +10 -0
  32. package/plugin/plugins/claude-code-kanban/skills/show/references/diagram/timeline.md +9 -0
  33. package/plugin/plugins/claude-code-kanban/skills/show/references/diagram/tree.md +10 -0
  34. package/plugin/plugins/claude-code-kanban/skills/show/references/diagram.md +87 -0
  35. package/plugin/plugins/claude-code-kanban/skills/show/references/explain.md +98 -0
  36. package/plugin/plugins/claude-code-kanban/skills/show/references/mockup.md +30 -0
  37. package/plugin/plugins/claude-code-kanban/tests/doorbell.test.ts +133 -0
  38. package/plugin/plugins/claude-code-kanban/tests/show.test.ts +137 -0
  39. package/public/app.js +2151 -1108
  40. package/public/index.html +19 -36
  41. package/public/style.css +1047 -125
  42. package/public/terminal-frame.js +0 -2
  43. package/public/tree-highlight.js +137 -15
  44. package/server.js +237 -178
  45. package/lib/dispatch.js +0 -32
  46. package/plugin/plugins/claude-code-kanban/monitors.json +0 -8
  47. package/plugin/plugins/claude-code-kanban/scripts/postman.js +0 -82
  48. package/plugin/plugins/claude-code-kanban/skills/follow/SKILL.md +0 -47
package/public/style.css CHANGED
@@ -25,9 +25,19 @@
25
25
  --warning-dim: rgba(240, 180, 41, 0.18);
26
26
  --danger: #ef5350;
27
27
  --danger-dim: rgba(239, 83, 80, 0.18);
28
- --team: #60a5fa;
28
+ --info: #60a5fa;
29
29
  --plan: #86a886;
30
30
  --plan-dim: rgba(134, 168, 134, 0.18);
31
+ --owner-blue: #9cc2fb;
32
+ --owner-purple: #cdb8fa;
33
+ --owner-teal: #7fe2c9;
34
+ --owner-orange: #f7ad8b;
35
+ --owner-yellow: #ecce7a;
36
+ --owner-pink: #f8a9cf;
37
+ --owner-green: #9be1ab;
38
+ --owner-indigo: #c0c2fc;
39
+ --owner-red: #f9a3a3;
40
+ --owner-cyan: #7dd8ea;
31
41
  --ansi-red: #e06c66;
32
42
  --ansi-green: #3ecf8e;
33
43
  --ansi-yellow: #e0b04a;
@@ -852,7 +862,8 @@ body.booting .session-skeleton {
852
862
  display: flex;
853
863
  }
854
864
 
855
- .session-skeleton span {
865
+ .session-skeleton span,
866
+ .msg-log-loading-row span {
856
867
  height: 9px;
857
868
  width: 70%;
858
869
  border-radius: 4px;
@@ -927,6 +938,7 @@ body.booting .boot-splash {
927
938
 
928
939
  @media (prefers-reduced-motion: reduce) {
929
940
  .session-skeleton span,
941
+ .msg-log-loading-row span,
930
942
  .clawd-jump {
931
943
  animation: none;
932
944
  }
@@ -1039,7 +1051,9 @@ body.booting .boot-splash {
1039
1051
  }
1040
1052
 
1041
1053
  .session-item.unread::before,
1042
- .session-item.permission-pending::before {
1054
+ .session-item.permission-pending::before,
1055
+ .sp-row.unread::before,
1056
+ .sp-row.permission-pending::before {
1043
1057
  content: '';
1044
1058
  position: absolute;
1045
1059
  inset: -1px;
@@ -1048,13 +1062,15 @@ body.booting .boot-splash {
1048
1062
  pointer-events: none;
1049
1063
  }
1050
1064
 
1051
- .session-item.permission-pending::before {
1065
+ .session-item.permission-pending::before,
1066
+ .sp-row.permission-pending::before {
1052
1067
  border-left-color: var(--warning);
1053
1068
  animation: agent-badge-pulse 1.6s ease-in-out infinite;
1054
1069
  }
1055
1070
 
1056
1071
  @media (prefers-reduced-motion: reduce) {
1057
- .session-item.permission-pending::before {
1072
+ .session-item.permission-pending::before,
1073
+ .sp-row.permission-pending::before {
1058
1074
  animation: none;
1059
1075
  }
1060
1076
  }
@@ -2285,8 +2301,8 @@ body.booting .boot-splash {
2285
2301
  }
2286
2302
 
2287
2303
  .detail-box.active {
2288
- background: rgba(232, 111, 51, 0.08);
2289
- border: 1px solid rgba(232, 111, 51, 0.2);
2304
+ background: color-mix(in srgb, var(--accent) 8%, transparent);
2305
+ border: 1px solid color-mix(in srgb, var(--accent) 20%, transparent);
2290
2306
  color: var(--text-primary);
2291
2307
  }
2292
2308
 
@@ -2441,7 +2457,8 @@ body.booting .boot-splash {
2441
2457
  .detail-desc pre code {
2442
2458
  background: color-mix(in srgb, var(--text-muted) 8%, transparent);
2443
2459
  border: 1px solid color-mix(in srgb, var(--border) 55%, transparent);
2444
- padding: 12px;
2460
+ --code-pad-x: 12px;
2461
+ padding: 12px var(--code-pad-x);
2445
2462
  border-radius: 6px;
2446
2463
  display: block;
2447
2464
  overflow-x: auto;
@@ -2455,6 +2472,163 @@ code.language-tree .hljs-title {
2455
2472
  font-weight: 600;
2456
2473
  }
2457
2474
 
2475
+ code.ct {
2476
+ --ct-line: color-mix(in srgb, var(--text-muted) 85%, transparent);
2477
+ }
2478
+
2479
+ /* One grid column: every row stretches to the widest one, so the bands line up when the block scrolls.
2480
+ The rows hold the side padding, so a band and the focus bar run to the block's edges. A container
2481
+ sets --code-pad-x to its code blocks' side padding. */
2482
+ pre code.hljs.ct {
2483
+ display: grid;
2484
+ padding-inline: 0;
2485
+ }
2486
+
2487
+ code.ct .ct-name {
2488
+ color: var(--text-primary);
2489
+ font-weight: 600;
2490
+ }
2491
+
2492
+ code.ct .ct-lib:not(.ct-focus) .ct-name {
2493
+ font-weight: 400;
2494
+ }
2495
+
2496
+ code.ct .ct-row {
2497
+ min-width: max-content;
2498
+ padding-inline: var(--code-pad-x, 10px);
2499
+ }
2500
+
2501
+ code.ct .ct-row:empty::before {
2502
+ content: ' ';
2503
+ }
2504
+
2505
+ code.ct .ct-nl,
2506
+ code.ct .ct-hidden {
2507
+ display: none;
2508
+ }
2509
+
2510
+ code.ct .ct-g {
2511
+ display: inline-block;
2512
+ position: relative;
2513
+ height: 1lh;
2514
+ vertical-align: top;
2515
+ }
2516
+
2517
+ code.ct .ct-g::before,
2518
+ code.ct .ct-g::after {
2519
+ content: '';
2520
+ position: absolute;
2521
+ }
2522
+
2523
+ code.ct .ct-v::before,
2524
+ code.ct .ct-t::before,
2525
+ code.ct .ct-l::before {
2526
+ left: 50%;
2527
+ top: 0;
2528
+ bottom: 0;
2529
+ border-left: 1px solid var(--ct-line);
2530
+ }
2531
+
2532
+ code.ct .ct-l::before {
2533
+ bottom: 50%;
2534
+ }
2535
+
2536
+ code.ct .ct-t::after,
2537
+ code.ct .ct-l::after,
2538
+ code.ct .ct-h::after {
2539
+ left: 50%;
2540
+ right: 0;
2541
+ top: 50%;
2542
+ border-top: 1px solid var(--ct-line);
2543
+ }
2544
+
2545
+ code.ct .ct-h::after {
2546
+ left: 0;
2547
+ right: 2px;
2548
+ }
2549
+
2550
+ code.ct .ct-note,
2551
+ code.ct .ct-star {
2552
+ color: var(--text-muted);
2553
+ }
2554
+
2555
+ code.ct .ct-fold {
2556
+ color: var(--text-muted);
2557
+ font-style: italic;
2558
+ }
2559
+
2560
+ code.ct .ct-loc {
2561
+ color: var(--accent-text);
2562
+ text-decoration: underline dotted;
2563
+ text-underline-offset: 3px;
2564
+ }
2565
+
2566
+ code.ct .ct-focus {
2567
+ background: color-mix(in srgb, var(--accent) 14%, transparent);
2568
+ box-shadow: inset 2px 0 0 var(--accent);
2569
+ }
2570
+
2571
+ code.ct .ct-add {
2572
+ --ct-change: var(--success);
2573
+ }
2574
+
2575
+ code.ct .ct-del {
2576
+ --ct-change: var(--danger);
2577
+ }
2578
+
2579
+ code.ct :is(.ct-add, .ct-del) {
2580
+ background: color-mix(in srgb, var(--ct-change) 10%, transparent);
2581
+ }
2582
+
2583
+ code.ct .ct-m {
2584
+ color: var(--ct-change);
2585
+ font-weight: 600;
2586
+ }
2587
+
2588
+ code.ct .ct-has {
2589
+ cursor: pointer;
2590
+ }
2591
+
2592
+ code.ct .ct-has:hover,
2593
+ code.ct .ct-has:focus-visible {
2594
+ background: color-mix(in srgb, var(--text-muted) 12%, transparent);
2595
+ outline: none;
2596
+ }
2597
+
2598
+ code.ct .ct-has .ct-tilde {
2599
+ display: inline-block;
2600
+ color: transparent;
2601
+ position: relative;
2602
+ }
2603
+
2604
+ code.ct .ct-has .ct-tilde::after {
2605
+ content: '▸';
2606
+ position: absolute;
2607
+ inset: 0;
2608
+ color: var(--text-muted);
2609
+ font-style: normal;
2610
+ text-align: center;
2611
+ transition: transform 0.12s;
2612
+ }
2613
+
2614
+ code.ct .ct-has[aria-expanded='true'] .ct-tilde::after {
2615
+ transform: rotate(90deg);
2616
+ }
2617
+
2618
+ /* Out of flow, so the notes stay in their column: it sits in the gap after the name. */
2619
+ code.ct .ct-has[aria-expanded='false'] .ct-name {
2620
+ position: relative;
2621
+ }
2622
+
2623
+ code.ct .ct-has[aria-expanded='false'] .ct-name::after {
2624
+ content: '…';
2625
+ position: absolute;
2626
+ left: 100%;
2627
+ padding-left: 0.3ch;
2628
+ color: var(--text-muted);
2629
+ font-weight: 400;
2630
+ }
2631
+
2458
2632
  .detail-desc code {
2459
2633
  background: color-mix(in srgb, var(--text-muted) 12%, transparent);
2460
2634
  border: 1px solid color-mix(in srgb, var(--border) 45%, transparent);
@@ -2720,7 +2894,7 @@ code.language-tree .hljs-title {
2720
2894
  }
2721
2895
 
2722
2896
  .wf-phase-mark.done {
2723
- color: var(--ok, #3fb950);
2897
+ color: var(--success);
2724
2898
  }
2725
2899
 
2726
2900
  .wf-phase-title {
@@ -2777,7 +2951,7 @@ code.language-tree .hljs-title {
2777
2951
  }
2778
2952
 
2779
2953
  .wf-agent-status.done {
2780
- color: var(--ok, #3fb950);
2954
+ color: var(--success);
2781
2955
  }
2782
2956
 
2783
2957
  .wf-agent-status.running {
@@ -3038,9 +3212,9 @@ code.language-tree .hljs-title {
3038
3212
  text-transform: capitalize;
3039
3213
  }
3040
3214
  .agent-chip-running {
3041
- background: rgba(34, 197, 94, 0.15);
3042
- color: rgb(34, 160, 80);
3043
- border-color: rgba(34, 197, 94, 0.3);
3215
+ background: var(--success-dim);
3216
+ color: color-mix(in srgb, var(--success) 45%, var(--text-primary));
3217
+ border-color: color-mix(in srgb, var(--success) 35%, transparent);
3044
3218
  }
3045
3219
  .agent-chip-stopped {
3046
3220
  background: rgba(127, 127, 127, 0.15);
@@ -3049,9 +3223,9 @@ code.language-tree .hljs-title {
3049
3223
  }
3050
3224
  .agent-chip-error,
3051
3225
  .agent-chip-failed {
3052
- background: rgba(239, 68, 68, 0.15);
3053
- color: rgb(220, 60, 60);
3054
- border-color: rgba(239, 68, 68, 0.3);
3226
+ background: var(--danger-dim);
3227
+ color: color-mix(in srgb, var(--danger) 55%, var(--text-primary));
3228
+ border-color: color-mix(in srgb, var(--danger) 35%, transparent);
3055
3229
  }
3056
3230
  .team-modal-desc {
3057
3231
  font-size: 12px;
@@ -3119,6 +3293,49 @@ code.language-tree .hljs-title {
3119
3293
  }
3120
3294
  }
3121
3295
 
3296
+ .plan-card {
3297
+ margin-bottom: 16px;
3298
+ padding: 10px 14px;
3299
+ background: var(--bg-elevated);
3300
+ border: 1px solid var(--border);
3301
+ border-radius: 8px;
3302
+ cursor: pointer;
3303
+ display: flex;
3304
+ align-items: center;
3305
+ gap: 10px;
3306
+ transition: all 0.15s ease;
3307
+ }
3308
+ .plan-card:hover {
3309
+ border-color: var(--accent);
3310
+ background: var(--bg-hover);
3311
+ }
3312
+ .plan-card-icon {
3313
+ font-size: 14px;
3314
+ }
3315
+ .plan-card-text {
3316
+ flex: 1;
3317
+ min-width: 0;
3318
+ }
3319
+ .plan-card-label {
3320
+ font-size: 11px;
3321
+ font-weight: 500;
3322
+ color: var(--text-muted);
3323
+ text-transform: uppercase;
3324
+ letter-spacing: 0.5px;
3325
+ }
3326
+ .plan-card-title {
3327
+ font-size: 13px;
3328
+ color: var(--text-primary);
3329
+ white-space: nowrap;
3330
+ overflow: hidden;
3331
+ text-overflow: ellipsis;
3332
+ }
3333
+ .plan-card-chevron {
3334
+ width: 16px;
3335
+ height: 16px;
3336
+ flex-shrink: 0;
3337
+ }
3338
+
3122
3339
  /* #endregion */
3123
3340
 
3124
3341
  /* #region OWNER_FILTER */
@@ -3170,13 +3387,27 @@ code.language-tree .hljs-title {
3170
3387
  }
3171
3388
 
3172
3389
  .terminal-bar {
3390
+ position: absolute;
3391
+ z-index: 3;
3392
+ top: 16px;
3393
+ right: 20px;
3173
3394
  display: flex;
3174
3395
  align-items: center;
3175
- justify-content: space-between;
3176
3396
  gap: 8px;
3177
3397
  font-family: var(--font-mono);
3178
3398
  font-size: 12px;
3179
3399
  color: var(--text-muted);
3400
+ pointer-events: none;
3401
+ }
3402
+
3403
+ .terminal-bar > * {
3404
+ pointer-events: auto;
3405
+ }
3406
+
3407
+ .terminal-status:not(:empty) {
3408
+ padding: 2px 8px;
3409
+ border-radius: 4px;
3410
+ background: var(--bg-surface);
3180
3411
  }
3181
3412
 
3182
3413
  .terminal-host {
@@ -3303,138 +3534,652 @@ code.language-tree .hljs-title {
3303
3534
  flex-shrink: 0;
3304
3535
  }
3305
3536
 
3306
- .terminal-manager-actions .btn,
3307
- .terminal-manager-footer .btn {
3308
- padding: 6px 14px;
3537
+ .terminal-manager-actions .btn,
3538
+ .terminal-manager-footer .btn {
3539
+ padding: 6px 14px;
3540
+ }
3541
+
3542
+ .terminal-manager-end.btn-secondary:hover {
3543
+ color: var(--danger);
3544
+ border-color: color-mix(in srgb, var(--danger) 50%, transparent);
3545
+ background: color-mix(in srgb, var(--danger) 8%, transparent);
3546
+ }
3547
+
3548
+ .terminal-manager-footer {
3549
+ align-items: center;
3550
+ justify-content: space-between;
3551
+ margin-top: 12px;
3552
+ border-top: 1px solid var(--border);
3553
+ }
3554
+
3555
+ .terminal-manager-count {
3556
+ font-size: 12px;
3557
+ color: var(--text-muted);
3558
+ }
3559
+
3560
+ .terminal-manager-stats:empty {
3561
+ display: none;
3562
+ }
3563
+
3564
+ .terminal-manager-stats::before {
3565
+ content: '·';
3566
+ margin: 0 6px;
3567
+ }
3568
+
3569
+ .terminal-manager-empty {
3570
+ color: var(--text-muted);
3571
+ padding: 24px 0;
3572
+ text-align: center;
3573
+ }
3574
+
3575
+ .terminal-boot {
3576
+ display: none;
3577
+ position: absolute;
3578
+ z-index: 1;
3579
+ inset: 0;
3580
+ pointer-events: none;
3581
+ }
3582
+
3583
+ .terminal-boot.visible {
3584
+ display: flex;
3585
+ animation: boot-fade 0.3s ease-out 0.2s both;
3586
+ }
3587
+
3588
+ .terminal-boot-slow {
3589
+ display: none;
3590
+ }
3591
+
3592
+ .terminal-boot.slow .terminal-boot-slow {
3593
+ display: block;
3594
+ }
3595
+
3596
+ /* Opacity, not visibility: a hidden textarea drops focus, and the terminal must keep it. */
3597
+ .terminal-pane:has(.terminal-boot.visible) .terminal-frame {
3598
+ opacity: 0;
3599
+ }
3600
+
3601
+ .terminal-prompt {
3602
+ display: none;
3603
+ position: absolute;
3604
+ z-index: 1;
3605
+ top: 50%;
3606
+ left: 50%;
3607
+ transform: translate(-50%, -50%);
3608
+ width: min(440px, calc(100% - 32px));
3609
+ flex-direction: column;
3610
+ align-items: center;
3611
+ gap: 16px;
3612
+ padding: 28px 28px 20px;
3613
+ text-align: center;
3614
+ border: 1px solid var(--border);
3615
+ border-radius: 12px;
3616
+ box-shadow: 0 12px 32px -12px rgba(0, 0, 0, 0.25);
3617
+ background: var(--bg-surface);
3618
+ color: var(--text-secondary);
3619
+ font-size: 13px;
3620
+ }
3621
+
3622
+ .terminal-prompt.visible {
3623
+ display: flex;
3624
+ }
3625
+
3626
+ .terminal-prompt-text {
3627
+ display: flex;
3628
+ flex-direction: column;
3629
+ gap: 4px;
3630
+ line-height: 1.5;
3631
+ }
3632
+
3633
+ .terminal-prompt-title {
3634
+ color: var(--text-primary);
3635
+ font-size: 15px;
3636
+ font-weight: 600;
3637
+ }
3638
+
3639
+ .terminal-prompt-actions {
3640
+ display: flex;
3641
+ justify-content: center;
3642
+ gap: 8px;
3643
+ flex-wrap: wrap;
3644
+ }
3645
+
3646
+ .terminal-prompt button:focus-visible {
3647
+ outline: none;
3648
+ }
3649
+
3650
+ .terminal-host:focus-within {
3651
+ box-shadow: inset 0 0 0 1px var(--accent);
3652
+ }
3653
+
3654
+ .terminal-prompt:has(.terminal-prompt-output) {
3655
+ width: min(640px, calc(100% - 32px));
3656
+ }
3657
+
3658
+ .terminal-prompt .terminal-prompt-output {
3659
+ align-self: stretch;
3660
+ max-height: 9.5em;
3661
+ overflow: auto;
3662
+ font-size: 12px;
3663
+ text-align: left;
3664
+ white-space: pre;
3665
+ }
3666
+
3667
+ #terminal-toggle.active {
3668
+ color: var(--accent);
3669
+ }
3670
+
3671
+ /* #endregion */
3672
+
3673
+ /* #region SHOW */
3674
+ .terminal-host {
3675
+ position: relative;
3676
+ }
3677
+
3678
+ .show-card {
3679
+ --show-inset: 8px;
3680
+ /* Six terminal rows (prompt, its rules, status line) at xterm's cell height of about 1.2 × font size. */
3681
+ --show-prompt-inset: calc(var(--show-inset) + 7.2 * var(--show-term-font, 13px));
3682
+ position: absolute;
3683
+ z-index: 2;
3684
+ top: var(--show-inset);
3685
+ right: var(--show-inset);
3686
+ display: none;
3687
+ flex-direction: column;
3688
+ box-sizing: border-box;
3689
+ min-width: 280px;
3690
+ max-width: var(--show-fit-w, 640px);
3691
+ width: max-content;
3692
+ max-height: var(--show-fit-h, 60%);
3693
+ background: var(--bg-surface);
3694
+ border: 1px solid var(--border);
3695
+ border-radius: 8px;
3696
+ box-shadow: 0 4px 14px -6px rgba(0, 0, 0, 0.3);
3697
+ color: var(--text-secondary);
3698
+ font-family: var(--font-mono);
3699
+ overflow: hidden;
3700
+ }
3701
+
3702
+ body.light .show-card {
3703
+ box-shadow: 0 4px 14px -8px rgba(0, 0, 0, 0.12);
3704
+ }
3705
+
3706
+ .show-card.open {
3707
+ display: flex;
3708
+ }
3709
+
3710
+ .terminal-pane:has(.terminal-prompt.visible) .show-card {
3711
+ display: none;
3712
+ }
3713
+
3714
+ .show-card.html {
3715
+ width: var(--show-fit-w);
3716
+ }
3717
+
3718
+ .show-card.sized {
3719
+ width: var(--show-w);
3720
+ height: var(--show-h);
3721
+ max-width: none;
3722
+ max-height: none;
3723
+ }
3724
+
3725
+ .show-card.expanded {
3726
+ left: var(--show-inset);
3727
+ bottom: var(--show-prompt-inset);
3728
+ width: auto;
3729
+ height: auto;
3730
+ max-width: none;
3731
+ max-height: none;
3732
+ }
3733
+
3734
+ .show-card.collapsed {
3735
+ left: auto;
3736
+ bottom: auto;
3737
+ width: max-content;
3738
+ height: auto;
3739
+ max-height: none;
3740
+ }
3741
+
3742
+ .show-card.collapsed .show-body,
3743
+ .show-card.collapsed .show-review,
3744
+ .show-card.collapsed .show-grip,
3745
+ .show-card.expanded .show-grip {
3746
+ display: none;
3747
+ }
3748
+
3749
+ .show-card.collapsed .show-head {
3750
+ border-bottom-color: transparent;
3751
+ }
3752
+
3753
+ /* The ticks wrap to the header's width instead of setting the card's. */
3754
+ .show-card.collapsed .show-ticks {
3755
+ contain: inline-size;
3756
+ padding-bottom: 5px;
3757
+ }
3758
+
3759
+ .show-card.flash {
3760
+ animation: show-in 0.16s ease-out;
3761
+ }
3762
+
3763
+ @keyframes show-in {
3764
+ from {
3765
+ opacity: 0;
3766
+ transform: translateY(-4px);
3767
+ }
3768
+ to {
3769
+ opacity: 1;
3770
+ transform: none;
3771
+ }
3772
+ }
3773
+
3774
+ .show-head {
3775
+ flex: none;
3776
+ display: flex;
3777
+ align-items: center;
3778
+ gap: 2px;
3779
+ height: 30px;
3780
+ padding: 0 4px 0 10px;
3781
+ border-bottom: 1px solid var(--border);
3782
+ font-size: 11.5px;
3783
+ color: var(--text-muted);
3784
+ white-space: nowrap;
3785
+ user-select: none;
3786
+ }
3787
+
3788
+ .show-nav {
3789
+ display: flex;
3790
+ align-items: center;
3791
+ gap: 2px;
3792
+ min-width: 0;
3793
+ flex: 1;
3794
+ }
3795
+
3796
+ .show-title {
3797
+ min-width: 0;
3798
+ overflow: hidden;
3799
+ text-overflow: ellipsis;
3800
+ color: var(--text-primary);
3801
+ font-weight: 500;
3802
+ }
3803
+
3804
+ .show-sep {
3805
+ opacity: 0.7;
3806
+ padding: 0 1px;
3807
+ }
3808
+
3809
+ .show-key {
3810
+ flex: none;
3811
+ color: var(--text-tertiary);
3812
+ }
3813
+
3814
+ .show-pager {
3815
+ flex: none;
3816
+ display: flex;
3817
+ align-items: center;
3818
+ margin-left: 8px;
3819
+ padding-right: 6px;
3820
+ border-right: 1px solid var(--border);
3821
+ }
3822
+
3823
+ .show-pos {
3824
+ font-variant-numeric: tabular-nums;
3825
+ }
3826
+
3827
+ .show-card.focused,
3828
+ body.light .show-card.focused {
3829
+ border-color: var(--accent);
3830
+ box-shadow:
3831
+ 0 0 0 1px var(--accent),
3832
+ 0 0 10px var(--accent-glow);
3833
+ }
3834
+
3835
+ .show-actions {
3836
+ flex: none;
3837
+ display: flex;
3838
+ align-items: center;
3839
+ gap: 1px;
3840
+ margin-left: 6px;
3841
+ }
3842
+
3843
+ .show-btn {
3844
+ flex: none;
3845
+ width: 22px;
3846
+ height: 22px;
3847
+ display: inline-flex;
3848
+ align-items: center;
3849
+ justify-content: center;
3850
+ padding: 0;
3851
+ border: 0;
3852
+ border-radius: 4px;
3853
+ background: none;
3854
+ color: var(--text-tertiary);
3855
+ cursor: pointer;
3856
+ }
3857
+
3858
+ .show-btn:hover:not(:disabled) {
3859
+ background: var(--bg-hover);
3860
+ color: var(--text-primary);
3861
+ }
3862
+
3863
+ .show-btn:disabled {
3864
+ opacity: 0.35;
3865
+ cursor: default;
3866
+ }
3867
+
3868
+ .show-btn svg {
3869
+ width: 14px;
3870
+ height: 14px;
3871
+ }
3872
+
3873
+ .show-btn.remove:hover:not(:disabled) {
3874
+ color: var(--danger);
3875
+ background: var(--danger-dim);
3876
+ }
3877
+
3878
+ .show-ticks {
3879
+ flex: none;
3880
+ display: flex;
3881
+ flex-wrap: wrap;
3882
+ justify-content: flex-end;
3883
+ gap: 3px;
3884
+ padding: 5px 10px 0;
3885
+ }
3886
+
3887
+ .show-tick {
3888
+ width: 14px;
3889
+ height: 3px;
3890
+ padding: 0;
3891
+ border: 0;
3892
+ border-radius: 2px;
3893
+ background: var(--border);
3894
+ cursor: pointer;
3895
+ }
3896
+
3897
+ .show-tick:hover {
3898
+ background: var(--text-muted);
3899
+ }
3900
+
3901
+ .show-tick.on {
3902
+ background: var(--text-tertiary);
3903
+ }
3904
+
3905
+ .show-tick.dot {
3906
+ background: var(--accent);
3907
+ }
3908
+
3909
+ .show-body {
3910
+ container-type: inline-size;
3911
+ flex: 1;
3912
+ min-height: 0;
3913
+ overflow: auto;
3914
+ overscroll-behavior: contain;
3915
+ }
3916
+
3917
+ .show-body:focus {
3918
+ outline: none;
3919
+ }
3920
+
3921
+ .show-card.html:not(.collapsed) .show-body {
3922
+ display: flex;
3923
+ overflow: hidden;
3924
+ }
3925
+
3926
+ .show-frame {
3927
+ display: block;
3928
+ width: 100%;
3929
+ flex: 1;
3930
+ border: 0;
3931
+ background: transparent;
3932
+ }
3933
+
3934
+ .show-card .show-review {
3935
+ flex: none;
3936
+ max-height: 40%;
3937
+ padding: 8px 10px 6px;
3938
+ border-left: 0;
3939
+ border-top: 1px solid var(--border);
3940
+ font-size: 11.5px;
3941
+ }
3942
+
3943
+ .show-md {
3944
+ padding: 0.8em 1.1em 1em;
3945
+ /* The same scale as an HTML card's frame (the zoom in showBridge). */
3946
+ font-size: clamp(12.5px, calc(9.7px + 0.58cqi), 17.5px);
3947
+ line-height: 1.6;
3948
+ color: var(--text-secondary);
3949
+ overflow-wrap: anywhere;
3950
+ }
3951
+
3952
+ .show-md > :first-child {
3953
+ margin-top: 0;
3954
+ }
3955
+
3956
+ .show-md > :last-child {
3957
+ margin-bottom: 0;
3958
+ }
3959
+
3960
+ .show-md p {
3961
+ margin: 0.5em 0;
3962
+ }
3963
+
3964
+ .show-md h1,
3965
+ .show-md h2,
3966
+ .show-md h3,
3967
+ .show-md h4 {
3968
+ margin: 1em 0 0.4em;
3969
+ color: var(--text-primary);
3970
+ font-size: 1em;
3971
+ font-weight: 600;
3972
+ }
3973
+
3974
+ .show-md h1 {
3975
+ font-size: 1.12em;
3976
+ }
3977
+
3978
+ .show-md ul,
3979
+ .show-md ol {
3980
+ margin: 0.4em 0;
3981
+ padding-left: 1.6em;
3982
+ }
3983
+
3984
+ .show-md li {
3985
+ margin: 0.15em 0;
3986
+ }
3987
+
3988
+ .show-md li:has(> input[type='checkbox']) {
3989
+ list-style: none;
3990
+ margin-left: -1.3em;
3991
+ }
3992
+
3993
+ .show-md input[type='checkbox'] {
3994
+ accent-color: var(--accent);
3995
+ margin-right: 6px;
3996
+ vertical-align: -1px;
3997
+ }
3998
+
3999
+ .show-md a {
4000
+ color: var(--accent);
4001
+ }
4002
+
4003
+ .show-md blockquote {
4004
+ margin: 0.6em 0;
4005
+ padding-left: 10px;
4006
+ border-left: 2px solid var(--border);
4007
+ color: var(--text-tertiary);
4008
+ }
4009
+
4010
+ .show-md table {
4011
+ display: block;
4012
+ margin: 0.6em 0;
4013
+ overflow-x: auto;
4014
+ border-collapse: collapse;
4015
+ font-size: 0.96em;
4016
+ }
4017
+
4018
+ .show-md th,
4019
+ .show-md td {
4020
+ border: 1px solid var(--border);
4021
+ padding: 4px 9px;
4022
+ text-align: left;
4023
+ }
4024
+
4025
+ .show-md th {
4026
+ background: var(--bg-hover);
4027
+ font-weight: 600;
4028
+ color: var(--text-primary);
4029
+ }
4030
+
4031
+ .show-md :not(pre) > code {
4032
+ background: color-mix(in srgb, var(--accent) 10%, transparent);
4033
+ border: 1px solid color-mix(in srgb, var(--accent) 20%, transparent);
4034
+ color: var(--accent-text);
4035
+ padding: 0 4px;
4036
+ border-radius: 4px;
4037
+ font-size: 0.92em;
4038
+ }
4039
+
4040
+ .show-md pre {
4041
+ margin: 0.6em 0;
4042
+ font-size: 0.92em;
4043
+ line-height: 1.5;
4044
+ overflow-wrap: normal;
3309
4045
  }
3310
4046
 
3311
- .terminal-manager-end.btn-secondary:hover {
3312
- color: var(--danger);
3313
- border-color: color-mix(in srgb, var(--danger) 50%, transparent);
3314
- background: color-mix(in srgb, var(--danger) 8%, transparent);
4047
+ .show-md pre code {
4048
+ display: block;
4049
+ overflow-x: auto;
4050
+ --code-pad-x: 10px;
4051
+ padding: 8px var(--code-pad-x);
4052
+ border-radius: 6px;
4053
+ background: color-mix(in srgb, var(--text-muted) 8%, transparent);
4054
+ border: 1px solid color-mix(in srgb, var(--border) 55%, transparent);
3315
4055
  }
3316
4056
 
3317
- .terminal-manager-footer {
3318
- align-items: center;
3319
- justify-content: space-between;
3320
- margin-top: 12px;
3321
- border-top: 1px solid var(--border);
4057
+ .show-md pre.preview-source {
4058
+ margin: 0;
4059
+ padding: 0;
4060
+ border: 0;
4061
+ background: none;
3322
4062
  }
3323
4063
 
3324
- .terminal-manager-count {
3325
- font-size: 12px;
3326
- color: var(--text-muted);
4064
+ .show-md pre.preview-source code {
4065
+ padding: 0;
4066
+ border: 0;
4067
+ background: none;
3327
4068
  }
3328
4069
 
3329
- .terminal-manager-stats:empty {
3330
- display: none;
4070
+ .show-md code.language-diff .hljs-addition,
4071
+ .show-md code.language-diff .hljs-deletion {
4072
+ display: inline-block;
4073
+ min-width: 100%;
4074
+ margin: 0 -10px;
4075
+ padding: 0 10px;
4076
+ box-sizing: content-box;
3331
4077
  }
3332
4078
 
3333
- .terminal-manager-stats::before {
3334
- content: '·';
3335
- margin: 0 6px;
4079
+ .show-md code.language-diff .hljs-addition {
4080
+ color: var(--success);
4081
+ background: color-mix(in srgb, var(--success) 10%, transparent);
3336
4082
  }
3337
4083
 
3338
- .terminal-manager-empty {
3339
- color: var(--text-muted);
3340
- padding: 24px 0;
3341
- text-align: center;
4084
+ .show-md code.language-diff .hljs-deletion {
4085
+ color: var(--danger);
4086
+ background: color-mix(in srgb, var(--danger) 10%, transparent);
3342
4087
  }
3343
4088
 
3344
- .terminal-boot {
3345
- display: none;
3346
- position: absolute;
3347
- z-index: 1;
3348
- inset: 0;
3349
- pointer-events: none;
4089
+ .show-md pre.mermaid {
4090
+ min-height: 40px;
4091
+ margin: 0.6em 0;
4092
+ overflow-x: auto;
4093
+ text-align: center;
4094
+ background: transparent;
4095
+ color: transparent;
3350
4096
  }
3351
4097
 
3352
- .terminal-boot.visible {
3353
- display: flex;
3354
- animation: boot-fade 0.3s ease-out 0.2s both;
4098
+ .show-md pre.mermaid[data-processed] {
4099
+ color: inherit;
3355
4100
  }
3356
4101
 
3357
- .terminal-boot-slow {
3358
- display: none;
4102
+ .show-md pre.mermaid svg {
4103
+ max-width: 100%;
4104
+ height: auto;
3359
4105
  }
3360
4106
 
3361
- .terminal-boot.slow .terminal-boot-slow {
4107
+ .show-md img {
3362
4108
  display: block;
4109
+ max-width: 100%;
4110
+ height: auto;
3363
4111
  }
3364
4112
 
3365
- /* Opacity, not visibility: a hidden textarea drops focus, and the terminal must keep it. */
3366
- .terminal-pane:has(.terminal-boot.visible) .terminal-frame {
3367
- opacity: 0;
4113
+ .show-gone {
4114
+ color: var(--text-muted);
3368
4115
  }
3369
4116
 
3370
- .terminal-prompt {
3371
- display: none;
4117
+ .show-grip {
3372
4118
  position: absolute;
3373
- z-index: 1;
3374
- top: 50%;
3375
- left: 50%;
3376
- transform: translate(-50%, -50%);
3377
- width: min(440px, calc(100% - 32px));
3378
- flex-direction: column;
3379
- align-items: center;
3380
- gap: 16px;
3381
- padding: 28px 28px 20px;
3382
- text-align: center;
3383
- border: 1px solid var(--border);
3384
- border-radius: 12px;
3385
- box-shadow: 0 12px 32px -12px rgba(0, 0, 0, 0.25);
3386
- background: var(--bg-surface);
3387
- color: var(--text-secondary);
3388
- font-size: 13px;
4119
+ left: 0;
4120
+ bottom: 0;
4121
+ width: 14px;
4122
+ height: 14px;
4123
+ cursor: nesw-resize;
4124
+ color: var(--text-muted);
4125
+ opacity: 0;
4126
+ transition: opacity 0.15s ease;
4127
+ touch-action: none;
3389
4128
  }
3390
4129
 
3391
- .terminal-prompt.visible {
3392
- display: flex;
4130
+ .show-card:hover .show-grip,
4131
+ .show-card.sized .show-grip {
4132
+ opacity: 0.8;
3393
4133
  }
3394
4134
 
3395
- .terminal-prompt-text {
3396
- display: flex;
3397
- flex-direction: column;
3398
- gap: 4px;
3399
- line-height: 1.5;
4135
+ .show-grip:hover {
4136
+ opacity: 1;
4137
+ color: var(--text-primary);
3400
4138
  }
3401
4139
 
3402
- .terminal-prompt-title {
3403
- color: var(--text-primary);
3404
- font-size: 15px;
3405
- font-weight: 600;
4140
+ .show-grip svg {
4141
+ position: absolute;
4142
+ left: 2px;
4143
+ bottom: 2px;
4144
+ width: 9px;
4145
+ height: 9px;
3406
4146
  }
3407
4147
 
3408
- .terminal-prompt-actions {
3409
- display: flex;
3410
- justify-content: center;
3411
- gap: 8px;
3412
- flex-wrap: wrap;
4148
+ body.show-resizing {
4149
+ user-select: none;
3413
4150
  }
3414
4151
 
3415
- .terminal-prompt button:focus-visible {
3416
- outline: none;
4152
+ body.show-resizing iframe {
4153
+ pointer-events: none;
3417
4154
  }
3418
4155
 
3419
- .terminal-host:focus-within {
3420
- box-shadow: inset 0 0 0 1px var(--accent);
4156
+ .show-reopen {
4157
+ display: inline-flex;
4158
+ align-items: center;
4159
+ gap: 5px;
4160
+ height: 22px;
4161
+ padding: 0 8px;
4162
+ border: 1px solid var(--border);
4163
+ border-radius: 11px;
4164
+ background: var(--bg-surface);
4165
+ color: var(--text-tertiary);
4166
+ font: inherit;
4167
+ font-size: 11px;
4168
+ cursor: pointer;
3421
4169
  }
3422
4170
 
3423
- .terminal-prompt:has(.terminal-prompt-output) {
3424
- width: min(640px, calc(100% - 32px));
4171
+ .show-reopen[hidden] {
4172
+ display: none;
3425
4173
  }
3426
4174
 
3427
- .terminal-prompt .terminal-prompt-output {
3428
- align-self: stretch;
3429
- max-height: 9.5em;
3430
- overflow: auto;
3431
- font-size: 12px;
3432
- text-align: left;
3433
- white-space: pre;
4175
+ .show-reopen:hover {
4176
+ color: var(--text-primary);
4177
+ background: var(--bg-hover);
3434
4178
  }
3435
4179
 
3436
- #terminal-toggle.active {
3437
- color: var(--accent);
4180
+ .show-reopen svg {
4181
+ width: 12px;
4182
+ height: 12px;
3438
4183
  }
3439
4184
 
3440
4185
  /* #endregion */
@@ -3541,6 +4286,14 @@ code.language-tree .hljs-title {
3541
4286
  opacity: 0.5;
3542
4287
  }
3543
4288
 
4289
+ .pane-strip .drop-before {
4290
+ box-shadow: inset 2px 0 0 var(--accent);
4291
+ }
4292
+
4293
+ .pane-strip .drop-after {
4294
+ box-shadow: inset -2px 0 0 var(--accent);
4295
+ }
4296
+
3544
4297
  .pane-pair {
3545
4298
  display: flex;
3546
4299
  flex: 0 1 auto;
@@ -3590,6 +4343,18 @@ code.language-tree .hljs-title {
3590
4343
  text-overflow: ellipsis;
3591
4344
  }
3592
4345
 
4346
+ .pane-tab .pane-title-input {
4347
+ flex: 1;
4348
+ min-width: 80px;
4349
+ padding: 0 4px;
4350
+ font: inherit;
4351
+ color: var(--text-primary);
4352
+ background: var(--bg-deep);
4353
+ border: 1px solid var(--accent);
4354
+ border-radius: 3px;
4355
+ outline: none;
4356
+ }
4357
+
3593
4358
  .pane-tab .pin-meta {
3594
4359
  color: var(--text-muted);
3595
4360
  font-size: 10px;
@@ -3976,6 +4741,12 @@ code.language-tree .hljs-title {
3976
4741
  word-break: break-word;
3977
4742
  }
3978
4743
 
4744
+ .pane-msg-meta {
4745
+ margin-bottom: 12px;
4746
+ font-size: 11px;
4747
+ color: var(--text-muted);
4748
+ }
4749
+
3979
4750
  /* The modal's corner grip; the pane fills the height, so it sets the width only. */
3980
4751
  .pane-doc > .modal-resize-handle {
3981
4752
  cursor: ew-resize;
@@ -4651,6 +5422,19 @@ code.language-tree .hljs-title {
4651
5422
  display: block;
4652
5423
  overflow-x: auto;
4653
5424
  }
5425
+ /* The bodies around these tables set `word-break: break-word` or `overflow-wrap: anywhere`, which let a cell break
5426
+ between any two letters, so the table layout shrinks short columns to one letter. */
5427
+ .rendered-md th,
5428
+ .rendered-md td,
5429
+ .show-md th,
5430
+ .show-md td,
5431
+ .waiting-question-text th,
5432
+ .waiting-question-text td,
5433
+ .waiting-option-desc th,
5434
+ .waiting-option-desc td {
5435
+ word-break: normal;
5436
+ overflow-wrap: break-word;
5437
+ }
4654
5438
  .rendered-md th,
4655
5439
  .rendered-md td {
4656
5440
  border: 1px solid var(--border);
@@ -4682,6 +5466,55 @@ code.language-tree .hljs-title {
4682
5466
  border-radius: 6px;
4683
5467
  padding: 8px 10px;
4684
5468
  }
5469
+ .msg-detail-pre-old,
5470
+ .msg-detail-pre-new {
5471
+ max-height: 200px;
5472
+ overflow: auto;
5473
+ padding-left: 8px;
5474
+ }
5475
+ .msg-detail-pre-old {
5476
+ border-left: 3px solid var(--danger);
5477
+ }
5478
+ .msg-detail-pre-new {
5479
+ border-left: 3px solid var(--success);
5480
+ }
5481
+ .tool-detail-section {
5482
+ margin-top: 8px;
5483
+ padding-top: 6px;
5484
+ border-top: 1px solid var(--border);
5485
+ }
5486
+ .tool-detail-section-wide {
5487
+ margin-top: 10px;
5488
+ padding-top: 8px;
5489
+ border-top: 1px solid var(--border);
5490
+ }
5491
+ .tool-detail-label {
5492
+ font-size: 0.75rem;
5493
+ color: var(--text-muted);
5494
+ margin-bottom: 2px;
5495
+ }
5496
+ .tool-detail-heading {
5497
+ font-size: 0.8rem;
5498
+ color: var(--text-muted);
5499
+ margin-bottom: 4px;
5500
+ }
5501
+ .tool-detail-pre-scroll {
5502
+ max-height: 300px;
5503
+ overflow: auto;
5504
+ }
5505
+ .modal-status {
5506
+ padding: 16px;
5507
+ color: var(--text-secondary);
5508
+ }
5509
+ .modal-status-tight {
5510
+ padding: 8px 0;
5511
+ color: var(--text-secondary);
5512
+ }
5513
+ .modal-empty {
5514
+ padding: 24px;
5515
+ text-align: center;
5516
+ color: var(--text-secondary);
5517
+ }
4685
5518
  .expand-toggle-btn {
4686
5519
  background: none;
4687
5520
  border: none;
@@ -4758,7 +5591,7 @@ code.language-tree .hljs-title {
4758
5591
  font-size: 11px;
4759
5592
  }
4760
5593
  .msg-item.msg-teammate {
4761
- border-left: 3px solid var(--team);
5594
+ border-left: 3px solid var(--info);
4762
5595
  }
4763
5596
  .msg-item.msg-protocol {
4764
5597
  border-left: 3px solid var(--border);
@@ -4769,8 +5602,8 @@ code.language-tree .hljs-title {
4769
5602
  opacity: 0.75;
4770
5603
  }
4771
5604
  .msg-item.msg-waiting {
4772
- border-left: 3px solid var(--warning, #f5a623);
4773
- background: color-mix(in srgb, var(--warning, #f5a623) 8%, transparent);
5605
+ border-left: 3px solid var(--warning);
5606
+ background: color-mix(in srgb, var(--warning) 8%, transparent);
4774
5607
  animation: msg-waiting-pulse 2s ease-in-out infinite;
4775
5608
  cursor: pointer;
4776
5609
  }
@@ -4803,8 +5636,8 @@ code.language-tree .hljs-title {
4803
5636
  padding: 1px 6px;
4804
5637
  margin-right: 6px;
4805
5638
  border-radius: 3px;
4806
- background: color-mix(in srgb, var(--warning, #f5a623) 22%, transparent);
4807
- color: var(--warning, #f5a623);
5639
+ background: color-mix(in srgb, var(--warning) 22%, transparent);
5640
+ color: var(--warning);
4808
5641
  font-size: 10px;
4809
5642
  font-weight: 600;
4810
5643
  text-transform: uppercase;
@@ -4823,10 +5656,10 @@ code.language-tree .hljs-title {
4823
5656
  @keyframes msg-waiting-pulse {
4824
5657
  0%,
4825
5658
  100% {
4826
- background: color-mix(in srgb, var(--warning, #f5a623) 8%, transparent);
5659
+ background: color-mix(in srgb, var(--warning) 8%, transparent);
4827
5660
  }
4828
5661
  50% {
4829
- background: color-mix(in srgb, var(--warning, #f5a623) 16%, transparent);
5662
+ background: color-mix(in srgb, var(--warning) 16%, transparent);
4830
5663
  }
4831
5664
  }
4832
5665
  .msg-waiting-footer {
@@ -4899,21 +5732,21 @@ code.language-tree .hljs-title {
4899
5732
  buttons need the descendant selector to out-rank `.msg-waiting-actions button` */
4900
5733
  .waiting-btn-allow,
4901
5734
  .msg-waiting-actions .msg-waiting-allow {
4902
- color: var(--success, #2ea043);
4903
- border-color: color-mix(in srgb, var(--success, #2ea043) 35%, transparent);
5735
+ color: var(--success);
5736
+ border-color: color-mix(in srgb, var(--success) 35%, transparent);
4904
5737
  }
4905
5738
  .waiting-btn-allow:hover:not(:disabled),
4906
5739
  .msg-waiting-actions .msg-waiting-allow:hover {
4907
- background: color-mix(in srgb, var(--success, #2ea043) 10%, transparent);
5740
+ background: color-mix(in srgb, var(--success) 10%, transparent);
4908
5741
  }
4909
5742
  .waiting-btn-deny,
4910
5743
  .msg-waiting-actions .msg-waiting-deny {
4911
- color: var(--danger, #f85149);
4912
- border-color: color-mix(in srgb, var(--danger, #f85149) 35%, transparent);
5744
+ color: var(--danger);
5745
+ border-color: color-mix(in srgb, var(--danger) 35%, transparent);
4913
5746
  }
4914
5747
  .waiting-btn-deny:hover,
4915
5748
  .msg-waiting-actions .msg-waiting-deny:hover {
4916
- background: color-mix(in srgb, var(--danger, #f85149) 10%, transparent);
5749
+ background: color-mix(in srgb, var(--danger) 10%, transparent);
4917
5750
  }
4918
5751
  .waiting-btn-allow:disabled {
4919
5752
  opacity: 0.4;
@@ -4968,7 +5801,7 @@ code.language-tree .hljs-title {
4968
5801
  padding: 8px 10px;
4969
5802
  border: 1px solid var(--border);
4970
5803
  border-radius: 4px;
4971
- background: var(--bg-primary);
5804
+ background: var(--bg-deep);
4972
5805
  }
4973
5806
  .waiting-question-text pre.mermaid,
4974
5807
  .waiting-option-desc pre.mermaid {
@@ -5033,7 +5866,7 @@ code.language-tree .hljs-title {
5033
5866
  padding: 8px 10px;
5034
5867
  border: 1px solid var(--border);
5035
5868
  border-radius: 4px;
5036
- background: var(--bg-primary);
5869
+ background: var(--bg-deep);
5037
5870
  font-size: 11px;
5038
5871
  font-weight: 400;
5039
5872
  overflow-x: auto;
@@ -5228,6 +6061,32 @@ code.language-tree .hljs-title {
5228
6061
  color: var(--text-muted);
5229
6062
  border-bottom: 1px solid var(--border);
5230
6063
  }
6064
+ .msg-log-loading {
6065
+ display: flex;
6066
+ flex-direction: column;
6067
+ gap: 14px;
6068
+ padding: 16px 14px;
6069
+ animation: boot-fade 0.2s ease-out var(--log-loading-delay, 0ms) both;
6070
+ }
6071
+ .msg-log-loading-row {
6072
+ display: flex;
6073
+ flex-direction: column;
6074
+ gap: 7px;
6075
+ }
6076
+ .msg-log-loading-row span {
6077
+ width: 75%;
6078
+ }
6079
+ .msg-log-loading-row span + span {
6080
+ width: 45%;
6081
+ }
6082
+ .msg-log-loading-row:nth-child(even) span:first-child {
6083
+ width: 60%;
6084
+ }
6085
+ .msg-log-loading-label {
6086
+ color: var(--text-muted);
6087
+ font-size: 12px;
6088
+ text-align: center;
6089
+ }
5231
6090
 
5232
6091
  /* #endregion */
5233
6092
 
@@ -5788,7 +6647,7 @@ code.language-tree .hljs-title {
5788
6647
  }
5789
6648
 
5790
6649
  .wf-live-phase.done::before {
5791
- background: var(--ok, #3fb950);
6650
+ background: var(--success);
5792
6651
  }
5793
6652
 
5794
6653
  .wf-live-phase.done {
@@ -6095,6 +6954,7 @@ body.light {
6095
6954
  --gold: #a8842f;
6096
6955
  --success: #1a8a5a;
6097
6956
  --success-dim: rgba(26, 138, 90, 0.15);
6957
+ --info: #2563eb;
6098
6958
  --warning: #b07d0a;
6099
6959
  --warning-dim: rgba(176, 125, 10, 0.15);
6100
6960
  --danger: #c0392b;
@@ -6113,6 +6973,16 @@ body.light {
6113
6973
  --ansi-bright-magenta: #a855c9;
6114
6974
  --ansi-bright-cyan: #2a9a9a;
6115
6975
  --plan-dim: rgba(90, 122, 90, 0.15);
6976
+ --owner-blue: #163f8a;
6977
+ --owner-purple: #5524b0;
6978
+ --owner-teal: #064c3f;
6979
+ --owner-orange: #7a2c10;
6980
+ --owner-yellow: #634b06;
6981
+ --owner-pink: #831a4d;
6982
+ --owner-green: #0b4a22;
6983
+ --owner-indigo: #3730a3;
6984
+ --owner-red: #8f1d1d;
6985
+ --owner-cyan: #0b5566;
6116
6986
  }
6117
6987
 
6118
6988
  body.light::before {
@@ -6343,6 +7213,7 @@ body.light .msg-assistant .msg-text {
6343
7213
  max-height: 90vh;
6344
7214
  display: flex;
6345
7215
  flex-direction: column;
7216
+ outline: none;
6346
7217
  }
6347
7218
 
6348
7219
  .modal.preview-modal-dialog.fullscreen {
@@ -6486,8 +7357,10 @@ body.light .msg-assistant .msg-text {
6486
7357
  /* Source is read line by line, so it keeps its own line breaks and scrolls sideways
6487
7358
  instead of inheriting the body's `word-break: break-word`. */
6488
7359
  .preview-source {
7360
+ --src-pad-y: 10px;
7361
+ position: relative;
6489
7362
  margin: 0;
6490
- padding: 10px 12px;
7363
+ padding: var(--src-pad-y) 12px;
6491
7364
  background: var(--bg-elevated);
6492
7365
  border: 1px solid var(--border);
6493
7366
  border-radius: 6px;
@@ -6500,12 +7373,49 @@ body.light .msg-assistant .msg-text {
6500
7373
  tab-size: 4;
6501
7374
  }
6502
7375
 
6503
- .preview-source code {
7376
+ .preview-source:has(.src-gutter) {
7377
+ display: grid;
7378
+ grid-template-columns: auto 1fr;
7379
+ padding-left: 0;
7380
+ }
7381
+
7382
+ /* Sticky, so the numbers stay put while the code scrolls sideways. */
7383
+ .preview-source .src-gutter {
7384
+ position: sticky;
7385
+ left: 0;
7386
+ z-index: 1;
7387
+ margin-right: 12px;
7388
+ padding: 0 10px 0 12px;
7389
+ text-align: right;
7390
+ color: var(--text-muted);
7391
+ background: inherit;
7392
+ border-right: 1px solid var(--border);
7393
+ user-select: none;
7394
+ }
7395
+
7396
+ /* `.hljs` in the selector outranks the theme's `pre code.hljs` padding and scroll, which would
7397
+ shift the text off the gutter and the line band. */
7398
+ .preview-source code.hljs {
7399
+ position: relative;
6504
7400
  background: none;
6505
7401
  padding: 0;
7402
+ overflow: visible;
6506
7403
  font: inherit;
6507
7404
  }
6508
7405
 
7406
+ /* Lines never wrap (white-space: pre), so line N starts N - 1 line heights below the padding. */
7407
+ .preview-source .src-line {
7408
+ position: absolute;
7409
+ left: 0;
7410
+ right: 0;
7411
+ top: calc(var(--src-pad-y) + var(--line) * 1lh);
7412
+ height: 1lh;
7413
+ background: color-mix(in srgb, var(--accent) 16%, transparent);
7414
+ box-shadow: inset 2px 0 0 var(--accent);
7415
+ z-index: 2;
7416
+ pointer-events: none;
7417
+ }
7418
+
6509
7419
  .preview-html-frame {
6510
7420
  width: 100%;
6511
7421
  height: 100%;
@@ -6552,7 +7462,7 @@ body.light .msg-assistant .msg-text {
6552
7462
  }
6553
7463
 
6554
7464
  .preview-fm .fm-k {
6555
- color: var(--accent, #7aa2f7);
7465
+ color: var(--accent);
6556
7466
  font-weight: 600;
6557
7467
  }
6558
7468
 
@@ -7212,6 +8122,7 @@ select.form-input option:checked {
7212
8122
  }
7213
8123
 
7214
8124
  .sp-row {
8125
+ position: relative;
7215
8126
  display: flex;
7216
8127
  align-items: center;
7217
8128
  gap: 8px;
@@ -7770,7 +8681,7 @@ select.form-input option:checked {
7770
8681
  .impact-bar-fill {
7771
8682
  height: 100%;
7772
8683
  border-radius: 3px;
7773
- background: var(--accent, #6366f1);
8684
+ background: var(--accent);
7774
8685
  min-width: 2px;
7775
8686
  }
7776
8687
 
@@ -8179,6 +9090,7 @@ select.form-input option:checked {
8179
9090
  --gold: #a8842f;
8180
9091
  --success: #1a8a5a;
8181
9092
  --success-dim: rgba(26, 138, 90, 0.15);
9093
+ --info: #2563eb;
8182
9094
  --warning: #b07d0a;
8183
9095
  --warning-dim: rgba(176, 125, 10, 0.15);
8184
9096
  --danger: #c0392b;
@@ -8197,6 +9109,16 @@ select.form-input option:checked {
8197
9109
  --ansi-bright-magenta: #a855c9;
8198
9110
  --ansi-bright-cyan: #2a9a9a;
8199
9111
  --plan-dim: rgba(90, 122, 90, 0.15);
9112
+ --owner-blue: #163f8a;
9113
+ --owner-purple: #5524b0;
9114
+ --owner-teal: #064c3f;
9115
+ --owner-orange: #7a2c10;
9116
+ --owner-yellow: #634b06;
9117
+ --owner-pink: #831a4d;
9118
+ --owner-green: #0b4a22;
9119
+ --owner-indigo: #3730a3;
9120
+ --owner-red: #8f1d1d;
9121
+ --owner-cyan: #0b5566;
8200
9122
  }
8201
9123
 
8202
9124
  body:not(.dark-forced)::before {