@kb-labs/qa-entry 2.14.0 → 2.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/widgets/117.js +2 -0
- package/dist/widgets/117.js.map +1 -0
- package/dist/widgets/297.js +2 -0
- package/dist/widgets/297.js.map +1 -0
- package/dist/widgets/338.js +2 -0
- package/dist/widgets/338.js.map +1 -0
- package/dist/widgets/370.js +2 -0
- package/dist/widgets/370.js.map +1 -0
- package/dist/widgets/451.js +2 -0
- package/dist/widgets/451.js.map +1 -0
- package/dist/widgets/50.js +2 -0
- package/dist/widgets/50.js.map +1 -0
- package/dist/widgets/586.js +39 -0
- package/dist/widgets/586.js.map +1 -0
- package/dist/widgets/59.js +2 -0
- package/dist/widgets/59.js.map +1 -0
- package/dist/widgets/607.js +2 -0
- package/dist/widgets/607.js.map +1 -0
- package/dist/widgets/626.js +2 -0
- package/dist/widgets/626.js.map +1 -0
- package/dist/widgets/669.js +2 -0
- package/dist/widgets/669.js.map +1 -0
- package/dist/widgets/678.js +2 -0
- package/dist/widgets/678.js.map +1 -0
- package/dist/widgets/781.js +2 -0
- package/dist/widgets/781.js.map +1 -0
- package/dist/widgets/842.js +446 -0
- package/dist/widgets/842.js.map +1 -0
- package/dist/widgets/968.js +10 -0
- package/dist/widgets/968.js.map +1 -0
- package/dist/widgets/997.js +35 -0
- package/dist/widgets/997.js.map +1 -0
- package/dist/widgets/@mf-types.d.ts +3 -0
- package/dist/widgets/@mf-types.zip +0 -0
- package/dist/widgets/__federation_expose_QADashboard.js +2 -0
- package/dist/widgets/__federation_expose_QADashboard.js.map +1 -0
- package/dist/widgets/mf-manifest.json +262 -0
- package/dist/widgets/mf-stats.json +301 -0
- package/dist/widgets/remoteEntry.js +7 -0
- package/dist/widgets/remoteEntry.js.map +1 -0
- package/package.json +8 -8
|
Binary file
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_kb_labs_qa_entry=self.webpackChunk_kb_labs_qa_entry||[]).push([["23"],{572(e,r,t){var n=t(5259),i=Symbol.for("react.element"),a=Symbol.for("react.fragment"),o=Object.prototype.hasOwnProperty,l=n.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,s={key:!0,ref:!0,__self:!0,__source:!0};function c(e,r,t){var n,a={},c=null,u=null;for(n in void 0!==t&&(c=""+t),void 0!==r.key&&(c=""+r.key),void 0!==r.ref&&(u=r.ref),r)o.call(r,n)&&!s.hasOwnProperty(n)&&(a[n]=r[n]);if(e&&e.defaultProps)for(n in r=e.defaultProps)void 0===a[n]&&(a[n]=r[n]);return{$$typeof:i,type:e,key:c,ref:u,props:a,_owner:l.current}}r.Fragment=a,r.jsx=c,r.jsxs=c},8048(e,r,t){e.exports=t(572)},1772(e,r,t){t.r(r),t.d(r,{default:()=>D});var n=t(8048),i=t(1349),a=t(5259),o=t(2383);function l(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}function s(e,r,t,n,i,a,o){try{var l=e[a](o),s=l.value}catch(e){t(e);return}l.done?r(s):Promise.resolve(s).then(n,i)}function c(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{},n=Object.keys(t);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(t).filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.forEach(function(r){var n;n=t[r],r in e?Object.defineProperty(e,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[r]=n})}return e}function u(e,r){return r=null!=r?r:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):(function(e){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);r.push.apply(r,t)}return r})(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}),e}function d(e){return function(e){if(Array.isArray(e))return l(e)}(e)||function(e){if("u">typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||f(e)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function f(e,r){if(e){if("string"==typeof e)return l(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);if("Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t)return Array.from(t);if("Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return l(e,r)}}var p={passed:{color:"success",iconName:"CheckCircleOutlined"},failed:{color:"error",iconName:"CloseCircleOutlined"},skipped:{color:"default",iconName:"MinusCircleOutlined"}};function h(e){var r,t,l,h,y,g=e.open,m=e.checkType,x=e.checkLabel,v=e.onClose,j=(0,o.useTheme)().antdToken,S=(0,o.useData)("/v1/plugins/qa/details"),b=S.data,I=S.isLoading,U=(0,o.useMutateData)("/v1/plugins/qa/run/check","POST"),w=U.mutateAsync,k=U.isLoading,T=function(e){if(Array.isArray(e))return e}(r=a.useState(""))||function(e){var r,t,n=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var i=[],a=!0,o=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),2!==i.length);a=!0);}catch(e){o=!0,t=e}finally{try{a||null==n.return||n.return()}finally{if(o)throw t}}return i}}(r)||f(r,2)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),O=T[0],A=T[1];if(!m)return null;var C=null==b?void 0:b.checks[m],z=d((null!=(t=null==C?void 0:C.failed)?t:[]).map(function(e){return u(c({},e),{status:"failed"})})).concat(d((null!=(l=null==C?void 0:C.passed)?l:[]).map(function(e){return u(c({},e),{status:"passed"})})),d((null!=(h=null==C?void 0:C.skipped)?h:[]).map(function(e){return u(c({},e),{status:"skipped"})}))).filter(function(e){return!O||e.name.toLowerCase().includes(O.toLowerCase())||e.repo.toLowerCase().includes(O.toLowerCase())}),M=function(){var e;return(e=function(){var e,r;return function(e,r){var t,n,i,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),l=Object.defineProperty;return l(o,"next",{value:s(0)}),l(o,"throw",{value:s(1)}),l(o,"return",{value:s(2)}),"function"==typeof Symbol&&l(o,Symbol.iterator,{value:function(){return this}}),o;function s(l){return function(s){var c=[l,s];if(t)throw TypeError("Generator is already executing.");for(;o&&(o=0,c[0]&&(a=0)),a;)try{if(t=1,n&&(i=2&c[0]?n.return:c[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,c[1])).done)return i;switch(n=0,i&&(c=[2&c[0],i.value]),c[0]){case 0:case 1:i=c;break;case 4:return a.label++,{value:c[1],done:!1};case 5:a.label++,n=c[1],c=[0];continue;case 7:c=a.ops.pop(),a.trys.pop();continue;default:if(!(i=(i=a.trys).length>0&&i[i.length-1])&&(6===c[0]||2===c[0])){a=0;continue}if(3===c[0]&&(!i||c[1]>i[0]&&c[1]<i[3])){a.label=c[1];break}if(6===c[0]&&a.label<i[1]){a.label=i[1],i=c;break}if(i&&a.label<i[2]){a.label=i[2],a.ops.push(c);break}i[2]&&a.ops.pop(),a.trys.pop();continue}c=r.call(e,a)}catch(e){c=[6,e],n=0}finally{t=i=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}(this,function(t){switch(t.label){case 0:i.UIMessage.loading("Running ".concat(x,"..."),0),t.label=1;case 1:return t.trys.push([1,3,,4]),[4,w({checkType:m})];case 2:return e=t.sent(),i.UIMessage.destroy(),"passed"===e.status?i.UIMessage.success("".concat(x," passed in ").concat((e.durationMs/1e3).toFixed(1),"s")):i.UIMessage.warning("".concat(x,": ").concat(e.result.failed.length," failures in ").concat((e.durationMs/1e3).toFixed(1),"s")),[3,4];case 3:var n;return r=t.sent(),i.UIMessage.destroy(),i.UIMessage.error("".concat(x," failed: ").concat((null!=(n=Error)&&"u">typeof Symbol&&n[Symbol.hasInstance]?!!n[Symbol.hasInstance](r):r instanceof n)?r.message:"Unknown error")),[3,4];case 4:return[2]}})},function(){var r=this,t=arguments;return new Promise(function(n,i){var a=e.apply(r,t);function o(e){s(a,n,i,o,l,"next",e)}function l(e){s(a,n,i,o,l,"throw",e)}o(void 0)})})()},P=[{title:"Status",dataIndex:"status",key:"status",width:80,filters:[{text:"Failed",value:"failed"},{text:"Passed",value:"passed"},{text:"Skipped",value:"skipped"}],onFilter:function(e,r){return r.status===e},render:function(e){var r=p[e];return(0,n.jsx)(i.UITag,{color:null==r?void 0:r.color,icon:r?(0,n.jsx)(i.UIIcon,{name:r.iconName}):void 0,children:e})}},{title:"Package",dataIndex:"name",key:"name",sorter:function(e,r){return e.name.localeCompare(r.name)},render:function(e){return(0,n.jsx)(i.UITypographyText,{code:!0,style:{fontSize:j.fontSizeSM},children:e})}},{title:"Repo",dataIndex:"repo",key:"repo",width:180,filters:d(new Set(z.map(function(e){return e.repo}))).map(function(e){return{text:e,value:e}}),onFilter:function(e,r){return r.repo===e},render:function(e){return(0,n.jsx)(i.UITag,{children:e})}}];return(0,n.jsxs)(i.UIDrawer,{title:(0,n.jsxs)(i.UISpace,{children:[(0,n.jsxs)("span",{children:[x," Details"]}),(0,n.jsxs)(i.UITag,{color:(null==C?void 0:C.failed.length)?"error":"success",children:[null!=(y=null==C?void 0:C.failed.length)?y:0," failed"]})]}),placement:"right",width:720,open:g,onClose:v,extra:"build"!==m&&(0,n.jsxs)(i.UIButton,{variant:"primary",icon:(0,n.jsx)(i.UIIcon,{name:"PlayCircleOutlined"}),onClick:function(){M()},loading:k,size:"small",children:["Re-run ",x]}),children:[(0,n.jsx)(i.UIInput,{placeholder:"Filter by package or repo...",prefix:(0,n.jsx)(i.UIIcon,{name:"SearchOutlined"}),value:O,onChange:function(e){return A(e)},style:{marginBottom:j.marginMD},allowClear:!0}),(0,n.jsx)(i.UITable,{dataSource:z,columns:P,rowKey:"name",size:"small",loading:I,pagination:{pageSize:50},expandable:{expandedRowRender:function(e){return e.error?(0,n.jsx)(i.UIAccordion,{ghost:!0,items:[{key:"1",label:"Error output",children:(0,n.jsx)("pre",{style:{background:j.colorFillTertiary,color:j.colorText,padding:j.paddingSM,borderRadius:j.borderRadius,fontSize:j.fontSizeSM,maxHeight:300,overflow:"auto",whiteSpace:"pre-wrap",wordBreak:"break-all"},children:e.error})}]}):null},rowExpandable:function(e){return!!e.error}}})]})}var y={build:"BuildOutlined",lint:"FileSearchOutlined",typeCheck:"FileTextOutlined",test:"ExperimentOutlined"};function g(e){var r;return(0,n.jsx)(i.UIIcon,{name:null!=(r=y[e])?r:"CheckCircleOutlined"})}function m(e){return e.charAt(0).toUpperCase()+e.slice(1).replace(/([A-Z])/g," $1")}function x(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}function v(e,r,t,n,i,a,o){try{var l=e[a](o),s=l.value}catch(e){t(e);return}l.done?r(s):Promise.resolve(s).then(n,i)}function j(){var e=(0,o.useTheme)().antdToken,r=(0,o.useData)("/v1/plugins/qa/baseline/diff"),t=r.data,a=r.isLoading,l=(0,o.useMutateData)("/v1/plugins/qa/baseline/update","POST"),s=l.mutateAsync,c=l.isLoading,u=function(){var e;return(e=function(){var e;return function(e,r){var t,n,i,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),l=Object.defineProperty;return l(o,"next",{value:s(0)}),l(o,"throw",{value:s(1)}),l(o,"return",{value:s(2)}),"function"==typeof Symbol&&l(o,Symbol.iterator,{value:function(){return this}}),o;function s(l){return function(s){var c=[l,s];if(t)throw TypeError("Generator is already executing.");for(;o&&(o=0,c[0]&&(a=0)),a;)try{if(t=1,n&&(i=2&c[0]?n.return:c[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,c[1])).done)return i;switch(n=0,i&&(c=[2&c[0],i.value]),c[0]){case 0:case 1:i=c;break;case 4:return a.label++,{value:c[1],done:!1};case 5:a.label++,n=c[1],c=[0];continue;case 7:c=a.ops.pop(),a.trys.pop();continue;default:if(!(i=(i=a.trys).length>0&&i[i.length-1])&&(6===c[0]||2===c[0])){a=0;continue}if(3===c[0]&&(!i||c[1]>i[0]&&c[1]<i[3])){a.label=c[1];break}if(6===c[0]&&a.label<i[1]){a.label=i[1],i=c;break}if(i&&a.label<i[2]){a.label=i[2],a.ops.push(c);break}i[2]&&a.ops.pop(),a.trys.pop();continue}c=r.call(e,a)}catch(e){c=[6,e],n=0}finally{t=i=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}(this,function(r){switch(r.label){case 0:i.UIMessage.loading("Updating baseline...",0),r.label=1;case 1:return r.trys.push([1,3,,4]),[4,s(void 0)];case 2:return r.sent(),i.UIMessage.destroy(),i.UIMessage.success("Baseline updated successfully"),[3,4];case 3:var t;return e=r.sent(),i.UIMessage.destroy(),i.UIMessage.error("Failed to update baseline: ".concat((null!=(t=Error)&&"u">typeof Symbol&&t[Symbol.hasInstance]?!!t[Symbol.hasInstance](e):e instanceof t)?e.message:"Unknown error")),[3,4];case 4:return[2]}})},function(){var r=this,t=arguments;return new Promise(function(n,i){var a=e.apply(r,t);function o(e){v(a,n,i,o,l,"next",e)}function l(e){v(a,n,i,o,l,"throw",e)}o(void 0)})})()};if(a)return null;if(!(null==t?void 0:t.baseline))return(0,n.jsx)(i.UIAlert,{variant:"warning",showIcon:!0,message:"No baseline set",description:"Run QA first, then update baseline to enable diff tracking.",action:(0,n.jsx)(i.UIButton,{variant:"primary",size:"small",icon:(0,n.jsx)(i.UIIcon,{name:"SaveOutlined"}),onClick:function(){u()},loading:c,children:"Create Baseline"})});if(!t.hasDiff)return(0,n.jsx)(i.UIAlert,{variant:"success",showIcon:!0,icon:(0,n.jsx)(i.UIIcon,{name:"CheckCircleOutlined"}),message:"No changes since baseline",description:"Baseline from ".concat(new Date(t.baseline.timestamp).toLocaleString()),action:(0,n.jsx)(i.UIPopconfirm,{title:"Update baseline?",description:"This will set the current QA state as the new baseline.",onConfirm:function(){u()},children:(0,n.jsx)(i.UIButton,{size:"small",icon:(0,n.jsx)(i.UIIcon,{name:"SaveOutlined"}),loading:c,children:"Update"})})});var d=0,f=0,p=!0,h=!1,y=void 0;try{for(var g,j=Object.values(t.diff)[Symbol.iterator]();!(p=(g=j.next()).done);p=!0){var S=g.value;d+=S.newFailures.length,f+=S.fixed.length}}catch(e){h=!0,y=e}finally{try{p||null==j.return||j.return()}finally{if(h)throw y}}return(0,n.jsx)(i.UICard,{title:(0,n.jsxs)(i.UISpace,{children:[(0,n.jsx)(i.UIIcon,{name:"WarningOutlined",style:{color:d>0?e.colorError:e.colorSuccess}}),(0,n.jsx)("span",{children:"Baseline Diff"}),d>0&&(0,n.jsxs)(i.UITag,{color:"error",children:["+",d," new failures"]}),f>0&&(0,n.jsxs)(i.UITag,{color:"success",children:[f," fixed"]})]}),extra:(0,n.jsx)(i.UIPopconfirm,{title:"Update baseline?",description:"This will set the current QA state as the new baseline.",onConfirm:function(){u()},children:(0,n.jsx)(i.UIButton,{variant:"primary",icon:(0,n.jsx)(i.UIIcon,{name:"SaveOutlined"}),loading:c,size:"small",children:"Update Baseline"})}),children:(0,n.jsx)(i.UIRow,{gutter:[16,16],children:Object.entries(t.diff).map(function(r){var t=function(e){if(Array.isArray(e))return e}(r)||function(e){var r,t,n=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var i=[],a=!0,o=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),2!==i.length);a=!0);}catch(e){o=!0,t=e}finally{try{a||null==n.return||n.return()}finally{if(o)throw t}}return i}}(r)||function(e){if(e){if("string"==typeof e)return x(e,2);var r=Object.prototype.toString.call(e).slice(8,-1);if("Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r)return Array.from(r);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return x(e,2)}}(r)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),a=t[0],o=t[1];return(0,n.jsx)(i.UICol,{xs:24,sm:12,lg:6,children:(0,n.jsxs)(i.UICard,{size:"small",style:{textAlign:"center"},children:[(0,n.jsx)(i.UITypographyText,{strong:!0,children:m(a)}),(0,n.jsx)("div",{style:{marginTop:e.marginXS},children:(0,n.jsx)(i.UIStatistic,{value:Math.abs(o.delta),prefix:o.delta>0?(0,n.jsx)(i.UIIcon,{name:"ArrowUpOutlined"}):o.delta<0?(0,n.jsx)(i.UIIcon,{name:"ArrowDownOutlined"}):null,valueStyle:{color:o.delta>0?e.colorError:o.delta<0?e.colorSuccess:e.colorTextSecondary,fontSize:e.fontSizeHeading3},suffix:o.delta>0?"more failures":o.delta<0?"fewer failures":"no change"})}),o.newFailures.length>0&&(0,n.jsxs)("div",{style:{marginTop:e.marginXS,textAlign:"left"},children:[(0,n.jsx)(i.UITypographyText,{type:"danger",style:{fontSize:e.fontSizeSM},children:"New failures:"}),o.newFailures.slice(0,3).map(function(r){return(0,n.jsx)("div",{children:(0,n.jsx)(i.UITag,{color:"error",style:{fontSize:e.fontSizeSM},children:r})},r)}),o.newFailures.length>3&&(0,n.jsxs)(i.UITypographyText,{type:"secondary",style:{fontSize:e.fontSizeSM},children:["+",o.newFailures.length-3," more"]})]}),o.fixed.length>0&&(0,n.jsxs)("div",{style:{marginTop:e.marginXS,textAlign:"left"},children:[(0,n.jsx)(i.UITypographyText,{type:"success",style:{fontSize:e.fontSizeSM},children:"Fixed:"}),o.fixed.slice(0,3).map(function(r){return(0,n.jsx)("div",{children:(0,n.jsx)(i.UITag,{color:"success",style:{fontSize:e.fontSizeSM},children:r})},r)}),o.fixed.length>3&&(0,n.jsxs)(i.UITypographyText,{type:"secondary",style:{fontSize:e.fontSizeSM},children:["+",o.fixed.length-3," more"]})]})]})},a)})})})}function S(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}var b={build:{color:"red",iconName:"BugOutlined",label:"Build"},lint:{color:"orange",iconName:"FileSearchOutlined",label:"Lint"},typeCheck:{color:"blue",iconName:"FileTextOutlined",label:"Types"},test:{color:"purple",iconName:"ExperimentOutlined",label:"Tests"}};function I(){var e=(0,o.useTheme)().antdToken,r=(0,o.useData)("/v1/plugins/qa/errors/groups"),t=r.data;if(r.isLoading)return(0,n.jsx)(i.UISpin,{size:"large",style:{display:"block",margin:"48px auto"}});if(!t||0===t.groups.length&&0===t.ungrouped)return null;var a=[{title:"Pattern",dataIndex:"pattern",key:"pattern",render:function(r){return(0,n.jsx)(i.UITypographyText,{code:!0,style:{fontSize:e.fontSizeSM},children:r})}},{title:"Type",dataIndex:"checkType",key:"checkType",width:100,filters:Object.entries(b).map(function(e){var r=function(e){if(Array.isArray(e))return e}(e)||function(e){var r,t,n=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var i=[],a=!0,o=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),2!==i.length);a=!0);}catch(e){o=!0,t=e}finally{try{a||null==n.return||n.return()}finally{if(o)throw t}}return i}}(e)||function(e){if(e){if("string"==typeof e)return S(e,2);var r=Object.prototype.toString.call(e).slice(8,-1);if("Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r)return Array.from(r);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return S(e,2)}}(e)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),t=r[0];return{text:r[1].label,value:t}}),onFilter:function(e,r){return r.checkType===e},render:function(e){var r=b[e];return r?(0,n.jsx)(i.UITag,{color:r.color,icon:(0,n.jsx)(i.UIIcon,{name:r.iconName}),children:r.label}):(0,n.jsx)(i.UITag,{children:e})}},{title:"Affected",dataIndex:"count",key:"count",width:100,sorter:function(e,r){return e.count-r.count},defaultSortOrder:"descend",render:function(r){return(0,n.jsx)(i.UIBadge,{count:r,style:{backgroundColor:r>5?e.colorError:r>2?e.colorWarning:e.colorSuccess}})}},{title:"Packages",dataIndex:"packages",key:"packages",render:function(r){return(0,n.jsxs)(i.UISpace,{wrap:!0,size:[4,4],children:[r.slice(0,3).map(function(r){return(0,n.jsx)(i.UITag,{style:{fontSize:e.fontSizeSM},children:r},r)}),r.length>3&&(0,n.jsxs)(i.UITypographyText,{type:"secondary",style:{fontSize:e.fontSizeSM},children:["+",r.length-3," more"]})]})}}];return(0,n.jsx)(i.UICard,{title:(0,n.jsxs)(i.UISpace,{children:[(0,n.jsx)(i.UIIcon,{name:"BugOutlined"}),(0,n.jsx)("span",{children:"Error Groups"}),(0,n.jsxs)(i.UITag,{children:[t.groups.length," patterns"]}),t.ungrouped>0&&(0,n.jsxs)(i.UITag,{color:"default",children:[t.ungrouped," unique errors"]})]}),children:(0,n.jsx)(i.UITable,{dataSource:t.groups,columns:a,rowKey:"pattern",size:"small",pagination:{pageSize:10},expandable:{expandedRowRender:function(r){return(0,n.jsxs)("div",{children:[(0,n.jsx)(i.UITypographyText,{type:"secondary",style:{fontSize:e.fontSizeSM},children:"Example:"}),(0,n.jsx)("pre",{style:{background:e.colorFillTertiary,color:e.colorText,padding:e.paddingXS,borderRadius:e.borderRadiusSM,fontSize:e.fontSizeSM,maxHeight:150,overflow:"auto",whiteSpace:"pre-wrap",wordBreak:"break-all",marginTop:e.marginXXS},children:r.example}),r.packages.length>3&&(0,n.jsxs)("div",{style:{marginTop:e.marginXS},children:[(0,n.jsx)(i.UITypographyText,{type:"secondary",style:{fontSize:e.fontSizeSM},children:"All affected packages:"}),(0,n.jsx)("div",{style:{marginTop:e.marginXXS},children:(0,n.jsx)(i.UISpace,{wrap:!0,size:[4,4],children:r.packages.map(function(r){return(0,n.jsx)(i.UITag,{style:{fontSize:e.fontSizeSM},children:r},r)})})})]})]})},rowExpandable:function(){return!0}}})})}function U(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}function w(e,r,t,n,i,a,o){try{var l=e[a](o),s=l.value}catch(e){t(e);return}l.done?r(s):Promise.resolve(s).then(n,i)}function k(e,r){return function(e){if(Array.isArray(e))return e}(e)||function(e,r){var t,n,i=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=i){var a=[],o=!0,l=!1;try{for(i=i.call(e);!(o=(t=i.next()).done)&&(a.push(t.value),!r||a.length!==r);o=!0);}catch(e){l=!0,n=e}finally{try{o||null==i.return||i.return()}finally{if(l)throw n}}return a}}(e,r)||T(e,r)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function T(e,r){if(e){if("string"==typeof e)return U(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);if("Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t)return Array.from(t);if("Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return U(e,r)}}function O(){var e,r,t,l=(0,o.useTheme)().antdToken,s=(0,o.useData)("/v1/plugins/qa/summary"),c=s.data,u=s.isLoading,d=(0,o.useMutateData)("/v1/plugins/qa/run"),f=d.mutateAsync,p=d.isLoading,y=k(a.useState(!1),2),m=y[0],x=y[1],v=k(a.useState(null),2),S=v[0],b=v[1],O=k(a.useState(new Set),2),A=O[0],C=O[1],z=function(e,r){C(function(t){var n=new Set(t);return r?n.delete(e):n.add(e),n})},M=function(e,r){b({type:e,label:r}),x(!0)},P=function(){var e;return(e=function(){var e,r,t;return function(e,r){var t,n,i,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),l=Object.defineProperty;return l(o,"next",{value:s(0)}),l(o,"throw",{value:s(1)}),l(o,"return",{value:s(2)}),"function"==typeof Symbol&&l(o,Symbol.iterator,{value:function(){return this}}),o;function s(l){return function(s){var c=[l,s];if(t)throw TypeError("Generator is already executing.");for(;o&&(o=0,c[0]&&(a=0)),a;)try{if(t=1,n&&(i=2&c[0]?n.return:c[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,c[1])).done)return i;switch(n=0,i&&(c=[2&c[0],i.value]),c[0]){case 0:case 1:i=c;break;case 4:return a.label++,{value:c[1],done:!1};case 5:a.label++,n=c[1],c=[0];continue;case 7:c=a.ops.pop(),a.trys.pop();continue;default:if(!(i=(i=a.trys).length>0&&i[i.length-1])&&(6===c[0]||2===c[0])){a=0;continue}if(3===c[0]&&(!i||c[1]>i[0]&&c[1]<i[3])){a.label=c[1];break}if(6===c[0]&&a.label<i[1]){a.label=i[1],i=c;break}if(i&&a.label<i[2]){a.label=i[2],a.ops.push(c);break}i[2]&&a.ops.pop(),a.trys.pop();continue}c=r.call(e,a)}catch(e){c=[6,e],n=0}finally{t=i=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}(this,function(n){var a;switch(n.label){case 0:i.UIMessage.loading("Running QA checks...",0),n.label=1;case 1:return n.trys.push([1,3,,4]),[4,f({skipChecks:A.size>0?function(e){if(Array.isArray(e))return U(e)}(A)||function(e){if("u">typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(A)||T(A)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}():void 0})];case 2:return e=n.sent(),i.UIMessage.destroy(),"passed"===e.status?i.UIMessage.success("QA passed in ".concat((e.durationMs/1e3).toFixed(1),"s")):(r=Object.values(e.results).reduce(function(e,r){return e+r.failed.length},0),i.UIMessage.warning("QA finished with ".concat(r," failures in ").concat((e.durationMs/1e3).toFixed(1),"s"))),[3,4];case 3:return t=n.sent(),i.UIMessage.destroy(),i.UIMessage.error("QA run failed: ".concat((null!=(a=Error)&&"u">typeof Symbol&&a[Symbol.hasInstance]?!!a[Symbol.hasInstance](t):t instanceof a)?t.message:"Unknown error")),[3,4];case 4:return[2]}})},function(){var r=this,t=arguments;return new Promise(function(n,i){var a=e.apply(r,t);function o(e){w(a,n,i,o,l,"next",e)}function l(e){w(a,n,i,o,l,"throw",e)}o(void 0)})})()};if(u)return(0,n.jsx)(i.UISpin,{size:"large",style:{display:"block",margin:"48px auto"}});if(!c)return(0,n.jsx)(i.UIAlert,{variant:"info",showIcon:!0,message:"No QA data",description:"Run 'pnpm qa:save' to generate QA history.",style:{marginBottom:l.marginLG}});var F="passed"===c.status;return(0,n.jsxs)("div",{children:[(0,n.jsx)("div",{style:{marginBottom:l.marginMD},children:(0,n.jsxs)(i.UISpace,{children:[(0,n.jsx)(i.UIButton,{variant:"primary",icon:(0,n.jsx)(i.UIIcon,{name:"PlayCircleOutlined"}),onClick:function(){P()},loading:p,disabled:p,children:p?"Running QA Checks...":"Run QA"}),(0,n.jsx)(i.UIPopover,{trigger:"click",title:"Checks to run",content:(0,n.jsx)(i.UISpace,{direction:"vertical",children:(null!=(e=null==c?void 0:c.checks)?e:[]).map(function(e){return(0,n.jsxs)(i.UICheckbox,{checked:!A.has(e.checkType),onChange:function(r){return z(e.checkType,r)},children:[g(e.checkType)," ",e.label]},e.checkType)})}),children:(0,n.jsx)(i.UIButton,{icon:(0,n.jsx)(i.UIIcon,{name:"SettingOutlined"}),disabled:p})})]})}),(0,n.jsx)(i.UIAlert,{variant:F?"success":"error",showIcon:!0,icon:F?(0,n.jsx)(i.UIIcon,{name:"CheckCircleOutlined"}):(0,n.jsx)(i.UIIcon,{name:"CloseCircleOutlined"}),message:(0,n.jsxs)(i.UISpace,{children:[(0,n.jsxs)("span",{style:{fontWeight:600},children:["QA Status: ",F?"All Checks Passing":"Checks Failing"]}),(0,n.jsx)(i.UITag,{color:F?"success":"error",children:c.status.toUpperCase()})]}),description:c.lastRunAt?(0,n.jsxs)(i.UISpace,{split:(0,n.jsx)("span",{style:{color:l.colorBorderSecondary},children:"|"}),children:[(0,n.jsxs)("span",{children:[(0,n.jsx)(i.UIIcon,{name:"ClockCircleOutlined"})," ",new Date(c.lastRunAt).toLocaleString()]}),c.git&&(0,n.jsxs)("span",{children:[(0,n.jsx)(i.UIIcon,{name:"BranchesOutlined"})," ",c.git.branch," (",c.git.commit.slice(0,7),")"]}),(0,n.jsxs)("span",{children:[c.historyCount," runs in history"]})]}):void 0,style:{marginBottom:l.marginLG}}),(0,n.jsx)(i.UIRow,{gutter:[16,16],style:{marginBottom:l.marginLG},children:c.checks.map(function(e){var r=function(e,r){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return 0===r?100:Math.round((e+t)/r*100)}(e.passed,e.total,e.skipped);return(0,n.jsx)(i.UICol,{xs:24,sm:12,lg:6,children:(0,n.jsxs)(i.UICard,{hoverable:!0,onClick:function(){return M(e.checkType,e.label)},style:{cursor:"pointer"},children:[(0,n.jsx)("div",{style:{textAlign:"center",marginBottom:l.marginMD},children:(0,n.jsx)(i.UIProgress,{type:"circle",percent:r,size:120,status:r>=100?"success":r<50?"exception":"normal",strokeColor:r>=100||r>=80?l.colorSuccess:r>=60?l.colorWarning:l.colorError,format:function(){return"".concat(r,"%")}})}),(0,n.jsx)("div",{style:{textAlign:"center",marginBottom:l.marginXS},children:(0,n.jsxs)(i.UISpace,{children:[g(e.checkType),(0,n.jsx)("span",{style:{fontWeight:600,fontSize:l.fontSizeLG},children:e.label})]})}),(0,n.jsxs)(i.UIRow,{gutter:8,justify:"center",children:[(0,n.jsx)(i.UICol,{children:(0,n.jsx)(i.UIStatistic,{title:"Passed",value:e.passed,valueStyle:{color:l.colorSuccess,fontSize:l.fontSize}})}),(0,n.jsx)(i.UICol,{children:(0,n.jsx)(i.UIStatistic,{title:"Failed",value:e.failed,valueStyle:{color:e.failed>0?l.colorError:l.colorSuccess,fontSize:l.fontSize}})}),e.skipped>0&&(0,n.jsx)(i.UICol,{children:(0,n.jsx)(i.UIStatistic,{title:"Skipped",value:e.skipped,valueStyle:{color:l.colorTextSecondary,fontSize:l.fontSize}})})]})]})},e.checkType)})}),(0,n.jsx)("div",{style:{marginBottom:l.marginLG},children:(0,n.jsx)(j,{})}),(0,n.jsx)("div",{style:{marginBottom:l.marginLG},children:(0,n.jsx)(I,{})}),(0,n.jsx)(h,{open:m,checkType:null!=(r=null==S?void 0:S.type)?r:null,checkLabel:null!=(t=null==S?void 0:S.label)?t:"",onClose:function(){return x(!1)}})]})}function A(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}function C(){var e,r=(0,o.useTheme)().antdToken,t=(0,o.useData)("/v1/plugins/qa/history"),a=t.data;if(t.isLoading)return(0,n.jsx)(i.UISpin,{size:"large",style:{display:"block",margin:"48px auto"}});if(!a||0===a.entries.length)return(0,n.jsx)(i.UIAlert,{variant:"info",showIcon:!0,message:"No QA history",description:"Run 'pnpm qa:save' to record QA results to history."});var l=[{title:"Date",dataIndex:"timestamp",key:"timestamp",width:180,render:function(e){return new Date(e).toLocaleString()},sorter:function(e,r){return new Date(e.timestamp).getTime()-new Date(r.timestamp).getTime()},defaultSortOrder:"descend"},{title:"Status",dataIndex:"status",key:"status",width:100,render:function(e){return(0,n.jsx)(i.UITag,{color:"passed"===e?"success":"error",icon:"passed"===e?(0,n.jsx)(i.UIIcon,{name:"CheckCircleOutlined"}):(0,n.jsx)(i.UIIcon,{name:"CloseCircleOutlined"}),children:e.toUpperCase()})},filters:[{text:"Passed",value:"passed"},{text:"Failed",value:"failed"}],onFilter:function(e,r){return r.status===e}},{title:"Git",key:"git",width:220,render:function(e,t){return(0,n.jsxs)(i.UISpace,{direction:"vertical",size:0,children:[(0,n.jsxs)("span",{children:[(0,n.jsx)(i.UIIcon,{name:"BranchesOutlined"})," ",t.git.branch]}),(0,n.jsxs)("span",{style:{color:r.colorTextSecondary,fontSize:r.fontSizeSM},children:[t.git.commit.slice(0,7)," - ",t.git.message.slice(0,40),t.git.message.length>40?"...":""]})]})}}].concat(function(e){if(Array.isArray(e))return A(e)}(e=(a.entries[0]?Object.keys(a.entries[0].summary):[]).map(function(e){return{title:m(e),key:e,width:90,align:"center",render:function(r,t){var a=t.summary[e];if(!a)return"-";var o=a.failed>0;return(0,n.jsxs)(i.UITag,{color:o?"error":"success",style:{fontVariantNumeric:"tabular-nums"},children:[a.passed,"/",a.passed+a.failed]})}}}))||function(e){if("u">typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e){if(e){if("string"==typeof e)return A(e,void 0);var r=Object.prototype.toString.call(e).slice(8,-1);if("Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r)return Array.from(r);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return A(e,void 0)}}(e)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}());return(0,n.jsx)(i.UITable,{columns:l,dataSource:a.entries,rowKey:"timestamp",pagination:{pageSize:15},size:"middle",expandable:{expandedRowRender:function(e){return(0,n.jsx)("div",{style:{padding:"".concat(r.paddingXS,"px ").concat(r.paddingMD,"px")},children:Object.keys(e.failedPackages).map(function(t){var a=e.failedPackages[t];return a&&0!==a.length?(0,n.jsxs)("div",{style:{marginBottom:r.marginSM},children:[(0,n.jsxs)("strong",{children:[m(t)," failures (",a.length,"):"]}),(0,n.jsx)(i.UIFlex,{wrap:"wrap",gap:1,style:{marginTop:r.marginXXS},children:a.map(function(e){return(0,n.jsx)(i.UITag,{color:"error",style:{fontSize:r.fontSizeSM},children:e},e)})})]},t):null})})},rowExpandable:function(e){return Object.values(e.failedPackages).some(function(e){return e.length>0})}}})}function z(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}function M(e,r){if(e){if("string"==typeof e)return z(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);if("Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t)return Array.from(t);if("Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return z(e,r)}}function P(){var e,r=(0,o.useTheme)().antdToken,t=function(e){if(Array.isArray(e))return e}(e=a.useState(void 0))||function(e){var r,t,n=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var i=[],a=!0,o=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),2!==i.length);a=!0);}catch(e){o=!0,t=e}finally{try{a||null==n.return||n.return()}finally{if(o)throw t}}return i}}(e)||M(e,2)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),l=t[0],s=t[1],c=(0,o.useData)(l?"/v1/plugins/qa/trends?window=".concat(l,"&enriched=true"):"/v1/plugins/qa/trends?enriched=true"),u=c.data;if(c.isLoading)return(0,n.jsx)(i.UISpin,{size:"large",style:{display:"block",margin:"48px auto"}});if(!u||0===u.trends.length)return(0,n.jsx)(i.UIAlert,{variant:"info",showIcon:!0,message:"Not enough data for trend analysis",description:"Need at least 2 history entries. Run 'pnpm qa:save' multiple times."});var d=function(e){var r=[],t=!0,n=!1,i=void 0;try{for(var a,o=e[Symbol.iterator]();!(t=(a=o.next()).done);t=!0){var l=a.value,s=null!=(f=l.label)?f:m(l.checkType),c=!0,u=!1,d=void 0;try{for(var f,p,h=l.timeSeries[Symbol.iterator]();!(c=(p=h.next()).done);c=!0){var y=p.value;r.push({date:function(e){var r=new Date(e),t=String(r.getMonth()+1).padStart(2,"0"),n=String(r.getDate()).padStart(2,"0"),i=String(r.getHours()).padStart(2,"0"),a=String(r.getMinutes()).padStart(2,"0");return"".concat(t,"-").concat(n," ").concat(i,":").concat(a)}(y.timestamp),value:y.failed,category:s})}}catch(e){u=!0,d=e}finally{try{c||null==h.return||h.return()}finally{if(u)throw d}}}}catch(e){n=!0,i=e}finally{try{t||null==o.return||o.return()}finally{if(n)throw i}}return r}(u.trends),f=function(e){var r,t=new Map,n=!0,i=!1,a=void 0;try{for(var o,l=e[Symbol.iterator]();!(n=(o=l.next()).done);n=!0){var s=o.value,c=!0,u=!1,d=void 0;try{for(var f,p=s.changelog[Symbol.iterator]();!(c=(f=p.next()).done);c=!0){var h=f.value,y=t.get(h.gitCommit);y||(y={timestamp:h.timestamp,gitCommit:h.gitCommit,gitMessage:h.gitMessage,changes:[]},t.set(h.gitCommit,y)),y.changes.push({checkType:s.checkType,entry:h})}}catch(e){u=!0,d=e}finally{try{c||null==p.return||p.return()}finally{if(u)throw d}}}}catch(e){i=!0,a=e}finally{try{n||null==l.return||l.return()}finally{if(i)throw a}}return((function(e){if(Array.isArray(e))return z(e)})(r=t.values())||function(e){if("u">typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(r)||M(r)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()).sort(function(e,r){return r.timestamp.localeCompare(e.timestamp)})}(u.trends);return(0,n.jsxs)("div",{children:[(0,n.jsxs)(i.UIFlex,{justify:"between",align:"center",style:{marginBottom:r.marginMD},children:[(0,n.jsxs)("span",{style:{color:r.colorTextSecondary},children:["Analyzing ",u.historyCount," history entries (window: ",u.window,")"]}),(0,n.jsxs)(i.UISpace,{children:[(0,n.jsx)("span",{children:"Window size:"}),(0,n.jsx)(i.UISelect,{value:null!=l?l:u.window,onChange:function(e){return s(e)},style:{width:80},options:[{label:"5",value:5},{label:"10",value:10},{label:"20",value:20},{label:"50",value:50}]})]})]}),(0,n.jsx)(i.UIStatisticsChart,{title:"Failure Count Over Time",data:d,loading:!1,xField:"date",yField:"value",colorField:"category",height:300,showLegend:!1,chartProps:{legend:{position:"top"}}}),(0,n.jsx)(i.UIRow,{gutter:[16,16],style:{marginTop:r.marginMD},children:u.trends.map(function(e){var t;return(0,n.jsx)(i.UICol,{xs:24,sm:12,children:(0,n.jsxs)(i.UICard,{size:"small",children:[(0,n.jsx)(i.UIRow,{align:"middle",gutter:16,children:(0,n.jsx)(i.UICol,{flex:"auto",children:(0,n.jsxs)(i.UISpace,{children:[g(e.checkType),(0,n.jsx)("span",{style:{fontWeight:600,fontSize:r.fontSizeLG},children:null!=(t=e.label)?t:m(e.checkType)}),function(e){switch(e){case"regression":return(0,n.jsx)(i.UITag,{color:"error",children:"Regression"});case"improvement":return(0,n.jsx)(i.UITag,{color:"success",children:"Improvement"});default:return(0,n.jsx)(i.UITag,{children:"No Change"})}}(e.trend)]})})}),(0,n.jsxs)(i.UIRow,{gutter:16,style:{marginTop:r.marginSM},children:[(0,n.jsx)(i.UICol,{span:6,children:(0,n.jsx)(i.UIStatistic,{title:"Previous",value:e.previous,valueStyle:{fontSize:r.fontSizeHeading4}})}),(0,n.jsx)(i.UICol,{span:6,children:(0,n.jsx)(i.UIStatistic,{title:"Current",value:e.current,valueStyle:{fontSize:r.fontSizeHeading4}})}),(0,n.jsx)(i.UICol,{span:6,children:(0,n.jsx)(i.UIStatistic,{title:"Delta",value:Math.abs(e.delta),prefix:function(e){switch(e){case"regression":return(0,n.jsx)(i.UIIcon,{name:"ArrowUpOutlined"});case"improvement":return(0,n.jsx)(i.UIIcon,{name:"ArrowDownOutlined"});default:return(0,n.jsx)(i.UIIcon,{name:"MinusOutlined"})}}(e.trend),valueStyle:{color:function(e,r){switch(e){case"regression":return r.colorError;case"improvement":return r.colorSuccess;default:return r.colorTextSecondary}}(e.trend,r),fontSize:r.fontSizeHeading4}})}),(0,n.jsx)(i.UICol,{span:6,children:(0,n.jsx)(i.UIStatistic,{title:"Velocity",value:Math.abs(e.velocity),precision:1,prefix:e.velocity>0?(0,n.jsx)(i.UIIcon,{name:"ArrowUpOutlined"}):e.velocity<0?(0,n.jsx)(i.UIIcon,{name:"ArrowDownOutlined"}):(0,n.jsx)(i.UIIcon,{name:"MinusOutlined"}),suffix:"/run",valueStyle:{color:e.velocity>0?r.colorError:e.velocity<0?r.colorSuccess:r.colorTextSecondary,fontSize:r.fontSizeHeading4}})})]})]})},e.checkType)})}),(0,n.jsx)(i.UICard,{title:"Changelog — What Changed",style:{marginTop:r.marginMD},children:0===f.length?(0,n.jsx)(i.UIEmptyState,{description:"No changes detected between entries"}):(0,n.jsx)(i.UITimeline,{children:f.map(function(e){var t=e.changes.reduce(function(e,r){return e+r.entry.newFailures.length},0)>e.changes.reduce(function(e,r){return e+r.entry.fixed.length},0)?r.colorError:r.colorSuccess;return(0,n.jsxs)(i.UITimelineItem,{color:t,children:[(0,n.jsxs)("div",{style:{marginBottom:r.marginXXS},children:[(0,n.jsx)(i.UITag,{style:{fontFamily:"monospace"},children:e.gitCommit.slice(0,7)}),(0,n.jsx)("span",{style:{color:r.colorTextSecondary,fontSize:r.fontSizeSM},children:new Date(e.timestamp).toLocaleString()})]}),(0,n.jsx)("div",{style:{fontSize:r.fontSize,color:r.colorTextSecondary,marginBottom:r.marginXS},children:e.gitMessage}),e.changes.map(function(e){var t=e.checkType,a=e.entry;return(0,n.jsxs)("div",{style:{marginBottom:r.marginXXS},children:[(0,n.jsxs)("span",{style:{fontWeight:500},children:[m(t),":"]}),a.newFailures.length>0&&(0,n.jsxs)("span",{style:{marginLeft:8},children:[(0,n.jsxs)(i.UITag,{color:"error",style:{fontSize:r.fontSizeSM},children:["+",a.newFailures.length," new"]}),a.newFailures.map(function(e){return(0,n.jsx)(i.UITag,{color:"red",style:{fontSize:r.fontSizeSM},children:e},e)})]}),a.fixed.length>0&&(0,n.jsxs)("span",{style:{marginLeft:8},children:[(0,n.jsxs)(i.UITag,{color:"success",style:{fontSize:r.fontSizeSM},children:["-",a.fixed.length," fixed"]}),a.fixed.map(function(e){return(0,n.jsx)(i.UITag,{color:"green",style:{fontSize:r.fontSizeSM},children:e},e)})]})]},t)})]},e.gitCommit)})})})]})}function F(){var e=(0,o.useTheme)().antdToken,r=(0,o.useData)("/v1/plugins/qa/regressions"),t=r.data;return r.isLoading?(0,n.jsx)(i.UISpin,{size:"large",style:{display:"block",margin:"48px auto"}}):t?t.hasRegressions?(0,n.jsxs)("div",{children:[(0,n.jsx)(i.UIAlert,{variant:"error",showIcon:!0,icon:(0,n.jsx)(i.UIIcon,{name:"WarningOutlined"}),message:"".concat(t.regressions.length," regression").concat(t.regressions.length>1?"s":""," detected"),description:"The following check types have new failures compared to the previous QA run.",style:{marginBottom:e.marginLG}}),t.regressions.map(function(r,t){return(0,n.jsx)(i.UICard,{title:(0,n.jsxs)(i.UISpace,{children:[g(r.checkType),(0,n.jsx)("span",{children:m(r.checkType)}),(0,n.jsxs)(i.UITag,{color:"error",children:["+",r.delta," new failure",r.delta>1?"s":""]})]}),style:{marginBottom:e.marginMD},children:(0,n.jsxs)("div",{children:[(0,n.jsx)("strong",{children:"New failures:"}),(0,n.jsx)(i.UIFlex,{wrap:"wrap",gap:1,style:{marginTop:e.marginXS},children:r.newFailures.map(function(e){return(0,n.jsx)(i.UITag,{color:"error",children:e},e)})})]})},t)}),(0,n.jsx)(i.UIAlert,{variant:"warning",showIcon:!0,message:"Action required",description:(0,n.jsxs)("div",{children:[(0,n.jsx)("p",{children:"Fix the regressions above before merging. Recommendations:"}),(0,n.jsxs)("ol",{style:{margin:0,paddingLeft:20},children:[(0,n.jsxs)("li",{children:["Run ",(0,n.jsx)("code",{children:"pnpm qa --json"})," to see detailed error messages"]}),(0,n.jsx)("li",{children:"Fix the failing packages"}),(0,n.jsxs)("li",{children:["Re-run ",(0,n.jsx)("code",{children:"pnpm qa:save"})," to verify fixes"]}),(0,n.jsxs)("li",{children:["Update baseline if needed: ",(0,n.jsx)("code",{children:"pnpm kb baseline:update"})]})]})]}),style:{marginTop:e.marginMD}})]}):(0,n.jsxs)("div",{children:[(0,n.jsx)(i.UIAlert,{variant:"success",showIcon:!0,icon:(0,n.jsx)(i.UIIcon,{name:"CheckCircleOutlined"}),message:"No regressions detected",description:"All check types show the same or fewer failures compared to the previous QA run.",style:{marginBottom:e.marginLG}}),(0,n.jsx)(i.UIEmptyState,{description:"No regressions to display"})]}):(0,n.jsx)(i.UIAlert,{variant:"info",showIcon:!0,message:"Not enough data for regression detection",description:"Need at least 2 history entries. Run 'pnpm qa:save' multiple times."})}function D(){var e=(0,n.jsx)(i.UITabs,{syncUrl:"search",items:[{key:"overview",label:"Overview",children:(0,n.jsx)(O,{})},{key:"history",label:"History",children:(0,n.jsx)(C,{})},{key:"trends",label:"Trends",children:(0,n.jsx)(P,{})},{key:"regressions",label:"Regressions",children:(0,n.jsx)(F,{})}]});return(0,n.jsx)(i.UIPage,{children:(0,n.jsx)(i.UIPageHeader,{title:"QA",description:"Build, lint, type check, and test results with baseline tracking and regression detection",tabs:e})})}}}]);
|
|
2
|
+
//# sourceMappingURL=__federation_expose_QADashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"__federation_expose_QADashboard.js","sources":["webpack://@kb-labs/qa-entry/../../../node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react-jsx-runtime.production.min.js","webpack://@kb-labs/qa-entry/../../../node_modules/.pnpm/react@18.3.1/node_modules/react/jsx-runtime.js","webpack://@kb-labs/qa-entry/./src/studio/components/CheckDetailDrawer.tsx","webpack://@kb-labs/qa-entry/./src/studio/utils/check-display.tsx","webpack://@kb-labs/qa-entry/./src/studio/components/BaselineDiffCard.tsx","webpack://@kb-labs/qa-entry/./src/studio/components/ErrorGroupsPanel.tsx","webpack://@kb-labs/qa-entry/./src/studio/components/OverviewTab.tsx","webpack://@kb-labs/qa-entry/./src/studio/components/HistoryTab.tsx","webpack://@kb-labs/qa-entry/./src/studio/components/TrendsTab.tsx","webpack://@kb-labs/qa-entry/./src/studio/components/RegressionsTab.tsx","webpack://@kb-labs/qa-entry/./src/studio/pages/QADashboard.tsx"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/**\n * Drawer showing per-package details for a specific check type.\n * Opens when a check card is clicked on the overview tab.\n */\n\nimport * as React from 'react';\nimport {\n UIDrawer,\n UITable,\n UITag,\n UIInput,\n UISpace,\n UITypographyText,\n UIButton,\n UIMessage,\n UIAccordion,\n UIIcon,\n useData,\n useMutateData,\n useTheme,\n} from '@kb-labs/sdk/studio';\nimport type { QADetailsResponse, QARunCheckRequest, QARunCheckResponse } from '@kb-labs/qa-contracts';\n\ninterface CheckDetailDrawerProps {\n open: boolean;\n checkType: string | null;\n checkLabel: string;\n onClose: () => void;\n}\n\nconst STATUS_CONFIG: Record<string, { color: string; iconName: string }> = {\n passed: { color: 'success', iconName: 'CheckCircleOutlined' },\n failed: { color: 'error', iconName: 'CloseCircleOutlined' },\n skipped: { color: 'default', iconName: 'MinusCircleOutlined' },\n};\n\nexport function CheckDetailDrawer({ open, checkType, checkLabel, onClose }: CheckDetailDrawerProps) {\n const { antdToken: token } = useTheme();\n const { data: details, isLoading } = useData<QADetailsResponse>('/v1/plugins/qa/details');\n const { mutateAsync: runCheck, isLoading: isRunning } = useMutateData<QARunCheckRequest, QARunCheckResponse>(\n '/v1/plugins/qa/run/check',\n 'POST',\n );\n const [search, setSearch] = React.useState('');\n\n if (!checkType) { return null; }\n\n const checkData = details?.checks[checkType];\n\n const allPackages = [\n ...(checkData?.failed ?? []).map((p) => ({ ...p, status: 'failed' as const })),\n ...(checkData?.passed ?? []).map((p) => ({ ...p, status: 'passed' as const })),\n ...(checkData?.skipped ?? []).map((p) => ({ ...p, status: 'skipped' as const })),\n ].filter((p) =>\n !search || p.name.toLowerCase().includes(search.toLowerCase()) || p.repo.toLowerCase().includes(search.toLowerCase()),\n );\n\n const handleRunCheck = async () => {\n void UIMessage.loading(`Running ${checkLabel}...`, 0);\n try {\n const data = await runCheck({ checkType: checkType as 'lint' | 'typeCheck' | 'test' });\n UIMessage.destroy();\n if (data.status === 'passed') {\n UIMessage.success(`${checkLabel} passed in ${(data.durationMs / 1000).toFixed(1)}s`);\n } else {\n UIMessage.warning(`${checkLabel}: ${data.result.failed.length} failures in ${(data.durationMs / 1000).toFixed(1)}s`);\n }\n } catch (error) {\n UIMessage.destroy();\n UIMessage.error(`${checkLabel} failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n };\n\n const canRerun = checkType !== 'build';\n\n const columns = [\n {\n title: 'Status',\n dataIndex: 'status',\n key: 'status',\n width: 80,\n filters: [\n { text: 'Failed', value: 'failed' },\n { text: 'Passed', value: 'passed' },\n { text: 'Skipped', value: 'skipped' },\n ],\n onFilter: (value: unknown, record: { status: string }) => record.status === value,\n render: (status: keyof typeof STATUS_CONFIG) => {\n const cfg = STATUS_CONFIG[status];\n return <UITag color={cfg?.color} icon={cfg ? <UIIcon name={cfg.iconName} /> : undefined}>{status}</UITag>;\n },\n },\n {\n title: 'Package',\n dataIndex: 'name',\n key: 'name',\n sorter: (a: { name: string }, b: { name: string }) => a.name.localeCompare(b.name),\n render: (name: string) => (\n <UITypographyText code style={{ fontSize: token.fontSizeSM }}>{name}</UITypographyText>\n ),\n },\n {\n title: 'Repo',\n dataIndex: 'repo',\n key: 'repo',\n width: 180,\n filters: [...new Set(allPackages.map((p) => p.repo))].map((r) => ({ text: r, value: r })),\n onFilter: (value: unknown, record: { repo: string }) => record.repo === value,\n render: (repo: string) => <UITag>{repo}</UITag>,\n },\n ];\n\n const expandedRowRender = (record: { error?: string }) => {\n if (!record.error) { return null; }\n return (\n <UIAccordion\n ghost\n items={[{\n key: '1',\n label: 'Error output',\n children: (\n <pre style={{\n background: token.colorFillTertiary,\n color: token.colorText,\n padding: token.paddingSM,\n borderRadius: token.borderRadius,\n fontSize: token.fontSizeSM,\n maxHeight: 300,\n overflow: 'auto',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all',\n }}>\n {record.error}\n </pre>\n ),\n }]}\n />\n );\n };\n\n return (\n <UIDrawer\n title={\n <UISpace>\n <span>{checkLabel} Details</span>\n <UITag color={checkData?.failed.length ? 'error' : 'success'}>\n {checkData?.failed.length ?? 0} failed\n </UITag>\n </UISpace>\n }\n placement=\"right\"\n width={720}\n open={open}\n onClose={onClose}\n extra={\n canRerun && (\n <UIButton\n variant=\"primary\"\n icon={<UIIcon name=\"PlayCircleOutlined\" />}\n onClick={() => void handleRunCheck()}\n loading={isRunning}\n size=\"small\"\n >\n Re-run {checkLabel}\n </UIButton>\n )\n }\n >\n <UIInput\n placeholder=\"Filter by package or repo...\"\n prefix={<UIIcon name=\"SearchOutlined\" />}\n value={search}\n onChange={(value) => setSearch(value)}\n style={{ marginBottom: token.marginMD }}\n allowClear\n />\n\n <UITable\n dataSource={allPackages}\n columns={columns}\n rowKey=\"name\"\n size=\"small\"\n loading={isLoading}\n pagination={{ pageSize: 50 }}\n expandable={{\n expandedRowRender,\n rowExpandable: (record) => !!record.error,\n }}\n />\n </UIDrawer>\n );\n}\n","/**\n * Shared utilities for rendering QA check icons and labels.\n */\n\nimport * as React from 'react';\nimport { UIIcon } from '@kb-labs/sdk/studio';\n\nconst KNOWN_ICONS: Record<string, string> = {\n build: 'BuildOutlined',\n lint: 'FileSearchOutlined',\n typeCheck: 'FileTextOutlined',\n test: 'ExperimentOutlined',\n};\n\nexport function getCheckIcon(checkType: string): React.ReactNode {\n return <UIIcon name={KNOWN_ICONS[checkType] ?? 'CheckCircleOutlined'} />;\n}\n\nexport function formatCheckLabel(checkType: string): string {\n return checkType.charAt(0).toUpperCase() + checkType.slice(1).replace(/([A-Z])/g, ' $1');\n}\n","/**\n * Baseline diff card — shows new failures, fixed packages, and delta per check type.\n * Includes \"Update Baseline\" button.\n */\n\nimport * as React from 'react';\nimport {\n UICard,\n UIRow,\n UICol,\n UITag,\n UITypographyText,\n UIAlert,\n UIButton,\n UIPopconfirm,\n UIMessage,\n UISpace,\n UIStatistic,\n UIIcon,\n useData,\n useMutateData,\n useTheme,\n} from '@kb-labs/sdk/studio';\nimport { formatCheckLabel } from '../utils/check-display';\nimport type { QABaselineDiffResponse } from '@kb-labs/qa-contracts';\n\nexport function BaselineDiffCard() {\n const { antdToken: token } = useTheme();\n const { data: diffData, isLoading } = useData<QABaselineDiffResponse>('/v1/plugins/qa/baseline/diff');\n const { mutateAsync: updateBaseline, isLoading: isUpdating } = useMutateData<undefined, void>(\n '/v1/plugins/qa/baseline/update',\n 'POST',\n );\n\n const handleUpdateBaseline = async () => {\n void UIMessage.loading('Updating baseline...', 0);\n try {\n await updateBaseline(undefined);\n UIMessage.destroy();\n UIMessage.success('Baseline updated successfully');\n } catch (error) {\n UIMessage.destroy();\n UIMessage.error(`Failed to update baseline: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n };\n\n if (isLoading) { return null; }\n\n if (!diffData?.baseline) {\n return (\n <UIAlert\n variant=\"warning\"\n showIcon\n message=\"No baseline set\"\n description=\"Run QA first, then update baseline to enable diff tracking.\"\n action={\n <UIButton\n variant=\"primary\"\n size=\"small\"\n icon={<UIIcon name=\"SaveOutlined\" />}\n onClick={() => void handleUpdateBaseline()}\n loading={isUpdating}\n >\n Create Baseline\n </UIButton>\n }\n />\n );\n }\n\n if (!diffData.hasDiff) {\n return (\n <UIAlert\n variant=\"success\"\n showIcon\n icon={<UIIcon name=\"CheckCircleOutlined\" />}\n message=\"No changes since baseline\"\n description={`Baseline from ${new Date(diffData.baseline.timestamp).toLocaleString()}`}\n action={\n <UIPopconfirm\n title=\"Update baseline?\"\n description=\"This will set the current QA state as the new baseline.\"\n onConfirm={() => void handleUpdateBaseline()}\n >\n <UIButton size=\"small\" icon={<UIIcon name=\"SaveOutlined\" />} loading={isUpdating}>\n Update\n </UIButton>\n </UIPopconfirm>\n }\n />\n );\n }\n\n let totalNew = 0;\n let totalFixed = 0;\n for (const d of Object.values(diffData.diff)) {\n totalNew += d.newFailures.length;\n totalFixed += d.fixed.length;\n }\n\n return (\n <UICard\n title={\n <UISpace>\n <UIIcon name=\"WarningOutlined\" style={{ color: totalNew > 0 ? token.colorError : token.colorSuccess }} />\n <span>Baseline Diff</span>\n {totalNew > 0 && <UITag color=\"error\">+{totalNew} new failures</UITag>}\n {totalFixed > 0 && <UITag color=\"success\">{totalFixed} fixed</UITag>}\n </UISpace>\n }\n extra={\n <UIPopconfirm\n title=\"Update baseline?\"\n description=\"This will set the current QA state as the new baseline.\"\n onConfirm={() => void handleUpdateBaseline()}\n >\n <UIButton variant=\"primary\" icon={<UIIcon name=\"SaveOutlined\" />} loading={isUpdating} size=\"small\">\n Update Baseline\n </UIButton>\n </UIPopconfirm>\n }\n >\n <UIRow gutter={[16, 16]}>\n {Object.entries(diffData.diff).map(([ct, d]) => (\n <UICol xs={24} sm={12} lg={6} key={ct}>\n <UICard size=\"small\" style={{ textAlign: 'center' }}>\n <UITypographyText strong>{formatCheckLabel(ct)}</UITypographyText>\n <div style={{ marginTop: token.marginXS }}>\n <UIStatistic\n value={Math.abs(d.delta)}\n prefix={d.delta > 0 ? <UIIcon name=\"ArrowUpOutlined\" /> : d.delta < 0 ? <UIIcon name=\"ArrowDownOutlined\" /> : null}\n valueStyle={{\n color: d.delta > 0 ? token.colorError : d.delta < 0 ? token.colorSuccess : token.colorTextSecondary,\n fontSize: token.fontSizeHeading3,\n }}\n suffix={d.delta > 0 ? 'more failures' : d.delta < 0 ? 'fewer failures' : 'no change'}\n />\n </div>\n {d.newFailures.length > 0 && (\n <div style={{ marginTop: token.marginXS, textAlign: 'left' }}>\n <UITypographyText type=\"danger\" style={{ fontSize: token.fontSizeSM }}>New failures:</UITypographyText>\n {d.newFailures.slice(0, 3).map((pkg) => (\n <div key={pkg}><UITag color=\"error\" style={{ fontSize: token.fontSizeSM }}>{pkg}</UITag></div>\n ))}\n {d.newFailures.length > 3 && (\n <UITypographyText type=\"secondary\" style={{ fontSize: token.fontSizeSM }}>\n +{d.newFailures.length - 3} more\n </UITypographyText>\n )}\n </div>\n )}\n {d.fixed.length > 0 && (\n <div style={{ marginTop: token.marginXS, textAlign: 'left' }}>\n <UITypographyText type=\"success\" style={{ fontSize: token.fontSizeSM }}>Fixed:</UITypographyText>\n {d.fixed.slice(0, 3).map((pkg) => (\n <div key={pkg}><UITag color=\"success\" style={{ fontSize: token.fontSizeSM }}>{pkg}</UITag></div>\n ))}\n {d.fixed.length > 3 && (\n <UITypographyText type=\"secondary\" style={{ fontSize: token.fontSizeSM }}>\n +{d.fixed.length - 3} more\n </UITypographyText>\n )}\n </div>\n )}\n </UICard>\n </UICol>\n ))}\n </UIRow>\n </UICard>\n );\n}\n","/**\n * Panel showing errors grouped by pattern (ESLint rules, TS codes, etc.)\n * Helps identify the most impactful errors to fix first.\n */\n\nimport * as React from 'react';\nimport {\n UICard,\n UITable,\n UITag,\n UITypographyText,\n UISpace,\n UIBadge,\n UISpin,\n UIIcon,\n useData,\n useTheme,\n} from '@kb-labs/sdk/studio';\nimport type { QAErrorGroupsResponse } from '@kb-labs/qa-contracts';\n\nconst CHECK_TYPE_CONFIG: Record<string, { color: string; iconName: string; label: string }> = {\n build: { color: 'red', iconName: 'BugOutlined', label: 'Build' },\n lint: { color: 'orange', iconName: 'FileSearchOutlined', label: 'Lint' },\n typeCheck: { color: 'blue', iconName: 'FileTextOutlined', label: 'Types' },\n test: { color: 'purple', iconName: 'ExperimentOutlined', label: 'Tests' },\n};\n\nexport function ErrorGroupsPanel() {\n const { antdToken: token } = useTheme();\n const { data, isLoading } = useData<QAErrorGroupsResponse>('/v1/plugins/qa/errors/groups');\n\n if (isLoading) {\n return <UISpin size=\"large\" style={{ display: 'block', margin: '48px auto' }} />;\n }\n\n if (!data || (data.groups.length === 0 && data.ungrouped === 0)) {\n return null;\n }\n\n const columns = [\n {\n title: 'Pattern',\n dataIndex: 'pattern',\n key: 'pattern',\n render: (pattern: string) => (\n <UITypographyText code style={{ fontSize: token.fontSizeSM }}>{pattern}</UITypographyText>\n ),\n },\n {\n title: 'Type',\n dataIndex: 'checkType',\n key: 'checkType',\n width: 100,\n filters: Object.entries(CHECK_TYPE_CONFIG).map(([key, cfg]) => ({\n text: cfg.label,\n value: key,\n })),\n onFilter: (value: unknown, record: { checkType: string }) => record.checkType === value,\n render: (ct: string) => {\n const cfg = CHECK_TYPE_CONFIG[ct];\n return cfg ? (\n <UITag color={cfg.color} icon={<UIIcon name={cfg.iconName} />}>{cfg.label}</UITag>\n ) : (\n <UITag>{ct}</UITag>\n );\n },\n },\n {\n title: 'Affected',\n dataIndex: 'count',\n key: 'count',\n width: 100,\n sorter: (a: { count: number }, b: { count: number }) => a.count - b.count,\n defaultSortOrder: 'descend' as const,\n render: (count: number) => (\n <UIBadge count={count} style={{ backgroundColor: count > 5 ? token.colorError : count > 2 ? token.colorWarning : token.colorSuccess }} />\n ),\n },\n {\n title: 'Packages',\n dataIndex: 'packages',\n key: 'packages',\n render: (packages: string[]) => (\n <UISpace wrap size={[4, 4]}>\n {packages.slice(0, 3).map((pkg) => (\n <UITag key={pkg} style={{ fontSize: token.fontSizeSM }}>{pkg}</UITag>\n ))}\n {packages.length > 3 && (\n <UITypographyText type=\"secondary\" style={{ fontSize: token.fontSizeSM }}>\n +{packages.length - 3} more\n </UITypographyText>\n )}\n </UISpace>\n ),\n },\n ];\n\n const expandedRowRender = (record: { example?: string; packages: string[] }) => (\n <div>\n <UITypographyText type=\"secondary\" style={{ fontSize: token.fontSizeSM }}>Example:</UITypographyText>\n <pre style={{\n background: token.colorFillTertiary,\n color: token.colorText,\n padding: token.paddingXS,\n borderRadius: token.borderRadiusSM,\n fontSize: token.fontSizeSM,\n maxHeight: 150,\n overflow: 'auto',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all',\n marginTop: token.marginXXS,\n }}>\n {record.example}\n </pre>\n {record.packages.length > 3 && (\n <div style={{ marginTop: token.marginXS }}>\n <UITypographyText type=\"secondary\" style={{ fontSize: token.fontSizeSM }}>All affected packages:</UITypographyText>\n <div style={{ marginTop: token.marginXXS }}>\n <UISpace wrap size={[4, 4]}>\n {record.packages.map((pkg: string) => (\n <UITag key={pkg} style={{ fontSize: token.fontSizeSM }}>{pkg}</UITag>\n ))}\n </UISpace>\n </div>\n </div>\n )}\n </div>\n );\n\n return (\n <UICard\n title={\n <UISpace>\n <UIIcon name=\"BugOutlined\" />\n <span>Error Groups</span>\n <UITag>{data.groups.length} patterns</UITag>\n {data.ungrouped > 0 && (\n <UITag color=\"default\">{data.ungrouped} unique errors</UITag>\n )}\n </UISpace>\n }\n >\n <UITable\n dataSource={data.groups}\n columns={columns}\n rowKey=\"pattern\"\n size=\"small\"\n pagination={{ pageSize: 10 }}\n expandable={{\n expandedRowRender,\n rowExpandable: () => true,\n }}\n />\n </UICard>\n );\n}\n","/**\n * Overview tab - per-check pass rates, status badge, baseline diff, error groups.\n * Check cards are clickable — opens a drawer with per-package details.\n */\n\nimport * as React from 'react';\nimport {\n UIRow, UICol, UICard, UIStatistic, UIProgress, UITag, UIAlert,\n UISpin, UISpace, UIButton, UIMessage, UIIcon, UICheckbox, UIPopover,\n useData, useMutateData, useTheme,\n} from '@kb-labs/sdk/studio';\nimport { CheckDetailDrawer } from './CheckDetailDrawer';\nimport { BaselineDiffCard } from './BaselineDiffCard';\nimport { ErrorGroupsPanel } from './ErrorGroupsPanel';\nimport { getCheckIcon } from '../utils/check-display';\nimport type { QASummaryResponse, QARunResponse } from '@kb-labs/qa-contracts';\nfunction getPassRate(passed: number, total: number, skipped: number = 0): number {\n if (total === 0) {return 100;}\n return Math.round(((passed + skipped) / total) * 100);\n}\n\nfunction getProgressStatus(rate: number): 'success' | 'exception' | 'normal' {\n if (rate >= 100) {return 'success';}\n if (rate < 50) {return 'exception';}\n return 'normal';\n}\n\ntype AntToken = ReturnType<typeof useTheme>['antdToken'];\n\nfunction getProgressColor(rate: number, token: AntToken): string {\n if (rate >= 100) {return token.colorSuccess;}\n if (rate >= 80) {return token.colorSuccess;}\n if (rate >= 60) {return token.colorWarning;}\n return token.colorError;\n}\n\nexport function OverviewTab() {\n const { antdToken: token } = useTheme();\n const { data: summary, isLoading: summaryLoading } = useData<QASummaryResponse>(\n '/v1/plugins/qa/summary',\n );\n const { mutateAsync: runQA, isLoading: isRunning } = useMutateData<\n { skipChecks?: string[] },\n QARunResponse\n >('/v1/plugins/qa/run');\n\n const [drawerOpen, setDrawerOpen] = React.useState(false);\n const [selectedCheck, setSelectedCheck] = React.useState<{ type: string; label: string } | null>(null);\n const [skippedChecks, setSkippedChecks] = React.useState<Set<string>>(new Set());\n\n const toggleCheck = (id: string, enabled: boolean) => {\n setSkippedChecks(prev => {\n const next = new Set(prev);\n if (enabled) { next.delete(id); } else { next.add(id); }\n return next;\n });\n };\n\n const handleCheckClick = (checkType: string, label: string) => {\n setSelectedCheck({ type: checkType, label });\n setDrawerOpen(true);\n };\n\n const handleRunQA = async () => {\n void UIMessage.loading('Running QA checks...', 0);\n try {\n const data = await runQA({ skipChecks: skippedChecks.size > 0 ? [...skippedChecks] : undefined });\n UIMessage.destroy();\n if (data.status === 'passed') {\n UIMessage.success(`QA passed in ${(data.durationMs / 1000).toFixed(1)}s`);\n } else {\n const totalFailed = Object.values(data.results).reduce((sum, r) => sum + r.failed.length, 0);\n UIMessage.warning(`QA finished with ${totalFailed} failures in ${(data.durationMs / 1000).toFixed(1)}s`);\n }\n } catch (error) {\n UIMessage.destroy();\n UIMessage.error(`QA run failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n };\n\n if (summaryLoading) {\n return <UISpin size=\"large\" style={{ display: 'block', margin: '48px auto' }} />;\n }\n\n if (!summary) {\n return (\n <UIAlert\n variant=\"info\"\n showIcon\n message=\"No QA data\"\n description=\"Run 'pnpm qa:save' to generate QA history.\"\n style={{ marginBottom: token.marginLG }}\n />\n );\n }\n\n const overallPassed = summary.status === 'passed';\n\n return (\n <div>\n {/* Run QA Button */}\n <div style={{ marginBottom: token.marginMD }}>\n <UISpace>\n <UIButton\n variant=\"primary\"\n icon={<UIIcon name=\"PlayCircleOutlined\" />}\n onClick={() => void handleRunQA()}\n loading={isRunning}\n disabled={isRunning}\n >\n {isRunning ? 'Running QA Checks...' : 'Run QA'}\n </UIButton>\n <UIPopover\n trigger=\"click\"\n title=\"Checks to run\"\n content={\n <UISpace direction=\"vertical\">\n {(summary?.checks ?? []).map(c => (\n <UICheckbox\n key={c.checkType}\n checked={!skippedChecks.has(c.checkType)}\n onChange={(checked) => toggleCheck(c.checkType, checked)}\n >\n {getCheckIcon(c.checkType)}{' '}{c.label}\n </UICheckbox>\n ))}\n </UISpace>\n }\n >\n <UIButton icon={<UIIcon name=\"SettingOutlined\" />} disabled={isRunning} />\n </UIPopover>\n </UISpace>\n </div>\n\n {/* Status Banner */}\n <UIAlert\n variant={overallPassed ? 'success' : 'error'}\n showIcon\n icon={overallPassed ? <UIIcon name=\"CheckCircleOutlined\" /> : <UIIcon name=\"CloseCircleOutlined\" />}\n message={\n <UISpace>\n <span style={{ fontWeight: 600 }}>\n QA Status: {overallPassed ? 'All Checks Passing' : 'Checks Failing'}\n </span>\n <UITag color={overallPassed ? 'success' : 'error'}>\n {summary.status.toUpperCase()}\n </UITag>\n </UISpace>\n }\n description={\n summary.lastRunAt ? (\n <UISpace split={<span style={{ color: token.colorBorderSecondary }}>|</span>}>\n <span><UIIcon name=\"ClockCircleOutlined\" /> {new Date(summary.lastRunAt).toLocaleString()}</span>\n {summary.git && (\n <span><UIIcon name=\"BranchesOutlined\" /> {summary.git.branch} ({summary.git.commit.slice(0, 7)})</span>\n )}\n <span>{summary.historyCount} runs in history</span>\n </UISpace>\n ) : undefined\n }\n style={{ marginBottom: token.marginLG }}\n />\n\n {/* Check Cards */}\n <UIRow gutter={[16, 16]} style={{ marginBottom: token.marginLG }}>\n {summary.checks.map((check) => {\n const rate = getPassRate(check.passed, check.total, check.skipped);\n return (\n <UICol xs={24} sm={12} lg={6} key={check.checkType}>\n <UICard hoverable onClick={() => handleCheckClick(check.checkType, check.label)} style={{ cursor: 'pointer' }}>\n <div style={{ textAlign: 'center', marginBottom: token.marginMD }}>\n <UIProgress\n type=\"circle\"\n percent={rate}\n size={120}\n status={getProgressStatus(rate)}\n strokeColor={getProgressColor(rate, token)}\n format={() => `${rate}%`}\n />\n </div>\n <div style={{ textAlign: 'center', marginBottom: token.marginXS }}>\n <UISpace>\n {getCheckIcon(check.checkType)}\n <span style={{ fontWeight: 600, fontSize: token.fontSizeLG }}>{check.label}</span>\n </UISpace>\n </div>\n <UIRow gutter={8} justify=\"center\">\n <UICol><UIStatistic title=\"Passed\" value={check.passed} valueStyle={{ color: token.colorSuccess, fontSize: token.fontSize }} /></UICol>\n <UICol>\n <UIStatistic\n title=\"Failed\"\n value={check.failed}\n valueStyle={{ color: check.failed > 0 ? token.colorError : token.colorSuccess, fontSize: token.fontSize }}\n />\n </UICol>\n {check.skipped > 0 && (\n <UICol><UIStatistic title=\"Skipped\" value={check.skipped} valueStyle={{ color: token.colorTextSecondary, fontSize: token.fontSize }} /></UICol>\n )}\n </UIRow>\n </UICard>\n </UICol>\n );\n })}\n </UIRow>\n\n {/* Baseline Diff */}\n <div style={{ marginBottom: token.marginLG }}>\n <BaselineDiffCard />\n </div>\n\n {/* Error Groups */}\n <div style={{ marginBottom: token.marginLG }}>\n <ErrorGroupsPanel />\n </div>\n\n {/* Check Detail Drawer */}\n <CheckDetailDrawer\n open={drawerOpen}\n checkType={selectedCheck?.type ?? null}\n checkLabel={selectedCheck?.label ?? ''}\n onClose={() => setDrawerOpen(false)}\n />\n </div>\n );\n}\n","/**\n * History tab - table of past QA runs with expandable failure details\n */\n\nimport * as React from 'react';\nimport { UITable, UITag, UISpin, UIAlert, UISpace, UIIcon, UIFlex, useData, useTheme, type UITableColumn } from '@kb-labs/sdk/studio';\nimport type { QAHistoryResponse, HistoryEntry } from '@kb-labs/qa-contracts';\nimport { formatCheckLabel } from '../utils/check-display';\n\nfunction renderCheckColumn(entry: HistoryEntry, checkType: string) {\n const s = entry.summary[checkType];\n if (!s) {return '-';}\n const hasFailed = s.failed > 0;\n return (\n <UITag color={hasFailed ? 'error' : 'success'} style={{ fontVariantNumeric: 'tabular-nums' }}>\n {s.passed}/{s.passed + s.failed}\n </UITag>\n );\n}\n\nexport function HistoryTab() {\n const { antdToken: token } = useTheme();\n const { data, isLoading } = useData<QAHistoryResponse>('/v1/plugins/qa/history');\n\n if (isLoading) {\n return <UISpin size=\"large\" style={{ display: 'block', margin: '48px auto' }} />;\n }\n\n if (!data || data.entries.length === 0) {\n return (\n <UIAlert\n variant=\"info\"\n showIcon\n message=\"No QA history\"\n description=\"Run 'pnpm qa:save' to record QA results to history.\"\n />\n );\n }\n\n const columns: UITableColumn<HistoryEntry>[] = [\n {\n title: 'Date',\n dataIndex: 'timestamp',\n key: 'timestamp',\n width: 180,\n render: (ts: string) => new Date(ts).toLocaleString(),\n sorter: (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),\n defaultSortOrder: 'descend',\n },\n {\n title: 'Status',\n dataIndex: 'status',\n key: 'status',\n width: 100,\n render: (status: string) => (\n <UITag\n color={status === 'passed' ? 'success' : 'error'}\n icon={status === 'passed' ? <UIIcon name=\"CheckCircleOutlined\" /> : <UIIcon name=\"CloseCircleOutlined\" />}\n >\n {status.toUpperCase()}\n </UITag>\n ),\n filters: [\n { text: 'Passed', value: 'passed' },\n { text: 'Failed', value: 'failed' },\n ],\n onFilter: (value, record) => record.status === value,\n },\n {\n title: 'Git',\n key: 'git',\n width: 220,\n render: (_, record) => (\n <UISpace direction=\"vertical\" size={0}>\n <span><UIIcon name=\"BranchesOutlined\" /> {record.git.branch}</span>\n <span style={{ color: token.colorTextSecondary, fontSize: token.fontSizeSM }}>\n {record.git.commit.slice(0, 7)} - {record.git.message.slice(0, 40)}\n {record.git.message.length > 40 ? '...' : ''}\n </span>\n </UISpace>\n ),\n },\n ...(data.entries[0] ? Object.keys(data.entries[0].summary) : []).map((ct) => ({\n title: formatCheckLabel(ct),\n key: ct,\n width: 90,\n align: 'center' as const,\n render: (_: unknown, record: HistoryEntry) => renderCheckColumn(record, ct),\n })),\n ];\n\n return (\n <UITable<HistoryEntry>\n columns={columns}\n dataSource={data.entries}\n rowKey=\"timestamp\"\n pagination={{ pageSize: 15 }}\n size=\"middle\"\n expandable={{\n expandedRowRender: (record) => (\n <div style={{ padding: `${token.paddingXS}px ${token.paddingMD}px` }}>\n {Object.keys(record.failedPackages).map((ct) => {\n const failed = record.failedPackages[ct];\n if (!failed || failed.length === 0) {return null;}\n return (\n <div key={ct} style={{ marginBottom: token.marginSM }}>\n <strong>{formatCheckLabel(ct)} failures ({failed.length}):</strong>\n <UIFlex wrap=\"wrap\" gap={1} style={{ marginTop: token.marginXXS }}>\n {failed.map((pkg) => (\n <UITag key={pkg} color=\"error\" style={{ fontSize: token.fontSizeSM }}>{pkg}</UITag>\n ))}\n </UIFlex>\n </div>\n );\n })}\n </div>\n ),\n rowExpandable: (record) =>\n Object.values(record.failedPackages).some((arr) => arr.length > 0),\n }}\n />\n );\n}\n","/**\n * Trends tab — time-series chart, summary cards with velocity, changelog timeline\n */\n\nimport * as React from 'react';\nimport {\n UICard, UIRow, UICol, UITag, UIStatistic, UISpin, UIAlert, UISpace, UISelect,\n UITimeline, UITimelineItem, UIEmptyState, UIIcon, UIStatisticsChart, UIFlex,\n useData, useTheme,\n} from '@kb-labs/sdk/studio';\nimport type { QAEnrichedTrendsResponse, EnrichedTrendResult, TrendChangelogEntry } from '@kb-labs/qa-contracts';\nimport { getCheckIcon, formatCheckLabel } from '../utils/check-display';\n\ntype AntToken = ReturnType<typeof useTheme>['antdToken'];\n\nfunction getTrendColor(trend: string, token: AntToken): string {\n switch (trend) {\n case 'regression': return token.colorError;\n case 'improvement': return token.colorSuccess;\n default: return token.colorTextSecondary;\n }\n}\n\nfunction getTrendIcon(trend: string): React.ReactNode {\n switch (trend) {\n case 'regression': return <UIIcon name=\"ArrowUpOutlined\" />;\n case 'improvement': return <UIIcon name=\"ArrowDownOutlined\" />;\n default: return <UIIcon name=\"MinusOutlined\" />;\n }\n}\n\nfunction getTrendTag(trend: string): React.ReactNode {\n switch (trend) {\n case 'regression': return <UITag color=\"error\">Regression</UITag>;\n case 'improvement': return <UITag color=\"success\">Improvement</UITag>;\n default: return <UITag>No Change</UITag>;\n }\n}\n\nfunction formatTimestamp(iso: string): string {\n const d = new Date(iso);\n const mo = String(d.getMonth() + 1).padStart(2, '0');\n const dd = String(d.getDate()).padStart(2, '0');\n const hh = String(d.getHours()).padStart(2, '0');\n const mm = String(d.getMinutes()).padStart(2, '0');\n return `${mo}-${dd} ${hh}:${mm}`;\n}\n\nfunction buildChartData(trends: EnrichedTrendResult[]) {\n const rows: Array<{ date: string; value: number; category: string }> = [];\n for (const trend of trends) {\n const label = trend.label ?? formatCheckLabel(trend.checkType);\n for (const point of trend.timeSeries) {\n rows.push({ date: formatTimestamp(point.timestamp), value: point.failed, category: label });\n }\n }\n return rows;\n}\n\nfunction buildMergedChangelog(trends: EnrichedTrendResult[]) {\n const byCommit = new Map<string, {\n timestamp: string;\n gitCommit: string;\n gitMessage: string;\n changes: Array<{ checkType: string; entry: TrendChangelogEntry }>;\n }>();\n\n for (const trend of trends) {\n for (const entry of trend.changelog) {\n let group = byCommit.get(entry.gitCommit);\n if (!group) {\n group = { timestamp: entry.timestamp, gitCommit: entry.gitCommit, gitMessage: entry.gitMessage, changes: [] };\n byCommit.set(entry.gitCommit, group);\n }\n group.changes.push({ checkType: trend.checkType, entry });\n }\n }\n\n return [...byCommit.values()].sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n}\n\nexport function TrendsTab() {\n const { antdToken: token } = useTheme();\n const [window, setWindow] = React.useState<number | undefined>(undefined);\n\n const trendsUrl = window ? `/v1/plugins/qa/trends?window=${window}&enriched=true` : '/v1/plugins/qa/trends?enriched=true';\n const { data, isLoading } = useData<QAEnrichedTrendsResponse>(trendsUrl);\n\n if (isLoading) {\n return <UISpin size=\"large\" style={{ display: 'block', margin: '48px auto' }} />;\n }\n\n if (!data || data.trends.length === 0) {\n return (\n <UIAlert\n variant=\"info\"\n showIcon\n message=\"Not enough data for trend analysis\"\n description=\"Need at least 2 history entries. Run 'pnpm qa:save' multiple times.\"\n />\n );\n }\n\n const chartData = buildChartData(data.trends);\n const mergedChangelog = buildMergedChangelog(data.trends);\n\n return (\n <div>\n {/* Window selector */}\n <UIFlex justify=\"between\" align=\"center\" style={{ marginBottom: token.marginMD }}>\n <span style={{ color: token.colorTextSecondary }}>\n Analyzing {data.historyCount} history entries (window: {data.window})\n </span>\n <UISpace>\n <span>Window size:</span>\n <UISelect\n value={window ?? data.window}\n onChange={(val) => setWindow(val as number | undefined)}\n style={{ width: 80 }}\n options={[\n { label: '5', value: 5 },\n { label: '10', value: 10 },\n { label: '20', value: 20 },\n { label: '50', value: 50 },\n ]}\n />\n </UISpace>\n </UIFlex>\n\n {/* Time-series chart */}\n <UIStatisticsChart\n title=\"Failure Count Over Time\"\n data={chartData}\n loading={false}\n xField=\"date\"\n yField=\"value\"\n colorField=\"category\"\n height={300}\n showLegend={false}\n chartProps={{ legend: { position: 'top' } }}\n />\n\n {/* Summary Cards */}\n <UIRow gutter={[16, 16]} style={{ marginTop: token.marginMD }}>\n {data.trends.map((trend) => (\n <UICol xs={24} sm={12} key={trend.checkType}>\n <UICard size=\"small\">\n <UIRow align=\"middle\" gutter={16}>\n <UICol flex=\"auto\">\n <UISpace>\n {getCheckIcon(trend.checkType)}\n <span style={{ fontWeight: 600, fontSize: token.fontSizeLG }}>\n {trend.label ?? formatCheckLabel(trend.checkType)}\n </span>\n {getTrendTag(trend.trend)}\n </UISpace>\n </UICol>\n </UIRow>\n <UIRow gutter={16} style={{ marginTop: token.marginSM }}>\n <UICol span={6}><UIStatistic title=\"Previous\" value={trend.previous} valueStyle={{ fontSize: token.fontSizeHeading4 }} /></UICol>\n <UICol span={6}><UIStatistic title=\"Current\" value={trend.current} valueStyle={{ fontSize: token.fontSizeHeading4 }} /></UICol>\n <UICol span={6}>\n <UIStatistic\n title=\"Delta\"\n value={Math.abs(trend.delta)}\n prefix={getTrendIcon(trend.trend)}\n valueStyle={{ color: getTrendColor(trend.trend, token), fontSize: token.fontSizeHeading4 }}\n />\n </UICol>\n <UICol span={6}>\n <UIStatistic\n title=\"Velocity\"\n value={Math.abs(trend.velocity)}\n precision={1}\n prefix={trend.velocity > 0 ? <UIIcon name=\"ArrowUpOutlined\" /> : trend.velocity < 0 ? <UIIcon name=\"ArrowDownOutlined\" /> : <UIIcon name=\"MinusOutlined\" />}\n suffix=\"/run\"\n valueStyle={{ color: trend.velocity > 0 ? token.colorError : trend.velocity < 0 ? token.colorSuccess : token.colorTextSecondary, fontSize: token.fontSizeHeading4 }}\n />\n </UICol>\n </UIRow>\n </UICard>\n </UICol>\n ))}\n </UIRow>\n\n {/* Changelog Timeline */}\n <UICard title=\"Changelog — What Changed\" style={{ marginTop: token.marginMD }}>\n {mergedChangelog.length === 0 ? (\n <UIEmptyState description=\"No changes detected between entries\" />\n ) : (\n <UITimeline>\n {mergedChangelog.map((group) => {\n const totalNewFailures = group.changes.reduce((s, c) => s + c.entry.newFailures.length, 0);\n const totalFixed = group.changes.reduce((s, c) => s + c.entry.fixed.length, 0);\n const dotColor = totalNewFailures > totalFixed ? token.colorError : token.colorSuccess;\n\n return (\n <UITimelineItem key={group.gitCommit} color={dotColor}>\n <div style={{ marginBottom: token.marginXXS }}>\n <UITag style={{ fontFamily: 'monospace' }}>{group.gitCommit.slice(0, 7)}</UITag>\n <span style={{ color: token.colorTextSecondary, fontSize: token.fontSizeSM }}>\n {new Date(group.timestamp).toLocaleString()}\n </span>\n </div>\n <div style={{ fontSize: token.fontSize, color: token.colorTextSecondary, marginBottom: token.marginXS }}>{group.gitMessage}</div>\n {group.changes.map(({ checkType, entry }) => (\n <div key={checkType} style={{ marginBottom: token.marginXXS }}>\n <span style={{ fontWeight: 500 }}>{formatCheckLabel(checkType)}:</span>\n {entry.newFailures.length > 0 && (\n <span style={{ marginLeft: 8 }}>\n <UITag color=\"error\" style={{ fontSize: token.fontSizeSM }}>+{entry.newFailures.length} new</UITag>\n {entry.newFailures.map((pkg) => (\n <UITag key={pkg} color=\"red\" style={{ fontSize: token.fontSizeSM }}>{pkg}</UITag>\n ))}\n </span>\n )}\n {entry.fixed.length > 0 && (\n <span style={{ marginLeft: 8 }}>\n <UITag color=\"success\" style={{ fontSize: token.fontSizeSM }}>-{entry.fixed.length} fixed</UITag>\n {entry.fixed.map((pkg) => (\n <UITag key={pkg} color=\"green\" style={{ fontSize: token.fontSizeSM }}>{pkg}</UITag>\n ))}\n </span>\n )}\n </div>\n ))}\n </UITimelineItem>\n );\n })}\n </UITimeline>\n )}\n </UICard>\n </div>\n );\n}\n","/**\n * Regressions tab — detect and display new failures since last QA save\n */\n\nimport * as React from 'react';\nimport { UIAlert, UICard, UITag, UISpin, UISpace, UIEmptyState, UIIcon, UIFlex, useData, useTheme } from '@kb-labs/sdk/studio';\nimport { getCheckIcon, formatCheckLabel } from '../utils/check-display';\nimport type { QARegressionsResponse } from '@kb-labs/qa-contracts';\n\nexport function RegressionsTab() {\n const { antdToken: token } = useTheme();\n const { data, isLoading } = useData<QARegressionsResponse>('/v1/plugins/qa/regressions');\n\n if (isLoading) {\n return <UISpin size=\"large\" style={{ display: 'block', margin: '48px auto' }} />;\n }\n\n if (!data) {\n return (\n <UIAlert\n variant=\"info\"\n showIcon\n message=\"Not enough data for regression detection\"\n description=\"Need at least 2 history entries. Run 'pnpm qa:save' multiple times.\"\n />\n );\n }\n\n if (!data.hasRegressions) {\n return (\n <div>\n <UIAlert\n variant=\"success\"\n showIcon\n icon={<UIIcon name=\"CheckCircleOutlined\" />}\n message=\"No regressions detected\"\n description=\"All check types show the same or fewer failures compared to the previous QA run.\"\n style={{ marginBottom: token.marginLG }}\n />\n <UIEmptyState description=\"No regressions to display\" />\n </div>\n );\n }\n\n return (\n <div>\n <UIAlert\n variant=\"error\"\n showIcon\n icon={<UIIcon name=\"WarningOutlined\" />}\n message={`${data.regressions.length} regression${data.regressions.length > 1 ? 's' : ''} detected`}\n description=\"The following check types have new failures compared to the previous QA run.\"\n style={{ marginBottom: token.marginLG }}\n />\n\n {data.regressions.map((reg, idx) => (\n <UICard\n key={idx}\n title={\n <UISpace>\n {getCheckIcon(reg.checkType)}\n <span>{formatCheckLabel(reg.checkType)}</span>\n <UITag color=\"error\">+{reg.delta} new failure{reg.delta > 1 ? 's' : ''}</UITag>\n </UISpace>\n }\n style={{ marginBottom: token.marginMD }}\n >\n <div>\n <strong>New failures:</strong>\n <UIFlex wrap=\"wrap\" gap={1} style={{ marginTop: token.marginXS }}>\n {reg.newFailures.map((pkg) => (\n <UITag key={pkg} color=\"error\">\n {pkg}\n </UITag>\n ))}\n </UIFlex>\n </div>\n </UICard>\n ))}\n\n <UIAlert\n variant=\"warning\"\n showIcon\n message=\"Action required\"\n description={\n <div>\n <p>Fix the regressions above before merging. Recommendations:</p>\n <ol style={{ margin: 0, paddingLeft: 20 }}>\n <li>Run <code>pnpm qa --json</code> to see detailed error messages</li>\n <li>Fix the failing packages</li>\n <li>Re-run <code>pnpm qa:save</code> to verify fixes</li>\n <li>Update baseline if needed: <code>pnpm kb baseline:update</code></li>\n </ol>\n </div>\n }\n style={{ marginTop: token.marginMD }}\n />\n </div>\n );\n}\n","/**\n * QA plugin main page — build, lint, type check, and test results dashboard\n */\n\nimport { UIPage, UIPageHeader, UITabs } from '@kb-labs/sdk/studio';\nimport { OverviewTab } from '../components/OverviewTab';\nimport { HistoryTab } from '../components/HistoryTab';\nimport { TrendsTab } from '../components/TrendsTab';\nimport { RegressionsTab } from '../components/RegressionsTab';\n\nexport default function QADashboard() {\n const tabs = (\n <UITabs\n syncUrl=\"search\"\n items={[\n { key: 'overview', label: 'Overview', children: <OverviewTab /> },\n { key: 'history', label: 'History', children: <HistoryTab /> },\n { key: 'trends', label: 'Trends', children: <TrendsTab /> },\n { key: 'regressions', label: 'Regressions', children: <RegressionsTab /> },\n ]}\n />\n );\n\n return (\n <UIPage>\n <UIPageHeader\n title=\"QA\"\n description=\"Build, lint, type check, and test results with baseline tracking and regression detection\"\n tabs={tabs}\n />\n </UIPage>\n );\n}\n"],"names":["Symbol","Object","STATUS_CONFIG","CheckDetailDrawer","param","open","checkType","checkLabel","onClose","token","_useTheme","_useData","details","isLoading","_useMutateData","runCheck","isRunning","_React_useState","search","setSearch","checkData","allPackages","p","handleRunCheck","data","error","UIMessage","_instanceof","Error","columns","onFilter","value","record","render","status","cfg","UITag","UIIcon","undefined","sorter","a","b","name","UITypographyText","Set","r","repo","UIDrawer","UISpace","canRerun","UIButton","onClick","UIInput","onChange","UITable","expandedRowRender","UIAccordion","rowExpandable","KNOWN_ICONS","getCheckIcon","_KNOWN_ICONS_checkType","formatCheckLabel","BaselineDiffCard","diffData","updateBaseline","isUpdating","handleUpdateBaseline","UIAlert","Date","UIPopconfirm","onConfirm","totalNew","totalFixed","_iteratorError","d","UICard","UIRow","ct","UICol","UIStatistic","Math","pkg","CHECK_TYPE_CONFIG","ErrorGroupsPanel","UISpin","pattern","key","count","UIBadge","packages","OverviewTab","summary","summaryLoading","runQA","drawerOpen","setDrawerOpen","_React_useState1","selectedCheck","setSelectedCheck","_React_useState2","skippedChecks","setSkippedChecks","toggleCheck","id","enabled","prev","next","handleCheckClick","label","handleRunQA","totalFailed","sum","overallPassed","UIPopover","c","UICheckbox","checked","check","rate","getPassRate","passed","total","skipped","UIProgress","format","HistoryTab","ts","_","s","entry","hasFailed","failed","UIFlex","arr","TrendsTab","window","setWindow","chartData","buildChartData","trends","rows","trend","_trend_label","_iteratorError1","point","formatTimestamp","iso","mo","String","dd","hh","mm","mergedChangelog","buildMergedChangelog","byCommit","Map","group","UISelect","val","UIStatisticsChart","getTrendTag","getTrendIcon","getTrendColor","UIEmptyState","UITimeline","dotColor","totalNewFailures","UITimelineItem","RegressionsTab","reg","idx","QADashboard","tabs","UITabs","UIPage","UIPageHeader"],"mappings":"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"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "qaPlugin",
|
|
3
|
+
"name": "qaPlugin",
|
|
4
|
+
"metaData": {
|
|
5
|
+
"name": "qaPlugin",
|
|
6
|
+
"type": "app",
|
|
7
|
+
"buildInfo": {
|
|
8
|
+
"buildVersion": "2.14.0",
|
|
9
|
+
"buildName": "@kb-labs/qa-entry"
|
|
10
|
+
},
|
|
11
|
+
"remoteEntry": {
|
|
12
|
+
"name": "remoteEntry.js",
|
|
13
|
+
"path": "",
|
|
14
|
+
"type": "global"
|
|
15
|
+
},
|
|
16
|
+
"types": {
|
|
17
|
+
"path": "",
|
|
18
|
+
"name": "",
|
|
19
|
+
"zip": "@mf-types.zip",
|
|
20
|
+
"api": "@mf-types.d.ts"
|
|
21
|
+
},
|
|
22
|
+
"globalName": "qaPlugin",
|
|
23
|
+
"pluginVersion": "0.8.12",
|
|
24
|
+
"prefetchInterface": false,
|
|
25
|
+
"publicPath": "auto"
|
|
26
|
+
},
|
|
27
|
+
"shared": [
|
|
28
|
+
{
|
|
29
|
+
"id": "qaPlugin:@kb-labs/studio-event-bus",
|
|
30
|
+
"name": "@kb-labs/studio-event-bus",
|
|
31
|
+
"version": "2.14.0",
|
|
32
|
+
"singleton": true,
|
|
33
|
+
"requiredVersion": "^0.1.0",
|
|
34
|
+
"assets": {
|
|
35
|
+
"js": {
|
|
36
|
+
"async": [
|
|
37
|
+
"781.js"
|
|
38
|
+
],
|
|
39
|
+
"sync": [
|
|
40
|
+
"50.js",
|
|
41
|
+
"669.js"
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
"css": {
|
|
45
|
+
"async": [],
|
|
46
|
+
"sync": []
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "qaPlugin:@kb-labs/studio-hooks",
|
|
52
|
+
"name": "@kb-labs/studio-hooks",
|
|
53
|
+
"version": "2.14.0",
|
|
54
|
+
"singleton": true,
|
|
55
|
+
"requiredVersion": "^0.1.0",
|
|
56
|
+
"assets": {
|
|
57
|
+
"js": {
|
|
58
|
+
"async": [
|
|
59
|
+
"781.js",
|
|
60
|
+
"669.js",
|
|
61
|
+
"626.js",
|
|
62
|
+
"997.js",
|
|
63
|
+
"338.js",
|
|
64
|
+
"451.js",
|
|
65
|
+
"842.js",
|
|
66
|
+
"968.js"
|
|
67
|
+
],
|
|
68
|
+
"sync": [
|
|
69
|
+
"370.js"
|
|
70
|
+
]
|
|
71
|
+
},
|
|
72
|
+
"css": {
|
|
73
|
+
"async": [],
|
|
74
|
+
"sync": []
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"id": "qaPlugin:@kb-labs/studio-ui-core",
|
|
80
|
+
"name": "@kb-labs/studio-ui-core",
|
|
81
|
+
"version": "2.14.0",
|
|
82
|
+
"singleton": true,
|
|
83
|
+
"requiredVersion": "^0.1.0",
|
|
84
|
+
"assets": {
|
|
85
|
+
"js": {
|
|
86
|
+
"async": [],
|
|
87
|
+
"sync": [
|
|
88
|
+
"968.js"
|
|
89
|
+
]
|
|
90
|
+
},
|
|
91
|
+
"css": {
|
|
92
|
+
"async": [],
|
|
93
|
+
"sync": []
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"id": "qaPlugin:@kb-labs/studio-ui-kit",
|
|
99
|
+
"name": "@kb-labs/studio-ui-kit",
|
|
100
|
+
"version": "2.14.0",
|
|
101
|
+
"singleton": true,
|
|
102
|
+
"requiredVersion": "^0.1.0",
|
|
103
|
+
"assets": {
|
|
104
|
+
"js": {
|
|
105
|
+
"async": [
|
|
106
|
+
"781.js",
|
|
107
|
+
"997.js",
|
|
108
|
+
"338.js",
|
|
109
|
+
"842.js",
|
|
110
|
+
"968.js",
|
|
111
|
+
"607.js"
|
|
112
|
+
],
|
|
113
|
+
"sync": [
|
|
114
|
+
"117.js"
|
|
115
|
+
]
|
|
116
|
+
},
|
|
117
|
+
"css": {
|
|
118
|
+
"async": [],
|
|
119
|
+
"sync": []
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"id": "qaPlugin:@tanstack/react-query",
|
|
125
|
+
"name": "@tanstack/react-query",
|
|
126
|
+
"version": "5.97.0",
|
|
127
|
+
"singleton": true,
|
|
128
|
+
"requiredVersion": "^5.0.0",
|
|
129
|
+
"assets": {
|
|
130
|
+
"js": {
|
|
131
|
+
"async": [
|
|
132
|
+
"781.js"
|
|
133
|
+
],
|
|
134
|
+
"sync": [
|
|
135
|
+
"626.js"
|
|
136
|
+
]
|
|
137
|
+
},
|
|
138
|
+
"css": {
|
|
139
|
+
"async": [],
|
|
140
|
+
"sync": []
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"id": "qaPlugin:antd",
|
|
146
|
+
"name": "antd",
|
|
147
|
+
"version": "5.29.3",
|
|
148
|
+
"singleton": true,
|
|
149
|
+
"requiredVersion": "^5.21.0",
|
|
150
|
+
"assets": {
|
|
151
|
+
"js": {
|
|
152
|
+
"async": [
|
|
153
|
+
"781.js",
|
|
154
|
+
"338.js"
|
|
155
|
+
],
|
|
156
|
+
"sync": [
|
|
157
|
+
"842.js"
|
|
158
|
+
]
|
|
159
|
+
},
|
|
160
|
+
"css": {
|
|
161
|
+
"async": [],
|
|
162
|
+
"sync": []
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"id": "qaPlugin:react-dom",
|
|
168
|
+
"name": "react-dom",
|
|
169
|
+
"version": "18.3.1",
|
|
170
|
+
"singleton": true,
|
|
171
|
+
"requiredVersion": "^18.3.0",
|
|
172
|
+
"assets": {
|
|
173
|
+
"js": {
|
|
174
|
+
"async": [
|
|
175
|
+
"781.js"
|
|
176
|
+
],
|
|
177
|
+
"sync": [
|
|
178
|
+
"338.js"
|
|
179
|
+
]
|
|
180
|
+
},
|
|
181
|
+
"css": {
|
|
182
|
+
"async": [],
|
|
183
|
+
"sync": []
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"id": "qaPlugin:react-router-dom",
|
|
189
|
+
"name": "react-router-dom",
|
|
190
|
+
"version": "7.14.0",
|
|
191
|
+
"singleton": true,
|
|
192
|
+
"requiredVersion": "^7.0.0",
|
|
193
|
+
"assets": {
|
|
194
|
+
"js": {
|
|
195
|
+
"async": [
|
|
196
|
+
"781.js",
|
|
197
|
+
"338.js"
|
|
198
|
+
],
|
|
199
|
+
"sync": [
|
|
200
|
+
"997.js"
|
|
201
|
+
]
|
|
202
|
+
},
|
|
203
|
+
"css": {
|
|
204
|
+
"async": [],
|
|
205
|
+
"sync": []
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"id": "qaPlugin:react",
|
|
211
|
+
"name": "react",
|
|
212
|
+
"version": "18.3.1",
|
|
213
|
+
"singleton": true,
|
|
214
|
+
"requiredVersion": "^18.3.0",
|
|
215
|
+
"assets": {
|
|
216
|
+
"js": {
|
|
217
|
+
"async": [],
|
|
218
|
+
"sync": [
|
|
219
|
+
"781.js"
|
|
220
|
+
]
|
|
221
|
+
},
|
|
222
|
+
"css": {
|
|
223
|
+
"async": [],
|
|
224
|
+
"sync": []
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
],
|
|
229
|
+
"remotes": [],
|
|
230
|
+
"exposes": [
|
|
231
|
+
{
|
|
232
|
+
"id": "qaPlugin:QADashboard",
|
|
233
|
+
"name": "QADashboard",
|
|
234
|
+
"assets": {
|
|
235
|
+
"js": {
|
|
236
|
+
"sync": [
|
|
237
|
+
"__federation_expose_QADashboard.js"
|
|
238
|
+
],
|
|
239
|
+
"async": [
|
|
240
|
+
"781.js",
|
|
241
|
+
"451.js",
|
|
242
|
+
"586.js",
|
|
243
|
+
"117.js",
|
|
244
|
+
"842.js",
|
|
245
|
+
"338.js",
|
|
246
|
+
"968.js",
|
|
247
|
+
"607.js",
|
|
248
|
+
"997.js",
|
|
249
|
+
"370.js",
|
|
250
|
+
"669.js",
|
|
251
|
+
"626.js"
|
|
252
|
+
]
|
|
253
|
+
},
|
|
254
|
+
"css": {
|
|
255
|
+
"sync": [],
|
|
256
|
+
"async": []
|
|
257
|
+
}
|
|
258
|
+
},
|
|
259
|
+
"path": "./QADashboard"
|
|
260
|
+
}
|
|
261
|
+
]
|
|
262
|
+
}
|