@rigour-labs/cli 5.5.3 → 5.5.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rigour-labs/cli",
3
- "version": "5.5.3",
3
+ "version": "5.5.4",
4
4
  "description": "AI-native quality gates with local LLM analysis. Forces AI agents (Claude, Cursor, Copilot, Cline, Windsurf) to meet engineering standards. Bayesian Brain learns your codebase. Zero config: npx rigour-scan.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://rigour.run",
@@ -53,7 +53,7 @@
53
53
  "inquirer": "9.2.16",
54
54
  "ora": "^8.0.1",
55
55
  "yaml": "^2.8.2",
56
- "@rigour-labs/core": "5.5.3"
56
+ "@rigour-labs/core": "5.5.4"
57
57
  },
58
58
  "devDependencies": {
59
59
  "@types/fs-extra": "^11.0.4",
@@ -358,5 +358,5 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
358
358
  `},th=f2(v2)(ey),y2={config:p2},g2=function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return function(s){return n.reduceRight(function(o,a){return a(o)},s)}};function ty(e,t){return Object.keys(t).forEach(function(n){t[n]instanceof Object&&e[n]&&Object.assign(t[n],ty(e[n],t[n]))}),Zf(Zf({},e),t)}var x2={type:"cancelation",msg:"operation is manually canceled"};function wa(e){var t=!1,n=new Promise(function(r,s){e.then(function(o){return t?s(x2):r(o)}),e.catch(s)});return n.cancel=function(){return t=!0},n}var j2=["monaco"],w2=u2.create({config:d2,isInitialized:!1,resolve:null,reject:null,monaco:null}),ny=KS(w2,2),Us=ny[0],zo=ny[1];function S2(e){var t=y2.config(e),n=t.monaco,r=HS(t,j2);zo(function(s){return{config:ty(s.config,r),monaco:n}})}function k2(){var e=Us(function(t){var n=t.monaco,r=t.isInitialized,s=t.resolve;return{monaco:n,isInitialized:r,resolve:s}});if(!e.isInitialized){if(zo({isInitialized:!0}),e.monaco)return e.resolve(e.monaco),wa(Sa);if(window.monaco&&window.monaco.editor)return ry(window.monaco),e.resolve(window.monaco),wa(Sa);g2(N2,T2)(P2)}return wa(Sa)}function N2(e){return document.body.appendChild(e)}function C2(e){var t=document.createElement("script");return e&&(t.src=e),t}function T2(e){var t=Us(function(r){var s=r.config,o=r.reject;return{config:s,reject:o}}),n=C2("".concat(t.config.paths.vs,"/loader.js"));return n.onload=function(){return e()},n.onerror=t.reject,n}function P2(){var e=Us(function(n){var r=n.config,s=n.resolve,o=n.reject;return{config:r,resolve:s,reject:o}}),t=window.require;t.config(e.config),t(["vs/editor/editor.main"],function(n){var r=n.m||n;ry(r),e.resolve(r)},function(n){e.reject(n)})}function ry(e){Us().monaco||zo({monaco:e})}function E2(){return Us(function(e){var t=e.monaco;return t})}var Sa=new Promise(function(e,t){return zo({resolve:e,reject:t})}),sy={config:S2,init:k2,__getMonacoInstance:E2},M2={wrapper:{display:"flex",position:"relative",textAlign:"initial"},fullWidth:{width:"100%"},hide:{display:"none"}},ka=M2,A2={container:{display:"flex",height:"100%",width:"100%",justifyContent:"center",alignItems:"center"}},R2=A2;function D2({children:e}){return Ue.createElement("div",{style:R2.container},e)}var _2=D2,L2=_2;function z2({width:e,height:t,isEditorReady:n,loading:r,_ref:s,className:o,wrapperProps:a}){return Ue.createElement("section",{style:{...ka.wrapper,width:e,height:t},...a},!n&&Ue.createElement(L2,null,r),Ue.createElement("div",{ref:s,style:{...ka.fullWidth,...!n&&ka.hide},className:o}))}var V2=z2,iy=w.memo(V2);function O2(e){w.useEffect(e,[])}var oy=O2;function F2(e,t,n=!0){let r=w.useRef(!0);w.useEffect(r.current||!n?()=>{r.current=!1}:e,t)}var Be=F2;function os(){}function nr(e,t,n,r){return I2(e,r)||b2(e,t,n,r)}function I2(e,t){return e.editor.getModel(ay(e,t))}function b2(e,t,n,r){return e.editor.createModel(t,n,r?ay(e,r):void 0)}function ay(e,t){return e.Uri.parse(t)}function $2({original:e,modified:t,language:n,originalLanguage:r,modifiedLanguage:s,originalModelPath:o,modifiedModelPath:a,keepCurrentOriginalModel:l=!1,keepCurrentModifiedModel:c=!1,theme:u="light",loading:d="Loading...",options:f={},height:h="100%",width:y="100%",className:g,wrapperProps:x={},beforeMount:C=os,onMount:m=os}){let[p,v]=w.useState(!1),[S,j]=w.useState(!0),k=w.useRef(null),N=w.useRef(null),T=w.useRef(null),R=w.useRef(m),P=w.useRef(C),$=w.useRef(!1);oy(()=>{let L=sy.init();return L.then(B=>(N.current=B)&&j(!1)).catch(B=>(B==null?void 0:B.type)!=="cancelation"&&console.error("Monaco initialization: error:",B)),()=>k.current?he():L.cancel()}),Be(()=>{if(k.current&&N.current){let L=k.current.getOriginalEditor(),B=nr(N.current,e||"",r||n||"text",o||"");B!==L.getModel()&&L.setModel(B)}},[o],p),Be(()=>{if(k.current&&N.current){let L=k.current.getModifiedEditor(),B=nr(N.current,t||"",s||n||"text",a||"");B!==L.getModel()&&L.setModel(B)}},[a],p),Be(()=>{let L=k.current.getModifiedEditor();L.getOption(N.current.editor.EditorOption.readOnly)?L.setValue(t||""):t!==L.getValue()&&(L.executeEdits("",[{range:L.getModel().getFullModelRange(),text:t||"",forceMoveMarkers:!0}]),L.pushUndoStop())},[t],p),Be(()=>{var L,B;(B=(L=k.current)==null?void 0:L.getModel())==null||B.original.setValue(e||"")},[e],p),Be(()=>{let{original:L,modified:B}=k.current.getModel();N.current.editor.setModelLanguage(L,r||n||"text"),N.current.editor.setModelLanguage(B,s||n||"text")},[n,r,s],p),Be(()=>{var L;(L=N.current)==null||L.editor.setTheme(u)},[u],p),Be(()=>{var L;(L=k.current)==null||L.updateOptions(f)},[f],p);let I=w.useCallback(()=>{var H;if(!N.current)return;P.current(N.current);let L=nr(N.current,e||"",r||n||"text",o||""),B=nr(N.current,t||"",s||n||"text",a||"");(H=k.current)==null||H.setModel({original:L,modified:B})},[n,t,s,e,r,o,a]),Q=w.useCallback(()=>{var L;!$.current&&T.current&&(k.current=N.current.editor.createDiffEditor(T.current,{automaticLayout:!0,...f}),I(),(L=N.current)==null||L.editor.setTheme(u),v(!0),$.current=!0)},[f,u,I]);w.useEffect(()=>{p&&R.current(k.current,N.current)},[p]),w.useEffect(()=>{!S&&!p&&Q()},[S,p,Q]);function he(){var B,H,A,z;let L=(B=k.current)==null?void 0:B.getModel();l||((H=L==null?void 0:L.original)==null||H.dispose()),c||((A=L==null?void 0:L.modified)==null||A.dispose()),(z=k.current)==null||z.dispose()}return Ue.createElement(iy,{width:y,height:h,isEditorReady:p,loading:d,_ref:T,className:g,wrapperProps:x})}var B2=$2,U2=w.memo(B2);function H2(e){let t=w.useRef();return w.useEffect(()=>{t.current=e},[e]),t.current}var W2=H2,fi=new Map;function K2({defaultValue:e,defaultLanguage:t,defaultPath:n,value:r,language:s,path:o,theme:a="light",line:l,loading:c="Loading...",options:u={},overrideServices:d={},saveViewState:f=!0,keepCurrentModel:h=!1,width:y="100%",height:g="100%",className:x,wrapperProps:C={},beforeMount:m=os,onMount:p=os,onChange:v,onValidate:S=os}){let[j,k]=w.useState(!1),[N,T]=w.useState(!0),R=w.useRef(null),P=w.useRef(null),$=w.useRef(null),I=w.useRef(p),Q=w.useRef(m),he=w.useRef(),L=w.useRef(r),B=W2(o),H=w.useRef(!1),A=w.useRef(!1);oy(()=>{let _=sy.init();return _.then(E=>(R.current=E)&&T(!1)).catch(E=>(E==null?void 0:E.type)!=="cancelation"&&console.error("Monaco initialization: error:",E)),()=>P.current?V():_.cancel()}),Be(()=>{var E,b,G,ae;let _=nr(R.current,e||r||"",t||s||"",o||n||"");_!==((E=P.current)==null?void 0:E.getModel())&&(f&&fi.set(B,(b=P.current)==null?void 0:b.saveViewState()),(G=P.current)==null||G.setModel(_),f&&((ae=P.current)==null||ae.restoreViewState(fi.get(o))))},[o],j),Be(()=>{var _;(_=P.current)==null||_.updateOptions(u)},[u],j),Be(()=>{!P.current||r===void 0||(P.current.getOption(R.current.editor.EditorOption.readOnly)?P.current.setValue(r):r!==P.current.getValue()&&(A.current=!0,P.current.executeEdits("",[{range:P.current.getModel().getFullModelRange(),text:r,forceMoveMarkers:!0}]),P.current.pushUndoStop(),A.current=!1))},[r],j),Be(()=>{var E,b;let _=(E=P.current)==null?void 0:E.getModel();_&&s&&((b=R.current)==null||b.editor.setModelLanguage(_,s))},[s],j),Be(()=>{var _;l!==void 0&&((_=P.current)==null||_.revealLine(l))},[l],j),Be(()=>{var _;(_=R.current)==null||_.editor.setTheme(a)},[a],j);let z=w.useCallback(()=>{var _;if(!(!$.current||!R.current)&&!H.current){Q.current(R.current);let E=o||n,b=nr(R.current,r||e||"",t||s||"",E||"");P.current=(_=R.current)==null?void 0:_.editor.create($.current,{model:b,automaticLayout:!0,...u},d),f&&P.current.restoreViewState(fi.get(E)),R.current.editor.setTheme(a),l!==void 0&&P.current.revealLine(l),k(!0),H.current=!0}},[e,t,n,r,s,o,u,d,f,a,l]);w.useEffect(()=>{j&&I.current(P.current,R.current)},[j]),w.useEffect(()=>{!N&&!j&&z()},[N,j,z]),L.current=r,w.useEffect(()=>{var _,E;j&&v&&((_=he.current)==null||_.dispose(),he.current=(E=P.current)==null?void 0:E.onDidChangeModelContent(b=>{A.current||v(P.current.getValue(),b)}))},[j,v]),w.useEffect(()=>{if(j){let _=R.current.editor.onDidChangeMarkers(E=>{var G;let b=(G=P.current.getModel())==null?void 0:G.uri;if(b&&E.find(ae=>ae.path===b.path)){let ae=R.current.editor.getModelMarkers({resource:b});S==null||S(ae)}});return()=>{_==null||_.dispose()}}return()=>{}},[j,S]);function V(){var _,E;(_=he.current)==null||_.dispose(),h?f&&fi.set(o,P.current.saveViewState()):(E=P.current.getModel())==null||E.dispose(),P.current.dispose()}return Ue.createElement(iy,{width:y,height:g,isEditorReady:j,loading:c,_ref:$,className:x,wrapperProps:C})}var G2=K2,q2=w.memo(G2);const Q2=e=>{var r;const t=(r=e.split(".").pop())==null?void 0:r.toLowerCase();return{ts:"typescript",tsx:"typescript",js:"javascript",jsx:"javascript",py:"python",rb:"ruby",rs:"rust",go:"go",json:"json",yaml:"yaml",yml:"yaml",md:"markdown",css:"css",scss:"scss",html:"html",xml:"xml",sql:"sql",sh:"shell",bash:"shell",zsh:"shell"}[t||""]||"plaintext"},Y2=new Set(["txt","log","env"]);function X2(e){var n;const t=((n=e.split(".").pop())==null?void 0:n.toLowerCase())||"";return Y2.has(t)}const Z2=({filename:e,originalCode:t,modifiedCode:n,onClose:r,theme:s="dark",violations:o=[]})=>{const a=t!==n,l=Q2(e),c=s==="dark"?"vs-dark":"light",u=X2(e)&&!a,d=f=>{if(!o.length||!f)return;const h=window.monaco;if(!h)return;const y=o.filter(g=>g.line).map(g=>({range:new h.Range(g.line,1,g.endLine||g.line,1),options:{isWholeLine:!0,className:"violation-line-highlight",glyphMarginClassName:"violation-glyph",glyphMarginHoverMessage:{value:`**[${g.id}] ${g.title}**
359
359
 
360
360
  ${g.details}`},overviewRuler:{color:"#f87171",position:h.editor.OverviewRulerLane.Full}}}));f.deltaDecorations([],y)};return i.jsx("div",{className:"diff-viewer-overlay",children:i.jsxs("div",{className:"diff-viewer-window",children:[i.jsxs("div",{className:"diff-viewer-header",children:[i.jsxs("div",{className:"title",children:[i.jsx(wt,{size:18}),i.jsx("span",{children:e}),a&&i.jsx("span",{className:"diff-badge",children:"Modified"}),o.length>0&&i.jsxs("span",{className:"diff-badge",style:{background:"rgba(248, 113, 113, 0.12)",color:"#f87171",borderColor:"rgba(248, 113, 113, 0.3)"},children:[o.length," violation",o.length!==1?"s":""]})]}),i.jsx("button",{onClick:r,className:"close-btn",children:i.jsx(_c,{size:20})})]}),u?i.jsx("pre",{className:"markdown-viewer",children:n}):i.jsx("div",{className:"diff-editor-container",children:a?i.jsx(U2,{height:"100%",language:l,original:t,modified:n,theme:c,options:{renderSideBySide:!0,readOnly:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:13}}):i.jsx(q2,{height:"100%",language:l,value:n,theme:c,onMount:d,options:{readOnly:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,fontSize:13,lineNumbers:"on",glyphMargin:o.length>0}})})]})})},J2=(e,t)=>{const n=[];e.forEach(s=>{const o=s.split("/");let a=n,l="";o.forEach((c,u)=>{l=l?`${l}/${c}`:c;const d=u<o.length-1;let f=a.find(h=>h.name===c);f||(f={name:c,path:l,isDirectory:d,children:[],isViolated:t.some(h=>h===l||h.startsWith(`${l}/`))},a.push(f)),a=f.children})});const r=s=>{s.sort((o,a)=>o.isDirectory&&!a.isDirectory?-1:!o.isDirectory&&a.isDirectory?1:o.name.localeCompare(a.name)),s.forEach(o=>r(o.children))};return r(n),n},ly=({node:e,level:t,onSelect:n,activeFile:r})=>{const[s,o]=w.useState(t===0),a=r===e.path,l=c=>{c.stopPropagation(),e.isDirectory?o(!s):n(e.path)};return i.jsxs("div",{className:"tree-node-container",children:[i.jsxs("div",{className:`tree-item ${a?"active":""} ${e.isViolated?"violated":""}`,style:{paddingLeft:`${t*12+8}px`},onClick:l,children:[e.isDirectory?i.jsxs(i.Fragment,{children:[s?i.jsx(yr,{size:14,className:"chevron"}):i.jsx(cn,{size:14,className:"chevron"}),s?i.jsx(tx,{size:14,className:"folder-icon"}):i.jsx(Fs,{size:14,className:"folder-icon"})]}):i.jsx(wt,{size:14,className:"file-icon"}),i.jsx("span",{className:"node-name",title:e.path,children:e.name}),e.isViolated&&i.jsx(Ns,{size:12,className:"violation-icon"})]}),e.isDirectory&&s&&i.jsx("div",{className:"tree-children",children:e.children.map(c=>i.jsx(ly,{node:c,level:t+1,onSelect:n,activeFile:r},c.path))})]})},nh=({files:e,onSelect:t,activeFile:n,violatedFiles:r=[]})=>{const s=w.useMemo(()=>J2(e,r),[e,r]);return i.jsxs("div",{className:"file-tree",children:[i.jsxs("div",{className:"tree-header",children:[i.jsx(Fs,{size:14}),i.jsx("span",{children:"Project Explorer"})]}),i.jsx("div",{className:"tree-list",children:s.length===0?i.jsx("div",{className:"empty-tree-state",children:"No files found"}):s.map(o=>i.jsx(ly,{node:o,level:0,onSelect:t,activeFile:n},o.path))})]})},Na=e=>typeof e=="string"?e:JSON.stringify(e,null,2),ek=()=>{const[e,t]=w.useState({memories:{}}),[n,r]=w.useState(null),[s,o]=w.useState(""),[a,l]=w.useState(!0),[c,u]=w.useState(!1),d=async()=>{l(!0);try{const v=await(await fetch("/api/memory")).json();v.memories?t(v):t({memories:v})}catch(p){console.error("Failed to fetch memory:",p)}finally{l(!1)}};w.useEffect(()=>{d()},[]);const f=Object.entries(e.memories||{}),h=f.filter(([p])=>p.toLowerCase().includes(s.toLowerCase())),y=n?e.memories[n]:null,g=p=>{try{return new Date(p).toLocaleString()}catch{return p}},x=()=>{y&&(navigator.clipboard.writeText(Na(y.value)),u(!0),setTimeout(()=>u(!1),2e3))},C=p=>{const v=Na(p);if(v.includes("1)")&&v.includes("2)")){const S=v.split(/(\d+\))/);return i.jsx("div",{className:"formatted-content",children:S.map((j,k)=>{if(/^\d+\)$/.test(j))return i.jsx("div",{className:"section-marker",children:j},k);if(j.trim().startsWith("Priority:")){const[N,T]=j.split("Priority:");return i.jsxs(Ue.Fragment,{children:[N.trim()&&i.jsx("div",{className:"section-body",children:N.trim()}),i.jsx("div",{className:"priority-box",children:T.trim()})]},k)}return j.trim()?i.jsx("div",{className:"section-body",children:j.trim()},k):null})})}return i.jsx("pre",{children:v})},m=p=>{const v=p.toLowerCase();return v.includes("own")||v.includes("boundary")?"ownership":v.includes("except")||v.includes("allow")?"exception":v.includes("arch")||v.includes("decision")||v.includes("migrat")?"architecture":"stable"};return i.jsxs("div",{className:"memory-bank",children:[i.jsxs("div",{className:"memory-header",children:[i.jsxs("div",{className:"memory-title",children:[i.jsx(at,{size:24}),i.jsx("h2",{children:"Memory Bank"}),i.jsxs("span",{className:"memory-count",children:[f.length," entries"]})]}),i.jsxs("div",{className:"memory-actions",children:[i.jsxs("div",{className:"search-box",children:[i.jsx(Rc,{size:16}),i.jsx("input",{type:"text",placeholder:"Search memories...",value:s,onChange:p=>o(p.target.value)})]}),i.jsx("button",{className:"refresh-btn",onClick:d,disabled:a,children:i.jsx(qe,{size:16,className:a?"spinning":""})})]})]}),i.jsxs("div",{className:"memory-content",children:[i.jsx("div",{className:"memory-list",children:a?i.jsx("div",{className:"memory-loading",children:"Loading memories..."}):h.length===0?i.jsxs("div",{className:"memory-empty glass-card",children:[i.jsx(Os,{size:48}),i.jsx("h3",{children:"No Memories Stored"}),i.jsxs("p",{children:["Persist stable, non-derivable facts with ",i.jsx("code",{children:"rigour_remember"})," — architecture decisions, ownership boundaries, approved exceptions. Studio merges project"," ",i.jsx("code",{children:".rigour/memory.json"})," and global ",i.jsx("code",{children:"~/.rigour/memory.json"}),"."]})]}):h.map(([p,v])=>i.jsxs("div",{className:`memory-item glass-card ${n===p?"active":""}`,onClick:()=>r(p),children:[i.jsxs("div",{className:"memory-item-header",children:[i.jsx(_d,{size:14}),i.jsx("span",{className:"memory-key",children:p}),i.jsx("span",{className:`memory-cat cat-${m(p)}`,children:m(p)}),i.jsx(cn,{size:14,className:"chevron"})]}),i.jsxs("div",{className:"memory-item-meta",children:[i.jsx(gr,{size:12}),i.jsx("span",{children:g(v.timestamp)}),v.source&&i.jsx("span",{className:"meta-chip",children:v.source})]}),i.jsx("div",{className:"memory-item-preview",children:(()=>{const S=Na(v.value);return S.slice(0,100)+(S.length>100?"...":"")})()})]},p))}),i.jsx("div",{className:"memory-detail",children:y?i.jsxs(i.Fragment,{children:[i.jsxs("div",{className:"detail-header",children:[i.jsx(_d,{size:18}),i.jsx("h3",{children:n})]}),i.jsxs("div",{className:"detail-meta",children:[i.jsxs("div",{className:"meta-left",children:[i.jsx(gr,{size:14}),i.jsxs("span",{children:["Stored: ",g(y.timestamp)]})]}),i.jsxs("button",{className:`copy-btn ${c?"copied":""}`,onClick:x,children:[c?i.jsx(q0,{size:14}):i.jsx(Y0,{size:14}),i.jsx("span",{children:c?"Copied":"Copy"})]})]}),i.jsx("div",{className:"detail-content",children:C(y.value)})]}):i.jsxs("div",{className:"detail-placeholder",children:[i.jsx(at,{size:48}),i.jsx("p",{children:"Select a memory to view its contents"})]})})]})]})},tk=()=>{var j;const[e,t]=w.useState({patterns:[],stats:{totalPatterns:0,totalFiles:0,byType:{}}}),[n,r]=w.useState(null),[s,o]=w.useState(""),[a,l]=w.useState("all"),[c,u]=w.useState(!0),[d,f]=w.useState(!1),[h,y]=w.useState([]),[g,x]=w.useState(!1),C=async()=>{u(!0);try{const N=await(await fetch("/api/index-stats")).json();t(N)}catch(k){console.error("Failed to fetch pattern index:",k)}finally{u(!1)}};w.useEffect(()=>{C()},[]),w.useEffect(()=>{if(!d||s.length<3){y([]);return}const k=setTimeout(async()=>{x(!0);try{const T=await(await fetch(`/api/index-search?q=${encodeURIComponent(s)}`)).json();y(T)}catch(N){console.error("Semantic search failed:",N)}finally{x(!1)}},500);return()=>clearTimeout(k)},[s,d]);const m=d&&s.length>=3?h:e.patterns||[],p=e.stats||{totalPatterns:0,totalFiles:0,byType:{}},v=d&&s.length>=3?m:m.filter(k=>{const N=k.name.toLowerCase().includes(s.toLowerCase())||k.file.toLowerCase().includes(s.toLowerCase()),T=a==="all"||k.type===a;return N&&T}),S=Object.keys(p.byType||{});return i.jsxs("div",{className:"pattern-index",children:[i.jsxs("div",{className:"pattern-header",children:[i.jsxs("div",{className:"pattern-title",children:[i.jsx(sn,{size:24}),i.jsx("h2",{children:"Pattern Index"}),i.jsxs("span",{className:"pattern-count",children:[p.totalPatterns," patterns"]})]}),i.jsxs("div",{className:"pattern-actions",children:[i.jsxs("div",{className:"search-box",children:[i.jsx(Rc,{size:16}),i.jsx("input",{type:"text",placeholder:"Search patterns...",value:s,onChange:k=>o(k.target.value)})]}),i.jsxs("div",{className:"filter-box",children:[i.jsx(Ac,{size:16}),i.jsxs("select",{value:a,onChange:k=>l(k.target.value),children:[i.jsx("option",{value:"all",children:"All Types"}),S.map(k=>i.jsxs("option",{value:k,children:[k," (",p.byType[k],")"]},k))]})]}),i.jsxs("button",{className:`semantic-toggle ${d?"active":""}`,onClick:()=>f(!d),title:"Semantic Search (v2)",children:[i.jsx(Dd,{size:16}),i.jsx("span",{children:"AI Search"})]}),i.jsx("button",{className:"refresh-btn",onClick:C,disabled:c,children:i.jsx(qe,{size:16,className:c?"spinning":""})})]})]}),i.jsxs("div",{className:"pattern-stats",children:[i.jsxs("div",{className:"stat-card",children:[i.jsx(gm,{size:20}),i.jsxs("div",{className:"stat-info",children:[i.jsx("span",{className:"stat-value",children:p.totalPatterns}),i.jsx("span",{className:"stat-label",children:"Total Patterns"})]})]}),i.jsxs("div",{className:"stat-card",children:[i.jsx(wt,{size:20}),i.jsxs("div",{className:"stat-info",children:[i.jsx("span",{className:"stat-value",children:p.totalFiles}),i.jsx("span",{className:"stat-label",children:"Files Indexed"})]})]}),i.jsxs("div",{className:"stat-card",children:[i.jsx(Dd,{size:20}),i.jsxs("div",{className:"stat-info",children:[i.jsx("span",{className:"stat-value",children:S.length}),i.jsx("span",{className:"stat-label",children:"Pattern Types"})]})]}),p.indexDurationMs&&i.jsxs("div",{className:"stat-card",children:[i.jsx(gr,{size:20}),i.jsxs("div",{className:"stat-info",children:[i.jsxs("span",{className:"stat-value",children:[p.indexDurationMs,"ms"]}),i.jsx("span",{className:"stat-label",children:"Index Time"})]})]})]}),i.jsxs("div",{className:"pattern-content",children:[i.jsxs("div",{className:"pattern-list",children:[g&&i.jsxs("div",{className:"searching-indicator",children:[i.jsx(qe,{size:14,className:"spinning"}),i.jsx("span",{children:"AI is analyzing your query..."})]}),c?i.jsx("div",{className:"pattern-loading",children:"Loading patterns..."}):v.length===0?i.jsxs("div",{className:"pattern-empty",children:[i.jsx(sn,{size:48}),i.jsx("h3",{children:"No Patterns Indexed"}),i.jsxs("p",{children:["Run ",i.jsx("code",{children:"rigour index"})," to scan your codebase."]})]}):v.map(k=>i.jsxs("div",{className:`pattern-item ${(n==null?void 0:n.id)===k.id?"active":""}`,onClick:()=>r(k),children:[k.similarity&&i.jsxs("div",{className:"similarity-badge",children:[(k.similarity*100).toFixed(0),"% Match"]}),i.jsxs("div",{className:"pattern-item-header",children:[i.jsx("span",{className:"pattern-type-badge",children:k.type}),i.jsx("span",{className:"pattern-name",children:k.name}),i.jsx(cn,{size:14,className:"chevron"})]}),i.jsxs("div",{className:"pattern-item-file",children:[i.jsx(wt,{size:12}),i.jsxs("span",{children:[k.file,":",k.line]})]}),k.exported&&i.jsx("span",{className:"exported-badge",children:"exported"})]},k.id))]}),i.jsx("div",{className:"pattern-detail",children:n?i.jsxs(i.Fragment,{children:[i.jsxs("div",{className:"detail-header",children:[i.jsx("span",{className:"pattern-type-badge large",children:n.type}),i.jsx("h3",{children:n.name})]}),i.jsxs("div",{className:"detail-section",children:[i.jsx("h4",{children:"Location"}),i.jsxs("code",{children:[n.file,":",n.line,"-",n.endLine]})]}),n.signature&&i.jsxs("div",{className:"detail-section",children:[i.jsx("h4",{children:"Signature"}),i.jsx("pre",{children:n.signature})]}),n.description&&i.jsxs("div",{className:"detail-section",children:[i.jsx("h4",{children:"Description"}),i.jsx("p",{children:n.description})]}),((j=n.keywords)==null?void 0:j.length)>0&&i.jsxs("div",{className:"detail-section",children:[i.jsx("h4",{children:"Keywords"}),i.jsx("div",{className:"keywords-list",children:n.keywords.map((k,N)=>i.jsx("span",{className:"keyword-tag",children:k},N))})]}),i.jsxs("div",{className:"detail-section",children:[i.jsx("h4",{children:"Usage"}),i.jsxs("p",{children:["Imported in ",i.jsx("strong",{children:n.usageCount})," files"]})]})]}):i.jsxs("div",{className:"detail-placeholder",children:[i.jsx(sn,{size:48}),i.jsx("p",{children:"Select a pattern to view details"})]})})]})]})},nk=()=>{var y,g,x,C,m;const[e,t]=w.useState(null),[n,r]=w.useState(""),[s,o]=w.useState(null),[a,l]=w.useState(!0),[c,u]=w.useState("visual"),d=async()=>{l(!0);try{const v=await(await fetch("/api/config")).text();r(v);const S=f(v);t(S)}catch(p){console.error("Failed to fetch config:",p)}try{const p=await fetch("/api/report-stats");if(p.ok){const v=await p.json();o(v)}}catch{}l(!1)},f=p=>{var v;try{const S=p.split(`
361
- `),j={};let k=null,N=null;for(const T of S){if(T.startsWith("#")||!T.trim())continue;const R=T.search(/\S/),P=T.trim();if(R===0&&P.includes(":")){const[$]=P.split(":");k=$.trim(),N=null;const I=(v=P.split(":")[1])==null?void 0:v.trim();I&&I!=="{}"&&I!=="[]"?j[k]=isNaN(Number(I))?I:Number(I):j[k]={}}else if(R===2&&k&&P.includes(":")){const[$]=P.split(":");N=$.trim();const I=P.split(":").slice(1).join(":").trim();if(I&&I!=="{}"&&I!=="[]"){typeof j[k]!="object"&&(j[k]={});const Q=I==="true"?!0:I==="false"?!1:isNaN(Number(I))?I:Number(I);j[k][N]=Q}else typeof j[k]!="object"&&(j[k]={}),j[k][N]={}}else if(R===4&&k&&N&&P.includes(":")){const[$]=P.split(":"),I=P.split(":").slice(1).join(":").trim();typeof j[k][N]!="object"&&(j[k][N]={});const Q=I==="true"?!0:I==="false"?!1:isNaN(Number(I))?I:Number(I);j[k][N][$.trim()]=Q}}return j}catch{return{}}};w.useEffect(()=>{d()},[]);const h=(e==null?void 0:e.gates)||{};return i.jsxs("div",{className:"quality-gates",children:[i.jsxs("div",{className:"gates-header",children:[i.jsxs("div",{className:"gates-title",children:[i.jsx(ts,{size:24}),i.jsx("h2",{children:"Quality Gates"}),(e==null?void 0:e.preset)&&i.jsx("span",{className:"preset-badge",children:e.preset})]}),i.jsxs("div",{className:"gates-actions",children:[i.jsxs("div",{className:"view-toggle",children:[i.jsxs("button",{className:c==="visual"?"active":"",onClick:()=>u("visual"),children:[i.jsx(sn,{size:16})," Visual"]}),i.jsxs("button",{className:c==="raw"?"active":"",onClick:()=>u("raw"),children:[i.jsx(wt,{size:16})," YAML"]})]}),i.jsx("button",{className:"refresh-btn",onClick:d,disabled:a,children:i.jsx(qe,{size:16,className:a?"spinning":""})})]})]}),a?i.jsx("div",{className:"gates-loading",children:"Loading configuration..."}):c==="raw"?i.jsx("div",{className:"gates-raw",children:i.jsx("pre",{children:n})}):i.jsxs("div",{className:"gates-content",children:[i.jsxs("div",{className:"gate-section",children:[i.jsxs("div",{className:"section-header",children:[i.jsx(wt,{size:18}),i.jsx("h3",{children:"Code Quality"})]}),i.jsxs("div",{className:"gate-grid",children:[i.jsx(Z,{label:"Max File Lines",value:h.max_file_lines,icon:i.jsx(wt,{size:16})}),i.jsx(Z,{label:"Forbid TODOs",value:h.forbid_todos,icon:h.forbid_todos?i.jsx(Cs,{size:16}):i.jsx(Nt,{size:16})}),i.jsx(Z,{label:"Forbid FIXMEs",value:h.forbid_fixme,icon:h.forbid_fixme?i.jsx(Cs,{size:16}):i.jsx(Nt,{size:16})})]})]}),h.ast&&i.jsxs("div",{className:"gate-section",children:[i.jsxs("div",{className:"section-header",children:[i.jsx(nx,{size:18}),i.jsx("h3",{children:"AST Limits"})]}),i.jsxs("div",{className:"gate-grid",children:[i.jsx(Z,{label:"Complexity",value:h.ast.complexity}),i.jsx(Z,{label:"Max Methods",value:h.ast.max_methods}),i.jsx(Z,{label:"Max Params",value:h.ast.max_params}),i.jsx(Z,{label:"Max Nesting",value:h.ast.max_nesting}),i.jsx(Z,{label:"Max Function Lines",value:h.ast.max_function_lines}),i.jsx(Z,{label:"Max Inheritance",value:h.ast.max_inheritance_depth})]})]}),h.safety&&i.jsxs("div",{className:"gate-section",children:[i.jsxs("div",{className:"section-header",children:[i.jsx(wm,{size:18}),i.jsx("h3",{children:"File Guard"})]}),i.jsx("div",{className:"gate-grid",children:i.jsx(Z,{label:"Max Files/Cycle",value:h.safety.max_files_changed_per_cycle})}),h.safety.protected_paths&&h.safety.protected_paths.length>0&&i.jsxs("div",{className:"protected-paths",children:[i.jsx("h4",{children:"Protected Paths"}),i.jsx("div",{className:"path-list",children:h.safety.protected_paths.map((p,v)=>i.jsx("span",{className:"path-tag",children:p},v))})]})]}),h.required_files&&h.required_files.length>0&&i.jsxs("div",{className:"gate-section",children:[i.jsxs("div",{className:"section-header",children:[i.jsx(Ie,{size:18}),i.jsx("h3",{children:"Required Files"})]}),i.jsx("div",{className:"file-list",children:h.required_files.map((p,v)=>i.jsxs("div",{className:"file-item",children:[i.jsx(wt,{size:14}),i.jsx("span",{children:p})]},v))})]}),h.context&&i.jsxs("div",{className:"gate-section",children:[i.jsxs("div",{className:"section-header",children:[i.jsx(Qt,{size:18}),i.jsx("h3",{children:"Context Mining"})]}),i.jsxs("div",{className:"gate-grid",children:[i.jsx(Z,{label:"Enabled",value:h.context.enabled}),i.jsx(Z,{label:"Sensitivity",value:h.context.sensitivity}),i.jsx(Z,{label:"Mining Depth",value:h.context.mining_depth})]})]}),h.retry_loop_breaker&&i.jsxs("div",{className:"gate-section",children:[i.jsxs("div",{className:"section-header",children:[i.jsx(Sm,{size:18}),i.jsx("h3",{children:"Retry Loop Breaker"})]}),i.jsxs("div",{className:"gate-grid",children:[i.jsx(Z,{label:"Enabled",value:h.retry_loop_breaker.enabled}),i.jsx(Z,{label:"Max Retries",value:h.retry_loop_breaker.max_retries})]})]}),i.jsxs("div",{className:"gate-section",children:[i.jsxs("div",{className:"section-header",children:[i.jsx(Qt,{size:18}),i.jsx("h3",{children:"AI-Native Gates"})]}),i.jsxs("div",{className:"gate-grid",children:[i.jsx(Z,{label:"Duplication Drift",value:((y=h.duplication_drift)==null?void 0:y.enabled)??!0,icon:i.jsx(Nt,{size:16})}),i.jsx(Z,{label:"Hallucinated Imports",value:((g=h.hallucinated_imports)==null?void 0:g.enabled)??!0,icon:i.jsx(Ie,{size:16})}),i.jsx(Z,{label:"Error Handling",value:((x=h.inconsistent_error_handling)==null?void 0:x.enabled)??!0,icon:i.jsx(ts,{size:16})}),i.jsx(Z,{label:"Context Artifacts",value:((C=h.context_window_artifacts)==null?void 0:C.enabled)??!0,icon:i.jsx(sn,{size:16})}),i.jsx(Z,{label:"Async Safety",value:((m=h.promise_safety)==null?void 0:m.enabled)??!0,icon:i.jsx(Qt,{size:16})})]})]}),s&&i.jsxs("div",{className:"gate-section",children:[i.jsxs("div",{className:"section-header",children:[i.jsx(ts,{size:18}),i.jsx("h3",{children:"Latest Scores"})]}),i.jsxs("div",{className:"gate-grid",children:[s.score!==void 0&&i.jsx(Z,{label:"Overall Score",value:`${s.score}/100`}),s.ai_health_score!==void 0&&i.jsx(Z,{label:"AI Health",value:`${s.ai_health_score}/100`,icon:i.jsx(Qt,{size:16})}),s.structural_score!==void 0&&i.jsx(Z,{label:"Structural",value:`${s.structural_score}/100`,icon:i.jsx(sn,{size:16})})]}),s.severity_breakdown&&i.jsxs("div",{className:"severity-breakdown",children:[i.jsx("h4",{children:"Severity Breakdown"}),i.jsx("div",{className:"gate-grid",children:Object.entries(s.severity_breakdown).filter(([,p])=>p>0).map(([p,v])=>i.jsx(Z,{label:p.charAt(0).toUpperCase()+p.slice(1),value:v},p))})]}),s.provenance_breakdown&&i.jsxs("div",{className:"provenance-breakdown",children:[i.jsx("h4",{children:"Provenance Breakdown"}),i.jsx("div",{className:"gate-grid",children:Object.entries(s.provenance_breakdown).filter(([,p])=>p>0).map(([p,v])=>i.jsx(Z,{label:p,value:v},p))})]})]})]})]})},Z=({label:e,value:t,icon:n})=>{const r=typeof t=="boolean"?t?"Yes":"No":t??"N/A";return i.jsxs("div",{className:"gate-card",children:[n&&i.jsx("div",{className:"gate-icon",children:n}),i.jsxs("div",{className:"gate-info",children:[i.jsx("span",{className:"gate-value",children:r}),i.jsx("span",{className:"gate-label",children:e})]})]})},rk=({logs:e,onClearLogs:t,onSelectLog:n,selectedLog:r})=>{const[s,o]=w.useState(""),[a,l]=w.useState("all"),[c,u]=w.useState("all"),d=Ue.useMemo(()=>{const x={};return e.forEach(C=>{const m=C.requestId||C.id;x[m]?x[m]={...x[m],...C}:x[m]={...C}}),Object.values(x).sort((C,m)=>new Date(m.timestamp).getTime()-new Date(C.timestamp).getTime())},[e]),f=Ue.useMemo(()=>{const x=new Set;return d.forEach(C=>C.tool&&x.add(C.tool)),Array.from(x)},[d]),h=Ue.useMemo(()=>d.filter(x=>{var v;const C=!s||((v=x.tool)==null?void 0:v.toLowerCase().includes(s.toLowerCase()))||JSON.stringify(x.arguments||{}).toLowerCase().includes(s.toLowerCase()),m=a==="all"||x.status===a,p=c==="all"||x.tool===c;return C&&m&&p}),[d,s,a,c]),y=Ue.useMemo(()=>({total:d.length,success:d.filter(x=>x.status==="success").length,error:d.filter(x=>x.status==="error").length,pending:d.filter(x=>!x.status||x.status==="pending").length}),[d]),g=()=>{const x=JSON.stringify(h,null,2),C=new Blob([x],{type:"application/json"}),m=URL.createObjectURL(C),p=document.createElement("a");p.href=m,p.download=`rigour-audit-${new Date().toISOString().split("T")[0]}.json`,p.click()};return i.jsxs("div",{className:"audit-log",children:[i.jsxs("div",{className:"audit-header",children:[i.jsxs("div",{className:"audit-title",children:[i.jsx(Dt,{size:24}),i.jsx("h2",{children:"Audit Trail"}),i.jsxs("span",{className:"log-count",children:[h.length," events"]})]}),i.jsxs("div",{className:"audit-actions",children:[i.jsxs("button",{className:"btn-secondary",onClick:t,children:[i.jsx(km,{size:16})," Clear"]}),i.jsxs("button",{className:"btn-primary",onClick:g,children:[i.jsx(J0,{size:16})," Export"]})]})]}),i.jsxs("div",{className:"audit-stats",children:[i.jsxs("div",{className:"stat-pill",children:[i.jsx(Dt,{size:14}),i.jsxs("span",{children:[y.total," Total"]})]}),i.jsxs("div",{className:"stat-pill success",children:[i.jsx(Nt,{size:14}),i.jsxs("span",{children:[y.success," Success"]})]}),i.jsxs("div",{className:"stat-pill error",children:[i.jsx(Cs,{size:14}),i.jsxs("span",{children:[y.error," Failed"]})]}),i.jsxs("div",{className:"stat-pill pending",children:[i.jsx(Ie,{size:14}),i.jsxs("span",{children:[y.pending," Pending"]})]})]}),i.jsxs("div",{className:"audit-filters",children:[i.jsxs("div",{className:"search-box",children:[i.jsx(Rc,{size:16}),i.jsx("input",{type:"text",placeholder:"Search logs...",value:s,onChange:x=>o(x.target.value)})]}),i.jsxs("div",{className:"filter-box",children:[i.jsx(Ac,{size:16}),i.jsxs("select",{value:a,onChange:x=>l(x.target.value),children:[i.jsx("option",{value:"all",children:"All Status"}),i.jsx("option",{value:"success",children:"Success"}),i.jsx("option",{value:"error",children:"Error"}),i.jsx("option",{value:"pending",children:"Pending"})]})]}),i.jsxs("div",{className:"filter-box",children:[i.jsx(ro,{size:16}),i.jsxs("select",{value:c,onChange:x=>u(x.target.value),children:[i.jsx("option",{value:"all",children:"All Tools"}),f.map(x=>i.jsx("option",{value:x,children:x},x))]})]})]}),i.jsxs("div",{className:"audit-content",children:[i.jsx("div",{className:"log-list",children:h.length===0?i.jsxs("div",{className:"empty-state",children:[i.jsx(ro,{size:48}),i.jsx("h3",{children:"No Interactions Detected"}),i.jsx("p",{children:"Rigour tool calls will appear here in real-time."})]}):h.map(x=>i.jsxs("div",{className:`log-entry ${(r==null?void 0:r.id)===x.id?"active":""} ${x._rigour_report?"has-report":""}`,onClick:()=>n((r==null?void 0:r.id)===x.id?null:x),children:[i.jsxs("div",{className:"log-header",children:[i.jsx("span",{className:`status-dot ${x.status||"pending"}`}),i.jsx("span",{className:"log-tool",children:x.tool}),i.jsxs("span",{className:"log-time",children:[i.jsx(gr,{size:12}),new Date(x.timestamp).toLocaleTimeString()]}),x._rigour_report&&i.jsxs("span",{className:"report-badge",children:[i.jsx(ex,{size:12})," Report"]}),x.arbitrated&&i.jsx("span",{className:`arbitrated-badge ${x.decision}`,children:x.decision==="approve"?"Approved":"Rejected"}),i.jsx(cn,{size:14,className:"chevron"})]}),x.requestId&&i.jsxs("div",{className:"log-request-id",children:["ID: ",x.requestId.slice(0,12),"..."]})]},x.id))}),i.jsx("div",{className:"log-detail",children:r?i.jsx(sk,{log:r,onClose:()=>n(null)}):i.jsxs("div",{className:"detail-placeholder",children:[i.jsx(wt,{size:48}),i.jsx("p",{children:"Select a log entry to view details"})]})})]})]})},sk=({log:e,onClose:t})=>{var o,a,l,c,u,d,f;const n=!!e._rigour_report||["rigour_checkpoint","rigour_agent_register","rigour_handoff"].includes(e.tool),[r,s]=w.useState(n?"report":"args");return i.jsxs("div",{className:"log-detail-view",children:[i.jsxs("div",{className:"detail-header",children:[i.jsxs("div",{className:"detail-info",children:[i.jsxs("span",{className:`status-badge ${e.status||"pending"}`,children:[e.status==="success"?i.jsx(Nt,{size:14}):e.status==="error"?i.jsx(Cs,{size:14}):i.jsx(Ie,{size:14}),e.status||"pending"]}),i.jsx("h3",{children:e.tool})]}),i.jsx("button",{className:"close-btn",onClick:t,children:i.jsx(_c,{size:18})})]}),i.jsxs("div",{className:"detail-meta",children:[i.jsxs("div",{className:"meta-item",children:[i.jsx("span",{className:"meta-label",children:"Timestamp"}),i.jsx("span",{className:"meta-value",children:new Date(e.timestamp).toLocaleString()})]}),e.requestId&&i.jsxs("div",{className:"meta-item",children:[i.jsx("span",{className:"meta-label",children:"Request ID"}),i.jsx("span",{className:"meta-value mono",children:e.requestId})]})]}),n&&i.jsxs("div",{className:"detail-tabs",children:[i.jsx("button",{className:r==="report"?"active":"",onClick:()=>s("report"),children:e._rigour_report?"Verification Report":"Visualized Content"}),i.jsx("button",{className:r==="args"?"active":"",onClick:()=>s("args"),children:"Technical Arguments"})]}),i.jsx("div",{className:"detail-body",children:r==="args"?i.jsxs(i.Fragment,{children:[e.arguments&&i.jsxs("div",{className:"code-section",children:[i.jsx("h4",{children:"Arguments"}),i.jsx("pre",{children:JSON.stringify(e.arguments,null,2)})]}),e.error&&i.jsxs("div",{className:"error-section",children:[i.jsx("h4",{children:"Error"}),i.jsx("div",{className:"error-message",children:e.error})]})]}):i.jsx("div",{className:"verification-view",children:e.tool==="rigour_checkpoint"?i.jsxs("div",{className:"checkpoint-viz",children:[i.jsxs("div",{className:"viz-stats",children:[i.jsxs("div",{className:"viz-stat",children:[i.jsx("span",{className:"label",children:"Progress"}),i.jsxs("span",{className:"value",children:[((o=e.arguments)==null?void 0:o.progressPct)??0,"%"]})]}),i.jsxs("div",{className:"viz-stat",children:[i.jsx("span",{className:"label",children:"Quality"}),i.jsxs("span",{className:"value",style:{color:(((a=e.arguments)==null?void 0:a.qualityScore)??0)>=80?"#34d399":"#f87171"},children:[((l=e.arguments)==null?void 0:l.qualityScore)??0,"%"]})]})]}),i.jsxs("div",{className:"viz-summary",children:[i.jsx("h4",{children:"Summary of Work"}),i.jsx("p",{children:((c=e.arguments)==null?void 0:c.summary)||"No summary provided."})]}),((u=e.arguments)==null?void 0:u.filesChanged)&&e.arguments.filesChanged.length>0&&i.jsxs("div",{className:"viz-files",children:[i.jsx("h4",{children:"Files Changed"}),i.jsx("div",{className:"file-badges",children:e.arguments.filesChanged.map(h=>i.jsx("span",{className:"file-badge",children:h},h))})]})]}):e.tool==="rigour_agent_register"?i.jsxs("div",{className:"agent-viz",children:[i.jsx(Dt,{size:32,className:"viz-icon"}),i.jsx("h3",{children:"Agent Scope Claims"}),i.jsxs("div",{className:"scope-box",children:[i.jsx("h4",{children:"Claimed Scope:"}),i.jsx("div",{className:"scope-list",children:(f=(d=e.arguments)==null?void 0:d.taskScope)==null?void 0:f.map(h=>i.jsx("code",{children:h},h))})]})]}):i.jsxs("div",{className:"code-section",children:[i.jsx("h4",{children:"Rigour Report"}),i.jsx("pre",{children:JSON.stringify(e._rigour_report,null,2)})]})})})]})};function ik(e,t){return e===t?!0:e.startsWith("task:")||t.startsWith("task:")?e===t:((r,s)=>r===s||r.startsWith(`${s}/`)||s.startsWith(`${r}/`))(e,t)}function ok(e){return e.startsWith("CTP-")?e.replace(/-task$/,""):e.length>28?`${e.slice(0,12)}…${e.slice(-8)}`:e}function ak({session:e}){if(!e||e.agents.length===0)return i.jsxs("div",{className:"empty-state glass-card",children:[i.jsx(jr,{size:48}),i.jsx("h3",{children:"No Active Agent Team"}),i.jsxs("p",{children:["Register agents with ",i.jsx("code",{children:"rigour_agent_register"}),", or Studio will derive recent agents from checkpoint metrics in the Brain DB."]}),i.jsx("div",{className:"hint-box",children:i.jsx("span",{children:"Works with any MCP client — Claude, Codex, Cursor, VS Code, and more."})})]});const t=!!e.derived||e.status==="completed",n=s=>{switch(s){case"active":return i.jsx(Ei,{size:10,fill:"#34d399",stroke:"#34d399"});case"idle":return i.jsx(Ei,{size:10,fill:"#fbbf24",stroke:"#fbbf24"});case"completed":return i.jsx(Nt,{size:14,color:"#34d399"});default:return i.jsx(Ei,{size:10})}},r=(s,o)=>t||s.status==="completed"?!1:o.filter(l=>l.agentId!==s.agentId&&l.status!=="completed").some(l=>s.taskScope.some(c=>l.taskScope.some(u=>ik(c,u))));return i.jsxs("div",{className:"agent-teams",children:[i.jsxs("div",{className:"panel-header",children:[i.jsxs("div",{className:"title",children:[i.jsx(jr,{size:18}),i.jsx("span",{children:"Agent Team Session"})]}),i.jsx("div",{className:`session-status ${e.status}`,children:e.status.toUpperCase()})]}),i.jsxs("div",{className:"session-info",children:[i.jsx("span",{className:"session-id",children:e.sessionId}),i.jsxs("span",{className:"agent-count",children:[e.agents.length," agents"]}),e.derived&&i.jsx("span",{className:"meta-chip",children:"Historical (derived)"})]}),i.jsx("div",{className:"agents-grid",children:e.agents.map(s=>{const o=r(s,e.agents);return i.jsxs("div",{className:`agent-card glass-card ${s.status} ${o?"has-conflict":""}`,children:[i.jsxs("div",{className:"agent-header",children:[i.jsxs("div",{className:"agent-id",children:[n(s.status),i.jsx("span",{title:s.agentId,children:ok(s.agentId)})]}),o&&i.jsxs("div",{className:"conflict-badge",children:[i.jsx(Ie,{size:12}),i.jsx("span",{children:"Scope Conflict"})]})]}),i.jsxs("div",{className:"task-scope",children:[i.jsx("h4",{children:"Enforced scope"}),i.jsx("ul",{children:s.taskScope.map((a,l)=>i.jsxs("li",{children:[i.jsx(Fs,{size:12}),i.jsx("code",{children:a})]},l))})]}),i.jsxs("div",{className:"agent-meta",children:[i.jsxs("span",{children:["Registered: ",new Date(s.registeredAt).toLocaleTimeString()]}),s.lastCheckpoint&&i.jsxs("span",{children:["Last checkpoint: ",new Date(s.lastCheckpoint).toLocaleTimeString()]})]}),i.jsx("div",{className:"mono dim agent-raw-id",children:s.agentId})]},s.agentId)})})]})}function lk({checkpoints:e}){if(!e||e.length===0)return i.jsxs("div",{className:"empty-state glass-card",children:[i.jsx(xr,{size:48}),i.jsx("h3",{children:"No Checkpoints Yet"}),i.jsxs("p",{children:["Checkpoints compress agent state for verified handoffs. Call ",i.jsx("code",{children:"rigour_checkpoint"})," before",i.jsx("code",{children:" rigour_handoff"}),". Quality below 80% should pause the loop."]}),i.jsx("div",{className:"hint-box",children:i.jsx("span",{children:"Default interval: 15 minutes"})})]});const t=s=>s>=80?"#34d399":s>=60?"#fbbf24":"#f87171",n=s=>{if(s===0)return null;const o=e[s-1].qualityScore,a=e[s].qualityScore;return a>o+5?i.jsx(Nm,{size:14,color:"#34d399"}):a<o-5?i.jsx(Dc,{size:14,color:"#f87171"}):null},r=e.some((s,o)=>{if(o<2)return!1;const a=e.slice(Math.max(0,o-2),o),l=a.reduce((c,u)=>c+u.qualityScore,0)/a.length;return s.qualityScore<l-10});return i.jsxs("div",{className:"checkpoint-timeline",children:[i.jsxs("div",{className:"panel-header",children:[i.jsxs("div",{className:"title",children:[i.jsx(xr,{size:18}),i.jsx("span",{children:"Checkpoint Timeline"})]}),i.jsxs("div",{className:"drift-visualization",children:[i.jsxs("svg",{width:"120",height:"30",viewBox:"0 0 120 30",className:"drift-sparkline",children:[i.jsx("path",{d:`M ${e.map((s,o)=>`${o/(e.length-1||1)*120} ${30-s.qualityScore/100*30}`).join(" L ")}`,fill:"none",stroke:"var(--accent-primary)",strokeWidth:"2",strokeLinecap:"round"}),e.map((s,o)=>i.jsx("circle",{cx:o/(e.length-1||1)*120,cy:30-s.qualityScore/100*30,r:"2",fill:t(s.qualityScore)},o))]}),i.jsx("span",{className:"drift-label",children:"Session Stability"})]}),r&&i.jsxs("div",{className:"drift-alert",children:[i.jsx(Ie,{size:14}),i.jsx("span",{children:"Drift Detected — quality dropped vs recent average"})]})]}),i.jsxs("div",{className:"timeline-container",children:[i.jsx("div",{className:"timeline-line"}),e.map((s,o)=>{var a;return i.jsxs("div",{className:`checkpoint-entry glass-card ${s.warnings.length>0||s.qualityScore<80?"has-warnings":""}`,children:[i.jsxs("div",{className:"checkpoint-marker",children:[i.jsx("div",{className:"marker-dot",style:{backgroundColor:t(s.qualityScore)}}),s.qualityScore<80&&i.jsx("div",{className:"marker-ring warn","aria-hidden":"true"})]}),i.jsxs("div",{className:"checkpoint-content",children:[i.jsxs("div",{className:"checkpoint-header",children:[i.jsx("span",{className:"checkpoint-summary-lead",children:((a=s.summary)==null?void 0:a.slice(0,80))||s.checkpointId}),i.jsx("span",{className:"checkpoint-time",children:new Date(s.timestamp).toLocaleTimeString()})]}),i.jsx("div",{className:"mono dim checkpoint-id",children:s.checkpointId}),s.qualityScore<80&&i.jsxs("div",{className:"warning-item",children:[i.jsx(Ie,{size:12}),i.jsx("span",{children:"Below threshold — pause handoffs until quality recovers"})]}),i.jsxs("div",{className:"checkpoint-stats",children:[i.jsxs("div",{className:"stat",children:[i.jsx("span",{className:"label",children:"Progress"}),i.jsx("div",{className:"progress-bar",children:i.jsx("div",{className:"progress-fill",style:{width:`${s.progressPct}%`}})}),i.jsxs("span",{className:"value",children:[s.progressPct,"%"]})]}),i.jsxs("div",{className:"stat",children:[i.jsx("span",{className:"label",children:"Quality"}),i.jsxs("span",{className:"value score",style:{color:t(s.qualityScore)},children:[s.qualityScore,"%",n(o)]})]}),i.jsxs("div",{className:"stat",children:[i.jsx("span",{className:"label",children:"Agent"}),i.jsx("span",{className:"value agent-id",children:s.agentId})]})]}),i.jsx("div",{className:"checkpoint-summary",children:i.jsx("p",{children:s.summary})}),s.filesChanged.length>0&&i.jsx("div",{className:"files-changed",children:i.jsxs("span",{className:"count",children:[s.filesChanged.length," files changed"]})}),s.warnings.length>0&&i.jsx("div",{className:"warnings",children:s.warnings.map((l,c)=>i.jsxs("div",{className:"warning-item",children:[i.jsx(Ie,{size:12}),i.jsx("span",{children:l})]},c))})]})]},s.checkpointId)})]})]})}const cy={critical:"var(--status-error)",high:"#f97316",medium:"var(--status-warning)",low:"var(--accent-primary)",info:"var(--text-dim)"},ck={srp_violation:"Single Responsibility",ocp_violation:"Open/Closed Principle",lsp_violation:"Liskov Substitution",isp_violation:"Interface Segregation",dip_violation:"Dependency Inversion",god_class:"God Class",god_function:"God Function",long_params:"Long Parameters",complex_conditional:"Complex Conditional",empty_catch:"Empty Catch Block",error_inconsistency:"Error Inconsistency",race_condition:"Race Condition",goroutine_leak:"Goroutine Leak",channel_misuse:"Channel Misuse",mutex_scope:"Mutex Scope",isp_violation_interface:"Interface Bloat",missing_test:"Missing Tests",long_file:"Long File",magic_number:"Magic Numbers",resource_leak:"Resource Leak",dry_violation:"DRY Violation",feature_envy:"Feature Envy",dead_code:"Dead Code",naming_convention:"Naming Convention",performance:"Performance"},rh={"SOLID Principles":["srp_violation","ocp_violation","lsp_violation","isp_violation","dip_violation"],"Code Smells":["god_class","god_function","long_params","complex_conditional","long_file","magic_number","dead_code","feature_envy"],"Error Handling":["empty_catch","error_inconsistency"],Concurrency:["race_condition","goroutine_leak","channel_misuse","mutex_scope"],Testing:["missing_test"],Architecture:["isp_violation_interface","dry_violation","naming_convention","resource_leak"],Performance:["performance"]},uk=()=>{const[e,t]=w.useState(null),[n,r]=w.useState(!0),[s,o]=w.useState(new Set),[a,l]=w.useState(new Set),[c,u]=w.useState("all"),[d,f]=w.useState(!1),h=async()=>{r(!0);try{const[j,k]=await Promise.all([fetch("/api/report-stats"),fetch("/api/deep-findings")]),N=j.ok?await j.json():{},T=k.ok?await k.json():[];t({...N,findings:T})}catch(j){console.error("Failed to fetch deep analysis data:",j)}r(!1)};w.useEffect(()=>{h()},[]);const y=j=>{o(k=>{const N=new Set(k);return N.has(j)?N.delete(j):N.add(j),N})},g=j=>{l(k=>{const N=new Set(k);return N.has(j)?N.delete(j):N.add(j),N})},x=((e==null?void 0:e.findings)||[]).filter(j=>j.provenance==="deep-analysis"),C=x.filter(j=>!(c!=="all"&&j.severity!==c||d&&!j.verified)),m=Object.entries(rh).map(([j,k])=>{const N=C.filter(T=>k.includes(T.category||""));return{group:j,findings:N}}).filter(j=>j.findings.length>0),p=Object.values(rh).flat(),v=C.filter(j=>!p.includes(j.category||"")),S=e==null?void 0:e.deep;return i.jsxs("div",{className:"deep-analysis",children:[i.jsxs("div",{className:"deep-header",children:[i.jsxs("div",{className:"deep-title",children:[i.jsx(at,{size:24}),i.jsx("h2",{children:"Deep Analysis"}),(S==null?void 0:S.tier)&&i.jsx("span",{className:"tier-badge",children:S.tier})]}),i.jsx("div",{className:"deep-actions",children:i.jsx("button",{className:"refresh-btn",onClick:h,disabled:n,children:i.jsx(qe,{size:16,className:n?"spinning":""})})})]}),n?i.jsx("div",{className:"deep-loading",children:"Loading deep analysis data..."}):!(S!=null&&S.enabled)&&x.length===0?i.jsxs("div",{className:"deep-empty",children:[i.jsx(at,{size:48}),i.jsx("h3",{children:"Deep Analysis Not Yet Run"}),i.jsxs("p",{children:["Run ",i.jsx("code",{children:"rigour check --deep"})," to get LLM-powered code quality analysis with 40+ categories."]}),i.jsxs("div",{className:"empty-features",children:[i.jsxs("div",{className:"feature",children:[i.jsx(ts,{size:16})," SOLID Principles"]}),i.jsxs("div",{className:"feature",children:[i.jsx(sn,{size:16})," Design Patterns"]}),i.jsxs("div",{className:"feature",children:[i.jsx(Qt,{size:16})," Concurrency Safety"]}),i.jsxs("div",{className:"feature",children:[i.jsx(dx,{size:16})," Architecture Quality"]})]})]}):i.jsxs(i.Fragment,{children:[i.jsxs("div",{className:"deep-stats-banner",children:[i.jsxs("div",{className:"stat-card",children:[i.jsx("span",{className:"stat-value",children:(S==null?void 0:S.findings_count)??x.length}),i.jsx("span",{className:"stat-label",children:"Findings"})]}),i.jsxs("div",{className:"stat-card",children:[i.jsx("span",{className:"stat-value",children:(S==null?void 0:S.findings_verified)??x.filter(j=>j.verified).length}),i.jsx("span",{className:"stat-label",children:"Verified"})]}),i.jsxs("div",{className:"stat-card",children:[i.jsx("span",{className:"stat-value",children:(S==null?void 0:S.files_analyzed)??"—"}),i.jsx("span",{className:"stat-label",children:"Files Analyzed"})]}),i.jsxs("div",{className:"stat-card",children:[i.jsx("span",{className:"stat-value",children:(S==null?void 0:S.model)||"—"}),i.jsx("span",{className:"stat-label",children:"Model"})]}),(S==null?void 0:S.total_ms)&&i.jsxs("div",{className:"stat-card",children:[i.jsxs("span",{className:"stat-value",children:[(S.total_ms/1e3).toFixed(1),"s"]}),i.jsx("span",{className:"stat-label",children:"Inference"})]})]}),((e==null?void 0:e.score)!==void 0||(e==null?void 0:e.code_quality_score)!==void 0)&&i.jsxs("div",{className:"deep-scores",children:[(e==null?void 0:e.score)!==void 0&&i.jsx(Ca,{label:"Overall",score:e.score}),(e==null?void 0:e.ai_health_score)!==void 0&&i.jsx(Ca,{label:"AI Health",score:e.ai_health_score}),(e==null?void 0:e.structural_score)!==void 0&&i.jsx(Ca,{label:"Structural",score:e.structural_score})]}),i.jsxs("div",{className:"deep-filters",children:[i.jsxs("div",{className:"filter-group",children:[i.jsx(Ac,{size:14}),i.jsxs("select",{value:c,onChange:j=>u(j.target.value),className:"filter-select",children:[i.jsx("option",{value:"all",children:"All Severities"}),i.jsx("option",{value:"critical",children:"Critical"}),i.jsx("option",{value:"high",children:"High"}),i.jsx("option",{value:"medium",children:"Medium"}),i.jsx("option",{value:"low",children:"Low"})]})]}),i.jsxs("button",{className:`filter-toggle ${d?"active":""}`,onClick:()=>f(!d),children:[i.jsx(Nt,{size:14}),"Verified Only"]}),i.jsxs("span",{className:"filter-count",children:[C.length," finding",C.length!==1?"s":""]})]}),i.jsxs("div",{className:"deep-findings",children:[m.map(({group:j,findings:k})=>i.jsxs("div",{className:"finding-group",children:[i.jsxs("button",{className:"group-header",onClick:()=>y(j),children:[s.has(j)?i.jsx(yr,{size:16}):i.jsx(cn,{size:16}),i.jsx("span",{className:"group-name",children:j}),i.jsx("span",{className:"group-count",children:k.length}),i.jsx("div",{className:"group-severity-dots",children:["critical","high","medium","low"].map(N=>{const T=k.filter(R=>R.severity===N).length;return T>0?i.jsx("span",{className:"sev-dot",style:{backgroundColor:cy[N]},title:`${T} ${N}`},N):null})})]}),s.has(j)&&i.jsx("div",{className:"group-findings",children:k.map(N=>i.jsx(sh,{finding:N,expanded:a.has(N.id),onToggle:()=>g(N.id)},N.id))})]},j)),v.length>0&&i.jsxs("div",{className:"finding-group",children:[i.jsxs("button",{className:"group-header",onClick:()=>y("_other"),children:[s.has("_other")?i.jsx(yr,{size:16}):i.jsx(cn,{size:16}),i.jsx("span",{className:"group-name",children:"Other Findings"}),i.jsx("span",{className:"group-count",children:v.length})]}),s.has("_other")&&i.jsx("div",{className:"group-findings",children:v.map(j=>i.jsx(sh,{finding:j,expanded:a.has(j.id),onToggle:()=>g(j.id)},j.id))})]}),C.length===0&&i.jsxs("div",{className:"no-findings",children:[i.jsx(Nt,{size:32}),i.jsx("p",{children:"No deep analysis findings match the current filters."})]})]})]})]})},sh=({finding:e,expanded:t,onToggle:n})=>{const r=cy[e.severity||"info"],s=ck[e.category||""]||e.category||"Unknown";return i.jsxs("div",{className:`finding-card severity-${e.severity||"info"}`,children:[i.jsxs("button",{className:"finding-header",onClick:n,children:[i.jsxs("div",{className:"finding-left",children:[i.jsx("span",{className:"severity-indicator",style:{backgroundColor:r}}),i.jsx("span",{className:"finding-title",children:e.title})]}),i.jsxs("div",{className:"finding-right",children:[i.jsx("span",{className:"category-tag",children:s}),e.verified&&i.jsxs("span",{className:"verified-badge",title:"AST-verified",children:[i.jsx(Nt,{size:12})," Verified"]}),e.confidence!==void 0&&i.jsxs("span",{className:"confidence-badge",title:`Confidence: ${(e.confidence*100).toFixed(0)}%`,children:[(e.confidence*100).toFixed(0),"%"]}),i.jsx("span",{className:"severity-badge",style:{color:r},children:e.severity||"info"}),t?i.jsx(yr,{size:14}):i.jsx(cn,{size:14})]})]}),t&&i.jsxs("div",{className:"finding-body",children:[i.jsx("p",{className:"finding-details",children:e.details}),e.hint&&i.jsxs("div",{className:"finding-hint",children:[i.jsx(Qt,{size:14}),i.jsx("span",{children:e.hint})]}),e.files&&e.files.length>0&&i.jsx("div",{className:"finding-files",children:e.files.map((o,a)=>i.jsxs("span",{className:"file-tag",children:[i.jsx(wt,{size:12}),o,e.line&&`:${e.line}`,e.endLine&&`-${e.endLine}`]},a))}),i.jsx("div",{className:"finding-meta",children:e.source&&i.jsxs("span",{className:"meta-tag",children:["Source: ",e.source]})})]})]})},Ca=({label:e,score:t})=>{const n=2*Math.PI*36,r=n-t/100*n,s=t>=80?"var(--status-success)":t>=60?"var(--status-warning)":"var(--status-error)";return i.jsxs("div",{className:"score-ring",children:[i.jsxs("svg",{width:"88",height:"88",viewBox:"0 0 88 88",children:[i.jsx("circle",{cx:"44",cy:"44",r:"36",fill:"none",stroke:"var(--border-dim)",strokeWidth:"6"}),i.jsx("circle",{cx:"44",cy:"44",r:"36",fill:"none",stroke:s,strokeWidth:"6",strokeDasharray:n,strokeDashoffset:r,strokeLinecap:"round",transform:"rotate(-90 44 44)",style:{transition:"stroke-dashoffset 0.8s ease"}}),i.jsx("text",{x:"44",y:"42",textAnchor:"middle",fill:"var(--text-main)",fontSize:"18",fontWeight:"700",children:t}),i.jsx("text",{x:"44",y:"56",textAnchor:"middle",fill:"var(--text-dim)",fontSize:"9",children:"/100"})]}),i.jsx("span",{className:"score-label",children:e})]})},uy={improving:{color:"#34d399",icon:Nm,label:"Improving"},stable:{color:"var(--accent-primary)",icon:ix,label:"Stable"},degrading:{color:"#f87171",icon:Dc,label:"Degrading"}};function dy({direction:e,zScore:t}){const n=uy[e],r=n.icon;return i.jsxs("span",{className:"direction-badge",style:{color:n.color,borderColor:n.color},children:[i.jsx(r,{size:14}),i.jsx("span",{children:n.label}),t!==void 0&&i.jsxs("span",{className:"z-score",children:["Z=",t.toFixed(1)]})]})}function hi({score:e,label:t,size:n=80}){const r=(n-8)/2,s=2*Math.PI*r,o=e/100*s,a=e>=80?"#34d399":e>=60?"#fbbf24":"#f87171";return i.jsxs("div",{className:"score-ring",style:{width:n,height:n+20},children:[i.jsxs("svg",{width:n,height:n,viewBox:`0 0 ${n} ${n}`,children:[i.jsx("circle",{cx:n/2,cy:n/2,r,fill:"none",stroke:"var(--bg-tertiary)",strokeWidth:"6"}),i.jsx("circle",{cx:n/2,cy:n/2,r,fill:"none",stroke:a,strokeWidth:"6",strokeDasharray:`${o} ${s-o}`,strokeDashoffset:s/4,strokeLinecap:"round",style:{transition:"stroke-dasharray 0.8s ease"}}),i.jsx("text",{x:n/2,y:n/2,textAnchor:"middle",dominantBaseline:"central",fill:"var(--text-primary)",fontSize:"16",fontWeight:"bold",children:Math.round(e)})]}),i.jsx("span",{className:"ring-label",children:t})]})}function dk({series:e,direction:t}){if(e.length<2)return null;const n=200,r=50,s=4,o=e.map(g=>g.ewma),a=Math.min(...o)-5,c=Math.max(...o)+5-a||1,u=e.map((g,x)=>{const C=s+x/(e.length-1)*(n-2*s),m=r-s-(g.ewma-a)/c*(r-2*s);return`${C},${m}`}),d=uy[t].color,f=s,h=s+(e.length-1)/(e.length-1)*(n-2*s),y=`M ${u[0]} L ${u.join(" L ")} L ${h},${r} L ${f},${r} Z`;return i.jsxs("svg",{width:n,height:r,className:"ewma-sparkline",children:[i.jsx("defs",{children:i.jsxs("linearGradient",{id:`grad-${t}`,x1:"0",y1:"0",x2:"0",y2:"1",children:[i.jsx("stop",{offset:"0%",stopColor:d,stopOpacity:"0.3"}),i.jsx("stop",{offset:"100%",stopColor:d,stopOpacity:"0.02"})]})}),i.jsx("path",{d:y,fill:`url(#grad-${t})`}),i.jsx("polyline",{points:u.join(" "),fill:"none",stroke:d,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),i.jsx("circle",{cx:parseFloat(u[u.length-1].split(",")[0]),cy:parseFloat(u[u.length-1].split(",")[1]),r:"3",fill:d})]})}function pi({name:e,icon:t,stream:n}){return i.jsxs("div",{className:"stream-card",children:[i.jsxs("div",{className:"stream-header",children:[i.jsxs("div",{className:"stream-name",children:[i.jsx(t,{size:16}),i.jsx("span",{children:e})]}),i.jsx(dy,{direction:n.direction,zScore:n.zScore})]}),i.jsxs("div",{className:"stream-body",children:[i.jsx(dk,{series:n.series,direction:n.direction}),i.jsxs("div",{className:"stream-stats",children:[i.jsxs("div",{className:"stat",children:[i.jsx("span",{className:"stat-label",children:"Current EWMA"}),i.jsx("span",{className:"stat-value",children:n.currentEWMA.toFixed(1)})]}),i.jsxs("div",{className:"stat",children:[i.jsx("span",{className:"stat-label",children:"Historical Avg"}),i.jsx("span",{className:"stat-value",children:n.historicalAvg.toFixed(1)})]})]})]})]})}function fk({monthly:e}){const[t,n]=w.useState(!0);return e.length===0?null:i.jsxs("div",{className:"monthly-section",children:[i.jsxs("button",{className:"section-toggle",onClick:()=>n(!t),children:[t?i.jsx(yr,{size:16}):i.jsx(cn,{size:16}),i.jsx(gm,{size:16}),i.jsx("span",{children:"Monthly Breakdown"})]}),t&&i.jsxs("table",{className:"monthly-table",children:[i.jsx("thead",{children:i.jsxs("tr",{children:[i.jsx("th",{children:"Month"}),i.jsx("th",{children:"Score"}),i.jsx("th",{children:"AI Health"}),i.jsx("th",{children:"Structural"}),i.jsx("th",{children:"Scans"}),i.jsx("th",{children:"AI Drift"}),i.jsx("th",{children:"Security"})]})}),i.jsx("tbody",{children:e.slice().reverse().map(r=>{const s=r.avgScore>=80?"#34d399":r.avgScore>=60?"#fbbf24":"#f87171";return i.jsxs("tr",{children:[i.jsx("td",{className:"month-cell",children:r.month}),i.jsx("td",{style:{color:s,fontWeight:600},children:r.avgScore.toFixed(0)}),i.jsx("td",{children:r.avgAiHealth.toFixed(0)}),i.jsx("td",{children:r.avgStructural.toFixed(0)}),i.jsx("td",{className:"dim",children:r.scanCount}),i.jsx("td",{className:"dim",children:r.provenanceBreakdown.aiDrift}),i.jsx("td",{className:"dim",children:r.provenanceBreakdown.security})]},r.month)})})]})]})}function hk(){const[e,t]=w.useState(null),[n,r]=w.useState(!0),[s,o]=w.useState(null),a=async()=>{r(!0),o(null);try{const l=await fetch("/api/drift");if(!l.ok)throw new Error(`HTTP ${l.status}`);const c=await l.json();c&&c.totalScans>0?t(c):t(null)}catch(l){o(l.message)}finally{r(!1)}};return w.useEffect(()=>{a()},[]),n?i.jsxs("div",{className:"empty-state",children:[i.jsx(qe,{size:48,className:"spin"}),i.jsx("h3",{children:"Analyzing Temporal Drift..."}),i.jsx("p",{children:"Reading scan history from SQLite brain."})]}):s?i.jsxs("div",{className:"empty-state",children:[i.jsx(Ie,{size:48}),i.jsx("h3",{children:"Drift Analysis Unavailable"}),i.jsx("p",{children:s}),i.jsx("button",{className:"retry-btn",onClick:a,children:"Retry"})]}):e?i.jsxs("div",{className:"temporal-drift",children:[i.jsxs("div",{className:"panel-header",children:[i.jsxs("div",{className:"title",children:[i.jsx(Dt,{size:18}),i.jsx("span",{children:"Temporal Drift Engine"}),i.jsx("span",{className:"badge",children:"v5 EWMA"})]}),i.jsx("button",{className:"refresh-btn",onClick:a,title:"Refresh",children:i.jsx(qe,{size:16})})]}),i.jsxs("div",{className:`drift-banner drift-${e.overallDirection}`,children:[i.jsxs("div",{className:"banner-main",children:[i.jsx(dy,{direction:e.overallDirection,zScore:e.overallZScore}),i.jsx("span",{className:"banner-repo",children:e.repo}),i.jsxs("span",{className:"banner-meta",children:[e.totalScans," scans over ",e.timeSpanDays," days"]})]}),e.latestScanAnomaly.isAnomaly&&i.jsxs("div",{className:"anomaly-alert",children:[i.jsx(Ie,{size:14}),i.jsx("span",{children:e.latestScanAnomaly.message})]})]}),i.jsxs("div",{className:"score-rings-row",children:[i.jsx(hi,{score:e.streams.overall.currentEWMA,label:"Overall"}),i.jsx(hi,{score:e.streams.aiDrift.currentEWMA,label:"AI Health"}),i.jsx(hi,{score:e.streams.structural.currentEWMA,label:"Structural"}),i.jsx(hi,{score:e.streams.security.currentEWMA,label:"Security"})]}),i.jsxs("div",{className:"streams-grid",children:[i.jsx(pi,{name:"AI Drift",icon:at,stream:e.streams.aiDrift}),i.jsx(pi,{name:"Structural",icon:Qt,stream:e.streams.structural}),i.jsx(pi,{name:"Security",icon:ts,stream:e.streams.security}),i.jsx(pi,{name:"Overall",icon:Dt,stream:e.streams.overall})]}),i.jsx(fk,{monthly:e.monthly}),i.jsxs("div",{className:"narrative-section",children:[i.jsxs("div",{className:"narrative-header",children:[i.jsx(gr,{size:16}),i.jsx("span",{children:"Analysis Narrative"})]}),i.jsx("pre",{className:"narrative-text",children:e.narrative})]})]}):i.jsxs("div",{className:"empty-state",children:[i.jsx(Dt,{size:48}),i.jsx("h3",{children:"Not Enough Data"}),i.jsxs("p",{children:["Run at least 3 scans with ",i.jsx("code",{children:"rigour check"})," to see temporal drift analysis."]}),i.jsx("div",{className:"hint-box",children:i.jsx("span",{children:"Drift detection uses EWMA + Z-score anomaly detection across per-provenance streams."})})]})}function pk(){var xu,ju,wu,Su;const[e,t]=w.useState(null),[n,r]=w.useState(null),[s,o]=w.useState(null),[a,l]=w.useState(null),[c,u]=w.useState(null),[d,f]=w.useState(null),[h,y]=w.useState("services/task"),[g,x]=w.useState(""),[C,m]=w.useState(null),[p,v]=w.useState(""),[S,j]=w.useState(!1),[k,N]=w.useState(),[T,R]=w.useState("none"),[P,$]=w.useState(0),[I,Q]=w.useState(!1),[he,L]=w.useState(null),[B,H]=w.useState(!1),[A,z]=w.useState(!0),V=async()=>{z(!0);try{const[W,Y,my,vy,yy,Ze]=await Promise.all([fetch("/api/context-stats").then(ct=>ct.json()),fetch("/api/task-cost").then(ct=>ct.json()),fetch("/api/cache-stats").then(ct=>ct.json()),fetch("/api/context-scope").then(ct=>ct.json()),fetch("/api/checkpoint-metrics").then(ct=>ct.json()),fetch("/api/cursor-api-key/status").then(ct=>ct.json())]);t(W),r(Y),o(my),l(vy),u(yy),j(!!(Ze!=null&&Ze.configured)),N(Ze==null?void 0:Ze.hint),R((Ze==null?void 0:Ze.source)||"none"),$(Number((Ze==null?void 0:Ze.importedCount)??0))}catch(W){console.error("Failed to fetch cost & context telemetry",W)}finally{z(!1)}};w.useEffect(()=>{V()},[]);const _=async()=>{if(h)try{const W=await fetch(`/api/context-explain?target=${encodeURIComponent(h)}`);f(await W.json())}catch(W){console.error("Failed to get context explanation",W)}},E=async()=>{if(g.trim())try{const Y=await(await fetch("/api/import-cursor-usage",{method:"POST",headers:{"Content-Type":"text/plain"},body:g})).json();Y.success?(m(`Imported ${Y.importedCount} observed usage record(s).`),x(""),V()):m(`Import failed: ${Y.error}`)}catch(W){m(`Import failed: ${W.message}`)}},b=async()=>{if(p.trim()){Q(!0),L(null);try{const Y=await(await fetch("/api/cursor-api-key",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:p.trim()})})).json();Y.success?(j(!0),v(""),N(Y.hint),R(Y.source||"file"),$(Number(Y.importedCount??0)),L(Y.syncError?`Key saved locally. Initial sync failed: ${Y.syncError}`:`Vendor key saved locally. Imported ${Y.importedCount??0} usage event(s).`),V()):L(`Save failed: ${Y.error}`)}catch(W){L(`Save failed: ${W.message}`)}finally{Q(!1)}}},G=async()=>{Q(!0),L(null);try{const Y=await(await fetch("/api/cursor-api-key",{method:"DELETE"})).json();Y.success?(j(!!Y.configured),N(Y.hint),R(Y.source||"none"),L(Y.configured?"Removed file key. Env key still active.":"Removed local vendor key.")):L(`Remove failed: ${Y.error}`)}catch(W){L(`Remove failed: ${W.message}`)}finally{Q(!1)}},ae=async()=>{Q(!0),L(null);try{const Y=await(await fetch("/api/cursor-sync",{method:"POST"})).json();Y.success?($(Number(Y.importedCount??0)),L(`Synced ${Y.importedCount??0} new usage event(s).`),V()):L(`Sync failed: ${Y.error||"Unknown error"}`)}catch(W){L(`Sync failed: ${W.message}`)}finally{Q(!1)}},le=W=>W?W>=1e6?`${(W/1e6).toFixed(2)}M`:W>=1e3?`${(W/1e3).toFixed(1)}K`:W.toString():"0",lt=(e==null?void 0:e.candidateTokens)??0,be=(e==null?void 0:e.returnedTokens)??0,pu=(e==null?void 0:e.potentialAvoidedTokens)??0,mu=lt>0?((lt-be)/lt*100).toFixed(1):"0.0",fy=s!=null&&s.hitRate?Math.round(s.hitRate*100):0,vu=((xu=n==null?void 0:n.actual)==null?void 0:xu.costUsd)??0,yu=((ju=n==null?void 0:n.estimated)==null?void 0:ju.estimatedCostAvoidedUsd)??0,gu=((wu=n==null?void 0:n.actual)==null?void 0:wu.inputTokens)??0,hy=((Su=n==null?void 0:n.actual)==null?void 0:Su.source)||"No usage data",py=((e==null?void 0:e.retrievals)??0)>0||gu>0||((s==null?void 0:s.exactCacheHits)??0)+((s==null?void 0:s.semanticCacheHits)??0)+((s==null?void 0:s.partialCacheHits)??0)+((s==null?void 0:s.cacheMisses)??0)>0||((c==null?void 0:c.checkpointCount)??0)>0;return i.jsxs("div",{className:"cost-context-view",children:[i.jsxs("div",{className:"cost-header",children:[i.jsxs("div",{children:[i.jsxs("h2",{children:[i.jsx(Qt,{size:20,className:"text-amber"}),"Token Savings & Context Efficiency"]}),i.jsx("p",{children:"Rigour-measured avoided context vs optional observed model usage (kept separate on purpose)."})]}),i.jsx("div",{className:"cost-toolbar",children:i.jsxs("button",{type:"button",onClick:V,"aria-label":"Refresh cost and context stats",children:[i.jsx(qe,{size:14,className:A?"spinning":""})," Refresh"]})})]}),!py&&!A&&i.jsxs("div",{className:"cost-banner",children:[i.jsx(Ns,{size:18,className:"text-amber"}),i.jsxs("div",{children:[i.jsx("strong",{children:"No telemetry recorded yet"}),i.jsxs("p",{children:["Use Rigour MCP tools (",i.jsx("code",{children:"rigour_context_scope"}),", ",i.jsx("code",{children:"rigour_checkpoint"}),") or import observed usage below."]})]})]}),i.jsxs("div",{className:"cost-kpi-grid",children:[i.jsxs("div",{className:"cost-kpi-card glass-card",children:[i.jsx("div",{className:"label",children:"Actual model tokens"}),i.jsx("div",{className:"value",children:le(gu)}),i.jsxs("div",{className:"meta text-emerald",children:["Observed via ",hy]})]}),i.jsxs("div",{className:"cost-kpi-card glass-card",children:[i.jsx("div",{className:"label",children:"Potential context avoided"}),i.jsx("div",{className:"value text-amber",children:le(pu)}),i.jsxs("div",{className:"meta",children:["Reduction ratio: ",mu,"%"]})]}),i.jsxs("div",{className:"cost-kpi-card glass-card",children:[i.jsx("div",{className:"label",children:"Cache hit rate"}),i.jsxs("div",{className:"value text-cyan",children:[fy,"%"]}),i.jsx("div",{className:"meta",children:"static & semantic layers"})]}),i.jsxs("div",{className:"cost-kpi-card glass-card",children:[i.jsx("div",{className:"label",children:"Actual vs avoided cost"}),i.jsxs("div",{className:"value",children:[i.jsxs("span",{className:"text-emerald",children:["$",vu.toFixed(2)]})," / ",i.jsxs("span",{className:"text-amber",children:["$",yu.toFixed(2)]})]}),i.jsx("div",{className:"meta",children:"Actual spend / est. avoided"})]})]}),i.jsxs("div",{className:"cost-panel-grid",children:[i.jsxs("div",{className:"cost-panel glass-card",children:[i.jsxs("h3",{children:[i.jsx(sn,{size:16,className:"text-cyan"})," A. Retrieval efficiency"]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Candidates scanned"}),i.jsxs("span",{children:[le(lt)," tokens"]})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Context returned"}),i.jsxs("span",{className:"text-cyan",children:[le(be)," tokens"]})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Potential avoided"}),i.jsxs("span",{className:"text-amber",children:[le(pu)," tokens"]})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Reduction ratio"}),i.jsxs("span",{className:"text-emerald",children:[mu,"%"]})]})]}),i.jsxs("div",{className:"cost-panel glass-card",children:[i.jsxs("h3",{children:[i.jsx(Os,{size:16,className:"text-emerald"})," B. Cache efficiency"]}),i.jsxs("div",{className:"cost-hit-grid",children:[i.jsxs("div",{children:["Exact hits",i.jsx("strong",{className:"text-emerald",children:(s==null?void 0:s.exactCacheHits)??0})]}),i.jsxs("div",{children:["Semantic hits",i.jsx("strong",{className:"text-cyan",children:(s==null?void 0:s.semanticCacheHits)??0})]}),i.jsxs("div",{children:["Partial hits",i.jsx("strong",{className:"text-amber",children:(s==null?void 0:s.partialCacheHits)??0})]}),i.jsxs("div",{children:["Misses",i.jsx("strong",{className:"text-rose",children:(s==null?void 0:s.cacheMisses)??0})]})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Tokens served from cache"}),i.jsx("span",{className:"text-emerald",children:le((s==null?void 0:s.tokensServedFromCache)??0)})]})]}),i.jsxs("div",{className:"cost-panel glass-card",children:[i.jsxs("h3",{children:[i.jsx(cr,{size:16,className:"text-purple"})," C. Duplication prevention"]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Repeated reads prevented"}),i.jsx("span",{className:"text-emerald",children:(e==null?void 0:e.repeatedReadsPrevented)??0})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Overlapping scopes resolved"}),i.jsx("span",{className:"text-cyan",children:(a==null?void 0:a.overlappingScopesResolved)??0})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Always-on rule tokens"}),i.jsx("span",{children:le((a==null?void 0:a.alwaysOnRuleTokens)??0)})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Unused tools filtered"}),i.jsx("span",{className:"text-purple",children:(a==null?void 0:a.unusedToolsFiltered)??0})]})]}),i.jsxs("div",{className:"cost-panel glass-card",children:[i.jsxs("h3",{children:[i.jsx(Mc,{size:16,className:"text-amber"})," D. Checkpoint compression"]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Raw session state"}),i.jsx("span",{children:le((c==null?void 0:c.rawStateTokens)??0)})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Checkpoint packet size"}),i.jsxs("span",{className:"text-emerald",children:[le((c==null?void 0:c.checkpointTokens)??0),((c==null?void 0:c.compressionRatio)??0)>0?` (${c==null?void 0:c.compressionRatio}×)`:""]})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Observed model cost"}),i.jsxs("span",{className:"text-emerald",children:["$",vu.toFixed(2)]})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Estimated avoided spend"}),i.jsxs("span",{className:"text-amber",children:["$",yu.toFixed(2)]})]})]})]}),i.jsxs("div",{className:"cost-panel glass-card",children:[i.jsxs("h3",{children:[i.jsx(Q0,{size:16,className:"text-cyan"})," Context explainability"]}),i.jsxs("div",{className:"cost-explain-row",children:[i.jsx("label",{className:"sr-only",htmlFor:"context-explain-target",children:"File, service, or query"}),i.jsx("input",{id:"context-explain-target",type:"text",value:h,onChange:W=>y(W.target.value),placeholder:"File, service, or query (e.g. services/task)"}),i.jsx("button",{type:"button",className:"cost-primary",onClick:_,children:"Explain"})]}),d&&i.jsxs("div",{className:"cost-row",style:{flexDirection:"column",alignItems:"flex-start",gap:6},children:[i.jsxs("div",{children:["Target: ",i.jsx("strong",{children:d.fileOrService})," [",String(d.status||"").toUpperCase(),"]"]}),i.jsxs("div",{children:["Reason: ",d.reason]}),i.jsxs("div",{children:["Cache: ",i.jsx("span",{className:"text-cyan",children:d.cacheStatus})]})]})]}),i.jsxs("div",{className:"cost-panel glass-card",children:[i.jsxs("h3",{children:[i.jsx(fx,{size:16,className:"text-amber"})," Import observed model usage"]}),i.jsx("p",{className:"cost-panel-help",children:"Vendor-agnostic CSV/JSON import for actual token spend. Does not require any Admin API key."}),i.jsx("label",{className:"sr-only",htmlFor:"observed-usage-import",children:"Observed usage CSV or JSON"}),i.jsx("textarea",{id:"observed-usage-import",rows:4,value:g,onChange:W=>x(W.target.value),placeholder:`Date,Model,Input Tokens,Output Tokens,Cost
361
+ `),j={};let k=null,N=null;for(const T of S){if(T.startsWith("#")||!T.trim())continue;const R=T.search(/\S/),P=T.trim();if(R===0&&P.includes(":")){const[$]=P.split(":");k=$.trim(),N=null;const I=(v=P.split(":")[1])==null?void 0:v.trim();I&&I!=="{}"&&I!=="[]"?j[k]=isNaN(Number(I))?I:Number(I):j[k]={}}else if(R===2&&k&&P.includes(":")){const[$]=P.split(":");N=$.trim();const I=P.split(":").slice(1).join(":").trim();if(I&&I!=="{}"&&I!=="[]"){typeof j[k]!="object"&&(j[k]={});const Q=I==="true"?!0:I==="false"?!1:isNaN(Number(I))?I:Number(I);j[k][N]=Q}else typeof j[k]!="object"&&(j[k]={}),j[k][N]={}}else if(R===4&&k&&N&&P.includes(":")){const[$]=P.split(":"),I=P.split(":").slice(1).join(":").trim();typeof j[k][N]!="object"&&(j[k][N]={});const Q=I==="true"?!0:I==="false"?!1:isNaN(Number(I))?I:Number(I);j[k][N][$.trim()]=Q}}return j}catch{return{}}};w.useEffect(()=>{d()},[]);const h=(e==null?void 0:e.gates)||{};return i.jsxs("div",{className:"quality-gates",children:[i.jsxs("div",{className:"gates-header",children:[i.jsxs("div",{className:"gates-title",children:[i.jsx(ts,{size:24}),i.jsx("h2",{children:"Quality Gates"}),(e==null?void 0:e.preset)&&i.jsx("span",{className:"preset-badge",children:e.preset})]}),i.jsxs("div",{className:"gates-actions",children:[i.jsxs("div",{className:"view-toggle",children:[i.jsxs("button",{className:c==="visual"?"active":"",onClick:()=>u("visual"),children:[i.jsx(sn,{size:16})," Visual"]}),i.jsxs("button",{className:c==="raw"?"active":"",onClick:()=>u("raw"),children:[i.jsx(wt,{size:16})," YAML"]})]}),i.jsx("button",{className:"refresh-btn",onClick:d,disabled:a,children:i.jsx(qe,{size:16,className:a?"spinning":""})})]})]}),a?i.jsx("div",{className:"gates-loading",children:"Loading configuration..."}):c==="raw"?i.jsx("div",{className:"gates-raw",children:i.jsx("pre",{children:n})}):i.jsxs("div",{className:"gates-content",children:[i.jsxs("div",{className:"gate-section",children:[i.jsxs("div",{className:"section-header",children:[i.jsx(wt,{size:18}),i.jsx("h3",{children:"Code Quality"})]}),i.jsxs("div",{className:"gate-grid",children:[i.jsx(Z,{label:"Max File Lines",value:h.max_file_lines,icon:i.jsx(wt,{size:16})}),i.jsx(Z,{label:"Forbid TODOs",value:h.forbid_todos,icon:h.forbid_todos?i.jsx(Cs,{size:16}):i.jsx(Nt,{size:16})}),i.jsx(Z,{label:"Forbid FIXMEs",value:h.forbid_fixme,icon:h.forbid_fixme?i.jsx(Cs,{size:16}):i.jsx(Nt,{size:16})})]})]}),h.ast&&i.jsxs("div",{className:"gate-section",children:[i.jsxs("div",{className:"section-header",children:[i.jsx(nx,{size:18}),i.jsx("h3",{children:"AST Limits"})]}),i.jsxs("div",{className:"gate-grid",children:[i.jsx(Z,{label:"Complexity",value:h.ast.complexity}),i.jsx(Z,{label:"Max Methods",value:h.ast.max_methods}),i.jsx(Z,{label:"Max Params",value:h.ast.max_params}),i.jsx(Z,{label:"Max Nesting",value:h.ast.max_nesting}),i.jsx(Z,{label:"Max Function Lines",value:h.ast.max_function_lines}),i.jsx(Z,{label:"Max Inheritance",value:h.ast.max_inheritance_depth})]})]}),h.safety&&i.jsxs("div",{className:"gate-section",children:[i.jsxs("div",{className:"section-header",children:[i.jsx(wm,{size:18}),i.jsx("h3",{children:"File Guard"})]}),i.jsx("div",{className:"gate-grid",children:i.jsx(Z,{label:"Max Files/Cycle",value:h.safety.max_files_changed_per_cycle})}),h.safety.protected_paths&&h.safety.protected_paths.length>0&&i.jsxs("div",{className:"protected-paths",children:[i.jsx("h4",{children:"Protected Paths"}),i.jsx("div",{className:"path-list",children:h.safety.protected_paths.map((p,v)=>i.jsx("span",{className:"path-tag",children:p},v))})]})]}),h.required_files&&h.required_files.length>0&&i.jsxs("div",{className:"gate-section",children:[i.jsxs("div",{className:"section-header",children:[i.jsx(Ie,{size:18}),i.jsx("h3",{children:"Required Files"})]}),i.jsx("div",{className:"file-list",children:h.required_files.map((p,v)=>i.jsxs("div",{className:"file-item",children:[i.jsx(wt,{size:14}),i.jsx("span",{children:p})]},v))})]}),h.context&&i.jsxs("div",{className:"gate-section",children:[i.jsxs("div",{className:"section-header",children:[i.jsx(Qt,{size:18}),i.jsx("h3",{children:"Context Mining"})]}),i.jsxs("div",{className:"gate-grid",children:[i.jsx(Z,{label:"Enabled",value:h.context.enabled}),i.jsx(Z,{label:"Sensitivity",value:h.context.sensitivity}),i.jsx(Z,{label:"Mining Depth",value:h.context.mining_depth})]})]}),h.retry_loop_breaker&&i.jsxs("div",{className:"gate-section",children:[i.jsxs("div",{className:"section-header",children:[i.jsx(Sm,{size:18}),i.jsx("h3",{children:"Retry Loop Breaker"})]}),i.jsxs("div",{className:"gate-grid",children:[i.jsx(Z,{label:"Enabled",value:h.retry_loop_breaker.enabled}),i.jsx(Z,{label:"Max Retries",value:h.retry_loop_breaker.max_retries})]})]}),i.jsxs("div",{className:"gate-section",children:[i.jsxs("div",{className:"section-header",children:[i.jsx(Qt,{size:18}),i.jsx("h3",{children:"AI-Native Gates"})]}),i.jsxs("div",{className:"gate-grid",children:[i.jsx(Z,{label:"Duplication Drift",value:((y=h.duplication_drift)==null?void 0:y.enabled)??!0,icon:i.jsx(Nt,{size:16})}),i.jsx(Z,{label:"Hallucinated Imports",value:((g=h.hallucinated_imports)==null?void 0:g.enabled)??!0,icon:i.jsx(Ie,{size:16})}),i.jsx(Z,{label:"Error Handling",value:((x=h.inconsistent_error_handling)==null?void 0:x.enabled)??!0,icon:i.jsx(ts,{size:16})}),i.jsx(Z,{label:"Context Artifacts",value:((C=h.context_window_artifacts)==null?void 0:C.enabled)??!0,icon:i.jsx(sn,{size:16})}),i.jsx(Z,{label:"Async Safety",value:((m=h.promise_safety)==null?void 0:m.enabled)??!0,icon:i.jsx(Qt,{size:16})})]})]}),s&&i.jsxs("div",{className:"gate-section",children:[i.jsxs("div",{className:"section-header",children:[i.jsx(ts,{size:18}),i.jsx("h3",{children:"Latest Scores"})]}),i.jsxs("div",{className:"gate-grid",children:[s.score!==void 0&&i.jsx(Z,{label:"Overall Score",value:`${s.score}/100`}),s.ai_health_score!==void 0&&i.jsx(Z,{label:"AI Health",value:`${s.ai_health_score}/100`,icon:i.jsx(Qt,{size:16})}),s.structural_score!==void 0&&i.jsx(Z,{label:"Structural",value:`${s.structural_score}/100`,icon:i.jsx(sn,{size:16})})]}),s.severity_breakdown&&i.jsxs("div",{className:"severity-breakdown",children:[i.jsx("h4",{children:"Severity Breakdown"}),i.jsx("div",{className:"gate-grid",children:Object.entries(s.severity_breakdown).filter(([,p])=>p>0).map(([p,v])=>i.jsx(Z,{label:p.charAt(0).toUpperCase()+p.slice(1),value:v},p))})]}),s.provenance_breakdown&&i.jsxs("div",{className:"provenance-breakdown",children:[i.jsx("h4",{children:"Provenance Breakdown"}),i.jsx("div",{className:"gate-grid",children:Object.entries(s.provenance_breakdown).filter(([,p])=>p>0).map(([p,v])=>i.jsx(Z,{label:p,value:v},p))})]})]})]})]})},Z=({label:e,value:t,icon:n})=>{const r=typeof t=="boolean"?t?"Yes":"No":t??"N/A";return i.jsxs("div",{className:"gate-card",children:[n&&i.jsx("div",{className:"gate-icon",children:n}),i.jsxs("div",{className:"gate-info",children:[i.jsx("span",{className:"gate-value",children:r}),i.jsx("span",{className:"gate-label",children:e})]})]})},rk=({logs:e,onClearLogs:t,onSelectLog:n,selectedLog:r})=>{const[s,o]=w.useState(""),[a,l]=w.useState("all"),[c,u]=w.useState("all"),d=Ue.useMemo(()=>{const x={};return e.forEach(C=>{const m=C.requestId||C.id;x[m]?x[m]={...x[m],...C}:x[m]={...C}}),Object.values(x).sort((C,m)=>new Date(m.timestamp).getTime()-new Date(C.timestamp).getTime())},[e]),f=Ue.useMemo(()=>{const x=new Set;return d.forEach(C=>C.tool&&x.add(C.tool)),Array.from(x)},[d]),h=Ue.useMemo(()=>d.filter(x=>{var v;const C=!s||((v=x.tool)==null?void 0:v.toLowerCase().includes(s.toLowerCase()))||JSON.stringify(x.arguments||{}).toLowerCase().includes(s.toLowerCase()),m=a==="all"||x.status===a,p=c==="all"||x.tool===c;return C&&m&&p}),[d,s,a,c]),y=Ue.useMemo(()=>({total:d.length,success:d.filter(x=>x.status==="success").length,error:d.filter(x=>x.status==="error").length,pending:d.filter(x=>!x.status||x.status==="pending").length}),[d]),g=()=>{const x=JSON.stringify(h,null,2),C=new Blob([x],{type:"application/json"}),m=URL.createObjectURL(C),p=document.createElement("a");p.href=m,p.download=`rigour-audit-${new Date().toISOString().split("T")[0]}.json`,p.click()};return i.jsxs("div",{className:"audit-log",children:[i.jsxs("div",{className:"audit-header",children:[i.jsxs("div",{className:"audit-title",children:[i.jsx(Dt,{size:24}),i.jsx("h2",{children:"Audit Trail"}),i.jsxs("span",{className:"log-count",children:[h.length," events"]})]}),i.jsxs("div",{className:"audit-actions",children:[i.jsxs("button",{className:"btn-secondary",onClick:t,children:[i.jsx(km,{size:16})," Clear"]}),i.jsxs("button",{className:"btn-primary",onClick:g,children:[i.jsx(J0,{size:16})," Export"]})]})]}),i.jsxs("div",{className:"audit-stats",children:[i.jsxs("div",{className:"stat-pill",children:[i.jsx(Dt,{size:14}),i.jsxs("span",{children:[y.total," Total"]})]}),i.jsxs("div",{className:"stat-pill success",children:[i.jsx(Nt,{size:14}),i.jsxs("span",{children:[y.success," Success"]})]}),i.jsxs("div",{className:"stat-pill error",children:[i.jsx(Cs,{size:14}),i.jsxs("span",{children:[y.error," Failed"]})]}),i.jsxs("div",{className:"stat-pill pending",children:[i.jsx(Ie,{size:14}),i.jsxs("span",{children:[y.pending," Pending"]})]})]}),i.jsxs("div",{className:"audit-filters",children:[i.jsxs("div",{className:"search-box",children:[i.jsx(Rc,{size:16}),i.jsx("input",{type:"text",placeholder:"Search logs...",value:s,onChange:x=>o(x.target.value)})]}),i.jsxs("div",{className:"filter-box",children:[i.jsx(Ac,{size:16}),i.jsxs("select",{value:a,onChange:x=>l(x.target.value),children:[i.jsx("option",{value:"all",children:"All Status"}),i.jsx("option",{value:"success",children:"Success"}),i.jsx("option",{value:"error",children:"Error"}),i.jsx("option",{value:"pending",children:"Pending"})]})]}),i.jsxs("div",{className:"filter-box",children:[i.jsx(ro,{size:16}),i.jsxs("select",{value:c,onChange:x=>u(x.target.value),children:[i.jsx("option",{value:"all",children:"All Tools"}),f.map(x=>i.jsx("option",{value:x,children:x},x))]})]})]}),i.jsxs("div",{className:"audit-content",children:[i.jsx("div",{className:"log-list",children:h.length===0?i.jsxs("div",{className:"empty-state",children:[i.jsx(ro,{size:48}),i.jsx("h3",{children:"No Interactions Detected"}),i.jsx("p",{children:"Rigour tool calls will appear here in real-time."})]}):h.map(x=>i.jsxs("div",{className:`log-entry ${(r==null?void 0:r.id)===x.id?"active":""} ${x._rigour_report?"has-report":""}`,onClick:()=>n((r==null?void 0:r.id)===x.id?null:x),children:[i.jsxs("div",{className:"log-header",children:[i.jsx("span",{className:`status-dot ${x.status||"pending"}`}),i.jsx("span",{className:"log-tool",children:x.tool}),i.jsxs("span",{className:"log-time",children:[i.jsx(gr,{size:12}),new Date(x.timestamp).toLocaleTimeString()]}),x._rigour_report&&i.jsxs("span",{className:"report-badge",children:[i.jsx(ex,{size:12})," Report"]}),x.arbitrated&&i.jsx("span",{className:`arbitrated-badge ${x.decision}`,children:x.decision==="approve"?"Approved":"Rejected"}),i.jsx(cn,{size:14,className:"chevron"})]}),x.requestId&&i.jsxs("div",{className:"log-request-id",children:["ID: ",x.requestId.slice(0,12),"..."]})]},x.id))}),i.jsx("div",{className:"log-detail",children:r?i.jsx(sk,{log:r,onClose:()=>n(null)}):i.jsxs("div",{className:"detail-placeholder",children:[i.jsx(wt,{size:48}),i.jsx("p",{children:"Select a log entry to view details"})]})})]})]})},sk=({log:e,onClose:t})=>{var o,a,l,c,u,d,f;const n=!!e._rigour_report||["rigour_checkpoint","rigour_agent_register","rigour_handoff"].includes(e.tool),[r,s]=w.useState(n?"report":"args");return i.jsxs("div",{className:"log-detail-view",children:[i.jsxs("div",{className:"detail-header",children:[i.jsxs("div",{className:"detail-info",children:[i.jsxs("span",{className:`status-badge ${e.status||"pending"}`,children:[e.status==="success"?i.jsx(Nt,{size:14}):e.status==="error"?i.jsx(Cs,{size:14}):i.jsx(Ie,{size:14}),e.status||"pending"]}),i.jsx("h3",{children:e.tool})]}),i.jsx("button",{className:"close-btn",onClick:t,children:i.jsx(_c,{size:18})})]}),i.jsxs("div",{className:"detail-meta",children:[i.jsxs("div",{className:"meta-item",children:[i.jsx("span",{className:"meta-label",children:"Timestamp"}),i.jsx("span",{className:"meta-value",children:new Date(e.timestamp).toLocaleString()})]}),e.requestId&&i.jsxs("div",{className:"meta-item",children:[i.jsx("span",{className:"meta-label",children:"Request ID"}),i.jsx("span",{className:"meta-value mono",children:e.requestId})]})]}),n&&i.jsxs("div",{className:"detail-tabs",children:[i.jsx("button",{className:r==="report"?"active":"",onClick:()=>s("report"),children:e._rigour_report?"Verification Report":"Visualized Content"}),i.jsx("button",{className:r==="args"?"active":"",onClick:()=>s("args"),children:"Technical Arguments"})]}),i.jsx("div",{className:"detail-body",children:r==="args"?i.jsxs(i.Fragment,{children:[e.arguments&&i.jsxs("div",{className:"code-section",children:[i.jsx("h4",{children:"Arguments"}),i.jsx("pre",{children:JSON.stringify(e.arguments,null,2)})]}),e.error&&i.jsxs("div",{className:"error-section",children:[i.jsx("h4",{children:"Error"}),i.jsx("div",{className:"error-message",children:e.error})]})]}):i.jsx("div",{className:"verification-view",children:e.tool==="rigour_checkpoint"?i.jsxs("div",{className:"checkpoint-viz",children:[i.jsxs("div",{className:"viz-stats",children:[i.jsxs("div",{className:"viz-stat",children:[i.jsx("span",{className:"label",children:"Progress"}),i.jsxs("span",{className:"value",children:[((o=e.arguments)==null?void 0:o.progressPct)??0,"%"]})]}),i.jsxs("div",{className:"viz-stat",children:[i.jsx("span",{className:"label",children:"Quality"}),i.jsxs("span",{className:"value",style:{color:(((a=e.arguments)==null?void 0:a.qualityScore)??0)>=80?"#34d399":"#f87171"},children:[((l=e.arguments)==null?void 0:l.qualityScore)??0,"%"]})]})]}),i.jsxs("div",{className:"viz-summary",children:[i.jsx("h4",{children:"Summary of Work"}),i.jsx("p",{children:((c=e.arguments)==null?void 0:c.summary)||"No summary provided."})]}),((u=e.arguments)==null?void 0:u.filesChanged)&&e.arguments.filesChanged.length>0&&i.jsxs("div",{className:"viz-files",children:[i.jsx("h4",{children:"Files Changed"}),i.jsx("div",{className:"file-badges",children:e.arguments.filesChanged.map(h=>i.jsx("span",{className:"file-badge",children:h},h))})]})]}):e.tool==="rigour_agent_register"?i.jsxs("div",{className:"agent-viz",children:[i.jsx(Dt,{size:32,className:"viz-icon"}),i.jsx("h3",{children:"Agent Scope Claims"}),i.jsxs("div",{className:"scope-box",children:[i.jsx("h4",{children:"Claimed Scope:"}),i.jsx("div",{className:"scope-list",children:(f=(d=e.arguments)==null?void 0:d.taskScope)==null?void 0:f.map(h=>i.jsx("code",{children:h},h))})]})]}):i.jsxs("div",{className:"code-section",children:[i.jsx("h4",{children:"Rigour Report"}),i.jsx("pre",{children:JSON.stringify(e._rigour_report,null,2)})]})})})]})};function ik(e,t){return!e||!t?!1:e===t?!0:e.startsWith("task:")||t.startsWith("task:")?e===t:((r,s)=>r===s||r.startsWith(`${s}/`)||s.startsWith(`${r}/`))(e,t)}function ok(e){return e.startsWith("CTP-")?e.replace(/-task$/,""):e.length>28?`${e.slice(0,12)}…${e.slice(-8)}`:e}function ak({session:e}){if(!e||e.agents.length===0)return i.jsxs("div",{className:"empty-state glass-card",children:[i.jsx(jr,{size:48}),i.jsx("h3",{children:"No Active Agent Team"}),i.jsxs("p",{children:["Register agents with ",i.jsx("code",{children:"rigour_agent_register"}),", or Studio will derive recent agents from checkpoint metrics in the Brain DB."]}),i.jsx("div",{className:"hint-box",children:i.jsx("span",{children:"Works with any MCP client — Claude, Codex, Cursor, VS Code, and more."})})]});const t=!!e.derived||e.status==="completed",n=s=>{switch(s){case"active":return i.jsx(Ei,{size:10,fill:"#34d399",stroke:"#34d399"});case"idle":return i.jsx(Ei,{size:10,fill:"#fbbf24",stroke:"#fbbf24"});case"completed":return i.jsx(Nt,{size:14,color:"#34d399"});default:return i.jsx(Ei,{size:10})}},r=(s,o)=>t||s.status==="completed"?!1:o.filter(l=>l.agentId!==s.agentId&&l.status!=="completed").some(l=>s.taskScope.some(c=>l.taskScope.some(u=>ik(c,u))));return i.jsxs("div",{className:"agent-teams",children:[i.jsxs("div",{className:"panel-header",children:[i.jsxs("div",{className:"title",children:[i.jsx(jr,{size:18}),i.jsx("span",{children:"Agent Team Session"})]}),i.jsx("div",{className:`session-status ${e.status}`,children:e.status.toUpperCase()})]}),i.jsxs("div",{className:"session-info",children:[i.jsx("span",{className:"session-id",children:e.sessionId}),i.jsxs("span",{className:"agent-count",children:[e.agents.length," agents"]}),e.derived&&i.jsx("span",{className:"meta-chip",children:"Historical (derived)"})]}),i.jsx("div",{className:"agents-grid",children:e.agents.map(s=>{const o=r(s,e.agents);return i.jsxs("div",{className:`agent-card glass-card ${s.status} ${o?"has-conflict":""}`,children:[i.jsxs("div",{className:"agent-header",children:[i.jsxs("div",{className:"agent-id",children:[n(s.status),i.jsx("span",{title:s.agentId,children:ok(s.agentId)})]}),o&&i.jsxs("div",{className:"conflict-badge",children:[i.jsx(Ie,{size:12}),i.jsx("span",{children:"Scope Conflict"})]})]}),i.jsxs("div",{className:"task-scope",children:[i.jsx("h4",{children:"Enforced scope"}),i.jsx("ul",{children:s.taskScope.map((a,l)=>i.jsxs("li",{children:[i.jsx(Fs,{size:12}),i.jsx("code",{children:a})]},l))})]}),i.jsxs("div",{className:"agent-meta",children:[i.jsxs("span",{children:["Registered: ",new Date(s.registeredAt).toLocaleTimeString()]}),s.lastCheckpoint&&i.jsxs("span",{children:["Last checkpoint: ",new Date(s.lastCheckpoint).toLocaleTimeString()]})]}),i.jsx("div",{className:"mono dim agent-raw-id",children:s.agentId})]},s.agentId)})})]})}function lk({checkpoints:e}){if(!e||e.length===0)return i.jsxs("div",{className:"empty-state glass-card",children:[i.jsx(xr,{size:48}),i.jsx("h3",{children:"No Checkpoints Yet"}),i.jsxs("p",{children:["Checkpoints compress agent state for verified handoffs. Call ",i.jsx("code",{children:"rigour_checkpoint"})," before",i.jsx("code",{children:" rigour_handoff"}),". Quality below 80% should pause the loop."]}),i.jsx("div",{className:"hint-box",children:i.jsx("span",{children:"Default interval: 15 minutes"})})]});const t=s=>s>=80?"#34d399":s>=60?"#fbbf24":"#f87171",n=s=>{if(s===0)return null;const o=e[s-1].qualityScore,a=e[s].qualityScore;return a>o+5?i.jsx(Nm,{size:14,color:"#34d399"}):a<o-5?i.jsx(Dc,{size:14,color:"#f87171"}):null},r=e.some((s,o)=>{if(o<2)return!1;const a=e.slice(Math.max(0,o-2),o),l=a.reduce((c,u)=>c+u.qualityScore,0)/a.length;return s.qualityScore<l-10});return i.jsxs("div",{className:"checkpoint-timeline",children:[i.jsxs("div",{className:"panel-header",children:[i.jsxs("div",{className:"title",children:[i.jsx(xr,{size:18}),i.jsx("span",{children:"Checkpoint Timeline"})]}),i.jsxs("div",{className:"drift-visualization",children:[i.jsxs("svg",{width:"120",height:"30",viewBox:"0 0 120 30",className:"drift-sparkline",children:[i.jsx("path",{d:`M ${e.map((s,o)=>`${o/(e.length-1||1)*120} ${30-s.qualityScore/100*30}`).join(" L ")}`,fill:"none",stroke:"var(--accent-primary)",strokeWidth:"2",strokeLinecap:"round"}),e.map((s,o)=>i.jsx("circle",{cx:o/(e.length-1||1)*120,cy:30-s.qualityScore/100*30,r:"2",fill:t(s.qualityScore)},o))]}),i.jsx("span",{className:"drift-label",children:"Session Stability"})]}),r&&i.jsxs("div",{className:"drift-alert",children:[i.jsx(Ie,{size:14}),i.jsx("span",{children:"Drift Detected — quality dropped vs recent average"})]})]}),i.jsxs("div",{className:"timeline-container",children:[i.jsx("div",{className:"timeline-line"}),e.map((s,o)=>{var a;return i.jsxs("div",{className:`checkpoint-entry glass-card ${s.warnings.length>0||s.qualityScore<80?"has-warnings":""}`,children:[i.jsxs("div",{className:"checkpoint-marker",children:[i.jsx("div",{className:"marker-dot",style:{backgroundColor:t(s.qualityScore)}}),s.qualityScore<80&&i.jsx("div",{className:"marker-ring warn","aria-hidden":"true"})]}),i.jsxs("div",{className:"checkpoint-content",children:[i.jsxs("div",{className:"checkpoint-header",children:[i.jsx("span",{className:"checkpoint-summary-lead",children:((a=s.summary)==null?void 0:a.slice(0,80))||s.checkpointId}),i.jsx("span",{className:"checkpoint-time",children:new Date(s.timestamp).toLocaleTimeString()})]}),i.jsx("div",{className:"mono dim checkpoint-id",children:s.checkpointId}),s.qualityScore<80&&i.jsxs("div",{className:"warning-item",children:[i.jsx(Ie,{size:12}),i.jsx("span",{children:"Below threshold — pause handoffs until quality recovers"})]}),i.jsxs("div",{className:"checkpoint-stats",children:[i.jsxs("div",{className:"stat",children:[i.jsx("span",{className:"label",children:"Progress"}),i.jsx("div",{className:"progress-bar",children:i.jsx("div",{className:"progress-fill",style:{width:`${s.progressPct}%`}})}),i.jsxs("span",{className:"value",children:[s.progressPct,"%"]})]}),i.jsxs("div",{className:"stat",children:[i.jsx("span",{className:"label",children:"Quality"}),i.jsxs("span",{className:"value score",style:{color:t(s.qualityScore)},children:[s.qualityScore,"%",n(o)]})]}),i.jsxs("div",{className:"stat",children:[i.jsx("span",{className:"label",children:"Agent"}),i.jsx("span",{className:"value agent-id",children:s.agentId})]})]}),i.jsx("div",{className:"checkpoint-summary",children:i.jsx("p",{children:s.summary})}),s.filesChanged.length>0&&i.jsx("div",{className:"files-changed",children:i.jsxs("span",{className:"count",children:[s.filesChanged.length," files changed"]})}),s.warnings.length>0&&i.jsx("div",{className:"warnings",children:s.warnings.map((l,c)=>i.jsxs("div",{className:"warning-item",children:[i.jsx(Ie,{size:12}),i.jsx("span",{children:l})]},c))})]})]},s.checkpointId)})]})]})}const cy={critical:"var(--status-error)",high:"#f97316",medium:"var(--status-warning)",low:"var(--accent-primary)",info:"var(--text-dim)"},ck={srp_violation:"Single Responsibility",ocp_violation:"Open/Closed Principle",lsp_violation:"Liskov Substitution",isp_violation:"Interface Segregation",dip_violation:"Dependency Inversion",god_class:"God Class",god_function:"God Function",long_params:"Long Parameters",complex_conditional:"Complex Conditional",empty_catch:"Empty Catch Block",error_inconsistency:"Error Inconsistency",race_condition:"Race Condition",goroutine_leak:"Goroutine Leak",channel_misuse:"Channel Misuse",mutex_scope:"Mutex Scope",isp_violation_interface:"Interface Bloat",missing_test:"Missing Tests",long_file:"Long File",magic_number:"Magic Numbers",resource_leak:"Resource Leak",dry_violation:"DRY Violation",feature_envy:"Feature Envy",dead_code:"Dead Code",naming_convention:"Naming Convention",performance:"Performance"},rh={"SOLID Principles":["srp_violation","ocp_violation","lsp_violation","isp_violation","dip_violation"],"Code Smells":["god_class","god_function","long_params","complex_conditional","long_file","magic_number","dead_code","feature_envy"],"Error Handling":["empty_catch","error_inconsistency"],Concurrency:["race_condition","goroutine_leak","channel_misuse","mutex_scope"],Testing:["missing_test"],Architecture:["isp_violation_interface","dry_violation","naming_convention","resource_leak"],Performance:["performance"]},uk=()=>{const[e,t]=w.useState(null),[n,r]=w.useState(!0),[s,o]=w.useState(new Set),[a,l]=w.useState(new Set),[c,u]=w.useState("all"),[d,f]=w.useState(!1),h=async()=>{r(!0);try{const[j,k]=await Promise.all([fetch("/api/report-stats"),fetch("/api/deep-findings")]),N=j.ok?await j.json():{},T=k.ok?await k.json():[];t({...N,findings:T})}catch(j){console.error("Failed to fetch deep analysis data:",j)}r(!1)};w.useEffect(()=>{h()},[]);const y=j=>{o(k=>{const N=new Set(k);return N.has(j)?N.delete(j):N.add(j),N})},g=j=>{l(k=>{const N=new Set(k);return N.has(j)?N.delete(j):N.add(j),N})},x=((e==null?void 0:e.findings)||[]).filter(j=>j.provenance==="deep-analysis"),C=x.filter(j=>!(c!=="all"&&j.severity!==c||d&&!j.verified)),m=Object.entries(rh).map(([j,k])=>{const N=C.filter(T=>k.includes(T.category||""));return{group:j,findings:N}}).filter(j=>j.findings.length>0),p=Object.values(rh).flat(),v=C.filter(j=>!p.includes(j.category||"")),S=e==null?void 0:e.deep;return i.jsxs("div",{className:"deep-analysis",children:[i.jsxs("div",{className:"deep-header",children:[i.jsxs("div",{className:"deep-title",children:[i.jsx(at,{size:24}),i.jsx("h2",{children:"Deep Analysis"}),(S==null?void 0:S.tier)&&i.jsx("span",{className:"tier-badge",children:S.tier})]}),i.jsx("div",{className:"deep-actions",children:i.jsx("button",{className:"refresh-btn",onClick:h,disabled:n,children:i.jsx(qe,{size:16,className:n?"spinning":""})})})]}),n?i.jsx("div",{className:"deep-loading",children:"Loading deep analysis data..."}):!(S!=null&&S.enabled)&&x.length===0?i.jsxs("div",{className:"deep-empty",children:[i.jsx(at,{size:48}),i.jsx("h3",{children:"Deep Analysis Not Yet Run"}),i.jsxs("p",{children:["Run ",i.jsx("code",{children:"rigour check --deep"})," to get LLM-powered code quality analysis with 40+ categories."]}),i.jsxs("div",{className:"empty-features",children:[i.jsxs("div",{className:"feature",children:[i.jsx(ts,{size:16})," SOLID Principles"]}),i.jsxs("div",{className:"feature",children:[i.jsx(sn,{size:16})," Design Patterns"]}),i.jsxs("div",{className:"feature",children:[i.jsx(Qt,{size:16})," Concurrency Safety"]}),i.jsxs("div",{className:"feature",children:[i.jsx(dx,{size:16})," Architecture Quality"]})]})]}):i.jsxs(i.Fragment,{children:[i.jsxs("div",{className:"deep-stats-banner",children:[i.jsxs("div",{className:"stat-card",children:[i.jsx("span",{className:"stat-value",children:(S==null?void 0:S.findings_count)??x.length}),i.jsx("span",{className:"stat-label",children:"Findings"})]}),i.jsxs("div",{className:"stat-card",children:[i.jsx("span",{className:"stat-value",children:(S==null?void 0:S.findings_verified)??x.filter(j=>j.verified).length}),i.jsx("span",{className:"stat-label",children:"Verified"})]}),i.jsxs("div",{className:"stat-card",children:[i.jsx("span",{className:"stat-value",children:(S==null?void 0:S.files_analyzed)??"—"}),i.jsx("span",{className:"stat-label",children:"Files Analyzed"})]}),i.jsxs("div",{className:"stat-card",children:[i.jsx("span",{className:"stat-value",children:(S==null?void 0:S.model)||"—"}),i.jsx("span",{className:"stat-label",children:"Model"})]}),(S==null?void 0:S.total_ms)&&i.jsxs("div",{className:"stat-card",children:[i.jsxs("span",{className:"stat-value",children:[(S.total_ms/1e3).toFixed(1),"s"]}),i.jsx("span",{className:"stat-label",children:"Inference"})]})]}),((e==null?void 0:e.score)!==void 0||(e==null?void 0:e.code_quality_score)!==void 0)&&i.jsxs("div",{className:"deep-scores",children:[(e==null?void 0:e.score)!==void 0&&i.jsx(Ca,{label:"Overall",score:e.score}),(e==null?void 0:e.ai_health_score)!==void 0&&i.jsx(Ca,{label:"AI Health",score:e.ai_health_score}),(e==null?void 0:e.structural_score)!==void 0&&i.jsx(Ca,{label:"Structural",score:e.structural_score})]}),i.jsxs("div",{className:"deep-filters",children:[i.jsxs("div",{className:"filter-group",children:[i.jsx(Ac,{size:14}),i.jsxs("select",{value:c,onChange:j=>u(j.target.value),className:"filter-select",children:[i.jsx("option",{value:"all",children:"All Severities"}),i.jsx("option",{value:"critical",children:"Critical"}),i.jsx("option",{value:"high",children:"High"}),i.jsx("option",{value:"medium",children:"Medium"}),i.jsx("option",{value:"low",children:"Low"})]})]}),i.jsxs("button",{className:`filter-toggle ${d?"active":""}`,onClick:()=>f(!d),children:[i.jsx(Nt,{size:14}),"Verified Only"]}),i.jsxs("span",{className:"filter-count",children:[C.length," finding",C.length!==1?"s":""]})]}),i.jsxs("div",{className:"deep-findings",children:[m.map(({group:j,findings:k})=>i.jsxs("div",{className:"finding-group",children:[i.jsxs("button",{className:"group-header",onClick:()=>y(j),children:[s.has(j)?i.jsx(yr,{size:16}):i.jsx(cn,{size:16}),i.jsx("span",{className:"group-name",children:j}),i.jsx("span",{className:"group-count",children:k.length}),i.jsx("div",{className:"group-severity-dots",children:["critical","high","medium","low"].map(N=>{const T=k.filter(R=>R.severity===N).length;return T>0?i.jsx("span",{className:"sev-dot",style:{backgroundColor:cy[N]},title:`${T} ${N}`},N):null})})]}),s.has(j)&&i.jsx("div",{className:"group-findings",children:k.map(N=>i.jsx(sh,{finding:N,expanded:a.has(N.id),onToggle:()=>g(N.id)},N.id))})]},j)),v.length>0&&i.jsxs("div",{className:"finding-group",children:[i.jsxs("button",{className:"group-header",onClick:()=>y("_other"),children:[s.has("_other")?i.jsx(yr,{size:16}):i.jsx(cn,{size:16}),i.jsx("span",{className:"group-name",children:"Other Findings"}),i.jsx("span",{className:"group-count",children:v.length})]}),s.has("_other")&&i.jsx("div",{className:"group-findings",children:v.map(j=>i.jsx(sh,{finding:j,expanded:a.has(j.id),onToggle:()=>g(j.id)},j.id))})]}),C.length===0&&i.jsxs("div",{className:"no-findings",children:[i.jsx(Nt,{size:32}),i.jsx("p",{children:"No deep analysis findings match the current filters."})]})]})]})]})},sh=({finding:e,expanded:t,onToggle:n})=>{const r=cy[e.severity||"info"],s=ck[e.category||""]||e.category||"Unknown";return i.jsxs("div",{className:`finding-card severity-${e.severity||"info"}`,children:[i.jsxs("button",{className:"finding-header",onClick:n,children:[i.jsxs("div",{className:"finding-left",children:[i.jsx("span",{className:"severity-indicator",style:{backgroundColor:r}}),i.jsx("span",{className:"finding-title",children:e.title})]}),i.jsxs("div",{className:"finding-right",children:[i.jsx("span",{className:"category-tag",children:s}),e.verified&&i.jsxs("span",{className:"verified-badge",title:"AST-verified",children:[i.jsx(Nt,{size:12})," Verified"]}),e.confidence!==void 0&&i.jsxs("span",{className:"confidence-badge",title:`Confidence: ${(e.confidence*100).toFixed(0)}%`,children:[(e.confidence*100).toFixed(0),"%"]}),i.jsx("span",{className:"severity-badge",style:{color:r},children:e.severity||"info"}),t?i.jsx(yr,{size:14}):i.jsx(cn,{size:14})]})]}),t&&i.jsxs("div",{className:"finding-body",children:[i.jsx("p",{className:"finding-details",children:e.details}),e.hint&&i.jsxs("div",{className:"finding-hint",children:[i.jsx(Qt,{size:14}),i.jsx("span",{children:e.hint})]}),e.files&&e.files.length>0&&i.jsx("div",{className:"finding-files",children:e.files.map((o,a)=>i.jsxs("span",{className:"file-tag",children:[i.jsx(wt,{size:12}),o,e.line&&`:${e.line}`,e.endLine&&`-${e.endLine}`]},a))}),i.jsx("div",{className:"finding-meta",children:e.source&&i.jsxs("span",{className:"meta-tag",children:["Source: ",e.source]})})]})]})},Ca=({label:e,score:t})=>{const n=2*Math.PI*36,r=n-t/100*n,s=t>=80?"var(--status-success)":t>=60?"var(--status-warning)":"var(--status-error)";return i.jsxs("div",{className:"score-ring",children:[i.jsxs("svg",{width:"88",height:"88",viewBox:"0 0 88 88",children:[i.jsx("circle",{cx:"44",cy:"44",r:"36",fill:"none",stroke:"var(--border-dim)",strokeWidth:"6"}),i.jsx("circle",{cx:"44",cy:"44",r:"36",fill:"none",stroke:s,strokeWidth:"6",strokeDasharray:n,strokeDashoffset:r,strokeLinecap:"round",transform:"rotate(-90 44 44)",style:{transition:"stroke-dashoffset 0.8s ease"}}),i.jsx("text",{x:"44",y:"42",textAnchor:"middle",fill:"var(--text-main)",fontSize:"18",fontWeight:"700",children:t}),i.jsx("text",{x:"44",y:"56",textAnchor:"middle",fill:"var(--text-dim)",fontSize:"9",children:"/100"})]}),i.jsx("span",{className:"score-label",children:e})]})},uy={improving:{color:"#34d399",icon:Nm,label:"Improving"},stable:{color:"var(--accent-primary)",icon:ix,label:"Stable"},degrading:{color:"#f87171",icon:Dc,label:"Degrading"}};function dy({direction:e,zScore:t}){const n=uy[e],r=n.icon;return i.jsxs("span",{className:"direction-badge",style:{color:n.color,borderColor:n.color},children:[i.jsx(r,{size:14}),i.jsx("span",{children:n.label}),t!==void 0&&i.jsxs("span",{className:"z-score",children:["Z=",t.toFixed(1)]})]})}function hi({score:e,label:t,size:n=80}){const r=(n-8)/2,s=2*Math.PI*r,o=e/100*s,a=e>=80?"#34d399":e>=60?"#fbbf24":"#f87171";return i.jsxs("div",{className:"score-ring",style:{width:n,height:n+20},children:[i.jsxs("svg",{width:n,height:n,viewBox:`0 0 ${n} ${n}`,children:[i.jsx("circle",{cx:n/2,cy:n/2,r,fill:"none",stroke:"var(--bg-tertiary)",strokeWidth:"6"}),i.jsx("circle",{cx:n/2,cy:n/2,r,fill:"none",stroke:a,strokeWidth:"6",strokeDasharray:`${o} ${s-o}`,strokeDashoffset:s/4,strokeLinecap:"round",style:{transition:"stroke-dasharray 0.8s ease"}}),i.jsx("text",{x:n/2,y:n/2,textAnchor:"middle",dominantBaseline:"central",fill:"var(--text-primary)",fontSize:"16",fontWeight:"bold",children:Math.round(e)})]}),i.jsx("span",{className:"ring-label",children:t})]})}function dk({series:e,direction:t}){if(e.length<2)return null;const n=200,r=50,s=4,o=e.map(g=>g.ewma),a=Math.min(...o)-5,c=Math.max(...o)+5-a||1,u=e.map((g,x)=>{const C=s+x/(e.length-1)*(n-2*s),m=r-s-(g.ewma-a)/c*(r-2*s);return`${C},${m}`}),d=uy[t].color,f=s,h=s+(e.length-1)/(e.length-1)*(n-2*s),y=`M ${u[0]} L ${u.join(" L ")} L ${h},${r} L ${f},${r} Z`;return i.jsxs("svg",{width:n,height:r,className:"ewma-sparkline",children:[i.jsx("defs",{children:i.jsxs("linearGradient",{id:`grad-${t}`,x1:"0",y1:"0",x2:"0",y2:"1",children:[i.jsx("stop",{offset:"0%",stopColor:d,stopOpacity:"0.3"}),i.jsx("stop",{offset:"100%",stopColor:d,stopOpacity:"0.02"})]})}),i.jsx("path",{d:y,fill:`url(#grad-${t})`}),i.jsx("polyline",{points:u.join(" "),fill:"none",stroke:d,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),i.jsx("circle",{cx:parseFloat(u[u.length-1].split(",")[0]),cy:parseFloat(u[u.length-1].split(",")[1]),r:"3",fill:d})]})}function pi({name:e,icon:t,stream:n}){return i.jsxs("div",{className:"stream-card",children:[i.jsxs("div",{className:"stream-header",children:[i.jsxs("div",{className:"stream-name",children:[i.jsx(t,{size:16}),i.jsx("span",{children:e})]}),i.jsx(dy,{direction:n.direction,zScore:n.zScore})]}),i.jsxs("div",{className:"stream-body",children:[i.jsx(dk,{series:n.series,direction:n.direction}),i.jsxs("div",{className:"stream-stats",children:[i.jsxs("div",{className:"stat",children:[i.jsx("span",{className:"stat-label",children:"Current EWMA"}),i.jsx("span",{className:"stat-value",children:n.currentEWMA.toFixed(1)})]}),i.jsxs("div",{className:"stat",children:[i.jsx("span",{className:"stat-label",children:"Historical Avg"}),i.jsx("span",{className:"stat-value",children:n.historicalAvg.toFixed(1)})]})]})]})]})}function fk({monthly:e}){const[t,n]=w.useState(!0);return e.length===0?null:i.jsxs("div",{className:"monthly-section",children:[i.jsxs("button",{className:"section-toggle",onClick:()=>n(!t),children:[t?i.jsx(yr,{size:16}):i.jsx(cn,{size:16}),i.jsx(gm,{size:16}),i.jsx("span",{children:"Monthly Breakdown"})]}),t&&i.jsxs("table",{className:"monthly-table",children:[i.jsx("thead",{children:i.jsxs("tr",{children:[i.jsx("th",{children:"Month"}),i.jsx("th",{children:"Score"}),i.jsx("th",{children:"AI Health"}),i.jsx("th",{children:"Structural"}),i.jsx("th",{children:"Scans"}),i.jsx("th",{children:"AI Drift"}),i.jsx("th",{children:"Security"})]})}),i.jsx("tbody",{children:e.slice().reverse().map(r=>{const s=r.avgScore>=80?"#34d399":r.avgScore>=60?"#fbbf24":"#f87171";return i.jsxs("tr",{children:[i.jsx("td",{className:"month-cell",children:r.month}),i.jsx("td",{style:{color:s,fontWeight:600},children:r.avgScore.toFixed(0)}),i.jsx("td",{children:r.avgAiHealth.toFixed(0)}),i.jsx("td",{children:r.avgStructural.toFixed(0)}),i.jsx("td",{className:"dim",children:r.scanCount}),i.jsx("td",{className:"dim",children:r.provenanceBreakdown.aiDrift}),i.jsx("td",{className:"dim",children:r.provenanceBreakdown.security})]},r.month)})})]})]})}function hk(){const[e,t]=w.useState(null),[n,r]=w.useState(!0),[s,o]=w.useState(null),a=async()=>{r(!0),o(null);try{const l=await fetch("/api/drift");if(!l.ok)throw new Error(`HTTP ${l.status}`);const c=await l.json();c&&c.totalScans>0?t(c):t(null)}catch(l){o(l.message)}finally{r(!1)}};return w.useEffect(()=>{a()},[]),n?i.jsxs("div",{className:"empty-state",children:[i.jsx(qe,{size:48,className:"spin"}),i.jsx("h3",{children:"Analyzing Temporal Drift..."}),i.jsx("p",{children:"Reading scan history from SQLite brain."})]}):s?i.jsxs("div",{className:"empty-state",children:[i.jsx(Ie,{size:48}),i.jsx("h3",{children:"Drift Analysis Unavailable"}),i.jsx("p",{children:s}),i.jsx("button",{className:"retry-btn",onClick:a,children:"Retry"})]}):e?i.jsxs("div",{className:"temporal-drift",children:[i.jsxs("div",{className:"panel-header",children:[i.jsxs("div",{className:"title",children:[i.jsx(Dt,{size:18}),i.jsx("span",{children:"Temporal Drift Engine"}),i.jsx("span",{className:"badge",children:"v5 EWMA"})]}),i.jsx("button",{className:"refresh-btn",onClick:a,title:"Refresh",children:i.jsx(qe,{size:16})})]}),i.jsxs("div",{className:`drift-banner drift-${e.overallDirection}`,children:[i.jsxs("div",{className:"banner-main",children:[i.jsx(dy,{direction:e.overallDirection,zScore:e.overallZScore}),i.jsx("span",{className:"banner-repo",children:e.repo}),i.jsxs("span",{className:"banner-meta",children:[e.totalScans," scans over ",e.timeSpanDays," days"]})]}),e.latestScanAnomaly.isAnomaly&&i.jsxs("div",{className:"anomaly-alert",children:[i.jsx(Ie,{size:14}),i.jsx("span",{children:e.latestScanAnomaly.message})]})]}),i.jsxs("div",{className:"score-rings-row",children:[i.jsx(hi,{score:e.streams.overall.currentEWMA,label:"Overall"}),i.jsx(hi,{score:e.streams.aiDrift.currentEWMA,label:"AI Health"}),i.jsx(hi,{score:e.streams.structural.currentEWMA,label:"Structural"}),i.jsx(hi,{score:e.streams.security.currentEWMA,label:"Security"})]}),i.jsxs("div",{className:"streams-grid",children:[i.jsx(pi,{name:"AI Drift",icon:at,stream:e.streams.aiDrift}),i.jsx(pi,{name:"Structural",icon:Qt,stream:e.streams.structural}),i.jsx(pi,{name:"Security",icon:ts,stream:e.streams.security}),i.jsx(pi,{name:"Overall",icon:Dt,stream:e.streams.overall})]}),i.jsx(fk,{monthly:e.monthly}),i.jsxs("div",{className:"narrative-section",children:[i.jsxs("div",{className:"narrative-header",children:[i.jsx(gr,{size:16}),i.jsx("span",{children:"Analysis Narrative"})]}),i.jsx("pre",{className:"narrative-text",children:e.narrative})]})]}):i.jsxs("div",{className:"empty-state",children:[i.jsx(Dt,{size:48}),i.jsx("h3",{children:"Not Enough Data"}),i.jsxs("p",{children:["Run at least 3 scans with ",i.jsx("code",{children:"rigour check"})," to see temporal drift analysis."]}),i.jsx("div",{className:"hint-box",children:i.jsx("span",{children:"Drift detection uses EWMA + Z-score anomaly detection across per-provenance streams."})})]})}function pk(){var xu,ju,wu,Su;const[e,t]=w.useState(null),[n,r]=w.useState(null),[s,o]=w.useState(null),[a,l]=w.useState(null),[c,u]=w.useState(null),[d,f]=w.useState(null),[h,y]=w.useState("services/task"),[g,x]=w.useState(""),[C,m]=w.useState(null),[p,v]=w.useState(""),[S,j]=w.useState(!1),[k,N]=w.useState(),[T,R]=w.useState("none"),[P,$]=w.useState(0),[I,Q]=w.useState(!1),[he,L]=w.useState(null),[B,H]=w.useState(!1),[A,z]=w.useState(!0),V=async()=>{z(!0);try{const[W,Y,my,vy,yy,Ze]=await Promise.all([fetch("/api/context-stats").then(ct=>ct.json()),fetch("/api/task-cost").then(ct=>ct.json()),fetch("/api/cache-stats").then(ct=>ct.json()),fetch("/api/context-scope").then(ct=>ct.json()),fetch("/api/checkpoint-metrics").then(ct=>ct.json()),fetch("/api/cursor-api-key/status").then(ct=>ct.json())]);t(W),r(Y),o(my),l(vy),u(yy),j(!!(Ze!=null&&Ze.configured)),N(Ze==null?void 0:Ze.hint),R((Ze==null?void 0:Ze.source)||"none"),$(Number((Ze==null?void 0:Ze.importedCount)??0))}catch(W){console.error("Failed to fetch cost & context telemetry",W)}finally{z(!1)}};w.useEffect(()=>{V()},[]);const _=async()=>{if(h)try{const W=await fetch(`/api/context-explain?target=${encodeURIComponent(h)}`);f(await W.json())}catch(W){console.error("Failed to get context explanation",W)}},E=async()=>{if(g.trim())try{const Y=await(await fetch("/api/import-cursor-usage",{method:"POST",headers:{"Content-Type":"text/plain"},body:g})).json();Y.success?(m(`Imported ${Y.importedCount} observed usage record(s).`),x(""),V()):m(`Import failed: ${Y.error}`)}catch(W){m(`Import failed: ${W.message}`)}},b=async()=>{if(p.trim()){Q(!0),L(null);try{const Y=await(await fetch("/api/cursor-api-key",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:p.trim()})})).json();Y.success?(j(!0),v(""),N(Y.hint),R(Y.source||"file"),$(Number(Y.importedCount??0)),L(Y.syncError?`Key saved locally. Initial sync failed: ${Y.syncError}`:`Vendor key saved locally. Imported ${Y.importedCount??0} usage event(s).`),V()):L(`Save failed: ${Y.error}`)}catch(W){L(`Save failed: ${W.message}`)}finally{Q(!1)}}},G=async()=>{Q(!0),L(null);try{const Y=await(await fetch("/api/cursor-api-key",{method:"DELETE"})).json();Y.success?(j(!!Y.configured),N(Y.hint),R(Y.source||"none"),L(Y.configured?"Removed file key. Env key still active.":"Removed local vendor key.")):L(`Remove failed: ${Y.error}`)}catch(W){L(`Remove failed: ${W.message}`)}finally{Q(!1)}},ae=async()=>{Q(!0),L(null);try{const Y=await(await fetch("/api/cursor-sync",{method:"POST"})).json();Y.success?($(Number(Y.importedCount??0)),L(`Synced ${Y.importedCount??0} new usage event(s).`),V()):L(`Sync failed: ${Y.error||"Unknown error"}`)}catch(W){L(`Sync failed: ${W.message}`)}finally{Q(!1)}},le=W=>W?W>=1e6?`${(W/1e6).toFixed(2)}M`:W>=1e3?`${(W/1e3).toFixed(1)}K`:W.toString():"0",lt=(e==null?void 0:e.candidateTokens)??0,be=(e==null?void 0:e.returnedTokens)??0,pu=(e==null?void 0:e.potentialAvoidedTokens)??0,mu=lt>0?((lt-be)/lt*100).toFixed(1):"0.0",fy=s!=null&&s.hitRate?Math.round(s.hitRate*100):0,vu=((xu=n==null?void 0:n.actual)==null?void 0:xu.costUsd)??0,yu=((ju=n==null?void 0:n.estimated)==null?void 0:ju.estimatedCostAvoidedUsd)??0,gu=((wu=n==null?void 0:n.actual)==null?void 0:wu.inputTokens)??0,hy=((Su=n==null?void 0:n.actual)==null?void 0:Su.source)||"No usage data",py=((e==null?void 0:e.retrievals)??0)>0||gu>0||((s==null?void 0:s.exactCacheHits)??0)+((s==null?void 0:s.semanticCacheHits)??0)+((s==null?void 0:s.partialCacheHits)??0)+((s==null?void 0:s.cacheMisses)??0)>0||((c==null?void 0:c.checkpointCount)??0)>0;return i.jsxs("div",{className:"cost-context-view",children:[i.jsxs("div",{className:"cost-header",children:[i.jsxs("div",{children:[i.jsxs("h2",{children:[i.jsx(Qt,{size:20,className:"text-amber"}),"Token Savings & Context Efficiency"]}),i.jsx("p",{children:"Rigour-measured avoided context vs optional observed model usage (kept separate on purpose)."})]}),i.jsx("div",{className:"cost-toolbar",children:i.jsxs("button",{type:"button",onClick:V,"aria-label":"Refresh cost and context stats",children:[i.jsx(qe,{size:14,className:A?"spinning":""})," Refresh"]})})]}),!py&&!A&&i.jsxs("div",{className:"cost-banner",children:[i.jsx(Ns,{size:18,className:"text-amber"}),i.jsxs("div",{children:[i.jsx("strong",{children:"No telemetry recorded yet"}),i.jsxs("p",{children:["Use Rigour MCP tools (",i.jsx("code",{children:"rigour_context_scope"}),", ",i.jsx("code",{children:"rigour_checkpoint"}),") or import observed usage below."]})]})]}),i.jsxs("div",{className:"cost-kpi-grid",children:[i.jsxs("div",{className:"cost-kpi-card glass-card",children:[i.jsx("div",{className:"label",children:"Actual model tokens"}),i.jsx("div",{className:"value",children:le(gu)}),i.jsxs("div",{className:"meta text-emerald",children:["Observed via ",hy]})]}),i.jsxs("div",{className:"cost-kpi-card glass-card",children:[i.jsx("div",{className:"label",children:"Potential context avoided"}),i.jsx("div",{className:"value text-amber",children:le(pu)}),i.jsxs("div",{className:"meta",children:["Reduction ratio: ",mu,"%"]})]}),i.jsxs("div",{className:"cost-kpi-card glass-card",children:[i.jsx("div",{className:"label",children:"Cache hit rate"}),i.jsxs("div",{className:"value text-cyan",children:[fy,"%"]}),i.jsx("div",{className:"meta",children:"static & semantic layers"})]}),i.jsxs("div",{className:"cost-kpi-card glass-card",children:[i.jsx("div",{className:"label",children:"Actual vs avoided cost"}),i.jsxs("div",{className:"value",children:[i.jsxs("span",{className:"text-emerald",children:["$",vu.toFixed(2)]})," / ",i.jsxs("span",{className:"text-amber",children:["$",yu.toFixed(2)]})]}),i.jsx("div",{className:"meta",children:"Actual spend / est. avoided"})]})]}),i.jsxs("div",{className:"cost-panel-grid",children:[i.jsxs("div",{className:"cost-panel glass-card",children:[i.jsxs("h3",{children:[i.jsx(sn,{size:16,className:"text-cyan"})," A. Retrieval efficiency"]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Candidates scanned"}),i.jsxs("span",{children:[le(lt)," tokens"]})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Context returned"}),i.jsxs("span",{className:"text-cyan",children:[le(be)," tokens"]})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Potential avoided"}),i.jsxs("span",{className:"text-amber",children:[le(pu)," tokens"]})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Reduction ratio"}),i.jsxs("span",{className:"text-emerald",children:[mu,"%"]})]})]}),i.jsxs("div",{className:"cost-panel glass-card",children:[i.jsxs("h3",{children:[i.jsx(Os,{size:16,className:"text-emerald"})," B. Cache efficiency"]}),i.jsxs("div",{className:"cost-hit-grid",children:[i.jsxs("div",{children:["Exact hits",i.jsx("strong",{className:"text-emerald",children:(s==null?void 0:s.exactCacheHits)??0})]}),i.jsxs("div",{children:["Semantic hits",i.jsx("strong",{className:"text-cyan",children:(s==null?void 0:s.semanticCacheHits)??0})]}),i.jsxs("div",{children:["Partial hits",i.jsx("strong",{className:"text-amber",children:(s==null?void 0:s.partialCacheHits)??0})]}),i.jsxs("div",{children:["Misses",i.jsx("strong",{className:"text-rose",children:(s==null?void 0:s.cacheMisses)??0})]})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Tokens served from cache"}),i.jsx("span",{className:"text-emerald",children:le((s==null?void 0:s.tokensServedFromCache)??0)})]})]}),i.jsxs("div",{className:"cost-panel glass-card",children:[i.jsxs("h3",{children:[i.jsx(cr,{size:16,className:"text-purple"})," C. Duplication prevention"]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Repeated reads prevented"}),i.jsx("span",{className:"text-emerald",children:(e==null?void 0:e.repeatedReadsPrevented)??0})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Overlapping scopes resolved"}),i.jsx("span",{className:"text-cyan",children:(a==null?void 0:a.overlappingScopesResolved)??0})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Always-on rule tokens"}),i.jsx("span",{children:le((a==null?void 0:a.alwaysOnRuleTokens)??0)})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Unused tools filtered"}),i.jsx("span",{className:"text-purple",children:(a==null?void 0:a.unusedToolsFiltered)??0})]})]}),i.jsxs("div",{className:"cost-panel glass-card",children:[i.jsxs("h3",{children:[i.jsx(Mc,{size:16,className:"text-amber"})," D. Checkpoint compression"]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Raw session state"}),i.jsx("span",{children:le((c==null?void 0:c.rawStateTokens)??0)})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Checkpoint packet size"}),i.jsxs("span",{className:"text-emerald",children:[le((c==null?void 0:c.checkpointTokens)??0),((c==null?void 0:c.compressionRatio)??0)>0?` (${c==null?void 0:c.compressionRatio}×)`:""]})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Observed model cost"}),i.jsxs("span",{className:"text-emerald",children:["$",vu.toFixed(2)]})]}),i.jsxs("div",{className:"cost-row",children:[i.jsx("span",{children:"Estimated avoided spend"}),i.jsxs("span",{className:"text-amber",children:["$",yu.toFixed(2)]})]})]})]}),i.jsxs("div",{className:"cost-panel glass-card",children:[i.jsxs("h3",{children:[i.jsx(Q0,{size:16,className:"text-cyan"})," Context explainability"]}),i.jsxs("div",{className:"cost-explain-row",children:[i.jsx("label",{className:"sr-only",htmlFor:"context-explain-target",children:"File, service, or query"}),i.jsx("input",{id:"context-explain-target",type:"text",value:h,onChange:W=>y(W.target.value),placeholder:"File, service, or query (e.g. services/task)"}),i.jsx("button",{type:"button",className:"cost-primary",onClick:_,children:"Explain"})]}),d&&i.jsxs("div",{className:"cost-row",style:{flexDirection:"column",alignItems:"flex-start",gap:6},children:[i.jsxs("div",{children:["Target: ",i.jsx("strong",{children:d.fileOrService})," [",String(d.status||"").toUpperCase(),"]"]}),i.jsxs("div",{children:["Reason: ",d.reason]}),i.jsxs("div",{children:["Cache: ",i.jsx("span",{className:"text-cyan",children:d.cacheStatus})]})]})]}),i.jsxs("div",{className:"cost-panel glass-card",children:[i.jsxs("h3",{children:[i.jsx(fx,{size:16,className:"text-amber"})," Import observed model usage"]}),i.jsx("p",{className:"cost-panel-help",children:"Vendor-agnostic CSV/JSON import for actual token spend. Does not require any Admin API key."}),i.jsx("label",{className:"sr-only",htmlFor:"observed-usage-import",children:"Observed usage CSV or JSON"}),i.jsx("textarea",{id:"observed-usage-import",rows:4,value:g,onChange:W=>x(W.target.value),placeholder:`Date,Model,Input Tokens,Output Tokens,Cost
362
362
  2026-08-05,claude-3-5-sonnet,510000,62000,4.83`,style:{marginBottom:10}}),i.jsxs("div",{className:"cost-actions",children:[i.jsx("button",{type:"button",className:"cost-primary",onClick:E,children:"Import usage data"}),C&&i.jsx("span",{role:"alert",className:C.includes("failed")?"text-rose":"text-emerald",style:{fontSize:"0.78rem"},children:C})]})]}),i.jsxs("div",{className:"cost-panel glass-card vendor-adapters",children:[i.jsxs("button",{type:"button",className:"vendor-adapters-toggle",onClick:()=>H(W=>!W),"aria-expanded":B,children:[i.jsxs("span",{children:[i.jsx(sx,{size:16,className:"text-cyan"})," Vendor adapters"]}),i.jsx(yr,{size:16,className:B?"rotated":""})]}),B&&i.jsxs("div",{className:"vendor-adapters-body",children:[i.jsx("h4",{children:"Cursor Admin API (optional)"}),i.jsxs("p",{className:"cost-panel-help",children:["Optional verification for teams that already use Cursor Admin API. Rigour does not require this. Prefer ",i.jsx("code",{children:"RIGOUR_CURSOR_API_KEY"})," or ",i.jsx("code",{children:"CURSOR_ADMIN_API_KEY"})," in the environment. File storage stays on this machine only (",i.jsx("code",{children:"~/.rigour/settings.json"}),", mode 600)."]}),i.jsx("p",{className:"cost-panel-help",children:S?`Configured${k?` (${k})`:""} via ${T}.${P>0?` ${P} event(s) imported.`:""}`:"No vendor key configured."}),i.jsxs("div",{className:"cost-actions",style:{marginBottom:8},children:[i.jsx("label",{className:"sr-only",htmlFor:"cursor-vendor-key",children:"Cursor Admin API key"}),i.jsx("input",{id:"cursor-vendor-key",type:"password",autoComplete:"off",value:p,onChange:W=>v(W.target.value),placeholder:"Paste key only if not using env",disabled:I}),i.jsx("button",{type:"button",className:"cost-primary",onClick:b,disabled:I||!p.trim(),children:I?"Saving…":"Save key"}),i.jsxs("button",{type:"button",onClick:ae,disabled:I||!S,"aria-label":"Sync Cursor usage",children:[i.jsx(qe,{size:14,className:I?"spinning":""}),"Sync"]}),i.jsxs("button",{type:"button",onClick:G,disabled:I||T==="env"||!S,"aria-label":"Remove local Cursor API key",title:T==="env"?"Remove env var in your shell":"Remove file key",children:[i.jsx(km,{size:14}),"Remove"]})]}),he&&i.jsx("span",{role:"alert",className:he.includes("failed")?"text-rose":"text-emerald",style:{fontSize:"0.78rem"},children:he})]})]})]})}function yn(e){const t=e??0;return t>=1e6?`${(t/1e6).toFixed(2)}M`:t>=1e3?`${(t/1e3).toFixed(1)}K`:String(t)}function mk({onNavigate:e}){var g,x,C,m,p,v,S,j,k,N,T,R,P,$,I,Q,he,L,B,H,A,z,V;const[t,n]=w.useState(null),[r,s]=w.useState(!0),[o,a]=w.useState(null),l=async()=>{s(!0),a(null);try{const _=await fetch("/api/overview");if(!_.ok)throw new Error(`HTTP ${_.status}`);const E=await _.json();if(E.error)throw new Error(E.error);n(E)}catch(_){a(_.message||"Failed to load overview")}finally{s(!1)}};w.useEffect(()=>{l()},[]);const c=((g=t==null?void 0:t.context)==null?void 0:g.potentialAvoidedTokens)??0,u=((x=t==null?void 0:t.context)==null?void 0:x.checkpointReplayAvoided)??0,d=Math.round((((C=t==null?void 0:t.cache)==null?void 0:C.hitRate)??0)*100),f=((p=(m=t==null?void 0:t.cost)==null?void 0:m.actual)==null?void 0:p.costUsd)??0,h=((S=(v=t==null?void 0:t.cost)==null?void 0:v.estimated)==null?void 0:S.estimatedCostAvoidedUsd)??0,y=(((j=t==null?void 0:t.context)==null?void 0:j.retrievals)??0)>0||((t==null?void 0:t.checkpointCount)??0)>0||((t==null?void 0:t.memoryCount)??0)>0||(((N=(k=t==null?void 0:t.cost)==null?void 0:k.actual)==null?void 0:N.inputTokens)??0)>0;return i.jsxs("div",{className:"overview-view",children:[i.jsxs("div",{className:"overview-header",children:[i.jsxs("div",{children:[i.jsxs("h2",{children:[i.jsx(jm,{size:22}),"Governance Overview"]}),i.jsx("p",{className:"overview-dek",children:"Local governance signal — measured context avoided, cache hits, checkpoints. Spend is observed; avoided $ is always an estimate."})]}),i.jsxs("button",{className:"refresh-btn",onClick:l,disabled:r,type:"button",children:[i.jsx(qe,{size:16,className:r?"spinning":""}),"Refresh"]})]}),o&&i.jsxs("div",{className:"overview-banner warn",children:[i.jsx(Ns,{size:18}),i.jsxs("div",{children:[i.jsx("strong",{children:"Could not load telemetry"}),i.jsxs("p",{children:[o,". Confirm Studio is serving ",i.jsx("code",{children:"/api/overview"})," on the same port as the UI."]})]})]}),!o&&!r&&!y&&i.jsxs("div",{className:"overview-banner warn",children:[i.jsx(Ns,{size:18}),i.jsxs("div",{children:[i.jsx("strong",{children:"No agent telemetry yet"}),i.jsxs("p",{children:["Run agents with Rigour MCP (",i.jsx("code",{children:"rigour_recall"}),", ",i.jsx("code",{children:"rigour_context_scope"}),","," ",i.jsx("code",{children:"rigour_checkpoint"}),") or import observed usage under Cost & Context."]})]})]}),i.jsxs("div",{className:"overview-kpi-grid",children:[i.jsxs("button",{type:"button",className:"overview-kpi",onClick:()=>e("cost"),children:[i.jsx("span",{className:"kpi-label",children:"Context avoided"}),i.jsx("span",{className:"kpi-value amber",children:yn(c+u)}),i.jsx("span",{className:"kpi-meta",children:"retrieval + checkpoint replay"})]}),i.jsxs("button",{type:"button",className:"overview-kpi",onClick:()=>e("cost"),children:[i.jsx("span",{className:"kpi-label",children:"Cache hit rate"}),i.jsxs("span",{className:"kpi-value cyan",children:[d,"%"]}),i.jsxs("span",{className:"kpi-meta",children:[((T=t==null?void 0:t.cache)==null?void 0:T.exactCacheHits)??0," exact · ",((R=t==null?void 0:t.cache)==null?void 0:R.semanticCacheHits)??0," semantic"]})]}),i.jsxs("button",{type:"button",className:"overview-kpi",onClick:()=>e("checkpoints"),children:[i.jsx("span",{className:"kpi-label",children:"Checkpoints"}),i.jsx("span",{className:"kpi-value",children:(t==null?void 0:t.checkpointCount)??0}),i.jsx("span",{className:"kpi-meta",children:(P=t==null?void 0:t.checkpointSummary)!=null&&P.compressionRatio?`${t.checkpointSummary.compressionRatio}× avg compression`:"from Brain DB"})]}),i.jsxs("button",{type:"button",className:"overview-kpi",onClick:()=>e("cost"),children:[i.jsx("span",{className:"kpi-label",children:"Observed spend / est. avoided"}),i.jsxs("span",{className:"kpi-value",children:["$",f.toFixed(2),i.jsxs("span",{className:"kpi-split",children:[" / $",h.toFixed(2)]})]}),i.jsx("span",{className:"kpi-meta",children:(((I=($=t==null?void 0:t.cost)==null?void 0:$.actual)==null?void 0:I.source)||"no usage source")+" · avoided $ is estimated"})]})]}),i.jsxs("div",{className:"overview-panels",children:[i.jsxs("section",{className:"overview-card",children:[i.jsxs("header",{children:[i.jsx(Dt,{size:16}),i.jsx("h3",{children:"Live signal"})]}),i.jsxs("dl",{className:"overview-dl",children:[i.jsxs("div",{children:[i.jsx("dt",{children:"Context retrievals"}),i.jsx("dd",{children:((Q=t==null?void 0:t.context)==null?void 0:Q.retrievals)??0})]}),i.jsxs("div",{children:[i.jsx("dt",{children:"Candidate → returned"}),i.jsxs("dd",{children:[yn((he=t==null?void 0:t.context)==null?void 0:he.candidateTokens)," →"," ",yn((L=t==null?void 0:t.context)==null?void 0:L.returnedTokens)]})]}),i.jsxs("div",{children:[i.jsx("dt",{children:"Project events"}),i.jsx("dd",{children:((t==null?void 0:t.eventCount)??0).toLocaleString()})]}),i.jsxs("div",{children:[i.jsx("dt",{children:"Tokens from cache"}),i.jsx("dd",{children:yn((B=t==null?void 0:t.cache)==null?void 0:B.tokensServedFromCache)})]})]}),i.jsxs("button",{type:"button",className:"overview-link",onClick:()=>e("audit"),children:["Open audit log ",i.jsx(Yn,{size:14})]})]}),i.jsxs("section",{className:"overview-card",children:[i.jsxs("header",{children:[i.jsx(at,{size:16}),i.jsx("h3",{children:"How Rigour learns"})]}),i.jsxs("p",{className:"overview-learn-note",children:["Memory = stable facts agents wrote via ",i.jsx("code",{children:"rigour_remember"}),". Patterns = indexed symbols from scans (not a full training log). Enforcement + checkpoints show live governance learning."]}),i.jsxs("dl",{className:"overview-dl",children:[i.jsxs("div",{children:[i.jsx("dt",{children:"Memories"}),i.jsxs("dd",{children:[(t==null?void 0:t.memoryCount)??0,(H=t==null?void 0:t.memorySources)!=null&&H.length?` (${t.memorySources.join(" + ")})`:""]})]}),i.jsxs("div",{children:[i.jsx("dt",{children:"Pattern index"}),i.jsxs("dd",{children:[(t==null?void 0:t.patternCount)??0," patterns / ",(t==null?void 0:t.patternFiles)??0," files"]})]})]}),i.jsxs("div",{className:"overview-actions",children:[i.jsxs("button",{type:"button",className:"overview-link",onClick:()=>e("memory"),children:["Memory bank ",i.jsx(Yn,{size:14})]}),i.jsxs("button",{type:"button",className:"overview-link",onClick:()=>e("patterns"),children:["Patterns ",i.jsx(Yn,{size:14})]})]})]}),i.jsxs("section",{className:"overview-card",children:[i.jsxs("header",{children:[i.jsx(xr,{size:16}),i.jsx("h3",{children:"Checkpoint compression"})]}),i.jsxs("dl",{className:"overview-dl",children:[i.jsxs("div",{children:[i.jsx("dt",{children:"Raw session state"}),i.jsx("dd",{children:yn((A=t==null?void 0:t.checkpointSummary)==null?void 0:A.rawStateTokens)})]}),i.jsxs("div",{children:[i.jsx("dt",{children:"Checkpoint packets"}),i.jsx("dd",{children:yn((z=t==null?void 0:t.checkpointSummary)==null?void 0:z.checkpointTokens)})]}),i.jsxs("div",{children:[i.jsx("dt",{children:"Replay avoided"}),i.jsx("dd",{className:"amber",children:yn((V=t==null?void 0:t.checkpointSummary)==null?void 0:V.replayTokensAvoided)})]})]}),i.jsxs("button",{type:"button",className:"overview-link",onClick:()=>e("checkpoints"),children:["Timeline ",i.jsx(Yn,{size:14})]})]}),i.jsxs("section",{className:"overview-card",children:[i.jsxs("header",{children:[i.jsx(Fs,{size:16}),i.jsx("h3",{children:"Where data lives"})]}),i.jsxs("dl",{className:"overview-dl paths",children:[i.jsxs("div",{children:[i.jsx("dt",{children:"Project"}),i.jsx("dd",{title:t==null?void 0:t.projectPath,children:(t==null?void 0:t.projectPath)||"—"})]}),i.jsxs("div",{children:[i.jsx("dt",{children:"Brain DB"}),i.jsx("dd",{title:t==null?void 0:t.brainDb,children:(t==null?void 0:t.brainDb)||"~/.rigour/rigour.db"})]})]}),i.jsxs("p",{className:"overview-hint",children:["Studio reads Brain SQLite for cost/cache/checkpoints and merges project + global"," ",i.jsx("code",{children:"memory.json"}),"."]})]})]}),i.jsxs("div",{className:"overview-quick-nav",children:[i.jsxs("button",{type:"button",onClick:()=>e("cost"),children:[i.jsx(Mc,{size:16})," Cost & Context"]}),i.jsxs("button",{type:"button",onClick:()=>e("checkpoints"),children:[i.jsx(xr,{size:16})," Checkpoints"]}),i.jsxs("button",{type:"button",onClick:()=>e("memory"),children:[i.jsx(at,{size:16})," Memory"]}),i.jsxs("button",{type:"button",onClick:()=>e("patterns"),children:[i.jsx(Os,{size:16})," Patterns"]})]})]})}const vk={register:"agents",scope:"cost",gates:"gates",checkpoint:"checkpoints",handoff:"handoffs",memory:"memory"},yk={register:i.jsx(jr,{size:16}),scope:i.jsx(Z0,{size:16}),gates:i.jsx(cr,{size:16}),checkpoint:i.jsx(xr,{size:16}),handoff:i.jsx(no,{size:16}),memory:i.jsx(at,{size:16})};function gk(e){switch(e){case"pass":return i.jsx(xm,{size:14,className:"text-emerald"});case"warn":return i.jsx(Ie,{size:14,className:"text-amber"});case"block":return i.jsx(Ie,{size:14,className:"text-rose"});default:return i.jsx(Ei,{size:12,className:"text-dim"})}}function xk({onNavigate:e}){var d;const[t,n]=w.useState(null),[r,s]=w.useState(!0),[o,a]=w.useState(null),l=async()=>{s(!0),a(null);try{const f=await fetch("/api/enforcement");if(!f.ok){let h="";if(f.status===404)try{const y=await fetch("/api/info").then(x=>x.ok?x.json():null);h=` API/UI mismatch — Studio shell is newer than the CLI serving /api (studioVersion=${(y==null?void 0:y.studioVersion)||(y==null?void 0:y.mcpVersion)||"unknown"}). Restart with the local 5.5.0+ CLI: \`node …/rigour-cli/dist/cli.js studio -p <port>\` and open http://127.0.0.1:<port>.`}catch{h=" Restart Studio with a CLI that includes /api/enforcement (5.5.0+)."}throw new Error(`HTTP ${f.status}.${h}`)}n(await f.json())}catch(f){a(f.message||"Failed to load enforcement")}finally{s(!1)}};w.useEffect(()=>{l();const f=setInterval(l,15e3);return()=>clearInterval(f)},[]);const c=(t==null?void 0:t.stages)||[],u=c.map((f,h)=>{if(h===0)return null;const y=c[h-1].count;return y<=0?null:Math.min(100,Math.round(f.count/y*100))});return i.jsxs("div",{className:"enforcement-view",children:[i.jsxs("div",{className:"panel-header enforcement-header",children:[i.jsxs("div",{className:"title",children:[i.jsx(cr,{size:18}),i.jsx("span",{children:"Enforcement Loop"})]}),i.jsxs("div",{className:"enforcement-header-meta",children:[(t==null?void 0:t.derived)&&i.jsx("span",{className:"meta-chip",children:"Derived from checkpoints"}),i.jsxs("span",{className:"meta-chip",children:[(t==null?void 0:t.agentCount)??0," agents"]}),i.jsx("button",{type:"button",className:"icon-btn",onClick:l,"aria-label":"Refresh enforcement",children:i.jsx(qe,{size:14,className:r?"spinning":""})})]})]}),i.jsx("p",{className:"enforcement-lead",children:"How Rigour bounds agents: register scope, constrain context, run gates, compress checkpoints, verify handoffs, and store stable memory — for any MCP client."}),o&&i.jsxs("div",{className:"cost-banner",role:"alert",children:[i.jsx(Ie,{size:18,className:"text-rose"}),i.jsxs("div",{children:[i.jsx("strong",{children:"Could not load enforcement"}),i.jsx("p",{children:o})]})]}),r&&!t&&i.jsx("div",{className:"enforcement-skeleton","aria-busy":"true",children:Array.from({length:6}).map((f,h)=>i.jsx("div",{className:"skeleton-card"},h))}),c.length>0&&i.jsxs(i.Fragment,{children:[i.jsx("ol",{className:"enforcement-rail","aria-label":"Enforcement stages",children:c.map((f,h)=>i.jsxs("li",{className:`enforcement-stage status-${f.status}`,children:[h>0&&i.jsx("div",{className:"stage-connector","aria-hidden":"true",children:u[h]!=null&&i.jsxs("span",{className:"conversion",children:[u[h],"%"]})}),i.jsxs("button",{type:"button",className:"stage-card glass-card",onClick:()=>e==null?void 0:e(vk[f.id]||"overview"),children:[i.jsxs("div",{className:"stage-top",children:[i.jsx("span",{className:"stage-icon",children:yk[f.id]}),gk(f.status)]}),i.jsx("div",{className:"stage-label",children:f.label}),i.jsx("div",{className:"stage-count",children:f.count}),i.jsx("div",{className:"stage-detail",children:f.detail})]})]},f.id))}),i.jsx("ul",{className:"enforcement-list-fallback",children:c.map(f=>i.jsxs("li",{children:[i.jsx("strong",{children:f.label}),": ",f.count," — ",f.detail," (",f.status,")"]},`list-${f.id}`))})]}),i.jsxs("div",{className:"enforcement-timeline glass-card",children:[i.jsx("h3",{children:"Recent enforcement events"}),(d=t==null?void 0:t.timeline)!=null&&d.length?i.jsx("ul",{children:t.timeline.slice(0,12).map((f,h)=>i.jsxs("li",{children:[i.jsx("span",{className:`tl-type type-${f.type}`,children:f.type}),i.jsx("span",{className:"tl-summary",children:f.summary}),i.jsxs("span",{className:"tl-meta mono",children:[f.agentId||"—",f.timestamp?` · ${new Date(f.timestamp).toLocaleTimeString()}`:""]})]},`${f.type}-${h}`))}):i.jsx("p",{className:"empty-inline",children:"No gate/checkpoint/handoff events yet. Drive agents through MCP tools."})]})]})}function jk(){const[e,t]=w.useState([]),[n,r]=w.useState(!0),s=async()=>{r(!0);try{const a=await(await fetch("/api/handoffs")).json();t(Array.isArray(a.handoffs)?a.handoffs:[])}catch(o){console.error("Failed to load handoffs",o)}finally{r(!1)}};return w.useEffect(()=>{s()},[]),!n&&e.length===0?i.jsxs("div",{className:"empty-state glass-card",children:[i.jsx(no,{size:48}),i.jsx("h3",{children:"No Handoffs Yet"}),i.jsxs("p",{children:["Compress state with ",i.jsx("code",{children:"rigour_checkpoint"}),", then transfer with"," ",i.jsx("code",{children:"rigour_handoff"}),". The receiving agent accepts via ",i.jsx("code",{children:"rigour_handoff_accept"}),"."]}),i.jsx("div",{className:"hint-box",children:i.jsx("span",{children:"Verified handoffs carry checkpoint packets — not parent transcripts."})})]}):i.jsxs("div",{className:"handoff-flow",children:[i.jsxs("div",{className:"panel-header",children:[i.jsxs("div",{className:"title",children:[i.jsx(no,{size:18}),i.jsx("span",{children:"Agent Handoffs"})]}),i.jsx("button",{type:"button",className:"icon-btn",onClick:s,"aria-label":"Refresh handoffs",children:i.jsx(qe,{size:14,className:n?"spinning":""})})]}),i.jsx("div",{className:"handoff-list",children:e.map(o=>{const a=o.status==="accepted"||!!o.acceptedAt;return i.jsxs("article",{className:`handoff-card glass-card ${a?"accepted":"pending"}`,children:[i.jsxs("div",{className:"handoff-status",children:[a?i.jsxs("span",{className:"status-pill pass",children:[i.jsx(xm,{size:12})," Accepted"]}):i.jsxs("span",{className:"status-pill warn",children:[i.jsx(gr,{size:12})," Pending"]}),i.jsx("span",{className:"mono dim",children:o.handoffId})]}),i.jsxs("div",{className:"handoff-flow-row",children:[i.jsxs("div",{className:"handoff-agent",children:[i.jsx(jr,{size:14}),i.jsx("code",{children:o.fromAgentId})]}),i.jsx(Yn,{size:16,className:"text-cyan"}),i.jsxs("div",{className:"handoff-packet",children:[i.jsx(ax,{size:14}),i.jsx("span",{children:o.contextTokens!=null?`${o.contextTokens} tok`:"packet"})]}),i.jsx(Yn,{size:16,className:"text-cyan"}),i.jsxs("div",{className:"handoff-agent",children:[i.jsx(jr,{size:14}),i.jsx("code",{children:o.toAgentId})]})]}),o.taskDescription&&i.jsx("p",{className:"handoff-task",children:o.taskDescription}),o.filesInScope&&o.filesInScope.length>0&&i.jsxs("div",{className:"handoff-files",children:[o.filesInScope.slice(0,4).map(l=>i.jsx("code",{children:l},l)),o.filesInScope.length>4&&i.jsxs("span",{className:"dim",children:["+",o.filesInScope.length-4," more"]})]})]},o.handoffId)})})]})}function wk({onNavigate:e}){var h,y;const[t,n]=w.useState(null),[r,s]=w.useState(!0),[o,a]=w.useState(null),l=async()=>{s(!0),a(null);try{const g=await fetch("/api/overview");if(!g.ok)throw new Error(`HTTP ${g.status}`);n(await g.json())}catch(g){a(g.message||"Failed to load learning signals")}finally{s(!1)}};w.useEffect(()=>{l()},[]);const c=t==null?void 0:t.cache,u=((c==null?void 0:c.exactCacheHits)??0)+((c==null?void 0:c.semanticCacheHits)??0)+((c==null?void 0:c.partialCacheHits)??0),d=(c==null?void 0:c.cacheMisses)??0,f=Math.round(((c==null?void 0:c.hitRate)??0)*100);return i.jsxs("div",{className:"learning-brain",children:[i.jsxs("div",{className:"panel-header",children:[i.jsxs("div",{className:"title",children:[i.jsx(at,{size:18}),i.jsx("span",{children:"How Rigour Learns"})]}),i.jsx("button",{type:"button",className:"icon-btn",onClick:l,"aria-label":"Refresh learning",children:i.jsx(qe,{size:14,className:r?"spinning":""})})]}),i.jsx("p",{className:"enforcement-lead",children:"Scans feed the pattern index; agents write stable memory; context scope + cache reuse cut reread cost; checkpoints compress handoffs. This is governance learning — not model fine-tuning."}),o&&i.jsxs("div",{className:"cost-banner",role:"alert",children:[i.jsx(Ns,{size:18,className:"text-rose"}),i.jsxs("div",{children:[i.jsx("strong",{children:"Could not load learning signals"}),i.jsx("p",{children:o})]})]}),i.jsxs("div",{className:"learning-grid",children:[i.jsxs("article",{className:"glass-card learning-card",children:[i.jsxs("header",{children:[i.jsx(lx,{size:16,className:"text-cyan"}),i.jsx("h3",{children:"Pattern index (from scans)"})]}),i.jsx("div",{className:"learning-kpi",children:(t==null?void 0:t.patternCount)??0}),i.jsxs("p",{className:"dim",children:[(t==null?void 0:t.patternFiles)??0," files indexed. Refresh with ",i.jsx("code",{children:"rigour index"})," after large refactors."]}),i.jsx("button",{type:"button",className:"overview-link",onClick:()=>e==null?void 0:e("patterns"),children:"Open Pattern Index"})]}),i.jsxs("article",{className:"glass-card learning-card",children:[i.jsxs("header",{children:[i.jsx(cx,{size:16,className:"text-amber"}),i.jsx("h3",{children:"Stable memory"})]}),i.jsx("div",{className:"learning-kpi",children:(t==null?void 0:t.memoryCount)??0}),i.jsxs("p",{className:"dim",children:["Deliberate facts via ",i.jsx("code",{children:"rigour_remember"}),(h=t==null?void 0:t.memorySources)!=null&&h.length?` · ${t.memorySources.join(" + ")}`:"",". Not a scan log."]}),i.jsx("button",{type:"button",className:"overview-link",onClick:()=>e==null?void 0:e("memory"),children:"Open Memory Bank"})]}),i.jsxs("article",{className:"glass-card learning-card",children:[i.jsxs("header",{children:[i.jsx(Os,{size:16,className:"text-emerald"}),i.jsx("h3",{children:"Context cache power"})]}),i.jsxs("div",{className:"learning-kpi text-cyan",children:[f,"%"]}),i.jsxs("p",{className:"dim",children:[u," hits (",(c==null?void 0:c.exactCacheHits)??0," exact · ",(c==null?void 0:c.semanticCacheHits)??0," semantic ·"," ",(c==null?void 0:c.partialCacheHits)??0," partial) / ",d," misses · ",((y=t==null?void 0:t.context)==null?void 0:y.retrievals)??0," ","retrievals"]}),i.jsx("button",{type:"button",className:"overview-link",onClick:()=>e==null?void 0:e("cost"),children:"Open Cost & Context"})]}),i.jsxs("article",{className:"glass-card learning-card",children:[i.jsxs("header",{children:[i.jsx(at,{size:16,className:"text-purple"}),i.jsx("h3",{children:"Governance trail"})]}),i.jsx("div",{className:"learning-kpi",children:(t==null?void 0:t.checkpointCount)??0}),i.jsxs("p",{className:"dim",children:["Checkpoints compressed · ",((t==null?void 0:t.eventCount)??0).toLocaleString()," project events in"," ",i.jsx("code",{children:".rigour/events.jsonl"})," / Brain DB."]}),i.jsx("button",{type:"button",className:"overview-link",onClick:()=>e==null?void 0:e("enforcement"),children:"Open Enforcement Loop"})]})]})]})}const mi={initial:{opacity:0,y:10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},transition:{duration:.28,ease:[.16,1,.3,1]}};function Sk(){var A,z,V,_;const[e,t]=w.useState(()=>localStorage.getItem("rigour-theme")||"dark"),[n,r]=w.useState("enforcement"),[s,o]=w.useState([]),[a,l]=w.useState(null),[c,u]=w.useState(null),[d,f]=w.useState(!1),[h,y]=w.useState([]),[g,x]=w.useState(null);Ue.useEffect(()=>{const E=new EventSource("/api/events");return E.onmessage=b=>{try{const G=JSON.parse(b.data);o(ae=>[G,...ae].slice(0,100))}catch(G){console.error("Failed to parse event",G)}},fetch("/api/tree").then(b=>b.json()).then(y).catch(b=>console.error("Failed to fetch tree",b)),fetch("/api/info").then(b=>b.json()).then(x).catch(b=>console.error("Failed to fetch info",b)),()=>E.close()},[]),w.useEffect(()=>{document.documentElement.setAttribute("data-theme",e),localStorage.setItem("rigour-theme",e)},[e]);const C=()=>t(E=>E==="dark"?"light":"dark"),[m,p]=w.useState(""),[v,S]=w.useState({}),[j,k]=w.useState({}),[N,T]=w.useState(null),[R,P]=w.useState(null);w.useEffect(()=>{(async()=>{try{const[b,G,ae,le,lt]=await Promise.all([fetch("/api/config").then(be=>be.ok?be.text():""),fetch("/api/memory").then(be=>be.json()),fetch("/api/index-stats").then(be=>be.json()),fetch("/api/agents").then(be=>be.json()),fetch("/api/checkpoints").then(be=>be.json())]);p(b),S(G),k(ae),T(le),P(lt)}catch(b){console.error("Failed to fetch meta data",b)}})()},[]);const $=async E=>{try{const b=E.replace(/\s*\(\d+\s*lines\)$/,""),ae=await(await fetch(`/api/file?path=${encodeURIComponent(b)}`)).text();l({filename:b,original:ae,modified:ae})}catch(b){console.error("Failed to fetch file content",b)}},I=async E=>{if(c)try{await fetch("/api/arbitrate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({requestId:c.requestId||c.id,decision:E,timestamp:new Date().toISOString()})}),o(b=>b.map(G=>(G.requestId||G.id)===(c.requestId||c.id)?{...G,status:E==="approve"?"success":"error",arbitrated:!0,decision:E}:G)),f(!1),u(null)}catch(b){console.error("Arbitration failed",b)}},Q=[{id:"enforcement",label:"Enforcement",icon:cr},{id:"learning",label:"Learning",icon:at},{id:"overview",label:"Overview",icon:jm},{id:"agents",label:"Agent Teams",icon:jr},{id:"handoffs",label:"Handoffs",icon:no},{id:"checkpoints",label:"Checkpoints",icon:xr},{id:"memory",label:"Memory Bank",icon:X0},{id:"cost",label:"Cost & Context",icon:Mc},{id:"audit",label:"Audit Log",icon:ro},{id:"gates",label:"Quality Gates",icon:Dt},{id:"patterns",label:"Pattern Index",icon:Os},{id:"deep",label:"Deep Analysis",icon:at},{id:"drift",label:"Temporal Drift",icon:Dc}],he=(g==null?void 0:g.studioVersion)||(g==null?void 0:g.mcpVersion)||"—",L=(g==null?void 0:g.projectVersion)||(g==null?void 0:g.version)||"—",B=(g==null?void 0:g.projectName)||(g==null?void 0:g.name)||"project",H=(g==null?void 0:g.projectPath)||(g==null?void 0:g.path)||"";return i.jsxs("div",{className:"studio",children:[i.jsxs("div",{className:"cinema-ambient","aria-hidden":"true",children:[i.jsx("div",{className:"ambient-blob blob-a"}),i.jsx("div",{className:"ambient-blob blob-b"})]}),i.jsxs("aside",{className:"sidebar glass-shell",children:[i.jsxs("div",{className:"brand",children:[i.jsx("div",{className:"logo-icon",children:i.jsx(cr,{size:18})}),i.jsx("span",{children:"Rigour Studio"}),i.jsxs("div",{className:"version-pill",children:["v",he]})]}),i.jsx("nav",{children:Q.map(E=>i.jsxs("button",{className:`nav-item ${n===E.id?"active":""}`,onClick:()=>r(E.id),children:[i.jsx(E.icon,{size:18}),i.jsx("span",{children:E.label}),n===E.id&&i.jsx(_e.div,{layoutId:"nav-glow",className:"nav-glow"})]},E.id))}),i.jsxs("div",{className:"sidebar-footer",children:[i.jsxs("div",{className:"trust-indicator",children:[i.jsx(wm,{size:14}),i.jsx("span",{children:"Local Governance"})]}),i.jsx("button",{className:"footer-item",children:i.jsx(Sm,{size:18})}),i.jsx("button",{className:"footer-item",children:i.jsx(rx,{size:18})})]})]}),i.jsxs("main",{className:"main-content",children:[i.jsxs("header",{className:"glass-shell",children:[i.jsx("div",{className:"header-left",children:g&&i.jsxs("div",{className:"project-identity",children:[i.jsx(Fs,{size:14,className:"folder-icon"}),i.jsx("span",{className:"project-name",children:B}),i.jsxs("span",{className:"project-version-pill",children:["v",L]}),i.jsx("span",{className:"project-path",children:H})]})}),i.jsxs("div",{className:"header-right",children:[i.jsx("div",{className:"connection-status",children:i.jsxs("div",{className:"status-indicator",children:[i.jsx("div",{className:"pulse-emitter"}),i.jsx("span",{children:"LIVE"})]})}),i.jsx("button",{className:"theme-toggle",onClick:C,"aria-label":"Toggle theme",children:e==="dark"?i.jsx(ux,{size:18}):i.jsx(ox,{size:18})})]})]}),i.jsxs("div",{className:"view-container",children:[i.jsxs(yx,{mode:"wait",children:[n==="enforcement"&&i.jsx(_e.div,{...mi,className:"full-view",children:i.jsx(xk,{onNavigate:r})},"enforcement"),n==="learning"&&i.jsx(_e.div,{...mi,className:"full-view",children:i.jsx(wk,{onNavigate:r})},"learning"),n==="overview"&&i.jsx(_e.div,{...mi,className:"full-view",children:i.jsx(mk,{onNavigate:r})},"overview"),n==="handoffs"&&i.jsx(_e.div,{...mi,className:"full-view",children:i.jsx(jk,{})},"handoffs"),n==="audit"&&i.jsx(_e.div,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},className:"full-view",children:i.jsx(rk,{logs:s,onClearLogs:()=>o([]),onSelectLog:E=>{var b,G,ae;if(u(E),E!=null&&E._rigour_report||(E==null?void 0:E.type)==="interception_requested"){if(E!=null&&E._rigour_report){const le=(ae=(G=(b=E._rigour_report.failures)==null?void 0:b[0])==null?void 0:G.files)==null?void 0:ae[0];le?$(le):l(null)}else l(null);f(!0)}else l(null),f(!1)},selectedLog:c})},"audit"),n==="gates"&&i.jsx(_e.div,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},className:"full-view",children:i.jsx(nk,{})},"gates"),n==="deep"&&i.jsx(_e.div,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},className:"full-view",children:i.jsx(uk,{})},"deep"),n==="drift"&&i.jsx(_e.div,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},className:"full-view",children:i.jsx(hk,{})},"drift"),n==="patterns"&&i.jsx(_e.div,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},className:"full-view",children:i.jsx(tk,{})},"patterns"),n==="memory"&&i.jsx(_e.div,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},className:"full-view",children:i.jsx(ek,{})},"memory"),n==="agents"&&i.jsx(_e.div,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},className:"full-view",children:i.jsx(ak,{session:N})},"agents"),n==="checkpoints"&&i.jsx(_e.div,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},className:"full-view",children:i.jsx(lk,{checkpoints:(R==null?void 0:R.checkpoints)||[]})},"checkpoints"),n==="cost"&&i.jsx(_e.div,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},className:"full-view",children:i.jsx(pk,{})},"cost")]}),c&&d&&i.jsx("div",{className:"governance-overlay",children:i.jsxs("div",{className:"governance-window",children:[i.jsxs("div",{className:"governance-header",children:[i.jsxs("div",{className:"title",children:[i.jsx(cr,{size:20}),i.jsxs("span",{children:["Governance Audit: ",c.tool]})]}),i.jsxs("div",{className:"hitl-actions",children:[c.type==="interception_requested"&&i.jsxs(i.Fragment,{children:[i.jsxs("button",{className:"btn-approve",onClick:()=>I("approve"),children:[i.jsx(Nt,{size:16})," Approve"]}),i.jsxs("button",{className:"btn-reject",onClick:()=>I("reject"),children:[i.jsx(Cs,{size:16})," Reject"]}),i.jsx("div",{className:"divider"})]}),i.jsx("button",{onClick:()=>f(!1),className:"close-btn",children:i.jsx(_c,{size:20})})]})]}),i.jsx("div",{className:"governance-body",children:c.type==="interception_requested"?i.jsxs("div",{className:"interception-view",children:[i.jsxs("div",{className:"interception-card",children:[i.jsx(ro,{size:48}),i.jsx("h4",{children:"Command Intercepted"}),i.jsx("div",{className:"command-box",children:i.jsx("code",{children:c.command})}),i.jsx("p",{children:"An AI agent is requesting to execute this command. Review the project state below before arbitrating."}),i.jsxs("div",{className:"warning-note",children:[i.jsx(Ie,{size:16}),i.jsx("span",{children:"Critical actions should be manually verified."})]})]}),i.jsx(nh,{files:h.map(E=>E.replace(/\s*\(\d+\s*lines\)$/,"")),onSelect:E=>$(E),activeFile:a==null?void 0:a.filename,violatedFiles:[]})]}):i.jsxs(i.Fragment,{children:[i.jsx(nh,{files:(((z=(A=c._rigour_report)==null?void 0:A.failures)==null?void 0:z.flatMap(E=>E.files||[]))||h).map(E=>E.replace(/\s*\(\d+\s*lines\)$/,"")),onSelect:E=>$(E),activeFile:a==null?void 0:a.filename,violatedFiles:(((_=(V=c._rigour_report)==null?void 0:V.failures)==null?void 0:_.flatMap(E=>E.files||[]))||[]).map(E=>E.replace(/\s*\(\d+\s*lines\)$/,""))}),i.jsx("div",{className:"diff-view-area",children:a?i.jsx(Z2,{filename:a.filename,originalCode:a.original,modifiedCode:a.modified,onClose:()=>l(null),theme:e}):i.jsxs("div",{className:"diff-placeholder",children:[i.jsx(Dt,{size:48}),i.jsx("p",{children:"Select a file to audit the proposed changes"})]})})]})})]})})]})]})]})}Ta.createRoot(document.getElementById("root")).render(i.jsx(Ue.StrictMode,{children:i.jsx(Sk,{})}));
@@ -8,7 +8,7 @@
8
8
  <link rel="preconnect" href="https://fonts.googleapis.com">
9
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
10
  <link href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500;600;700&family=Fira+Sans:wght@400;500;600;700&display=swap" rel="stylesheet">
11
- <script type="module" crossorigin src="/assets/index-BvR6Si_S.js"></script>
11
+ <script type="module" crossorigin src="/assets/index-GVDvbvMe.js"></script>
12
12
  <link rel="stylesheet" crossorigin href="/assets/index-jC3k12bf.css">
13
13
  </head>
14
14
  <body>