niceeval 0.10.0 → 0.10.2

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 (53) hide show
  1. package/dist/report/components/attempt-detail/AttemptConversation.d.ts +5 -1
  2. package/dist/report/components/attempt-detail/AttemptConversation.js +42 -2
  3. package/dist/report/components/attempt-detail/AttemptSource.js +83 -13
  4. package/dist/report/components/attempt-detail/compute.js +44 -1
  5. package/dist/report/components/attempt-detail/faces.js +4 -0
  6. package/dist/report/components/attempt-detail/index.d.ts +2 -2
  7. package/dist/report/components/attempt-detail/index.js +24 -4
  8. package/dist/report/components/entity-lists/ExperimentList.d.ts +1 -2
  9. package/dist/report/components/entity-lists/ExperimentList.js +6 -5
  10. package/dist/report/components/entity-lists/faces.d.ts +1 -1
  11. package/dist/report/components/entity-lists/faces.js +10 -9
  12. package/dist/report/components/entity-lists/index.d.ts +5 -7
  13. package/dist/report/components/entity-lists/index.js +7 -3
  14. package/dist/report/components/metric-views/MetricScatter.js +2 -38
  15. package/dist/report/index.d.ts +1 -1
  16. package/dist/report/model/format.d.ts +5 -5
  17. package/dist/report/model/format.js +34 -8
  18. package/dist/report/model/types.d.ts +16 -2
  19. package/dist/report/react/index.d.ts +1 -1
  20. package/dist/runner/types.d.ts +2 -1
  21. package/dist/sandbox/e2b.d.ts +0 -1
  22. package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +5 -5
  23. package/docs-site/zh/explanation/runner.mdx +6 -2
  24. package/docs-site/zh/reference/cli.mdx +2 -2
  25. package/docs-site/zh/reference/report-components.mdx +3 -1
  26. package/docs-site/zh/tutorials/experiments.mdx +1 -2
  27. package/docs-site/zh/tutorials/viewing-results.mdx +12 -9
  28. package/docs-site/zh/tutorials/write-experiment.mdx +1 -3
  29. package/package.json +3 -4
  30. package/src/cli.ts +4 -2
  31. package/src/o11y/prices.json +176 -99
  32. package/src/report/assets/styles.css +822 -0
  33. package/src/report/components/attempt-detail/AttemptConversation.tsx +55 -7
  34. package/src/report/components/attempt-detail/AttemptSource.tsx +186 -42
  35. package/src/report/components/attempt-detail/attempt-components.test.tsx +82 -4
  36. package/src/report/components/attempt-detail/compute.ts +50 -1
  37. package/src/report/components/attempt-detail/faces.ts +3 -0
  38. package/src/report/components/attempt-detail/index.tsx +33 -16
  39. package/src/report/components/attempt-detail/validate.test.ts +19 -2
  40. package/src/report/components/entity-lists/ExperimentList.tsx +13 -10
  41. package/src/report/components/entity-lists/faces.ts +10 -9
  42. package/src/report/components/entity-lists/index.tsx +7 -10
  43. package/src/report/components/metric-views/MetricScatter.tsx +2 -38
  44. package/src/report/components/render.test.tsx +19 -9
  45. package/src/report/index.ts +2 -0
  46. package/src/report/model/format.ts +33 -8
  47. package/src/report/model/types.ts +18 -2
  48. package/src/report/react/index.tsx +2 -0
  49. package/src/report/runtime/dual-render.test.tsx +43 -10
  50. package/src/runner/types.ts +2 -1
  51. package/src/sandbox/e2b-reconcile.test.ts +125 -0
  52. package/src/sandbox/e2b.ts +38 -2
  53. package/src/view/view-report.test.ts +3 -1
@@ -769,6 +769,828 @@ table.nre,
769
769
  }
770
770
  .nre-delta-table-empty .nre-missing { margin: 0; }
771
771
 
772
+ /* ---- Attempt 详情组件族 ---------------------------------------------------
773
+ 这些规则属于 report web face,不属于 view dialog chrome:同一份 AttemptDetail
774
+ 无论直接打开独立文档、塞进 view dialog,还是嵌入用户自己的 React 页面,都必须
775
+ 只靠 niceeval/report/react/styles.css 得到完整可读的结构化布局。 ---- */
776
+
777
+ /* Summary:判定与 locator 是标题行,身份/时间/成本是自适应 KPI 网格。 */
778
+ .nre-attempt-summary {
779
+ overflow: hidden;
780
+ border: 1px solid var(--line);
781
+ border-radius: 10px;
782
+ background: var(--panel);
783
+ }
784
+ .nre-attempt-summary .nre-attempt-summary-head {
785
+ display: flex;
786
+ flex-wrap: wrap;
787
+ align-items: center;
788
+ gap: 8px;
789
+ padding: 14px 16px;
790
+ border-bottom: 1px solid var(--line);
791
+ }
792
+ .nre-attempt-summary .nre-attempt-summary-locator {
793
+ min-width: 0;
794
+ color: var(--text);
795
+ font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
796
+ font-size: 13px;
797
+ font-weight: 650;
798
+ overflow-wrap: anywhere;
799
+ }
800
+ .nre-attempt-summary .nre-attempt-summary-kpis {
801
+ display: grid;
802
+ grid-template-columns: repeat(auto-fit, minmax(min(180px, 100%), 1fr));
803
+ margin: 0;
804
+ }
805
+ .nre-attempt-summary .nre-attempt-summary-kpis > div {
806
+ min-width: 0;
807
+ padding: 13px 16px 14px;
808
+ border-right: 1px solid var(--line);
809
+ border-bottom: 1px solid var(--line);
810
+ }
811
+ .nre-attempt-summary .nre-attempt-summary-kpis dt,
812
+ .nre-attempt-usage dt {
813
+ color: var(--soft);
814
+ font-size: 11px;
815
+ font-weight: 560;
816
+ letter-spacing: 0.06em;
817
+ text-transform: uppercase;
818
+ }
819
+ .nre-attempt-summary .nre-attempt-summary-kpis dd,
820
+ .nre-attempt-usage dd {
821
+ margin: 5px 0 0;
822
+ color: var(--text);
823
+ font-size: 13px;
824
+ font-variant-numeric: tabular-nums;
825
+ overflow-wrap: anywhere;
826
+ }
827
+ .nre-attempt-summary .nre-attempt-summary-caps {
828
+ margin: -1px 0 0;
829
+ padding: 9px 16px 10px;
830
+ border-top: 1px solid var(--line);
831
+ color: var(--soft);
832
+ font-size: 11px;
833
+ letter-spacing: 0.04em;
834
+ }
835
+
836
+ /* Error 与断言:同一套左侧语义边和可展开明细。 */
837
+ .nre-attempt-error {
838
+ overflow: hidden;
839
+ border: 1px solid color-mix(in oklch, var(--bad), var(--line) 64%);
840
+ border-left: 3px solid var(--bad);
841
+ border-radius: 9px;
842
+ background: color-mix(in oklch, var(--bad), var(--panel) 95%);
843
+ }
844
+ .nre-attempt-error .nre-attempt-error-fields {
845
+ display: grid;
846
+ grid-template-columns: max-content minmax(0, 1fr);
847
+ gap: 7px 14px;
848
+ margin: 0;
849
+ padding: 13px 15px;
850
+ }
851
+ .nre-attempt-error .nre-attempt-error-fields dt {
852
+ color: var(--soft);
853
+ font-size: 11px;
854
+ font-weight: 600;
855
+ text-transform: uppercase;
856
+ }
857
+ .nre-attempt-error .nre-attempt-error-fields dd {
858
+ min-width: 0;
859
+ margin: 0;
860
+ overflow-wrap: anywhere;
861
+ }
862
+ .nre-attempt-error .nre-attempt-error-stack {
863
+ max-height: 22rem;
864
+ overflow: auto;
865
+ margin: 0;
866
+ padding: 12px 15px;
867
+ border-top: 1px solid color-mix(in oklch, var(--bad), var(--line) 70%);
868
+ background: color-mix(in oklch, var(--bad), var(--panel-2) 96%);
869
+ color: var(--muted);
870
+ font: 12px/1.55 ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
871
+ white-space: pre-wrap;
872
+ overflow-wrap: anywhere;
873
+ }
874
+ .nre-attempt-assertions {
875
+ display: flex;
876
+ flex-direction: column;
877
+ gap: 8px;
878
+ }
879
+ .nre-attempt-assertions .nre-assertion-row,
880
+ .nre-attempt-source .nre-source-line-detail .nre-assertion-row {
881
+ overflow: hidden;
882
+ border: 1px solid var(--line);
883
+ border-left: 3px solid var(--line-strong);
884
+ border-radius: 8px;
885
+ background: var(--panel);
886
+ }
887
+ .nre-attempt-assertions .nre-assertion-row > summary {
888
+ display: flex;
889
+ flex-wrap: wrap;
890
+ align-items: baseline;
891
+ gap: 6px 10px;
892
+ padding: 10px 12px;
893
+ cursor: pointer;
894
+ list-style: none;
895
+ }
896
+ .nre-attempt-assertions .nre-assertion-row > summary::-webkit-details-marker,
897
+ .nre-attempt-assertions .nre-assertions-passed > summary::-webkit-details-marker,
898
+ .nre-attempt-assertions .nre-assertions-passed-group > summary::-webkit-details-marker {
899
+ display: none;
900
+ }
901
+ .nre .nre-assertion-badge {
902
+ flex: 0 0 auto;
903
+ border: 1px solid currentColor;
904
+ border-radius: 999px;
905
+ padding: 1px 7px;
906
+ font-size: 10px;
907
+ font-weight: 650;
908
+ letter-spacing: 0.04em;
909
+ text-transform: uppercase;
910
+ }
911
+ .nre .nre-assertion-name { min-width: 0; font-weight: 600; overflow-wrap: anywhere; }
912
+ .nre .nre-assertion-detail { flex: 1 1 100%; color: var(--muted); font-size: 12px; overflow-wrap: anywhere; }
913
+ .nre .nre-assertion-body {
914
+ display: grid;
915
+ gap: 5px;
916
+ padding: 10px 12px 12px;
917
+ border-top: 1px solid var(--line);
918
+ background: var(--panel-2);
919
+ color: var(--muted);
920
+ font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
921
+ font-size: 12px;
922
+ overflow-wrap: anywhere;
923
+ }
924
+ .nre .nre-tone-good { color: var(--good); }
925
+ .nre .nre-tone-warn { color: var(--warn); }
926
+ .nre .nre-tone-bad { color: var(--bad); }
927
+ .nre .nre-tone-na { color: var(--soft); }
928
+ .nre-attempt-assertions .nre-assertions-passed {
929
+ border: 1px solid var(--line);
930
+ border-radius: 8px;
931
+ background: var(--panel);
932
+ }
933
+ .nre-attempt-assertions .nre-assertions-passed > summary,
934
+ .nre-attempt-assertions .nre-assertions-passed-group > summary {
935
+ padding: 9px 12px;
936
+ color: var(--muted);
937
+ font-size: 12px;
938
+ cursor: pointer;
939
+ list-style: none;
940
+ }
941
+ .nre-attempt-assertions .nre-assertions-passed-group {
942
+ margin: 0 12px 9px;
943
+ border-left: 2px solid var(--line-strong);
944
+ }
945
+
946
+ /* Source:GitHub diff 式整块横向滚动;与产品站示例卡同一套视觉语言(整行 8% 浅染 + 2px 左缘 +
947
+ 行号位图标,规范见 docs/feature/reports/library/attempt-detail.md)。普通行只是 div,
948
+ 只有有证据的行才是可点击 details。 */
949
+ .nre-attempt-source {
950
+ overflow: hidden;
951
+ border: 1px solid var(--line);
952
+ border-radius: 10px;
953
+ background: var(--panel);
954
+ /* 给 .nre-source-line-detail 提供 cqw:展开区按面板可视宽度换行,不跟代码横滚。 */
955
+ container-type: inline-size;
956
+ }
957
+ .nre-attempt-source .nre-attempt-source-head,
958
+ .nre-attempt-source .nre-attempt-source-unmapped-head {
959
+ padding: 7px 12px;
960
+ border-bottom: 1px solid var(--line);
961
+ color: var(--muted);
962
+ font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
963
+ font-size: 12px;
964
+ font-weight: 600;
965
+ overflow-wrap: anywhere;
966
+ background: color-mix(in oklch, var(--panel-2), var(--line) 35%);
967
+ }
968
+ .nre-attempt-source .nre-attempt-source-lines {
969
+ overflow-x: auto;
970
+ padding: 6px 0;
971
+ background: color-mix(in oklch, var(--panel-2), var(--panel) 48%);
972
+ font: 12.5px/1.65 ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
973
+ /* 横滚时行盒要撑到最长行宽度,底色/左缘才能盖满整行,展开区的 sticky 才有位移空间
974
+ (与示例卡 .eval-code 的 display:grid 同法)。 */
975
+ display: grid;
976
+ }
977
+ .nre-attempt-source .nre-source-line {
978
+ color: var(--text);
979
+ }
980
+ .nre-attempt-source .nre-source-line > summary {
981
+ cursor: pointer;
982
+ list-style: none;
983
+ }
984
+ .nre-attempt-source .nre-source-line > summary::-webkit-details-marker { display: none; }
985
+ .nre-attempt-source .nre-source-line-summary {
986
+ display: grid;
987
+ grid-template-columns: 44px minmax(0, 1fr) auto;
988
+ align-items: center;
989
+ min-width: 100%;
990
+ width: max-content;
991
+ padding: 1px 0;
992
+ }
993
+ /* hover 用 background-image 叠加,不覆盖状态行 summary 上的浅染 background-color。 */
994
+ .nre-attempt-source details.nre-source-line > summary:hover {
995
+ background-image: linear-gradient(
996
+ color-mix(in oklch, var(--text), transparent 95%),
997
+ color-mix(in oklch, var(--text), transparent 95%)
998
+ );
999
+ }
1000
+ .nre-attempt-source .nre-source-ln {
1001
+ align-self: stretch;
1002
+ display: flex;
1003
+ align-items: center;
1004
+ justify-content: flex-end;
1005
+ padding-right: 12px;
1006
+ color: var(--soft);
1007
+ font-size: 11px;
1008
+ user-select: none;
1009
+ }
1010
+ .nre-attempt-source .nre-source-ln-mark svg {
1011
+ width: 13px;
1012
+ height: 13px;
1013
+ fill: none;
1014
+ stroke: currentColor;
1015
+ stroke-linecap: round;
1016
+ stroke-linejoin: round;
1017
+ stroke-width: 2;
1018
+ }
1019
+ .nre-attempt-source .nre-source-text {
1020
+ color: var(--text);
1021
+ font: inherit;
1022
+ white-space: pre;
1023
+ }
1024
+ /* 钉在滚动视口右缘:行盒跟随最长行,横滚时分数与 chevron 始终可见(与示例卡 .code-line-actions 同法)。 */
1025
+ .nre-attempt-source .nre-source-line-meta {
1026
+ position: sticky;
1027
+ right: 0;
1028
+ display: flex;
1029
+ align-items: center;
1030
+ gap: 8px;
1031
+ padding: 0 12px 0 16px;
1032
+ font: 11px/1.65 ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
1033
+ white-space: nowrap;
1034
+ }
1035
+ .nre-attempt-source .nre-source-score-badge {
1036
+ padding: 1px 8px;
1037
+ border-radius: 999px;
1038
+ background: color-mix(in oklch, currentColor, transparent 86%);
1039
+ font-weight: 650;
1040
+ }
1041
+ .nre-attempt-source .nre-source-chevron {
1042
+ color: var(--soft);
1043
+ font-size: 16px;
1044
+ line-height: 1;
1045
+ transition: transform 0.14s ease;
1046
+ }
1047
+ .nre-attempt-source details[open] > summary .nre-source-chevron {
1048
+ color: var(--text);
1049
+ transform: rotate(90deg);
1050
+ }
1051
+
1052
+ /* 状态行 = 8% 浅染 + 2px 左缘(所有状态行都是 details,染在 summary 上,展开区不跟着染)。 */
1053
+ .nre-attempt-source .nre-source-line-send > summary {
1054
+ background-color: color-mix(in oklch, var(--nre-c0), transparent 92%);
1055
+ box-shadow: inset 2px 0 0 var(--nre-c0);
1056
+ }
1057
+ .nre-attempt-source .nre-source-line-send .nre-source-ln { color: var(--nre-c0); }
1058
+ .nre-attempt-source .nre-source-line.nre-tone-good > summary {
1059
+ background-color: color-mix(in oklch, var(--good), transparent 92%);
1060
+ box-shadow: inset 2px 0 0 var(--good);
1061
+ }
1062
+ .nre-attempt-source .nre-source-line.nre-tone-good .nre-source-ln { color: var(--good); }
1063
+ .nre-attempt-source .nre-source-line.nre-tone-good .nre-source-score-badge { color: var(--good); }
1064
+ .nre-attempt-source .nre-source-line.nre-tone-bad > summary {
1065
+ background-color: color-mix(in oklch, var(--bad), transparent 92%);
1066
+ box-shadow: inset 2px 0 0 var(--bad);
1067
+ }
1068
+ .nre-attempt-source .nre-source-line.nre-tone-bad .nre-source-ln { color: var(--bad); }
1069
+ .nre-attempt-source .nre-source-line.nre-tone-bad .nre-source-score-badge { color: var(--bad); }
1070
+ .nre-attempt-source .nre-source-line.nre-tone-warn > summary,
1071
+ .nre-attempt-source .nre-source-line.nre-tone-na > summary {
1072
+ background-color: color-mix(in oklch, var(--warn), transparent 92%);
1073
+ box-shadow: inset 2px 0 0 var(--warn);
1074
+ }
1075
+ .nre-attempt-source .nre-source-line.nre-tone-warn .nre-source-ln,
1076
+ .nre-attempt-source .nre-source-line.nre-tone-na .nre-source-ln { color: var(--warn); }
1077
+ .nre-attempt-source .nre-source-line.nre-tone-warn .nre-source-score-badge,
1078
+ .nre-attempt-source .nre-source-line.nre-tone-na .nre-source-score-badge { color: var(--warn); }
1079
+
1080
+ /* 展开区直接接在源码行下:按面板可视宽度(cqw)换行并钉在滚动视口左缘,不跟代码横滚。 */
1081
+ .nre-attempt-source .nre-source-line-detail {
1082
+ position: sticky;
1083
+ left: 0;
1084
+ box-sizing: border-box;
1085
+ display: flex;
1086
+ flex-direction: column;
1087
+ gap: 9px;
1088
+ width: calc(100cqw - 2px);
1089
+ padding: 8px 14px 12px 44px;
1090
+ border-top: 1px dashed var(--line);
1091
+ box-shadow: inset 2px 0 0 color-mix(in oklch, var(--nre-c0), var(--line) 40%);
1092
+ color: var(--text);
1093
+ font: 12.5px/1.55 ui-sans-serif, -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", sans-serif;
1094
+ white-space: normal;
1095
+ }
1096
+ .nre-attempt-source .nre-source-line.nre-tone-good > .nre-source-line-detail { box-shadow: inset 2px 0 0 var(--good); }
1097
+ .nre-attempt-source .nre-source-line.nre-tone-bad > .nre-source-line-detail { box-shadow: inset 2px 0 0 var(--bad); }
1098
+ .nre-attempt-source .nre-source-line.nre-tone-warn > .nre-source-line-detail,
1099
+ .nre-attempt-source .nre-source-line.nre-tone-na > .nre-source-line-detail { box-shadow: inset 2px 0 0 var(--warn); }
1100
+ .nre-attempt-source .nre-source-line-detail .nre-assertion-row {
1101
+ display: grid;
1102
+ font-size: 12px;
1103
+ }
1104
+ .nre-attempt-source .nre-source-assertion-head {
1105
+ display: flex;
1106
+ align-items: baseline;
1107
+ gap: 8px;
1108
+ padding: 8px 10px;
1109
+ }
1110
+ .nre-attempt-source .nre-source-assertion-score { margin-left: auto; font-variant-numeric: tabular-nums; }
1111
+ .nre-attempt-source .nre-source-line-detail .nre-assertion-detail { padding: 0 10px 8px; }
1112
+ .nre-attempt-source .nre-source-turn {
1113
+ overflow: visible;
1114
+ border: 0;
1115
+ border-radius: 0;
1116
+ background: transparent;
1117
+ color: var(--text);
1118
+ }
1119
+ .nre-attempt-source .nre-source-turn-head {
1120
+ display: flex;
1121
+ gap: 10px;
1122
+ padding: 7px 10px;
1123
+ border-bottom: 1px solid var(--line);
1124
+ color: var(--muted);
1125
+ font: 11px/1.4 ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
1126
+ }
1127
+ .nre-attempt-source .nre-source-turn-head > :first-child { color: var(--text); font-weight: 650; }
1128
+ .nre-attempt-source .nre-source-line-detail .nre-source-turn-head,
1129
+ .nre-attempt-source .nre-source-line-detail .nre-source-turn > .nre-conv-sent { display: none; }
1130
+ .nre-attempt-source .nre-source-line-detail .nre-conv-replies {
1131
+ display: flex;
1132
+ flex-direction: column;
1133
+ gap: 9px;
1134
+ margin: 0;
1135
+ padding: 0;
1136
+ }
1137
+ .nre-attempt-source .nre-source-line-detail .nre-conv-assistant,
1138
+ .nre-attempt-source .nre-source-line-detail .nre-conv-user,
1139
+ .nre-attempt-source .nre-source-line-detail .nre-conv-skill,
1140
+ .nre-attempt-source .nre-source-line-detail .nre-conv-error,
1141
+ .nre-attempt-source .nre-source-line-detail .nre-conv-input,
1142
+ .nre-attempt-source .nre-source-line-detail .nre-conv-compaction,
1143
+ .nre-attempt-source .nre-source-line-detail .nre-conv-thinking,
1144
+ .nre-attempt-source .nre-source-line-detail .nre-conv-tool,
1145
+ .nre-attempt-source .nre-source-line-detail .nre-conv-subagent,
1146
+ .nre-attempt-source .nre-source-line-detail .nre-conv-raw {
1147
+ min-width: 0;
1148
+ margin: 0;
1149
+ border: 0;
1150
+ border-radius: 0;
1151
+ padding: 0;
1152
+ background: transparent;
1153
+ color: var(--muted);
1154
+ font-size: 12px;
1155
+ }
1156
+ .nre-attempt-source .nre-source-line-detail .nre-conv-role {
1157
+ display: block;
1158
+ margin-bottom: 2px;
1159
+ color: var(--blue, var(--nre-c0));
1160
+ font-size: 10px;
1161
+ letter-spacing: 0.05em;
1162
+ text-transform: uppercase;
1163
+ }
1164
+ .nre-attempt-source .nre-source-line-detail .nre-conv-text {
1165
+ color: var(--text);
1166
+ white-space: pre-wrap;
1167
+ overflow-wrap: anywhere;
1168
+ }
1169
+ .nre-attempt-source .nre-source-line-detail .nre-conv-user .nre-conv-text { color: var(--muted); }
1170
+ .nre-attempt-source .nre-source-line-detail .nre-conv-thinking > summary,
1171
+ .nre-attempt-source .nre-source-line-detail .nre-conv-subagent > summary,
1172
+ .nre-attempt-source .nre-source-line-detail .nre-conv-raw > summary {
1173
+ cursor: pointer;
1174
+ list-style: none;
1175
+ color: var(--muted);
1176
+ }
1177
+ .nre-attempt-source .nre-source-line-detail .nre-conv-thinking > summary::-webkit-details-marker,
1178
+ .nre-attempt-source .nre-source-line-detail .nre-conv-subagent > summary::-webkit-details-marker,
1179
+ .nre-attempt-source .nre-source-line-detail .nre-conv-raw > summary::-webkit-details-marker { display: none; }
1180
+ .nre-attempt-source .nre-source-line-detail .nre-conv-subagent > summary::before,
1181
+ .nre-attempt-source .nre-source-line-detail .nre-conv-raw > summary::before { content: "▸ "; }
1182
+ .nre-attempt-source .nre-source-line-detail .nre-conv-thinking > summary::before { content: "▸ "; }
1183
+ .nre-attempt-source .nre-source-line-detail .nre-conv-subagent[open] > summary::before,
1184
+ .nre-attempt-source .nre-source-line-detail .nre-conv-raw[open] > summary::before,
1185
+ .nre-attempt-source .nre-source-line-detail .nre-conv-thinking[open] > summary::before { content: "▾ "; }
1186
+ .nre-attempt-source .nre-source-line-detail .nre-conv-tool > summary {
1187
+ display: grid;
1188
+ grid-template-columns: 8px minmax(110px, max-content) minmax(0, 1fr);
1189
+ align-items: center;
1190
+ gap: 9px;
1191
+ min-width: 0;
1192
+ cursor: pointer;
1193
+ list-style: none;
1194
+ }
1195
+ .nre-attempt-source .nre-source-line-detail .nre-conv-tool > summary::-webkit-details-marker { display: none; }
1196
+ .nre-attempt-source .nre-source-line-detail .nre-conv-tool-dot {
1197
+ width: 8px;
1198
+ height: 8px;
1199
+ border-radius: 999px;
1200
+ background: var(--good);
1201
+ }
1202
+ .nre-attempt-source .nre-source-line-detail .nre-conv-tool-failed { background: var(--bad); }
1203
+ .nre-attempt-source .nre-source-line-detail .nre-conv-tool-rejected { background: var(--warn); }
1204
+ .nre-attempt-source .nre-source-line-detail .nre-conv-tool-pending { background: var(--soft); }
1205
+ .nre-attempt-source .nre-source-line-detail .nre-conv-tool-name {
1206
+ overflow: hidden;
1207
+ color: var(--text);
1208
+ font: 600 12px/1.5 ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
1209
+ text-overflow: ellipsis;
1210
+ white-space: nowrap;
1211
+ }
1212
+ .nre-attempt-source .nre-source-line-detail .nre-conv-tool-preview {
1213
+ overflow: hidden;
1214
+ color: var(--soft);
1215
+ font-size: 12px;
1216
+ text-overflow: ellipsis;
1217
+ white-space: nowrap;
1218
+ }
1219
+ .nre-attempt-source .nre-source-line-detail .nre-conv-tool-io {
1220
+ max-height: 220px;
1221
+ overflow: auto;
1222
+ margin: 6px 0 0;
1223
+ padding: 8px 10px;
1224
+ border: 1px solid var(--line);
1225
+ border-radius: 6px;
1226
+ background: color-mix(in oklch, var(--panel), black 8%);
1227
+ color: var(--muted);
1228
+ font: 11px/1.45 ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
1229
+ white-space: pre-wrap;
1230
+ overflow-wrap: anywhere;
1231
+ }
1232
+ .nre-attempt-source .nre-attempt-source-unmapped,
1233
+ .nre-attempt-source .nre-attempt-source-unlocated { border-top: 1px solid var(--line); }
1234
+ .nre-attempt-source .nre-attempt-source-unmapped > .nre-assertion-row {
1235
+ display: flex;
1236
+ gap: 10px;
1237
+ padding: 8px 14px;
1238
+ border-bottom: 1px solid var(--line);
1239
+ font-size: 12px;
1240
+ }
1241
+ .nre-attempt-source .nre-attempt-source-unlocated > .nre-source-turn { margin: 10px 14px; }
1242
+ .nre-attempt-source .nre-attempt-source-unlocated > .nre-source-turn {
1243
+ overflow: hidden;
1244
+ border: 1px solid var(--line);
1245
+ border-left: 3px solid var(--blue, var(--nre-c0));
1246
+ border-radius: 8px;
1247
+ background: var(--panel-2);
1248
+ }
1249
+ .nre-attempt-source .nre-attempt-source-unlocated > .nre-source-turn-failed { border-left-color: var(--bad); }
1250
+ .nre-attempt-source .nre-attempt-source-unlocated > .nre-source-turn-waiting { border-left-color: var(--warn); }
1251
+
1252
+ /* 逐行轻量 TypeScript token;暗色取 VS Code Dark+ 系(与产品站示例卡的 prism vsDark 同源),
1253
+ 浅色为等价可读色。 */
1254
+ .nre-attempt-source .tok-comment { color: light-dark(#6e7781, #6a9955); font-style: italic; }
1255
+ .nre-attempt-source .tok-str { color: light-dark(#953800, #ce9178); }
1256
+ .nre-attempt-source .tok-kw { color: light-dark(#0b62d6, #569cd6); }
1257
+ .nre-attempt-source .tok-num { color: light-dark(#116329, #b5cea8); }
1258
+ .nre-attempt-source .tok-fn { color: light-dark(#755f00, #dcdcaa); }
1259
+
1260
+ /* Fix prompt 与时间树:顶层 details 是完整 panel,嵌套 details 只负责层级。 */
1261
+ .nre-attempt-fix-prompt,
1262
+ .nre-attempt-timeline {
1263
+ overflow: hidden;
1264
+ border: 1px solid var(--line);
1265
+ border-radius: 9px;
1266
+ background: var(--panel);
1267
+ }
1268
+ .nre-attempt-fix-prompt > summary,
1269
+ .nre-attempt-timeline > summary {
1270
+ display: flex;
1271
+ align-items: baseline;
1272
+ justify-content: space-between;
1273
+ gap: 12px;
1274
+ padding: 11px 14px;
1275
+ color: var(--text);
1276
+ font-weight: 650;
1277
+ cursor: pointer;
1278
+ list-style: none;
1279
+ }
1280
+ .nre-attempt-fix-prompt > summary::-webkit-details-marker,
1281
+ .nre-attempt-timeline > summary::-webkit-details-marker,
1282
+ .nre-attempt-timeline summary::-webkit-details-marker,
1283
+ .nre-attempt-trace summary::-webkit-details-marker,
1284
+ .nre-attempt-conversation summary::-webkit-details-marker {
1285
+ display: none;
1286
+ }
1287
+ .nre-attempt-fix-prompt[open] > summary,
1288
+ .nre-attempt-timeline[open] > summary { border-bottom: 1px solid var(--line); }
1289
+ .nre-attempt-fix-prompt .nre-attempt-fix-prompt-copy {
1290
+ margin: 12px 14px 0;
1291
+ border: 1px solid var(--line-strong);
1292
+ border-radius: 6px;
1293
+ padding: 5px 9px;
1294
+ background: var(--panel-2);
1295
+ color: var(--text);
1296
+ font: inherit;
1297
+ font-size: 11px;
1298
+ cursor: pointer;
1299
+ }
1300
+ .nre-attempt-fix-prompt .nre-attempt-fix-prompt-copy:hover { border-color: var(--soft); }
1301
+ .nre-attempt-fix-prompt .nre-attempt-fix-prompt-text {
1302
+ max-height: 28rem;
1303
+ overflow: auto;
1304
+ margin: 10px 14px 14px;
1305
+ padding: 12px;
1306
+ border: 1px solid var(--line);
1307
+ border-radius: 7px;
1308
+ background: var(--panel-2);
1309
+ color: var(--muted);
1310
+ font: 12px/1.55 ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
1311
+ white-space: pre-wrap;
1312
+ overflow-wrap: anywhere;
1313
+ }
1314
+ .nre-attempt-timeline .nre-timeline-phases,
1315
+ .nre-attempt-timeline .nre-timeline-children,
1316
+ .nre-attempt-timeline .nre-timeline-spans {
1317
+ list-style: none;
1318
+ margin: 0;
1319
+ padding: 0;
1320
+ }
1321
+ .nre-attempt-timeline > .nre-timeline-phases { padding: 7px 14px 10px; }
1322
+ .nre-attempt-timeline .nre-timeline-phase,
1323
+ .nre-attempt-timeline .nre-timeline-node,
1324
+ .nre-attempt-timeline .nre-timeline-spans > li {
1325
+ display: flex;
1326
+ min-width: 0;
1327
+ align-items: baseline;
1328
+ justify-content: space-between;
1329
+ gap: 12px;
1330
+ padding: 6px 8px;
1331
+ border-radius: 5px;
1332
+ color: var(--muted);
1333
+ font-size: 12px;
1334
+ list-style: none;
1335
+ }
1336
+ .nre-attempt-timeline summary.nre-timeline-phase,
1337
+ .nre-attempt-timeline summary.nre-timeline-node { cursor: pointer; }
1338
+ .nre-attempt-timeline summary.nre-timeline-phase:hover,
1339
+ .nre-attempt-timeline summary.nre-timeline-node:hover { background: var(--panel-2); }
1340
+ .nre-attempt-timeline .nre-timeline-dur,
1341
+ .nre-attempt-trace .nre-span-dur {
1342
+ flex: 0 0 auto;
1343
+ margin-left: auto;
1344
+ color: var(--soft);
1345
+ font-variant-numeric: tabular-nums;
1346
+ white-space: nowrap;
1347
+ }
1348
+ .nre-attempt-timeline .nre-timeline-children,
1349
+ .nre-attempt-timeline .nre-timeline-spans {
1350
+ margin-left: 15px;
1351
+ padding-left: 11px;
1352
+ border-left: 1px solid var(--line);
1353
+ }
1354
+ .nre-attempt-timeline .nre-timeline-failed { color: var(--bad); }
1355
+ .nre-attempt-timeline .nre-timeline-closing {
1356
+ padding: 8px 14px 11px;
1357
+ border-top: 1px solid var(--line);
1358
+ background: var(--panel-2);
1359
+ }
1360
+ .nre-attempt-timeline .nre-timeline-closing-head {
1361
+ margin-bottom: 3px;
1362
+ color: var(--soft);
1363
+ font-size: 10px;
1364
+ font-weight: 650;
1365
+ letter-spacing: 0.07em;
1366
+ text-transform: uppercase;
1367
+ }
1368
+
1369
+ /* Diagnostics 与 usage:技术信息保持紧凑,但不再落成裸 ul/dl。 */
1370
+ .nre-attempt-diagnostics {
1371
+ display: grid;
1372
+ gap: 9px;
1373
+ }
1374
+ .nre-attempt-diagnostics .nre-diagnostics-group {
1375
+ overflow: hidden;
1376
+ border: 1px solid var(--line);
1377
+ border-radius: 8px;
1378
+ background: var(--panel);
1379
+ }
1380
+ .nre-attempt-diagnostics .nre-diagnostics-phase {
1381
+ padding: 8px 12px;
1382
+ border-bottom: 1px solid var(--line);
1383
+ color: var(--soft);
1384
+ font-size: 11px;
1385
+ font-weight: 650;
1386
+ }
1387
+ .nre-attempt-diagnostics .nre-diagnostics-group ul { list-style: none; margin: 0; padding: 0; }
1388
+ .nre-attempt-diagnostics .nre-diagnostics-item {
1389
+ display: grid;
1390
+ gap: 3px;
1391
+ padding: 9px 12px;
1392
+ border-bottom: 1px solid var(--line);
1393
+ color: var(--muted);
1394
+ font-size: 12px;
1395
+ }
1396
+ .nre-attempt-diagnostics .nre-diagnostics-item:last-child { border-bottom: 0; }
1397
+ .nre-attempt-diagnostics .nre-diagnostics-meta {
1398
+ color: currentColor;
1399
+ font-size: 10px;
1400
+ font-weight: 650;
1401
+ letter-spacing: 0.04em;
1402
+ text-transform: uppercase;
1403
+ }
1404
+ .nre-attempt-usage {
1405
+ display: grid;
1406
+ grid-template-columns: repeat(auto-fit, minmax(min(130px, 100%), 1fr));
1407
+ overflow: hidden;
1408
+ margin: 0;
1409
+ border: 1px solid var(--line);
1410
+ border-radius: 9px;
1411
+ background: var(--panel);
1412
+ }
1413
+ .nre-attempt-usage .nre-attempt-usage-row {
1414
+ min-width: 0;
1415
+ padding: 11px 13px;
1416
+ border-right: 1px solid var(--line);
1417
+ border-bottom: 1px solid var(--line);
1418
+ }
1419
+
1420
+ /* Conversation:每轮一张卡,sent 与 replies 分层;长输出在自己的 pre 内滚动。 */
1421
+ .nre-attempt-conversation {
1422
+ display: flex;
1423
+ flex-direction: column;
1424
+ gap: 10px;
1425
+ }
1426
+ .nre-attempt-conversation .nre-conv-round {
1427
+ overflow: hidden;
1428
+ border: 1px solid var(--line);
1429
+ border-radius: 9px;
1430
+ background: var(--panel);
1431
+ }
1432
+ .nre-attempt-conversation .nre-conv-round-head {
1433
+ display: flex;
1434
+ flex-wrap: wrap;
1435
+ align-items: baseline;
1436
+ justify-content: space-between;
1437
+ gap: 6px 12px;
1438
+ padding: 8px 12px;
1439
+ border-bottom: 1px solid var(--line);
1440
+ color: var(--soft);
1441
+ font-size: 11px;
1442
+ font-weight: 650;
1443
+ letter-spacing: 0.04em;
1444
+ }
1445
+ .nre-attempt-conversation .nre-conv-round-loc {
1446
+ font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
1447
+ font-weight: 450;
1448
+ }
1449
+ .nre-attempt-conversation .nre-conv-sent {
1450
+ padding: 11px 13px;
1451
+ border-bottom: 1px solid var(--line);
1452
+ background: color-mix(in oklch, var(--blue, var(--nre-c0)), var(--panel) 94%);
1453
+ color: var(--text);
1454
+ white-space: pre-wrap;
1455
+ overflow-wrap: anywhere;
1456
+ }
1457
+ .nre-attempt-conversation .nre-conv-replies {
1458
+ display: flex;
1459
+ flex-direction: column;
1460
+ gap: 6px;
1461
+ padding: 10px;
1462
+ }
1463
+ .nre-attempt-conversation .nre-conv-assistant,
1464
+ .nre-attempt-conversation .nre-conv-user,
1465
+ .nre-attempt-conversation .nre-conv-skill,
1466
+ .nre-attempt-conversation .nre-conv-error,
1467
+ .nre-attempt-conversation .nre-conv-input,
1468
+ .nre-attempt-conversation .nre-conv-compaction,
1469
+ .nre-attempt-conversation .nre-conv-thinking,
1470
+ .nre-attempt-conversation .nre-conv-tool,
1471
+ .nre-attempt-conversation .nre-conv-subagent,
1472
+ .nre-attempt-conversation .nre-conv-raw {
1473
+ min-width: 0;
1474
+ border: 1px solid var(--line);
1475
+ border-radius: 7px;
1476
+ padding: 8px 10px;
1477
+ background: var(--panel-2);
1478
+ color: var(--muted);
1479
+ font-size: 12px;
1480
+ }
1481
+ .nre-attempt-conversation .nre-conv-role {
1482
+ display: block;
1483
+ margin-bottom: 4px;
1484
+ color: var(--soft);
1485
+ font-size: 10px;
1486
+ font-weight: 700;
1487
+ letter-spacing: 0.06em;
1488
+ text-transform: uppercase;
1489
+ }
1490
+ .nre-attempt-conversation .nre-conv-text { color: var(--text); white-space: pre-wrap; overflow-wrap: anywhere; }
1491
+ .nre-attempt-conversation .nre-conv-error { border-color: color-mix(in oklch, var(--bad), var(--line) 62%); color: var(--bad); }
1492
+ .nre-attempt-conversation .nre-conv-input { border-color: color-mix(in oklch, var(--warn), var(--line) 62%); color: var(--warn); }
1493
+ .nre-attempt-conversation .nre-conv-thinking > summary,
1494
+ .nre-attempt-conversation .nre-conv-tool > summary,
1495
+ .nre-attempt-conversation .nre-conv-subagent > summary,
1496
+ .nre-attempt-conversation .nre-conv-raw > summary {
1497
+ cursor: pointer;
1498
+ list-style: none;
1499
+ font-weight: 600;
1500
+ }
1501
+ .nre-attempt-conversation .nre-conv-thinking > .nre-conv-text { margin-top: 7px; }
1502
+ .nre-attempt-conversation .nre-conv-tool-io {
1503
+ max-height: 24rem;
1504
+ overflow: auto;
1505
+ margin: 8px 0 0;
1506
+ padding: 8px;
1507
+ border: 1px solid var(--line);
1508
+ border-radius: 5px;
1509
+ background: var(--panel);
1510
+ color: var(--muted);
1511
+ font: 11px/1.5 ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
1512
+ white-space: pre-wrap;
1513
+ overflow-wrap: anywhere;
1514
+ }
1515
+
1516
+ /* 原始 trace 与 diff 摘要。 */
1517
+ .nre-attempt-trace,
1518
+ .nre-attempt-trace .nre-trace-children,
1519
+ .nre-attempt-diff {
1520
+ list-style: none;
1521
+ margin: 0;
1522
+ padding: 0;
1523
+ }
1524
+ .nre-attempt-trace {
1525
+ overflow: hidden;
1526
+ border: 1px solid var(--line);
1527
+ border-radius: 9px;
1528
+ background: var(--panel);
1529
+ }
1530
+ .nre-attempt-trace .nre-trace-span {
1531
+ display: grid;
1532
+ grid-template-columns: minmax(64px, max-content) minmax(0, 1fr) max-content auto;
1533
+ align-items: baseline;
1534
+ gap: 10px;
1535
+ padding: 8px 11px;
1536
+ border-bottom: 1px solid var(--line);
1537
+ color: var(--muted);
1538
+ font-size: 12px;
1539
+ list-style: none;
1540
+ }
1541
+ .nre-attempt-trace summary.nre-trace-span { cursor: pointer; }
1542
+ .nre-attempt-trace summary.nre-trace-span:hover { background: var(--panel-2); }
1543
+ .nre-attempt-trace .nre-trace-children {
1544
+ margin-left: 15px;
1545
+ border-left: 1px solid var(--line);
1546
+ }
1547
+ .nre-attempt-trace .nre-span-kind {
1548
+ border: 1px solid var(--line);
1549
+ border-radius: 999px;
1550
+ padding: 1px 6px;
1551
+ color: var(--soft);
1552
+ font-size: 10px;
1553
+ text-align: center;
1554
+ }
1555
+ .nre-attempt-diff {
1556
+ overflow: hidden;
1557
+ border: 1px solid var(--line);
1558
+ border-radius: 9px;
1559
+ background: var(--panel);
1560
+ }
1561
+ .nre-attempt-diff .nre-diff-file {
1562
+ display: grid;
1563
+ grid-template-columns: 74px minmax(0, 1fr) max-content;
1564
+ align-items: baseline;
1565
+ gap: 10px;
1566
+ padding: 8px 12px;
1567
+ border-bottom: 1px solid var(--line);
1568
+ font-size: 12px;
1569
+ }
1570
+ .nre-attempt-diff .nre-diff-file:last-child { border-bottom: 0; }
1571
+ .nre-attempt-diff .nre-diff-net {
1572
+ color: var(--soft);
1573
+ font-size: 10px;
1574
+ font-weight: 650;
1575
+ letter-spacing: 0.04em;
1576
+ text-transform: uppercase;
1577
+ }
1578
+ .nre-attempt-diff .nre-diff-path { min-width: 0; font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace; overflow-wrap: anywhere; }
1579
+ .nre-attempt-diff .nre-diff-lines { color: var(--muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
1580
+ .nre-attempt-diff .nre-diff-added .nre-diff-net { color: var(--good); }
1581
+ .nre-attempt-diff .nre-diff-modified .nre-diff-net { color: var(--warn); }
1582
+ .nre-attempt-diff .nre-diff-deleted .nre-diff-net { color: var(--bad); }
1583
+
1584
+ @media (max-width: 640px) {
1585
+ .nre-attempt-summary .nre-attempt-summary-kpis { grid-template-columns: 1fr; }
1586
+ .nre-attempt-summary .nre-attempt-summary-kpis > div { border-right: 0; }
1587
+ .nre-attempt-error .nre-attempt-error-fields { grid-template-columns: 1fr; gap: 2px; }
1588
+ .nre-attempt-usage { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1589
+ .nre-attempt-trace .nre-trace-span { grid-template-columns: max-content minmax(0, 1fr) max-content; }
1590
+ .nre-attempt-diff .nre-diff-file { grid-template-columns: 1fr max-content; }
1591
+ .nre-attempt-diff .nre-diff-net { grid-column: 1 / -1; }
1592
+ }
1593
+
772
1594
  /* ---- 排版原语 Row / Col / Section / Text ---- */
773
1595
  .nre-col {
774
1596
  display: flex;