titan-agent 6.1.0-beta.2 → 6.1.0-beta.21
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/LICENSE +1 -29
- package/README.md +1 -1
- package/dist/agent/agentLessons.js +2 -2
- package/dist/agent/agentLessons.js.map +1 -1
- package/dist/agent/autoModeClassifier.js +95 -0
- package/dist/agent/autoModeClassifier.js.map +1 -0
- package/dist/agent/durableJournal.js +2 -2
- package/dist/agent/durableJournal.js.map +1 -1
- package/dist/agent/goalDriver.js +67 -0
- package/dist/agent/goalDriver.js.map +1 -1
- package/dist/agent/goalPlanFile.js +3 -3
- package/dist/agent/goalPlanFile.js.map +1 -1
- package/dist/agent/missionLifecycle.js +2 -2
- package/dist/agent/missionLifecycle.js.map +1 -1
- package/dist/agent/subAgent.js +41 -0
- package/dist/agent/subAgent.js.map +1 -1
- package/dist/agent/toolContract.js +49 -0
- package/dist/agent/toolContract.js.map +1 -0
- package/dist/agent/toolRunner.js +72 -11
- package/dist/agent/toolRunner.js.map +1 -1
- package/dist/agent/trajectoryRecorder.js +185 -0
- package/dist/agent/trajectoryRecorder.js.map +1 -0
- package/dist/agent/verification.js +164 -0
- package/dist/agent/verification.js.map +1 -0
- package/dist/agent/worktreeExecutor.js +207 -0
- package/dist/agent/worktreeExecutor.js.map +1 -0
- package/dist/config/schema.js +28 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/gateway/server.js +54 -0
- package/dist/gateway/server.js.map +1 -1
- package/dist/memory/facade.js +137 -0
- package/dist/memory/facade.js.map +1 -0
- package/dist/migrations/003-soma-profile-default.js +2 -2
- package/dist/migrations/003-soma-profile-default.js.map +1 -1
- package/dist/migrations/005-route-redirects.js +3 -1
- package/dist/migrations/005-route-redirects.js.map +1 -1
- package/dist/migrations/runner.js +2 -2
- package/dist/migrations/runner.js.map +1 -1
- package/dist/providers/defaultModel.js +14 -0
- package/dist/providers/defaultModel.js.map +1 -1
- package/dist/providers/router.js +4 -0
- package/dist/providers/router.js.map +1 -1
- package/dist/providers/stub.js +185 -0
- package/dist/providers/stub.js.map +1 -0
- package/dist/skills/builtin/backup.js +1 -2
- package/dist/skills/builtin/backup.js.map +1 -1
- package/dist/skills/builtin/contracts.js +254 -0
- package/dist/skills/builtin/contracts.js.map +1 -0
- package/dist/skills/builtin/download_image.js +9 -0
- package/dist/skills/builtin/download_image.js.map +1 -1
- package/dist/skills/builtin/filesystem.js +70 -20
- package/dist/skills/builtin/filesystem.js.map +1 -1
- package/dist/skills/registry.js +7 -0
- package/dist/skills/registry.js.map +1 -1
- package/dist/storage/patterns.js +2 -2
- package/dist/storage/patterns.js.map +1 -1
- package/dist/storage/personalGallery.js +2 -2
- package/dist/storage/personalGallery.js.map +1 -1
- package/dist/storage/somaProfile.js +2 -2
- package/dist/storage/somaProfile.js.map +1 -1
- package/dist/utils/constants.js +1 -1
- package/dist/utils/constants.js.map +1 -1
- package/package.json +2 -2
- package/ui/dist/assets/{AuditPanel-DrDvXZ9u.js → AuditPanel-RNrvKmfX.js} +1 -1
- package/ui/dist/assets/{AutonomyPanel-BfhW-PRX.js → AutonomyPanel-D0nmt79R.js} +2 -2
- package/ui/dist/assets/{AutopilotPanel-C3yQBxAp.js → AutopilotPanel-DlcdfRRy.js} +1 -1
- package/ui/dist/assets/{AutoresearchPanel-BgpR3EcK.js → AutoresearchPanel-CXeO6kGK.js} +2 -2
- package/ui/dist/assets/BackupPanel-CKb-cDsk.js +1 -0
- package/ui/dist/assets/{BrowserPanel-BNaKZOnn.js → BrowserPanel-CDaoF6n5.js} +1 -1
- package/ui/dist/assets/CPActivity-BZbeztg1.js +1 -0
- package/ui/dist/assets/CPAgentDetail-C9fvLxKi.js +1 -0
- package/ui/dist/assets/CPAgents-BsBA9kb2.js +1 -0
- package/ui/dist/assets/CPApprovals-Di5itVIK.js +1 -0
- package/ui/dist/assets/CPCosts-DmgckHli.js +1 -0
- package/ui/dist/assets/CPDashboard-CmSb7woK.js +1 -0
- package/ui/dist/assets/{CPFiles-CUpP5I82.js → CPFiles-Dd0NGcpX.js} +1 -1
- package/ui/dist/assets/CPGoals-DeILFq0A.js +1 -0
- package/ui/dist/assets/{CPInbox-DUW_hntB.js → CPInbox-DAtidZez.js} +2 -2
- package/ui/dist/assets/CPIssueDetail-BvwoGI57.js +1 -0
- package/ui/dist/assets/CPIssues-CZ1hIKDP.js +1 -0
- package/ui/dist/assets/{CPLayout-J0fa-it4.js → CPLayout-luPwhNpA.js} +3 -3
- package/ui/dist/assets/CPOrg-BlYp_KP6.js +8 -0
- package/ui/dist/assets/CPRuns-D0HMCjIo.js +1 -0
- package/ui/dist/assets/{CPSocial-By_FStZ4.js → CPSocial-CZaGi14s.js} +2 -2
- package/ui/dist/assets/ChannelsPanel-khiBHwx3.js +1 -0
- package/ui/dist/assets/{CheckpointsPanel-DvKUd2VF.js → CheckpointsPanel-n2y3jzzT.js} +1 -1
- package/ui/dist/assets/{CommandPostHub-CQqRYBjf.js → CommandPostHub-iWf-zt5p.js} +4 -4
- package/ui/dist/assets/{CronPanel-Brmnnu8_.js → CronPanel-BkRJl8u6.js} +1 -1
- package/ui/dist/assets/{DataTable-seaktPzB.js → DataTable-DZ2cG3Cv.js} +1 -1
- package/ui/dist/assets/{DreamPanel-CO7iSdjn.js → DreamPanel-DF6l0WB-.js} +1 -1
- package/ui/dist/assets/{EmptyState-CmK9fywh.js → EmptyState-D7xwm8hA.js} +1 -1
- package/ui/dist/assets/{EvalHarnessPanel-2RVBKbym.js → EvalHarnessPanel-BHabu49z.js} +2 -2
- package/ui/dist/assets/{EvalPanel-CqAwhFQ5.js → EvalPanel-yAesMLSP.js} +1 -1
- package/ui/dist/assets/{FileViewer-D98m-vF5.js → FileViewer-DOWUQccc.js} +52 -14
- package/ui/dist/assets/{FilesPanel-dRQM0apb.js → FilesPanel-BjuDhqaX.js} +2 -2
- package/ui/dist/assets/FleetPanel-B0ZhS2XX.js +1 -0
- package/ui/dist/assets/{HomelabPanel-DjMUrO2B.js → HomelabPanel-D373ddvj.js} +1 -1
- package/ui/dist/assets/InfraView-CI99NZbI.js +2 -0
- package/ui/dist/assets/InlineEditableField-fDk3eGVo.js +1 -0
- package/ui/dist/assets/Input-j10hONMY.js +1 -0
- package/ui/dist/assets/IntegrationsPanel-kPa5Qq-f.js +1 -0
- package/ui/dist/assets/IntelligenceView-DeKBaAlY.js +2 -0
- package/ui/dist/assets/LearningPanel-B8tqHeEZ.js +1 -0
- package/ui/dist/assets/{LogsPanel-Bs9IsTCH.js → LogsPanel-sXc__trb.js} +1 -1
- package/ui/dist/assets/McpPanel-DEr8pZwB.js +1 -0
- package/ui/dist/assets/{MemoryGraphPanel-F1P9COyY.js → MemoryGraphPanel-DZl7USJ6.js} +1 -1
- package/ui/dist/assets/MemoryWikiPanel-DTNVWvVT.js +11 -0
- package/ui/dist/assets/{MeshPanel-CgIAh5ZX.js → MeshPanel-b77zyQx4.js} +1 -1
- package/ui/dist/assets/MissionCanvas-D_quSl5F.js +69 -0
- package/ui/dist/assets/MissionChat-rQ5rUPAt.js +7 -0
- package/ui/dist/assets/MissionLibrary-Cxw7sLxv.js +5 -0
- package/ui/dist/assets/MissionStart-ChMWO1rr.js +1 -0
- package/ui/dist/assets/Modal-Dl5b6Yaj.js +1 -0
- package/ui/dist/assets/NvidiaPanel-D7qFbbeJ.js +1 -0
- package/ui/dist/assets/{OrganismPanel-CNZM3eof.js → OrganismPanel-EiQ9Gfqx.js} +1 -1
- package/ui/dist/assets/OverviewPanel-Bectj1Z5.js +1 -0
- package/ui/dist/assets/{PageHeader-llOXO43Z.js → PageHeader-CiuoyvDR.js} +1 -1
- package/ui/dist/assets/{PersonaProfilesPanel-CfsQTMra.js → PersonaProfilesPanel-BO87DSVG.js} +1 -1
- package/ui/dist/assets/{PersonasPanel-DIac_kZ3.js → PersonasPanel-BNogLwM0.js} +1 -1
- package/ui/dist/assets/RecipesPanel-DyqfWlaY.js +1 -0
- package/ui/dist/assets/{SecurityPanel-_gqMk8hJ.js → SecurityPanel-OMC-Tvbz.js} +1 -1
- package/ui/dist/assets/SelfImprovePanel-DXIfG_df.js +1 -0
- package/ui/dist/assets/{SelfProposalsPanel-DuA0zsGH.js → SelfProposalsPanel-CmgEz1TQ.js} +2 -2
- package/ui/dist/assets/SessionsPanel-gJXosEGf.js +1 -0
- package/ui/dist/assets/{SessionsTab-bFYaFvTZ.js → SessionsTab-BOVzzjTO.js} +1 -1
- package/ui/dist/assets/SettingsPanel-DifFGEvi.js +1 -0
- package/ui/dist/assets/SettingsView-BNpj0iym.js +2 -0
- package/ui/dist/assets/SkeletonLoader-CNSsfH3f.js +1 -0
- package/ui/dist/assets/{SkillsPanel-D08WcRGp.js → SkillsPanel-6fbRov-m.js} +1 -1
- package/ui/dist/assets/{SomaView-CYukE7Fp.js → SomaView-D3boPl5D.js} +1 -1
- package/ui/dist/assets/{StatCard-DT4Bx1mY.js → StatCard-2BmOlamJ.js} +1 -1
- package/ui/dist/assets/StatusBadge-CdVHF1nG.js +1 -0
- package/ui/dist/assets/Tabs-DW9ytf9H.js +1 -0
- package/ui/dist/assets/{TeamsPanel-DOBe72TK.js → TeamsPanel-CNaQ8Dbw.js} +1 -1
- package/ui/dist/assets/TelemetryPanel-DL81QlAW.js +1 -0
- package/ui/dist/assets/TitanCanvas-DLIN_wV3.js +1152 -0
- package/ui/dist/assets/ToolsView-BlChEE4n.js +2 -0
- package/ui/dist/assets/Tooltip-oR5JnwoN.js +6 -0
- package/ui/dist/assets/{TraceViewer-0bCz0x_a.js → TraceViewer-DtJXjCXV.js} +1 -1
- package/ui/dist/assets/TrainingPanel-4XMGaRN_.js +1 -0
- package/ui/dist/assets/{VoiceOverlay-B08Sw918.js → VoiceOverlay-B3fXJ-EC.js} +1 -1
- package/ui/dist/assets/{VramPanel-CJiic8y4.js → VramPanel-HisAYiqI.js} +1 -1
- package/ui/dist/assets/{WatchView-CaQMDEAy.js → WatchView-C92y0hU7.js} +1 -1
- package/ui/dist/assets/{WorkTab-D5bi2WRi.js → WorkTab-BYAWcvA1.js} +1 -1
- package/ui/dist/assets/{WorkflowsPanel-DdY6E93C.js → WorkflowsPanel-D2DiOBLA.js} +1 -1
- package/ui/dist/assets/{arrow-left-CHJyrO8S.js → arrow-left-thXQMJQ6.js} +1 -1
- package/ui/dist/assets/{briefcase-ROIEmiah.js → briefcase-ByMhDqlL.js} +1 -1
- package/ui/dist/assets/{chart-column-wFkjV3Ni.js → chart-column-CYHJVuxN.js} +1 -1
- package/ui/dist/assets/{check-BcOm5jPO.js → check-ChWLFWCx.js} +1 -1
- package/ui/dist/assets/{chevron-down-CM11GPpR.js → chevron-down-CU_O_5h3.js} +1 -1
- package/ui/dist/assets/{chevron-right-aFDDgFsL.js → chevron-right-DAiXsK24.js} +1 -1
- package/ui/dist/assets/{chevron-up-D6g7FB6i.js → chevron-up-BudRYwvy.js} +1 -1
- package/ui/dist/assets/{circle-check-big-DPz64kZW.js → circle-check-big-gkA-V2JW.js} +1 -1
- package/ui/dist/assets/{clock-BbCCaukN.js → clock-qO5kIED9.js} +1 -1
- package/ui/dist/assets/clsx-B-dksMZM.js +1 -0
- package/ui/dist/assets/{dollar-sign-Dy5-qkg3.js → dollar-sign-1gQNJK3V.js} +1 -1
- package/ui/dist/assets/{download-DjheLEns.js → download-DMD1m87c.js} +1 -1
- package/ui/dist/assets/{external-link-BgxGF7ZQ.js → external-link-ByafQkZ7.js} +1 -1
- package/ui/dist/assets/{folder-DY4eeMdo.js → folder-DeG4RuOD.js} +1 -1
- package/ui/dist/assets/{funnel-LWmcwhj-.js → funnel-wE8i5V9Y.js} +1 -1
- package/ui/dist/assets/{git-branch-CPZciK10.js → git-branch-BWSuK1LU.js} +1 -1
- package/ui/dist/assets/index-B8YEFBRH.js +277 -0
- package/ui/dist/assets/index-Cb5bSxRB.css +1 -0
- package/ui/dist/assets/{layers-Bn7bgu2Z.js → layers-tN-wIpE0.js} +1 -1
- package/ui/dist/assets/{legacy-BVPeht6t.js → legacy-BSZBdyop.js} +2 -2
- package/ui/dist/assets/{lightbulb-tzuCyEQk.js → lightbulb-TUHKCda3.js} +1 -1
- package/ui/dist/assets/{list-todo-say4NbSw.js → list-todo-DtxcUGz2.js} +1 -1
- package/ui/dist/assets/{missions-DbC8UmMc.js → missions-C3EC4uKT.js} +1 -1
- package/ui/dist/assets/{network-v9O7MmZT.js → network-ephW7nah.js} +1 -1
- package/ui/dist/assets/{pause-CZo33QlA.js → pause-DeggUVZc.js} +1 -1
- package/ui/dist/assets/{play-DbCJhc5H.js → play-Dfc0ia6v.js} +1 -1
- package/ui/dist/assets/{plug-CtpCZg2z.js → plug-Bl_6i_9u.js} +1 -1
- package/ui/dist/assets/{plus-O61rB_YF.js → plus-CQwCh7WY.js} +1 -1
- package/ui/dist/assets/{proxy-BAUTNyg6.js → proxy-BjQ4lsww.js} +1 -1
- package/ui/dist/assets/{rotate-ccw-n5WkWR51.js → rotate-ccw-CUuN2ebi.js} +1 -1
- package/ui/dist/assets/{save-D2Qh8KyN.js → save-PlTUvsN5.js} +1 -1
- package/ui/dist/assets/{search-C9SdcZJq.js → search-BHgLDT-j.js} +1 -1
- package/ui/dist/assets/{send-DZ_5M5QQ.js → send-pflQNBoT.js} +1 -1
- package/ui/dist/assets/{shield-check-DyP5PmaY.js → shield-check-CrD-s89i.js} +1 -1
- package/ui/dist/assets/{target-CWfn705s.js → target-D4oh8GME.js} +1 -1
- package/ui/dist/assets/{terminal-CdhfA0Kr.js → terminal-BvJZ1R3x.js} +1 -1
- package/ui/dist/assets/{toggle-right-CmYQLQRS.js → toggle-right-Dl7x_ed7.js} +1 -1
- package/ui/dist/assets/{trash-2-TQcEJEv4.js → trash-2-lPcFwnW5.js} +1 -1
- package/ui/dist/assets/{trending-up-Cw22bM4J.js → trending-up-DqUbZfDe.js} +1 -1
- package/ui/dist/assets/{trophy-DUF8Bcas.js → trophy-Dv6zFfKM.js} +1 -1
- package/ui/dist/assets/{users-BX_ZaByZ.js → users-NPyAWbs5.js} +1 -1
- package/ui/dist/assets/{wrench-Cfp7nYhG.js → wrench-BCKgeHj3.js} +1 -1
- package/ui/dist/index.html +2 -2
- package/ui/dist/sw.js +1 -1
- package/ui/dist/assets/BackupPanel-BNxMlNIP.js +0 -1
- package/ui/dist/assets/CPActivity-CjIgehOq.js +0 -1
- package/ui/dist/assets/CPAgentDetail-oaymYRNI.js +0 -1
- package/ui/dist/assets/CPAgents-CWQ6iJfO.js +0 -1
- package/ui/dist/assets/CPApprovals-DzATBhtM.js +0 -1
- package/ui/dist/assets/CPCosts-xVQR148_.js +0 -1
- package/ui/dist/assets/CPDashboard-Dt6Jr7Zw.js +0 -1
- package/ui/dist/assets/CPGoals-Bt1a3C9T.js +0 -1
- package/ui/dist/assets/CPIssueDetail-DHxqtiuh.js +0 -1
- package/ui/dist/assets/CPIssues-D0l3fgUs.js +0 -1
- package/ui/dist/assets/CPOrg-DQ3tbYld.js +0 -8
- package/ui/dist/assets/CPRuns-0vncicUW.js +0 -1
- package/ui/dist/assets/ChannelsPanel-CiJs4gyw.js +0 -1
- package/ui/dist/assets/FleetPanel-Bg-f3_ip.js +0 -1
- package/ui/dist/assets/InfraView-CHYaZqMK.js +0 -2
- package/ui/dist/assets/InlineEditableField-BOLRKQq1.js +0 -1
- package/ui/dist/assets/Input-4pNffAw-.js +0 -1
- package/ui/dist/assets/IntegrationsPanel-CFucvr-Q.js +0 -1
- package/ui/dist/assets/IntelligenceView-Dh-Wuf13.js +0 -2
- package/ui/dist/assets/LearningPanel-CtlougkF.js +0 -1
- package/ui/dist/assets/McpPanel-BobqpLsh.js +0 -1
- package/ui/dist/assets/MemoryWikiPanel-BfYksjoI.js +0 -11
- package/ui/dist/assets/MissionCanvas-0V_vtqiu.js +0 -50
- package/ui/dist/assets/MissionChat-9hGhc9Zw.js +0 -7
- package/ui/dist/assets/MissionLibrary-dFkT8pGp.js +0 -5
- package/ui/dist/assets/MissionStart-CZSEie0Q.js +0 -1
- package/ui/dist/assets/Modal-V2yNnkKk.js +0 -1
- package/ui/dist/assets/NvidiaPanel-qLJysI9M.js +0 -1
- package/ui/dist/assets/OverviewPanel-Be6LukJ_.js +0 -1
- package/ui/dist/assets/RecipesPanel-DDYOCx3w.js +0 -1
- package/ui/dist/assets/SelfImprovePanel-B8o_fO30.js +0 -1
- package/ui/dist/assets/SessionsPanel-DeCBkSgY.js +0 -1
- package/ui/dist/assets/SettingsPanel-BlsRDAt7.js +0 -1
- package/ui/dist/assets/SettingsView-Dsa7Zr4e.js +0 -2
- package/ui/dist/assets/SkeletonLoader-BkQoZllJ.js +0 -1
- package/ui/dist/assets/StatusBadge-BFEHCdgi.js +0 -1
- package/ui/dist/assets/Tabs-g2Gs9sK0.js +0 -1
- package/ui/dist/assets/TelemetryPanel-DXAGuV0R.js +0 -1
- package/ui/dist/assets/TitanCanvas-DCl3gxSl.js +0 -1072
- package/ui/dist/assets/ToolsView-CnUjq0Js.js +0 -2
- package/ui/dist/assets/Tooltip-DJ99YlFF.js +0 -6
- package/ui/dist/assets/TrainingPanel-BLf_KMaE.js +0 -1
- package/ui/dist/assets/eye-off-CYR4nH5I.js +0 -6
- package/ui/dist/assets/index-PwwKjgT3.css +0 -1
- package/ui/dist/assets/index-slWylU2o.js +0 -244
- package/ui/dist/assets/loader-circle-E8aLxmMz.js +0 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as t,
|
|
1
|
+
import{r as t,bc as d,j as e,bd as m,be as x}from"./index-B8YEFBRH.js";import{P as h}from"./PageHeader-CiuoyvDR.js";import{R as b}from"./terminal-BvJZ1R3x.js";import{C as f}from"./clock-qO5kIED9.js";import{T as g,a as p}from"./toggle-right-Dl7x_ed7.js";import{T as u}from"./trash-2-lPcFwnW5.js";import"./chevron-right-DAiXsK24.js";function k(){const[c,o]=t.useState([]),[r,l]=t.useState(!0),s=t.useCallback(async()=>{l(!0);try{const a=await d();o(a.jobs||[])}catch{}l(!1)},[]);t.useEffect(()=>{s()},[s]);const i=async a=>{try{await m(a),await s()}catch{}},n=async a=>{if(confirm("Delete this cron job?"))try{await x(a),await s()}catch{}};return e.jsxs("div",{className:"space-y-4",children:[e.jsx(h,{title:"Cron Scheduler",breadcrumbs:[{label:"Admin",href:"/overview"},{label:"System"},{label:"Cron"}]}),e.jsx("div",{className:"flex gap-2",children:e.jsxs("button",{onClick:s,disabled:r,className:"flex items-center gap-2 px-3 py-2 rounded-lg bg-[#27272a] text-[#a1a1aa] text-sm font-medium hover:bg-[#3f3f46] disabled:opacity-50",children:[e.jsx(b,{className:`w-4 h-4 ${r?"animate-spin":""}`})," Refresh"]})}),e.jsx("div",{className:"space-y-2",children:c.map(a=>e.jsxs("div",{className:"flex items-center justify-between p-3 rounded-lg bg-[#0a0a0f] border border-[#27272a]",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(f,{className:"w-4 h-4 text-[#6366f1]"}),e.jsxs("div",{children:[e.jsx("div",{className:"text-sm text-[#e4e4e7]",children:a.name}),e.jsxs("div",{className:"text-xs text-[#52525b]",children:[a.schedule," • ",a.command]})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{onClick:()=>i(a.id),className:"p-1.5 rounded-md bg-[#27272a] text-[#a1a1aa] hover:bg-[#3f3f46]",children:a.enabled?e.jsx(g,{className:"w-4 h-4 text-emerald-400"}):e.jsx(p,{className:"w-4 h-4 text-[#52525b]"})}),e.jsx("button",{onClick:()=>n(a.id),className:"p-1.5 rounded-md bg-[#27272a] text-[#a1a1aa] hover:bg-[#3f3f46] hover:text-red-400",children:e.jsx(u,{className:"w-3.5 h-3.5"})})]})]},a.id))})]})}export{k as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as e}from"./index-
|
|
1
|
+
import{j as e}from"./index-B8YEFBRH.js";function i({columns:s,data:d,onRowClick:a,emptyMessage:x="No data available"}){return e.jsx("div",{className:"overflow-hidden rounded-xl border border-border bg-bg-secondary",children:e.jsxs("table",{className:"w-full text-left text-sm",children:[e.jsx("thead",{children:e.jsx("tr",{className:"bg-bg-tertiary",children:s.map(t=>e.jsx("th",{className:`px-4 py-3 text-sm font-medium text-text-secondary ${t.className??""}`,children:t.header},t.key))})}),e.jsx("tbody",{children:d.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:s.length,className:"px-4 py-12 text-center text-text-muted",children:x})}):d.map((t,n)=>e.jsx("tr",{onClick:()=>a==null?void 0:a(t),className:`border-t border-border transition-colors hover:bg-bg-tertiary/50 ${a?"cursor-pointer":""}`,children:s.map(r=>e.jsx("td",{className:`px-4 py-3 text-text ${r.className??""}`,children:r.render?r.render(t):String(t[r.key]??"")},r.key))},n))})]})})}export{i as D};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as w,r,
|
|
1
|
+
import{c as w,r,ap as E,aq as L,ar as M,as as $,j as e,S as G,T as P}from"./index-B8YEFBRH.js";import{P as R}from"./PageHeader-CiuoyvDR.js";import{R as _}from"./terminal-BvJZ1R3x.js";import"./chevron-right-DAiXsK24.js";/**
|
|
2
2
|
* @license lucide-react v0.513.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as t}from"./index-
|
|
1
|
+
import{j as t}from"./index-B8YEFBRH.js";import{B as r}from"./Input-j10hONMY.js";function n({icon:s,title:x,description:m,action:e,className:a}){return t.jsxs("div",{className:`flex flex-col items-center justify-center py-16 text-center ${a??""}`,children:[s&&t.jsx("div",{className:"mb-4 text-text-muted opacity-50",children:s}),t.jsx("h3",{className:"text-sm font-medium text-text-secondary",children:x}),m&&t.jsx("p",{className:"mt-1 max-w-sm text-xs text-text-muted",children:m}),e&&t.jsx(r,{variant:"secondary",size:"sm",onClick:e.onClick,className:"mt-4",children:e.label})]})}export{n as E};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as S,r as p,j as e,
|
|
2
|
-
`)){const n=a.trim();if(!n||n.startsWith("#"))continue;const l=n.match(/^([a-zA-Z_:][a-zA-Z0-9_:]*)(?:\{([^}]*)\})?\s+([0-9eE+\-.NaN]+)/);if(!l)continue;const c={};if(l[2])for(const b of l[2].split(",")){const[u,...x]=b.split("=");if(!u)continue;const g=x.join("=").trim().replace(/^"|"$/g,"");c[u.trim()]=g}const r=Number(l[3]);Number.isNaN(r)||i.push({name:l[1],labels:c,value:r})}return i}async function q(s){const i=await S("/metrics");if(!i.ok)throw new Error(`/metrics failed: ${i.status}`);const a=await i.text(),n=W(a);return s?n.filter(l=>l.name===s||l.name.startsWith(`${s}_`)):n}const y={emerald:"bg-emerald-500/15 text-emerald-300 border-emerald-500/40",amber:"bg-amber-500/15 text-amber-300 border-amber-500/40",red:"bg-red-500/15 text-red-300 border-red-500/40",slate:"bg-slate-500/15 text-slate-300 border-slate-500/40"},J=[{id:"suites",label:"Suites",icon:F},{id:"memory",label:"Memory Regression",icon:_},{id:"redteam",label:"Red Team",icon:w},{id:"trends",label:"Trends",icon:P}];function ye(){const[s,i]=p.useState("suites"),[a,n]=p.useState([]),[l,c]=p.useState(!1),[r,b]=p.useState(null),u=p.useCallback(async()=>{c(!0);try{const t=await D();n(m=>{const h=new Map(m.map(f=>[f.name,f]));return t.map(f=>h.get(f)??{name:f,status:"idle"})})}catch(t){console.error("listEvalSuites failed:",t),n([])}finally{c(!1)}},[]);p.useEffect(()=>{u()},[u]);const x=p.useCallback(async t=>{n(m=>m.map(h=>h.name===t?{...h,status:"running",error:void 0}:h));try{const m=await U(t);n(h=>h.map(f=>f.name===t?{...f,status:"done",result:m}:f))}catch(m){n(h=>h.map(f=>f.name===t?{...f,status:"error",error:m.message}:f))}},[]),g=p.useCallback(async()=>{for(const t of a)await x(t.name)},[a,x]),v=a.reduce((t,m)=>{var h,f,k;return{total:t.total+(((h=m.result)==null?void 0:h.total)??0),passed:t.passed+(((f=m.result)==null?void 0:f.passed)??0),failed:t.failed+(((k=m.result)==null?void 0:k.failed)??0)}},{total:0,passed:0,failed:0}),j=O(v),o=N(j),d=a.some(t=>t.status==="running");return e.jsxs("div",{className:"flex h-full flex-col gap-4 p-4 text-slate-200",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("h2",{className:"text-lg font-semibold",children:"Eval Harness"}),e.jsx("div",{className:"flex items-center gap-1 rounded border border-slate-700 bg-slate-800/40 p-0.5",children:J.map(t=>{const m=t.icon,h=t.id===s;return e.jsxs("button",{onClick:()=>i(t.id),className:`flex items-center gap-1.5 rounded px-2.5 py-1 text-xs ${h?"bg-slate-700/80 text-slate-100":"text-slate-400 hover:bg-slate-700/30"}`,children:[e.jsx(m,{className:"h-3 w-3"}),t.label]},t.id)})}),s==="suites"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:u,disabled:l||d,className:"rounded border border-slate-700 bg-slate-800/40 p-1.5 hover:bg-slate-800 disabled:opacity-50",title:"Refresh suite list",children:e.jsx(E,{className:`h-3.5 w-3.5 ${l?"animate-spin":""}`})}),e.jsxs("button",{onClick:g,disabled:a.length===0||d,className:"ml-auto flex items-center gap-1.5 rounded border border-emerald-500/40 bg-emerald-500/10 px-3 py-1.5 text-sm text-emerald-300 hover:bg-emerald-500/20 disabled:opacity-50",children:[d?e.jsx(M,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(A,{className:"h-3.5 w-3.5"}),"Run all suites"]})]})]}),s==="suites"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:`flex items-center gap-3 rounded-lg border p-3 text-sm ${y[o]}`,children:[e.jsxs("div",{className:"font-medium",children:["Overall: ",v.passed,"/",v.total," passed",Number.isFinite(j)&&e.jsxs("span",{className:"ml-2 opacity-80",children:["(",j,"%)"]})]}),v.failed>0&&e.jsxs("div",{className:"ml-auto flex items-center gap-1",children:[e.jsx($,{className:"h-3.5 w-3.5"}),v.failed," failure",v.failed===1?"":"s"]})]}),e.jsxs("div",{className:"flex-1 space-y-2 overflow-auto",children:[a.length===0&&!l&&e.jsxs("div",{className:"rounded border border-slate-700 bg-slate-800/30 p-4 text-center text-sm text-slate-400",children:["No eval suites available. Verify ",e.jsx("code",{className:"font-mono text-xs",children:"/api/eval/suites"})," on the gateway."]}),a.map(t=>e.jsx(V,{suite:t,expanded:r===t.name,onToggle:()=>b(m=>m===t.name?null:t.name),onRun:()=>x(t.name)},t.name))]})]}),s==="memory"&&e.jsx(z,{suites:a,onRun:x}),s==="redteam"&&e.jsx(H,{suites:a,onRun:x}),s==="trends"&&e.jsx(K,{})]})}function z({suites:s,onRun:i}){const a=s.flatMap(l=>{var c;return(((c=l.result)==null?void 0:c.results)??[]).filter(r=>/memory|recall|stale|distract|context/i.test(r.name)).map(r=>({suite:l.name,case:r}))});if(a.length===0)return e.jsx("div",{className:"flex flex-1 items-center justify-center rounded border border-dashed border-slate-700 bg-slate-800/20 p-8 text-center",children:e.jsxs("div",{children:[e.jsx(_,{className:"mx-auto mb-2 h-6 w-6 text-slate-500"}),e.jsx("div",{className:"text-sm text-slate-300",children:"No memory regression results yet."}),e.jsxs("div",{className:"mt-1 text-xs text-slate-500",children:["Run a suite that contains memory cases (session, content). Multi-turn fact recall is asserted via tape replay in ",e.jsx("code",{className:"font-mono",children:"tests/eval/memory.test.ts"}),"."]}),e.jsxs("div",{className:"mt-3 flex justify-center gap-2",children:[e.jsx("button",{onClick:()=>i("session"),className:"rounded border border-emerald-500/40 bg-emerald-500/10 px-3 py-1 text-xs text-emerald-300 hover:bg-emerald-500/20",children:"Run session suite"}),e.jsx("button",{onClick:()=>i("content"),className:"rounded border border-emerald-500/40 bg-emerald-500/10 px-3 py-1 text-xs text-emerald-300 hover:bg-emerald-500/20",children:"Run content suite"})]})]})});const n=a.filter(l=>l.case.passed).length;return e.jsxs("div",{className:"flex flex-1 flex-col gap-3 overflow-auto",children:[e.jsx("div",{className:`rounded-lg border p-3 text-sm ${y[N(n/a.length*100)]}`,children:e.jsxs("div",{className:"font-medium",children:["Memory recall: ",n,"/",a.length," cases passed",e.jsxs("span",{className:"ml-2 opacity-80",children:["(",Math.round(n/a.length*100),"%)"]})]})}),e.jsx("div",{className:"space-y-1.5",children:a.map(l=>e.jsxs("div",{className:`rounded p-2 text-xs ${l.case.passed?"bg-slate-800/30":"bg-red-950/30"}`,children:[e.jsxs("div",{className:"flex items-center gap-2",children:[l.case.passed?e.jsx(R,{className:"h-3.5 w-3.5 text-emerald-400"}):e.jsx(C,{className:"h-3.5 w-3.5 text-red-400"}),e.jsx("div",{className:"font-mono text-slate-200",children:l.case.name}),e.jsx("div",{className:"ml-auto text-[10px] text-slate-500",children:l.suite})]}),!l.case.passed&&l.case.errors.length>0&&e.jsx("ul",{className:"mt-1 ml-5 list-disc text-red-300",children:l.case.errors.map((c,r)=>e.jsx("li",{children:c},r))})]},`${l.suite}/${l.case.name}`))})]})}const G=[{id:"ignore-prev",label:"Ignore-previous",pattern:/ignore.*(previous|prior)|disregard|forget/i},{id:"dan",label:"DAN / persona swap",pattern:/\bDAN\b|do anything|jailbreak/i},{id:"prompt-extract",label:"Prompt extraction",pattern:/system prompt|reveal|extract|leak/i},{id:"path-traversal",label:"Path traversal",pattern:/\.\.\/|\/etc\/passwd|path traversal/i},{id:"shell-inject",label:"Shell injection",pattern:/;.*rm|`whoami`|\$\(|\| ?bash/i},{id:"url-scheme",label:"URL scheme abuse",pattern:/file:\/\/|dict:\/\/|gopher:\/\//i},{id:"markdown-js",label:"Markdown JS link",pattern:/\[.*\]\(javascript:/i},{id:"other",label:"Other",pattern:/.*/}];function H({suites:s,onRun:i}){var c;const a=s.find(r=>r.name==="adversarial"),n=((c=a==null?void 0:a.result)==null?void 0:c.results)??[];if(n.length===0)return e.jsx("div",{className:"flex flex-1 items-center justify-center rounded border border-dashed border-slate-700 bg-slate-800/20 p-8 text-center",children:e.jsxs("div",{children:[e.jsx(w,{className:"mx-auto mb-2 h-6 w-6 text-slate-500"}),e.jsx("div",{className:"text-sm text-slate-300",children:"No red-team results yet."}),e.jsx("div",{className:"mt-1 text-xs text-slate-500",children:"Run the adversarial suite to populate this grid."}),e.jsx("button",{onClick:()=>i("adversarial"),className:"mt-3 rounded border border-red-500/40 bg-red-500/10 px-3 py-1 text-xs text-red-300 hover:bg-red-500/20",children:"Run adversarial suite"})]})});const l=G.map(r=>{const b=n.filter(x=>r.pattern.test(x.name)||r.pattern.test(x.content||"")),u=b.filter(x=>x.passed).length;return{vector:r,total:b.length,blocked:u,matched:b}}).filter(r=>r.total>0);return e.jsxs("div",{className:"flex flex-1 flex-col gap-3 overflow-auto",children:[e.jsx("div",{className:"text-xs text-slate-400",children:"Pass = attack BLOCKED (TITAN refused or sanitized). Fail = attack possibly EXPLOITED — investigate the case."}),e.jsx("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2 lg:grid-cols-3",children:l.map(r=>{const b=r.total>0?Math.round(r.blocked/r.total*100):0,u=N(b);return e.jsxs("div",{className:`rounded-lg border p-3 ${y[u]}`,children:[e.jsxs("div",{className:"flex items-center gap-2 text-sm font-medium",children:[e.jsx(w,{className:"h-3.5 w-3.5"}),r.vector.label]}),e.jsxs("div",{className:"mt-1 text-xs",children:[r.blocked,"/",r.total," blocked (",b,"%)"]}),e.jsxs("div",{className:"mt-2 space-y-1",children:[r.matched.slice(0,4).map(x=>e.jsxs("div",{className:"flex items-center gap-1.5 text-[11px]",children:[x.passed?e.jsx(R,{className:"h-2.5 w-2.5 text-emerald-400"}):e.jsx(C,{className:"h-2.5 w-2.5 text-red-400"}),e.jsx("span",{className:"font-mono",children:x.name})]},x.name)),r.matched.length>4&&e.jsxs("div",{className:"text-[10px] text-slate-500",children:["+ ",r.matched.length-4," more"]})]})]},r.vector.id)})})]})}function K(){const[s,i]=p.useState([]),[a,n]=p.useState(!1),[l,c]=p.useState(null),[r,b]=p.useState(null),u=p.useCallback(async()=>{n(!0),c(null);try{const o=await q("titan_eval");i(o),b(new Date)}catch(o){c(o.message)}finally{n(!1)}},[]);p.useEffect(()=>{u();const o=setInterval(u,3e4);return()=>clearInterval(o)},[u]);const x=p.useMemo(()=>s.filter(o=>o.name==="titan_eval_pass_rate"&&o.labels.suite).map(o=>({suite:o.labels.suite,rate:o.value})).sort((o,d)=>o.rate-d.rate),[s]),g=p.useMemo(()=>{const o=new Map;for(const d of s){if(!d.labels.suite)continue;const t=o.get(d.labels.suite)??{passed:0,failed:0,timeouts:0,errors:0};d.name==="titan_eval_cases_total"?d.labels.outcome==="passed"?t.passed=d.value:d.labels.outcome==="failed"&&(t.failed=d.value):d.name==="titan_eval_timeout_total"?t.timeouts+=d.value:d.name==="titan_eval_error_total"&&(t.errors+=d.value),o.set(d.labels.suite,t)}return o},[s]),v=p.useMemo(()=>{let o=0,d=0;for(const t of g.values())o+=t.timeouts,d+=t.errors;return{timeouts:o,errors:d}},[g]),j=100;return e.jsxs("div",{className:"flex flex-1 flex-col gap-3 overflow-auto",children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs text-slate-400",children:[e.jsxs("span",{children:["Live from ",e.jsx("code",{className:"font-mono",children:"/metrics"})," (titan_eval_* gauges + counters)."]}),e.jsx("span",{className:"ml-auto",children:r?`updated ${r.toLocaleTimeString()}`:""}),e.jsx("button",{onClick:u,disabled:a,className:"rounded border border-slate-700 bg-slate-800/40 p-1 hover:bg-slate-800 disabled:opacity-50",children:e.jsx(E,{className:`h-3 w-3 ${a?"animate-spin":""}`})})]}),(v.timeouts>0||v.errors>0)&&e.jsxs("div",{className:"flex items-center gap-2 rounded border border-amber-500/40 bg-amber-500/10 p-2 text-xs text-amber-300",children:[e.jsx($,{className:"h-3.5 w-3.5"}),e.jsx("span",{className:"font-medium",children:"Operational drift:"}),v.timeouts>0&&e.jsxs("span",{children:[e.jsx("strong",{children:v.timeouts})," timeout",v.timeouts===1?"":"s"]}),v.errors>0&&e.jsxs("span",{children:[e.jsx("strong",{children:v.errors})," error",v.errors===1?"":"s"]}),e.jsx("span",{className:"ml-auto opacity-70",children:"across all suites, lifetime totals from /metrics"})]}),l&&e.jsx("div",{className:"rounded border border-red-500/40 bg-red-500/10 p-2 text-xs text-red-300",children:l}),x.length===0&&!l&&e.jsxs("div",{className:"rounded border border-dashed border-slate-700 bg-slate-800/20 p-6 text-center text-sm text-slate-400",children:["No eval pass-rate metrics yet. Run a suite via the Suites tab to populate ",e.jsx("code",{className:"font-mono",children:"titan_eval_pass_rate"}),"."]}),e.jsx("div",{className:"space-y-1.5",children:x.map(({suite:o,rate:d})=>{const t=g.get(o),m=N(d),h=L[o]??o;return e.jsx("div",{className:`rounded border p-2 text-xs ${y[m]}`,children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-32 truncate font-medium text-slate-200",children:h}),e.jsx("div",{className:"relative h-4 flex-1 overflow-hidden rounded bg-slate-800/60",children:e.jsx("div",{className:`h-full ${m==="emerald"?"bg-emerald-500/60":m==="amber"?"bg-amber-500/60":m==="red"?"bg-red-500/60":"bg-slate-500/60"}`,style:{width:`${d/j*100}%`}})}),e.jsxs("div",{className:"w-16 text-right font-mono",children:[d,"%"]}),t&&e.jsxs("div",{className:"w-44 text-right text-[10px] text-slate-500",children:[t.passed,"/",t.passed+t.failed," ever",t.timeouts>0&&e.jsxs("span",{className:"ml-1 text-amber-400",children:["· ",t.timeouts," timeout",t.timeouts===1?"":"s"]}),t.errors>0&&e.jsxs("span",{className:"ml-1 text-red-400",children:["· ",t.errors," error",t.errors===1?"":"s"]})]})]})},o)})})]})}function V({suite:s,expanded:i,onToggle:a,onRun:n}){var b;const l=L[s.name]??s.name,c=s.result?O(s.result):NaN,r=N(c);return e.jsxs("div",{className:`rounded-lg border ${y[r]}`,children:[e.jsxs("div",{className:"flex items-center gap-3 p-3",children:[e.jsx("button",{onClick:a,disabled:!s.result,className:"text-slate-300 disabled:opacity-30","aria-label":i?"Collapse":"Expand",children:i?e.jsx(I,{className:"h-4 w-4"}):e.jsx(B,{className:"h-4 w-4"})}),e.jsx("div",{className:"font-medium text-slate-100",children:l}),e.jsx("div",{className:"text-xs text-slate-400",children:s.result?`${s.result.passed}/${s.result.total} (${c}%)`:s.status==="running"?"running…":s.status==="error"?`error: ${s.error}`:"idle"}),((b=s.result)==null?void 0:b.durationMs)!==void 0&&e.jsxs("div",{className:"text-xs text-slate-500",children:[(s.result.durationMs/1e3).toFixed(1),"s"]}),e.jsxs("button",{onClick:n,disabled:s.status==="running",className:"ml-auto flex items-center gap-1 rounded border border-slate-600 bg-slate-800/60 px-2 py-1 text-xs text-slate-200 hover:bg-slate-800 disabled:opacity-50",children:[s.status==="running"?e.jsx(M,{className:"h-3 w-3 animate-spin"}):e.jsx(A,{className:"h-3 w-3"}),"Run"]})]}),i&&s.result&&e.jsx("div",{className:"space-y-1.5 border-t border-slate-700/40 px-3 py-2",children:s.result.results.map(u=>e.jsx(X,{caseResult:u},u.name))})]})}function X({caseResult:s}){const i=s.expectedToolSequence!==void 0&&JSON.stringify(s.expectedToolSequence)!==JSON.stringify(s.toolsUsed);return e.jsxs("div",{className:`rounded p-2 text-xs ${s.passed?"bg-slate-800/30":"bg-red-950/30"}`,children:[e.jsxs("div",{className:"flex items-center gap-2",children:[s.passed?e.jsx(R,{className:"h-3.5 w-3.5 text-emerald-400"}):e.jsx(C,{className:"h-3.5 w-3.5 text-red-400"}),e.jsx("div",{className:"font-mono text-slate-200",children:s.name}),e.jsxs("div",{className:"ml-auto text-slate-500",children:[s.durationMs,"ms"]})]}),!s.passed&&s.errors.length>0&&e.jsx("ul",{className:"mt-1 ml-5 list-disc text-red-300",children:s.errors.map((a,n)=>e.jsx("li",{children:a},n))}),i&&e.jsxs("div",{className:"mt-2 ml-5 grid grid-cols-2 gap-2 rounded bg-slate-900/40 p-2",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"mb-1 flex items-center gap-1 text-slate-400",children:[e.jsx(T,{className:"h-3 w-3"})," expected"]}),(s.expectedToolSequence??[]).map((a,n)=>e.jsxs("div",{className:"font-mono text-emerald-300",children:[n+1,". ",a]},n))]}),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-1 flex items-center gap-1 text-slate-400",children:[e.jsx(T,{className:"h-3 w-3"})," actual"]}),s.toolsUsed.length===0&&e.jsx("div",{className:"italic text-slate-500",children:"(no tool calls)"}),s.toolsUsed.map((a,n)=>{var r;const c=((r=s.expectedToolSequence)==null?void 0:r[n])===a;return e.jsxs("div",{className:`font-mono ${c?"text-emerald-300":"text-red-300"}`,children:[n+1,". ",a]},n)})]})]})]})}export{ye as default};
|
|
1
|
+
import{b as S,r as p,j as e,bI as w,L as $,h as _,k as C}from"./index-B8YEFBRH.js";import{L as F}from"./layers-tN-wIpE0.js";import{a as E}from"./TitanCanvas-DLIN_wV3.js";import{T as I}from"./trending-up-DqUbZfDe.js";import{R as M}from"./terminal-BvJZ1R3x.js";import{P as A}from"./play-Dfc0ia6v.js";import{C as P}from"./chevron-down-CU_O_5h3.js";import{C as B}from"./chevron-right-DAiXsK24.js";import{C as R}from"./circle-check-big-gkA-V2JW.js";import{W as T}from"./wrench-BCKgeHj3.js";import"./chevron-up-BudRYwvy.js";import"./plus-CQwCh7WY.js";import"./users-NPyAWbs5.js";import"./network-ephW7nah.js";import"./save-PlTUvsN5.js";import"./rotate-ccw-CUuN2ebi.js";import"./search-BHgLDT-j.js";import"./send-pflQNBoT.js";import"./VoiceOverlay-B3fXJ-EC.js";import"./folder-DeG4RuOD.js";import"./clock-qO5kIED9.js";import"./check-ChWLFWCx.js";import"./shield-check-CrD-s89i.js";import"./external-link-ByafQkZ7.js";const L={"widget-creation":"Widget Creation",safety:"Safety","tool-routing":"Tool Routing","gate-format":"Gate Format",pipeline:"Pipeline Classification",adversarial:"Adversarial","tool-routing-v2":"Tool Routing v2",session:"Session Management","widget-v2":"Widget v2","gate-format-v2":"Gate Format v2",content:"Content Quality"};async function D(){const s=await S("/api/eval/suites");if(!s.ok)throw new Error(`/api/eval/suites failed: ${s.status}`);const i=await s.json();return Array.isArray(i.suites)?i.suites:[]}async function U(s){const i=await S("/api/eval/run",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({suite:s})});if(!i.ok){const a=await i.text().catch(()=>"");throw new Error(`/api/eval/run failed: ${i.status} ${a.slice(0,200)}`)}return i.json()}function O(s){return s.total?Math.round(s.passed/s.total*100):NaN}function N(s){return Number.isNaN(s)?"slate":s>=100?"emerald":s>=80?"amber":"red"}function W(s){const i=[];for(const a of s.split(`
|
|
2
|
+
`)){const n=a.trim();if(!n||n.startsWith("#"))continue;const l=n.match(/^([a-zA-Z_:][a-zA-Z0-9_:]*)(?:\{([^}]*)\})?\s+([0-9eE+\-.NaN]+)/);if(!l)continue;const c={};if(l[2])for(const f of l[2].split(",")){const[u,...x]=f.split("=");if(!u)continue;const g=x.join("=").trim().replace(/^"|"$/g,"");c[u.trim()]=g}const r=Number(l[3]);Number.isNaN(r)||i.push({name:l[1],labels:c,value:r})}return i}async function q(s){const i=await S("/metrics");if(!i.ok)throw new Error(`/metrics failed: ${i.status}`);const a=await i.text(),n=W(a);return s?n.filter(l=>l.name===s||l.name.startsWith(`${s}_`)):n}const y={emerald:"bg-emerald-500/15 text-emerald-300 border-emerald-500/40",amber:"bg-amber-500/15 text-amber-300 border-amber-500/40",red:"bg-red-500/15 text-red-300 border-red-500/40",slate:"bg-slate-500/15 text-slate-300 border-slate-500/40"},J=[{id:"suites",label:"Suites",icon:F},{id:"memory",label:"Memory Regression",icon:E},{id:"redteam",label:"Red Team",icon:w},{id:"trends",label:"Trends",icon:I}];function Ne(){const[s,i]=p.useState("suites"),[a,n]=p.useState([]),[l,c]=p.useState(!1),[r,f]=p.useState(null),u=p.useCallback(async()=>{c(!0);try{const t=await D();n(m=>{const h=new Map(m.map(b=>[b.name,b]));return t.map(b=>h.get(b)??{name:b,status:"idle"})})}catch(t){console.error("listEvalSuites failed:",t),n([])}finally{c(!1)}},[]);p.useEffect(()=>{u()},[u]);const x=p.useCallback(async t=>{n(m=>m.map(h=>h.name===t?{...h,status:"running",error:void 0}:h));try{const m=await U(t);n(h=>h.map(b=>b.name===t?{...b,status:"done",result:m}:b))}catch(m){n(h=>h.map(b=>b.name===t?{...b,status:"error",error:m.message}:b))}},[]),g=p.useCallback(async()=>{for(const t of a)await x(t.name)},[a,x]),v=a.reduce((t,m)=>{var h,b,k;return{total:t.total+(((h=m.result)==null?void 0:h.total)??0),passed:t.passed+(((b=m.result)==null?void 0:b.passed)??0),failed:t.failed+(((k=m.result)==null?void 0:k.failed)??0)}},{total:0,passed:0,failed:0}),j=O(v),o=N(j),d=a.some(t=>t.status==="running");return e.jsxs("div",{className:"flex h-full flex-col gap-4 p-4 text-slate-200",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("h2",{className:"text-lg font-semibold",children:"Eval Harness"}),e.jsx("div",{className:"flex items-center gap-1 rounded border border-slate-700 bg-slate-800/40 p-0.5",children:J.map(t=>{const m=t.icon,h=t.id===s;return e.jsxs("button",{onClick:()=>i(t.id),className:`flex items-center gap-1.5 rounded px-2.5 py-1 text-xs ${h?"bg-slate-700/80 text-slate-100":"text-slate-400 hover:bg-slate-700/30"}`,children:[e.jsx(m,{className:"h-3 w-3"}),t.label]},t.id)})}),s==="suites"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:u,disabled:l||d,className:"rounded border border-slate-700 bg-slate-800/40 p-1.5 hover:bg-slate-800 disabled:opacity-50",title:"Refresh suite list",children:e.jsx(M,{className:`h-3.5 w-3.5 ${l?"animate-spin":""}`})}),e.jsxs("button",{onClick:g,disabled:a.length===0||d,className:"ml-auto flex items-center gap-1.5 rounded border border-emerald-500/40 bg-emerald-500/10 px-3 py-1.5 text-sm text-emerald-300 hover:bg-emerald-500/20 disabled:opacity-50",children:[d?e.jsx($,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(A,{className:"h-3.5 w-3.5"}),"Run all suites"]})]})]}),s==="suites"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:`flex items-center gap-3 rounded-lg border p-3 text-sm ${y[o]}`,children:[e.jsxs("div",{className:"font-medium",children:["Overall: ",v.passed,"/",v.total," passed",Number.isFinite(j)&&e.jsxs("span",{className:"ml-2 opacity-80",children:["(",j,"%)"]})]}),v.failed>0&&e.jsxs("div",{className:"ml-auto flex items-center gap-1",children:[e.jsx(_,{className:"h-3.5 w-3.5"}),v.failed," failure",v.failed===1?"":"s"]})]}),e.jsxs("div",{className:"flex-1 space-y-2 overflow-auto",children:[a.length===0&&!l&&e.jsxs("div",{className:"rounded border border-slate-700 bg-slate-800/30 p-4 text-center text-sm text-slate-400",children:["No eval suites available. Verify ",e.jsx("code",{className:"font-mono text-xs",children:"/api/eval/suites"})," on the gateway."]}),a.map(t=>e.jsx(V,{suite:t,expanded:r===t.name,onToggle:()=>f(m=>m===t.name?null:t.name),onRun:()=>x(t.name)},t.name))]})]}),s==="memory"&&e.jsx(z,{suites:a,onRun:x}),s==="redteam"&&e.jsx(H,{suites:a,onRun:x}),s==="trends"&&e.jsx(K,{})]})}function z({suites:s,onRun:i}){const a=s.flatMap(l=>{var c;return(((c=l.result)==null?void 0:c.results)??[]).filter(r=>/memory|recall|stale|distract|context/i.test(r.name)).map(r=>({suite:l.name,case:r}))});if(a.length===0)return e.jsx("div",{className:"flex flex-1 items-center justify-center rounded border border-dashed border-slate-700 bg-slate-800/20 p-8 text-center",children:e.jsxs("div",{children:[e.jsx(E,{className:"mx-auto mb-2 h-6 w-6 text-slate-500"}),e.jsx("div",{className:"text-sm text-slate-300",children:"No memory regression results yet."}),e.jsxs("div",{className:"mt-1 text-xs text-slate-500",children:["Run a suite that contains memory cases (session, content). Multi-turn fact recall is asserted via tape replay in ",e.jsx("code",{className:"font-mono",children:"tests/eval/memory.test.ts"}),"."]}),e.jsxs("div",{className:"mt-3 flex justify-center gap-2",children:[e.jsx("button",{onClick:()=>i("session"),className:"rounded border border-emerald-500/40 bg-emerald-500/10 px-3 py-1 text-xs text-emerald-300 hover:bg-emerald-500/20",children:"Run session suite"}),e.jsx("button",{onClick:()=>i("content"),className:"rounded border border-emerald-500/40 bg-emerald-500/10 px-3 py-1 text-xs text-emerald-300 hover:bg-emerald-500/20",children:"Run content suite"})]})]})});const n=a.filter(l=>l.case.passed).length;return e.jsxs("div",{className:"flex flex-1 flex-col gap-3 overflow-auto",children:[e.jsx("div",{className:`rounded-lg border p-3 text-sm ${y[N(n/a.length*100)]}`,children:e.jsxs("div",{className:"font-medium",children:["Memory recall: ",n,"/",a.length," cases passed",e.jsxs("span",{className:"ml-2 opacity-80",children:["(",Math.round(n/a.length*100),"%)"]})]})}),e.jsx("div",{className:"space-y-1.5",children:a.map(l=>e.jsxs("div",{className:`rounded p-2 text-xs ${l.case.passed?"bg-slate-800/30":"bg-red-950/30"}`,children:[e.jsxs("div",{className:"flex items-center gap-2",children:[l.case.passed?e.jsx(R,{className:"h-3.5 w-3.5 text-emerald-400"}):e.jsx(C,{className:"h-3.5 w-3.5 text-red-400"}),e.jsx("div",{className:"font-mono text-slate-200",children:l.case.name}),e.jsx("div",{className:"ml-auto text-[10px] text-slate-500",children:l.suite})]}),!l.case.passed&&l.case.errors.length>0&&e.jsx("ul",{className:"mt-1 ml-5 list-disc text-red-300",children:l.case.errors.map((c,r)=>e.jsx("li",{children:c},r))})]},`${l.suite}/${l.case.name}`))})]})}const G=[{id:"ignore-prev",label:"Ignore-previous",pattern:/ignore.*(previous|prior)|disregard|forget/i},{id:"dan",label:"DAN / persona swap",pattern:/\bDAN\b|do anything|jailbreak/i},{id:"prompt-extract",label:"Prompt extraction",pattern:/system prompt|reveal|extract|leak/i},{id:"path-traversal",label:"Path traversal",pattern:/\.\.\/|\/etc\/passwd|path traversal/i},{id:"shell-inject",label:"Shell injection",pattern:/;.*rm|`whoami`|\$\(|\| ?bash/i},{id:"url-scheme",label:"URL scheme abuse",pattern:/file:\/\/|dict:\/\/|gopher:\/\//i},{id:"markdown-js",label:"Markdown JS link",pattern:/\[.*\]\(javascript:/i},{id:"other",label:"Other",pattern:/.*/}];function H({suites:s,onRun:i}){var c;const a=s.find(r=>r.name==="adversarial"),n=((c=a==null?void 0:a.result)==null?void 0:c.results)??[];if(n.length===0)return e.jsx("div",{className:"flex flex-1 items-center justify-center rounded border border-dashed border-slate-700 bg-slate-800/20 p-8 text-center",children:e.jsxs("div",{children:[e.jsx(w,{className:"mx-auto mb-2 h-6 w-6 text-slate-500"}),e.jsx("div",{className:"text-sm text-slate-300",children:"No red-team results yet."}),e.jsx("div",{className:"mt-1 text-xs text-slate-500",children:"Run the adversarial suite to populate this grid."}),e.jsx("button",{onClick:()=>i("adversarial"),className:"mt-3 rounded border border-red-500/40 bg-red-500/10 px-3 py-1 text-xs text-red-300 hover:bg-red-500/20",children:"Run adversarial suite"})]})});const l=G.map(r=>{const f=n.filter(x=>r.pattern.test(x.name)||r.pattern.test(x.content||"")),u=f.filter(x=>x.passed).length;return{vector:r,total:f.length,blocked:u,matched:f}}).filter(r=>r.total>0);return e.jsxs("div",{className:"flex flex-1 flex-col gap-3 overflow-auto",children:[e.jsx("div",{className:"text-xs text-slate-400",children:"Pass = attack BLOCKED (TITAN refused or sanitized). Fail = attack possibly EXPLOITED — investigate the case."}),e.jsx("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2 lg:grid-cols-3",children:l.map(r=>{const f=r.total>0?Math.round(r.blocked/r.total*100):0,u=N(f);return e.jsxs("div",{className:`rounded-lg border p-3 ${y[u]}`,children:[e.jsxs("div",{className:"flex items-center gap-2 text-sm font-medium",children:[e.jsx(w,{className:"h-3.5 w-3.5"}),r.vector.label]}),e.jsxs("div",{className:"mt-1 text-xs",children:[r.blocked,"/",r.total," blocked (",f,"%)"]}),e.jsxs("div",{className:"mt-2 space-y-1",children:[r.matched.slice(0,4).map(x=>e.jsxs("div",{className:"flex items-center gap-1.5 text-[11px]",children:[x.passed?e.jsx(R,{className:"h-2.5 w-2.5 text-emerald-400"}):e.jsx(C,{className:"h-2.5 w-2.5 text-red-400"}),e.jsx("span",{className:"font-mono",children:x.name})]},x.name)),r.matched.length>4&&e.jsxs("div",{className:"text-[10px] text-slate-500",children:["+ ",r.matched.length-4," more"]})]})]},r.vector.id)})})]})}function K(){const[s,i]=p.useState([]),[a,n]=p.useState(!1),[l,c]=p.useState(null),[r,f]=p.useState(null),u=p.useCallback(async()=>{n(!0),c(null);try{const o=await q("titan_eval");i(o),f(new Date)}catch(o){c(o.message)}finally{n(!1)}},[]);p.useEffect(()=>{u();const o=setInterval(u,3e4);return()=>clearInterval(o)},[u]);const x=p.useMemo(()=>s.filter(o=>o.name==="titan_eval_pass_rate"&&o.labels.suite).map(o=>({suite:o.labels.suite,rate:o.value})).sort((o,d)=>o.rate-d.rate),[s]),g=p.useMemo(()=>{const o=new Map;for(const d of s){if(!d.labels.suite)continue;const t=o.get(d.labels.suite)??{passed:0,failed:0,timeouts:0,errors:0};d.name==="titan_eval_cases_total"?d.labels.outcome==="passed"?t.passed=d.value:d.labels.outcome==="failed"&&(t.failed=d.value):d.name==="titan_eval_timeout_total"?t.timeouts+=d.value:d.name==="titan_eval_error_total"&&(t.errors+=d.value),o.set(d.labels.suite,t)}return o},[s]),v=p.useMemo(()=>{let o=0,d=0;for(const t of g.values())o+=t.timeouts,d+=t.errors;return{timeouts:o,errors:d}},[g]),j=100;return e.jsxs("div",{className:"flex flex-1 flex-col gap-3 overflow-auto",children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs text-slate-400",children:[e.jsxs("span",{children:["Live from ",e.jsx("code",{className:"font-mono",children:"/metrics"})," (titan_eval_* gauges + counters)."]}),e.jsx("span",{className:"ml-auto",children:r?`updated ${r.toLocaleTimeString()}`:""}),e.jsx("button",{onClick:u,disabled:a,className:"rounded border border-slate-700 bg-slate-800/40 p-1 hover:bg-slate-800 disabled:opacity-50",children:e.jsx(M,{className:`h-3 w-3 ${a?"animate-spin":""}`})})]}),(v.timeouts>0||v.errors>0)&&e.jsxs("div",{className:"flex items-center gap-2 rounded border border-amber-500/40 bg-amber-500/10 p-2 text-xs text-amber-300",children:[e.jsx(_,{className:"h-3.5 w-3.5"}),e.jsx("span",{className:"font-medium",children:"Operational drift:"}),v.timeouts>0&&e.jsxs("span",{children:[e.jsx("strong",{children:v.timeouts})," timeout",v.timeouts===1?"":"s"]}),v.errors>0&&e.jsxs("span",{children:[e.jsx("strong",{children:v.errors})," error",v.errors===1?"":"s"]}),e.jsx("span",{className:"ml-auto opacity-70",children:"across all suites, lifetime totals from /metrics"})]}),l&&e.jsx("div",{className:"rounded border border-red-500/40 bg-red-500/10 p-2 text-xs text-red-300",children:l}),x.length===0&&!l&&e.jsxs("div",{className:"rounded border border-dashed border-slate-700 bg-slate-800/20 p-6 text-center text-sm text-slate-400",children:["No eval pass-rate metrics yet. Run a suite via the Suites tab to populate ",e.jsx("code",{className:"font-mono",children:"titan_eval_pass_rate"}),"."]}),e.jsx("div",{className:"space-y-1.5",children:x.map(({suite:o,rate:d})=>{const t=g.get(o),m=N(d),h=L[o]??o;return e.jsx("div",{className:`rounded border p-2 text-xs ${y[m]}`,children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-32 truncate font-medium text-slate-200",children:h}),e.jsx("div",{className:"relative h-4 flex-1 overflow-hidden rounded bg-slate-800/60",children:e.jsx("div",{className:`h-full ${m==="emerald"?"bg-emerald-500/60":m==="amber"?"bg-amber-500/60":m==="red"?"bg-red-500/60":"bg-slate-500/60"}`,style:{width:`${d/j*100}%`}})}),e.jsxs("div",{className:"w-16 text-right font-mono",children:[d,"%"]}),t&&e.jsxs("div",{className:"w-44 text-right text-[10px] text-slate-500",children:[t.passed,"/",t.passed+t.failed," ever",t.timeouts>0&&e.jsxs("span",{className:"ml-1 text-amber-400",children:["· ",t.timeouts," timeout",t.timeouts===1?"":"s"]}),t.errors>0&&e.jsxs("span",{className:"ml-1 text-red-400",children:["· ",t.errors," error",t.errors===1?"":"s"]})]})]})},o)})})]})}function V({suite:s,expanded:i,onToggle:a,onRun:n}){var f;const l=L[s.name]??s.name,c=s.result?O(s.result):NaN,r=N(c);return e.jsxs("div",{className:`rounded-lg border ${y[r]}`,children:[e.jsxs("div",{className:"flex items-center gap-3 p-3",children:[e.jsx("button",{onClick:a,disabled:!s.result,className:"text-slate-300 disabled:opacity-30","aria-label":i?"Collapse":"Expand",children:i?e.jsx(P,{className:"h-4 w-4"}):e.jsx(B,{className:"h-4 w-4"})}),e.jsx("div",{className:"font-medium text-slate-100",children:l}),e.jsx("div",{className:"text-xs text-slate-400",children:s.result?`${s.result.passed}/${s.result.total} (${c}%)`:s.status==="running"?"running…":s.status==="error"?`error: ${s.error}`:"idle"}),((f=s.result)==null?void 0:f.durationMs)!==void 0&&e.jsxs("div",{className:"text-xs text-slate-500",children:[(s.result.durationMs/1e3).toFixed(1),"s"]}),e.jsxs("button",{onClick:n,disabled:s.status==="running",className:"ml-auto flex items-center gap-1 rounded border border-slate-600 bg-slate-800/60 px-2 py-1 text-xs text-slate-200 hover:bg-slate-800 disabled:opacity-50",children:[s.status==="running"?e.jsx($,{className:"h-3 w-3 animate-spin"}):e.jsx(A,{className:"h-3 w-3"}),"Run"]})]}),i&&s.result&&e.jsx("div",{className:"space-y-1.5 border-t border-slate-700/40 px-3 py-2",children:s.result.results.map(u=>e.jsx(X,{caseResult:u},u.name))})]})}function X({caseResult:s}){const i=s.expectedToolSequence!==void 0&&JSON.stringify(s.expectedToolSequence)!==JSON.stringify(s.toolsUsed);return e.jsxs("div",{className:`rounded p-2 text-xs ${s.passed?"bg-slate-800/30":"bg-red-950/30"}`,children:[e.jsxs("div",{className:"flex items-center gap-2",children:[s.passed?e.jsx(R,{className:"h-3.5 w-3.5 text-emerald-400"}):e.jsx(C,{className:"h-3.5 w-3.5 text-red-400"}),e.jsx("div",{className:"font-mono text-slate-200",children:s.name}),e.jsxs("div",{className:"ml-auto text-slate-500",children:[s.durationMs,"ms"]})]}),!s.passed&&s.errors.length>0&&e.jsx("ul",{className:"mt-1 ml-5 list-disc text-red-300",children:s.errors.map((a,n)=>e.jsx("li",{children:a},n))}),i&&e.jsxs("div",{className:"mt-2 ml-5 grid grid-cols-2 gap-2 rounded bg-slate-900/40 p-2",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"mb-1 flex items-center gap-1 text-slate-400",children:[e.jsx(T,{className:"h-3 w-3"})," expected"]}),(s.expectedToolSequence??[]).map((a,n)=>e.jsxs("div",{className:"font-mono text-emerald-300",children:[n+1,". ",a]},n))]}),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-1 flex items-center gap-1 text-slate-400",children:[e.jsx(T,{className:"h-3 w-3"})," actual"]}),s.toolsUsed.length===0&&e.jsx("div",{className:"italic text-slate-500",children:"(no tool calls)"}),s.toolsUsed.map((a,n)=>{var r;const c=((r=s.expectedToolSequence)==null?void 0:r[n])===a;return e.jsxs("div",{className:`font-mono ${c?"text-emerald-300":"text-red-300"}`,children:[n+1,". ",a]},n)})]})]})]})}export{Ne as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as a,
|
|
1
|
+
import{r as a,bm as u,bn as p,bo as j,j as e,h as N,T as v,bp as y}from"./index-B8YEFBRH.js";import{P as T}from"./PageHeader-CiuoyvDR.js";import{R as w}from"./terminal-BvJZ1R3x.js";import{P as k}from"./play-Dfc0ia6v.js";import"./chevron-right-DAiXsK24.js";function E(){const[t,x]=a.useState(null),[r,o]=a.useState([]),[i,b]=a.useState([]),[d,n]=a.useState(!0),[c,m]=a.useState(!1),l=a.useCallback(async()=>{n(!0);try{const[s,h,f]=await Promise.all([u(),p(),j()]);x(s),o(h.tests||[]),b(f.tests||[])}catch{}n(!1)},[]);a.useEffect(()=>{l()},[l]);const g=async()=>{m(!0);try{await y(),await l()}catch{}m(!1)};return e.jsxs("div",{className:"space-y-4",children:[e.jsx(T,{title:"Test Lab",breadcrumbs:[{label:"Admin",href:"/overview"},{label:"Quality"},{label:"Tests"}]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("button",{onClick:l,disabled:d,className:"flex items-center gap-2 px-3 py-2 rounded-lg bg-[#27272a] text-[#a1a1aa] text-sm font-medium hover:bg-[#3f3f46] disabled:opacity-50",children:[e.jsx(w,{className:`w-4 h-4 ${d?"animate-spin":""}`})," Refresh"]}),e.jsxs("button",{onClick:g,disabled:c,className:"flex items-center gap-2 px-3 py-2 rounded-lg bg-[#6366f1] text-white text-sm font-medium hover:bg-[#4f46e5] disabled:opacity-50",children:[e.jsx(k,{className:"w-4 h-4"})," ",c?"Running...":"Run Tests"]})]}),t&&e.jsxs("div",{className:"grid grid-cols-4 gap-2",children:[e.jsxs("div",{className:"p-2 rounded-lg bg-[#0a0a0f] border border-[#27272a]",children:[e.jsx("div",{className:"text-xs text-[#52525b]",children:"Total"}),e.jsx("div",{className:"text-sm font-semibold text-[#e4e4e7]",children:t.total})]}),e.jsxs("div",{className:"p-2 rounded-lg bg-[#0a0a0f] border border-[#27272a]",children:[e.jsx("div",{className:"text-xs text-[#52525b]",children:"Passing"}),e.jsx("div",{className:"text-sm font-semibold text-emerald-400",children:t.passing})]}),e.jsxs("div",{className:"p-2 rounded-lg bg-[#0a0a0f] border border-[#27272a]",children:[e.jsx("div",{className:"text-xs text-[#52525b]",children:"Failing"}),e.jsx("div",{className:"text-sm font-semibold text-red-400",children:t.failing})]}),e.jsxs("div",{className:"p-2 rounded-lg bg-[#0a0a0f] border border-[#27272a]",children:[e.jsx("div",{className:"text-xs text-[#52525b]",children:"Flaky"}),e.jsx("div",{className:"text-sm font-semibold text-amber-400",children:t.flaky})]})]}),r.length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"text-sm font-medium text-[#e4e4e7] flex items-center gap-2",children:[e.jsx(N,{className:"w-4 h-4 text-red-400"})," Failing Tests"]}),r.map(s=>e.jsxs("div",{className:"p-2 rounded-lg bg-red-950/20 border border-red-900/50",children:[e.jsx("div",{className:"text-xs text-[#e4e4e7]",children:s.name}),e.jsxs("div",{className:"text-xs text-[#52525b]",children:[s.suite," • ",s.error.slice(0,60)]})]},s.name))]}),i.length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"text-sm font-medium text-[#e4e4e7] flex items-center gap-2",children:[e.jsx(v,{className:"w-4 h-4 text-amber-400"})," Flaky Tests"]}),i.map(s=>e.jsxs("div",{className:"p-2 rounded-lg bg-amber-950/20 border border-amber-900/50",children:[e.jsx("div",{className:"text-xs text-[#e4e4e7]",children:s.name}),e.jsxs("div",{className:"text-xs text-[#52525b]",children:[s.suite," • ",s.passRate.toFixed(1),"% pass rate"]})]},s.name))]})]})}export{E as default};
|