@ls-stack/agent-eval 0.24.0 → 0.26.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.
- package/dist/{app-DYRmucgj.mjs → app-BWjrZUSt.mjs} +6 -3
- package/dist/apps/web/dist/assets/index-3bLi3uQJ.js +118 -0
- package/dist/apps/web/dist/assets/index-DNsZjOms.css +1 -0
- package/dist/apps/web/dist/index.html +2 -2
- package/dist/bin.mjs +1 -1
- package/dist/{cli-Be0x8CS3.mjs → cli-CmNNm6d0.mjs} +155 -45
- package/dist/index.d.mts +61 -6
- package/dist/index.mjs +4 -4
- package/dist/runChild.mjs +28 -18
- package/dist/{runOrchestration-D697g6Qe.mjs → runOrchestration-B31SV_Bq.mjs} +222 -87
- package/dist/{runner-jSujaSKt.mjs → runner-NPxmmHwa.mjs} +1 -1
- package/dist/{runner-B4SosWgD.mjs → runner-dnkl4pWd.mjs} +2 -2
- package/dist/src-DIFRuMuH.mjs +3 -0
- package/package.json +3 -3
- package/skills/agent-eval/SKILL.md +6 -1
- package/dist/apps/web/dist/assets/index-KbbX3NYr.js +0 -118
- package/dist/apps/web/dist/assets/index-r0dVFK0B.css +0 -1
- package/dist/src-D6cettg0.mjs +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600;700&family=Geist+Mono:wght@400;500;600&display=swap";.json-view{display:block;color:#4d4d4d;text-align:left;--json-property: #009033;--json-index: #676dff;--json-number: #676dff;--json-string: #b2762e;--json-boolean: #dc155e;--json-null: #dc155e}.json-view .json-view--property{color:var(--json-property)}.json-view .json-view--index{color:var(--json-index)}.json-view .json-view--number{color:var(--json-number)}.json-view .json-view--string{color:var(--json-string)}.json-view .json-view--boolean{color:var(--json-boolean)}.json-view .json-view--null{color:var(--json-null)}.json-view .jv-indent{padding-left:1em}.json-view .jv-chevron{display:inline-block;vertical-align:-20%;cursor:pointer;opacity:.4;width:1em;height:1em}:is(.json-view .jv-chevron:hover,.json-view .jv-size:hover+.jv-chevron){opacity:.8}.json-view .jv-size{cursor:pointer;opacity:.4;font-size:.875em;font-style:italic;margin-left:.5em;vertical-align:-5%;line-height:1}.json-view :is(.json-view--copy,.json-view--edit),.json-view .json-view--link svg{display:none;width:1em;height:1em;margin-left:.25em;cursor:pointer}.json-view .json-view--input{width:120px;margin-left:.25em;border-radius:4px;border:1px solid currentColor;padding:0 4px;font-size:87.5%;line-height:1.25;background:transparent}.json-view .json-view--deleting{outline:1px solid #da0000;background-color:#da000011;text-decoration-line:line-through}:is(.json-view:hover,.json-view--pair:hover)>:is(.json-view--copy,.json-view--edit),:is(.json-view:hover,.json-view--pair:hover)>.json-view--link svg{display:inline-block}.json-view .jv-button{background:transparent;outline:none;border:none;cursor:pointer;color:inherit}.json-view .cursor-pointer{cursor:pointer}.json-view svg{vertical-align:-10%}.jv-size-chevron~svg{vertical-align:-16%}.json-view_a11y{color:#545454;--json-property: #aa5d00;--json-index: #007299;--json-number: #007299;--json-string: #008000;--json-boolean: #d91e18;--json-null: #d91e18}.json-view_github{color:#005cc5;--json-property: #005cc5;--json-index: #005cc5;--json-number: #005cc5;--json-string: #032f62;--json-boolean: #005cc5;--json-null: #005cc5}.json-view_vscode{color:#005cc5;--json-property: #0451a5;--json-index: #0000ff;--json-number: #0000ff;--json-string: #a31515;--json-boolean: #0000ff;--json-null: #0000ff}.json-view_atom{color:#383a42;--json-property: #e45649;--json-index: #986801;--json-number: #986801;--json-string: #50a14f;--json-boolean: #0184bc;--json-null: #0184bc}.json-view_winter-is-coming{color:#0431fa;--json-property: #3a9685;--json-index: #ae408b;--json-number: #ae408b;--json-string: #8123a9;--json-boolean: #0184bc;--json-null: #0184bc}.json-view_vitesse{color:#393a34;--json-property: #998418;--json-index: #2f798a;--json-number: #2f798a;--json-string: #b56959;--json-boolean: #1e754f;--json-null: #ab5959}.vh724ok-1{display:flex;align-items:stretch;justify-content:flex-start;height:100vh;overflow:hidden;background:#fcfcfc}.vh724ok-2{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;flex:1;min-width:0;overflow-x:hidden;overflow-y:hidden}.vh724ok-2.vwx8nfh{overflow-x:auto}.vh724ok-3{width:100%;height:100%}.vh724ok-3.vwx8nfh{min-width:600px}.vh724ok-4{padding:10px 16px;border-bottom:1px solid #dc262638;background:#dc262614;color:#dc2626;font-size:13px;line-height:1.4}.v9f9dyw-1{border-left:1px solid #e8e8eb;background:#f7f7f8;display:flex;align-items:center;justify-content:center;color:#6b6e76;font-size:12px;flex-shrink:0}.v9f9dyw-2{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;position:relative;flex-shrink:0;border-left:1px solid #e8e8eb;background:#f7f7f8;overflow:hidden}.v9f9dyw-3{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:10px;padding:14px 18px 12px;border-bottom:1px solid #e8e8eb;background:#f7f7f8;flex-shrink:0}.v9f9dyw-4{display:flex;align-items:center;justify-content:space-between;gap:10px}.v9f9dyw-5{display:flex;align-items:center;justify-content:flex-start;gap:2px}.v9f9dyw-6{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.v9f9dyw-7{display:flex;align-items:center;justify-content:flex-start;gap:10px;min-width:0}.v9f9dyw-8{display:flex;align-items:center;justify-content:flex-start;gap:12px;min-width:0}.v9f9dyw-9{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:17px;color:#0a0b0d;font-weight:600;letter-spacing:-.01em}.v9f9dyw-10{display:flex;align-items:center;justify-content:flex-start;gap:4px;border-bottom:1px solid #e8e8eb;padding:10px 14px 0;flex-shrink:0;overflow-x:auto}.v9f9dyw-11{position:relative;padding:8px 12px;background:transparent;border:none;font-size:12px;font-weight:500;color:#6b6e76;white-space:nowrap;margin-bottom:-1px;border-bottom:1.5px solid transparent}.v9f9dyw-11:hover{color:#0a0b0d}.v9f9dyw-11.v18pp08p{color:#0a0b0d;border-bottom-color:#22d3ee}.v9f9dyw-12{flex:1;overflow:auto;padding:18px 20px}.v9f9dyw-13{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start}.v9f9dyw-14{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px;padding:14px 0;border-bottom:1px solid #e8e8eb}.v9f9dyw-14:first-child{padding-top:0}.v9f9dyw-14:last-child{border-bottom:none;padding-bottom:0}.v9f9dyw-15{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.v9f9dyw-16{font-size:13px;color:#0a0b0d}.v9f9dyw-17{color:#dc2626}.v9f9dyw-18{font-weight:600;margin-bottom:8px}.v9f9dyw-19{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11px;white-space:pre-wrap;opacity:.8;background:#f0f0f2;border:1px solid #e8e8eb;border-radius:var(--radius-sm);padding:10px}.v9f9dyw-20{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:14px}.v9f9dyw-21{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76;margin-bottom:8px}.v9f9dyw-22{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:13px;color:#0a0b0d;word-break:break-word}.v9f9dyw-23{color:#dc2626}.v9f9dyw-24{color:#16a34a}.v9f9dyw-25{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:18px}.v9f9dyw-26{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:10px}.v9f9dyw-27{display:flex;align-items:center;justify-content:space-between;gap:10px}.v9f9dyw-28{font-size:12.5px;font-weight:600;color:#0a0b0d}.v9f9dyw-29{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:10px;list-style:none;padding:0;margin:0}.v9f9dyw-30{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px;padding:12px;background:#fcfcfc;border:1px solid #e8e8eb;border-radius:var(--radius-md)}.v9f9dyw-31{color:#dc2626;font-size:12.5px;line-height:1.5}.v9f9dyw-32,.v9f9dyw-33{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px}.v9f9dyw-34{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px}.v9f9dyw-35{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.v9f9dyw-36{height:28px;min-width:150px;border:1px solid #e8e8eb;border-radius:var(--radius-sm);background:#fcfcfc;color:#0a0b0d;padding:0 26px 0 9px;font-size:11.5px;font-weight:500;line-height:1}.v9f9dyw-36:hover{border-color:#d4d4d8}.v9f9dyw-36:focus{outline:2px solid #22d3ee40;outline-offset:1px;border-color:#22d3eea6}.v9f9dyw-37{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px}.vaa4w49-1{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;background:#fcfcfc;border:1px solid #e8e8eb;border-radius:var(--radius-md);overflow:hidden}.vaa4w49-2{display:flex;align-items:center;justify-content:flex-start;gap:10px;width:100%;background:transparent;border:none;padding:10px 14px;text-align:left;cursor:pointer;color:#0a0b0d}.vaa4w49-2:hover{background:#f0f0f2}.vaa4w49-3{display:flex;align-items:center;justify-content:flex-start;color:#6b6e76;flex-shrink:0}.vaa4w49-4{font-size:12.5px;font-weight:600;letter-spacing:-.005em;color:#0a0b0d;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vaa4w49-5{display:flex;align-items:center;justify-content:flex-start;gap:8px;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";margin-left:auto;font-size:11px;color:#6b6e76;flex-wrap:wrap;justify-content:flex-end}.vaa4w49-6{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";display:inline-flex;align-items:center;font-size:10.5px;font-weight:600;letter-spacing:.02em;padding:2px 7px;border-radius:20px;color:#0e7490;background:#22d3ee1a}.vaa4w49-7{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vaa4w49-8{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";display:inline-flex;align-items:center;font-size:10.5px;font-weight:600;padding:2px 7px;border-radius:20px;color:#6b6e76;background:#f0f0f2}.vaa4w49-8.vo1w49k{color:#16a34a;background:#16a34a1f}.vaa4w49-8.vk87out{color:#a16207;background:#a162071f}.vaa4w49-8.vlmxlf9{color:#dc2626;background:#dc26261f}.vaa4w49-9{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";display:inline-flex;align-items:center;font-size:10.5px;letter-spacing:.01em;padding:2px 7px;border-radius:20px;color:#6b6e76;background:#f0f0f2}.vaa4w49-10{margin-right:4px;color:#a4a7af}.vaa4w49-11{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:12px;padding:12px 14px;border-top:1px solid #e8e8eb}.vaa4w49-12{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px}.vaa4w49-13{display:flex;align-items:center;justify-content:flex-start;gap:12px;align-items:baseline;font-size:12px}.vaa4w49-14{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76;min-width:110px}.vaa4w49-15{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";color:#0a0b0d;word-break:break-all}.vaa4w49-16{display:flex;align-items:center;justify-content:flex-start;gap:12px;font-size:12px}.vaa4w49-17{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76;min-width:110px}.vaa4w49-18{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";color:#0a0b0d;word-break:break-word}.vaa4w49-19{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px}.vaa4w49-21{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76;margin-bottom:8px}.vaa4w49-22{color:#dc2626}.vaa4w49-23{font-weight:600;margin-bottom:8px}.vaa4w49-24{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11px;white-space:pre-wrap;opacity:.8;background:#f0f0f2;border:1px solid #e8e8eb;border-radius:var(--radius-sm);padding:10px}.vaa4w49-25{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px;color:#ea580c;font-size:12px}.vaa4w49-26{font-weight:600}.vqnpbvz-1{position:relative;min-width:0}.vqnpbvz-2{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:12px;line-height:1.6;color:#0a0b0d;background:#fcfcfc;border:1px solid #e8e8eb;border-radius:var(--radius-md);padding:12px 14px;overflow:auto;min-width:0}.vqnpbvz-2.vh8ay32{font-size:11px;padding:10px 12px}.vqnpbvz-2.v14y6o4h{max-height:200px}.vqnpbvz-2.valvosx{max-height:320px}.vqnpbvz-2.vzt48hw{max-height:none}.vqnpbvz-2 .json-view{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";color:#0a0b0d;font-size:inherit;line-height:inherit;--json-property: #0e7490;--json-index: #22d3ee;--json-number: #22d3ee;--json-string: #ea580c;--json-boolean: #dc2626;--json-null: #a4a7af}.vqnpbvz-2 .jv-size,.vqnpbvz-2 .jv-chevron{color:#a4a7af}.vqnpbvz-2 .json-view--copy,.vqnpbvz-2 .json-view--edit,.vqnpbvz-2 .json-view--link svg{color:#a4a7af}.vqnpbvz-2 .json-view--input{color:#0a0b0d}.vqnpbvz-3{display:flex;align-items:center;justify-content:flex-start;gap:4px;transition:.12s cubic-bezier(.4,0,.2,1);transition-property:background,color,border-color;position:absolute;bottom:6px;right:6px;font-family:inherit;font-size:10px;letter-spacing:.04em;text-transform:uppercase;font-weight:500;color:#6b6e76;background:#f7f7f8;border:1px solid #e8e8eb;border-radius:var(--radius-sm);padding:3px 7px;cursor:pointer}.vqnpbvz-3:hover{color:#0a0b0d;background:#ececee;border-color:#d4d4d8}.vno9i23-1{display:flex;align-items:center;justify-content:flex-start;gap:6px;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";display:inline-flex;font-size:11px;font-weight:500;letter-spacing:.01em;padding:3px 8px;border-radius:20px;color:#6b6e76;background:#f0f0f2}.vno9i23-1.v1bls63k{color:#16a34a;background:#16a34a1a}.vno9i23-1.v1843cka{color:#dc2626;background:#dc26261a}.vno9i23-1.v1w33htl{color:#0e7490;background:#22d3ee1f}.vno9i23-1.v1o7znqr{color:#ea580c;background:#ea580c1a}.vno9i23-1.v1ptx2rj{color:#6b6e76;background:#e4e4e7}.vno9i23-1.vwlrmf0{color:#ea580c;background:#ea580c24}.vno9i23-1.v1mlprpv{color:#0e7490;background:#22d3ee1a}.vno9i23-2{width:5px;height:5px;border-radius:5px;flex-shrink:0;background:#a4a7af;@keyframes pulseDot{0%,to{opacity:1}50%{opacity:.4}}}.vno9i23-2.v1bls63k{background:#16a34a}.vno9i23-2.v1843cka{background:#dc2626}.vno9i23-2.v1w33htl{background:#22d3ee;animation:pulseDot 1.6s ease-in-out infinite}.vno9i23-2.v1o7znqr{background:#ea580c}.vno9i23-2.v1ptx2rj{background:#d4d4d8}.vno9i23-2.vwlrmf0{background:#ea580c}.vno9i23-2.v1mlprpv{background:#22d3ee}.v1fkevfp-1{background:#000;color:#fff;font-size:12px;line-height:1.4;padding:4px 8px;border-radius:4px;box-shadow:0 2px 8px #0006;pointer-events:none;z-index:10000;max-width:300px;white-space:pre-line;overflow-wrap:break-word}.v1rexbf3-1{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;background:#fcfcfc;border:1px solid #e8e8eb;border-radius:var(--radius-md);overflow:hidden}.v1rexbf3-2{display:flex;align-items:center;justify-content:flex-start;gap:10px;width:100%;background:transparent;border:none;padding:10px 14px;text-align:left;cursor:pointer;color:#0a0b0d}.v1rexbf3-2:hover{background:#f0f0f2}.v1rexbf3-3{display:flex;align-items:center;justify-content:flex-start;color:#6b6e76;flex-shrink:0}.v1rexbf3-4,.v1rexbf3-5{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;padding:2px 6px;border-radius:var(--radius-sm);background:#f0f0f2;color:#6b6e76;font-size:9.5px;letter-spacing:.04em;line-height:1.2;flex-shrink:0}.v1rexbf3-5.v1psnf3c{background:#16a34a26;color:#16a34a}.v1rexbf3-5.v126sfoy{background:#22d3ee1f;color:#0e7490}.v1rexbf3-6{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:12.5px;color:#0a0b0d;word-break:break-word;flex:1 1 auto;min-width:0}.v1rexbf3-7{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10px;color:#6b6e76;flex-shrink:0}.v1rexbf3-8{display:flex;align-items:center;justify-content:flex-start;gap:8px;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";margin-left:auto;font-size:11px;color:#6b6e76;flex-wrap:wrap;justify-content:flex-end}.v1rexbf3-9{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:12px;padding:12px 14px;border-top:1px solid #e8e8eb}.v1rexbf3-10{display:flex;align-items:center;justify-content:flex-start;gap:12px;flex-wrap:wrap;font-size:11px;color:#6b6e76}.v1rexbf3-11{display:flex;align-items:center;justify-content:flex-start;gap:4px}.v1rexbf3-12{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;font-size:9.5px;color:#a4a7af}.v1rexbf3-13{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11px;color:#0a0b0d;word-break:break-all}.v1rexbf3-15{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76;margin-bottom:8px}.v1rexbf3-16{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11.5px;color:#6b6e76}.v1rexbf3-17{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11.5px;color:#dc2626}.v1rexbf3-18{display:flex;align-items:center;justify-content:flex-start;gap:8px;justify-content:flex-end}.v1yv3uow-1{display:flex;align-items:center;justify-content:flex-start;gap:7px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,border-color,color,box-shadow;display:inline-flex;height:32px;padding:0 14px;border-radius:var(--radius-md);border:1px solid transparent;font-size:12.5px;font-weight:500;letter-spacing:-.005em;line-height:1;white-space:nowrap;-webkit-user-select:none;user-select:none}.v1yv3uow-1:disabled{cursor:not-allowed;opacity:.5}.v1yv3uow-1>svg{width:13px;height:13px;flex-shrink:0}.v1yv3uow-1.v1d37md8{background:#22d3ee;color:#0a0b0d;font-weight:600;box-shadow:0 0 0 1px #22d3ee4d,0 6px 20px -6px #22d3ee73}.v1yv3uow-1.v1d37md8:hover:not(:disabled){background:#06b6d4;box-shadow:0 0 0 1px #22d3ee73,0 8px 22px -4px #22d3ee99}.v1yv3uow-1.v1d37md8:active:not(:disabled){background:#0e7490}.v1yv3uow-1.v1kpy128{background:#f0f0f2;color:#0a0b0d;border-color:#d4d4d8}.v1yv3uow-1.v1kpy128:hover:not(:disabled){background:#ececee;border-color:#22d3ee73}.v1yv3uow-1.vhmrut{background:transparent;color:#6b6e76}.v1yv3uow-1.vhmrut:hover:not(:disabled){background:#f0f0f2;color:#0a0b0d}.v1yv3uow-1.vs705h9{background:transparent;color:#dc2626;border-color:#dc262666}.v1yv3uow-1.vs705h9:hover:not(:disabled){background:#dc262614;border-color:#dc2626}.v1tlpqbe-1{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px}.v1tlpqbe-2{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.v1tlpqbe-3{height:28px;min-width:150px;border:1px solid #e8e8eb;border-radius:var(--radius-sm);background:#fcfcfc;color:#0a0b0d;padding:0 26px 0 9px;font-size:11.5px;font-weight:500;line-height:1}.v1tlpqbe-3:hover{border-color:#d4d4d8}.v1tlpqbe-3:focus{outline:2px solid #22d3ee40;outline-offset:1px;border-color:#22d3eea6}.v1tlpqbe-4{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px}.v1tlpqbe-5{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;background:#fcfcfc;border:1px solid #e8e8eb;border-radius:var(--radius-md);overflow:hidden}.v1tlpqbe-6{display:flex;align-items:center;justify-content:flex-start;gap:4px;width:100%;min-width:0}.v1tlpqbe-7{display:flex;align-items:center;justify-content:flex-start;gap:10px;flex:1;min-width:0;background:transparent;border:none;padding:10px 14px;text-align:left;cursor:pointer;color:#0a0b0d}.v1tlpqbe-7:hover{background:#f0f0f2}.v1tlpqbe-8{display:flex;align-items:center;justify-content:flex-start;padding-right:8px;flex-shrink:0}.v1tlpqbe-9{display:flex;align-items:center;justify-content:flex-start;color:#6b6e76;flex-shrink:0}.v1tlpqbe-10{display:flex;align-items:center;justify-content:flex-start;gap:8px;margin-left:auto;flex:0 0 auto;flex-wrap:wrap;justify-content:flex-end}.v1tlpqbe-11{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10.5px;color:#6b6e76}.v1tlpqbe-12{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;padding:2px 6px;border-radius:var(--radius-sm);background:#f0f0f2;color:#6b6e76;font-size:9.5px;line-height:1.2;flex-shrink:0}.v1tlpqbe-12.v1tefpko{background:#22d3ee1f;color:#0e7490}.v1tlpqbe-12.vpsgjsu{background:#ea580c1f;color:#ea580c}.v1tlpqbe-12.v10doxfa{background:#dc26261f;color:#dc2626}.v1tlpqbe-13{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;font-size:9.5px;color:#6b6e76;flex-shrink:0}.v1tlpqbe-14{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10.5px;color:#6b6e76;flex-shrink:0}.v1tlpqbe-15{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";flex:1 1 140px;font-size:12px;color:#0a0b0d;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.v1tlpqbe-16{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";margin:0;white-space:pre-wrap;word-break:break-word;font-size:11.5px;line-height:1.55;color:#0a0b0d}.v1tlpqbe-17{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px}.v1tlpqbe-18{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.v1tlpqbe-19{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:10px;padding:12px 14px;border-top:1px solid #e8e8eb}.v1tlpqbe-20{display:flex;align-items:center;justify-content:flex-start;gap:12px;flex-wrap:wrap;font-size:11px;color:#6b6e76}.v1tlpqbe-21{display:flex;align-items:center;justify-content:flex-start;gap:4px}.v1tlpqbe-22{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;font-size:9.5px;color:#a4a7af}.v1tlpqbe-23{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11px;color:#0a0b0d}.v1tlpqbe-24{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#ea580c;font-size:9.5px;flex-shrink:0}.v4yt9wa-1{display:flex;align-items:center;justify-content:center;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;width:28px;height:28px;border-radius:var(--radius-sm);border:none;background:transparent;color:#6b6e76;flex-shrink:0}.v4yt9wa-1.van04w6{width:32px;height:32px;border-radius:var(--radius-md)}.v4yt9wa-1:hover:not(:disabled){background:#f0f0f2;color:#0a0b0d}.v4yt9wa-1:disabled{cursor:not-allowed;opacity:.5}.v4yt9wa-1>svg{width:14px;height:14px}.v4yt9wa-1.van04w6>svg{width:16px;height:16px}.vv93a47-1{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:12px}.vv93a47-2{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px;padding:12px 14px;background:#fcfcfc;border:1px solid #e8e8eb;border-radius:var(--radius-md)}.vv93a47-3{display:flex;align-items:center;justify-content:space-between;gap:10px}.vv93a47-4{font-size:12.5px;font-weight:600;color:#0a0b0d;letter-spacing:-.005em}.vv93a47-5{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:13px;font-weight:500;color:#0a0b0d}.vv93a47-6{position:relative;height:6px;border-radius:4px;background:#f0f0f2;overflow:hidden}.vv93a47-7{position:absolute;left:0;top:0;bottom:0;border-radius:4px;background:#a4a7af}.vv93a47-7.vvj7fxg{background:#16a34a}.vv93a47-7.v3q58b{background:#dc2626}.vv93a47-8{display:flex;align-items:center;justify-content:flex-start;gap:10px;font-size:11px;color:#6b6e76}.vv93a47-9{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;padding:2px 6px;border-radius:var(--radius-sm);background:#f0f0f2;color:#6b6e76;font-size:9.5px;letter-spacing:.04em;line-height:1.2}.vv93a47-9.vvj7fxg{background:#16a34a1f;color:#16a34a}.vv93a47-9.v3q58b{background:#dc26261f;color:#dc2626}.v1f0s106-1{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;flex:1;height:100%;text-align:center;padding:48px}.v1f0s106-2{width:56px;height:56px;border-radius:var(--radius-md);background:#f7f7f8;border:1px solid #e8e8eb;display:flex;align-items:center;justify-content:center;color:#22d3ee;margin-bottom:4px}.v1f0s106-2>svg{width:24px;height:24px}.v1f0s106-3{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.v1f0s106-4{color:#0a0b0d;font-size:18px;font-weight:600;letter-spacing:-.01em}.v1f0s106-5{color:#6b6e76;font-size:12.5px;max-width:360px;line-height:1.55}.v1460r1i-1{white-space:pre-wrap;margin:0;font-size:13px;line-height:1.55}.v1460r1i-2{color:#0a0b0d;font-size:13px;line-height:1.55}.v1460r1i-2>:first-child{margin-top:0}.v1460r1i-2>:last-child{margin-bottom:0}.v1460r1i-2 p,.v1460r1i-2 ul,.v1460r1i-2 ol,.v1460r1i-2 blockquote,.v1460r1i-2 pre,.v1460r1i-2 table{margin:0 0 10px}.v1460r1i-2 h1,.v1460r1i-2 h2,.v1460r1i-2 h3,.v1460r1i-2 h4,.v1460r1i-2 h5,.v1460r1i-2 h6{margin:0 0 10px;color:#0a0b0d;line-height:1.25}.v1460r1i-2 h1{font-size:18px}.v1460r1i-2 h2{font-size:15px}.v1460r1i-2 h3{font-size:13.5px}.v1460r1i-2 ul,.v1460r1i-2 ol{padding-left:20px}.v1460r1i-2 li+li{margin-top:4px}.v1460r1i-2 code{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:12px;background:#f0f0f2;border:1px solid #e8e8eb;border-radius:6px;padding:1px 5px}.v1460r1i-2 pre{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:12px;overflow-x:auto;background:#f0f0f2;border:1px solid #e8e8eb;border-radius:var(--radius-sm);padding:12px}.v1460r1i-2 pre code{background:transparent;border:none;padding:0;font-size:inherit}.v1460r1i-2 blockquote{padding-left:12px;border-left:3px solid #e8e8eb;color:#6b6e76}.v1460r1i-2 a{color:#22d3ee;text-decoration:underline;text-underline-offset:2px}.v1460r1i-2 table{width:100%;border-collapse:collapse}.v1460r1i-2 th,.v1460r1i-2 td{border:1px solid #e8e8eb;padding:8px 10px;text-align:left;vertical-align:top}.v1460r1i-2 th{background:#f0f0f2}.v1460r1i-3{max-width:100%;border-radius:var(--radius-md)}.v1460r1i-4{width:100%}.v1460r1i-5{max-width:100%;border-radius:var(--radius-md)}.v1460r1i-6{color:#22d3ee}.v1m277ov-1{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;background:#fcfcfc;border:1px solid #e8e8eb;border-radius:var(--radius-md);overflow:hidden}.v1m277ov-2{display:flex;align-items:center;justify-content:flex-start;gap:10px;width:100%;background:transparent;border:none;padding:10px 14px;text-align:left;cursor:pointer;color:#0a0b0d}.v1m277ov-2:hover{background:#f0f0f2}.v1m277ov-3{display:flex;align-items:center;justify-content:flex-start;color:#6b6e76;flex-shrink:0}.v1m277ov-4{font-size:12.5px;font-weight:600;letter-spacing:-.005em;color:#0a0b0d;flex-shrink:0}.v1m277ov-5{display:flex;align-items:center;justify-content:flex-start;gap:8px;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";margin-left:auto;font-size:11px;color:#6b6e76;flex-wrap:wrap;justify-content:flex-end}.v1m277ov-6{display:flex;align-items:center;justify-content:flex-start;gap:4px;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11px;color:#6b6e76}.v1m277ov-7{color:#a4a7af;font-size:9.5px;letter-spacing:.04em;text-transform:uppercase}.v1m277ov-8{color:#d4d4d8}.v1m277ov-9{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";display:inline-flex;align-items:center;font-size:10.5px;font-weight:500;letter-spacing:.01em;padding:2px 7px;border-radius:20px;color:#0e7490;background:#22d3ee1a}.v1m277ov-10{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";display:inline-flex;align-items:center;font-size:10.5px;letter-spacing:.01em;padding:2px 7px;border-radius:20px;color:#6b6e76;background:#f0f0f2}.v1m277ov-11{margin-right:4px;color:#a4a7af}.v1m277ov-12{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:12px;padding:12px 14px;border-top:1px solid #e8e8eb}.v1m277ov-13{display:flex;align-items:center;justify-content:flex-start;gap:12px;font-size:12px}.v1m277ov-14{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76;min-width:110px}.v1m277ov-15{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";color:#0a0b0d;word-break:break-word}.v1m277ov-16{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;border:1px solid #e8e8eb;border-radius:var(--radius-md);overflow:hidden}.v1m277ov-17{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;display:grid;grid-template-columns:1fr auto auto;gap:16px;padding:8px 12px;background:#f0f0f2;color:#6b6e76;font-size:9.5px;letter-spacing:.04em}.v1m277ov-18{display:grid;grid-template-columns:1fr auto auto;gap:16px;padding:8px 12px;align-items:baseline;border-top:1px solid #e8e8eb;font-size:12px}.v1m277ov-19{color:#0a0b0d}.v1m277ov-20{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";color:#0a0b0d;text-align:right;min-width:56px}.v1m277ov-21{background:#f0f0f2;font-weight:600}.v1m277ov-22{text-align:right}.v1m277ov-23{color:#6b6e76}.v1m277ov-25{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76;margin-bottom:8px}.v1m277ov-26{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px}.v1m277ov-27{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px}.v1m277ov-28{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px;border:1px solid #e8e8eb;border-radius:var(--radius-sm);background:#f0f0f2;padding:8px 10px}.v1m277ov-29{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76;font-size:9.5px}.v1m277ov-30{color:#dc2626}.v1m277ov-31{font-weight:600;margin-bottom:8px}.v1m277ov-32{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11px;white-space:pre-wrap;opacity:.8;background:#f0f0f2;border:1px solid #e8e8eb;border-radius:var(--radius-sm);padding:10px}.v1m277ov-33{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px;color:#ea580c;font-size:12px}.v1m277ov-34{font-weight:600}.vpbub9f-1{position:absolute;top:0;bottom:0;width:7px;right:-3px;cursor:col-resize;z-index:5;-webkit-user-select:none;user-select:none;touch-action:none}.vpbub9f-1.v1xij6d4{right:auto;left:-3px}.vpbub9f-1:after{content:"";position:absolute;top:0;bottom:0;left:3px;width:1px;background:transparent;transition:background .15s ease}.vpbub9f-1:hover:after,.vpbub9f-1.veyzh35:after{background:#22d3ee}.vxv787s-1{display:flex;gap:12px;height:100%;align-items:stretch;position:relative;min-width:0}.vxv787s-2{display:flex;flex-direction:column;flex:1;min-width:0;border:1px solid #e8e8eb;border-radius:var(--radius-md);background:#fcfcfc;overflow:hidden}.vxv787s-3{flex:1 1 0;min-width:300px;max-width:460px;overflow:auto;border:1px solid #e8e8eb;border-radius:var(--radius-md);background:#fcfcfc;padding:14px 16px}.vxv787s-4{position:absolute;inset:0 0 0 auto;width:min(420px,85%);display:flex;flex-direction:column;background:#f7f7f8;border:1px solid #d4d4d8;border-radius:var(--radius-md);box-shadow:-10px 0 28px #0a0b0d24;z-index:2}.vxv787s-5{display:flex;align-items:center;justify-content:space-between;padding:6px 8px 6px 12px;border-bottom:1px solid #e8e8eb;flex-shrink:0}.vxv787s-6{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:#6b6e76}.vxv787s-7{overflow:auto;padding:14px 16px}.vxv787s-8{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;background:none;border:none;padding:4px;border-radius:4px;display:inline-flex;align-items:center;justify-content:center;color:#6b6e76;cursor:pointer}.vxv787s-8:hover{background:#f0f0f2;color:#0a0b0d}.vxv787s-8>svg{width:14px;height:14px}.vxv787s-9{flex:1;overflow:auto;min-width:0}.vxv787s-10{display:flex;flex-direction:column;min-width:560px;padding-right:14px}.vxv787s-10.v1qsea3x{min-width:0;padding-right:0}.vxv787s-11{display:grid;grid-template-columns:minmax(200px,40%) 1fr;flex-shrink:0;border-bottom:1px solid #e8e8eb;background:#f7f7f8;height:24px;position:sticky;top:0;z-index:1}.vxv787s-11.v1qsea3x{grid-template-columns:1fr}.vxv787s-12{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 6px 0 10px;height:100%}.vxv787s-13{display:flex;align-items:center;justify-content:flex-start;gap:5px;flex-shrink:0}.vxv787s-14{display:flex;align-items:center;justify-content:flex-start;border:1px solid #e8e8eb;border-radius:5px;overflow:hidden;background:#fcfcfc}.vxv787s-15{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;width:20px;height:18px;padding:0;display:inline-flex;align-items:center;justify-content:center;border:none;border-right:1px solid #e8e8eb;background:transparent;color:#a4a7af;cursor:pointer}.vxv787s-15:last-child{border-right:none}.vxv787s-15:hover{background:#f0f0f2;color:#0a0b0d}.vxv787s-15.vkduw8x{background:#e4e4e7;color:#0a0b0d}.vxv787s-15>svg{width:12px;height:12px}.vxv787s-16{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;background:none;border:none;padding:3px;border-radius:4px;display:inline-flex;align-items:center;justify-content:center;color:#6b6e76;cursor:pointer;flex-shrink:0}.vxv787s-16:hover{background:#f0f0f2;color:#0a0b0d}.vxv787s-16>svg{width:14px;height:14px}.vxv787s-17{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;color:#a4a7af}.vxv787s-18{position:relative;padding-right:12px}.vxv787s-19{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";position:absolute;top:50%;transform:translate(-50%,-50%);font-size:9.5px;font-variant-numeric:tabular-nums;color:#a4a7af;white-space:nowrap}.vxv787s-20{padding:4px 0}.vxv787s-21{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;display:grid;grid-template-columns:minmax(200px,40%) 1fr;align-items:stretch;cursor:pointer;font-size:11.5px;min-height:26px;border-left:2px solid transparent;color:#6b6e76}.vxv787s-21.v1qsea3x{grid-template-columns:1fr}.vxv787s-21:hover{background:#f7f7f8;color:#0a0b0d}.vxv787s-21.vkduw8x{background:#f0f0f2;color:#0a0b0d;border-left-color:#22d3ee}.vxv787s-22{display:flex;align-items:center;justify-content:flex-start;gap:7px;min-width:0;padding-right:10px}.vxv787s-23{position:relative;height:26px;padding-right:12px;background-image:linear-gradient(to right,transparent calc(25% - 1px),#e8e8ebb3 calc(25% - 1px),#e8e8ebb3 25%,transparent 25%),linear-gradient(to right,transparent calc(50% - 1px),#e8e8ebb3 calc(50% - 1px),#e8e8ebb3 50%,transparent 50%),linear-gradient(to right,transparent calc(75% - 1px),#e8e8ebb3 calc(75% - 1px),#e8e8ebb3 75%,transparent 75%)}.vxv787s-24{position:absolute;top:7px;height:12px;min-width:2px;border-radius:3px;background:var(--trace-kind-bar-bg, #d4d4d8);border:1px solid transparent}.vxv787s-24.v1z0zxx1{background:repeating-linear-gradient(45deg,var(--trace-kind-running-strong, #22d3ee66) 0,var(--trace-kind-running-strong, #22d3ee66) 6px,var(--trace-kind-running-soft, #22d3ee26) 6px,var(--trace-kind-running-soft, #22d3ee26) 12px)}.vxv787s-24.v12vnxco{border-color:#dc2626}.vxv787s-25{position:absolute;top:50%;width:10px;height:10px;border-radius:2px;background:var(--trace-kind-bar-bg, #d4d4d8);box-shadow:0 0 0 2px #fcfcfc;transform:translate(-50%,-50%) rotate(45deg);pointer-events:none}.vxv787s-26{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";position:absolute;top:5px;font-size:9.5px;font-variant-numeric:tabular-nums;color:#6b6e76;white-space:nowrap;pointer-events:none}.vxv787s-26.inside{color:#fff;font-weight:500;letter-spacing:.02em;background:#0003;padding:0 5px;line-height:12px;top:7px;height:12px;margin-right:-4px;border-radius:3px}.vxv787s-27{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:transform;background:none;border:none;padding:0;display:inline-flex;width:14px;height:14px;align-items:center;justify-content:center;color:#a4a7af;flex-shrink:0;cursor:pointer}.vxv787s-27>svg{width:12px;height:12px}.vxv787s-27.v1sa0q0h>svg{transform:rotate(90deg)}.vxv787s-28{width:14px;flex-shrink:0}.vxv787s-29{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";padding:2px 6px;border-radius:4px;font-size:9.5px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--trace-kind-badge-text, #6b6e76);background:var(--trace-kind-badge-bg, #f0f0f2);flex-shrink:0}.vxv787s-30{font-weight:500;font-size:11.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0}.vxv787s-31{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";color:#dc2626;font-size:10px;flex-shrink:0}.vxv787s-32{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";color:#ea580c;font-size:10px;flex-shrink:0}.vxv787s-33{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:9.5px;letter-spacing:.04em;flex-shrink:0;color:#a4a7af}.vxv787s-34{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10px;color:#6b6e76;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto;min-width:0}.vxv787s-34:before{content:"→";color:#a4a7af;margin-right:4px}.vxv787s-35{padding:16px;color:#6b6e76;font-size:12px;text-align:center}.vn93px5-1{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:14px;font-size:12px}.vn93px5-2{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:13px;font-weight:600;letter-spacing:-.005em;color:#0a0b0d}.vn93px5-3{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px}.vn93px5-4{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 10px;background:#fcfcfc;border:1px solid #e8e8eb;border-radius:var(--radius-sm)}.vn93px5-5{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.vn93px5-6{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11.5px;color:#0a0b0d;text-align:right;max-width:60%;word-break:break-all}.vn93px5-7{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px}.vn93px5-8{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.vn93px5-9{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11px;line-height:1.55;white-space:pre-wrap;word-break:break-word;color:#6b6e76;background:#f7f7f8;border:1px solid #e8e8eb;padding:10px 12px;border-radius:var(--radius-sm);max-height:200px;overflow:auto}.vmrx93z-1{--vmrx93z-2: #dc2626;--vmrx93z-3: #dc26260f;--vmrx93z-4: #dc262638;display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px;min-width:0;color:var(--vmrx93z-2);background:var(--vmrx93z-3);border:1px solid var(--vmrx93z-4);border-radius:var(--radius-sm);padding:10px 12px;overflow-wrap:anywhere}.vmrx93z-1.vc8cpou{--vmrx93z-2: #ea580c;--vmrx93z-3: #ea580c14;--vmrx93z-4: #ea580c3d}.vmrx93z-5{font-weight:600;min-width:0;overflow-wrap:anywhere}.vmrx93z-6{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10px;color:#dc2626b8;min-width:0;overflow-wrap:anywhere}.vmrx93z-6.vc8cpou{color:#ea580cc2}.vmrx93z-7{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:var(--vmrx93z-2)}.vmrx93z-8{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:4px;min-width:0}.vmrx93z-8+.vmrx93z-8{border-top:1px solid #dc26262e;padding-top:8px}.vmrx93z-8.vc8cpou+.vmrx93z-8.vc8cpou{border-top-color:#ea580c33}.vmrx93z-9{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10px;max-width:100%;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;opacity:.8;margin:0}.vmrx93z-10{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px}.vmrx93z-11{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.v1vddol1-1{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";padding:1px 5px;border-radius:3px;font-size:9.5px;font-weight:500;letter-spacing:.04em;text-transform:uppercase;flex-shrink:0;background:#d4d4d8;color:#6b6e76}.v1vddol1-1.vwtsfr3{background:#16a34a26;color:#16a34a}.v1vddol1-1.v7vdi0r{background:#ea580c26;color:#ea580c}.v1vddol1-1.vg409p{background:#22d3ee26;color:#22d3ee}.v1vddol1-1.v7s5h51{background:#d4d4d8;color:#6b6e76}.vmn9mpb-1{height:100%;overflow:auto}.vmn9mpb-2{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px;padding:22px 32px 18px;border-bottom:1px solid #e8e8eb;background:#fcfcfc;position:sticky;top:0;z-index:3}.vmn9mpb-3{display:flex;align-items:center;justify-content:space-between;gap:14px}.vmn9mpb-4{display:flex;align-items:center;justify-content:flex-start;gap:12px}.vmn9mpb-5{display:flex;align-items:center;justify-content:flex-start;gap:6px;flex-wrap:wrap}.vmn9mpb-6{display:flex;align-items:center;justify-content:flex-start;gap:5px;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;padding:3px 9px;border-radius:999px;background:#f0f0f2;color:#6b6e76;font-size:9.5px;line-height:1;letter-spacing:.04em}.vmn9mpb-7{font-size:11px;font-weight:600;color:#0a0b0d;letter-spacing:-.01em}.vmn9mpb-8{display:flex;align-items:center;justify-content:flex-start;gap:5px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,border-color,color;appearance:none;padding:3px 9px;border-radius:999px;font-size:9.5px;line-height:1;letter-spacing:.04em;text-transform:uppercase;font-weight:500;color:#6b6e76;background:#f0f0f2;border:1px solid transparent;cursor:pointer}.vmn9mpb-8:hover{background:#ececee;color:#0a0b0d}.vmn9mpb-8.v124n73o{color:#fcfcfc;background:#0a0b0d;border-color:#0a0b0d}.vmn9mpb-8.v18aowuu:not(.v124n73o){color:#16a34a;background:#16a34a14;border-color:#16a34a2e}.vmn9mpb-8.vind66p:not(.v124n73o){color:#dc2626;background:#dc262614;border-color:#dc26262e}.vmn9mpb-8.v11id82e:not(.v124n73o){color:#0e7490;background:#22d3ee1a;border-color:#22d3ee38}.vmn9mpb-8.v1i2guj2:not(.v124n73o){color:#ea580c;background:#ea580c14;border-color:#ea580c2e}.vmn9mpb-8.v12gavlj:not(.v124n73o){color:#6b6e76;background:#e4e4e7;border-color:#e8e8eb}.vmn9mpb-8.v9duj39:not(.v124n73o){color:#ea580c;background:#ea580c1a;border-color:#ea580c38}.vmn9mpb-8.vjtgbed:not(.v124n73o){color:#0e7490;background:#22d3ee17;border-color:#22d3ee33}.vmn9mpb-8.vt17xas:not(.v124n73o){color:#6b6e76;background:#f0f0f2;border-color:#e8e8eb}.vmn9mpb-9{font-size:11px;font-weight:600;letter-spacing:-.01em}.vmn9mpb-10{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:20px;padding:24px 32px 40px}.v1d1autj-1{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;background:transparent}.v1d1autj-1.vra3f9d{border:1px solid #e8e8eb;border-radius:var(--radius-lg);overflow:hidden;background:#fcfcfc}.v1d1autj-1.v1ofnfk9{height:100%;overflow:hidden}.v1d1autj-2{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;padding:22px 32px;border-bottom:1px solid #e8e8eb;background:#fcfcfc}.v1d1autj-2.v16nf7cu{position:sticky;top:0;z-index:3}.v1d1autj-2.vp8tseb{cursor:pointer;padding:16px 24px}.v1d1autj-3{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%}.v1d1autj-4{margin-bottom:14px}.v1d1autj-5{display:flex;align-items:center;justify-content:flex-start;gap:12px;min-width:0;flex:1}.v1d1autj-6{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px;min-width:0;flex:1}.v1d1autj-7{display:flex;align-items:center;justify-content:flex-start;gap:12px;min-width:0}.v1d1autj-8{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:16px;font-weight:600;color:#0a0b0d;letter-spacing:-.02em;margin:0}.v1d1autj-8.v8omtap{font-size:30px;font-weight:600;letter-spacing:-.025em;line-height:1.1}.v1d1autj-9{font-size:12.5px;color:#6b6e76;max-width:720px;line-height:1.5}.v1d1autj-10{display:inline-flex}.v1d1autj-11{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11.5px;color:#6b6e76}.v1d1autj-12{display:flex;align-items:center;justify-content:flex-start;gap:8px;flex-shrink:0}.v1d1autj-13{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:transform;display:inline-flex;width:18px;height:18px;align-items:center;justify-content:center;color:#a4a7af;transform:rotate(-90deg)}.v1d1autj-13.v12vk5oa{transform:rotate(0)}.v1d1autj-13>svg{width:14px;height:14px}.v1d1autj-14{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start}.v1d1autj-14.v1dyggfg{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}.v1d1autj-15{display:flex;flex-wrap:wrap;gap:1px;background:#e8e8eb;border-bottom:1px solid #e8e8eb}.v1d1autj-16{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px;padding:12px 16px 13px;background:#fcfcfc;flex:1 1 160px;min-width:160px}.v1d1autj-17{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;display:flex;align-items:center;justify-content:flex-start;gap:6px;min-width:0;font-size:9px;color:#6b6e76}.v1d1autj-18{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.v1d1autj-19{color:#a4a7af;flex-shrink:0}.v1d1autj-20{font-variant-numeric:tabular-nums;font-size:20px;font-weight:500;color:#0a0b0d;letter-spacing:-.02em;line-height:1.1}.v1d1autj-20.vsjzv4v{color:#0e7490}.v1d1autj-21{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;padding:20px 32px 24px}.v1d1autj-21:not(:last-child){border-bottom:1px solid #e8e8eb}.v1d1autj-21.v1i7hsdh{min-height:480px}.v1d1autj-22{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}.v1d1autj-22.vskhn2m{margin-bottom:0}.v1d1autj-23{display:flex;align-items:center;justify-content:flex-start;gap:8px;min-width:0;background:none;border:none;padding:0;margin:0;cursor:pointer;color:inherit;font:inherit;text-align:left}.v1d1autj-24{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:transform;display:inline-flex;width:16px;height:16px;align-items:center;justify-content:center;color:#a4a7af;transform:rotate(-90deg)}.v1d1autj-24.v12vk5oa{transform:rotate(0)}.v1d1autj-24>svg{width:14px;height:14px}.v1d1autj-25{font-size:13.5px;font-weight:600;color:#0a0b0d;letter-spacing:-.01em}.v1d1autj-26{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10.5px;color:#6b6e76}.v1d1autj-27{display:flex;align-items:center;justify-content:flex-end;gap:10px;min-width:0;flex:1}.v1d1autj-28{display:flex;align-items:center;justify-content:flex-start;gap:8px;min-width:0;justify-content:flex-end;color:#6b6e76;font-size:12px}.v1d1autj-29{display:flex;align-items:center;justify-content:flex-start;gap:8px;min-width:0}.v1d1autj-30{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:180px}.v1d1autj-31{color:#6b6e76}.vzvspbh-1{height:150px;padding:10px 14px 8px;border:1px solid #e8e8eb;border-radius:var(--radius-lg);background:#fcfcfc}.vzvspbh-2{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76;padding:0 2px 4px}.vzvspbh-3{display:flex;flex-direction:column;gap:4px}.vzvspbh-3+.vzvspbh-3{margin-top:16px}.vzvspbh-4{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";padding:10px 12px;font-size:11px;line-height:1.5;color:#0a0b0d;min-width:160px}.vzvspbh-5{display:flex;justify-content:space-between;gap:14px}.vzvspbh-5+.vzvspbh-5{margin-top:4px}.vzvspbh-6{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.vzvspbh-7{color:#0e7490}.v10k0sdn-1{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}.v10k0sdn-2{font-size:13.5px;font-weight:600;color:#0a0b0d;letter-spacing:-.01em}.v10k0sdn-3{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10.5px;color:#6b6e76}.v10k0sdn-4{display:flex;align-items:center;justify-content:flex-start;gap:6px}.v10k0sdn-5{height:28px;min-width:132px;border:1px solid #e8e8eb;border-radius:var(--radius-sm);background:#fcfcfc;color:#0a0b0d;padding:0 26px 0 9px;font-size:11.5px;font-weight:500;line-height:1}.v10k0sdn-5:hover{border-color:#d4d4d8}.v10k0sdn-5:focus{outline:2px solid #22d3ee40;outline-offset:1px;border-color:#22d3eea6}.v1v3ddx1-1{padding:30px 24px;border:1px dashed #e8e8eb;border-radius:var(--radius-lg);text-align:center;color:#6b6e76;font-size:12.5px}.v1v3ddx1-2{border:1px solid #e8e8eb;border-radius:var(--radius-lg);background:#fcfcfc;overflow:auto}.v1v3ddx1-3{width:max-content;min-width:100%;border-collapse:collapse;font-size:12px;table-layout:auto}.v1v3ddx1-4{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;position:sticky;top:0;z-index:1;padding:10px 16px;background:#f7f7f8;box-shadow:inset 0 -1px #e8e8eb;color:#6b6e76;text-align:left;white-space:nowrap}.v1v3ddx1-4.v10rcuqw{text-align:right}.v1v3ddx1-4.vl7rjcc{padding-left:36px}.v1v3ddx1-5{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background;cursor:pointer;border-top:1px solid #e8e8eb;border-left:3px solid transparent;background:#f7f7f8}.v1v3ddx1-5:first-child{border-top:none}.v1v3ddx1-5:hover{background:#f0f0f2}.v1v3ddx1-5.v9wbf1x{background:#22d3ee0f}.v1v3ddx1-5.v9wbf1x:hover{background:#22d3ee1a}.v1v3ddx1-5.v1wi22g7{border-left-color:#22d3ee}.v1v3ddx1-6{padding:12px 16px;vertical-align:middle;white-space:nowrap;color:#0a0b0d;font-size:12px}.v1v3ddx1-6.v10rcuqw{text-align:right}.v1v3ddx1-6.vh68gi{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-variant-numeric:tabular-nums;font-size:11.5px;color:#6b6e76}.v1v3ddx1-7{display:flex;align-items:center;justify-content:flex-start;gap:8px}.v1v3ddx1-8{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:color;display:inline-flex;align-items:center;justify-content:center;padding:2px;background:transparent;border:none;cursor:pointer;color:#6b6e76}.v1v3ddx1-8:hover{color:#0a0b0d}.v1v3ddx1-9{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;letter-spacing:.1em;text-transform:uppercase;font-weight:500;padding:3px 6px;border-radius:var(--radius-sm);background:#22d3ee1f;color:#0e7490;font-size:10px;letter-spacing:.04em;line-height:1}.v1v3ddx1-10{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";padding:3px 6px;border-radius:var(--radius-sm);background:#f0f0f2;color:#6b6e76;font-size:10.5px;line-height:1}.v1v3ddx1-11{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;letter-spacing:.1em;text-transform:uppercase;font-weight:500;padding:3px 6px;border-radius:var(--radius-sm);background:#f0f0f2;color:#6b6e76;font-size:10px;letter-spacing:.04em;line-height:1}.v1v3ddx1-12{font-size:12.5px;font-weight:500;color:#0a0b0d;letter-spacing:-.005em}.v1v3ddx1-12.v9wbf1x{color:#0e7490}.v1v3ddx1-13{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background;cursor:pointer;border-top:1px solid #e8e8eb;border-left:3px solid transparent}.v1v3ddx1-13:hover{background:#f7f7f8}.v1v3ddx1-13.v1wi22g7{border-left-color:#22d3ee}.v1v3ddx1-14{padding:10px 16px;vertical-align:middle;white-space:nowrap;color:#0a0b0d;font-size:12px}.v1v3ddx1-14.v10rcuqw{text-align:right}.v1v3ddx1-14.vh68gi{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-variant-numeric:tabular-nums;font-size:11.5px;color:#6b6e76}.v1v3ddx1-14.vl7rjcc{padding-left:36px}.v1v3ddx1-15{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:12px;color:#0a0b0d;max-width:260px}.v1v3ddx1-16{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;max-width:320px}.v1v3ddx1-17{color:#a4a7af}.v1v3ddx1-18{border-top:1px solid #e8e8eb}.v1v3ddx1-19{padding:18px;text-align:center;font-size:12px;color:#6b6e76}.v6nngvf-1{color:#a4a7af}.v6nngvf-2{display:inline-block;width:40px;height:3px;border-radius:4px;background:#f0f0f2;position:relative;overflow:hidden;margin-right:8px;vertical-align:middle}.v6nngvf-3{position:absolute;left:0;top:0;bottom:0;border-radius:4px;background:#a4a7af}.v6nngvf-3.vj3xmch{background:#16a34a}.v6nngvf-3.v1b0sr1n{background:#ea580c}.v6nngvf-3.v3vjwcw{background:#dc2626}.v6nngvf-4{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-variant-numeric:tabular-nums;font-size:12px;color:#0a0b0d;font-weight:500}.v6nngvf-5{display:flex;align-items:center;justify-content:flex-start;display:inline-flex}.v6nngvf-6{display:flex;align-items:center;justify-content:flex-start;gap:5px;display:inline-flex;justify-content:center;min-width:54px;padding:3px 7px;border-radius:var(--radius-sm);color:#6b6e76;background:#f0f0f2;font-size:11px;font-weight:600}.v6nngvf-6.vj3xmch{color:#16a34a;background:#16a34a1a}.v6nngvf-6.v3vjwcw{color:#dc2626;background:#dc26261a}.v6nngvf-7{display:flex;align-items:center;justify-content:flex-start;gap:1px;display:inline-flex;color:#a4a7af}.v6nngvf-7>svg{width:13px;height:13px}.v6nngvf-7>.filled{color:#ea580c;fill:currentColor}.v6nngvf-8{display:flex;align-items:center;justify-content:flex-end;gap:4px}.v6nngvf-9{display:flex;align-items:center;justify-content:flex-start;gap:4px;justify-content:center;height:24px;min-width:28px;padding:0 7px;border:1px solid #d4d4d8;border-radius:var(--radius-sm);background:#fcfcfc;color:#6b6e76;font-size:11px;font-weight:600}.v6nngvf-9>svg{width:12px;height:12px}.v6nngvf-9:hover:not(:disabled){border-color:#22d3ee80;background:#f0f0f2;color:#0a0b0d}.v6nngvf-9:disabled{opacity:.6}.v6nngvf-9.vrka86m{color:#16a34a;border-color:#16a34a80;background:#16a34a1a}.v6nngvf-9.v14fx5bw{color:#dc2626;border-color:#dc262680;background:#dc26261a}.v6nngvf-10{display:flex;align-items:center;justify-content:center;width:20px;height:24px;padding:0;border:none;border-radius:var(--radius-sm);background:transparent;color:#a4a7af}.v6nngvf-10>svg{width:14px;height:14px}.v6nngvf-10:hover:not(:disabled),.v6nngvf-10.v3c191l{color:#ea580c}.v6nngvf-10.v3c191l>svg{fill:currentColor}.v6nngvf-10:disabled{opacity:.6}.v1it1iyw-1{position:relative;display:inline-flex}.v1it1iyw-2{display:flex;align-items:center;justify-content:center;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color,border-color;appearance:none;padding:0;width:32px;height:32px;border-radius:var(--radius-md);border:1px solid #e8e8eb;background:#fcfcfc;color:#6b6e76;line-height:0;box-shadow:0 1px 2px #00000014}.v1it1iyw-2:hover:not(:disabled){background:#f0f0f2;color:#0a0b0d;border-color:#d4d4d8}.v1it1iyw-2:disabled{cursor:not-allowed;opacity:.5}.v1it1iyw-2>svg{width:16px;height:16px}.v1it1iyw-3{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;position:absolute;top:calc(100% + 6px);right:0;min-width:210px;background:#f7f7f8;border:1px solid #d4d4d8;box-shadow:0 14px 30px -12px #22d3ee40;z-index:40;padding:6px 0}.v1it1iyw-4{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:2px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;text-align:left;background:transparent;border:0;padding:8px 14px;color:#0a0b0d;cursor:pointer}.v1it1iyw-4:hover{background:#ececee}.v1it1iyw-4.vp2z70{color:#dc2626}.v1it1iyw-4.vp2z70:hover{background:#dc26261a}.v1it1iyw-5{font-size:12px;font-weight:600;letter-spacing:.02em}.v1it1iyw-6{font-size:11px;color:#6b6e76}.v1it1iyw-7{height:1px;background:#e8e8eb;margin:4px 0}.v1gbsfzf-1{position:relative;display:inline-flex}.v1gbsfzf-2{display:flex;align-items:center;justify-content:flex-start}.v1gbsfzf-3{display:flex;align-items:center;justify-content:flex-start;gap:8px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,border-color,color,box-shadow;display:inline-flex;height:28px;padding:0 14px;border-radius:0;border:1px solid transparent;font-size:11px;font-weight:600;line-height:1;white-space:nowrap;-webkit-user-select:none;user-select:none;text-transform:uppercase;letter-spacing:.14em;background:#22d3ee;color:#0a0b0d;box-shadow:0 0 0 1px #0e7490,0 6px 16px -8px #22d3ee8c}.v1gbsfzf-3>svg{width:13px;height:13px;flex-shrink:0}.v1gbsfzf-3:hover:not(:disabled){background:#06b6d4}.v1gbsfzf-3:active:not(:disabled){background:#0e7490}.v1gbsfzf-3:disabled{cursor:not-allowed;opacity:.4}.v1gbsfzf-4{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,border-color,color;display:inline-flex;align-items:center;justify-content:center;height:28px;width:26px;margin-left:1px;border-radius:0;border:1px solid transparent;background:#22d3ee;color:#0a0b0d;box-shadow:0 0 0 1px #0e7490}.v1gbsfzf-4>svg{width:13px;height:13px;transition:transform .18s ease}.v1gbsfzf-4.v9mb724>svg{transform:rotate(180deg)}.v1gbsfzf-4:hover:not(:disabled){background:#06b6d4}.v1gbsfzf-4:disabled{cursor:not-allowed;opacity:.4}.v1gbsfzf-5{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;position:absolute;top:calc(100% + 6px);right:0;min-width:220px;background:#f7f7f8;border:1px solid #d4d4d8;box-shadow:0 14px 30px -12px #22d3ee59;z-index:40;padding:6px 0}.v1gbsfzf-6{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:2px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;text-align:left;background:transparent;border:0;padding:8px 14px;color:#0a0b0d;cursor:pointer}.v1gbsfzf-6:hover{background:#ececee}.v1gbsfzf-6.v1g7o2ge{color:#dc2626}.v1gbsfzf-6.v1g7o2ge:hover{background:#dc26261a}.v1gbsfzf-7{font-size:12px;font-weight:600;letter-spacing:.02em}.v1gbsfzf-8{font-size:11px;color:#6b6e76}.v1gbsfzf-9{height:1px;background:#e8e8eb;margin:4px 0}.v1eplm6x-1{display:flex;align-items:center;justify-content:flex-start;gap:8px;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:13px;color:#6b6e76}.v1eplm6x-2{color:#a4a7af;margin:0 6px}.v1eplm6x-3{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:color;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";appearance:none;background:transparent;border:none;padding:0;color:#6b6e76;cursor:pointer}.v1eplm6x-3:hover,.v1eplm6x-4{color:#0a0b0d}.vgxz95z-1{border-left:1px solid #e8e8eb;background:#f7f7f8;display:flex;align-items:center;justify-content:center;color:#6b6e76;font-size:12px;flex-shrink:0}.vgxz95z-2{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;position:relative;flex-shrink:0;border-left:1px solid #e8e8eb;background:#f7f7f8;overflow:hidden}.vgxz95z-3{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:10px;padding:14px 18px 12px;border-bottom:1px solid #e8e8eb;background:#f7f7f8;flex-shrink:0}.vgxz95z-4{display:flex;align-items:center;justify-content:space-between;gap:10px}.vgxz95z-5{display:flex;align-items:center;justify-content:flex-start;gap:6px}.vgxz95z-6{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.vgxz95z-7{display:flex;align-items:center;justify-content:flex-start;gap:10px;min-width:0}.vgxz95z-8{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:9.5px;font-weight:600;padding:3px 8px;border-radius:4px;color:#0a0b0d;background:#22d3ee}.vgxz95z-9{font-size:15px;font-weight:600;color:#0a0b0d;letter-spacing:-.01em;font-variant-numeric:tabular-nums}.vgxz95z-10{flex:1;overflow:auto;padding:16px;display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:18px}.vgxz95z-11{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px}.vgxz95z-12{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.vgxz95z-13{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}.vgxz95z-14{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px;padding:12px 14px;background:#fcfcfc;border:1px solid #e8e8eb;border-radius:var(--radius-md)}.vgxz95z-15{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.vgxz95z-16{font-variant-numeric:tabular-nums;font-size:18px;font-weight:500;color:#0a0b0d;letter-spacing:-.02em}.vgxz95z-16.v15guhoh{color:#0e7490}.vgxz95z-16.v1amf7no{color:#dc2626}.vgxz95z-17{display:grid;grid-template-columns:110px 1fr;gap:6px 12px;margin:0}.vgxz95z-18{font-size:12px;color:#6b6e76}.vgxz95z-19{margin:0;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-variant-numeric:tabular-nums;font-size:11.5px;color:#0a0b0d;word-break:break-all}.vgxz95z-20{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;border:1px solid #e8e8eb;border-radius:var(--radius-md);overflow:hidden;background:#fcfcfc}.vgxz95z-21{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background;display:flex;align-items:center;justify-content:flex-start;gap:10px;width:100%;padding:10px 12px;background:transparent;border:none;border-top:1px solid #e8e8eb;cursor:pointer;text-align:left}.vgxz95z-21:first-child{border-top:none}.vgxz95z-21:hover{background:#f0f0f2}.vgxz95z-22{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:2px;flex:1;min-width:0}.vgxz95z-23{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:12px;color:#0a0b0d}.vgxz95z-24{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10.5px;color:#6b6e76}.vgxz95z-25{display:flex;align-items:center;justify-content:flex-start;gap:10px;flex-shrink:0}.vgxz95z-26{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-variant-numeric:tabular-nums;font-size:11px;color:#6b6e76;min-width:44px;text-align:right}.vgxz95z-27{padding:18px 14px;text-align:center;font-size:11.5px;color:#6b6e76;border:1px dashed #e8e8eb;border-radius:var(--radius-md)}.v11wyrim-1{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;flex-shrink:0;border-right:1px solid #e8e8eb;background:#f7f7f8;overflow:hidden;position:relative}.v11wyrim-2{display:flex;align-items:center;justify-content:flex-start;gap:10px;padding:14px 16px;border-bottom:1px solid #e8e8eb}.v11wyrim-3{width:26px;height:26px;background:linear-gradient(135deg,#22d3ee,#0e7490);border-radius:7px;display:grid;place-items:center;color:#0a0b0d;font-weight:700;font-size:12.5px;letter-spacing:-.02em;box-shadow:0 0 20px #22d3ee33}.v11wyrim-4{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:1px;flex:1;min-width:0}.v11wyrim-5{font-size:13px;font-weight:600;letter-spacing:-.01em;color:#0a0b0d}.v11wyrim-6{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;color:#6b6e76;font-variant-numeric:tabular-nums}.v11wyrim-7{display:flex;align-items:center;justify-content:flex-start;gap:6px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,border-color;margin:10px 12px 0;padding:0 8px;background:#f0f0f2;border:1px solid #e8e8eb;border-radius:var(--radius-sm);color:#6b6e76}.v11wyrim-7:focus-within{border-color:#22d3ee;background:#fcfcfc;color:#0a0b0d}.v11wyrim-7>svg{width:12px;height:12px;flex-shrink:0}.v11wyrim-8{flex:1;appearance:none;background:transparent;border:none;outline:none;padding:6px 0;font-size:12.5px;color:#0a0b0d;min-width:0}.v11wyrim-8::placeholder{color:#a4a7af}.v11wyrim-9{display:flex;align-items:center;justify-content:center;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;width:18px;height:18px;background:transparent;border:none;border-radius:var(--radius-sm);padding:0;color:#a4a7af;cursor:pointer;flex-shrink:0}.v11wyrim-9:hover{background:#ececee;color:#0a0b0d}.v11wyrim-9>svg{width:12px;height:12px}.v11wyrim-10{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px 16px 6px}.v11wyrim-11{display:flex;align-items:center;justify-content:flex-start;gap:6px;flex-wrap:wrap;padding:10px 12px 0}.v11wyrim-12{display:flex;align-items:center;justify-content:flex-start;gap:5px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,border-color,color;appearance:none;border:1px solid #e8e8eb;border-radius:999px;background:#f0f0f2;color:#6b6e76;padding:4px 8px;font-size:10px;line-height:1;font-weight:500;text-transform:uppercase;cursor:pointer}.v11wyrim-12:hover{background:#ececee;color:#0a0b0d}.v11wyrim-12.v6lqv3n{background:#0a0b0d;border-color:#0a0b0d;color:#fcfcfc}.v11wyrim-12.v19qld18:not(.v6lqv3n){color:#16a34a;background:#16a34a14;border-color:#16a34a2e}.v11wyrim-12.v1cg0dpp:not(.v6lqv3n){color:#dc2626;background:#dc262614;border-color:#dc26262e}.v11wyrim-12.v87wrzh:not(.v6lqv3n){color:#0e7490;background:#22d3ee1a;border-color:#22d3ee38}.v11wyrim-12.vs27jp:not(.v6lqv3n){color:#ea580c;background:#ea580c14;border-color:#ea580c2e}.v11wyrim-12.vyxbtsk:not(.v6lqv3n){background:#e4e4e7}.v11wyrim-12.vfa0aud:not(.v6lqv3n){color:#ea580c;background:#ea580c1a;border-color:#ea580c38}.v11wyrim-12.vrfu41b:not(.v6lqv3n){color:#0e7490;background:#22d3ee17;border-color:#22d3ee33}.v11wyrim-12.v177364w:not(.v6lqv3n){color:#6b6e76;background:#f0f0f2;border-color:#e8e8eb}.v11wyrim-13{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;font-weight:650;font-variant-numeric:tabular-nums}.v11wyrim-14{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:color;appearance:none;background:transparent;border:none;padding:0;color:#6b6e76;cursor:pointer}.v11wyrim-14:hover,.v11wyrim-14.v6lqv3n{color:#0a0b0d}.v11wyrim-15{display:flex;align-items:center;justify-content:flex-start;gap:4px}.v11wyrim-16{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;color:#a4a7af;font-variant-numeric:tabular-nums}.v11wyrim-17{display:flex;align-items:center;justify-content:center;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;width:22px;height:22px;background:transparent;border:none;border-radius:var(--radius-sm);padding:0;color:#a4a7af;cursor:pointer}.v11wyrim-17:hover{background:#f0f0f2;color:#0a0b0d}.v11wyrim-17:disabled{opacity:.4;cursor:default}.v11wyrim-17>svg{width:14px;height:14px}.v11wyrim-18{flex:1;overflow:auto;padding-bottom:10px}.vwomtc5-1{padding:2px 0 10px}.vwomtc5-2{padding:20px;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start;gap:10px}.vwomtc5-3{color:#6b6e76;font-size:11.5px;font-weight:600;letter-spacing:-.005em}.vwomtc5-4{color:#6b6e76;font-size:12px;line-height:1.5;white-space:pre-wrap}.vwomtc5-5{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";display:block;width:100%;overflow:auto;color:#0a0b0d;background:#f0f0f2;border:1px solid #e8e8eb;border-radius:var(--radius-sm);padding:10px 12px}.vwomtc5-6{display:flex;align-items:center;justify-content:flex-start;gap:8px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;position:relative;width:calc(100% - 16px);margin:1px 8px;background:transparent;border:none;border-radius:var(--radius-sm);text-align:left;color:#6b6e76;font-size:12.5px;line-height:20px;min-height:30px;padding-top:5px;padding-bottom:5px;padding-right:10px;overflow:hidden}.vwomtc5-6.depth0{padding-left:10px}.vwomtc5-6.depth1{padding-left:24px}.vwomtc5-6.depth2{padding-left:38px}.vwomtc5-6.depth3{padding-left:52px}.vwomtc5-6.active{background:#f0f0f2;color:#0a0b0d}.vwomtc5-6.active:before{content:"";position:absolute;left:-8px;top:6px;bottom:6px;width:2px;background:#22d3ee;border-radius:2px}.vwomtc5-7{display:flex;align-items:center;justify-content:flex-start;gap:8px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;position:relative;width:calc(100% - 16px);margin:1px 8px;background:transparent;border:none;border-radius:var(--radius-sm);text-align:left;color:#6b6e76;font-size:12.5px;line-height:20px;min-height:30px;padding-top:5px;padding-bottom:5px;padding-right:10px;overflow:hidden;cursor:pointer}.vwomtc5-7.vhb7hne{padding-left:10px}.vwomtc5-7.v1dycipb{padding-left:24px}.vwomtc5-7.v1qfp5hv{padding-left:38px}.vwomtc5-7.v5btrph{padding-left:52px}.vwomtc5-7.viu82ah{background:#f0f0f2;color:#0a0b0d}.vwomtc5-7.viu82ah:before{content:"";position:absolute;left:-8px;top:6px;bottom:6px;width:2px;background:#22d3ee;border-radius:2px}.vwomtc5-7:not(.viu82ah):hover{background:#fcfcfc;color:#0a0b0d}.vwomtc5-8{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:transform,background,color;display:inline-flex;width:18px;height:18px;align-items:center;justify-content:center;background:transparent;border:none;border-radius:var(--radius-sm);padding:0;color:#a4a7af;opacity:.8;flex-shrink:0;cursor:pointer}.vwomtc5-8:hover{background:#f0f0f2;color:#0a0b0d;opacity:1}.vwomtc5-8>svg{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:transform;width:12px;height:12px}.vwomtc5-8.vk7wfis>svg{transform:rotate(90deg)}.vwomtc5-9{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;font-weight:600;font-size:12.5px;color:#0a0b0d}.vwomtc5-10{color:#a4a7af;font-weight:400}.vwomtc5-11{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;font-weight:500;font-size:12.5px}.vwomtc5-12{color:#a4a7af;font-weight:400}.vwomtc5-13{color:#a4a7af;font-weight:400;margin:0 4px}.vwomtc5-14{display:flex;align-items:center;justify-content:flex-start;gap:6px;flex-shrink:0}.vwomtc5-15{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10px;color:#a4a7af;font-variant-numeric:tabular-nums;flex-shrink:0}.v15ec1hr-1{height:100%;overflow:hidden;background:transparent}:root{color-scheme:light;--radius-sm: 6px;--radius-md: 8px;--radius-lg: 12px}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html,body{height:100%;font-family:Geist,-apple-system,BlinkMacSystemFont,Inter,Segoe UI,system-ui,sans-serif;font-feature-settings:"ss01","ss03","cv11";background:#fcfcfc;color:#0a0b0d;font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;letter-spacing:-.005em}#root{height:100%}::selection{background:#22d3ee4d;color:#0a0b0d}button{cursor:pointer;font-family:inherit;font-size:inherit;color:inherit;letter-spacing:inherit}input,select,textarea{font-family:inherit;font-size:inherit;color:inherit}a{color:#0e7490;text-decoration:none}a:hover{color:#22d3ee;text-decoration:underline;text-underline-offset:3px}
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
href="https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap"
|
|
26
26
|
rel="stylesheet"
|
|
27
27
|
/>
|
|
28
|
-
<script type="module" crossorigin src="/assets/index-
|
|
29
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
28
|
+
<script type="module" crossorigin src="/assets/index-3bLi3uQJ.js"></script>
|
|
29
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DNsZjOms.css">
|
|
30
30
|
</head>
|
|
31
31
|
<body>
|
|
32
32
|
<div id="root"></div>
|
package/dist/bin.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { B as runSummarySchema, C as validateCharts, F as getEvalDisplayStatus, I as deriveScopedSummaryFromCases, P as getEvalTitle,
|
|
1
|
+
import { B as runSummarySchema, C as validateCharts, F as getEvalDisplayStatus, I as deriveScopedSummaryFromCases, P as getEvalTitle, S as normalizeScoreDef, Un as getEvalRegistry, _ as loadEvalModule, a as getLastRunStatuses, b as loadConfig, c as loadPersistedRunSnapshots, ct as getCaseRowEvalKey, d as persistRunState, f as recomputeEvalStatusesInRuns, g as deriveEvalFreshness, h as resolveArtifactPath, i as generateRunId, l as nextShortIdFromSnapshots, m as runTouchesEval, n as getTargetEvalKeys, nt as resolveLlmCallsConfig, o as getLatestRunInfos, ot as buildEvalKey, p as recomputePersistedCaseStatus, s as loadPersistedRunSnapshot, st as getCaseRowCaseKey, tt as resolveApiCallsConfig, u as persistCaseDetail, v as parseEvalDiscovery, w as createFsCacheStore, x as buildDeclaredColumnDefs, y as resolveEvalDefaultConfig } from "./runOrchestration-B31SV_Bq.mjs";
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
3
|
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
4
4
|
import { dirname, join, relative, resolve } from "node:path";
|
|
@@ -8,6 +8,34 @@ import { existsSync } from "node:fs";
|
|
|
8
8
|
import { resultify } from "t-result";
|
|
9
9
|
import { fileURLToPath } from "node:url";
|
|
10
10
|
import { spawn, spawnSync } from "node:child_process";
|
|
11
|
+
//#region ../runner/src/evalSummaries.ts
|
|
12
|
+
/** Build the API/UI summary payload for one discovered eval. */
|
|
13
|
+
function buildEvalSummary(params) {
|
|
14
|
+
const { meta, config, gitState, latestRun, lastRunStatus } = params;
|
|
15
|
+
const { sourceFingerprint, ...summaryMeta } = meta;
|
|
16
|
+
const freshness = deriveEvalFreshness({
|
|
17
|
+
latestRun,
|
|
18
|
+
gitState,
|
|
19
|
+
currentEvalSourceFingerprint: sourceFingerprint,
|
|
20
|
+
staleAfterDays: config.staleAfterDays ?? 14
|
|
21
|
+
});
|
|
22
|
+
return {
|
|
23
|
+
...summaryMeta,
|
|
24
|
+
stale: freshness.stale,
|
|
25
|
+
outdated: freshness.outdated,
|
|
26
|
+
freshnessStatus: freshness.freshnessStatus,
|
|
27
|
+
latestRunAt: latestRun?.startedAt ?? null,
|
|
28
|
+
latestRunCommitSha: latestRun?.commitSha ?? null,
|
|
29
|
+
currentCommitSha: gitState.commitSha,
|
|
30
|
+
lastRunStatus
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Write one latest-run snapshot to each targeted eval id. */
|
|
34
|
+
function setLatestRunInfoMap(params) {
|
|
35
|
+
const { latestRunInfoMap, evalIds, info } = params;
|
|
36
|
+
for (const evalId of evalIds) latestRunInfoMap.set(evalId, info);
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
11
39
|
//#region ../runner/src/gitState.ts
|
|
12
40
|
function runGitCommand(workspaceRoot, args) {
|
|
13
41
|
const result = spawnSync("git", args, {
|
|
@@ -142,16 +170,16 @@ function handleRunChildMessage(params) {
|
|
|
142
170
|
handleRunChildEvent(runState, message.event, managerContext);
|
|
143
171
|
}
|
|
144
172
|
function upsertFinishedCase(runState, caseDetail, caseRow) {
|
|
145
|
-
const existingIndex = runState.cases.findIndex((row) => row
|
|
173
|
+
const existingIndex = runState.cases.findIndex((row) => getCaseRowCaseKey(row) === getCaseRowCaseKey(caseRow) && row.trial === caseRow.trial);
|
|
146
174
|
if (existingIndex === -1) runState.cases.push(caseRow);
|
|
147
175
|
else runState.cases[existingIndex] = caseRow;
|
|
148
|
-
runState.caseDetails.set(caseDetail.caseId, caseDetail);
|
|
176
|
+
runState.caseDetails.set(caseDetail.caseKey ?? caseDetail.caseId, caseDetail);
|
|
149
177
|
}
|
|
150
178
|
function applyChildEvalMetas(evals, childMetas) {
|
|
151
179
|
for (const childMeta of childMetas) {
|
|
152
|
-
const evalMeta = evals.get(childMeta.
|
|
180
|
+
const evalMeta = evals.get(childMeta.key);
|
|
153
181
|
if (evalMeta === void 0) {
|
|
154
|
-
evals.set(childMeta.
|
|
182
|
+
evals.set(childMeta.key, childMeta);
|
|
155
183
|
continue;
|
|
156
184
|
}
|
|
157
185
|
evalMeta.columnDefs = childMeta.columnDefs;
|
|
@@ -266,6 +294,7 @@ function createRunner({ watchForChanges = true } = {}) {
|
|
|
266
294
|
let llmCallsConfig = resolveLlmCallsConfig(void 0);
|
|
267
295
|
let apiCallsConfig = resolveApiCallsConfig(void 0);
|
|
268
296
|
const evals = /* @__PURE__ */ new Map();
|
|
297
|
+
let discoveryIssues = [];
|
|
269
298
|
const runs = /* @__PURE__ */ new Map();
|
|
270
299
|
const lastRunStatusMap = /* @__PURE__ */ new Map();
|
|
271
300
|
const latestRunInfoMap = /* @__PURE__ */ new Map();
|
|
@@ -279,7 +308,13 @@ function createRunner({ watchForChanges = true } = {}) {
|
|
|
279
308
|
return relative(workspaceRoot, filePath).replaceAll("\\", "/");
|
|
280
309
|
}
|
|
281
310
|
function getSortedEvalMetas() {
|
|
282
|
-
return [...evals.values()].toSorted((a, b) => a.filePath.localeCompare(b.filePath));
|
|
311
|
+
return [...evals.values()].toSorted((a, b) => a.filePath.localeCompare(b.filePath) || a.id.localeCompare(b.id));
|
|
312
|
+
}
|
|
313
|
+
function resolveEvalMeta(evalRef) {
|
|
314
|
+
const exactMatch = evals.get(evalRef);
|
|
315
|
+
if (exactMatch !== void 0) return exactMatch;
|
|
316
|
+
const matches = getSortedEvalMetas().filter((ev) => ev.id === evalRef);
|
|
317
|
+
return matches.length === 1 ? matches[0] : void 0;
|
|
283
318
|
}
|
|
284
319
|
function getSourceFingerprint(source) {
|
|
285
320
|
return createHash("sha256").update(source).digest("hex");
|
|
@@ -312,12 +347,12 @@ function createRunner({ watchForChanges = true } = {}) {
|
|
|
312
347
|
async clearCache(filter) {
|
|
313
348
|
await cacheStore.clear(filter);
|
|
314
349
|
},
|
|
315
|
-
async recomputeStatusesForEval(
|
|
316
|
-
const evalMeta =
|
|
350
|
+
async recomputeStatusesForEval(evalKey) {
|
|
351
|
+
const evalMeta = resolveEvalMeta(evalKey);
|
|
317
352
|
if (!evalMeta) return { updatedRuns: 0 };
|
|
318
353
|
const registry = getEvalRegistry();
|
|
319
354
|
await loadEvalModule(evalMeta.sourceFilePath, evalMeta.sourceFingerprint ?? void 0);
|
|
320
|
-
const entry = registry.get(
|
|
355
|
+
const entry = registry.get(evalMeta.id);
|
|
321
356
|
if (!entry) return { updatedRuns: 0 };
|
|
322
357
|
const scoreThresholds = /* @__PURE__ */ new Map();
|
|
323
358
|
entry.use((evalDef) => {
|
|
@@ -329,22 +364,25 @@ function createRunner({ watchForChanges = true } = {}) {
|
|
|
329
364
|
});
|
|
330
365
|
const updatedRuns = await recomputeEvalStatusesInRuns({
|
|
331
366
|
runs: runs.values(),
|
|
332
|
-
|
|
333
|
-
|
|
367
|
+
evalKey: evalMeta.key,
|
|
368
|
+
evalId: evalMeta.id,
|
|
369
|
+
evalExists: evals.has(evalMeta.key),
|
|
334
370
|
scoreThresholds,
|
|
335
371
|
persistCaseDetail
|
|
336
372
|
});
|
|
337
373
|
emitDiscoveryEvent();
|
|
338
374
|
return { updatedRuns };
|
|
339
375
|
},
|
|
340
|
-
async cleanRunsForEval(
|
|
376
|
+
async cleanRunsForEval(evalKey) {
|
|
377
|
+
const evalMeta = resolveEvalMeta(evalKey);
|
|
341
378
|
let deletedRuns = 0;
|
|
342
379
|
for (const [runId, run] of [...runs]) {
|
|
343
380
|
if (!runTouchesEval({
|
|
344
381
|
target: run.manifest.target,
|
|
345
382
|
caseRows: run.cases,
|
|
346
|
-
|
|
347
|
-
|
|
383
|
+
evalKey: evalMeta?.key ?? evalKey,
|
|
384
|
+
evalId: evalMeta?.id,
|
|
385
|
+
evalExists: evalMeta !== void 0
|
|
348
386
|
})) continue;
|
|
349
387
|
if (run.manifest.status === "running") continue;
|
|
350
388
|
runs.delete(runId);
|
|
@@ -367,12 +405,12 @@ function createRunner({ watchForChanges = true } = {}) {
|
|
|
367
405
|
updated: false,
|
|
368
406
|
reason: "Run is still running"
|
|
369
407
|
};
|
|
370
|
-
const caseRow = run.cases.find((row) => row.caseId === caseId);
|
|
408
|
+
const caseRow = run.cases.find((row) => getCaseRowCaseKey(row) === caseId || row.caseId === caseId);
|
|
371
409
|
if (!caseRow) return {
|
|
372
410
|
updated: false,
|
|
373
411
|
reason: "Case not found"
|
|
374
412
|
};
|
|
375
|
-
const evalMeta = evals.get(caseRow
|
|
413
|
+
const evalMeta = evals.get(getCaseRowEvalKey(caseRow));
|
|
376
414
|
if (!evalMeta) return {
|
|
377
415
|
updated: false,
|
|
378
416
|
reason: "Eval not found"
|
|
@@ -381,7 +419,7 @@ function createRunner({ watchForChanges = true } = {}) {
|
|
|
381
419
|
updated: false,
|
|
382
420
|
reason: "Manual score not found"
|
|
383
421
|
};
|
|
384
|
-
const caseDetail = run.caseDetails.get(
|
|
422
|
+
const caseDetail = run.caseDetails.get(getCaseRowCaseKey(caseRow));
|
|
385
423
|
if (!caseDetail) return {
|
|
386
424
|
updated: false,
|
|
387
425
|
reason: "Case detail not found"
|
|
@@ -435,22 +473,25 @@ function createRunner({ watchForChanges = true } = {}) {
|
|
|
435
473
|
meta,
|
|
436
474
|
config,
|
|
437
475
|
gitState,
|
|
438
|
-
latestRun: latestRunInfoMap.get(meta.
|
|
439
|
-
lastRunStatus: lastRunStatusMap.get(meta.
|
|
476
|
+
latestRun: latestRunInfoMap.get(meta.key),
|
|
477
|
+
lastRunStatus: lastRunStatusMap.get(meta.key) ?? null
|
|
440
478
|
}));
|
|
441
479
|
return result;
|
|
442
480
|
},
|
|
443
481
|
getEval(id) {
|
|
444
|
-
const meta =
|
|
482
|
+
const meta = resolveEvalMeta(id);
|
|
445
483
|
if (!meta) return void 0;
|
|
446
484
|
return buildEvalSummary({
|
|
447
485
|
meta,
|
|
448
486
|
config,
|
|
449
487
|
gitState: readGitWorktreeState(workspaceRoot),
|
|
450
|
-
latestRun: latestRunInfoMap.get(meta.
|
|
451
|
-
lastRunStatus: lastRunStatusMap.get(meta.
|
|
488
|
+
latestRun: latestRunInfoMap.get(meta.key),
|
|
489
|
+
lastRunStatus: lastRunStatusMap.get(meta.key) ?? null
|
|
452
490
|
});
|
|
453
491
|
},
|
|
492
|
+
getDiscoveryIssues() {
|
|
493
|
+
return discoveryIssues;
|
|
494
|
+
},
|
|
454
495
|
async refreshDiscovery() {
|
|
455
496
|
const patterns = config.include;
|
|
456
497
|
const discovered = [];
|
|
@@ -462,16 +503,25 @@ function createRunner({ watchForChanges = true } = {}) {
|
|
|
462
503
|
discovered.push(...files);
|
|
463
504
|
}
|
|
464
505
|
evals.clear();
|
|
506
|
+
discoveryIssues = [];
|
|
465
507
|
for (const filePath of discovered) try {
|
|
466
508
|
const content = await readFile(filePath, "utf-8");
|
|
467
|
-
const
|
|
509
|
+
const discovery = parseEvalDiscovery(filePath, content);
|
|
510
|
+
const discoveredMetas = discovery.metas;
|
|
511
|
+
discoveryIssues.push(...discovery.issues.map((issue) => ({
|
|
512
|
+
...issue,
|
|
513
|
+
filePath: toWorkspaceRelativePath(issue.filePath),
|
|
514
|
+
message: `Duplicate eval id "${issue.evalId}" in ${toWorkspaceRelativePath(issue.filePath)}. Eval ids must be unique within one file.`
|
|
515
|
+
})));
|
|
468
516
|
const sourceFingerprint = getSourceFingerprint(content);
|
|
469
517
|
const registry = getEvalRegistry();
|
|
518
|
+
let moduleLoaded = false;
|
|
470
519
|
try {
|
|
471
520
|
await loadEvalModule(filePath, sourceFingerprint);
|
|
521
|
+
moduleLoaded = true;
|
|
472
522
|
} catch {}
|
|
473
523
|
for (const meta of discoveredMetas) {
|
|
474
|
-
const discoveredEntry = registry.get(meta.id);
|
|
524
|
+
const discoveredEntry = moduleLoaded ? registry.get(meta.id) : void 0;
|
|
475
525
|
const title = meta.title;
|
|
476
526
|
let columnDefs = buildDeclaredColumnDefs(void 0, void 0, void 0);
|
|
477
527
|
let stats;
|
|
@@ -491,10 +541,16 @@ function createRunner({ watchForChanges = true } = {}) {
|
|
|
491
541
|
for (const warning of validated.warnings) console.warn(warning);
|
|
492
542
|
charts = validated.charts;
|
|
493
543
|
});
|
|
494
|
-
|
|
544
|
+
const relativeFilePath = toWorkspaceRelativePath(meta.filePath);
|
|
545
|
+
const key = buildEvalKey({
|
|
546
|
+
filePath: relativeFilePath,
|
|
547
|
+
evalId: meta.id
|
|
548
|
+
});
|
|
549
|
+
evals.set(key, {
|
|
550
|
+
key,
|
|
495
551
|
id: meta.id,
|
|
496
552
|
title,
|
|
497
|
-
filePath:
|
|
553
|
+
filePath: relativeFilePath,
|
|
498
554
|
sourceFilePath: meta.filePath,
|
|
499
555
|
sourceFingerprint,
|
|
500
556
|
columnDefs,
|
|
@@ -549,10 +605,9 @@ function createRunner({ watchForChanges = true } = {}) {
|
|
|
549
605
|
runs.set(runId, runState);
|
|
550
606
|
setLatestRunInfoMap({
|
|
551
607
|
latestRunInfoMap,
|
|
552
|
-
evalIds:
|
|
608
|
+
evalIds: getTargetEvalKeys({
|
|
553
609
|
request,
|
|
554
|
-
|
|
555
|
-
knownEvalIds: new Set(evals.keys())
|
|
610
|
+
sortedEvals: getSortedEvalMetas()
|
|
556
611
|
}),
|
|
557
612
|
info: {
|
|
558
613
|
status: "running",
|
|
@@ -633,7 +688,7 @@ function createRunner({ watchForChanges = true } = {}) {
|
|
|
633
688
|
getCaseDetail(runId, caseId) {
|
|
634
689
|
const run = runs.get(runId);
|
|
635
690
|
if (!run) return void 0;
|
|
636
|
-
return run.caseDetails.get(caseId);
|
|
691
|
+
return run.caseDetails.get(caseId) ?? run.caseDetails.get(getCaseRowCaseKey(run.cases.find((caseRow) => getCaseRowCaseKey(caseRow) === caseId || caseRow.caseId === caseId) ?? { caseId }));
|
|
637
692
|
},
|
|
638
693
|
subscribe(runId, listener) {
|
|
639
694
|
const run = runs.get(runId);
|
|
@@ -687,6 +742,9 @@ function createRunner({ watchForChanges = true } = {}) {
|
|
|
687
742
|
ignoreInitial: true,
|
|
688
743
|
persistent: true
|
|
689
744
|
});
|
|
745
|
+
const watcherReady = new Promise((ready) => {
|
|
746
|
+
watcher.once("ready", ready);
|
|
747
|
+
});
|
|
690
748
|
discoveryWatcher = watcher;
|
|
691
749
|
const scheduleRefresh = () => {
|
|
692
750
|
if (discoveryRefreshTimer !== void 0) clearTimeout(discoveryRefreshTimer);
|
|
@@ -701,9 +759,7 @@ function createRunner({ watchForChanges = true } = {}) {
|
|
|
701
759
|
watcher.on("addDir", scheduleRefresh);
|
|
702
760
|
watcher.on("unlinkDir", scheduleRefresh);
|
|
703
761
|
await setupRunHistoryWatcher();
|
|
704
|
-
await
|
|
705
|
-
watcher.once("ready", ready);
|
|
706
|
-
});
|
|
762
|
+
await watcherReady;
|
|
707
763
|
}
|
|
708
764
|
async function setupRunHistoryWatcher() {
|
|
709
765
|
const watcher = watch(join(localStateDir, "runs"), {
|
|
@@ -799,6 +855,7 @@ function parseArgs(argv) {
|
|
|
799
855
|
helpTopic: "global",
|
|
800
856
|
unknownHelpTarget: void 0,
|
|
801
857
|
evalIds: [],
|
|
858
|
+
files: [],
|
|
802
859
|
caseIds: [],
|
|
803
860
|
trials: 1,
|
|
804
861
|
json: false,
|
|
@@ -834,6 +891,9 @@ function parseArgs(argv) {
|
|
|
834
891
|
else if (arg === "--eval" && next) {
|
|
835
892
|
args.evalIds.push(...next.split(","));
|
|
836
893
|
i++;
|
|
894
|
+
} else if (arg === "--file" && next) {
|
|
895
|
+
args.files.push(...next.split(","));
|
|
896
|
+
i++;
|
|
837
897
|
} else if (arg === "--case" && next) {
|
|
838
898
|
args.caseIds.push(...next.split(","));
|
|
839
899
|
i++;
|
|
@@ -899,6 +959,28 @@ async function runCli(argv) {
|
|
|
899
959
|
function isCliCommand(command) {
|
|
900
960
|
return command === "app" || command === "list" || command === "run" || command === "show-runs" || command === "cache" || command === "help";
|
|
901
961
|
}
|
|
962
|
+
function escapeRegex(value) {
|
|
963
|
+
return value.replace(/[|\\{}()[\]^$+?.]/g, "\\$&");
|
|
964
|
+
}
|
|
965
|
+
function globToRegex(pattern) {
|
|
966
|
+
const normalized = pattern.replaceAll("\\", "/");
|
|
967
|
+
let regex = "^";
|
|
968
|
+
for (let i = 0; i < normalized.length; i++) {
|
|
969
|
+
const char = normalized[i];
|
|
970
|
+
const next = normalized[i + 1];
|
|
971
|
+
if (char === "*" && next === "*") {
|
|
972
|
+
regex += ".*";
|
|
973
|
+
i++;
|
|
974
|
+
} else if (char === "*") regex += "[^/]*";
|
|
975
|
+
else if (char === "?") regex += "[^/]";
|
|
976
|
+
else regex += escapeRegex(char ?? "");
|
|
977
|
+
}
|
|
978
|
+
return new RegExp(`${regex}$`);
|
|
979
|
+
}
|
|
980
|
+
function fileMatches(pattern, filePath) {
|
|
981
|
+
const normalized = pattern.replaceAll("\\", "/");
|
|
982
|
+
return normalized === filePath || globToRegex(normalized).test(filePath);
|
|
983
|
+
}
|
|
902
984
|
function loadWorkspaceEnv() {
|
|
903
985
|
const envPath = resolve(process.cwd(), ".env");
|
|
904
986
|
if (!existsSync(envPath)) return true;
|
|
@@ -959,8 +1041,8 @@ async function commandApp(args) {
|
|
|
959
1041
|
const { serve } = await import("@hono/node-server");
|
|
960
1042
|
const bundledWebDist = resolve(currentDir, "apps/web/dist");
|
|
961
1043
|
if (existsSync(bundledWebDist)) process.env.AGENT_EVALS_WEB_DIST = bundledWebDist;
|
|
962
|
-
const appModule = await import("./app-
|
|
963
|
-
const runnerModule = await import("./runner-
|
|
1044
|
+
const appModule = await import("./app-BWjrZUSt.mjs");
|
|
1045
|
+
const runnerModule = await import("./runner-NPxmmHwa.mjs");
|
|
964
1046
|
if (!isHonoAppModule(appModule)) throw new Error("Server app module is invalid");
|
|
965
1047
|
if (!isServerRunnerModule(runnerModule)) throw new Error("Server runner module is invalid");
|
|
966
1048
|
await runnerModule.initRunner();
|
|
@@ -973,9 +1055,16 @@ async function commandApp(args) {
|
|
|
973
1055
|
async function commandList(args_) {
|
|
974
1056
|
const runner = createRunner({ watchForChanges: false });
|
|
975
1057
|
await runner.init();
|
|
1058
|
+
const discoveryIssues = runner.getDiscoveryIssues();
|
|
1059
|
+
if (discoveryIssues.length > 0) {
|
|
1060
|
+
console.error("Discovery errors:\n");
|
|
1061
|
+
for (const issue of discoveryIssues) console.error(` ${issue.message}`);
|
|
1062
|
+
console.error("");
|
|
1063
|
+
}
|
|
976
1064
|
const evals = runner.getEvals();
|
|
977
1065
|
if (evals.length === 0) {
|
|
978
1066
|
console.info("No eval files found.");
|
|
1067
|
+
if (discoveryIssues.length > 0) process.exit(1);
|
|
979
1068
|
return;
|
|
980
1069
|
}
|
|
981
1070
|
console.info("Discovered evals:\n");
|
|
@@ -994,12 +1083,13 @@ async function commandList(args_) {
|
|
|
994
1083
|
if (ev.caseCount !== null) console.info(` cases: ${String(ev.caseCount)}`);
|
|
995
1084
|
console.info("");
|
|
996
1085
|
}
|
|
1086
|
+
if (discoveryIssues.length > 0) process.exit(1);
|
|
997
1087
|
}
|
|
998
1088
|
async function commandRun(args) {
|
|
999
1089
|
const runner = createRunner({ watchForChanges: false });
|
|
1000
1090
|
await runner.init();
|
|
1001
|
-
if (args.evalIds.length === 0 && args.caseIds.length === 0 && !runner.getAllowCliRunAll()) {
|
|
1002
|
-
console.error("This workspace disables running all evals from the CLI. Pass --eval <id
|
|
1091
|
+
if (args.evalIds.length === 0 && args.caseIds.length === 0 && args.files.length === 0 && !runner.getAllowCliRunAll()) {
|
|
1092
|
+
console.error("This workspace disables running all evals from the CLI. Pass --eval <id>, --file <path|glob>, or --case <id> to run a targeted subset.");
|
|
1003
1093
|
process.exit(1);
|
|
1004
1094
|
return;
|
|
1005
1095
|
}
|
|
@@ -1013,10 +1103,15 @@ async function commandRun(args) {
|
|
|
1013
1103
|
const target = args.caseIds.length > 0 ? {
|
|
1014
1104
|
mode: "caseIds",
|
|
1015
1105
|
caseIds: args.caseIds,
|
|
1016
|
-
evalIds: args.evalIds.length > 0 ? args.evalIds : void 0
|
|
1106
|
+
evalIds: args.evalIds.length > 0 ? args.evalIds : void 0,
|
|
1107
|
+
files: args.files.length > 0 ? args.files : void 0
|
|
1017
1108
|
} : args.evalIds.length > 0 ? {
|
|
1018
1109
|
mode: "evalIds",
|
|
1019
|
-
evalIds: args.evalIds
|
|
1110
|
+
evalIds: args.evalIds,
|
|
1111
|
+
files: args.files.length > 0 ? args.files : void 0
|
|
1112
|
+
} : args.files.length > 0 ? {
|
|
1113
|
+
mode: "evalIds",
|
|
1114
|
+
files: args.files
|
|
1020
1115
|
} : { mode: "all" };
|
|
1021
1116
|
const run = await runner.startRun({
|
|
1022
1117
|
target,
|
|
@@ -1046,8 +1141,12 @@ async function commandRun(args) {
|
|
|
1046
1141
|
console.info(`Errors: ${String(summary.errorCases)}`);
|
|
1047
1142
|
if (summary.totalCases > 0) console.info(`Pass Rate: ${String(summary.passedCases)}/${String(summary.totalCases)}`);
|
|
1048
1143
|
if (summary.totalDurationMs !== null) console.info(`Duration: ${(summary.totalDurationMs / 1e3).toFixed(1)}s`);
|
|
1144
|
+
if (summary.errorMessage !== null) {
|
|
1145
|
+
console.info("");
|
|
1146
|
+
console.info(summary.errorMessage);
|
|
1147
|
+
}
|
|
1049
1148
|
}
|
|
1050
|
-
if (summary.failedCases > 0 || summary.errorCases > 0) process.exit(1);
|
|
1149
|
+
if (summary.status === "error" || summary.failedCases > 0 || summary.errorCases > 0) process.exit(1);
|
|
1051
1150
|
}
|
|
1052
1151
|
async function commandShowRuns(args) {
|
|
1053
1152
|
const runner = createRunner({ watchForChanges: false });
|
|
@@ -1101,8 +1200,9 @@ async function commandCache(args) {
|
|
|
1101
1200
|
return;
|
|
1102
1201
|
}
|
|
1103
1202
|
if (args.subcommand === "clear") {
|
|
1104
|
-
if (args.evalIds.length > 0) {
|
|
1105
|
-
|
|
1203
|
+
if (args.evalIds.length > 0 || args.files.length > 0) {
|
|
1204
|
+
const evalIds = runner.getEvals().filter((ev) => (args.evalIds.length === 0 || args.evalIds.includes(ev.id)) && (args.files.length === 0 || args.files.some((file) => fileMatches(file, ev.filePath)))).map((ev) => ev.id);
|
|
1205
|
+
for (const evalId of evalIds) {
|
|
1106
1206
|
const entries = await runner.listCache();
|
|
1107
1207
|
const prefix = `${evalId}__`;
|
|
1108
1208
|
const matching = entries.filter((entry) => entry.namespace.startsWith(prefix));
|
|
@@ -1111,7 +1211,7 @@ async function commandCache(args) {
|
|
|
1111
1211
|
key: entry.key
|
|
1112
1212
|
});
|
|
1113
1213
|
}
|
|
1114
|
-
console.info(`Cleared cache entries for: ${
|
|
1214
|
+
console.info(`Cleared cache entries for: ${evalIds.join(", ")}`);
|
|
1115
1215
|
return;
|
|
1116
1216
|
}
|
|
1117
1217
|
if (args.all) {
|
|
@@ -1130,6 +1230,9 @@ function getSortedRunSnapshots(runner) {
|
|
|
1130
1230
|
}
|
|
1131
1231
|
function buildRunFileIndex(workspaceRoot, run) {
|
|
1132
1232
|
const runDir = join(workspaceRoot, ".agent-evals", "runs", run.manifest.id);
|
|
1233
|
+
const caseIdCounts = /* @__PURE__ */ new Map();
|
|
1234
|
+
for (const caseRow of run.cases) caseIdCounts.set(caseRow.caseId, (caseIdCounts.get(caseRow.caseId) ?? 0) + 1);
|
|
1235
|
+
const seenCaseIds = /* @__PURE__ */ new Set();
|
|
1133
1236
|
return {
|
|
1134
1237
|
id: run.manifest.id,
|
|
1135
1238
|
shortId: run.manifest.shortId,
|
|
@@ -1147,10 +1250,16 @@ function buildRunFileIndex(workspaceRoot, run) {
|
|
|
1147
1250
|
tracesDir: join(runDir, "traces")
|
|
1148
1251
|
},
|
|
1149
1252
|
cases: run.cases.map((caseRow) => {
|
|
1150
|
-
const
|
|
1253
|
+
const duplicateCaseIdCount = caseIdCounts.get(caseRow.caseId) ?? 0;
|
|
1254
|
+
const hasPreviousCaseWithId = seenCaseIds.has(caseRow.caseId);
|
|
1255
|
+
const fileId = duplicateCaseIdCount > 1 && hasPreviousCaseWithId ? caseRow.caseKey ?? caseRow.caseId : caseRow.caseId;
|
|
1256
|
+
seenCaseIds.add(caseRow.caseId);
|
|
1257
|
+
const fileName = `${encodeURIComponent(fileId)}.json`;
|
|
1151
1258
|
return {
|
|
1152
1259
|
caseId: caseRow.caseId,
|
|
1260
|
+
caseKey: caseRow.caseKey,
|
|
1153
1261
|
evalId: caseRow.evalId,
|
|
1262
|
+
evalKey: caseRow.evalKey,
|
|
1154
1263
|
status: caseRow.status,
|
|
1155
1264
|
files: {
|
|
1156
1265
|
caseDetail: join(runDir, "case-details", fileName),
|
|
@@ -1262,7 +1371,8 @@ Usage:
|
|
|
1262
1371
|
|
|
1263
1372
|
Flags:
|
|
1264
1373
|
--eval <id> Run specific eval(s) (comma-separated)
|
|
1265
|
-
--
|
|
1374
|
+
--file <path|glob> Run eval files matching path/glob (comma-separated)
|
|
1375
|
+
--case <id> Run case(s); combine with --file/--eval if ambiguous
|
|
1266
1376
|
--trials <n> Number of trials per case
|
|
1267
1377
|
--inspect[=host:port] Run with the Node.js inspector enabled
|
|
1268
1378
|
--inspect-brk[=host:port] Enable inspector and pause before startup
|