botmux 2.85.1 → 2.86.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 (116) hide show
  1. package/dist/core/command-handler.d.ts.map +1 -1
  2. package/dist/core/command-handler.js +209 -1
  3. package/dist/core/command-handler.js.map +1 -1
  4. package/dist/core/cost-calculator.d.ts.map +1 -1
  5. package/dist/core/cost-calculator.js +7 -106
  6. package/dist/core/cost-calculator.js.map +1 -1
  7. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  8. package/dist/core/dashboard-ipc-server.js +240 -2
  9. package/dist/core/dashboard-ipc-server.js.map +1 -1
  10. package/dist/core/passthrough-commands.d.ts.map +1 -1
  11. package/dist/core/passthrough-commands.js +1 -1
  12. package/dist/core/passthrough-commands.js.map +1 -1
  13. package/dist/core/role-resolver.d.ts +1 -0
  14. package/dist/core/role-resolver.d.ts.map +1 -1
  15. package/dist/core/role-resolver.js +14 -0
  16. package/dist/core/role-resolver.js.map +1 -1
  17. package/dist/dashboard/web/app.d.ts.map +1 -1
  18. package/dist/dashboard/web/app.js +15 -4
  19. package/dist/dashboard/web/app.js.map +1 -1
  20. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  21. package/dist/dashboard/web/bot-defaults.js +116 -0
  22. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  23. package/dist/dashboard/web/groups.d.ts +2 -0
  24. package/dist/dashboard/web/groups.d.ts.map +1 -1
  25. package/dist/dashboard/web/groups.js +419 -3
  26. package/dist/dashboard/web/groups.js.map +1 -1
  27. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  28. package/dist/dashboard/web/i18n.js +617 -3
  29. package/dist/dashboard/web/i18n.js.map +1 -1
  30. package/dist/dashboard/web/insights.d.ts +2 -0
  31. package/dist/dashboard/web/insights.d.ts.map +1 -0
  32. package/dist/dashboard/web/insights.js +1523 -0
  33. package/dist/dashboard/web/insights.js.map +1 -0
  34. package/dist/dashboard/web/role-profile-match.d.ts +31 -0
  35. package/dist/dashboard/web/role-profile-match.d.ts.map +1 -0
  36. package/dist/dashboard/web/role-profile-match.js +58 -0
  37. package/dist/dashboard/web/role-profile-match.js.map +1 -0
  38. package/dist/dashboard/web/roles.d.ts +1 -0
  39. package/dist/dashboard/web/roles.d.ts.map +1 -1
  40. package/dist/dashboard/web/roles.js +520 -27
  41. package/dist/dashboard/web/roles.js.map +1 -1
  42. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  43. package/dist/dashboard/web/sessions.js +84 -0
  44. package/dist/dashboard/web/sessions.js.map +1 -1
  45. package/dist/dashboard-web/app.js +1243 -831
  46. package/dist/dashboard-web/index.html +2 -1
  47. package/dist/dashboard-web/style.css +1085 -3
  48. package/dist/dashboard.js +215 -3
  49. package/dist/dashboard.js.map +1 -1
  50. package/dist/i18n/en.d.ts.map +1 -1
  51. package/dist/i18n/en.js +34 -1
  52. package/dist/i18n/en.js.map +1 -1
  53. package/dist/i18n/zh.d.ts.map +1 -1
  54. package/dist/i18n/zh.js +34 -1
  55. package/dist/i18n/zh.js.map +1 -1
  56. package/dist/services/group-creator.d.ts +6 -0
  57. package/dist/services/group-creator.d.ts.map +1 -1
  58. package/dist/services/group-creator.js +54 -5
  59. package/dist/services/group-creator.js.map +1 -1
  60. package/dist/services/insight/antigravity-span-reader.d.ts +3 -0
  61. package/dist/services/insight/antigravity-span-reader.d.ts.map +1 -0
  62. package/dist/services/insight/antigravity-span-reader.js +249 -0
  63. package/dist/services/insight/antigravity-span-reader.js.map +1 -0
  64. package/dist/services/insight/classify.d.ts +7 -0
  65. package/dist/services/insight/classify.d.ts.map +1 -0
  66. package/dist/services/insight/classify.js +46 -0
  67. package/dist/services/insight/classify.js.map +1 -0
  68. package/dist/services/insight/claude-span-reader.d.ts +3 -0
  69. package/dist/services/insight/claude-span-reader.d.ts.map +1 -0
  70. package/dist/services/insight/claude-span-reader.js +257 -0
  71. package/dist/services/insight/claude-span-reader.js.map +1 -0
  72. package/dist/services/insight/codex-span-reader.d.ts +3 -0
  73. package/dist/services/insight/codex-span-reader.d.ts.map +1 -0
  74. package/dist/services/insight/codex-span-reader.js +290 -0
  75. package/dist/services/insight/codex-span-reader.js.map +1 -0
  76. package/dist/services/insight/intent.d.ts +5 -0
  77. package/dist/services/insight/intent.d.ts.map +1 -0
  78. package/dist/services/insight/intent.js +145 -0
  79. package/dist/services/insight/intent.js.map +1 -0
  80. package/dist/services/insight/jsonl.d.ts +10 -0
  81. package/dist/services/insight/jsonl.d.ts.map +1 -0
  82. package/dist/services/insight/jsonl.js +36 -0
  83. package/dist/services/insight/jsonl.js.map +1 -0
  84. package/dist/services/insight/prompt.d.ts +3 -0
  85. package/dist/services/insight/prompt.d.ts.map +1 -0
  86. package/dist/services/insight/prompt.js +99 -0
  87. package/dist/services/insight/prompt.js.map +1 -0
  88. package/dist/services/insight/redact.d.ts +4 -0
  89. package/dist/services/insight/redact.d.ts.map +1 -0
  90. package/dist/services/insight/redact.js +67 -0
  91. package/dist/services/insight/redact.js.map +1 -0
  92. package/dist/services/insight/report.d.ts +29 -0
  93. package/dist/services/insight/report.d.ts.map +1 -0
  94. package/dist/services/insight/report.js +1126 -0
  95. package/dist/services/insight/report.js.map +1 -0
  96. package/dist/services/insight/safe-detail.d.ts +5 -0
  97. package/dist/services/insight/safe-detail.d.ts.map +1 -0
  98. package/dist/services/insight/safe-detail.js +59 -0
  99. package/dist/services/insight/safe-detail.js.map +1 -0
  100. package/dist/services/insight/scrub.d.ts +22 -0
  101. package/dist/services/insight/scrub.d.ts.map +1 -0
  102. package/dist/services/insight/scrub.js +70 -0
  103. package/dist/services/insight/scrub.js.map +1 -0
  104. package/dist/services/insight/types.d.ts +394 -0
  105. package/dist/services/insight/types.d.ts.map +1 -0
  106. package/dist/services/insight/types.js +2 -0
  107. package/dist/services/insight/types.js.map +1 -0
  108. package/dist/services/role-profile-store.d.ts +25 -0
  109. package/dist/services/role-profile-store.d.ts.map +1 -0
  110. package/dist/services/role-profile-store.js +171 -0
  111. package/dist/services/role-profile-store.js.map +1 -0
  112. package/dist/services/transcript-resolver.d.ts +26 -0
  113. package/dist/services/transcript-resolver.d.ts.map +1 -0
  114. package/dist/services/transcript-resolver.js +111 -0
  115. package/dist/services/transcript-resolver.js.map +1 -0
  116. package/package.json +1 -1
@@ -2378,6 +2378,13 @@ input.row-select,
2378
2378
  }
2379
2379
 
2380
2380
  /* ─── Roles Page ─── */
2381
+ .roles-heading {
2382
+ align-items: flex-start;
2383
+ gap: 16px;
2384
+ }
2385
+ .roles-tabs {
2386
+ flex: 0 0 auto;
2387
+ }
2381
2388
  .roles-page .roles-layout {
2382
2389
  display: grid;
2383
2390
  grid-template-columns: 320px 1fr;
@@ -2385,6 +2392,7 @@ input.row-select,
2385
2392
  height: calc(100vh - 160px);
2386
2393
  min-height: 400px;
2387
2394
  }
2395
+ .roles-page .roles-layout[hidden] { display: none !important; }
2388
2396
 
2389
2397
  /* ─── Tree Panel (left) ─── */
2390
2398
  .roles-tree-panel {
@@ -2402,6 +2410,12 @@ input.row-select,
2402
2410
  gap: 8px;
2403
2411
  }
2404
2412
  .roles-tree-header input { flex: 1; }
2413
+ .roles-profile-create {
2414
+ align-items: stretch;
2415
+ }
2416
+ .roles-profile-create input {
2417
+ min-width: 0;
2418
+ }
2405
2419
  .roles-tree {
2406
2420
  flex: 1;
2407
2421
  overflow-y: auto;
@@ -2512,6 +2526,61 @@ input.row-select,
2512
2526
  background: var(--bg-soft);
2513
2527
  color: var(--faint);
2514
2528
  }
2529
+ .roles-profile-match {
2530
+ display: inline-flex;
2531
+ max-width: 100%;
2532
+ margin-top: 5px;
2533
+ padding: 2px 7px;
2534
+ border-radius: 999px;
2535
+ border: 1px solid var(--border-soft);
2536
+ background: var(--surface-muted);
2537
+ color: var(--muted);
2538
+ font-size: 10.5px;
2539
+ font-weight: 700;
2540
+ line-height: 1.45;
2541
+ white-space: normal;
2542
+ overflow-wrap: anywhere;
2543
+ }
2544
+ .roles-profile-match.full {
2545
+ border-color: color-mix(in srgb, var(--success) 35%, var(--border-soft));
2546
+ background: color-mix(in srgb, var(--success) 10%, var(--surface));
2547
+ color: var(--success);
2548
+ }
2549
+ .roles-profile-match.partial {
2550
+ border-color: color-mix(in srgb, var(--warning) 35%, var(--border-soft));
2551
+ background: color-mix(in srgb, var(--warning) 12%, var(--surface));
2552
+ color: var(--warning);
2553
+ }
2554
+ .roles-profile-match.muted {
2555
+ font-weight: 600;
2556
+ color: var(--muted);
2557
+ }
2558
+ .roles-profile-row {
2559
+ display: flex;
2560
+ align-items: center;
2561
+ gap: 10px;
2562
+ padding: 10px 12px;
2563
+ cursor: pointer;
2564
+ border-bottom: 1px solid var(--border-soft);
2565
+ transition: background 0.12s;
2566
+ }
2567
+ .roles-profile-row:hover { background: var(--bg-soft); }
2568
+ .roles-profile-row.selected {
2569
+ background: var(--accent-soft);
2570
+ border-left: 3px solid var(--accent);
2571
+ padding-left: 9px;
2572
+ }
2573
+ .roles-profile-row-main {
2574
+ min-width: 0;
2575
+ flex: 1;
2576
+ }
2577
+ .roles-profile-name {
2578
+ font-size: 13px;
2579
+ font-weight: 650;
2580
+ white-space: nowrap;
2581
+ overflow: hidden;
2582
+ text-overflow: ellipsis;
2583
+ }
2515
2584
 
2516
2585
  /* ─── Editor Panel (right) ─── */
2517
2586
  .roles-editor-panel {
@@ -2560,10 +2629,76 @@ input.row-select,
2560
2629
  color: var(--faint);
2561
2630
  font-family: var(--mono);
2562
2631
  }
2632
+ .roles-profile-detail {
2633
+ gap: 16px;
2634
+ min-height: 0;
2635
+ overflow: hidden;
2636
+ }
2637
+ .roles-profile-title {
2638
+ flex: 0 0 auto;
2639
+ display: flex;
2640
+ align-items: flex-start;
2641
+ justify-content: space-between;
2642
+ gap: 12px;
2643
+ }
2644
+ .roles-profile-grid {
2645
+ flex: 1 1 auto;
2646
+ display: grid;
2647
+ grid-template-columns: minmax(240px, 320px) minmax(0, 1fr);
2648
+ gap: 16px;
2649
+ align-items: stretch;
2650
+ min-height: 0;
2651
+ overflow: hidden;
2652
+ }
2653
+ .roles-profile-bots,
2654
+ .roles-profile-editor,
2655
+ .roles-profile-apply {
2656
+ min-width: 0;
2657
+ }
2658
+ .roles-profile-bots {
2659
+ display: flex;
2660
+ flex-direction: column;
2661
+ min-height: 0;
2662
+ }
2663
+ .roles-profile-editor {
2664
+ display: flex;
2665
+ flex-direction: column;
2666
+ gap: 10px;
2667
+ min-height: 0;
2668
+ }
2669
+ .roles-profile-section-title {
2670
+ color: var(--muted);
2671
+ font-size: 12px;
2672
+ font-weight: 700;
2673
+ margin-bottom: 8px;
2674
+ text-transform: uppercase;
2675
+ }
2676
+ .roles-profile-bot-list {
2677
+ flex: 1 1 auto;
2678
+ min-height: 0;
2679
+ border: 1px solid var(--border-soft);
2680
+ border-radius: var(--radius);
2681
+ overflow: auto;
2682
+ }
2683
+ .roles-profile-bot-row {
2684
+ padding-left: 12px;
2685
+ }
2686
+ .roles-profile-bot-row.selected {
2687
+ padding-left: 9px;
2688
+ }
2689
+ .roles-profile-inline-empty {
2690
+ flex: 1 1 auto;
2691
+ min-height: 220px;
2692
+ border: 1px dashed var(--border);
2693
+ border-radius: var(--radius);
2694
+ }
2563
2695
 
2564
2696
  /* ─── Editor textarea ─── */
2565
- #roles-editor-textarea {
2566
- flex: 1;
2697
+ #roles-editor-textarea,
2698
+ #roles-profile-textarea {
2699
+ width: 100%;
2700
+ box-sizing: border-box;
2701
+ flex: 0 0 auto;
2567
2702
  min-height: 220px;
2568
2703
  font-family: var(--mono);
2569
2704
  font-size: 13px;
@@ -2576,7 +2711,13 @@ input.row-select,
2576
2711
  color: var(--fg);
2577
2712
  tab-size: 2;
2578
2713
  }
2579
- #roles-editor-textarea:focus {
2714
+ #roles-profile-textarea {
2715
+ flex: 1 1 260px;
2716
+ min-height: 180px;
2717
+ max-height: min(44vh, 420px);
2718
+ }
2719
+ #roles-editor-textarea:focus,
2720
+ #roles-profile-textarea:focus {
2580
2721
  outline: none;
2581
2722
  border-color: var(--accent);
2582
2723
  box-shadow: 0 0 0 3px var(--accent-soft);
@@ -2596,6 +2737,44 @@ input.row-select,
2596
2737
  .roles-bytecount.warn { color: var(--warning); }
2597
2738
  .roles-bytecount.over { color: var(--danger); font-weight: 700; }
2598
2739
  .roles-editor-actions { display: flex; gap: 8px; }
2740
+ .roles-profile-editor .roles-editor-actions,
2741
+ .roles-profile-apply .roles-editor-actions {
2742
+ justify-content: flex-end;
2743
+ flex-wrap: wrap;
2744
+ }
2745
+ .roles-profile-apply {
2746
+ flex: 0 0 auto;
2747
+ max-height: 34%;
2748
+ overflow: auto;
2749
+ border-top: 1px solid var(--border-soft);
2750
+ padding-top: 14px;
2751
+ }
2752
+ .roles-profile-apply-controls {
2753
+ display: grid;
2754
+ grid-template-columns: minmax(180px, 1fr) auto;
2755
+ gap: 10px;
2756
+ align-items: center;
2757
+ margin-bottom: 10px;
2758
+ }
2759
+ .roles-profile-apply-controls select {
2760
+ min-width: 0;
2761
+ }
2762
+ .roles-profile-force {
2763
+ display: flex;
2764
+ align-items: center;
2765
+ gap: 6px;
2766
+ color: var(--muted);
2767
+ font-size: 12px;
2768
+ }
2769
+ .roles-profile-apply-bot {
2770
+ margin-bottom: 6px;
2771
+ }
2772
+ .roles-profile-status {
2773
+ color: var(--muted);
2774
+ font-size: 12px;
2775
+ line-height: 1.6;
2776
+ min-height: 18px;
2777
+ }
2599
2778
 
2600
2779
  /* ─── Saved flash ─── */
2601
2780
  .roles-saved-flash {
@@ -2624,9 +2803,15 @@ input.row-select,
2624
2803
  max-height: 140px;
2625
2804
  overflow-y: auto;
2626
2805
  }
2806
+ .roles-profile-editor .roles-preview {
2807
+ flex: 1 1 auto;
2808
+ min-height: 160px;
2809
+ max-height: none;
2810
+ }
2627
2811
  .roles-preview pre {
2628
2812
  margin: 8px 0 0 0;
2629
2813
  white-space: pre-wrap;
2814
+ overflow-wrap: anywhere;
2630
2815
  font-family: var(--mono);
2631
2816
  font-size: 12px;
2632
2817
  line-height: 1.5;
@@ -2644,6 +2829,21 @@ input.row-select,
2644
2829
  grid-template-columns: 1fr;
2645
2830
  height: auto;
2646
2831
  }
2832
+ .roles-heading {
2833
+ flex-direction: column;
2834
+ }
2835
+ .roles-tabs {
2836
+ width: 100%;
2837
+ }
2838
+ .roles-tabs button {
2839
+ flex: 1;
2840
+ }
2841
+ .roles-profile-grid {
2842
+ grid-template-columns: 1fr;
2843
+ }
2844
+ .roles-profile-apply-controls {
2845
+ grid-template-columns: 1fr;
2846
+ }
2647
2847
  }
2648
2848
 
2649
2849
  /* ─── Workflow runtime: list, detail, parallel timeline, IO cards ─── */
@@ -3030,6 +3230,245 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
3030
3230
  /* 群列表名称单元格:群头像 + 群名/ID 横向排列。 */
3031
3231
  .g-chat-cell { display: flex; align-items: center; gap: 8px; }
3032
3232
  .g-chat-meta { min-width: 0; }
3233
+ .g-profile-status {
3234
+ display: inline-flex;
3235
+ align-items: center;
3236
+ max-width: 240px;
3237
+ margin-top: 5px;
3238
+ padding: 2px 7px;
3239
+ border-radius: 999px;
3240
+ border: 1px solid var(--border-soft);
3241
+ background: var(--surface-muted);
3242
+ color: var(--muted);
3243
+ font-size: 11px;
3244
+ font-weight: 700;
3245
+ line-height: 1.5;
3246
+ white-space: normal;
3247
+ overflow-wrap: anywhere;
3248
+ }
3249
+ .g-profile-status.full {
3250
+ border-color: color-mix(in srgb, var(--success) 35%, var(--border-soft));
3251
+ background: color-mix(in srgb, var(--success) 10%, var(--surface));
3252
+ color: var(--success);
3253
+ }
3254
+ .g-profile-status.partial {
3255
+ border-color: color-mix(in srgb, var(--warning) 35%, var(--border-soft));
3256
+ background: color-mix(in srgb, var(--warning) 12%, var(--surface));
3257
+ color: var(--warning);
3258
+ }
3259
+ .g-profile-status.muted { font-weight: 600; }
3260
+ .g-save-profile-dialog {
3261
+ display: grid;
3262
+ gap: 12px;
3263
+ }
3264
+ .g-save-profile-dialog [hidden] {
3265
+ display: none !important;
3266
+ }
3267
+ .g-save-profile-panel {
3268
+ display: grid;
3269
+ gap: 10px;
3270
+ padding: 12px;
3271
+ border: 1px solid var(--border-soft);
3272
+ border-radius: var(--radius);
3273
+ background: var(--surface-muted);
3274
+ }
3275
+ .g-save-profile-section-head {
3276
+ display: flex;
3277
+ justify-content: space-between;
3278
+ gap: 12px;
3279
+ align-items: baseline;
3280
+ }
3281
+ .g-save-profile-section-head > span {
3282
+ color: var(--fg);
3283
+ font-weight: 700;
3284
+ }
3285
+ .g-save-profile-section-head > small {
3286
+ color: var(--muted);
3287
+ font-size: 12px;
3288
+ }
3289
+ .g-save-profile-stats {
3290
+ display: flex;
3291
+ flex-wrap: wrap;
3292
+ gap: 6px;
3293
+ }
3294
+ .g-save-profile-stats span {
3295
+ display: inline-flex;
3296
+ gap: 5px;
3297
+ align-items: center;
3298
+ padding: 3px 8px;
3299
+ border: 1px solid var(--border-soft);
3300
+ border-radius: 999px;
3301
+ background: var(--surface);
3302
+ color: var(--muted);
3303
+ font-size: 12px;
3304
+ }
3305
+ .g-save-profile-stats strong {
3306
+ color: var(--fg);
3307
+ }
3308
+ .g-save-profile-stats .warn {
3309
+ color: var(--danger);
3310
+ background: var(--danger-soft);
3311
+ }
3312
+ .g-save-profile-entry-list {
3313
+ display: grid;
3314
+ gap: 6px;
3315
+ max-height: 170px;
3316
+ overflow: auto;
3317
+ }
3318
+ .g-save-profile-entry {
3319
+ display: grid;
3320
+ grid-template-columns: minmax(0, 1fr) auto;
3321
+ gap: 10px;
3322
+ align-items: center;
3323
+ padding: 8px 10px;
3324
+ border: 1px solid var(--border-soft);
3325
+ border-radius: var(--radius-sm);
3326
+ background: var(--surface);
3327
+ }
3328
+ .g-save-profile-entry > div {
3329
+ min-width: 0;
3330
+ display: grid;
3331
+ gap: 2px;
3332
+ }
3333
+ .g-save-profile-entry strong,
3334
+ .g-save-profile-entry code {
3335
+ min-width: 0;
3336
+ overflow: hidden;
3337
+ text-overflow: ellipsis;
3338
+ white-space: nowrap;
3339
+ }
3340
+ .g-save-profile-entry code {
3341
+ color: var(--muted);
3342
+ background: transparent;
3343
+ padding: 0;
3344
+ }
3345
+ .g-save-profile-entry.error {
3346
+ border-color: color-mix(in srgb, var(--danger) 35%, var(--border-soft));
3347
+ }
3348
+ .g-save-profile-entry-status {
3349
+ display: inline-flex;
3350
+ align-items: center;
3351
+ min-height: 22px;
3352
+ padding: 2px 8px;
3353
+ border-radius: 999px;
3354
+ background: var(--surface-muted);
3355
+ color: var(--muted);
3356
+ font-size: 12px;
3357
+ font-weight: 700;
3358
+ white-space: nowrap;
3359
+ }
3360
+ .g-save-profile-entry-status.ok {
3361
+ color: var(--success);
3362
+ background: color-mix(in srgb, var(--success) 12%, var(--surface));
3363
+ }
3364
+ .g-save-profile-entry-status.error {
3365
+ color: var(--danger);
3366
+ background: var(--danger-soft);
3367
+ }
3368
+ .g-save-profile-empty {
3369
+ color: var(--muted);
3370
+ font-size: 13px;
3371
+ }
3372
+ .g-save-profile-switch {
3373
+ display: grid;
3374
+ grid-template-columns: repeat(2, minmax(0, 1fr));
3375
+ gap: 4px;
3376
+ padding: 4px;
3377
+ border: 1px solid var(--border-soft);
3378
+ border-radius: 999px;
3379
+ background: var(--surface-muted);
3380
+ }
3381
+ .g-save-profile-switch button {
3382
+ min-width: 0;
3383
+ border-color: transparent;
3384
+ background: transparent;
3385
+ box-shadow: none;
3386
+ }
3387
+ .g-save-profile-switch button.active {
3388
+ background: var(--surface);
3389
+ border-color: color-mix(in srgb, var(--accent) 40%, var(--border-soft));
3390
+ color: var(--accent-strong);
3391
+ box-shadow: 0 3px 12px color-mix(in srgb, var(--accent) 16%, transparent);
3392
+ }
3393
+ .g-save-profile-picker {
3394
+ display: grid;
3395
+ gap: 8px;
3396
+ max-height: 220px;
3397
+ overflow: auto;
3398
+ }
3399
+ .g-save-profile-pick {
3400
+ display: grid;
3401
+ grid-template-columns: minmax(0, 1fr) auto;
3402
+ gap: 10px;
3403
+ align-items: center;
3404
+ justify-content: stretch;
3405
+ min-height: 38px;
3406
+ width: 100%;
3407
+ border-radius: var(--radius-sm);
3408
+ background: var(--surface-muted);
3409
+ box-shadow: none;
3410
+ text-align: left;
3411
+ }
3412
+ .g-save-profile-pick.selected {
3413
+ border-color: color-mix(in srgb, var(--accent) 55%, var(--border-soft));
3414
+ background: color-mix(in srgb, var(--accent) 8%, var(--surface));
3415
+ color: var(--accent-strong);
3416
+ }
3417
+ .g-save-profile-pick span {
3418
+ min-width: 0;
3419
+ overflow: hidden;
3420
+ text-overflow: ellipsis;
3421
+ white-space: nowrap;
3422
+ }
3423
+ .g-save-profile-pick small,
3424
+ .g-save-profile-summary,
3425
+ .g-save-profile-status,
3426
+ .form-row small {
3427
+ color: var(--muted);
3428
+ font-size: 12px;
3429
+ line-height: 1.55;
3430
+ }
3431
+ .g-save-profile-target {
3432
+ display: grid;
3433
+ grid-template-columns: auto minmax(0, 1fr);
3434
+ gap: 4px 10px;
3435
+ align-items: center;
3436
+ padding: 9px 10px;
3437
+ border: 1px solid var(--border-soft);
3438
+ border-radius: var(--radius-sm);
3439
+ background: var(--surface-muted);
3440
+ }
3441
+ .g-save-profile-target > span {
3442
+ color: var(--muted);
3443
+ font-size: 12px;
3444
+ font-weight: 700;
3445
+ }
3446
+ .g-save-profile-target code {
3447
+ min-width: 0;
3448
+ overflow: hidden;
3449
+ text-overflow: ellipsis;
3450
+ }
3451
+ .g-save-profile-target small {
3452
+ grid-column: 2;
3453
+ color: var(--muted);
3454
+ font-size: 12px;
3455
+ }
3456
+ .g-save-profile-summary {
3457
+ padding: 8px 10px;
3458
+ border-radius: var(--radius-sm);
3459
+ background: var(--surface-muted);
3460
+ }
3461
+ .g-save-profile-summary.warn,
3462
+ .g-save-profile-status.error {
3463
+ color: var(--danger);
3464
+ background: var(--danger-soft);
3465
+ }
3466
+ .g-save-profile-status {
3467
+ min-height: 20px;
3468
+ }
3469
+ .g-save-profile-status.ok {
3470
+ color: var(--success);
3471
+ }
3033
3472
  .orb-dot {
3034
3473
  position: absolute;
3035
3474
  right: -1px;
@@ -4471,6 +4910,43 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
4471
4910
  .toggle-row .switch, .toggle-row .switch::after { transition: none; }
4472
4911
  }
4473
4912
 
4913
+ .bd-profile-roles {
4914
+ margin-top: 12px;
4915
+ padding-top: 12px;
4916
+ border-top: 1px solid var(--border-soft);
4917
+ }
4918
+ .bd-profile-role-entry > summary {
4919
+ cursor: pointer;
4920
+ color: var(--fg);
4921
+ font-weight: 700;
4922
+ }
4923
+ .bd-profile-roles .bd-subsection-title {
4924
+ margin: 0 0 4px;
4925
+ }
4926
+ .bd-profile-role-list {
4927
+ display: grid;
4928
+ gap: 8px;
4929
+ margin-top: 10px;
4930
+ }
4931
+ .bd-profile-role-entry {
4932
+ padding: 8px 10px;
4933
+ border: 1px solid var(--border-soft);
4934
+ border-radius: var(--radius-sm);
4935
+ background: var(--surface-muted);
4936
+ }
4937
+ .bd-profile-role-content pre {
4938
+ margin: 8px 0 0;
4939
+ padding: 10px;
4940
+ max-height: 220px;
4941
+ overflow: auto;
4942
+ white-space: pre-wrap;
4943
+ overflow-wrap: anywhere;
4944
+ border-radius: var(--radius-sm);
4945
+ background: var(--surface-raised);
4946
+ color: var(--fg);
4947
+ font: 12px/1.5 var(--mono);
4948
+ }
4949
+
4474
4950
  .bd-tile textarea,
4475
4951
  .bd-tile input[type=text],
4476
4952
  .bd-tile input[type=number] {
@@ -6017,3 +6493,609 @@ body.cp-fx-slice main { animation: cp-fx-slice 0.32s steps(2, end); }
6017
6493
  @media (prefers-reduced-motion: reduce) {
6018
6494
  .skin-intro { display: none; }
6019
6495
  }
6496
+
6497
+ /* ── Insight workbench (owner-only #/insights page) ───────────────────────────
6498
+ Visual layer ported from the reference app (agent-session-insights, html.ts
6499
+ STYLE) so this page reads as that read-only "工作台", not generic dashboard
6500
+ cards. The reference is dark-only with hardcoded hexes; here its variables
6501
+ (--panel/--line/--mut/--acc/--good/--warn/--bad) and stray hexes are remapped
6502
+ to the dashboard's light/dark design tokens and SCOPED under .insights-page,
6503
+ so the workbench look carries over while still respecting the active theme.
6504
+ Phase colors match the reference exactly: edit=green research=blue run=amber
6505
+ delegate=purple discuss=gray. */
6506
+ .insights-page {
6507
+ --panel: var(--surface);
6508
+ --line: var(--border);
6509
+ --mut: var(--muted);
6510
+ --acc: var(--accent);
6511
+ --good: var(--success);
6512
+ --warn: var(--warning);
6513
+ --bad: var(--danger);
6514
+ --ins-inner: var(--surface-muted);
6515
+ --ins-recess: var(--bg-soft);
6516
+ --ins-faint: var(--faint);
6517
+ --ph-edit: var(--success);
6518
+ --ph-research: var(--accent);
6519
+ --ph-run: var(--warning);
6520
+ --ph-delegate: #a06fd6;
6521
+ --ph-discuss: var(--muted);
6522
+ --ph-unknown: var(--border);
6523
+ color: var(--fg);
6524
+ font-size: 14px;
6525
+ line-height: 1.5;
6526
+ }
6527
+ .insight-page-status { color: var(--mut); font-size: 12px; margin: 4px 0 14px; min-height: 14px; }
6528
+
6529
+ /* section labels (uppercase eyebrow) — reference h3 */
6530
+ .insights-page .block h3,
6531
+ .insights-page .insight-detail h3,
6532
+ .insights-page .insight-section-label {
6533
+ font-size: 12px; color: var(--mut); font-weight: 600; letter-spacing: .06em;
6534
+ text-transform: uppercase; margin: 0 0 10px;
6535
+ }
6536
+
6537
+ /* metric cards (reference .cards/.card/.cv/.cl/.cs) */
6538
+ .insights-page .cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 10px; }
6539
+ .insights-page .insights-metrics { margin-bottom: 16px; }
6540
+ .insights-page .card { background: var(--panel); border: 1px solid var(--line); border-radius: 8px; padding: 12px 14px; }
6541
+ .insights-page .cv { font-size: 20px; font-weight: 600; line-height: 1.2; }
6542
+ .insights-page .cl { color: var(--mut); font-size: 12px; margin-top: 4px; }
6543
+ .insights-page .cs { color: var(--mut); font-size: 11px; margin-top: 2px; }
6544
+
6545
+ /* overview blocks (reference .block/.grid2col/.recblock) */
6546
+ .insights-page .block { background: var(--panel); border: 1px solid var(--line); border-radius: 8px; padding: 12px 14px; }
6547
+ .insights-page .recblock { background: var(--ins-inner); }
6548
+ .insights-overview-grid { display: grid; grid-template-columns: 1.25fr 1fr; gap: 14px; margin: 16px 0 18px; }
6549
+ @media (max-width: 900px) { .insights-overview-grid { grid-template-columns: 1fr; } }
6550
+
6551
+ /* recommendations (reference .reclist/.rec/.rectop/.recev/.recact) */
6552
+ .insights-page .reclist { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 8px; }
6553
+ .insights-page .insight-detail .reclist { grid-template-columns: 1fr; }
6554
+ .insights-page .rec {
6555
+ display: grid; grid-template-columns: minmax(0, 1fr); gap: 6px; border: 1px solid var(--line); border-left: 3px solid var(--mut);
6556
+ border-radius: 7px; background: var(--panel); padding: 9px 11px;
6557
+ }
6558
+ /* <button class="rec"> carries UA defaults (justify-content + text-align: center)
6559
+ that centre the card body. The non-clickable rec (no evidence ⇒ no .rec-clickable,
6560
+ which is the only place text-align:left lived) hit exactly that — its impact/actions
6561
+ rendered centred. Reset on every rec button so clickable/non-clickable align identically. */
6562
+ .insights-page button.rec { justify-items: stretch; justify-content: stretch; text-align: left; width: 100%; font: inherit; color: inherit; appearance: none; -webkit-appearance: none; }
6563
+ .insights-page .recblock .rec { background: var(--ins-recess); }
6564
+ .insights-page .rec.bad { border-left-color: var(--bad); }
6565
+ .insights-page .rec.warn { border-left-color: var(--warn); }
6566
+ .insights-page .rec.info { border-left-color: var(--acc); }
6567
+ .insights-page .rectop { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
6568
+ .insights-page .rectop b { font-size: 13px; line-height: 1.35; }
6569
+ .insights-page .rectop span { flex: 0 0 auto; color: var(--mut); border: 1px solid var(--line); border-radius: 999px; padding: 1px 8px; font-size: 11px; white-space: nowrap; }
6570
+ .insights-page .rec.bad .rectop span { color: var(--bad); border-color: var(--bad); }
6571
+ .insights-page .rec.warn .rectop span { color: var(--warn); border-color: var(--warn); }
6572
+ .insights-page .rec.info .rectop span { color: var(--acc); border-color: var(--acc); }
6573
+ .insights-page .recev { color: var(--fg); font-size: 12px; line-height: 1.45; }
6574
+ .insights-page .recact { color: var(--mut); font-size: 12px; line-height: 1.45; }
6575
+
6576
+ /* top failed tools — horizontal bars (reference .hbrow/.hbtrack/.hbfill/.hbval) */
6577
+ .insights-page .hbars { display: grid; gap: 4px; }
6578
+ .insights-page .hbrow { display: grid; grid-template-columns: 116px 1fr 64px; align-items: center; gap: 10px; padding: 4px 4px; border-radius: 6px; }
6579
+ .insights-page .hblabel { font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-family: var(--mono); }
6580
+ .insights-page .hbtrack { background: var(--ins-inner); border-radius: 6px; height: 14px; overflow: hidden; }
6581
+ .insights-page .hbfill { height: 100%; background: linear-gradient(90deg, var(--danger-soft), var(--bad)); border-radius: 6px; min-width: 3px; transform-origin: left; animation: insight-bar-grow .55s ease both; }
6582
+ .insights-page .hbval { font-size: 12px; color: var(--mut); text-align: right; white-space: nowrap; }
6583
+
6584
+ /* workbench: session list | detail (master-detail) */
6585
+ .insight-workbench { display: grid; grid-template-columns: minmax(260px, 320px) minmax(0, 1fr); gap: 14px; align-items: start; }
6586
+ @media (max-width: 900px) { .insight-workbench { grid-template-columns: 1fr; } }
6587
+ .insight-workbench > *, .insight-list-panel, .insight-detail { min-width: 0; }
6588
+ .insight-list-panel, .insight-detail { background: var(--panel); border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; }
6589
+ .insight-list-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 10px; }
6590
+ .insight-list-head h3 { font-size: 13px; margin: 0; }
6591
+ .insight-list-head span { font-size: 11px; color: var(--mut); }
6592
+
6593
+ /* session rows (reference .slist/.srow/.srmain/.srstats) */
6594
+ .insights-page .slist { display: grid; gap: 8px; max-height: 72vh; overflow: auto; }
6595
+ .insights-page .srow {
6596
+ display: grid; grid-template-columns: minmax(0, 1fr); gap: 6px; width: 100%; box-sizing: border-box;
6597
+ background: var(--ins-inner); border: 1px solid var(--line); border-left: 3px solid transparent;
6598
+ border-radius: 8px; padding: 9px 11px; color: inherit; text-align: left; cursor: pointer;
6599
+ transition: background .12s ease, border-color .12s ease, transform .12s ease, box-shadow .15s ease;
6600
+ }
6601
+ .insights-page .srow:hover { background: var(--ins-recess); transform: translateY(-1px); box-shadow: var(--shadow); }
6602
+ .insights-page .srow.on { border-left-color: var(--acc); background: var(--accent-soft); }
6603
+ .insights-page .srow.review { border-left-color: var(--bad); }
6604
+ .insights-page .srmain { display: grid; gap: 5px; min-width: 0; }
6605
+ .insights-page .srmain strong { font-size: 13px; font-weight: 600; line-height: 1.3; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
6606
+ .insights-page .srmain small { font-size: 11px; color: var(--mut); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
6607
+ .insights-page .srstats { display: flex; flex-wrap: wrap; gap: 4px 6px; }
6608
+ .insights-page .srstats b { font-size: 11px; color: var(--mut); font-weight: 500; background: var(--panel); border: 1px solid var(--line); border-radius: 999px; padding: 1px 8px; white-space: nowrap; }
6609
+ .insights-page .srstats b em { font-style: normal; color: var(--fg); font-weight: 600; margin-left: 4px; }
6610
+ .insights-page .srstats b.bad em { color: var(--bad); }
6611
+ .insights-page .srmsg { font-size: 11px; color: var(--mut); }
6612
+
6613
+ /* phase-mix mini bar (reference .mph) + proportional bar (reference .pmx) */
6614
+ .insights-page .mph { display: flex; gap: 1px; height: 7px; overflow: hidden; border-radius: 3px; margin-top: 1px; background: var(--ins-recess); }
6615
+ .insights-page .mph i { display: block; height: 100%; min-width: 1px; }
6616
+ .insights-page .pmx { display: flex; height: 11px; border-radius: 5px; overflow: hidden; background: var(--ins-inner); }
6617
+ .insights-page .pmx i { display: block; height: 100%; }
6618
+ .insights-page i.phase-research { background: var(--ph-research); }
6619
+ .insights-page i.phase-edit { background: var(--ph-edit); }
6620
+ .insights-page i.phase-run { background: var(--ph-run); }
6621
+ .insights-page i.phase-delegate { background: var(--ph-delegate); }
6622
+ .insights-page i.phase-discuss { background: var(--ph-discuss); }
6623
+ .insights-page i.phase-unknown { background: var(--ph-unknown); }
6624
+ .insights-page .leg { font-size: 11px; color: var(--mut); margin-top: 6px; }
6625
+ .insights-page .ld { display: inline-block; width: 9px; height: 9px; border-radius: 2px; margin: 0 4px 0 10px; vertical-align: middle; }
6626
+
6627
+ /* detail head (reference .shead/.smeta) */
6628
+ .insights-page .shead h2 { font-size: 16px; margin: 0 0 4px; }
6629
+ .insights-page .smeta { color: var(--mut); font-size: 12px; margin: 0 0 12px; }
6630
+ .insights-page .smeta code { font-family: var(--mono); }
6631
+ .insights-page .insight-detail-metrics { margin-bottom: 10px; }
6632
+ .insights-page .insight-meta { font-size: 12px; color: var(--mut); margin: 8px 0; }
6633
+ .insights-page .insight-empty { color: var(--mut); padding: 24px; text-align: center; }
6634
+ .insights-page .mut { color: var(--ins-faint); }
6635
+ .insights-page .note { color: var(--mut); font-size: 12px; margin-top: 8px; }
6636
+
6637
+ /* detail tabs: 动作 span / 逐轮对账 (reference .detailtabbar) */
6638
+ .insights-page .detailtabs { margin-top: 16px; }
6639
+ .insights-page .detailtabbar { display: flex; gap: 6px; align-items: center; border-bottom: 1px solid var(--line); margin-bottom: 12px; }
6640
+ .insights-page .detailtabbar button {
6641
+ background: transparent; color: var(--mut); border: 1px solid transparent; border-bottom: 0;
6642
+ border-radius: 7px 7px 0 0; padding: 7px 13px; font: inherit; font-size: 12px; cursor: pointer; margin-bottom: -1px;
6643
+ }
6644
+ .insights-page .detailtabbar button:hover { color: var(--fg); }
6645
+ .insights-page .detailtabbar button.on { color: var(--fg); background: var(--panel); border-color: var(--line); font-weight: 600; }
6646
+ .insights-page .detailtabbar b { font-weight: 500; color: var(--acc); margin-left: 5px; }
6647
+ .insights-page .insight-tab-panel[hidden] { display: none; }
6648
+
6649
+ /* 动作 span — trace (reference .tracebox/.spanlist/.spanrow/.spanst/.spanline) */
6650
+ .insights-page .tracebox { background: var(--ins-inner); border: 1px solid var(--line); border-radius: 8px; padding: 10px 12px; }
6651
+ .insights-page .tracehead { display: flex; align-items: center; justify-content: space-between; gap: 10px; color: var(--mut); font-size: 12px; margin-bottom: 8px; }
6652
+ .insights-page .tracehead b { color: var(--fg); }
6653
+ .insights-page .tracebad { color: var(--bad); }
6654
+ .insights-page .spanlist { display: grid; gap: 5px; max-height: 62vh; overflow: auto; }
6655
+ .insights-page .spanrow {
6656
+ display: grid; grid-template-columns: 104px minmax(0, 1fr); gap: 9px;
6657
+ background: var(--panel); border: 1px solid var(--line); border-left: 3px solid var(--line);
6658
+ border-radius: 7px; padding: 7px 9px;
6659
+ }
6660
+ .insights-page .spanrow.ph-research { border-left-color: var(--ph-research); }
6661
+ .insights-page .spanrow.ph-edit { border-left-color: var(--ph-edit); }
6662
+ .insights-page .spanrow.ph-run { border-left-color: var(--ph-run); }
6663
+ .insights-page .spanrow.ph-delegate { border-left-color: var(--ph-delegate); }
6664
+ .insights-page .spanrow.ph-discuss { border-left-color: var(--ph-discuss); }
6665
+ .insights-page .spanrow.error { background: var(--danger-soft); border-color: var(--bad); border-left-color: var(--bad); }
6666
+ .insights-page .spanrail { display: flex; flex-direction: column; gap: 3px; color: var(--ins-faint); font-size: 11px; font-family: var(--mono); white-space: nowrap; }
6667
+ .insights-page .spanrail .sr-turn { color: var(--mut); }
6668
+ .insights-page .spanbody { display: grid; gap: 4px; min-width: 0; }
6669
+ .insights-page .spantop { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; color: var(--mut); font-size: 11px; }
6670
+ .insights-page .spantop b { font-family: var(--mono); color: var(--fg); font-size: 12px; }
6671
+ .insights-page .spanst { border-radius: 999px; background: var(--ins-inner); border: 1px solid var(--line); padding: 1px 8px; font-size: 10px; font-weight: 700; }
6672
+ .insights-page .spanst.ok { color: var(--good); border-color: var(--good); }
6673
+ .insights-page .spanst.error { color: var(--bad); border-color: var(--bad); }
6674
+ .insights-page .spanst.running { color: var(--warn); border-color: var(--warn); }
6675
+ .insights-page .spanline { display: grid; grid-template-columns: 30px minmax(0, 1fr); gap: 8px; align-items: start; }
6676
+ .insights-page .spanline > span { color: var(--ins-faint); font-size: 11px; text-align: right; line-height: 1.6; }
6677
+ .insights-page .spanline code, .insights-page .spanline em {
6678
+ min-width: 0; overflow-wrap: anywhere; background: var(--bg); border: 1px solid var(--line);
6679
+ border-radius: 5px; padding: 3px 7px; font-family: var(--mono); font-size: 11px; line-height: 1.45; color: var(--fg); font-style: normal;
6680
+ }
6681
+ .insights-page .spanline em { color: var(--mut); }
6682
+
6683
+ /* 逐轮对账 — ledger (reference .ledger/.lrow/.lhead/.lstat) */
6684
+ .insights-page .ledger { display: grid; gap: 6px; max-height: 62vh; overflow: auto; }
6685
+ .insights-page .lrow { background: var(--panel); border: 1px solid var(--line); border-left: 3px solid var(--line); border-radius: 8px; padding: 8px 12px; }
6686
+ .insights-page .lrow.dom-research { border-left-color: var(--ph-research); }
6687
+ .insights-page .lrow.dom-edit { border-left-color: var(--ph-edit); }
6688
+ .insights-page .lrow.dom-run { border-left-color: var(--ph-run); }
6689
+ .insights-page .lrow.dom-delegate { border-left-color: var(--ph-delegate); }
6690
+ .insights-page .lrow.dom-discuss { border-left-color: var(--ph-discuss); }
6691
+ .insights-page .lhead { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
6692
+ .insights-page .lno { color: var(--mut); font-size: 12px; font-family: var(--mono); font-weight: 700; flex: 0 0 auto; }
6693
+ .insights-page .lphases { display: flex; flex-wrap: wrap; gap: 5px; }
6694
+ .insights-page .lphase { display: inline-flex; align-items: center; gap: 5px; background: var(--ins-inner); border-radius: 999px; padding: 2px 8px; font-size: 11px; color: var(--fg); }
6695
+ .insights-page .lphase::before { content: ''; width: 6px; height: 6px; border-radius: 999px; background: var(--mut); }
6696
+ .insights-page .lphase.phase-research::before { background: var(--ph-research); }
6697
+ .insights-page .lphase.phase-edit::before { background: var(--ph-edit); }
6698
+ .insights-page .lphase.phase-run::before { background: var(--ph-run); }
6699
+ .insights-page .lphase.phase-delegate::before { background: var(--ph-delegate); }
6700
+ .insights-page .lphase.phase-discuss::before { background: var(--ph-discuss); }
6701
+ .insights-page .lstat { display: flex; gap: 14px; align-items: center; margin-top: 6px; font-size: 11px; color: var(--mut); flex-wrap: wrap; }
6702
+ .insights-page .lstat b { color: var(--fg); font-weight: 600; }
6703
+ .insights-page .lerr { color: var(--bad); font-weight: 600; }
6704
+ .insights-page .lcontent { display: grid; gap: 6px; margin-top: 8px; min-width: 0; }
6705
+ .insights-page .lcontent-preview,
6706
+ .insights-page .lcontent-more { display: grid; gap: 5px; min-width: 0; }
6707
+ .insights-page .lcontent-line {
6708
+ display: grid; grid-template-columns: 88px minmax(0, 1fr); gap: 8px; align-items: start;
6709
+ background: var(--ins-inner); border: 1px solid var(--line); border-radius: 6px; padding: 5px 8px; min-width: 0;
6710
+ }
6711
+ .insights-page .lcontent-line.error { border-color: rgba(248, 81, 73, .35); background: rgba(248, 81, 73, .07); }
6712
+ .insights-page .lcontent-line b {
6713
+ min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
6714
+ color: var(--mut); font-family: var(--mono); font-size: 11px; font-weight: 650;
6715
+ }
6716
+ .insights-page .lcontent-line span {
6717
+ min-width: 0; color: var(--fg); font-family: var(--mono); font-size: 11px; line-height: 1.45;
6718
+ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; overflow-wrap: anywhere;
6719
+ }
6720
+ .insights-page .lcontent details { color: var(--mut); font-size: 11px; }
6721
+ .insights-page .lcontent summary {
6722
+ cursor: pointer; user-select: none; display: inline-flex; width: fit-content;
6723
+ border: 1px dashed var(--line); border-radius: 999px; padding: 2px 8px; background: var(--bg);
6724
+ }
6725
+ .insights-page .lcontent summary:hover { color: var(--fg); border-color: var(--acc); }
6726
+ .insights-page .lcontent details[open] .lcontent-more { margin-top: 6px; max-height: 260px; overflow: auto; padding-right: 2px; }
6727
+ .insights-page .lcontent details[open] .lcontent-line span {
6728
+ display: block; max-height: 96px; overflow: auto; white-space: pre-wrap;
6729
+ }
6730
+ .insights-page .lcontent-omitted,
6731
+ .insights-page .lcontent-empty { color: var(--mut); font-size: 11px; }
6732
+
6733
+ /* diagnosis-driven: recommendations as evidence entry points + focus/highlight */
6734
+ .insights-page .rec.rec-clickable {
6735
+ cursor: pointer; width: 100%; text-align: left; font: inherit; color: inherit;
6736
+ appearance: none; -webkit-appearance: none; transition: border-color .15s, box-shadow .15s, transform .04s;
6737
+ }
6738
+ .insights-page .rec.rec-clickable:hover { border-color: var(--acc); }
6739
+ .insights-page .rec.rec-clickable:active { transform: translateY(1px); }
6740
+ .insights-page .rec.active { border-color: var(--acc); box-shadow: 0 0 0 1px var(--acc) inset; }
6741
+ .insights-page .rec-cta { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 650; color: var(--acc); }
6742
+ .insights-page .rec.active .rec-cta::before { content: ''; width: 6px; height: 6px; border-radius: 999px; background: var(--acc); }
6743
+ .insights-page .spanrow.hot { border-left-width: 4px; box-shadow: 0 0 0 1px var(--acc) inset; }
6744
+ .insights-page .tracehead .ev-toggle {
6745
+ cursor: pointer; font: inherit; font-size: 11px; color: var(--mut); background: var(--bg);
6746
+ border: 1px dashed var(--line); border-radius: 999px; padding: 2px 10px; white-space: nowrap;
6747
+ }
6748
+ .insights-page .tracehead .ev-toggle:hover { color: var(--fg); border-color: var(--acc); }
6749
+ .insights-page .ev-reason { margin: 0 0 8px; font-size: 12px; color: var(--mut); line-height: 1.45; }
6750
+
6751
+ /* per-turn efficiency metrics (read/edit/run/fail/time + dominant phase) */
6752
+ .insights-page .ldom { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 650; color: var(--fg); flex: 0 0 auto; }
6753
+ .insights-page .ldom::before { content: ''; width: 7px; height: 7px; border-radius: 999px; background: var(--mut); }
6754
+ .insights-page .ldom.phase-research::before { background: var(--ph-research); }
6755
+ .insights-page .ldom.phase-edit::before { background: var(--ph-edit); }
6756
+ .insights-page .ldom.phase-run::before { background: var(--ph-run); }
6757
+ .insights-page .ldom.phase-delegate::before { background: var(--ph-delegate); }
6758
+ .insights-page .ldom.phase-discuss::before { background: var(--ph-discuss); }
6759
+ .insights-page .lmets { display: inline-flex; flex-wrap: wrap; gap: 6px; margin-left: auto; align-items: center; }
6760
+ .insights-page .lmet {
6761
+ display: inline-flex; align-items: baseline; gap: 5px; font-size: 11px; color: var(--mut);
6762
+ background: var(--ins-inner); border-radius: 6px; padding: 2px 7px; border-left: 2px solid var(--line);
6763
+ }
6764
+ .insights-page .lmet i { font-style: normal; }
6765
+ .insights-page .lmet b { color: var(--fg); font-weight: 700; font-family: var(--mono); }
6766
+ .insights-page .lmet.zero { opacity: .4; }
6767
+ .insights-page .lmet.phase-research { border-left-color: var(--ph-research); }
6768
+ .insights-page .lmet.phase-edit { border-left-color: var(--ph-edit); }
6769
+ .insights-page .lmet.phase-run { border-left-color: var(--ph-run); }
6770
+ .insights-page .lmet.phase-delegate { border-left-color: var(--ph-delegate); }
6771
+ .insights-page .lmet.phase-discuss { border-left-color: var(--ph-discuss); }
6772
+ .insights-page .lmet-bad { border-left-color: var(--bad); color: var(--bad); }
6773
+ .insights-page .lmet-bad b { color: var(--bad); }
6774
+ .insights-page .lmet-dur { border-left-color: var(--acc); }
6775
+ .insights-page .lrow.hot { border-left-width: 4px; box-shadow: 0 0 0 1px var(--acc) inset; }
6776
+
6777
+ /* enriched evidence: intent→result span rows */
6778
+ .insights-page .span-subj { font-family: var(--mono); font-size: 11px; color: var(--fg); background: var(--ins-recess); border-radius: 5px; padding: 1px 6px; }
6779
+ .insights-page .span-dur { margin-left: auto; color: var(--mut); font-size: 11px; font-family: var(--mono); flex: 0 0 auto; }
6780
+ .insights-page .span-outcome { margin-top: 4px; }
6781
+ .insights-page .span-res { display: inline-flex; align-items: center; font-size: 11px; border-radius: 999px; padding: 1px 8px; border: 1px solid var(--line); }
6782
+ .insights-page .span-res.rc-bad { color: var(--bad); border-color: var(--bad); background: var(--danger-soft); }
6783
+ /* evidence groups (失败/慢/返工) */
6784
+ .insights-page .evidence { display: grid; gap: 12px; }
6785
+ .insights-page .evgroup { display: grid; gap: 6px; }
6786
+ .insights-page .evgroup-head { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--fg); }
6787
+ .insights-page .evgroup-head b { font-weight: 700; }
6788
+ .insights-page .evgroup-head span { color: var(--mut); background: var(--ins-inner); border-radius: 999px; padding: 0 8px; font-size: 11px; }
6789
+ .insights-page .evgroup-failure .evgroup-head b { color: var(--bad); }
6790
+ .insights-page .evgroup-slow .evgroup-head b { color: var(--warn); }
6791
+ .insights-page .ev-timeline > summary { cursor: pointer; user-select: none; color: var(--mut); font-size: 12px; padding: 4px 0; list-style-position: inside; }
6792
+ .insights-page .ev-timeline > summary:hover { color: var(--fg); }
6793
+ .insights-page .ev-timeline[open] { display: grid; gap: 5px; margin-top: 2px; }
6794
+ /* 轮次效率 cards */
6795
+ .insights-page .turnlist { display: grid; gap: 8px; max-height: 62vh; overflow: auto; }
6796
+ .insights-page .turncard { background: var(--panel); border: 1px solid var(--line); border-left: 3px solid var(--mut); border-radius: 8px; padding: 9px 12px; }
6797
+ .insights-page .turncard.sev-bad { border-left-color: var(--bad); }
6798
+ .insights-page .turncard.sev-warn { border-left-color: var(--warn); }
6799
+ .insights-page .turncard.sev-info { border-left-color: var(--acc); }
6800
+ .insights-page .turncard.hot { box-shadow: 0 0 0 1px var(--acc) inset; }
6801
+ .insights-page .turncard-head { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
6802
+ .insights-page .turn-no { color: var(--mut); font-family: var(--mono); font-size: 12px; font-weight: 700; flex: 0 0 auto; }
6803
+ .insights-page .turn-headline { font-size: 13px; font-weight: 650; color: var(--fg); }
6804
+ .insights-page .turn-metrics { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 7px; }
6805
+ .insights-page .tm { display: inline-flex; align-items: baseline; gap: 4px; font-size: 11px; color: var(--mut); background: var(--ins-inner); border-radius: 6px; padding: 2px 7px; }
6806
+ .insights-page .tm b { color: var(--fg); font-weight: 700; font-family: var(--mono); }
6807
+ .insights-page .tm.bad { color: var(--bad); }
6808
+ .insights-page .tm.bad b { color: var(--bad); }
6809
+ .insights-page .turn-ev { margin-top: 8px; }
6810
+ .insights-page .turn-ev > summary { cursor: pointer; user-select: none; color: var(--mut); font-size: 11px; border: 1px dashed var(--line); border-radius: 999px; padding: 2px 8px; width: fit-content; list-style-position: inside; }
6811
+ .insights-page .turn-ev > summary:hover { color: var(--fg); border-color: var(--acc); }
6812
+ .insights-page .turn-ev[open] .spanlist { margin-top: 6px; }
6813
+ .insights-page .turn-hidden { padding: 6px 2px 0; font-size: 11px; }
6814
+
6815
+ /* ── v3: actionable recommendations + compact evidence rows + 详情 drawer + per-turn timeline ── */
6816
+ .insights-page .rec-impact { font-size: 12px; color: var(--fg); line-height: 1.45; }
6817
+ .insights-page .rec-actions { margin: 2px 0 0; padding-left: 16px; display: grid; gap: 3px; }
6818
+ .insights-page .rec-actions li { font-size: 12px; color: var(--fg); line-height: 1.4; }
6819
+ .insights-page .rec-why { font-size: 11px; color: var(--mut); line-height: 1.4; }
6820
+
6821
+ /* compact span row: one dense flex line (.sprow-line) + optional 详情 drawer (.spandetail) */
6822
+ .insights-page .spanrow { display: block; grid-template-columns: none; padding: 0; overflow: hidden; }
6823
+ .insights-page .sprow-line { display: flex; align-items: center; flex-wrap: wrap; gap: 7px; padding: 6px 9px; font-size: 12px; }
6824
+ .insights-page .sprow-line.clickable { cursor: pointer; }
6825
+ .insights-page .sprow-line.clickable:hover { background: var(--ins-inner); }
6826
+ .insights-page .spanrow.open > .sprow-line { background: var(--ins-inner); }
6827
+ .insights-page .sprow-line.clickable:focus-visible { outline: 2px solid var(--acc); outline-offset: -2px; }
6828
+ .insights-page .span-turn { color: var(--mut); font-family: var(--mono); font-size: 11px; font-weight: 700; flex: 0 0 auto; }
6829
+ .insights-page .span-what { color: var(--fg); font-weight: 600; flex: 0 0 auto; }
6830
+ .insights-page .span-tags { display: inline-flex; gap: 4px; flex-wrap: wrap; }
6831
+ .insights-page .span-tag { font-size: 10px; color: var(--mut); background: var(--ins-inner); border: 1px solid var(--line); border-radius: 999px; padding: 0 7px; }
6832
+ .insights-page .span-tag.tg-failure { color: var(--bad); border-color: var(--bad); }
6833
+ .insights-page .span-tag.tg-slow { color: var(--warn); border-color: var(--warn); }
6834
+ .insights-page .span-tag.tg-retry { color: var(--ph-delegate); border-color: var(--ph-delegate); }
6835
+ .insights-page .span-detail-btn {
6836
+ flex: 0 0 auto; cursor: pointer; font: inherit; font-size: 11px; color: var(--mut);
6837
+ background: var(--bg); border: 1px solid var(--line); border-radius: 999px; padding: 1px 10px;
6838
+ }
6839
+ .insights-page .span-detail-btn:hover { color: var(--fg); border-color: var(--acc); }
6840
+ .insights-page .spanrow.open .span-detail-btn { color: var(--acc); border-color: var(--acc); }
6841
+
6842
+ .insights-page .spandetail { border-top: 1px dashed var(--line); background: var(--ins-recess); padding: 9px 11px; display: grid; gap: 9px; }
6843
+ .insights-page .span-kv { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 7px 14px; margin: 0; }
6844
+ .insights-page .span-kv > div { display: grid; gap: 1px; min-width: 0; }
6845
+ .insights-page .span-kv dt { color: var(--mut); font-size: 10px; text-transform: uppercase; letter-spacing: .04em; }
6846
+ .insights-page .span-kv dd { margin: 0; color: var(--fg); font-size: 12px; font-family: var(--mono); overflow-wrap: anywhere; }
6847
+ .insights-page .span-flank { display: flex; flex-wrap: wrap; gap: 4px 16px; font-size: 11px; color: var(--mut); font-family: var(--mono); }
6848
+ .insights-page .span-ctx { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
6849
+ .insights-page .span-ctx-label { font-size: 10px; color: var(--mut); text-transform: uppercase; letter-spacing: .04em; flex: 0 0 auto; }
6850
+
6851
+ /* operation strip — phase-coloured timeline glyphs (shared by drawer + per-turn rows) */
6852
+ .insights-page .opstrip { display: inline-flex; gap: 3px; flex-wrap: wrap; align-items: center; }
6853
+ .insights-page .op { width: 9px; height: 9px; border-radius: 2px; background: var(--ph-discuss); position: relative; opacity: .9; }
6854
+ .insights-page .op.ph-research { background: var(--ph-research); }
6855
+ .insights-page .op.ph-edit { background: var(--ph-edit); }
6856
+ .insights-page .op.ph-run { background: var(--ph-run); }
6857
+ .insights-page .op.ph-delegate { background: var(--ph-delegate); }
6858
+ .insights-page .op.ph-discuss { background: var(--ph-discuss); }
6859
+ .insights-page .op.bad { outline: 1.5px solid var(--bad); outline-offset: 1px; }
6860
+ .insights-page .op.cur { outline: 2px solid var(--acc); outline-offset: 1px; transform: scale(1.2); z-index: 1; }
6861
+
6862
+ /* 动作 span — filter chips + table */
6863
+ .insights-page .spanfilter { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 10px; }
6864
+ .insights-page .spanchip {
6865
+ cursor: pointer; font: inherit; font-size: 12px; color: var(--mut);
6866
+ background: var(--ins-inner); border: 1px solid var(--line); border-radius: 999px; padding: 3px 11px;
6867
+ }
6868
+ .insights-page .spanchip b { color: var(--fg); font-family: var(--mono); margin-left: 4px; }
6869
+ .insights-page .spanchip:hover { color: var(--fg); border-color: var(--acc); }
6870
+ .insights-page .spanchip.on { color: var(--fg); border-color: var(--acc); background: var(--accent-soft); }
6871
+ .insights-page .spanchip.tg-failure.on { border-color: var(--bad); color: var(--bad); }
6872
+ .insights-page .spanchip.tg-slow.on { border-color: var(--warn); color: var(--warn); }
6873
+ /* block (not grid): grid items with overflow:hidden collapse their auto-row to the border height */
6874
+ .insights-page .spantable { display: block; max-height: 60vh; overflow: auto; padding-right: 2px; }
6875
+ .insights-page .spantable > .spanrow { margin-bottom: 5px; }
6876
+ .insights-page .spantable > .spanrow:last-child { margin-bottom: 0; }
6877
+
6878
+ /* 逐轮对账 — per-turn timeline (all turns; normal collapsed, flagged severity-coloured) */
6879
+ /* block (not grid): grid items with overflow:hidden collapse their auto-row to the border height */
6880
+ .insights-page .turnlist { display: block; max-height: 62vh; overflow: auto; padding-right: 2px; }
6881
+ .insights-page .turnlist > .turnrow { margin-bottom: 8px; }
6882
+ .insights-page .turnlist > .turnrow:last-child { margin-bottom: 0; }
6883
+ .insights-page .turn-sum { padding: 0 2px 4px; font-size: 11px; }
6884
+ /* 会话轨迹 turn-rail */
6885
+ .insights-page .turnrail-block { background: var(--ins-inner); }
6886
+ .insights-page .turnrail-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
6887
+ .insights-page .turnrail-legend { display: flex; gap: 11px; flex-wrap: wrap; font-size: 11px; color: var(--mut); }
6888
+ .insights-page .rl-item { display: inline-flex; align-items: center; gap: 4px; }
6889
+ .insights-page .rl-item i { width: 8px; height: 8px; border-radius: 2px; display: inline-block; }
6890
+ .insights-page .turnrail { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; margin-top: 10px; }
6891
+ /* filled phase-color nodes on a serial main line (mirrors reference design) */
6892
+ .insights-page .railnode { position: relative; min-width: 27px; height: 27px; padding: 0 7px; border: none; border-radius: 7px; background: var(--ph-discuss); color: #fff; font-size: 12px; font-weight: 600; font-variant-numeric: tabular-nums; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; transition: transform .1s ease, box-shadow .1s ease; }
6893
+ .insights-page .railnode > span { text-shadow: 0 1px 2px rgba(0, 0, 0, .35); }
6894
+ .insights-page .railnode:hover { transform: translateY(-2px); box-shadow: 0 3px 10px rgba(0, 0, 0, .3); }
6895
+ .insights-page .railnode.phase-research { background: var(--ph-research); }
6896
+ .insights-page .railnode.phase-edit { background: var(--ph-edit); }
6897
+ .insights-page .railnode.phase-run { background: var(--ph-run); }
6898
+ .insights-page .railnode.phase-delegate { background: var(--ph-delegate); }
6899
+ .insights-page .railnode.phase-discuss { background: var(--ph-discuss); }
6900
+ .insights-page .railnode.phase-unknown { background: var(--ph-unknown); }
6901
+ .insights-page .railnode.hot { outline: 2px solid var(--acc); outline-offset: 1px; }
6902
+ .insights-page .railnode.dim { opacity: .3; }
6903
+ .insights-page .railnode .rb { position: absolute; width: 7px; height: 7px; border-radius: 50%; border: 1px solid var(--ins-inner); }
6904
+ .insights-page .railnode .rb-fail { top: -3px; right: -3px; background: var(--bad); }
6905
+ .insights-page .railnode .rb-slow { bottom: -3px; right: -3px; background: var(--warn); }
6906
+ .insights-page .railnode .rb-rec { top: -3px; left: -3px; background: var(--acc); }
6907
+ /* 委派分支 — subagent branch dots between main-line nodes */
6908
+ .insights-page .railbranch { display: inline-flex; align-items: center; gap: 2px; padding: 0 2px; }
6909
+ .insights-page .rbr-sub { width: 6px; height: 6px; border-radius: 50%; background: #2bb6c4; display: inline-block; }
6910
+ .insights-page .rl-sep { border-left: 1px solid var(--line); padding-left: 11px; }
6911
+ /* 工作时序 Gantt */
6912
+ .insights-page .gantt-block { background: var(--ins-inner); }
6913
+ .insights-page .gantt-cap { font-size: 11px; color: var(--mut); font-variant-numeric: tabular-nums; }
6914
+ .insights-page .gantt { margin-top: 10px; }
6915
+ .insights-page .gtrack { position: relative; height: 34px; background: var(--ins-recess); border: 1px solid var(--line); border-radius: 6px; overflow: hidden; }
6916
+ .insights-page .gbar { position: absolute; top: 5px; height: 24px; min-width: 2px; padding: 0; border: none; border-radius: 2px; background: var(--ph-discuss); opacity: .8; cursor: pointer; }
6917
+ .insights-page .gbar:hover { opacity: 1; box-shadow: 0 0 0 1px var(--fg); z-index: 2; }
6918
+ .insights-page .gbar.phase-research { background: var(--ph-research); }
6919
+ .insights-page .gbar.phase-edit { background: var(--ph-edit); }
6920
+ .insights-page .gbar.phase-run { background: var(--ph-run); }
6921
+ .insights-page .gbar.phase-delegate { background: var(--ph-delegate); }
6922
+ .insights-page .gbar.phase-discuss { background: var(--ph-discuss); }
6923
+ .insights-page .gbar.phase-unknown { background: var(--ph-unknown); }
6924
+ .insights-page .gbar.gbar-slow { top: 1px; height: 32px; }
6925
+ .insights-page .gbar.gbar-fail { background: var(--bad); box-shadow: 0 0 0 1px var(--bad); opacity: 1; }
6926
+ /* 上下文曲线 context curve */
6927
+ .insights-page .ctxcurve-block { background: var(--ins-inner); }
6928
+ .insights-page .ctxchart { display: flex; gap: 8px; margin-top: 10px; }
6929
+ .insights-page .ctxyaxis { display: flex; flex-direction: column; justify-content: space-between; align-items: flex-end; width: 52px; padding-bottom: 16px; font-size: 10px; color: var(--mut); font-variant-numeric: tabular-nums; }
6930
+ .insights-page .ctxplot { flex: 1; min-width: 0; }
6931
+ .insights-page .ctxcurve { display: block; width: 100%; height: 72px; background: var(--ins-recess); border: 1px solid var(--line); border-radius: 6px; }
6932
+ .insights-page .ctxline { fill: none; stroke: var(--acc); stroke-width: 1.5; vector-effect: non-scaling-stroke; }
6933
+ .insights-page .ctxarea { fill: var(--accent-soft); opacity: .4; stroke: none; }
6934
+ .insights-page .ctxhit { fill: transparent; cursor: crosshair; }
6935
+ .insights-page .ctxhit:hover { fill: var(--acc); opacity: .12; }
6936
+ .insights-page .ctxxaxis { display: flex; justify-content: space-between; margin-top: 3px; font-size: 10px; color: var(--mut); font-variant-numeric: tabular-nums; }
6937
+ /* shared hover tooltip for rail / gantt / context curve */
6938
+ .insights-page .ins-tip { position: fixed; z-index: 1200; pointer-events: none; max-width: 340px; padding: 5px 9px; font-size: 11px; line-height: 1.5; color: var(--fg); background: var(--panel); border: 1px solid var(--line); border-radius: 6px; box-shadow: 0 4px 16px rgba(0, 0, 0, .32); font-variant-numeric: tabular-nums; white-space: nowrap; }
6939
+ .insights-page .ins-tip[hidden] { display: none; }
6940
+ .insights-page .turnrow { background: var(--panel); border: 1px solid var(--line); border-left: 3px solid var(--ph-discuss); border-radius: 8px; overflow: hidden; }
6941
+ .insights-page .turnrow.sev-bad { border-left-color: var(--bad); }
6942
+ .insights-page .turnrow.sev-warn { border-left-color: var(--warn); }
6943
+ .insights-page .turnrow.sev-info { border-left-color: var(--line); }
6944
+ .insights-page .turnrow.flagged { background: var(--ins-inner); }
6945
+ .insights-page .turnrow.hot { box-shadow: 0 0 0 1px var(--acc) inset; }
6946
+ .insights-page .turnline { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; padding: 8px 11px; }
6947
+ .insights-page .turnrow .turn-headline { font-size: 12px; }
6948
+ .insights-page .turnrow.sev-info .turn-headline { color: var(--mut); font-weight: 500; }
6949
+ .insights-page .turn-strip { flex: 1 1 120px; }
6950
+ .insights-page .turn-mini { font-size: 11px; color: var(--mut); font-family: var(--mono); flex: 0 0 auto; }
6951
+ .insights-page .turn-expand-btn {
6952
+ flex: 0 0 auto; cursor: pointer; font: inherit; font-size: 11px; color: var(--mut);
6953
+ background: var(--bg); border: 1px solid var(--line); border-radius: 999px; padding: 1px 10px;
6954
+ }
6955
+ .insights-page .turn-expand-btn:hover { color: var(--fg); border-color: var(--acc); }
6956
+ .insights-page .turnrow.open .turn-expand-btn { color: var(--acc); border-color: var(--acc); }
6957
+ .insights-page .turn-prompt { display: flex; gap: 8px; padding: 0 11px 8px; font-size: 12px; align-items: flex-start; }
6958
+ .insights-page .tp-label { flex: 0 0 auto; font-size: 10px; color: var(--mut); text-transform: uppercase; letter-spacing: .04em; border: 1px solid var(--line); border-radius: 999px; padding: 0 7px; margin-top: 2px; }
6959
+ /* prompt source attribution chip (人 / bot / a2a) — replaces the generic 用户 chip when known */
6960
+ .insights-page .tp-src { display: inline-flex; align-items: center; gap: 3px; max-width: 16em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-transform: none; letter-spacing: 0; }
6961
+ .insights-page .tp-src-bot { border-color: var(--ph-delegate); color: var(--ph-delegate); }
6962
+ .insights-page .tp-src-a2a { border-color: var(--acc); color: var(--acc); }
6963
+ .insights-page .tp-src-system { border-color: var(--line); color: var(--mut); opacity: .85; }
6964
+ .insights-page .tp-mentions { font-size: 10px; color: var(--mut); align-self: center; }
6965
+ /* 系统 sender filter chip is a muted opt-in (codex: system 默认弱化) */
6966
+ .insights-page .spanchip-sys { color: var(--mut); opacity: .8; }
6967
+ .insights-page .spanchip-sys.on { opacity: 1; }
6968
+
6969
+ /* full-text prompt modal (老滕: 弹窗看全文) — fixed overlay + centred reading panel */
6970
+ .insights-page .insight-modal { position: fixed; inset: 0; z-index: 1000; }
6971
+ .insights-page .insight-modal[hidden] { display: none; }
6972
+ .insights-page .modal-backdrop { position: absolute; inset: 0; background: rgba(0, 0, 0, .55); }
6973
+ .insights-page .modal-panel { position: relative; margin: 6vh auto 0; width: min(760px, calc(100% - 32px)); max-height: 84vh; display: flex; flex-direction: column; background: var(--panel); border: 1px solid var(--line); border-radius: 12px; box-shadow: 0 24px 64px rgba(0, 0, 0, .45); overflow: hidden; animation: insight-fade-up .18s ease both; }
6974
+ .insights-page .modal-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 11px 14px; border-bottom: 1px solid var(--line); flex: 0 0 auto; }
6975
+ .insights-page .modal-who { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; min-width: 0; }
6976
+ .insights-page .modal-turnno { font-family: var(--mono); font-size: 11px; color: var(--mut); }
6977
+ .insights-page .modal-acts { display: flex; align-items: center; gap: 8px; flex: 0 0 auto; }
6978
+ .insights-page .modal-close { cursor: pointer; font-size: 20px; line-height: 1; color: var(--mut); background: none; border: none; padding: 0 2px; }
6979
+ .insights-page .modal-close:hover { color: var(--fg); }
6980
+ .insights-page .modal-body { padding: 14px 16px; overflow: auto; }
6981
+ .insights-page .modal-md { font-size: 13px; }
6982
+ .insights-page .modal-raw { font-size: 12px; max-height: none; }
6983
+ .insights-page .modal-trunc { margin: 10px 0 0; font-size: 11px; }
6984
+
6985
+ /* 对话回放 (conversation replay) — Feishu-style chat bubbles + load-more */
6986
+ .insights-page .convo { display: flex; flex-direction: column; gap: 10px; }
6987
+ .insights-page .convo-controls { display: flex; flex-direction: column; gap: 8px; }
6988
+ .insights-page .convo-search { width: 100%; padding: 7px 11px; background: var(--ins-inner); border: 1px solid var(--line); border-radius: 8px; color: var(--fg); font: inherit; font-size: 13px; }
6989
+ .insights-page .convo-search:focus { outline: none; border-color: var(--acc); }
6990
+ .insights-page .convo-filters { display: flex; flex-wrap: wrap; gap: 6px 16px; }
6991
+ .insights-page .convo-filters .spanfilter { margin-bottom: 0; align-items: center; }
6992
+ .insights-page .convo-flabel { font-size: 11px; color: var(--mut); margin-right: 2px; align-self: center; }
6993
+ .insights-page .convothread { display: flex; flex-direction: column; gap: 10px; max-height: 64vh; overflow: auto; padding: 4px 2px; }
6994
+ .insights-page .cbub { max-width: 82%; border: 1px solid var(--line); border-radius: 12px; background: var(--panel); padding: 8px 11px; display: flex; flex-direction: column; gap: 5px; }
6995
+ .insights-page .cbub-left { align-self: flex-start; border-top-left-radius: 3px; }
6996
+ .insights-page .cbub-right { align-self: flex-end; border-top-right-radius: 3px; background: var(--accent-soft); border-color: var(--acc); }
6997
+ .insights-page .cbub.sev-bad { border-left: 3px solid var(--bad); }
6998
+ .insights-page .cbub.sev-warn { border-left: 3px solid var(--warn); }
6999
+ .insights-page .cbub-head { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; }
7000
+ .insights-page .cbub-turn { font-family: var(--mono); font-size: 10px; color: var(--mut); }
7001
+ .insights-page .cbub-opcount { font-size: 10px; color: var(--mut); }
7002
+ .insights-page .cbub-rec { font-size: 10px; color: var(--warn); border: 1px solid var(--warn); border-radius: 999px; padding: 0 6px; max-width: 14em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
7003
+ .insights-page .cbub-body { font-size: 13px; min-width: 0; }
7004
+ .insights-page .cbub-body .md-body { font-size: 13px; }
7005
+ .insights-page .cbub-foot { display: flex; justify-content: flex-end; }
7006
+ .insights-page .cbub-ops { background: var(--ins-recess); max-width: 88%; }
7007
+ .insights-page .cbub-ops-list { display: flex; flex-direction: column; gap: 3px; }
7008
+ .insights-page .cop-line { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; font-size: 12px; padding: 3px 5px; border-radius: 6px; }
7009
+ .insights-page .cop-line.clickable { cursor: pointer; }
7010
+ .insights-page .cop-line.clickable:hover { background: var(--ins-inner); }
7011
+ .insights-page .cop.open > .cop-line { background: var(--ins-inner); }
7012
+ .insights-page .cop.bad .span-what { color: var(--bad); }
7013
+ .insights-page .cop .spandetail { border: 1px solid var(--line); border-radius: 6px; margin-top: 3px; }
7014
+ .insights-page .convo-more { display: flex; justify-content: center; padding: 6px 0 2px; }
7015
+ .insights-page p.convo-more { font-size: 11px; }
7016
+ .insights-page .convo-loadmore { font-size: 12px; padding: 5px 16px; }
7017
+
7018
+ /* 文件改动 + 跑过的命令 — work-summary panels at the top of 动作 span */
7019
+ .insights-page .worksum { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 12px; }
7020
+ .insights-page .ws-panel { border: 1px solid var(--line); border-radius: 8px; background: var(--ins-recess); padding: 9px 11px; min-width: 0; }
7021
+ .insights-page .ws-panel h4 { margin: 0 0 7px; font-size: 12px; color: var(--mut); font-weight: 650; }
7022
+ .insights-page .ws-list { display: flex; flex-direction: column; gap: 2px; max-height: 240px; overflow: auto; }
7023
+ .insights-page .ws-row { display: flex; align-items: center; gap: 8px; padding: 2px 0; }
7024
+ .insights-page .ws-path, .insights-page .ws-cmd { font-family: var(--mono); font-size: 11px; color: var(--fg); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 1 1 auto; min-width: 0; }
7025
+ .insights-page .ws-path { direction: rtl; text-align: left; }
7026
+ .insights-page .ws-row.bad .ws-cmd { color: var(--bad); }
7027
+ .insights-page .ws-meta { flex: 0 0 auto; display: inline-flex; gap: 6px; align-items: center; color: var(--mut); font-size: 10.5px; font-family: var(--mono); }
7028
+ .insights-page .ws-stat { flex: 0 0 auto; display: inline-flex; gap: 7px; align-items: baseline; font-family: var(--mono); font-size: 11px; font-weight: 650; font-variant-numeric: tabular-nums; }
7029
+ .insights-page .ws-stat-edits { color: var(--mut); font-weight: 500; }
7030
+ .insights-page .ws-add { color: var(--success); }
7031
+ .insights-page .ws-del { color: var(--danger); }
7032
+ .insights-page .ws-x { color: var(--mut); }
7033
+ .insights-page .ws-fail { color: var(--bad); }
7034
+ @media (max-width: 760px) { .insights-page .worksum { grid-template-columns: 1fr; } }
7035
+ /* prompt 原文: markdown-rendered by default, clamped (展开 lifts the clamp, 原文 shows raw) */
7036
+ .insights-page .tp-body { flex: 1 1 auto; min-width: 0; display: grid; gap: 4px; }
7037
+ .insights-page .tp-md { max-height: 7.5em; overflow: auto; }
7038
+ .insights-page .tp-md.expanded { max-height: 60vh; }
7039
+ .insights-page .tp-actions { display: flex; gap: 6px; }
7040
+ .insights-page .tp-toggle { cursor: pointer; font: inherit; font-size: 10px; color: var(--mut); background: none; border: 1px solid var(--line); border-radius: 999px; padding: 0 8px; }
7041
+ .insights-page .tp-toggle:hover { color: var(--fg); border-color: var(--acc); }
7042
+ .insights-page .tp-raw { margin: 0; font-family: var(--mono); font-size: 11px; line-height: 1.5; white-space: pre-wrap; overflow-wrap: anywhere; color: var(--fg); }
7043
+ /* markdown body — compact, scoped to .insights-page, dashboard tokens only (no new palette) */
7044
+ .insights-page .md-body { color: var(--fg); line-height: 1.55; overflow-wrap: anywhere; }
7045
+ .insights-page .md-body > :first-child { margin-top: 0; }
7046
+ .insights-page .md-body > :last-child { margin-bottom: 0; }
7047
+ .insights-page .md-body p { margin: 4px 0; }
7048
+ .insights-page .md-body h1, .insights-page .md-body h2, .insights-page .md-body h3,
7049
+ .insights-page .md-body h4, .insights-page .md-body h5, .insights-page .md-body h6 { margin: 7px 0 3px; font-size: 12.5px; font-weight: 700; line-height: 1.3; }
7050
+ .insights-page .md-body ul, .insights-page .md-body ol { margin: 4px 0; padding-left: 18px; }
7051
+ .insights-page .md-body li { margin: 1px 0; }
7052
+ .insights-page .md-body blockquote { margin: 5px 0; padding: 2px 10px; border-left: 3px solid var(--line); color: var(--mut); }
7053
+ .insights-page .md-body a { color: var(--acc); text-decoration: underline; }
7054
+ .insights-page .md-body code { font-family: var(--mono); font-size: 11px; background: var(--ins-inner); border: 1px solid var(--line); border-radius: 4px; padding: 0 4px; }
7055
+ .insights-page .md-body pre { margin: 5px 0; background: var(--ins-inner); border: 1px solid var(--line); border-radius: 6px; padding: 7px 9px; overflow-x: auto; }
7056
+ .insights-page .md-body pre code { background: none; border: none; padding: 0; font-size: 11px; line-height: 1.5; white-space: pre; }
7057
+ .insights-page .md-body table { border-collapse: collapse; margin: 5px 0; font-size: 11px; display: block; overflow-x: auto; }
7058
+ .insights-page .md-body th, .insights-page .md-body td { border: 1px solid var(--line); padding: 3px 8px; text-align: left; }
7059
+ .insights-page .md-body th { background: var(--ins-inner); }
7060
+ .insights-page .md-body img { max-width: 100%; height: auto; }
7061
+ .insights-page .md-body hr { border: none; border-top: 1px solid var(--line); margin: 7px 0; }
7062
+ .insights-page .turn-advice { padding: 0 11px 8px; font-size: 12px; color: var(--warn); line-height: 1.45; }
7063
+ .insights-page .turnrow.sev-bad .turn-advice { color: var(--bad); }
7064
+ .insights-page .turn-detail { border-top: 1px dashed var(--line); background: var(--ins-recess); padding: 9px 11px; display: grid; gap: 8px; }
7065
+ .insights-page .turn-detail .turn-metrics { margin-top: 0; }
7066
+
7067
+ /* raw command/output preview inside a 详情 drawer (owner-only, run-class spans) */
7068
+ .insights-page .span-io { display: grid; gap: 3px; }
7069
+ .insights-page .span-io-label { font-size: 10px; color: var(--mut); text-transform: uppercase; letter-spacing: .04em; }
7070
+ .insights-page .span-io-text {
7071
+ margin: 0; font-family: var(--mono); font-size: 11.5px; line-height: 1.5; color: var(--fg);
7072
+ background: var(--ins-inner); border: 1px solid var(--line); border-radius: 6px; padding: 7px 9px;
7073
+ max-height: 220px; overflow: auto; white-space: pre-wrap; overflow-wrap: anywhere;
7074
+ }
7075
+
7076
+ /* 逐轮对账 grouped-by-recommendation mode: section header + turns beneath it */
7077
+ .insights-page .ledgersort { margin-bottom: 10px; }
7078
+ .insights-page .turn-group { margin-bottom: 16px; }
7079
+ .insights-page .turn-group:last-child { margin-bottom: 0; }
7080
+ .insights-page .turn-group > .turnrow { margin-bottom: 8px; }
7081
+ .insights-page .turn-group > .turnrow:last-child { margin-bottom: 0; }
7082
+ .insights-page .turn-group-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 0 2px 7px; margin-bottom: 8px; border-bottom: 1px solid var(--line); }
7083
+ .insights-page .turn-group-head b { font-size: 12px; color: var(--fg); }
7084
+ .insights-page .turn-group-head span { font-size: 11px; color: var(--mut); font-family: var(--mono); flex: 0 0 auto; }
7085
+ .insights-page .turn-group-head.sev-bad b { color: var(--bad); }
7086
+ .insights-page .turn-group-head.sev-warn b { color: var(--warn); }
7087
+
7088
+ /* motion: staggered page-load reveal + grow failure bars */
7089
+ @keyframes insight-fade-up { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
7090
+ @keyframes insight-bar-grow { from { transform: scaleX(0); } to { transform: scaleX(1); } }
7091
+ .insights-page .insights-metrics { animation: insight-fade-up .35s ease both; }
7092
+ .insights-page .insights-overview-grid { animation: insight-fade-up .35s ease both; animation-delay: .05s; }
7093
+ .insights-page .insight-workbench { animation: insight-fade-up .35s ease both; animation-delay: .1s; }
7094
+ @media (prefers-reduced-motion: reduce) {
7095
+ .insights-page .insights-metrics,
7096
+ .insights-page .insights-overview-grid,
7097
+ .insights-page .insight-workbench,
7098
+ .insights-page .hbfill { animation: none; }
7099
+ .insights-page .srow { transition: none; }
7100
+ .insights-page .srow:hover { transform: none; }
7101
+ }