@jonathanleelx/meddle 0.1.2 → 0.2.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.
Files changed (45) hide show
  1. package/CONFIG_STRUCTURE.md +2 -0
  2. package/dist/core/body-utils.d.ts +6 -0
  3. package/dist/core/body-utils.d.ts.map +1 -1
  4. package/dist/core/body-utils.js +22 -8
  5. package/dist/core/body-utils.js.map +1 -1
  6. package/dist/core/h2-pool.d.ts.map +1 -1
  7. package/dist/core/h2-pool.js +22 -0
  8. package/dist/core/h2-pool.js.map +1 -1
  9. package/dist/core/map-local.d.ts.map +1 -1
  10. package/dist/core/map-local.js +31 -24
  11. package/dist/core/map-local.js.map +1 -1
  12. package/dist/core/mock-handler.d.ts.map +1 -1
  13. package/dist/core/mock-handler.js +8 -1
  14. package/dist/core/mock-handler.js.map +1 -1
  15. package/dist/core/proxy-context.d.ts +1 -0
  16. package/dist/core/proxy-context.d.ts.map +1 -1
  17. package/dist/core/proxy-context.js +75 -0
  18. package/dist/core/proxy-context.js.map +1 -1
  19. package/dist/core/types.d.ts +6 -0
  20. package/dist/core/types.d.ts.map +1 -1
  21. package/dist/server/config.d.ts.map +1 -1
  22. package/dist/server/config.js +1 -0
  23. package/dist/server/config.js.map +1 -1
  24. package/index.js +19 -5
  25. package/package.json +1 -1
  26. package/web/dist/assets/{checkbox-DIBarrJx.js → checkbox-D0y07vOb.js} +1 -1
  27. package/web/dist/assets/{code-fixer-fQtWZ5He.js → code-fixer-DOrMk-4V.js} +1 -1
  28. package/web/dist/assets/{detail-panel-BX_hxeI0.js → detail-panel-CGfKk7-i.js} +1 -1
  29. package/web/dist/assets/{global-panel-shell-ChdO0dWd.js → global-panel-shell-COyDpKbS.js} +1 -1
  30. package/web/dist/assets/{health-panel-CQeCQ7gr.js → health-panel-CgEmCIeC.js} +1 -1
  31. package/web/dist/assets/{index-L7uWxTnp.js → index-DTeCUv1G.js} +3 -3
  32. package/web/dist/assets/{mobile-proxy-panel-Dj1iLami.js → mobile-proxy-panel-BCUn96iR.js} +1 -1
  33. package/web/dist/assets/{mock-config-BTTCw7RK.js → mock-config-DNMSOrLv.js} +1 -1
  34. package/web/dist/assets/{mock-editor-panel-C-aVfFme.js → mock-editor-panel-Ctf1EX-d.js} +1 -1
  35. package/web/dist/assets/{monaco-editor-B3brLg8j.js → monaco-editor-DboIGERI.js} +1 -1
  36. package/web/dist/assets/{plugin-code-editor-CPjCbJ9g.js → plugin-code-editor-DuaSNWGF.js} +1 -1
  37. package/web/dist/assets/{plugin-config-BzmCkvz3.js → plugin-config-D7H47wsJ.js} +1 -1
  38. package/web/dist/assets/{plugin-generator-BnEafDF9.js → plugin-generator-xGpWo1Fc.js} +1 -1
  39. package/web/dist/assets/{plugin-test-dialog-BWoWsWV4.js → plugin-test-dialog-BfxPpCfE.js} +1 -1
  40. package/web/dist/assets/{route-preview-BX7sfY0O.js → route-preview-CvoRZiwx.js} +1 -1
  41. package/web/dist/assets/{rule-ai-assistant-panel-WBiOOUw5.js → rule-ai-assistant-panel-B0UlJVO3.js} +1 -1
  42. package/web/dist/assets/{rule-config-fTIZVwg1.js → rule-config-BmrlYakh.js} +1 -1
  43. package/web/dist/assets/{select-CkFOB61l.js → select-CH0aJ3Dd.js} +1 -1
  44. package/web/dist/assets/{settings-panel-COCYiIUg.js → settings-panel-BvaGZmBw.js} +1 -1
  45. package/web/dist/index.html +1 -1
@@ -1,4 +1,4 @@
1
- import{a as e,d as t,f as n,l as r,t as i,u as a}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as o}from"./copy-BYjq1hdN.js";import{t as s}from"./refresh-cw-CG3HaiQT.js";import{t as c}from"./shield-check-OqUmVLQt.js";import{t as l}from"./smartphone-DKeDuJTU.js";import{t as u}from"./wifi-D9M35Ajj.js";import{A as d,F as f,L as p,M as m,N as h,O as g,P as _,R as v,j as y,k as b,mt as x,ot as S,tt as C,u as w,ut as ee,z as T}from"./index-L7uWxTnp.js";import{n as E,r as D,t as O}from"./alert-COF-DIAE.js";var te=r(`download`,[[`path`,{d:`M12 15V3`,key:`m9g1x1`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`path`,{d:`m7 10 5 5 5-5`,key:`brsn70`}]]),k=r(`shield-off`,[[`path`,{d:`m2 2 20 20`,key:`1ooewy`}],[`path`,{d:`M5 5a1 1 0 0 0-1 1v7c0 5 3.5 7.5 7.67 8.94a1 1 0 0 0 .67.01c2.35-.82 4.48-1.97 5.9-3.71`,key:`1jlk70`}],[`path`,{d:`M9.309 3.652A12.252 12.252 0 0 0 11.24 2.28a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1v7a9.784 9.784 0 0 1-.08 1.264`,key:`18rp1v`}]]),A=t(((e,t)=>{t.exports=function(){return typeof Promise==`function`&&Promise.prototype&&Promise.prototype.then}})),j=t((e=>{var t,n=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];e.getSymbolSize=function(e){if(!e)throw Error(`"version" cannot be null or undefined`);if(e<1||e>40)throw Error(`"version" should be in range from 1 to 40`);return e*4+17},e.getSymbolTotalCodewords=function(e){return n[e]},e.getBCHDigit=function(e){let t=0;for(;e!==0;)t++,e>>>=1;return t},e.setToSJISFunction=function(e){if(typeof e!=`function`)throw Error(`"toSJISFunc" is not a valid function.`);t=e},e.isKanjiModeEnabled=function(){return t!==void 0},e.toSJIS=function(e){return t(e)}})),M=t((e=>{e.L={bit:1},e.M={bit:0},e.Q={bit:3},e.H={bit:2};function t(t){if(typeof t!=`string`)throw Error(`Param is not a string`);switch(t.toLowerCase()){case`l`:case`low`:return e.L;case`m`:case`medium`:return e.M;case`q`:case`quartile`:return e.Q;case`h`:case`high`:return e.H;default:throw Error(`Unknown EC Level: `+t)}}e.isValid=function(e){return e&&e.bit!==void 0&&e.bit>=0&&e.bit<4},e.from=function(n,r){if(e.isValid(n))return n;try{return t(n)}catch{return r}}})),N=t(((e,t)=>{function n(){this.buffer=[],this.length=0}n.prototype={get:function(e){let t=Math.floor(e/8);return(this.buffer[t]>>>7-e%8&1)==1},put:function(e,t){for(let n=0;n<t;n++)this.putBit((e>>>t-n-1&1)==1)},getLengthInBits:function(){return this.length},putBit:function(e){let t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}},t.exports=n})),P=t(((e,t)=>{function n(e){if(!e||e<1)throw Error(`BitMatrix size must be defined and greater than 0`);this.size=e,this.data=new Uint8Array(e*e),this.reservedBit=new Uint8Array(e*e)}n.prototype.set=function(e,t,n,r){let i=e*this.size+t;this.data[i]=n,r&&(this.reservedBit[i]=!0)},n.prototype.get=function(e,t){return this.data[e*this.size+t]},n.prototype.xor=function(e,t,n){this.data[e*this.size+t]^=n},n.prototype.isReserved=function(e,t){return this.reservedBit[e*this.size+t]},t.exports=n})),F=t((e=>{var t=j().getSymbolSize;e.getRowColCoords=function(e){if(e===1)return[];let n=Math.floor(e/7)+2,r=t(e),i=r===145?26:Math.ceil((r-13)/(2*n-2))*2,a=[r-7];for(let e=1;e<n-1;e++)a[e]=a[e-1]-i;return a.push(6),a.reverse()},e.getPositions=function(t){let n=[],r=e.getRowColCoords(t),i=r.length;for(let e=0;e<i;e++)for(let t=0;t<i;t++)e===0&&t===0||e===0&&t===i-1||e===i-1&&t===0||n.push([r[e],r[t]]);return n}})),I=t((e=>{var t=j().getSymbolSize,n=7;e.getPositions=function(e){let r=t(e);return[[0,0],[r-n,0],[0,r-n]]}})),L=t((e=>{e.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var t={N1:3,N2:3,N3:40,N4:10};e.isValid=function(e){return e!=null&&e!==``&&!isNaN(e)&&e>=0&&e<=7},e.from=function(t){return e.isValid(t)?parseInt(t,10):void 0},e.getPenaltyN1=function(e){let n=e.size,r=0,i=0,a=0,o=null,s=null;for(let c=0;c<n;c++){i=a=0,o=s=null;for(let l=0;l<n;l++){let n=e.get(c,l);n===o?i++:(i>=5&&(r+=t.N1+(i-5)),o=n,i=1),n=e.get(l,c),n===s?a++:(a>=5&&(r+=t.N1+(a-5)),s=n,a=1)}i>=5&&(r+=t.N1+(i-5)),a>=5&&(r+=t.N1+(a-5))}return r},e.getPenaltyN2=function(e){let n=e.size,r=0;for(let t=0;t<n-1;t++)for(let i=0;i<n-1;i++){let n=e.get(t,i)+e.get(t,i+1)+e.get(t+1,i)+e.get(t+1,i+1);(n===4||n===0)&&r++}return r*t.N2},e.getPenaltyN3=function(e){let n=e.size,r=0,i=0,a=0;for(let t=0;t<n;t++){i=a=0;for(let o=0;o<n;o++)i=i<<1&2047|e.get(t,o),o>=10&&(i===1488||i===93)&&r++,a=a<<1&2047|e.get(o,t),o>=10&&(a===1488||a===93)&&r++}return r*t.N3},e.getPenaltyN4=function(e){let n=0,r=e.data.length;for(let t=0;t<r;t++)n+=e.data[t];return Math.abs(Math.ceil(n*100/r/5)-10)*t.N4};function n(t,n,r){switch(t){case e.Patterns.PATTERN000:return(n+r)%2==0;case e.Patterns.PATTERN001:return n%2==0;case e.Patterns.PATTERN010:return r%3==0;case e.Patterns.PATTERN011:return(n+r)%3==0;case e.Patterns.PATTERN100:return(Math.floor(n/2)+Math.floor(r/3))%2==0;case e.Patterns.PATTERN101:return n*r%2+n*r%3==0;case e.Patterns.PATTERN110:return(n*r%2+n*r%3)%2==0;case e.Patterns.PATTERN111:return(n*r%3+(n+r)%2)%2==0;default:throw Error(`bad maskPattern:`+t)}}e.applyMask=function(e,t){let r=t.size;for(let i=0;i<r;i++)for(let a=0;a<r;a++)t.isReserved(a,i)||t.xor(a,i,n(e,a,i))},e.getBestMask=function(t,n){let r=Object.keys(e.Patterns).length,i=0,a=1/0;for(let o=0;o<r;o++){n(o),e.applyMask(o,t);let r=e.getPenaltyN1(t)+e.getPenaltyN2(t)+e.getPenaltyN3(t)+e.getPenaltyN4(t);e.applyMask(o,t),r<a&&(a=r,i=o)}return i}})),R=t((e=>{var t=M(),n=[1,1,1,1,1,1,1,1,1,1,2,2,1,2,2,4,1,2,4,4,2,4,4,4,2,4,6,5,2,4,6,6,2,5,8,8,4,5,8,8,4,5,8,11,4,8,10,11,4,9,12,16,4,9,16,16,6,10,12,18,6,10,17,16,6,11,16,19,6,13,18,21,7,14,21,25,8,16,20,25,8,17,23,25,9,17,23,34,9,18,25,30,10,20,27,32,12,21,29,35,12,23,34,37,12,25,34,40,13,26,35,42,14,28,38,45,15,29,40,48,16,31,43,51,17,33,45,54,18,35,48,57,19,37,51,60,19,38,53,63,20,40,56,66,21,43,59,70,22,45,62,74,24,47,65,77,25,49,68,81],r=[7,10,13,17,10,16,22,28,15,26,36,44,20,36,52,64,26,48,72,88,36,64,96,112,40,72,108,130,48,88,132,156,60,110,160,192,72,130,192,224,80,150,224,264,96,176,260,308,104,198,288,352,120,216,320,384,132,240,360,432,144,280,408,480,168,308,448,532,180,338,504,588,196,364,546,650,224,416,600,700,224,442,644,750,252,476,690,816,270,504,750,900,300,560,810,960,312,588,870,1050,336,644,952,1110,360,700,1020,1200,390,728,1050,1260,420,784,1140,1350,450,812,1200,1440,480,868,1290,1530,510,924,1350,1620,540,980,1440,1710,570,1036,1530,1800,570,1064,1590,1890,600,1120,1680,1980,630,1204,1770,2100,660,1260,1860,2220,720,1316,1950,2310,750,1372,2040,2430];e.getBlocksCount=function(e,r){switch(r){case t.L:return n[(e-1)*4+0];case t.M:return n[(e-1)*4+1];case t.Q:return n[(e-1)*4+2];case t.H:return n[(e-1)*4+3];default:return}},e.getTotalCodewordsCount=function(e,n){switch(n){case t.L:return r[(e-1)*4+0];case t.M:return r[(e-1)*4+1];case t.Q:return r[(e-1)*4+2];case t.H:return r[(e-1)*4+3];default:return}}})),z=t((e=>{var t=new Uint8Array(512),n=new Uint8Array(256);(function(){let e=1;for(let r=0;r<255;r++)t[r]=e,n[e]=r,e<<=1,e&256&&(e^=285);for(let e=255;e<512;e++)t[e]=t[e-255]})(),e.log=function(e){if(e<1)throw Error(`log(`+e+`)`);return n[e]},e.exp=function(e){return t[e]},e.mul=function(e,r){return e===0||r===0?0:t[n[e]+n[r]]}})),B=t((e=>{var t=z();e.mul=function(e,n){let r=new Uint8Array(e.length+n.length-1);for(let i=0;i<e.length;i++)for(let a=0;a<n.length;a++)r[i+a]^=t.mul(e[i],n[a]);return r},e.mod=function(e,n){let r=new Uint8Array(e);for(;r.length-n.length>=0;){let e=r[0];for(let i=0;i<n.length;i++)r[i]^=t.mul(n[i],e);let i=0;for(;i<r.length&&r[i]===0;)i++;r=r.slice(i)}return r},e.generateECPolynomial=function(n){let r=new Uint8Array([1]);for(let i=0;i<n;i++)r=e.mul(r,new Uint8Array([1,t.exp(i)]));return r}})),V=t(((e,t)=>{var n=B();function r(e){this.genPoly=void 0,this.degree=e,this.degree&&this.initialize(this.degree)}r.prototype.initialize=function(e){this.degree=e,this.genPoly=n.generateECPolynomial(this.degree)},r.prototype.encode=function(e){if(!this.genPoly)throw Error(`Encoder not initialized`);let t=new Uint8Array(e.length+this.degree);t.set(e);let r=n.mod(t,this.genPoly),i=this.degree-r.length;if(i>0){let e=new Uint8Array(this.degree);return e.set(r,i),e}return r},t.exports=r})),H=t((e=>{e.isValid=function(e){return!isNaN(e)&&e>=1&&e<=40}})),U=t((e=>{var t=`[0-9]+`,n=`[A-Z $%*+\\-./:]+`,r=`(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+`;r=r.replace(/u/g,`\\u`);var i=`(?:(?![A-Z0-9 $%*+\\-./:]|`+r+`)(?:.|[\r
1
+ import{a as e,d as t,f as n,l as r,t as i,u as a}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as o}from"./copy-BYjq1hdN.js";import{t as s}from"./refresh-cw-CG3HaiQT.js";import{t as c}from"./shield-check-OqUmVLQt.js";import{t as l}from"./smartphone-DKeDuJTU.js";import{t as u}from"./wifi-D9M35Ajj.js";import{A as d,F as f,L as p,M as m,N as h,O as g,P as _,R as v,j as y,k as b,mt as x,ot as S,tt as C,u as w,ut as ee,z as T}from"./index-DTeCUv1G.js";import{n as E,r as D,t as O}from"./alert-COF-DIAE.js";var te=r(`download`,[[`path`,{d:`M12 15V3`,key:`m9g1x1`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`path`,{d:`m7 10 5 5 5-5`,key:`brsn70`}]]),k=r(`shield-off`,[[`path`,{d:`m2 2 20 20`,key:`1ooewy`}],[`path`,{d:`M5 5a1 1 0 0 0-1 1v7c0 5 3.5 7.5 7.67 8.94a1 1 0 0 0 .67.01c2.35-.82 4.48-1.97 5.9-3.71`,key:`1jlk70`}],[`path`,{d:`M9.309 3.652A12.252 12.252 0 0 0 11.24 2.28a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1v7a9.784 9.784 0 0 1-.08 1.264`,key:`18rp1v`}]]),A=t(((e,t)=>{t.exports=function(){return typeof Promise==`function`&&Promise.prototype&&Promise.prototype.then}})),j=t((e=>{var t,n=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];e.getSymbolSize=function(e){if(!e)throw Error(`"version" cannot be null or undefined`);if(e<1||e>40)throw Error(`"version" should be in range from 1 to 40`);return e*4+17},e.getSymbolTotalCodewords=function(e){return n[e]},e.getBCHDigit=function(e){let t=0;for(;e!==0;)t++,e>>>=1;return t},e.setToSJISFunction=function(e){if(typeof e!=`function`)throw Error(`"toSJISFunc" is not a valid function.`);t=e},e.isKanjiModeEnabled=function(){return t!==void 0},e.toSJIS=function(e){return t(e)}})),M=t((e=>{e.L={bit:1},e.M={bit:0},e.Q={bit:3},e.H={bit:2};function t(t){if(typeof t!=`string`)throw Error(`Param is not a string`);switch(t.toLowerCase()){case`l`:case`low`:return e.L;case`m`:case`medium`:return e.M;case`q`:case`quartile`:return e.Q;case`h`:case`high`:return e.H;default:throw Error(`Unknown EC Level: `+t)}}e.isValid=function(e){return e&&e.bit!==void 0&&e.bit>=0&&e.bit<4},e.from=function(n,r){if(e.isValid(n))return n;try{return t(n)}catch{return r}}})),N=t(((e,t)=>{function n(){this.buffer=[],this.length=0}n.prototype={get:function(e){let t=Math.floor(e/8);return(this.buffer[t]>>>7-e%8&1)==1},put:function(e,t){for(let n=0;n<t;n++)this.putBit((e>>>t-n-1&1)==1)},getLengthInBits:function(){return this.length},putBit:function(e){let t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}},t.exports=n})),P=t(((e,t)=>{function n(e){if(!e||e<1)throw Error(`BitMatrix size must be defined and greater than 0`);this.size=e,this.data=new Uint8Array(e*e),this.reservedBit=new Uint8Array(e*e)}n.prototype.set=function(e,t,n,r){let i=e*this.size+t;this.data[i]=n,r&&(this.reservedBit[i]=!0)},n.prototype.get=function(e,t){return this.data[e*this.size+t]},n.prototype.xor=function(e,t,n){this.data[e*this.size+t]^=n},n.prototype.isReserved=function(e,t){return this.reservedBit[e*this.size+t]},t.exports=n})),F=t((e=>{var t=j().getSymbolSize;e.getRowColCoords=function(e){if(e===1)return[];let n=Math.floor(e/7)+2,r=t(e),i=r===145?26:Math.ceil((r-13)/(2*n-2))*2,a=[r-7];for(let e=1;e<n-1;e++)a[e]=a[e-1]-i;return a.push(6),a.reverse()},e.getPositions=function(t){let n=[],r=e.getRowColCoords(t),i=r.length;for(let e=0;e<i;e++)for(let t=0;t<i;t++)e===0&&t===0||e===0&&t===i-1||e===i-1&&t===0||n.push([r[e],r[t]]);return n}})),I=t((e=>{var t=j().getSymbolSize,n=7;e.getPositions=function(e){let r=t(e);return[[0,0],[r-n,0],[0,r-n]]}})),L=t((e=>{e.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var t={N1:3,N2:3,N3:40,N4:10};e.isValid=function(e){return e!=null&&e!==``&&!isNaN(e)&&e>=0&&e<=7},e.from=function(t){return e.isValid(t)?parseInt(t,10):void 0},e.getPenaltyN1=function(e){let n=e.size,r=0,i=0,a=0,o=null,s=null;for(let c=0;c<n;c++){i=a=0,o=s=null;for(let l=0;l<n;l++){let n=e.get(c,l);n===o?i++:(i>=5&&(r+=t.N1+(i-5)),o=n,i=1),n=e.get(l,c),n===s?a++:(a>=5&&(r+=t.N1+(a-5)),s=n,a=1)}i>=5&&(r+=t.N1+(i-5)),a>=5&&(r+=t.N1+(a-5))}return r},e.getPenaltyN2=function(e){let n=e.size,r=0;for(let t=0;t<n-1;t++)for(let i=0;i<n-1;i++){let n=e.get(t,i)+e.get(t,i+1)+e.get(t+1,i)+e.get(t+1,i+1);(n===4||n===0)&&r++}return r*t.N2},e.getPenaltyN3=function(e){let n=e.size,r=0,i=0,a=0;for(let t=0;t<n;t++){i=a=0;for(let o=0;o<n;o++)i=i<<1&2047|e.get(t,o),o>=10&&(i===1488||i===93)&&r++,a=a<<1&2047|e.get(o,t),o>=10&&(a===1488||a===93)&&r++}return r*t.N3},e.getPenaltyN4=function(e){let n=0,r=e.data.length;for(let t=0;t<r;t++)n+=e.data[t];return Math.abs(Math.ceil(n*100/r/5)-10)*t.N4};function n(t,n,r){switch(t){case e.Patterns.PATTERN000:return(n+r)%2==0;case e.Patterns.PATTERN001:return n%2==0;case e.Patterns.PATTERN010:return r%3==0;case e.Patterns.PATTERN011:return(n+r)%3==0;case e.Patterns.PATTERN100:return(Math.floor(n/2)+Math.floor(r/3))%2==0;case e.Patterns.PATTERN101:return n*r%2+n*r%3==0;case e.Patterns.PATTERN110:return(n*r%2+n*r%3)%2==0;case e.Patterns.PATTERN111:return(n*r%3+(n+r)%2)%2==0;default:throw Error(`bad maskPattern:`+t)}}e.applyMask=function(e,t){let r=t.size;for(let i=0;i<r;i++)for(let a=0;a<r;a++)t.isReserved(a,i)||t.xor(a,i,n(e,a,i))},e.getBestMask=function(t,n){let r=Object.keys(e.Patterns).length,i=0,a=1/0;for(let o=0;o<r;o++){n(o),e.applyMask(o,t);let r=e.getPenaltyN1(t)+e.getPenaltyN2(t)+e.getPenaltyN3(t)+e.getPenaltyN4(t);e.applyMask(o,t),r<a&&(a=r,i=o)}return i}})),R=t((e=>{var t=M(),n=[1,1,1,1,1,1,1,1,1,1,2,2,1,2,2,4,1,2,4,4,2,4,4,4,2,4,6,5,2,4,6,6,2,5,8,8,4,5,8,8,4,5,8,11,4,8,10,11,4,9,12,16,4,9,16,16,6,10,12,18,6,10,17,16,6,11,16,19,6,13,18,21,7,14,21,25,8,16,20,25,8,17,23,25,9,17,23,34,9,18,25,30,10,20,27,32,12,21,29,35,12,23,34,37,12,25,34,40,13,26,35,42,14,28,38,45,15,29,40,48,16,31,43,51,17,33,45,54,18,35,48,57,19,37,51,60,19,38,53,63,20,40,56,66,21,43,59,70,22,45,62,74,24,47,65,77,25,49,68,81],r=[7,10,13,17,10,16,22,28,15,26,36,44,20,36,52,64,26,48,72,88,36,64,96,112,40,72,108,130,48,88,132,156,60,110,160,192,72,130,192,224,80,150,224,264,96,176,260,308,104,198,288,352,120,216,320,384,132,240,360,432,144,280,408,480,168,308,448,532,180,338,504,588,196,364,546,650,224,416,600,700,224,442,644,750,252,476,690,816,270,504,750,900,300,560,810,960,312,588,870,1050,336,644,952,1110,360,700,1020,1200,390,728,1050,1260,420,784,1140,1350,450,812,1200,1440,480,868,1290,1530,510,924,1350,1620,540,980,1440,1710,570,1036,1530,1800,570,1064,1590,1890,600,1120,1680,1980,630,1204,1770,2100,660,1260,1860,2220,720,1316,1950,2310,750,1372,2040,2430];e.getBlocksCount=function(e,r){switch(r){case t.L:return n[(e-1)*4+0];case t.M:return n[(e-1)*4+1];case t.Q:return n[(e-1)*4+2];case t.H:return n[(e-1)*4+3];default:return}},e.getTotalCodewordsCount=function(e,n){switch(n){case t.L:return r[(e-1)*4+0];case t.M:return r[(e-1)*4+1];case t.Q:return r[(e-1)*4+2];case t.H:return r[(e-1)*4+3];default:return}}})),z=t((e=>{var t=new Uint8Array(512),n=new Uint8Array(256);(function(){let e=1;for(let r=0;r<255;r++)t[r]=e,n[e]=r,e<<=1,e&256&&(e^=285);for(let e=255;e<512;e++)t[e]=t[e-255]})(),e.log=function(e){if(e<1)throw Error(`log(`+e+`)`);return n[e]},e.exp=function(e){return t[e]},e.mul=function(e,r){return e===0||r===0?0:t[n[e]+n[r]]}})),B=t((e=>{var t=z();e.mul=function(e,n){let r=new Uint8Array(e.length+n.length-1);for(let i=0;i<e.length;i++)for(let a=0;a<n.length;a++)r[i+a]^=t.mul(e[i],n[a]);return r},e.mod=function(e,n){let r=new Uint8Array(e);for(;r.length-n.length>=0;){let e=r[0];for(let i=0;i<n.length;i++)r[i]^=t.mul(n[i],e);let i=0;for(;i<r.length&&r[i]===0;)i++;r=r.slice(i)}return r},e.generateECPolynomial=function(n){let r=new Uint8Array([1]);for(let i=0;i<n;i++)r=e.mul(r,new Uint8Array([1,t.exp(i)]));return r}})),V=t(((e,t)=>{var n=B();function r(e){this.genPoly=void 0,this.degree=e,this.degree&&this.initialize(this.degree)}r.prototype.initialize=function(e){this.degree=e,this.genPoly=n.generateECPolynomial(this.degree)},r.prototype.encode=function(e){if(!this.genPoly)throw Error(`Encoder not initialized`);let t=new Uint8Array(e.length+this.degree);t.set(e);let r=n.mod(t,this.genPoly),i=this.degree-r.length;if(i>0){let e=new Uint8Array(this.degree);return e.set(r,i),e}return r},t.exports=r})),H=t((e=>{e.isValid=function(e){return!isNaN(e)&&e>=1&&e<=40}})),U=t((e=>{var t=`[0-9]+`,n=`[A-Z $%*+\\-./:]+`,r=`(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+`;r=r.replace(/u/g,`\\u`);var i=`(?:(?![A-Z0-9 $%*+\\-./:]|`+r+`)(?:.|[\r
2
2
  ]))+`;e.KANJI=new RegExp(r,`g`),e.BYTE_KANJI=RegExp(`[^A-Z0-9 $%*+\\-./:]+`,`g`),e.BYTE=new RegExp(i,`g`),e.NUMERIC=new RegExp(t,`g`),e.ALPHANUMERIC=new RegExp(n,`g`);var a=RegExp(`^`+r+`$`),o=RegExp(`^`+t+`$`),s=RegExp(`^[A-Z0-9 $%*+\\-./:]+$`);e.testKanji=function(e){return a.test(e)},e.testNumeric=function(e){return o.test(e)},e.testAlphanumeric=function(e){return s.test(e)}})),W=t((e=>{var t=H(),n=U();e.NUMERIC={id:`Numeric`,bit:1,ccBits:[10,12,14]},e.ALPHANUMERIC={id:`Alphanumeric`,bit:2,ccBits:[9,11,13]},e.BYTE={id:`Byte`,bit:4,ccBits:[8,16,16]},e.KANJI={id:`Kanji`,bit:8,ccBits:[8,10,12]},e.MIXED={bit:-1},e.getCharCountIndicator=function(e,n){if(!e.ccBits)throw Error(`Invalid mode: `+e);if(!t.isValid(n))throw Error(`Invalid version: `+n);return n>=1&&n<10?e.ccBits[0]:n<27?e.ccBits[1]:e.ccBits[2]},e.getBestModeForData=function(t){return n.testNumeric(t)?e.NUMERIC:n.testAlphanumeric(t)?e.ALPHANUMERIC:n.testKanji(t)?e.KANJI:e.BYTE},e.toString=function(e){if(e&&e.id)return e.id;throw Error(`Invalid mode`)},e.isValid=function(e){return e&&e.bit&&e.ccBits};function r(t){if(typeof t!=`string`)throw Error(`Param is not a string`);switch(t.toLowerCase()){case`numeric`:return e.NUMERIC;case`alphanumeric`:return e.ALPHANUMERIC;case`kanji`:return e.KANJI;case`byte`:return e.BYTE;default:throw Error(`Unknown mode: `+t)}}e.from=function(t,n){if(e.isValid(t))return t;try{return r(t)}catch{return n}}})),ne=t((e=>{var t=j(),n=R(),r=M(),i=W(),a=H(),o=7973,s=t.getBCHDigit(o);function c(t,n,r){for(let i=1;i<=40;i++)if(n<=e.getCapacity(i,r,t))return i}function l(e,t){return i.getCharCountIndicator(e,t)+4}function u(e,t){let n=0;return e.forEach(function(e){let r=l(e.mode,t);n+=r+e.getBitsLength()}),n}function d(t,n){for(let r=1;r<=40;r++)if(u(t,r)<=e.getCapacity(r,n,i.MIXED))return r}e.from=function(e,t){return a.isValid(e)?parseInt(e,10):t},e.getCapacity=function(e,r,o){if(!a.isValid(e))throw Error(`Invalid QR Code version`);o===void 0&&(o=i.BYTE);let s=(t.getSymbolTotalCodewords(e)-n.getTotalCodewordsCount(e,r))*8;if(o===i.MIXED)return s;let c=s-l(o,e);switch(o){case i.NUMERIC:return Math.floor(c/10*3);case i.ALPHANUMERIC:return Math.floor(c/11*2);case i.KANJI:return Math.floor(c/13);case i.BYTE:default:return Math.floor(c/8)}},e.getBestVersionForData=function(e,t){let n,i=r.from(t,r.M);if(Array.isArray(e)){if(e.length>1)return d(e,i);if(e.length===0)return 1;n=e[0]}else n=e;return c(n.mode,n.getLength(),i)},e.getEncodedBits=function(e){if(!a.isValid(e)||e<7)throw Error(`Invalid QR Code version`);let n=e<<12;for(;t.getBCHDigit(n)-s>=0;)n^=o<<t.getBCHDigit(n)-s;return e<<12|n}})),re=t((e=>{var t=j(),n=1335,r=21522,i=t.getBCHDigit(n);e.getEncodedBits=function(e,a){let o=e.bit<<3|a,s=o<<10;for(;t.getBCHDigit(s)-i>=0;)s^=n<<t.getBCHDigit(s)-i;return(o<<10|s)^r}})),G=t(((e,t)=>{var n=W();function r(e){this.mode=n.NUMERIC,this.data=e.toString()}r.getBitsLength=function(e){return 10*Math.floor(e/3)+(e%3?e%3*3+1:0)},r.prototype.getLength=function(){return this.data.length},r.prototype.getBitsLength=function(){return r.getBitsLength(this.data.length)},r.prototype.write=function(e){let t,n,r;for(t=0;t+3<=this.data.length;t+=3)n=this.data.substr(t,3),r=parseInt(n,10),e.put(r,10);let i=this.data.length-t;i>0&&(n=this.data.substr(t),r=parseInt(n,10),e.put(r,i*3+1))},t.exports=r})),K=t(((e,t)=>{var n=W(),r=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`.split(``);function i(e){this.mode=n.ALPHANUMERIC,this.data=e}i.getBitsLength=function(e){return 11*Math.floor(e/2)+e%2*6},i.prototype.getLength=function(){return this.data.length},i.prototype.getBitsLength=function(){return i.getBitsLength(this.data.length)},i.prototype.write=function(e){let t;for(t=0;t+2<=this.data.length;t+=2){let n=r.indexOf(this.data[t])*45;n+=r.indexOf(this.data[t+1]),e.put(n,11)}this.data.length%2&&e.put(r.indexOf(this.data[t]),6)},t.exports=i})),q=t(((e,t)=>{var n=W();function r(e){this.mode=n.BYTE,typeof e==`string`?this.data=new TextEncoder().encode(e):this.data=new Uint8Array(e)}r.getBitsLength=function(e){return e*8},r.prototype.getLength=function(){return this.data.length},r.prototype.getBitsLength=function(){return r.getBitsLength(this.data.length)},r.prototype.write=function(e){for(let t=0,n=this.data.length;t<n;t++)e.put(this.data[t],8)},t.exports=r})),J=t(((e,t)=>{var n=W(),r=j();function i(e){this.mode=n.KANJI,this.data=e}i.getBitsLength=function(e){return e*13},i.prototype.getLength=function(){return this.data.length},i.prototype.getBitsLength=function(){return i.getBitsLength(this.data.length)},i.prototype.write=function(e){let t;for(t=0;t<this.data.length;t++){let n=r.toSJIS(this.data[t]);if(n>=33088&&n<=40956)n-=33088;else if(n>=57408&&n<=60351)n-=49472;else throw Error(`Invalid SJIS character: `+this.data[t]+`
3
3
  Make sure your charset is UTF-8`);n=(n>>>8&255)*192+(n&255),e.put(n,13)}},t.exports=i})),Y=t(((e,t)=>{var n={single_source_shortest_paths:function(e,t,r){var i={},a={};a[t]=0;var o=n.PriorityQueue.make();o.push(t,0);for(var s,c,l,u,d,f,p,m,h;!o.empty();)for(l in s=o.pop(),c=s.value,u=s.cost,d=e[c]||{},d)d.hasOwnProperty(l)&&(f=d[l],p=u+f,m=a[l],h=a[l]===void 0,(h||m>p)&&(a[l]=p,o.push(l,p),i[l]=c));if(r!==void 0&&a[r]===void 0){var g=[`Could not find a path from `,t,` to `,r,`.`].join(``);throw Error(g)}return i},extract_shortest_path_from_predecessor_list:function(e,t){for(var n=[],r=t;r;)n.push(r),e[r],r=e[r];return n.reverse(),n},find_path:function(e,t,r){var i=n.single_source_shortest_paths(e,t,r);return n.extract_shortest_path_from_predecessor_list(i,r)},PriorityQueue:{make:function(e){var t=n.PriorityQueue,r={},i;for(i in e||={},t)t.hasOwnProperty(i)&&(r[i]=t[i]);return r.queue=[],r.sorter=e.sorter||t.default_sorter,r},default_sorter:function(e,t){return e.cost-t.cost},push:function(e,t){var n={value:e,cost:t};this.queue.push(n),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};t!==void 0&&(t.exports=n)})),ie=t((e=>{var t=W(),n=G(),r=K(),i=q(),a=J(),o=U(),s=j(),c=Y();function l(e){return unescape(encodeURIComponent(e)).length}function u(e,t,n){let r=[],i;for(;(i=e.exec(n))!==null;)r.push({data:i[0],index:i.index,mode:t,length:i[0].length});return r}function d(e){let n=u(o.NUMERIC,t.NUMERIC,e),r=u(o.ALPHANUMERIC,t.ALPHANUMERIC,e),i,a;return s.isKanjiModeEnabled()?(i=u(o.BYTE,t.BYTE,e),a=u(o.KANJI,t.KANJI,e)):(i=u(o.BYTE_KANJI,t.BYTE,e),a=[]),n.concat(r,i,a).sort(function(e,t){return e.index-t.index}).map(function(e){return{data:e.data,mode:e.mode,length:e.length}})}function f(e,o){switch(o){case t.NUMERIC:return n.getBitsLength(e);case t.ALPHANUMERIC:return r.getBitsLength(e);case t.KANJI:return a.getBitsLength(e);case t.BYTE:return i.getBitsLength(e)}}function p(e){return e.reduce(function(e,t){let n=e.length-1>=0?e[e.length-1]:null;return n&&n.mode===t.mode?(e[e.length-1].data+=t.data,e):(e.push(t),e)},[])}function m(e){let n=[];for(let r=0;r<e.length;r++){let i=e[r];switch(i.mode){case t.NUMERIC:n.push([i,{data:i.data,mode:t.ALPHANUMERIC,length:i.length},{data:i.data,mode:t.BYTE,length:i.length}]);break;case t.ALPHANUMERIC:n.push([i,{data:i.data,mode:t.BYTE,length:i.length}]);break;case t.KANJI:n.push([i,{data:i.data,mode:t.BYTE,length:l(i.data)}]);break;case t.BYTE:n.push([{data:i.data,mode:t.BYTE,length:l(i.data)}])}}return n}function h(e,n){let r={},i={start:{}},a=[`start`];for(let o=0;o<e.length;o++){let s=e[o],c=[];for(let e=0;e<s.length;e++){let l=s[e],u=``+o+e;c.push(u),r[u]={node:l,lastCount:0},i[u]={};for(let e=0;e<a.length;e++){let o=a[e];r[o]&&r[o].node.mode===l.mode?(i[o][u]=f(r[o].lastCount+l.length,l.mode)-f(r[o].lastCount,l.mode),r[o].lastCount+=l.length):(r[o]&&(r[o].lastCount=l.length),i[o][u]=f(l.length,l.mode)+4+t.getCharCountIndicator(l.mode,n))}}a=c}for(let e=0;e<a.length;e++)i[a[e]].end=0;return{map:i,table:r}}function g(e,o){let c,l=t.getBestModeForData(e);if(c=t.from(o,l),c!==t.BYTE&&c.bit<l.bit)throw Error(`"`+e+`" cannot be encoded with mode `+t.toString(c)+`.
4
4
  Suggested mode is: `+t.toString(l));switch(c===t.KANJI&&!s.isKanjiModeEnabled()&&(c=t.BYTE),c){case t.NUMERIC:return new n(e);case t.ALPHANUMERIC:return new r(e);case t.KANJI:return new a(e);case t.BYTE:return new i(e)}}e.fromArray=function(e){return e.reduce(function(e,t){return typeof t==`string`?e.push(g(t,null)):t.data&&e.push(g(t.data,t.mode)),e},[])},e.fromString=function(t,n){let r=h(m(d(t,s.isKanjiModeEnabled())),n),i=c.find_path(r.map,`start`,`end`),a=[];for(let e=1;e<i.length-1;e++)a.push(r.table[i[e]].node);return e.fromArray(p(a))},e.rawSplit=function(t){return e.fromArray(d(t,s.isKanjiModeEnabled()))}})),ae=t((e=>{var t=j(),n=M(),r=N(),i=P(),a=F(),o=I(),s=L(),c=R(),l=V(),u=ne(),d=re(),f=W(),p=ie();function m(e,t){let n=e.size,r=o.getPositions(t);for(let t=0;t<r.length;t++){let i=r[t][0],a=r[t][1];for(let t=-1;t<=7;t++)if(!(i+t<=-1||n<=i+t))for(let r=-1;r<=7;r++)a+r<=-1||n<=a+r||(t>=0&&t<=6&&(r===0||r===6)||r>=0&&r<=6&&(t===0||t===6)||t>=2&&t<=4&&r>=2&&r<=4?e.set(i+t,a+r,!0,!0):e.set(i+t,a+r,!1,!0))}}function h(e){let t=e.size;for(let n=8;n<t-8;n++){let t=n%2==0;e.set(n,6,t,!0),e.set(6,n,t,!0)}}function g(e,t){let n=a.getPositions(t);for(let t=0;t<n.length;t++){let r=n[t][0],i=n[t][1];for(let t=-2;t<=2;t++)for(let n=-2;n<=2;n++)t===-2||t===2||n===-2||n===2||t===0&&n===0?e.set(r+t,i+n,!0,!0):e.set(r+t,i+n,!1,!0)}}function _(e,t){let n=e.size,r=u.getEncodedBits(t),i,a,o;for(let t=0;t<18;t++)i=Math.floor(t/3),a=t%3+n-8-3,o=(r>>t&1)==1,e.set(i,a,o,!0),e.set(a,i,o,!0)}function v(e,t,n){let r=e.size,i=d.getEncodedBits(t,n),a,o;for(a=0;a<15;a++)o=(i>>a&1)==1,a<6?e.set(a,8,o,!0):a<8?e.set(a+1,8,o,!0):e.set(r-15+a,8,o,!0),a<8?e.set(8,r-a-1,o,!0):a<9?e.set(8,15-a-1+1,o,!0):e.set(8,15-a-1,o,!0);e.set(r-8,8,1,!0)}function y(e,t){let n=e.size,r=-1,i=n-1,a=7,o=0;for(let s=n-1;s>0;s-=2)for(s===6&&s--;;){for(let n=0;n<2;n++)if(!e.isReserved(i,s-n)){let r=!1;o<t.length&&(r=(t[o]>>>a&1)==1),e.set(i,s-n,r),a--,a===-1&&(o++,a=7)}if(i+=r,i<0||n<=i){i-=r,r=-r;break}}}function b(e,n,i){let a=new r;i.forEach(function(t){a.put(t.mode.bit,4),a.put(t.getLength(),f.getCharCountIndicator(t.mode,e)),t.write(a)});let o=(t.getSymbolTotalCodewords(e)-c.getTotalCodewordsCount(e,n))*8;for(a.getLengthInBits()+4<=o&&a.put(0,4);a.getLengthInBits()%8!=0;)a.putBit(0);let s=(o-a.getLengthInBits())/8;for(let e=0;e<s;e++)a.put(e%2?17:236,8);return x(a,e,n)}function x(e,n,r){let i=t.getSymbolTotalCodewords(n),a=i-c.getTotalCodewordsCount(n,r),o=c.getBlocksCount(n,r),s=o-i%o,u=Math.floor(i/o),d=Math.floor(a/o),f=d+1,p=u-d,m=new l(p),h=0,g=Array(o),_=Array(o),v=0,y=new Uint8Array(e.buffer);for(let e=0;e<o;e++){let t=e<s?d:f;g[e]=y.slice(h,h+t),_[e]=m.encode(g[e]),h+=t,v=Math.max(v,t)}let b=new Uint8Array(i),x=0,S,C;for(S=0;S<v;S++)for(C=0;C<o;C++)S<g[C].length&&(b[x++]=g[C][S]);for(S=0;S<p;S++)for(C=0;C<o;C++)b[x++]=_[C][S];return b}function S(e,n,r,a){let o;if(Array.isArray(e))o=p.fromArray(e);else if(typeof e==`string`){let t=n;if(!t){let n=p.rawSplit(e);t=u.getBestVersionForData(n,r)}o=p.fromString(e,t||40)}else throw Error(`Invalid data`);let c=u.getBestVersionForData(o,r);if(!c)throw Error(`The amount of data is too big to be stored in a QR Code`);if(!n)n=c;else if(n<c)throw Error(`
@@ -1 +1 @@
1
- import{a as e,f as t,l as n,t as r,u as i}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as ee}from"./chevron-down-CPngAx4M.js";import{t as te}from"./chevron-right-V1DGIDbL.js";import{t as a}from"./code-5_eJ_XpJ.js";import{n as ne,t as o}from"./checkbox-DIBarrJx.js";import{t as s}from"./plus-tVxSydJ8.js";import{t as re}from"./wand-sparkles-wkul5vje.js";import"./es2015-CfXu88Y7.js";import{o as ie,r as ae}from"./ai-config-store-DQXVJVn_.js";import{A as c,G as l,d as oe,f as se,g as ce,h as le,lt as ue,m as u,p as de,rt as fe,u as d,v as pe,y as me,z as f}from"./index-L7uWxTnp.js";import{r as p}from"./syntax-highlight-DVhPdkuV.js";import{a as he,i as m,n as ge,o as h,r as g,t as _}from"./table-CT97lAYq.js";import{n as _e}from"./monaco-editor-B3brLg8j.js";import{n as ve,t as ye}from"./code-fixer-fQtWZ5He.js";import{t as v}from"./file-system-access-CtcvBfj4.js";var y=n(`file-up`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M12 12v6`,key:`3ahymv`}],[`path`,{d:`m15 15-3-3-3 3`,key:`15xj92`}]]),b=t(i(),1),x=e();function be(e){return e.trim().startsWith(`data:image/`)}var xe={name:``,urlPattern:``,method:`*`,statusCode:200,delay:0,bodyType:`inline`,headers:{},body:``,enabled:!0};function S({mockRules:e,fetchMocks:t,createMock:n,updateMock:i,deleteMock:S,initialEditData:C,onInitialEditConsumed:w}){let[T,E]=(0,b.useState)(!1),[D]=(0,b.useState)(null),[O,Se]=(0,b.useState)(xe),[k,A]=(0,b.useState)(!1),[j,M]=(0,b.useState)(!1),[N,Ce]=(0,b.useState)(300),we=(0,b.useRef)(null),P=(0,b.useRef)(null),[F,I]=(0,b.useState)(``),[L,R]=(0,b.useState)(``),[z,B]=(0,b.useState)(null),[V,H]=(0,b.useState)(null),[U,W]=(0,b.useState)(!1),[G,K]=(0,b.useState)(!1),[q,J]=(0,b.useState)(null),Te=e=>e.type.startsWith(`image/`),Ee=e=>({json:`application/json`,js:`application/javascript`,css:`text/css`,html:`text/html`,htm:`text/html`,xml:`application/xml`,txt:`text/plain`,csv:`text/csv`,png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,gif:`image/gif`,webp:`image/webp`,svg:`image/svg+xml`,ico:`image/x-icon`,bmp:`image/bmp`})[e.toLowerCase().split(`.`).pop()||``]||`text/plain`,Y=e=>{let t=Ee(e);return(O.headers||{})[`Content-Type`]?null:t},X=async e=>Te(e)?new Promise(t=>{let n=new FileReader;n.onload=e=>{t(e.target?.result)},n.readAsDataURL(e)}):await e.text(),De=(0,b.useCallback)(async()=>{if(v(window))try{let[e]=await window.showOpenFilePicker({types:[{description:`响应文件`,accept:{"application/json":[`.json`],"text/html":[`.html`,`.htm`],"text/plain":[`.txt`,`.js`,`.css`,`.xml`,`.csv`,`.png`,`.jpg`,`.jpeg`,`.gif`,`.webp`],"image/png":[`.png`],"image/jpeg":[`.jpg`,`.jpeg`],"image/gif":[`.gif`],"image/webp":[`.webp`]}}],multiple:!1}),t=await e.getFile();$(`body`,await X(t)),J(Y(t.name));return}catch(e){console.log(`File System Access API not available or cancelled:`,e)}P.current?.click()},[]),Oe=(0,b.useCallback)(e=>{let t=e.target.files?.[0];t&&X(t).then(e=>{$(`body`,e),J(Y(t.name))}),e.target.value=``},[]);(0,b.useEffect)(()=>{t()},[t]),(0,b.useEffect)(()=>{C&&(window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`mock.create`,title:`新建 Mock 规则`,size:`lg`,params:{initialData:C}}})),w?.())},[C,w]),(0,b.useEffect)(()=>{T||(I(``),R(``),M(!1),H(null),B(null))},[T]);let ke=(0,b.useCallback)(e=>{if(!e.trim()){H(null);return}let t=p(e);t.valid?H(null):H(t.error||`内容格式错误`)},[]),Z=(0,b.useCallback)(()=>{window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`mock.create`,title:`新建 Mock 规则`,size:`lg`}}))},[]),Ae=(0,b.useCallback)(e=>{window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`mock.edit`,title:`编辑 Mock:${e.name||e.urlPattern}`,size:`lg`,params:{id:e.id}}}))},[]),je=(0,b.useCallback)(e=>{e.preventDefault();let t=e.clientY,n=N,r=e=>{let r=e.clientY-t;Ce(Math.max(150,n+r))},i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)},[N]),Q=(0,b.useCallback)(async()=>{if(O.bodyType===`inline`&&O.body.trim()){let e=p(O.body);if(!e.valid){let t=e.error||`内容格式错误`;H(t),d.error(t);return}}A(!0);try{if(!(D==null?await n(O):await i(D,O)))throw Error(`保存 Mock 规则失败`);d.success(`Mock 规则保存成功`),E(!1)}catch(e){d.error(e instanceof Error?e.message:`保存失败`)}finally{A(!1)}},[D,O,n,i]);oe({active:T,enabled:!k&&!!O.urlPattern,priority:se.modal,onSave:Q});let Me=(0,b.useCallback)(async(e,t)=>{await i(e.id,{enabled:t})},[i]),Ne=(0,b.useCallback)(async e=>{await S(e)},[S]),$=(e,t)=>{Se(n=>({...n,[e]:t})),e===`body`&&typeof t==`string`&&ke(t)},Pe=(0,b.useCallback)(async()=>{K(!0);try{let{formatted:e,type:t}=await ve(O.body);$(`body`,e),B(null),console.log(`已格式化为 ${t}`)}catch(e){B(e instanceof Error?e.message:`格式化失败`),setTimeout(()=>B(null),3e3)}finally{K(!1)}},[O.body]),Fe=(0,b.useCallback)(async()=>{W(!0);try{let e=await ye(O.body,!0);e.success?($(`body`,e.fixed),H(null),B(null),console.log(`代码已修复 (方法: ${e.method===`ai`?`AI`:`规则`})`)):(B(`自动修复失败,请手动修正语法错误`),setTimeout(()=>B(null),3e3))}catch(e){B(e instanceof Error?e.message:`修复失败`),setTimeout(()=>B(null),3e3)}finally{W(!1)}},[O.body]);return(0,x.jsxs)(`div`,{className:`app-page-stack`,children:[(0,x.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,x.jsx)(`h3`,{className:`text-sm font-medium`,children:`规则列表`}),(0,x.jsxs)(r,{variant:`outline`,size:`sm`,onClick:Z,children:[(0,x.jsx)(s,{"data-icon":`inline-start`}),`新增规则`]})]}),(0,x.jsx)(`div`,{className:`rounded-md border`,children:(0,x.jsxs)(_,{children:[(0,x.jsx)(he,{children:(0,x.jsxs)(h,{children:[(0,x.jsx)(m,{className:`w-12`,children:`启用`}),(0,x.jsx)(m,{className:`w-40`,children:`名称`}),(0,x.jsx)(m,{children:`URL 匹配`}),(0,x.jsx)(m,{className:`w-20`,children:`方法`}),(0,x.jsx)(m,{className:`w-20`,children:`状态码`}),(0,x.jsx)(m,{className:`w-16`,children:`类型`}),(0,x.jsx)(m,{className:`w-16`,children:`延迟`}),(0,x.jsx)(m,{className:`w-16`,children:`响应头`}),(0,x.jsx)(m,{className:`w-20`,children:`操作`})]})}),(0,x.jsx)(ge,{children:e.length===0?(0,x.jsx)(h,{children:(0,x.jsx)(g,{colSpan:9,className:`text-center text-muted-foreground py-8`,children:`暂无 Mock 规则,点击"新增规则"或从请求日志详情中创建`})}):e.map(e=>(0,x.jsxs)(h,{children:[(0,x.jsx)(g,{children:(0,x.jsx)(o,{checked:e.enabled,onCheckedChange:t=>Me(e,t===!0)})}),(0,x.jsx)(g,{className:`font-medium text-sm`,children:e.name||(0,x.jsx)(`span`,{className:`text-muted-foreground italic`,children:`未命名`})}),(0,x.jsx)(g,{className:`font-mono text-xs truncate max-w-[300px]`,title:e.urlPattern,children:e.urlPattern}),(0,x.jsx)(g,{children:(0,x.jsx)(f,{variant:`outline`,className:`text-xs`,children:e.method||`*`})}),(0,x.jsx)(g,{children:(0,x.jsx)(f,{variant:e.statusCode>=400?`destructive`:e.statusCode>=300?`secondary`:`default`,children:e.statusCode})}),(0,x.jsx)(g,{children:e.bodyType===`file`?(0,x.jsxs)(f,{variant:`secondary`,children:[(0,x.jsx)(ue,{}),`文件`]}):(0,x.jsxs)(f,{variant:`outline`,children:[(0,x.jsx)(a,{}),`内容`]})}),(0,x.jsx)(g,{className:`text-xs text-muted-foreground font-mono`,children:e.delay?`${e.delay}ms`:`-`}),(0,x.jsx)(g,{children:e.headers&&Object.keys(e.headers).length>0?(0,x.jsx)(f,{variant:`secondary`,className:`text-xs`,children:Object.keys(e.headers).length}):(0,x.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`-`})}),(0,x.jsx)(g,{children:(0,x.jsxs)(`div`,{className:`flex gap-1`,children:[(0,x.jsx)(r,{variant:`ghost`,size:`icon-sm`,onClick:()=>Ae(e),className:`text-muted-foreground hover:text-primary`,"aria-label":`编辑 Mock 规则`,children:(0,x.jsx)(fe,{})}),(0,x.jsx)(r,{variant:`ghost`,size:`icon-sm`,onClick:()=>Ne(e.id),className:`text-muted-foreground hover:text-destructive`,"aria-label":`删除 Mock 规则`,children:(0,x.jsx)(l,{})})]})})]},e.id))})]})}),(0,x.jsx)(le,{open:T,onOpenChange:E,children:(0,x.jsxs)(ce,{className:`p-0 flex flex-col`,resizable:!0,defaultWidth:700,storageKey:`mock-config-editor`,children:[(0,x.jsx)(pe,{className:`px-4 pt-4 pb-2`,children:(0,x.jsx)(me,{className:`text-base`,children:D==null?`新建 Mock 规则`:`编辑 Mock 规则`})}),(0,x.jsx)(u,{}),(0,x.jsxs)(`div`,{className:`app-panel-content`,children:[(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`规则名称`}),(0,x.jsx)(c,{value:O.name,onChange:e=>$(`name`,e.target.value),placeholder:`如:模拟欠费状态`,className:`h-8`})]}),(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`URL 匹配(支持正则)`}),(0,x.jsx)(c,{value:O.urlPattern,onChange:e=>$(`urlPattern`,e.target.value),placeholder:`如:/api/console/user/corp/.*`,className:`h-8 font-mono text-sm`})]}),(0,x.jsxs)(`div`,{className:`grid grid-cols-3 gap-3`,children:[(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`HTTP 方法`}),(0,x.jsxs)(`select`,{value:O.method,onChange:e=>$(`method`,e.target.value),className:`flex h-8 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm`,children:[(0,x.jsx)(`option`,{value:`*`,children:`全部`}),(0,x.jsx)(`option`,{value:`GET`,children:`GET`}),(0,x.jsx)(`option`,{value:`POST`,children:`POST`}),(0,x.jsx)(`option`,{value:`PUT`,children:`PUT`}),(0,x.jsx)(`option`,{value:`DELETE`,children:`DELETE`}),(0,x.jsx)(`option`,{value:`PATCH`,children:`PATCH`})]})]}),(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`响应状态码`}),(0,x.jsx)(c,{type:`number`,value:O.statusCode,onChange:e=>$(`statusCode`,parseInt(e.target.value)||200),className:`h-8`})]}),(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`响应延迟 (ms)`}),(0,x.jsx)(c,{type:`number`,value:O.delay,onChange:e=>$(`delay`,parseInt(e.target.value)||0),placeholder:`0`,className:`h-8`})]})]}),(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`响应内容 (Body)`}),(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsxs)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:De,children:[(0,x.jsx)(y,{className:`h-3 w-3 mr-1`}),`从文件加载`]}),(0,x.jsxs)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:async()=>{let e=window.prompt(`请输入文件 URL:`);if(e)try{let t=await fetch(e);if((t.headers.get(`content-type`)||``).startsWith(`image/`)||e.match(/\.(png|jpg|jpeg|gif|webp|svg|ico|bmp)$/i)){let e=await t.blob(),n=new FileReader;n.onload=()=>{$(`body`,n.result)},n.readAsDataURL(e)}else $(`body`,await t.text())}catch(e){alert(`无法加载文件: `+e.message)}},children:[(0,x.jsx)(y,{className:`h-3 w-3 mr-1`}),`从URL导入`]}),z&&(0,x.jsx)(`span`,{className:`text-xs text-red-500`,children:z}),O.body.trim()&&ie(ae())&&(0,x.jsxs)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:Fe,disabled:U,children:[(0,x.jsx)(re,{className:`h-3 w-3 mr-1`}),U?`修复中...`:`AI修复`]}),(0,x.jsxs)(r,{variant:`ghost`,size:`sm`,className:`h-6 text-xs`,onClick:Pe,disabled:G,children:[(0,x.jsx)(a,{className:`h-3 w-3 mr-1`}),G?`格式化中...`:`智能格式化`]})]})]}),(0,x.jsx)(`input`,{ref:P,type:`file`,className:`hidden`,onChange:Oe,accept:`image/*,.json,.html,.htm,.txt,.js,.css,.xml,.csv`}),O.body.trim()&&be(O.body)?(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsx)(`div`,{className:`border rounded-md p-2 bg-muted/30`,children:(0,x.jsx)(`img`,{src:O.body,alt:`Preview`,className:`max-w-full max-h-96 object-contain`})}),(0,x.jsxs)(`div`,{className:`flex gap-2`,children:[(0,x.jsx)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:()=>$(`body`,``),children:`删除图片`}),(0,x.jsx)(r,{variant:`ghost`,size:`sm`,className:`h-6 text-xs`,onClick:()=>{navigator.clipboard.writeText(O.body),alert(`图片内容已复制到剪贴板`)},children:`复制内容`})]})]}):(0,x.jsxs)(`div`,{ref:we,className:`relative group`,children:[(0,x.jsx)(_e,{value:O.body,onChange:e=>$(`body`,e),placeholder:`支持 JSON, HTML, JS, CSS 等格式,或从文件/URL导入`,height:`${N}px`}),(0,x.jsx)(`div`,{className:`absolute bottom-0 left-0 right-0 h-4 cursor-ns-resize flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity bg-gradient-to-t from-border/50 to-transparent`,onMouseDown:je,children:(0,x.jsx)(ne,{className:`h-4 w-4 text-muted-foreground`})})]}),V&&(0,x.jsxs)(`div`,{className:`flex items-start gap-2 p-2 rounded-md bg-red-50 dark:bg-red-950/20 border border-red-200 dark:border-red-900`,children:[(0,x.jsx)(`span`,{className:`text-xs text-red-600 dark:text-red-400 font-medium`,children:`语法错误:`}),(0,x.jsx)(`span`,{className:`text-xs text-red-600 dark:text-red-400 flex-1`,children:V})]})]}),(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,x.jsxs)(`button`,{type:`button`,className:`flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground`,onClick:()=>M(!j),children:[j?(0,x.jsx)(ee,{className:`h-3 w-3`}):(0,x.jsx)(te,{className:`h-3 w-3`}),`响应头 (Headers)`,Object.keys(O.headers||{}).length>0&&(0,x.jsx)(f,{variant:`secondary`,className:`ml-1 text-xs`,children:Object.keys(O.headers||{}).length})]}),q&&(0,x.jsxs)(`div`,{className:`flex items-center gap-2 text-xs`,children:[(0,x.jsxs)(`span`,{className:`text-amber-600 dark:text-amber-400`,children:[`检测到内容类型变更,建议更新为 `,q,`?`]}),(0,x.jsx)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:()=>{$(`headers`,{...O.headers||{},"Content-Type":q}),J(null)},children:`更新`}),(0,x.jsx)(r,{variant:`ghost`,size:`sm`,className:`h-6 text-xs`,onClick:()=>J(null),children:`忽略`})]})]}),j&&(0,x.jsxs)(`div`,{className:`space-y-2 pl-4 border-l-2 border-muted`,children:[Object.entries(O.headers||{}).length>0?(0,x.jsx)(`div`,{className:`space-y-1`,children:Object.entries(O.headers||{}).map(([e,t])=>(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(c,{value:e,onChange:n=>{let r={...O.headers};delete r[e],n.target.value&&(r[n.target.value]=t),$(`headers`,r)},placeholder:`Header 名称`,className:`h-7 font-mono text-xs flex-1`}),(0,x.jsx)(c,{value:t,onChange:t=>{$(`headers`,{...O.headers,[e]:t.target.value})},placeholder:`Header 值`,className:`h-7 font-mono text-xs flex-1`}),(0,x.jsx)(r,{variant:`ghost`,size:`sm`,className:`h-7 w-7 p-0 text-muted-foreground hover:text-destructive`,onClick:()=>{let t={...O.headers};delete t[e],$(`headers`,t)},children:(0,x.jsx)(l,{className:`h-3.5 w-3.5`})})]},e))}):(0,x.jsx)(`p`,{className:`text-xs text-muted-foreground italic`,children:`暂无自定义响应头`}),(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(c,{value:F,onChange:e=>I(e.target.value),placeholder:`Header 名称`,className:`h-7 font-mono text-xs flex-1`}),(0,x.jsx)(c,{value:L,onChange:e=>R(e.target.value),placeholder:`Header 值`,className:`h-7 font-mono text-xs flex-1`}),(0,x.jsx)(r,{variant:`outline`,size:`sm`,className:`h-7`,onClick:()=>{F&&L&&($(`headers`,{...O.headers,[F]:L}),I(``),R(``))},disabled:!F||!L,children:(0,x.jsx)(s,{className:`h-3.5 w-3.5`})})]})]})]}),(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(o,{checked:O.enabled,onCheckedChange:e=>$(`enabled`,!!e)}),(0,x.jsx)(`label`,{className:`text-sm`,children:`启用此规则`})]})]}),(0,x.jsx)(u,{}),(0,x.jsxs)(`div`,{className:`px-4 py-3 flex justify-end gap-2`,children:[(0,x.jsx)(r,{variant:`outline`,size:`sm`,onClick:()=>E(!1),children:`取消`}),(0,x.jsx)(de,{size:`sm`,onClick:Q,disabled:k||!O.urlPattern,children:k?`保存中...`:`保存`})]})]})})]})}export{S as MockConfig};
1
+ import{a as e,f as t,l as n,t as r,u as i}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as ee}from"./chevron-down-CPngAx4M.js";import{t as te}from"./chevron-right-V1DGIDbL.js";import{t as a}from"./code-5_eJ_XpJ.js";import{n as ne,t as o}from"./checkbox-D0y07vOb.js";import{t as s}from"./plus-tVxSydJ8.js";import{t as re}from"./wand-sparkles-wkul5vje.js";import"./es2015-CfXu88Y7.js";import{o as ie,r as ae}from"./ai-config-store-DQXVJVn_.js";import{A as c,G as l,d as oe,f as se,g as ce,h as le,lt as ue,m as u,p as de,rt as fe,u as d,v as pe,y as me,z as f}from"./index-DTeCUv1G.js";import{r as p}from"./syntax-highlight-DVhPdkuV.js";import{a as he,i as m,n as ge,o as h,r as g,t as _}from"./table-CT97lAYq.js";import{n as _e}from"./monaco-editor-DboIGERI.js";import{n as ve,t as ye}from"./code-fixer-DOrMk-4V.js";import{t as v}from"./file-system-access-CtcvBfj4.js";var y=n(`file-up`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M12 12v6`,key:`3ahymv`}],[`path`,{d:`m15 15-3-3-3 3`,key:`15xj92`}]]),b=t(i(),1),x=e();function be(e){return e.trim().startsWith(`data:image/`)}var xe={name:``,urlPattern:``,method:`*`,statusCode:200,delay:0,bodyType:`inline`,headers:{},body:``,enabled:!0};function S({mockRules:e,fetchMocks:t,createMock:n,updateMock:i,deleteMock:S,initialEditData:C,onInitialEditConsumed:w}){let[T,E]=(0,b.useState)(!1),[D]=(0,b.useState)(null),[O,Se]=(0,b.useState)(xe),[k,A]=(0,b.useState)(!1),[j,M]=(0,b.useState)(!1),[N,Ce]=(0,b.useState)(300),we=(0,b.useRef)(null),P=(0,b.useRef)(null),[F,I]=(0,b.useState)(``),[L,R]=(0,b.useState)(``),[z,B]=(0,b.useState)(null),[V,H]=(0,b.useState)(null),[U,W]=(0,b.useState)(!1),[G,K]=(0,b.useState)(!1),[q,J]=(0,b.useState)(null),Te=e=>e.type.startsWith(`image/`),Ee=e=>({json:`application/json`,js:`application/javascript`,css:`text/css`,html:`text/html`,htm:`text/html`,xml:`application/xml`,txt:`text/plain`,csv:`text/csv`,png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,gif:`image/gif`,webp:`image/webp`,svg:`image/svg+xml`,ico:`image/x-icon`,bmp:`image/bmp`})[e.toLowerCase().split(`.`).pop()||``]||`text/plain`,Y=e=>{let t=Ee(e);return(O.headers||{})[`Content-Type`]?null:t},X=async e=>Te(e)?new Promise(t=>{let n=new FileReader;n.onload=e=>{t(e.target?.result)},n.readAsDataURL(e)}):await e.text(),De=(0,b.useCallback)(async()=>{if(v(window))try{let[e]=await window.showOpenFilePicker({types:[{description:`响应文件`,accept:{"application/json":[`.json`],"text/html":[`.html`,`.htm`],"text/plain":[`.txt`,`.js`,`.css`,`.xml`,`.csv`,`.png`,`.jpg`,`.jpeg`,`.gif`,`.webp`],"image/png":[`.png`],"image/jpeg":[`.jpg`,`.jpeg`],"image/gif":[`.gif`],"image/webp":[`.webp`]}}],multiple:!1}),t=await e.getFile();$(`body`,await X(t)),J(Y(t.name));return}catch(e){console.log(`File System Access API not available or cancelled:`,e)}P.current?.click()},[]),Oe=(0,b.useCallback)(e=>{let t=e.target.files?.[0];t&&X(t).then(e=>{$(`body`,e),J(Y(t.name))}),e.target.value=``},[]);(0,b.useEffect)(()=>{t()},[t]),(0,b.useEffect)(()=>{C&&(window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`mock.create`,title:`新建 Mock 规则`,size:`lg`,params:{initialData:C}}})),w?.())},[C,w]),(0,b.useEffect)(()=>{T||(I(``),R(``),M(!1),H(null),B(null))},[T]);let ke=(0,b.useCallback)(e=>{if(!e.trim()){H(null);return}let t=p(e);t.valid?H(null):H(t.error||`内容格式错误`)},[]),Z=(0,b.useCallback)(()=>{window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`mock.create`,title:`新建 Mock 规则`,size:`lg`}}))},[]),Ae=(0,b.useCallback)(e=>{window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`mock.edit`,title:`编辑 Mock:${e.name||e.urlPattern}`,size:`lg`,params:{id:e.id}}}))},[]),je=(0,b.useCallback)(e=>{e.preventDefault();let t=e.clientY,n=N,r=e=>{let r=e.clientY-t;Ce(Math.max(150,n+r))},i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)},[N]),Q=(0,b.useCallback)(async()=>{if(O.bodyType===`inline`&&O.body.trim()){let e=p(O.body);if(!e.valid){let t=e.error||`内容格式错误`;H(t),d.error(t);return}}A(!0);try{if(!(D==null?await n(O):await i(D,O)))throw Error(`保存 Mock 规则失败`);d.success(`Mock 规则保存成功`),E(!1)}catch(e){d.error(e instanceof Error?e.message:`保存失败`)}finally{A(!1)}},[D,O,n,i]);oe({active:T,enabled:!k&&!!O.urlPattern,priority:se.modal,onSave:Q});let Me=(0,b.useCallback)(async(e,t)=>{await i(e.id,{enabled:t})},[i]),Ne=(0,b.useCallback)(async e=>{await S(e)},[S]),$=(e,t)=>{Se(n=>({...n,[e]:t})),e===`body`&&typeof t==`string`&&ke(t)},Pe=(0,b.useCallback)(async()=>{K(!0);try{let{formatted:e,type:t}=await ve(O.body);$(`body`,e),B(null),console.log(`已格式化为 ${t}`)}catch(e){B(e instanceof Error?e.message:`格式化失败`),setTimeout(()=>B(null),3e3)}finally{K(!1)}},[O.body]),Fe=(0,b.useCallback)(async()=>{W(!0);try{let e=await ye(O.body,!0);e.success?($(`body`,e.fixed),H(null),B(null),console.log(`代码已修复 (方法: ${e.method===`ai`?`AI`:`规则`})`)):(B(`自动修复失败,请手动修正语法错误`),setTimeout(()=>B(null),3e3))}catch(e){B(e instanceof Error?e.message:`修复失败`),setTimeout(()=>B(null),3e3)}finally{W(!1)}},[O.body]);return(0,x.jsxs)(`div`,{className:`app-page-stack`,children:[(0,x.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,x.jsx)(`h3`,{className:`text-sm font-medium`,children:`规则列表`}),(0,x.jsxs)(r,{variant:`outline`,size:`sm`,onClick:Z,children:[(0,x.jsx)(s,{"data-icon":`inline-start`}),`新增规则`]})]}),(0,x.jsx)(`div`,{className:`rounded-md border`,children:(0,x.jsxs)(_,{children:[(0,x.jsx)(he,{children:(0,x.jsxs)(h,{children:[(0,x.jsx)(m,{className:`w-12`,children:`启用`}),(0,x.jsx)(m,{className:`w-40`,children:`名称`}),(0,x.jsx)(m,{children:`URL 匹配`}),(0,x.jsx)(m,{className:`w-20`,children:`方法`}),(0,x.jsx)(m,{className:`w-20`,children:`状态码`}),(0,x.jsx)(m,{className:`w-16`,children:`类型`}),(0,x.jsx)(m,{className:`w-16`,children:`延迟`}),(0,x.jsx)(m,{className:`w-16`,children:`响应头`}),(0,x.jsx)(m,{className:`w-20`,children:`操作`})]})}),(0,x.jsx)(ge,{children:e.length===0?(0,x.jsx)(h,{children:(0,x.jsx)(g,{colSpan:9,className:`text-center text-muted-foreground py-8`,children:`暂无 Mock 规则,点击"新增规则"或从请求日志详情中创建`})}):e.map(e=>(0,x.jsxs)(h,{children:[(0,x.jsx)(g,{children:(0,x.jsx)(o,{checked:e.enabled,onCheckedChange:t=>Me(e,t===!0)})}),(0,x.jsx)(g,{className:`font-medium text-sm`,children:e.name||(0,x.jsx)(`span`,{className:`text-muted-foreground italic`,children:`未命名`})}),(0,x.jsx)(g,{className:`font-mono text-xs truncate max-w-[300px]`,title:e.urlPattern,children:e.urlPattern}),(0,x.jsx)(g,{children:(0,x.jsx)(f,{variant:`outline`,className:`text-xs`,children:e.method||`*`})}),(0,x.jsx)(g,{children:(0,x.jsx)(f,{variant:e.statusCode>=400?`destructive`:e.statusCode>=300?`secondary`:`default`,children:e.statusCode})}),(0,x.jsx)(g,{children:e.bodyType===`file`?(0,x.jsxs)(f,{variant:`secondary`,children:[(0,x.jsx)(ue,{}),`文件`]}):(0,x.jsxs)(f,{variant:`outline`,children:[(0,x.jsx)(a,{}),`内容`]})}),(0,x.jsx)(g,{className:`text-xs text-muted-foreground font-mono`,children:e.delay?`${e.delay}ms`:`-`}),(0,x.jsx)(g,{children:e.headers&&Object.keys(e.headers).length>0?(0,x.jsx)(f,{variant:`secondary`,className:`text-xs`,children:Object.keys(e.headers).length}):(0,x.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`-`})}),(0,x.jsx)(g,{children:(0,x.jsxs)(`div`,{className:`flex gap-1`,children:[(0,x.jsx)(r,{variant:`ghost`,size:`icon-sm`,onClick:()=>Ae(e),className:`text-muted-foreground hover:text-primary`,"aria-label":`编辑 Mock 规则`,children:(0,x.jsx)(fe,{})}),(0,x.jsx)(r,{variant:`ghost`,size:`icon-sm`,onClick:()=>Ne(e.id),className:`text-muted-foreground hover:text-destructive`,"aria-label":`删除 Mock 规则`,children:(0,x.jsx)(l,{})})]})})]},e.id))})]})}),(0,x.jsx)(le,{open:T,onOpenChange:E,children:(0,x.jsxs)(ce,{className:`p-0 flex flex-col`,resizable:!0,defaultWidth:700,storageKey:`mock-config-editor`,children:[(0,x.jsx)(pe,{className:`px-4 pt-4 pb-2`,children:(0,x.jsx)(me,{className:`text-base`,children:D==null?`新建 Mock 规则`:`编辑 Mock 规则`})}),(0,x.jsx)(u,{}),(0,x.jsxs)(`div`,{className:`app-panel-content`,children:[(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`规则名称`}),(0,x.jsx)(c,{value:O.name,onChange:e=>$(`name`,e.target.value),placeholder:`如:模拟欠费状态`,className:`h-8`})]}),(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`URL 匹配(支持正则)`}),(0,x.jsx)(c,{value:O.urlPattern,onChange:e=>$(`urlPattern`,e.target.value),placeholder:`如:/api/console/user/corp/.*`,className:`h-8 font-mono text-sm`})]}),(0,x.jsxs)(`div`,{className:`grid grid-cols-3 gap-3`,children:[(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`HTTP 方法`}),(0,x.jsxs)(`select`,{value:O.method,onChange:e=>$(`method`,e.target.value),className:`flex h-8 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm`,children:[(0,x.jsx)(`option`,{value:`*`,children:`全部`}),(0,x.jsx)(`option`,{value:`GET`,children:`GET`}),(0,x.jsx)(`option`,{value:`POST`,children:`POST`}),(0,x.jsx)(`option`,{value:`PUT`,children:`PUT`}),(0,x.jsx)(`option`,{value:`DELETE`,children:`DELETE`}),(0,x.jsx)(`option`,{value:`PATCH`,children:`PATCH`})]})]}),(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`响应状态码`}),(0,x.jsx)(c,{type:`number`,value:O.statusCode,onChange:e=>$(`statusCode`,parseInt(e.target.value)||200),className:`h-8`})]}),(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`响应延迟 (ms)`}),(0,x.jsx)(c,{type:`number`,value:O.delay,onChange:e=>$(`delay`,parseInt(e.target.value)||0),placeholder:`0`,className:`h-8`})]})]}),(0,x.jsxs)(`div`,{className:`app-field-group`,children:[(0,x.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,x.jsx)(`label`,{className:`text-xs font-medium text-muted-foreground`,children:`响应内容 (Body)`}),(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsxs)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:De,children:[(0,x.jsx)(y,{className:`h-3 w-3 mr-1`}),`从文件加载`]}),(0,x.jsxs)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:async()=>{let e=window.prompt(`请输入文件 URL:`);if(e)try{let t=await fetch(e);if((t.headers.get(`content-type`)||``).startsWith(`image/`)||e.match(/\.(png|jpg|jpeg|gif|webp|svg|ico|bmp)$/i)){let e=await t.blob(),n=new FileReader;n.onload=()=>{$(`body`,n.result)},n.readAsDataURL(e)}else $(`body`,await t.text())}catch(e){alert(`无法加载文件: `+e.message)}},children:[(0,x.jsx)(y,{className:`h-3 w-3 mr-1`}),`从URL导入`]}),z&&(0,x.jsx)(`span`,{className:`text-xs text-red-500`,children:z}),O.body.trim()&&ie(ae())&&(0,x.jsxs)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:Fe,disabled:U,children:[(0,x.jsx)(re,{className:`h-3 w-3 mr-1`}),U?`修复中...`:`AI修复`]}),(0,x.jsxs)(r,{variant:`ghost`,size:`sm`,className:`h-6 text-xs`,onClick:Pe,disabled:G,children:[(0,x.jsx)(a,{className:`h-3 w-3 mr-1`}),G?`格式化中...`:`智能格式化`]})]})]}),(0,x.jsx)(`input`,{ref:P,type:`file`,className:`hidden`,onChange:Oe,accept:`image/*,.json,.html,.htm,.txt,.js,.css,.xml,.csv`}),O.body.trim()&&be(O.body)?(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsx)(`div`,{className:`border rounded-md p-2 bg-muted/30`,children:(0,x.jsx)(`img`,{src:O.body,alt:`Preview`,className:`max-w-full max-h-96 object-contain`})}),(0,x.jsxs)(`div`,{className:`flex gap-2`,children:[(0,x.jsx)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:()=>$(`body`,``),children:`删除图片`}),(0,x.jsx)(r,{variant:`ghost`,size:`sm`,className:`h-6 text-xs`,onClick:()=>{navigator.clipboard.writeText(O.body),alert(`图片内容已复制到剪贴板`)},children:`复制内容`})]})]}):(0,x.jsxs)(`div`,{ref:we,className:`relative group`,children:[(0,x.jsx)(_e,{value:O.body,onChange:e=>$(`body`,e),placeholder:`支持 JSON, HTML, JS, CSS 等格式,或从文件/URL导入`,height:`${N}px`}),(0,x.jsx)(`div`,{className:`absolute bottom-0 left-0 right-0 h-4 cursor-ns-resize flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity bg-gradient-to-t from-border/50 to-transparent`,onMouseDown:je,children:(0,x.jsx)(ne,{className:`h-4 w-4 text-muted-foreground`})})]}),V&&(0,x.jsxs)(`div`,{className:`flex items-start gap-2 p-2 rounded-md bg-red-50 dark:bg-red-950/20 border border-red-200 dark:border-red-900`,children:[(0,x.jsx)(`span`,{className:`text-xs text-red-600 dark:text-red-400 font-medium`,children:`语法错误:`}),(0,x.jsx)(`span`,{className:`text-xs text-red-600 dark:text-red-400 flex-1`,children:V})]})]}),(0,x.jsxs)(`div`,{className:`space-y-2`,children:[(0,x.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,x.jsxs)(`button`,{type:`button`,className:`flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground`,onClick:()=>M(!j),children:[j?(0,x.jsx)(ee,{className:`h-3 w-3`}):(0,x.jsx)(te,{className:`h-3 w-3`}),`响应头 (Headers)`,Object.keys(O.headers||{}).length>0&&(0,x.jsx)(f,{variant:`secondary`,className:`ml-1 text-xs`,children:Object.keys(O.headers||{}).length})]}),q&&(0,x.jsxs)(`div`,{className:`flex items-center gap-2 text-xs`,children:[(0,x.jsxs)(`span`,{className:`text-amber-600 dark:text-amber-400`,children:[`检测到内容类型变更,建议更新为 `,q,`?`]}),(0,x.jsx)(r,{variant:`outline`,size:`sm`,className:`h-6 text-xs`,onClick:()=>{$(`headers`,{...O.headers||{},"Content-Type":q}),J(null)},children:`更新`}),(0,x.jsx)(r,{variant:`ghost`,size:`sm`,className:`h-6 text-xs`,onClick:()=>J(null),children:`忽略`})]})]}),j&&(0,x.jsxs)(`div`,{className:`space-y-2 pl-4 border-l-2 border-muted`,children:[Object.entries(O.headers||{}).length>0?(0,x.jsx)(`div`,{className:`space-y-1`,children:Object.entries(O.headers||{}).map(([e,t])=>(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(c,{value:e,onChange:n=>{let r={...O.headers};delete r[e],n.target.value&&(r[n.target.value]=t),$(`headers`,r)},placeholder:`Header 名称`,className:`h-7 font-mono text-xs flex-1`}),(0,x.jsx)(c,{value:t,onChange:t=>{$(`headers`,{...O.headers,[e]:t.target.value})},placeholder:`Header 值`,className:`h-7 font-mono text-xs flex-1`}),(0,x.jsx)(r,{variant:`ghost`,size:`sm`,className:`h-7 w-7 p-0 text-muted-foreground hover:text-destructive`,onClick:()=>{let t={...O.headers};delete t[e],$(`headers`,t)},children:(0,x.jsx)(l,{className:`h-3.5 w-3.5`})})]},e))}):(0,x.jsx)(`p`,{className:`text-xs text-muted-foreground italic`,children:`暂无自定义响应头`}),(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(c,{value:F,onChange:e=>I(e.target.value),placeholder:`Header 名称`,className:`h-7 font-mono text-xs flex-1`}),(0,x.jsx)(c,{value:L,onChange:e=>R(e.target.value),placeholder:`Header 值`,className:`h-7 font-mono text-xs flex-1`}),(0,x.jsx)(r,{variant:`outline`,size:`sm`,className:`h-7`,onClick:()=>{F&&L&&($(`headers`,{...O.headers,[F]:L}),I(``),R(``))},disabled:!F||!L,children:(0,x.jsx)(s,{className:`h-3.5 w-3.5`})})]})]})]}),(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(o,{checked:O.enabled,onCheckedChange:e=>$(`enabled`,!!e)}),(0,x.jsx)(`label`,{className:`text-sm`,children:`启用此规则`})]})]}),(0,x.jsx)(u,{}),(0,x.jsxs)(`div`,{className:`px-4 py-3 flex justify-end gap-2`,children:[(0,x.jsx)(r,{variant:`outline`,size:`sm`,onClick:()=>E(!1),children:`取消`}),(0,x.jsx)(de,{size:`sm`,onClick:Q,disabled:k||!O.urlPattern,children:k?`保存中...`:`保存`})]})]})})]})}export{S as MockConfig};
@@ -1 +1 @@
1
- import{a as e,f as t,t as n,u as r}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as i}from"./code-5_eJ_XpJ.js";import{n as a,t as o}from"./checkbox-DIBarrJx.js";import{t as s}from"./wand-sparkles-wkul5vje.js";import{o as c,r as l}from"./ai-config-store-DQXVJVn_.js";import{$ as u,A as d,b as f,d as p,f as m,m as h,ot as g,p as _,u as v}from"./index-L7uWxTnp.js";import{r as y}from"./syntax-highlight-DVhPdkuV.js";import{n as b}from"./monaco-editor-B3brLg8j.js";import{n as x,t as S}from"./code-fixer-fQtWZ5He.js";import{t as C}from"./textarea-C6NooVK1.js";var w=t(r(),1),T=e(),E={name:``,urlPattern:``,method:`*`,statusCode:200,delay:0,bodyType:`inline`,headers:{},body:``,enabled:!0};function D({rule:e,initialData:t,createMock:r,updateMock:D,onSaved:O}){let k=(0,w.useMemo)(()=>e?{name:e.name,urlPattern:e.urlPattern,method:e.method,statusCode:e.statusCode,delay:e.delay||0,bodyType:e.bodyType||`inline`,headers:e.headers||{},body:e.body,enabled:e.enabled}:{...E,...t},[t,e]),[A,j]=(0,w.useState)(k),[M,ee]=(0,w.useState)(()=>JSON.stringify(k.headers||{},null,2)),[N,P]=(0,w.useState)(!1),[F,I]=(0,w.useState)(null),[L,R]=(0,w.useState)(null),[z,B]=(0,w.useState)(null),[V,H]=(0,w.useState)(!1),[U,W]=(0,w.useState)(!1),[G,K]=(0,w.useState)(300),q=c(l()),J=(0,w.useCallback)(e=>{if(!e.trim()){B(null);return}let t=y(e);B(t.valid?null:t.error||`内容格式错误`)},[]),Y=(e,t)=>{j(n=>({...n,[e]:t})),e===`body`&&typeof t==`string`&&J(t)},X=(0,w.useCallback)(e=>{e.preventDefault();let t=e.clientY,n=G,r=e=>{let r=e.clientY-t;K(Math.max(150,n+r))},i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)},[G]),Z=async()=>{if(!(!A.body.trim()||U)){W(!0),R(null);try{let{formatted:e}=await x(A.body);Y(`body`,e)}catch(e){R(e instanceof Error?e.message:`格式化失败`),window.setTimeout(()=>R(null),3e3)}finally{W(!1)}}},Q=async()=>{if(!(!A.body.trim()||V||!q)){H(!0),R(null);try{let e=await S(A.body,!0);if(!e.success)throw Error(`自动修复失败,请手动修正语法错误`);Y(`body`,e.fixed),B(null)}catch(e){R(e instanceof Error?e.message:`修复失败`),window.setTimeout(()=>R(null),3e3)}finally{H(!1)}}},$=async()=>{if(!A.urlPattern.trim()){I(`请填写 URL 匹配`);return}if(A.bodyType===`inline`&&A.body.trim()){let e=y(A.body);if(!e.valid){B(e.error||`内容格式错误`);return}}P(!0),I(null);try{let t={};if(M.trim()){let e=JSON.parse(M);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`响应头必须是 JSON 对象`);t=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}let n={...A,headers:t},i=!1;if(i=e?await D(e.id,n):!!await r(n),!i)throw Error(`保存 Mock 规则失败`);v.success(e?`Mock 规则已更新`:`Mock 规则已创建`),O?.()}catch(e){let t=e instanceof Error?e.message:`保存失败`;I(t),v.error(t)}finally{P(!1)}};return p({active:!0,enabled:!N&&!!A.urlPattern.trim(),priority:m.panel,onSave:$}),(0,T.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,T.jsxs)(`div`,{className:`app-panel-content`,children:[F&&(0,T.jsx)(`div`,{className:`rounded-md border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-900 dark:bg-red-950/20 dark:text-red-300`,children:F}),(0,T.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`规则名称`}),(0,T.jsx)(d,{value:A.name,onChange:e=>Y(`name`,e.target.value),placeholder:`如:模拟欠费状态`})]}),(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`HTTP 方法`}),(0,T.jsxs)(`select`,{value:A.method,onChange:e=>Y(`method`,e.target.value),className:`flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm`,children:[(0,T.jsx)(`option`,{value:`*`,children:`全部`}),(0,T.jsx)(`option`,{value:`GET`,children:`GET`}),(0,T.jsx)(`option`,{value:`POST`,children:`POST`}),(0,T.jsx)(`option`,{value:`PUT`,children:`PUT`}),(0,T.jsx)(`option`,{value:`DELETE`,children:`DELETE`}),(0,T.jsx)(`option`,{value:`PATCH`,children:`PATCH`})]})]})]}),(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`URL 匹配(支持正则)`}),(0,T.jsx)(d,{value:A.urlPattern,onChange:e=>Y(`urlPattern`,e.target.value),placeholder:`如:/api/console/user/corp/.*`,className:`font-mono`})]}),(0,T.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`响应状态码`}),(0,T.jsx)(d,{type:`number`,value:A.statusCode,onChange:e=>Y(`statusCode`,parseInt(e.target.value)||200)})]}),(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`响应延迟 (ms)`}),(0,T.jsx)(d,{type:`number`,value:A.delay,onChange:e=>Y(`delay`,parseInt(e.target.value)||0)})]})]}),(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`响应头 JSON`}),(0,T.jsx)(C,{value:M,onChange:e=>ee(e.target.value),className:`min-h-[96px] font-mono text-xs`,placeholder:`{"Content-Type":"application/json"}`})]}),(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,T.jsx)(f,{children:`响应内容`}),(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center justify-end gap-2`,children:[L&&(0,T.jsx)(`span`,{className:`max-w-[280px] truncate text-xs text-red-500`,title:L,children:L}),A.body.trim()&&(0,T.jsxs)(n,{type:`button`,variant:`outline`,size:`sm`,className:`h-7 text-xs`,onClick:Q,disabled:V||!q,title:q?`使用 AI 修复响应内容`:`AI 未配置或未启用`,children:[V?(0,T.jsx)(g,{className:`mr-1 h-3 w-3 animate-spin`}):(0,T.jsx)(s,{className:`mr-1 h-3 w-3`}),V?`修复中...`:`AI修复`]}),(0,T.jsxs)(n,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 text-xs`,onClick:Z,disabled:U||!A.body.trim(),title:`格式化响应内容`,children:[U?(0,T.jsx)(g,{className:`mr-1 h-3 w-3 animate-spin`}):(0,T.jsx)(i,{className:`mr-1 h-3 w-3`}),U?`格式化中...`:`代码格式化`]})]})]}),(0,T.jsxs)(`div`,{className:`relative group`,style:{height:`${G}px`},children:[(0,T.jsx)(b,{value:A.body,onChange:e=>Y(`body`,e),placeholder:`支持 JSON、HTML、JS、CSS 等响应内容`,height:`flex`}),(0,T.jsx)(`div`,{className:`absolute bottom-0 left-0 right-0 h-4 cursor-ns-resize flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity bg-gradient-to-t from-border/50 to-transparent`,onMouseDown:X,children:(0,T.jsx)(a,{className:`h-4 w-4 text-muted-foreground`})})]}),z&&(0,T.jsxs)(`div`,{className:`flex items-start gap-2 p-2 rounded-md bg-red-50 dark:bg-red-950/20 border border-red-200 dark:border-red-900`,children:[(0,T.jsx)(`span`,{className:`text-xs text-red-600 dark:text-red-400 font-medium`,children:`语法错误:`}),(0,T.jsx)(`span`,{className:`text-xs text-red-600 dark:text-red-400 flex-1`,children:z})]})]}),(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsx)(o,{checked:A.enabled,onCheckedChange:e=>Y(`enabled`,!!e)}),(0,T.jsx)(f,{className:`text-sm`,children:`启用此规则`})]})]}),(0,T.jsx)(h,{}),(0,T.jsx)(`div`,{className:`flex justify-end gap-2 px-5 py-3`,children:(0,T.jsxs)(_,{onClick:$,disabled:N||!A.urlPattern.trim(),children:[N?(0,T.jsx)(g,{"data-icon":`inline-start`,className:`animate-spin`}):(0,T.jsx)(u,{"data-icon":`inline-start`}),N?`保存中...`:`保存`]})})]})}export{D as MockEditorPanel};
1
+ import{a as e,f as t,t as n,u as r}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as i}from"./code-5_eJ_XpJ.js";import{n as a,t as o}from"./checkbox-D0y07vOb.js";import{t as s}from"./wand-sparkles-wkul5vje.js";import{o as c,r as l}from"./ai-config-store-DQXVJVn_.js";import{$ as u,A as d,b as f,d as p,f as m,m as h,ot as g,p as _,u as v}from"./index-DTeCUv1G.js";import{r as y}from"./syntax-highlight-DVhPdkuV.js";import{n as b}from"./monaco-editor-DboIGERI.js";import{n as x,t as S}from"./code-fixer-DOrMk-4V.js";import{t as C}from"./textarea-C6NooVK1.js";var w=t(r(),1),T=e(),E={name:``,urlPattern:``,method:`*`,statusCode:200,delay:0,bodyType:`inline`,headers:{},body:``,enabled:!0};function D({rule:e,initialData:t,createMock:r,updateMock:D,onSaved:O}){let k=(0,w.useMemo)(()=>e?{name:e.name,urlPattern:e.urlPattern,method:e.method,statusCode:e.statusCode,delay:e.delay||0,bodyType:e.bodyType||`inline`,headers:e.headers||{},body:e.body,enabled:e.enabled}:{...E,...t},[t,e]),[A,j]=(0,w.useState)(k),[M,ee]=(0,w.useState)(()=>JSON.stringify(k.headers||{},null,2)),[N,P]=(0,w.useState)(!1),[F,I]=(0,w.useState)(null),[L,R]=(0,w.useState)(null),[z,B]=(0,w.useState)(null),[V,H]=(0,w.useState)(!1),[U,W]=(0,w.useState)(!1),[G,K]=(0,w.useState)(300),q=c(l()),J=(0,w.useCallback)(e=>{if(!e.trim()){B(null);return}let t=y(e);B(t.valid?null:t.error||`内容格式错误`)},[]),Y=(e,t)=>{j(n=>({...n,[e]:t})),e===`body`&&typeof t==`string`&&J(t)},X=(0,w.useCallback)(e=>{e.preventDefault();let t=e.clientY,n=G,r=e=>{let r=e.clientY-t;K(Math.max(150,n+r))},i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)},[G]),Z=async()=>{if(!(!A.body.trim()||U)){W(!0),R(null);try{let{formatted:e}=await x(A.body);Y(`body`,e)}catch(e){R(e instanceof Error?e.message:`格式化失败`),window.setTimeout(()=>R(null),3e3)}finally{W(!1)}}},Q=async()=>{if(!(!A.body.trim()||V||!q)){H(!0),R(null);try{let e=await S(A.body,!0);if(!e.success)throw Error(`自动修复失败,请手动修正语法错误`);Y(`body`,e.fixed),B(null)}catch(e){R(e instanceof Error?e.message:`修复失败`),window.setTimeout(()=>R(null),3e3)}finally{H(!1)}}},$=async()=>{if(!A.urlPattern.trim()){I(`请填写 URL 匹配`);return}if(A.bodyType===`inline`&&A.body.trim()){let e=y(A.body);if(!e.valid){B(e.error||`内容格式错误`);return}}P(!0),I(null);try{let t={};if(M.trim()){let e=JSON.parse(M);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`响应头必须是 JSON 对象`);t=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]))}let n={...A,headers:t},i=!1;if(i=e?await D(e.id,n):!!await r(n),!i)throw Error(`保存 Mock 规则失败`);v.success(e?`Mock 规则已更新`:`Mock 规则已创建`),O?.()}catch(e){let t=e instanceof Error?e.message:`保存失败`;I(t),v.error(t)}finally{P(!1)}};return p({active:!0,enabled:!N&&!!A.urlPattern.trim(),priority:m.panel,onSave:$}),(0,T.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,T.jsxs)(`div`,{className:`app-panel-content`,children:[F&&(0,T.jsx)(`div`,{className:`rounded-md border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-900 dark:bg-red-950/20 dark:text-red-300`,children:F}),(0,T.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`规则名称`}),(0,T.jsx)(d,{value:A.name,onChange:e=>Y(`name`,e.target.value),placeholder:`如:模拟欠费状态`})]}),(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`HTTP 方法`}),(0,T.jsxs)(`select`,{value:A.method,onChange:e=>Y(`method`,e.target.value),className:`flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm`,children:[(0,T.jsx)(`option`,{value:`*`,children:`全部`}),(0,T.jsx)(`option`,{value:`GET`,children:`GET`}),(0,T.jsx)(`option`,{value:`POST`,children:`POST`}),(0,T.jsx)(`option`,{value:`PUT`,children:`PUT`}),(0,T.jsx)(`option`,{value:`DELETE`,children:`DELETE`}),(0,T.jsx)(`option`,{value:`PATCH`,children:`PATCH`})]})]})]}),(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`URL 匹配(支持正则)`}),(0,T.jsx)(d,{value:A.urlPattern,onChange:e=>Y(`urlPattern`,e.target.value),placeholder:`如:/api/console/user/corp/.*`,className:`font-mono`})]}),(0,T.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`响应状态码`}),(0,T.jsx)(d,{type:`number`,value:A.statusCode,onChange:e=>Y(`statusCode`,parseInt(e.target.value)||200)})]}),(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`响应延迟 (ms)`}),(0,T.jsx)(d,{type:`number`,value:A.delay,onChange:e=>Y(`delay`,parseInt(e.target.value)||0)})]})]}),(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsx)(f,{children:`响应头 JSON`}),(0,T.jsx)(C,{value:M,onChange:e=>ee(e.target.value),className:`min-h-[96px] font-mono text-xs`,placeholder:`{"Content-Type":"application/json"}`})]}),(0,T.jsxs)(`div`,{className:`app-field-group`,children:[(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,T.jsx)(f,{children:`响应内容`}),(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center justify-end gap-2`,children:[L&&(0,T.jsx)(`span`,{className:`max-w-[280px] truncate text-xs text-red-500`,title:L,children:L}),A.body.trim()&&(0,T.jsxs)(n,{type:`button`,variant:`outline`,size:`sm`,className:`h-7 text-xs`,onClick:Q,disabled:V||!q,title:q?`使用 AI 修复响应内容`:`AI 未配置或未启用`,children:[V?(0,T.jsx)(g,{className:`mr-1 h-3 w-3 animate-spin`}):(0,T.jsx)(s,{className:`mr-1 h-3 w-3`}),V?`修复中...`:`AI修复`]}),(0,T.jsxs)(n,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 text-xs`,onClick:Z,disabled:U||!A.body.trim(),title:`格式化响应内容`,children:[U?(0,T.jsx)(g,{className:`mr-1 h-3 w-3 animate-spin`}):(0,T.jsx)(i,{className:`mr-1 h-3 w-3`}),U?`格式化中...`:`代码格式化`]})]})]}),(0,T.jsxs)(`div`,{className:`relative group`,style:{height:`${G}px`},children:[(0,T.jsx)(b,{value:A.body,onChange:e=>Y(`body`,e),placeholder:`支持 JSON、HTML、JS、CSS 等响应内容`,height:`flex`}),(0,T.jsx)(`div`,{className:`absolute bottom-0 left-0 right-0 h-4 cursor-ns-resize flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity bg-gradient-to-t from-border/50 to-transparent`,onMouseDown:X,children:(0,T.jsx)(a,{className:`h-4 w-4 text-muted-foreground`})})]}),z&&(0,T.jsxs)(`div`,{className:`flex items-start gap-2 p-2 rounded-md bg-red-50 dark:bg-red-950/20 border border-red-200 dark:border-red-900`,children:[(0,T.jsx)(`span`,{className:`text-xs text-red-600 dark:text-red-400 font-medium`,children:`语法错误:`}),(0,T.jsx)(`span`,{className:`text-xs text-red-600 dark:text-red-400 flex-1`,children:z})]})]}),(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsx)(o,{checked:A.enabled,onCheckedChange:e=>Y(`enabled`,!!e)}),(0,T.jsx)(f,{className:`text-sm`,children:`启用此规则`})]})]}),(0,T.jsx)(h,{}),(0,T.jsx)(`div`,{className:`flex justify-end gap-2 px-5 py-3`,children:(0,T.jsxs)(_,{onClick:$,disabled:N||!A.urlPattern.trim(),children:[N?(0,T.jsx)(g,{"data-icon":`inline-start`,className:`animate-spin`}):(0,T.jsx)(u,{"data-icon":`inline-start`}),N?`保存中...`:`保存`]})})]})}export{D as MockEditorPanel};
@@ -1,4 +1,4 @@
1
- import{a as e,f as t,u as n}from"./button-BTToMaBW.js";import{o as r}from"./index-L7uWxTnp.js";function i(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function a(e){if(Array.isArray(e))return e}function o(e,t,n){return(t=h(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=e==null?null:typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(n!=null){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,t!==0)for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&n.return!=null&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}function c(){throw TypeError(`Invalid attempt to destructure non-iterable instance.
1
+ import{a as e,f as t,u as n}from"./button-BTToMaBW.js";import{o as r}from"./index-DTeCUv1G.js";function i(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function a(e){if(Array.isArray(e))return e}function o(e,t,n){return(t=h(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=e==null?null:typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(n!=null){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,t!==0)for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&n.return!=null&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}function c(){throw TypeError(`Invalid attempt to destructure non-iterable instance.
2
2
  In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function u(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?l(Object(n),!0).forEach(function(t){o(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function d(e,t){if(e==null)return{};var n,r,i=f(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function f(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function p(e,t){return a(e)||s(e,t)||g(e,t)||c()}function m(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function h(e){var t=m(e,`string`);return typeof t==`symbol`?t:t+``}function g(e,t){if(e){if(typeof e==`string`)return i(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?i(e,t):void 0}}function _(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function v(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function y(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?v(Object(n),!0).forEach(function(t){_(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):v(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function b(){var e=[...arguments];return function(t){return e.reduceRight(function(e,t){return t(e)},t)}}function x(e){return function t(){var n=this,r=[...arguments];return r.length>=e.length?e.apply(this,r):function(){var e=[...arguments];return t.apply(n,[].concat(r,e))}}}function S(e){return{}.toString.call(e).includes(`Object`)}function C(e){return!Object.keys(e).length}function w(e){return typeof e==`function`}function T(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function E(e,t){return S(t)||j(`changeType`),Object.keys(t).some(function(t){return!T(e,t)})&&j(`changeField`),t}function D(e){w(e)||j(`selectorType`)}function O(e){w(e)||S(e)||j(`handlerType`),S(e)&&Object.values(e).some(function(e){return!w(e)})&&j(`handlersType`)}function k(e){e||j(`initialIsRequired`),S(e)||j(`initialType`),C(e)&&j(`initialContent`)}function A(e,t){throw Error(e[t]||e.default)}var j=x(A)({initialIsRequired:`initial state is required`,initialType:`initial state should be an object`,initialContent:`initial state shouldn't be an empty object`,handlerType:`handler should be an object or a function`,handlersType:`all handlers should be a functions`,selectorType:`selector should be a function`,changeType:`provided value of changes should be an object`,changeField:`it seams you want to change a field in the state which is not specified in the "initial" state`,default:"an unknown error accured in `state-local` package"}),M={changes:E,selector:D,handler:O,initial:k};function N(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};M.initial(e),M.handler(t);var n={current:e},r=x(ee)(n,t),i=x(F)(n),a=x(M.changes)(e),o=x(P)(n);function s(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:function(e){return e};return M.selector(e),e(n.current)}function c(e){b(r,i,a,o)(e)}return[s,c]}function P(e,t){return w(t)?t(e.current):t}function F(e,t){return e.current=y(y({},e.current),t),t}function ee(e,t,n){return w(t)?t(e.current):Object.keys(n).forEach(function(n){return t[n]?.call(t,e.current[n])}),n}var te={create:N},ne={paths:{vs:`https://cdn.jsdelivr.net/npm/monaco-editor@0.55.1/min/vs`}};function re(e){return function t(){var n=this,r=[...arguments];return r.length>=e.length?e.apply(this,r):function(){var e=[...arguments];return t.apply(n,[].concat(r,e))}}}function ie(e){return{}.toString.call(e).includes(`Object`)}function ae(e){return e||ce(`configIsRequired`),ie(e)||ce(`configType`),e.urls?(oe(),{paths:{vs:e.urls.monacoBase}}):e}function oe(){console.warn(I.deprecation)}function se(e,t){throw Error(e[t]||e.default)}var I={configIsRequired:`the configuration object is required`,configType:`the configuration object should be an object`,default:"an unknown error accured in `@monaco-editor/loader` package",deprecation:`Deprecation warning!
3
3
  You are using deprecated way of configuration.
4
4
 
@@ -1,2 +1,2 @@
1
- import{a as e,f as t,t as n,u as r}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as i}from"./pencil-line-Cqe41E4h.js";import{t as a}from"./rotate-ccw-CAYM6Vv0.js";import{t as o}from"./zap-Djo4cgux.js";import"./es2015-CfXu88Y7.js";import{i as s,o as ee,r as c}from"./ai-config-store-DQXVJVn_.js";import{$ as l,_ as u,b as te,d,f,ft as p,g as m,h,m as g,ot as _,p as v,u as y,v as b,y as x,z as ne}from"./index-L7uWxTnp.js";import{n as re}from"./monaco-editor-B3brLg8j.js";import{t as ie}from"./textarea-C6NooVK1.js";var S=t(r(),1),C=e();function w({open:e=!1,onOpenChange:t,embedded:r=!1,filename:w,onSaved:T}){let[E,D]=(0,S.useState)(``),[O,k]=(0,S.useState)(``),[A,j]=(0,S.useState)(!1),[M,N]=(0,S.useState)(!1),[P,F]=(0,S.useState)(!1),[I,L]=(0,S.useState)(!1),[R,z]=(0,S.useState)(null),[B,V]=(0,S.useState)(``),[H,U]=(0,S.useState)(null),[W,G]=(0,S.useState)(!1),K=E!==O,q=c(),J=s(q),Y=J?{provider:J.provider,apiKey:J.apiKey,baseUrl:J.baseUrl,model:J.model}:{provider:q.provider,apiKey:q.apiKey,baseUrl:q.baseUrl,model:q.model},X=ee(q),Z=(0,S.useCallback)(async()=>{if(w){j(!0),z(null);try{let e=await fetch(`/api/plugins/custom/${encodeURIComponent(w)}/code`);if(!e.ok){let t=await e.json();throw Error(t.error||`读取插件代码失败`)}let t=await e.json();D(t.code),k(t.code)}catch(e){z(e instanceof Error?e.message:`读取失败`)}finally{j(!1)}}},[w]);(0,S.useEffect)(()=>{(e||r)&&w&&Z()},[e,r,w,Z]);let Q=async()=>{N(!0),z(null);try{let e=await fetch(`/api/plugins/custom/${encodeURIComponent(w)}/code`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:E})});if(!e.ok){let t=await e.json();throw Error(t.error||`保存失败`)}k(E),window.dispatchEvent(new CustomEvent(`plugins-custom-updated`)),T?.(),y.success(`插件代码保存成功`)}catch(e){let t=e instanceof Error?e.message:`保存失败`;z(t),y.error(t)}finally{N(!1)}},ae=async()=>{N(!0),F(!0),z(null);try{let e=await fetch(`/api/plugins/custom/${encodeURIComponent(w)}/code`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:E})});if(!e.ok){let t=await e.json();throw Error(t.error||`保存失败`)}if(k(E),!(await fetch(`/api/plugins/reload`,{method:`POST`})).ok)throw Error(`热加载失败`);T?.(),window.dispatchEvent(new CustomEvent(`plugins-custom-updated`)),y.success(`插件代码已保存并完成热加载`)}catch(e){let t=e instanceof Error?e.message:`操作失败`;z(t),y.error(t)}finally{N(!1),F(!1)}};d({active:e||r,enabled:K&&!M&&!I,priority:f.panel,onSave:Q});let oe=()=>{D(O)},se=()=>{K&&!confirm(`有未保存的修改,确定要关闭吗?`)||(G(!1),t?.(!1))},ce=async()=>{if(!B.trim()||!X)return;let e=E;G(!0),L(!0),z(null),U(`AI 正在根据补充需求更新代码...`);try{let e=await fetch(`/api/plugins/revise-stream`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({originalCode:E,instruction:B.trim(),requirement:{name:w.replace(/\.js$/i,``),description:`根据补充要求更新插件 ${w},保持 Meddle 插件结构和现有核心能力正确。`},aiConfig:Y})});if(!e.ok){let t=await e.json();throw Error(t.error||`AI 更新代码失败`)}let t=e.body?.getReader(),n=new TextDecoder;if(!t)throw Error(`无法读取 AI 更新流`);let r=``,i=``;for(;;){let{done:e,value:a}=await t.read();if(e)break;i+=n.decode(a,{stream:!0});let o=i.split(`
1
+ import{a as e,f as t,t as n,u as r}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as i}from"./pencil-line-Cqe41E4h.js";import{t as a}from"./rotate-ccw-CAYM6Vv0.js";import{t as o}from"./zap-Djo4cgux.js";import"./es2015-CfXu88Y7.js";import{i as s,o as ee,r as c}from"./ai-config-store-DQXVJVn_.js";import{$ as l,_ as u,b as te,d,f,ft as p,g as m,h,m as g,ot as _,p as v,u as y,v as b,y as x,z as ne}from"./index-DTeCUv1G.js";import{n as re}from"./monaco-editor-DboIGERI.js";import{t as ie}from"./textarea-C6NooVK1.js";var S=t(r(),1),C=e();function w({open:e=!1,onOpenChange:t,embedded:r=!1,filename:w,onSaved:T}){let[E,D]=(0,S.useState)(``),[O,k]=(0,S.useState)(``),[A,j]=(0,S.useState)(!1),[M,N]=(0,S.useState)(!1),[P,F]=(0,S.useState)(!1),[I,L]=(0,S.useState)(!1),[R,z]=(0,S.useState)(null),[B,V]=(0,S.useState)(``),[H,U]=(0,S.useState)(null),[W,G]=(0,S.useState)(!1),K=E!==O,q=c(),J=s(q),Y=J?{provider:J.provider,apiKey:J.apiKey,baseUrl:J.baseUrl,model:J.model}:{provider:q.provider,apiKey:q.apiKey,baseUrl:q.baseUrl,model:q.model},X=ee(q),Z=(0,S.useCallback)(async()=>{if(w){j(!0),z(null);try{let e=await fetch(`/api/plugins/custom/${encodeURIComponent(w)}/code`);if(!e.ok){let t=await e.json();throw Error(t.error||`读取插件代码失败`)}let t=await e.json();D(t.code),k(t.code)}catch(e){z(e instanceof Error?e.message:`读取失败`)}finally{j(!1)}}},[w]);(0,S.useEffect)(()=>{(e||r)&&w&&Z()},[e,r,w,Z]);let Q=async()=>{N(!0),z(null);try{let e=await fetch(`/api/plugins/custom/${encodeURIComponent(w)}/code`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:E})});if(!e.ok){let t=await e.json();throw Error(t.error||`保存失败`)}k(E),window.dispatchEvent(new CustomEvent(`plugins-custom-updated`)),T?.(),y.success(`插件代码保存成功`)}catch(e){let t=e instanceof Error?e.message:`保存失败`;z(t),y.error(t)}finally{N(!1)}},ae=async()=>{N(!0),F(!0),z(null);try{let e=await fetch(`/api/plugins/custom/${encodeURIComponent(w)}/code`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:E})});if(!e.ok){let t=await e.json();throw Error(t.error||`保存失败`)}if(k(E),!(await fetch(`/api/plugins/reload`,{method:`POST`})).ok)throw Error(`热加载失败`);T?.(),window.dispatchEvent(new CustomEvent(`plugins-custom-updated`)),y.success(`插件代码已保存并完成热加载`)}catch(e){let t=e instanceof Error?e.message:`操作失败`;z(t),y.error(t)}finally{N(!1),F(!1)}};d({active:e||r,enabled:K&&!M&&!I,priority:f.panel,onSave:Q});let oe=()=>{D(O)},se=()=>{K&&!confirm(`有未保存的修改,确定要关闭吗?`)||(G(!1),t?.(!1))},ce=async()=>{if(!B.trim()||!X)return;let e=E;G(!0),L(!0),z(null),U(`AI 正在根据补充需求更新代码...`);try{let e=await fetch(`/api/plugins/revise-stream`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({originalCode:E,instruction:B.trim(),requirement:{name:w.replace(/\.js$/i,``),description:`根据补充要求更新插件 ${w},保持 Meddle 插件结构和现有核心能力正确。`},aiConfig:Y})});if(!e.ok){let t=await e.json();throw Error(t.error||`AI 更新代码失败`)}let t=e.body?.getReader(),n=new TextDecoder;if(!t)throw Error(`无法读取 AI 更新流`);let r=``,i=``;for(;;){let{done:e,value:a}=await t.read();if(e)break;i+=n.decode(a,{stream:!0});let o=i.split(`
2
2
  `);i=o.pop()||``;for(let e of o){if(!e.startsWith(`data:`))continue;let t=e.slice(5).trim();if(t)try{let e=JSON.parse(t);if(e.status===`generating`)U(`AI 正在根据补充需求更新代码...`);else if(e.chunk)r=e.accumulated||`${r}${e.chunk}`,D(r),U(`生成中... ${r.length} 字符`);else if(e.status===`success`)r=e.revisedCode||r,D(r),U(`AI 已完成代码更新,请检查后保存。`);else if(e.error)throw Error(e.error)}catch(e){if(e instanceof Error&&e.message!==`Unexpected end of JSON input`)throw e}}}if(!r.trim())throw Error(`AI 未返回有效代码`)}catch(t){let n=t instanceof Error?t.message:`AI 更新代码失败`;D(e),z(n),U(`更新失败,已恢复原代码:${n}`)}finally{L(!1)}},$=(0,C.jsxs)(C.Fragment,{children:[(0,C.jsxs)(b,{className:`px-6 pt-6 pb-3`,children:[(0,C.jsxs)(x,{className:`flex items-center gap-2`,children:[(0,C.jsx)(p,{className:`h-5 w-5`}),w,K&&(0,C.jsx)(ne,{variant:`outline`,className:`text-orange-600 border-orange-300`,children:`未保存`})]}),(0,C.jsx)(u,{children:`查看和编辑插件源码,保存后需热加载才能生效`})]}),(0,C.jsx)(g,{}),(0,C.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden px-4 py-3`,children:A?(0,C.jsxs)(`div`,{className:`flex flex-1 items-center justify-center gap-2 text-muted-foreground`,children:[(0,C.jsx)(_,{className:`h-5 w-5 animate-spin`}),(0,C.jsx)(`span`,{children:`加载中...`})]}):R&&!E?(0,C.jsx)(`div`,{className:`flex flex-1 items-center justify-center text-destructive`,children:R}):(0,C.jsx)(`div`,{className:`min-h-0 flex-1`,children:(0,C.jsx)(`div`,{className:`relative h-full min-h-[320px]`,children:(0,C.jsx)(re,{value:E,onChange:D,language:`javascript`,height:`flex`})})})}),(0,C.jsx)(`div`,{"aria-hidden":!W,className:[`overflow-hidden transition-[max-height,opacity] duration-200 ease-out`,W?`max-h-[260px] border-t opacity-100`:`max-h-0 border-t-0 opacity-0 pointer-events-none`].join(` `),children:(0,C.jsxs)(`div`,{className:`space-y-3 px-6 py-4`,children:[(0,C.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,C.jsxs)(`div`,{className:`min-w-0`,children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-2 text-sm font-medium`,children:[(0,C.jsx)(i,{className:`h-4 w-4`}),`AI 更新代码`]}),(0,C.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`输入补充需求后,AI 会直接把结果写回当前编辑器。`})]}),(0,C.jsx)(n,{variant:`ghost`,size:`sm`,className:`h-7 px-2 text-xs`,onClick:()=>G(!1),disabled:!W||I,children:`收起`})]}),(0,C.jsxs)(`div`,{className:`grid gap-3 md:grid-cols-[minmax(0,1fr)_auto] md:items-end`,children:[(0,C.jsxs)(`div`,{className:`app-field-group`,children:[(0,C.jsx)(te,{htmlFor:`plugin-editor-extra-instruction`,children:`补充需求信息`}),(0,C.jsx)(ie,{id:`plugin-editor-extra-instruction`,value:B,onChange:e=>V(e.target.value),placeholder:`例如:补充 onBeforeResponse 对空 referer 的处理;保留现有 manifest 和 hook,不要改插件 id。`,className:`min-h-[88px] resize-none`,disabled:!W||I||M})]}),(0,C.jsx)(n,{size:`sm`,onClick:ce,disabled:!W||!B.trim()||!X||I||M,title:X?`根据补充需求更新当前代码`:`AI 未配置或未启用`,children:I?(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(_,{className:`h-4 w-4 mr-1 animate-spin`}),`更新中...`]}):(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(i,{className:`h-4 w-4 mr-1`}),`更新代码`]})})]}),(0,C.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:H||(X?`生成结果会写回上方编辑器,请检查后再保存或热加载。`:`AI 未配置或未启用,请先在设置中配置 AI 服务。`)})]})}),R&&E&&(0,C.jsx)(`div`,{className:`px-6 py-2 text-sm text-destructive bg-destructive/10`,children:R}),(0,C.jsx)(g,{}),(0,C.jsxs)(`div`,{className:`px-6 py-3 flex justify-between items-center gap-2`,children:[(0,C.jsxs)(`div`,{className:`flex gap-2`,children:[(0,C.jsxs)(n,{variant:`ghost`,size:`sm`,onClick:oe,disabled:!K||M||I,title:`撤销修改`,children:[(0,C.jsx)(a,{className:`h-4 w-4 mr-1`}),`还原`]}),(0,C.jsxs)(n,{variant:`outline`,size:`sm`,onClick:()=>G(e=>!e),disabled:!E||M||I,title:X?`使用 AI 根据补充需求更新代码`:`AI 未配置或未启用`,children:[(0,C.jsx)(i,{className:`h-4 w-4 mr-1`}),`AI 更新代码`]})]}),(0,C.jsxs)(`div`,{className:`flex gap-2`,children:[(0,C.jsx)(n,{variant:`outline`,size:`sm`,onClick:se,disabled:M||I,children:`关闭`}),(0,C.jsxs)(v,{variant:`outline`,size:`sm`,onClick:Q,disabled:!K||M||I,children:[M&&!P?(0,C.jsx)(_,{"data-icon":`inline-start`,className:`animate-spin`}):(0,C.jsx)(l,{"data-icon":`inline-start`}),`保存`]}),(0,C.jsxs)(n,{size:`sm`,onClick:ae,disabled:!K||M||I,children:[P?(0,C.jsx)(_,{className:`h-4 w-4 mr-1 animate-spin`}):(0,C.jsx)(o,{className:`h-4 w-4 mr-1`}),`保存并热加载`]})]})]})]});return r?(0,C.jsx)(`div`,{className:`flex h-full min-h-0 flex-col`,children:$}):(0,C.jsx)(h,{open:e,onOpenChange:e=>{!e&&K&&!confirm(`有未保存的修改,确定要关闭吗?`)||(e||G(!1),t?.(e))},children:(0,C.jsx)(m,{className:`p-0 flex flex-col`,resizable:!0,defaultWidth:900,storageKey:`plugin-code-editor`,children:$})})}export{w as PluginCodeEditor};
@@ -1 +1 @@
1
- import{a as e,f as t,l as n,t as r,u as i}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as a}from"./refresh-cw-CG3HaiQT.js";import{t as o}from"./zap-Djo4cgux.js";import{a as s,i as c,n as l,o as u,r as d,t as ee}from"./select-CkFOB61l.js";import"./es2015-CfXu88Y7.js";import{t as f}from"./switch-C-Xk56TK.js";import{A as p,K as m,X as h,Y as g,ft as _,nt as v,ot as y,z as b}from"./index-L7uWxTnp.js";import{a as x,i as S,n as C,o as w,r as T,t as E}from"./table-CT97lAYq.js";var D=n(`shield-alert`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`M12 8v4`,key:`1got3b`}],[`path`,{d:`M12 16h.01`,key:`1drbdi`}]]),O=n(`shield`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}]]),k=t(i(),1),A=e();function j({plugins:e,pluginMode:t,switchPluginMode:n,fetchPlugins:i,startPlugin:j,stopPlugin:M,togglePlugin:N,thirdPartyPlugins:P,thirdPartySecurity:F,fetchThirdPartyPlugins:I,loadThirdPartyPlugin:L,unloadThirdPartyPlugin:R}){let[z,B]=(0,k.useState)(!1),[V,H]=(0,k.useState)(``),[U,W]=(0,k.useState)(!1),[G,K]=(0,k.useState)([]),[q,J]=(0,k.useState)(!1);(0,k.useEffect)(()=>{i(),I(),Y()},[i,I]),(0,k.useEffect)(()=>{let e=()=>{Y()};return window.addEventListener(`plugins-custom-updated`,e),()=>window.removeEventListener(`plugins-custom-updated`,e)},[]);let Y=async()=>{try{K((await(await fetch(`/api/plugins/custom`)).json()).plugins||[])}catch(e){console.error(`加载自定义插件失败:`,e)}},X=async e=>{if(confirm(`确定要删除插件 ${e} 吗?`))try{let t=await fetch(`/api/plugins/custom/${encodeURIComponent(e)}`,{method:`DELETE`});if(t.ok)await Y();else{let e=await t.json();alert(e.error||`删除失败`)}}catch(e){console.error(`删除插件失败:`,e),alert(`删除失败`)}},Z=async()=>{J(!0);try{let e=await fetch(`/api/plugins/reload`,{method:`POST`});if(e.ok){let t=await e.json();alert(`成功热加载 ${t.count} 个插件!`),await i(),await Y()}else{let t=await e.json();alert(t.error||`热加载失败`)}}catch(e){console.error(`热加载失败:`,e),alert(`热加载失败`)}finally{J(!1)}},Q=(e,t,n)=>{window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`plugin.test`,title:`测试插件:${t}`,size:`xl`,params:{pluginId:e,pluginName:t,hooks:n}}}))},$=e=>{window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`plugin.code`,title:`编辑插件代码:${e}`,size:`xl`,params:{filename:e}}}))},te=async e=>{B(!0);try{await j(e),await i()}finally{B(!1)}},ne=async e=>{B(!0);try{await M(e),await i()}finally{B(!1)}},re=async()=>{if(V.trim()){W(!0);try{await L(V),H(``),await I()}finally{W(!1)}}},ie=async e=>{W(!0);try{await R(e),await I()}finally{W(!1)}};return(0,A.jsxs)(`div`,{className:`app-page-stack`,children:[(0,A.jsxs)(`section`,{className:`app-section`,children:[(0,A.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,A.jsx)(`h3`,{className:`text-sm font-medium`,children:`内置插件`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,A.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`插件模式:`}),(0,A.jsxs)(ee,{value:t,onValueChange:e=>n(e),children:[(0,A.jsx)(s,{className:`w-28 h-7 text-xs`,children:(0,A.jsx)(u,{})}),(0,A.jsx)(l,{children:(0,A.jsxs)(d,{children:[(0,A.jsx)(c,{value:`off`,children:`关闭`}),(0,A.jsx)(c,{value:`on`,children:`开启`}),(0,A.jsx)(c,{value:`shadow`,children:`影子模式`})]})})]}),t===`off`&&(0,A.jsx)(b,{variant:`destructive`,className:`text-xs`,children:`插件未生效`})]})]}),(0,A.jsx)(`div`,{className:`rounded-md border`,children:(0,A.jsxs)(E,{children:[(0,A.jsx)(x,{children:(0,A.jsxs)(w,{children:[(0,A.jsx)(S,{children:`名称`}),(0,A.jsx)(S,{children:`版本`}),(0,A.jsx)(S,{children:`Hooks`}),(0,A.jsx)(S,{children:`状态`}),(0,A.jsx)(S,{className:`w-24`,children:`操作`})]})}),(0,A.jsx)(C,{children:e.length===0?(0,A.jsx)(w,{children:(0,A.jsx)(T,{colSpan:5,className:`text-center text-muted-foreground py-8`,children:`暂无内置插件`})}):e.map(e=>(0,A.jsxs)(w,{children:[(0,A.jsx)(T,{className:`font-medium`,children:e.name}),(0,A.jsx)(T,{children:e.version}),(0,A.jsx)(T,{children:(0,A.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:e.hooks.map(e=>(0,A.jsx)(b,{variant:`secondary`,className:`text-xs`,children:e},e))})}),(0,A.jsx)(T,{children:(0,A.jsx)(b,{variant:e.state===`running`?`default`:`secondary`,children:e.state})}),(0,A.jsx)(T,{children:e.state===`running`?(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>ne(e.id),disabled:z,"aria-label":`停止插件 ${e.name}`,children:(0,A.jsx)(g,{})}):(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>te(e.id),disabled:z,"aria-label":`启动插件 ${e.name}`,children:(0,A.jsx)(v,{})})})]},e.id))})]})})]}),(0,A.jsxs)(`section`,{className:`app-section`,children:[(0,A.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,A.jsx)(`h3`,{className:`text-sm font-medium`,children:`自定义插件`}),(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,A.jsxs)(r,{variant:`outline`,size:`sm`,onClick:Y,disabled:z||q,children:[(0,A.jsx)(a,{"data-icon":`inline-start`}),`刷新列表`]}),(0,A.jsx)(r,{variant:`outline`,size:`sm`,onClick:Z,disabled:z||q,children:q?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(y,{"data-icon":`inline-start`,className:`animate-spin`}),`加载中...`]}):(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(o,{"data-icon":`inline-start`}),`热加载插件`]})}),(0,A.jsxs)(r,{size:`sm`,onClick:()=>window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`plugin.generate`,title:`AI 插件生成器`,size:`xl`}})),children:[(0,A.jsx)(h,{"data-icon":`inline-start`}),`AI 生成插件`]})]})]}),(0,A.jsx)(`div`,{className:`rounded-md border`,children:(0,A.jsxs)(E,{children:[(0,A.jsx)(x,{children:(0,A.jsxs)(w,{children:[(0,A.jsx)(S,{children:`插件名称`}),(0,A.jsx)(S,{className:`w-16 text-center`,children:`启用`}),(0,A.jsx)(S,{children:`状态`}),(0,A.jsx)(S,{children:`修改时间`}),(0,A.jsx)(S,{className:`w-32`,children:`操作`})]})}),(0,A.jsx)(C,{children:G.length===0?(0,A.jsx)(w,{children:(0,A.jsx)(T,{colSpan:5,className:`text-center text-muted-foreground py-8`,children:`暂无自定义插件,点击上方按钮使用 AI 生成插件`})}):G.map(t=>{let n=t.filename.replace(/\.js$/,``).replace(/^/,`local.`),i=e.find(e=>e.id===n),a=i?i.state!==`disabled`:!1;return(0,A.jsxs)(w,{className:!a&&i?`opacity-60`:``,children:[(0,A.jsx)(T,{className:`font-medium font-mono text-sm`,children:t.filename}),(0,A.jsx)(T,{className:`text-center`,children:i&&(0,A.jsx)(f,{checked:a,onCheckedChange:e=>N(i.id,e)})}),(0,A.jsx)(T,{children:i?a?(0,A.jsx)(b,{children:`已启用`}):(0,A.jsx)(b,{variant:`secondary`,children:`已禁用`}):(0,A.jsx)(b,{variant:`outline`,children:`未加载`})}),(0,A.jsx)(T,{className:`text-xs text-muted-foreground`,children:new Date(t.modified).toLocaleString()}),(0,A.jsx)(T,{children:(0,A.jsxs)(`div`,{className:`flex gap-1`,children:[(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>$(t.filename),title:`查看/编辑代码`,"aria-label":`编辑插件 ${t.filename}`,children:(0,A.jsx)(_,{})}),i&&a&&(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>Q(i.id,i.name,i.hooks),title:`测试插件`,"aria-label":`测试插件 ${i.name}`,children:(0,A.jsx)(m,{})}),(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>X(t.filename),className:`text-destructive`,title:`删除插件`,children:`删除`})]})})]},t.filename)})})]})})]}),(0,A.jsxs)(`section`,{className:`app-section`,children:[(0,A.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,A.jsx)(`h3`,{className:`text-sm font-medium`,children:`第三方插件`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-2`,children:[F.allowAll?(0,A.jsx)(O,{className:`size-4 text-primary`}):(0,A.jsx)(D,{className:`size-4 text-muted-foreground`}),(0,A.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:F.allowAll?`已信任所有插件`:`已信任: ${F.trusted.length} 个`})]})]}),(0,A.jsxs)(`div`,{className:`flex gap-2`,children:[(0,A.jsx)(p,{value:V,onChange:e=>H(e.target.value),placeholder:`输入插件路径...`,className:`flex-1`}),(0,A.jsx)(r,{onClick:re,disabled:U||!V.trim(),children:U?(0,A.jsx)(y,{className:`animate-spin`}):`加载`})]}),(0,A.jsx)(`div`,{className:`rounded-md border`,children:(0,A.jsxs)(E,{children:[(0,A.jsx)(x,{children:(0,A.jsxs)(w,{children:[(0,A.jsx)(S,{children:`名称`}),(0,A.jsx)(S,{children:`版本`}),(0,A.jsx)(S,{children:`状态`}),(0,A.jsx)(S,{className:`w-24`,children:`操作`})]})}),(0,A.jsx)(C,{children:P.length===0?(0,A.jsx)(w,{children:(0,A.jsx)(T,{colSpan:4,className:`text-center text-muted-foreground py-8`,children:`暂无第三方插件`})}):P.map(e=>(0,A.jsxs)(w,{children:[(0,A.jsx)(T,{className:`font-medium`,children:e.name}),(0,A.jsx)(T,{children:e.version}),(0,A.jsx)(T,{children:(0,A.jsx)(b,{variant:e.state===`running`?`default`:`secondary`,children:e.state})}),(0,A.jsx)(T,{children:(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>ie(e.id),disabled:U,className:`text-destructive`,children:`卸载`})})]},e.id))})]})})]})]})}export{j as PluginConfig};
1
+ import{a as e,f as t,l as n,t as r,u as i}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as a}from"./refresh-cw-CG3HaiQT.js";import{t as o}from"./zap-Djo4cgux.js";import{a as s,i as c,n as l,o as u,r as d,t as ee}from"./select-CH0aJ3Dd.js";import"./es2015-CfXu88Y7.js";import{t as f}from"./switch-C-Xk56TK.js";import{A as p,K as m,X as h,Y as g,ft as _,nt as v,ot as y,z as b}from"./index-DTeCUv1G.js";import{a as x,i as S,n as C,o as w,r as T,t as E}from"./table-CT97lAYq.js";var D=n(`shield-alert`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`M12 8v4`,key:`1got3b`}],[`path`,{d:`M12 16h.01`,key:`1drbdi`}]]),O=n(`shield`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}]]),k=t(i(),1),A=e();function j({plugins:e,pluginMode:t,switchPluginMode:n,fetchPlugins:i,startPlugin:j,stopPlugin:M,togglePlugin:N,thirdPartyPlugins:P,thirdPartySecurity:F,fetchThirdPartyPlugins:I,loadThirdPartyPlugin:L,unloadThirdPartyPlugin:R}){let[z,B]=(0,k.useState)(!1),[V,H]=(0,k.useState)(``),[U,W]=(0,k.useState)(!1),[G,K]=(0,k.useState)([]),[q,J]=(0,k.useState)(!1);(0,k.useEffect)(()=>{i(),I(),Y()},[i,I]),(0,k.useEffect)(()=>{let e=()=>{Y()};return window.addEventListener(`plugins-custom-updated`,e),()=>window.removeEventListener(`plugins-custom-updated`,e)},[]);let Y=async()=>{try{K((await(await fetch(`/api/plugins/custom`)).json()).plugins||[])}catch(e){console.error(`加载自定义插件失败:`,e)}},X=async e=>{if(confirm(`确定要删除插件 ${e} 吗?`))try{let t=await fetch(`/api/plugins/custom/${encodeURIComponent(e)}`,{method:`DELETE`});if(t.ok)await Y();else{let e=await t.json();alert(e.error||`删除失败`)}}catch(e){console.error(`删除插件失败:`,e),alert(`删除失败`)}},Z=async()=>{J(!0);try{let e=await fetch(`/api/plugins/reload`,{method:`POST`});if(e.ok){let t=await e.json();alert(`成功热加载 ${t.count} 个插件!`),await i(),await Y()}else{let t=await e.json();alert(t.error||`热加载失败`)}}catch(e){console.error(`热加载失败:`,e),alert(`热加载失败`)}finally{J(!1)}},Q=(e,t,n)=>{window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`plugin.test`,title:`测试插件:${t}`,size:`xl`,params:{pluginId:e,pluginName:t,hooks:n}}}))},$=e=>{window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`plugin.code`,title:`编辑插件代码:${e}`,size:`xl`,params:{filename:e}}}))},te=async e=>{B(!0);try{await j(e),await i()}finally{B(!1)}},ne=async e=>{B(!0);try{await M(e),await i()}finally{B(!1)}},re=async()=>{if(V.trim()){W(!0);try{await L(V),H(``),await I()}finally{W(!1)}}},ie=async e=>{W(!0);try{await R(e),await I()}finally{W(!1)}};return(0,A.jsxs)(`div`,{className:`app-page-stack`,children:[(0,A.jsxs)(`section`,{className:`app-section`,children:[(0,A.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,A.jsx)(`h3`,{className:`text-sm font-medium`,children:`内置插件`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,A.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`插件模式:`}),(0,A.jsxs)(ee,{value:t,onValueChange:e=>n(e),children:[(0,A.jsx)(s,{className:`w-28 h-7 text-xs`,children:(0,A.jsx)(u,{})}),(0,A.jsx)(l,{children:(0,A.jsxs)(d,{children:[(0,A.jsx)(c,{value:`off`,children:`关闭`}),(0,A.jsx)(c,{value:`on`,children:`开启`}),(0,A.jsx)(c,{value:`shadow`,children:`影子模式`})]})})]}),t===`off`&&(0,A.jsx)(b,{variant:`destructive`,className:`text-xs`,children:`插件未生效`})]})]}),(0,A.jsx)(`div`,{className:`rounded-md border`,children:(0,A.jsxs)(E,{children:[(0,A.jsx)(x,{children:(0,A.jsxs)(w,{children:[(0,A.jsx)(S,{children:`名称`}),(0,A.jsx)(S,{children:`版本`}),(0,A.jsx)(S,{children:`Hooks`}),(0,A.jsx)(S,{children:`状态`}),(0,A.jsx)(S,{className:`w-24`,children:`操作`})]})}),(0,A.jsx)(C,{children:e.length===0?(0,A.jsx)(w,{children:(0,A.jsx)(T,{colSpan:5,className:`text-center text-muted-foreground py-8`,children:`暂无内置插件`})}):e.map(e=>(0,A.jsxs)(w,{children:[(0,A.jsx)(T,{className:`font-medium`,children:e.name}),(0,A.jsx)(T,{children:e.version}),(0,A.jsx)(T,{children:(0,A.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:e.hooks.map(e=>(0,A.jsx)(b,{variant:`secondary`,className:`text-xs`,children:e},e))})}),(0,A.jsx)(T,{children:(0,A.jsx)(b,{variant:e.state===`running`?`default`:`secondary`,children:e.state})}),(0,A.jsx)(T,{children:e.state===`running`?(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>ne(e.id),disabled:z,"aria-label":`停止插件 ${e.name}`,children:(0,A.jsx)(g,{})}):(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>te(e.id),disabled:z,"aria-label":`启动插件 ${e.name}`,children:(0,A.jsx)(v,{})})})]},e.id))})]})})]}),(0,A.jsxs)(`section`,{className:`app-section`,children:[(0,A.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,A.jsx)(`h3`,{className:`text-sm font-medium`,children:`自定义插件`}),(0,A.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,A.jsxs)(r,{variant:`outline`,size:`sm`,onClick:Y,disabled:z||q,children:[(0,A.jsx)(a,{"data-icon":`inline-start`}),`刷新列表`]}),(0,A.jsx)(r,{variant:`outline`,size:`sm`,onClick:Z,disabled:z||q,children:q?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(y,{"data-icon":`inline-start`,className:`animate-spin`}),`加载中...`]}):(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(o,{"data-icon":`inline-start`}),`热加载插件`]})}),(0,A.jsxs)(r,{size:`sm`,onClick:()=>window.dispatchEvent(new CustomEvent(`global-panel:open-panel`,{detail:{id:`plugin.generate`,title:`AI 插件生成器`,size:`xl`}})),children:[(0,A.jsx)(h,{"data-icon":`inline-start`}),`AI 生成插件`]})]})]}),(0,A.jsx)(`div`,{className:`rounded-md border`,children:(0,A.jsxs)(E,{children:[(0,A.jsx)(x,{children:(0,A.jsxs)(w,{children:[(0,A.jsx)(S,{children:`插件名称`}),(0,A.jsx)(S,{className:`w-16 text-center`,children:`启用`}),(0,A.jsx)(S,{children:`状态`}),(0,A.jsx)(S,{children:`修改时间`}),(0,A.jsx)(S,{className:`w-32`,children:`操作`})]})}),(0,A.jsx)(C,{children:G.length===0?(0,A.jsx)(w,{children:(0,A.jsx)(T,{colSpan:5,className:`text-center text-muted-foreground py-8`,children:`暂无自定义插件,点击上方按钮使用 AI 生成插件`})}):G.map(t=>{let n=t.filename.replace(/\.js$/,``).replace(/^/,`local.`),i=e.find(e=>e.id===n),a=i?i.state!==`disabled`:!1;return(0,A.jsxs)(w,{className:!a&&i?`opacity-60`:``,children:[(0,A.jsx)(T,{className:`font-medium font-mono text-sm`,children:t.filename}),(0,A.jsx)(T,{className:`text-center`,children:i&&(0,A.jsx)(f,{checked:a,onCheckedChange:e=>N(i.id,e)})}),(0,A.jsx)(T,{children:i?a?(0,A.jsx)(b,{children:`已启用`}):(0,A.jsx)(b,{variant:`secondary`,children:`已禁用`}):(0,A.jsx)(b,{variant:`outline`,children:`未加载`})}),(0,A.jsx)(T,{className:`text-xs text-muted-foreground`,children:new Date(t.modified).toLocaleString()}),(0,A.jsx)(T,{children:(0,A.jsxs)(`div`,{className:`flex gap-1`,children:[(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>$(t.filename),title:`查看/编辑代码`,"aria-label":`编辑插件 ${t.filename}`,children:(0,A.jsx)(_,{})}),i&&a&&(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>Q(i.id,i.name,i.hooks),title:`测试插件`,"aria-label":`测试插件 ${i.name}`,children:(0,A.jsx)(m,{})}),(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>X(t.filename),className:`text-destructive`,title:`删除插件`,children:`删除`})]})})]},t.filename)})})]})})]}),(0,A.jsxs)(`section`,{className:`app-section`,children:[(0,A.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,A.jsx)(`h3`,{className:`text-sm font-medium`,children:`第三方插件`}),(0,A.jsxs)(`div`,{className:`flex items-center gap-2`,children:[F.allowAll?(0,A.jsx)(O,{className:`size-4 text-primary`}):(0,A.jsx)(D,{className:`size-4 text-muted-foreground`}),(0,A.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:F.allowAll?`已信任所有插件`:`已信任: ${F.trusted.length} 个`})]})]}),(0,A.jsxs)(`div`,{className:`flex gap-2`,children:[(0,A.jsx)(p,{value:V,onChange:e=>H(e.target.value),placeholder:`输入插件路径...`,className:`flex-1`}),(0,A.jsx)(r,{onClick:re,disabled:U||!V.trim(),children:U?(0,A.jsx)(y,{className:`animate-spin`}):`加载`})]}),(0,A.jsx)(`div`,{className:`rounded-md border`,children:(0,A.jsxs)(E,{children:[(0,A.jsx)(x,{children:(0,A.jsxs)(w,{children:[(0,A.jsx)(S,{children:`名称`}),(0,A.jsx)(S,{children:`版本`}),(0,A.jsx)(S,{children:`状态`}),(0,A.jsx)(S,{className:`w-24`,children:`操作`})]})}),(0,A.jsx)(C,{children:P.length===0?(0,A.jsx)(w,{children:(0,A.jsx)(T,{colSpan:4,className:`text-center text-muted-foreground py-8`,children:`暂无第三方插件`})}):P.map(e=>(0,A.jsxs)(w,{children:[(0,A.jsx)(T,{className:`font-medium`,children:e.name}),(0,A.jsx)(T,{children:e.version}),(0,A.jsx)(T,{children:(0,A.jsx)(b,{variant:e.state===`running`?`default`:`secondary`,children:e.state})}),(0,A.jsx)(T,{children:(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>ie(e.id),disabled:U,className:`text-destructive`,children:`卸载`})})]},e.id))})]})})]})]})}export{j as PluginConfig};
@@ -1,2 +1,2 @@
1
- import{a as e,f as t,t as n,u as r}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as i}from"./circle-x-C9USji_R.js";import{t as a}from"./code-5_eJ_XpJ.js";import{t as o}from"./copy-BYjq1hdN.js";import{t as s}from"./wand-sparkles-wkul5vje.js";import"./es2015-CfXu88Y7.js";import{o as ee,r as te}from"./ai-config-store-DQXVJVn_.js";import{$ as ne,A as c,X as l,_ as re,b as u,d as ie,f as ae,g as oe,h as se,m as d,mt as ce,ot as f,p as le,pt as ue,u as p,v as de,y as fe,z as m}from"./index-L7uWxTnp.js";import{t as pe}from"./textarea-C6NooVK1.js";var h=t(r(),1),g=e();function _({open:e=!1,onOpenChange:t,embedded:r=!1,onPluginSaved:_}){let[v,y]=(0,h.useState)(``),[b,x]=(0,h.useState)(``),[S,C]=(0,h.useState)(``),[w,T]=(0,h.useState)(``),[E,D]=(0,h.useState)(!1),[O,k]=(0,h.useState)(!1),[A,j]=(0,h.useState)(``),[M,N]=(0,h.useState)(``),[P,F]=(0,h.useState)(null),[I,L]=(0,h.useState)(null),[R,z]=(0,h.useState)(``),[me,B]=(0,h.useState)(!1),[V,H]=(0,h.useState)(0),[U,W]=(0,h.useState)(0),[G,K]=(0,h.useState)(!1),[q,J]=(0,h.useState)(!1),Y=te(),X=ee(Y),he=async()=>{if(!v.trim()||!b.trim()){L(`error`),z(`请填写插件名称和描述`);return}if(!X){L(`error`),z(`AI 配置未完成,请先配置 AI 服务`);return}D(!0),L(null),z(`正在连接 AI 服务...`),j(``),H(0),W(0);let e=Date.now(),t=0;try{let n={name:v,description:b,hooks:S.split(`,`).map(e=>e.trim()).filter(Boolean),permissions:w.split(`,`).map(e=>e.trim()).filter(Boolean)},r=await fetch(`/api/plugins/generate-stream`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({requirement:n,aiConfig:{provider:Y.provider,apiKey:Y.apiKey,baseUrl:Y.baseUrl,model:Y.model}})});if(!r.ok)throw Error(`请求失败: ${r.status}`);let i=r.body?.getReader(),a=new TextDecoder;if(!i)throw Error(`无法读取响应流`);let o=``;for(;;){let{done:n,value:r}=await i.read();if(n)break;o+=a.decode(r,{stream:!0});let s=o.split(`
1
+ import{a as e,f as t,t as n,u as r}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as i}from"./circle-x-C9USji_R.js";import{t as a}from"./code-5_eJ_XpJ.js";import{t as o}from"./copy-BYjq1hdN.js";import{t as s}from"./wand-sparkles-wkul5vje.js";import"./es2015-CfXu88Y7.js";import{o as ee,r as te}from"./ai-config-store-DQXVJVn_.js";import{$ as ne,A as c,X as l,_ as re,b as u,d as ie,f as ae,g as oe,h as se,m as d,mt as ce,ot as f,p as le,pt as ue,u as p,v as de,y as fe,z as m}from"./index-DTeCUv1G.js";import{t as pe}from"./textarea-C6NooVK1.js";var h=t(r(),1),g=e();function _({open:e=!1,onOpenChange:t,embedded:r=!1,onPluginSaved:_}){let[v,y]=(0,h.useState)(``),[b,x]=(0,h.useState)(``),[S,C]=(0,h.useState)(``),[w,T]=(0,h.useState)(``),[E,D]=(0,h.useState)(!1),[O,k]=(0,h.useState)(!1),[A,j]=(0,h.useState)(``),[M,N]=(0,h.useState)(``),[P,F]=(0,h.useState)(null),[I,L]=(0,h.useState)(null),[R,z]=(0,h.useState)(``),[me,B]=(0,h.useState)(!1),[V,H]=(0,h.useState)(0),[U,W]=(0,h.useState)(0),[G,K]=(0,h.useState)(!1),[q,J]=(0,h.useState)(!1),Y=te(),X=ee(Y),he=async()=>{if(!v.trim()||!b.trim()){L(`error`),z(`请填写插件名称和描述`);return}if(!X){L(`error`),z(`AI 配置未完成,请先配置 AI 服务`);return}D(!0),L(null),z(`正在连接 AI 服务...`),j(``),H(0),W(0);let e=Date.now(),t=0;try{let n={name:v,description:b,hooks:S.split(`,`).map(e=>e.trim()).filter(Boolean),permissions:w.split(`,`).map(e=>e.trim()).filter(Boolean)},r=await fetch(`/api/plugins/generate-stream`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({requirement:n,aiConfig:{provider:Y.provider,apiKey:Y.apiKey,baseUrl:Y.baseUrl,model:Y.model}})});if(!r.ok)throw Error(`请求失败: ${r.status}`);let i=r.body?.getReader(),a=new TextDecoder;if(!i)throw Error(`无法读取响应流`);let o=``;for(;;){let{done:n,value:r}=await i.read();if(n)break;o+=a.decode(r,{stream:!0});let s=o.split(`
2
2
  `);o=s.pop()||``;for(let n of s)if(!n.startsWith(`event:`)&&n.startsWith(`data:`)){let r=n.slice(5).trim();try{let n=JSON.parse(r);if(n.status===`generating`)z(`AI 正在生成代码...`),W(10);else if(n.chunk){t++;let r=n.accumulated||n.chunk;j(r),H(r.length),W(Math.min(90,10+t*2));let i=((Date.now()-e)/1e3).toFixed(1);z(`生成中... (${r.length} 字符, ${i}s)`)}else if(n.status===`success`){j(n.plugin.code),N(n.plugin.filename),F(n.plugin.manifest),H(n.plugin.code.length),W(100),L(`success`);let t=((Date.now()-e)/1e3).toFixed(1);z(`插件代码生成成功!(${n.plugin.code.length} 字符, ${t}s)`)}else if(n.error)throw Error(n.error)}catch(e){if(e instanceof Error&&e.message!==`Unexpected end of JSON input`)throw e}}}}catch(e){L(`error`),z(e instanceof Error?e.message:`生成失败`),W(0)}finally{D(!1)}},Z=async()=>{if(!A||!M){L(`error`),z(`没有可保存的插件代码`);return}k(!0),L(null),z(`正在保存插件...`);try{let e=await fetch(`/api/plugins/save`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({filename:M,code:A})});if(!e.ok){let t=await e.json();throw Error(t.error||`保存失败`)}await e.json(),L(`success`),z(`插件已保存!现在可以热加载并测试。`),K(!0),window.dispatchEvent(new CustomEvent(`plugins-custom-updated`)),p.success(`插件保存成功`),_&&_(),window.dispatchEvent(new CustomEvent(`plugins-custom-updated`))}catch(e){let t=e instanceof Error?e.message:`保存失败`;L(`error`),z(t),p.error(t)}finally{k(!1)}};ie({active:(e||r)&&!!A&&!G,enabled:!O&&!E&&!!M,priority:ae.panel,onSave:Z});let ge=async()=>{A&&(await navigator.clipboard.writeText(A),B(!0),setTimeout(()=>B(!1),2e3))},_e=async()=>{J(!0);try{let e=await fetch(`/api/plugins/reload`,{method:`POST`});if(!e.ok){let t=await e.json();throw Error(t.error||`热加载失败`)}let n=await e.json();L(`success`),z(`成功热加载 ${n.count} 个插件!插件已激活,可以使用了。`),_&&_(),setTimeout(()=>{t?.(!1),Q()},3e3)}catch(e){L(`error`),z(e instanceof Error?e.message:`热加载失败`)}finally{J(!1)}},Q=()=>{y(``),x(``),C(``),T(``),j(``),N(``),F(null),L(null),z(``),B(!1),H(0),W(0),K(!1),J(!1)},$=(0,g.jsxs)(g.Fragment,{children:[(0,g.jsxs)(de,{className:`px-6 pt-6 pb-4`,children:[(0,g.jsxs)(fe,{className:`flex items-center gap-2`,children:[(0,g.jsx)(l,{className:`h-5 w-5`}),`AI 插件生成器`]}),(0,g.jsx)(re,{children:`使用 AI 根据插件系统设计和您的需求自动生成自定义插件代码`})]}),(0,g.jsx)(d,{}),(0,g.jsxs)(`div`,{className:`app-panel-content`,children:[!X&&(0,g.jsx)(`div`,{className:`bg-yellow-50 dark:bg-yellow-950/20 border border-yellow-200 dark:border-yellow-900 rounded-md p-3`,children:(0,g.jsx)(`p`,{className:`text-sm text-yellow-700 dark:text-yellow-300`,children:`AI 功能未配置或未启用,请先在设置中配置 AI 服务`})}),(0,g.jsxs)(`div`,{className:`app-section`,children:[(0,g.jsxs)(`div`,{className:`app-field-group`,children:[(0,g.jsxs)(u,{htmlFor:`pluginName`,children:[`插件名称 `,(0,g.jsx)(`span`,{className:`text-red-500`,children:`*`})]}),(0,g.jsx)(c,{id:`pluginName`,value:v,onChange:e=>y(e.target.value),placeholder:`例如:请求日志分析器`,disabled:E||O})]}),(0,g.jsxs)(`div`,{className:`app-field-group`,children:[(0,g.jsxs)(u,{htmlFor:`pluginDescription`,children:[`插件描述 `,(0,g.jsx)(`span`,{className:`text-red-500`,children:`*`})]}),(0,g.jsx)(pe,{id:`pluginDescription`,value:b,onChange:e=>x(e.target.value),placeholder:`详细描述插件的功能,例如:分析HTTP请求日志,统计各个API的调用次数、响应时间等信息,并在控制台输出统计报告`,rows:4,disabled:E||O})]}),(0,g.jsxs)(`div`,{className:`app-field-group`,children:[(0,g.jsx)(u,{htmlFor:`hooks`,children:`需要的 Hooks(可选,用逗号分隔)`}),(0,g.jsx)(c,{id:`hooks`,value:S,onChange:e=>C(e.target.value),placeholder:`例如:onRequestStart, onAfterResponse`,disabled:E||O}),(0,g.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`可选:onRequestStart, onBeforeProxy, onBeforeResponse, onAfterResponse, onError`})]}),(0,g.jsxs)(`div`,{className:`app-field-group`,children:[(0,g.jsx)(u,{htmlFor:`permissions`,children:`需要的权限(可选,用逗号分隔)`}),(0,g.jsx)(c,{id:`permissions`,value:w,onChange:e=>T(e.target.value),placeholder:`例如:proxy:read, storage:write`,disabled:E||O}),(0,g.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`可选:proxy:read, proxy:write, response:shortcircuit, storage:read, storage:write`})]})]}),E&&U>0&&(0,g.jsxs)(`div`,{className:`app-field-group`,children:[(0,g.jsxs)(`div`,{className:`flex items-center justify-between text-sm`,children:[(0,g.jsx)(`span`,{className:`text-muted-foreground`,children:`生成进度`}),(0,g.jsxs)(`span`,{className:`font-medium`,children:[U,`%`]})]}),(0,g.jsx)(`div`,{className:`w-full bg-muted rounded-full h-2 overflow-hidden`,children:(0,g.jsx)(`div`,{className:`bg-primary h-full transition-all duration-300 ease-out`,style:{width:`${U}%`}})})]}),(A||E)&&(0,g.jsxs)(`div`,{className:`app-field-group`,children:[(0,g.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,g.jsxs)(u,{className:`flex items-center gap-2`,children:[(0,g.jsx)(a,{className:`h-4 w-4`}),E?`正在生成插件代码`:`生成的插件代码`]}),(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[V>0&&(0,g.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[V,` 字符`]}),!E&&A&&(0,g.jsx)(n,{variant:`ghost`,size:`sm`,onClick:ge,className:`h-8`,children:me?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(ce,{className:`h-4 w-4 mr-1`}),`已复制`]}):(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(o,{className:`h-4 w-4 mr-1`}),`复制`]})})]})]}),(0,g.jsxs)(`div`,{className:`bg-muted rounded-md p-4 max-h-[400px] overflow-auto relative`,children:[E&&(0,g.jsx)(`div`,{className:`absolute top-2 right-2`,children:(0,g.jsx)(f,{className:`h-4 w-4 animate-spin text-muted-foreground`})}),(0,g.jsx)(`pre`,{className:`text-xs font-mono whitespace-pre-wrap break-all`,children:A||`等待 AI 响应...`})]}),P&&(0,g.jsxs)(`div`,{className:`bg-blue-50 dark:bg-blue-950/20 border border-blue-200 dark:border-blue-900 rounded-md p-3 space-y-2`,children:[(0,g.jsx)(`p`,{className:`text-sm font-medium text-blue-900 dark:text-blue-100`,children:`插件信息`}),(0,g.jsxs)(`div`,{className:`text-xs space-y-1 text-blue-700 dark:text-blue-300`,children:[(0,g.jsxs)(`div`,{children:[(0,g.jsx)(`strong`,{children:`ID:`}),` `,P.id]}),(0,g.jsxs)(`div`,{children:[(0,g.jsx)(`strong`,{children:`名称:`}),` `,P.name]}),(0,g.jsxs)(`div`,{children:[(0,g.jsx)(`strong`,{children:`版本:`}),` `,P.version]}),(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsx)(`strong`,{children:`Hooks:`}),(0,g.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:P.hooks.map(e=>(0,g.jsx)(m,{variant:`secondary`,className:`text-xs`,children:e},e))})]}),(0,g.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,g.jsx)(`strong`,{children:`权限:`}),(0,g.jsx)(`div`,{className:`flex flex-wrap gap-1`,children:P.permissions.map(e=>(0,g.jsx)(m,{variant:`outline`,className:`text-xs`,children:e},e))})]})]})]})]}),R&&(0,g.jsxs)(`div`,{className:`flex items-start gap-2 p-3 rounded-md border ${I===`success`?`bg-green-50 dark:bg-green-950/20 border-green-200 dark:border-green-900`:I===`error`?`bg-red-50 dark:bg-red-950/20 border-red-200 dark:border-red-900`:`bg-blue-50 dark:bg-blue-950/20 border-blue-200 dark:border-blue-900`}`,children:[I===`success`&&(0,g.jsx)(ue,{className:`h-4 w-4 text-green-600 dark:text-green-400 mt-0.5`}),I===`error`&&(0,g.jsx)(i,{className:`h-4 w-4 text-red-600 dark:text-red-400 mt-0.5`}),E&&(0,g.jsx)(f,{className:`h-4 w-4 text-blue-600 dark:text-blue-400 mt-0.5 animate-spin`}),(0,g.jsx)(`span`,{className:`text-xs flex-1 ${I===`success`?`text-green-700 dark:text-green-300`:I===`error`?`text-red-700 dark:text-red-300`:`text-blue-700 dark:text-blue-300`}`,children:R})]})]}),(0,g.jsx)(d,{}),(0,g.jsxs)(`div`,{className:`px-6 py-4 flex justify-between gap-2`,children:[(0,g.jsx)(n,{variant:`outline`,size:`sm`,onClick:()=>{t?.(!1),Q()},disabled:E||O||q,children:G?`完成`:`取消`}),(0,g.jsx)(`div`,{className:`flex gap-2`,children:A?G?(0,g.jsx)(n,{size:`sm`,onClick:_e,disabled:q,className:`bg-green-600 hover:bg-green-700`,children:q?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(f,{className:`h-4 w-4 mr-1 animate-spin`}),`加载中...`]}):(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(l,{className:`h-4 w-4 mr-1`}),`热加载并测试`]})}):(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(n,{variant:`outline`,size:`sm`,onClick:()=>{j(``),N(``),F(null),L(null),z(``)},disabled:E||O,children:`重新生成`}),(0,g.jsx)(le,{size:`sm`,onClick:Z,disabled:O,children:O?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(f,{"data-icon":`inline-start`,className:`animate-spin`}),`保存中...`]}):(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(ne,{"data-icon":`inline-start`}),`保存插件`]})})]}):(0,g.jsx)(n,{size:`sm`,onClick:he,disabled:!X||E||O||!v.trim()||!b.trim(),children:E?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(f,{className:`h-4 w-4 mr-1 animate-spin`}),`生成中...`]}):(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(s,{className:`h-4 w-4 mr-1`}),`生成插件`]})})})]})]});return r?(0,g.jsx)(`div`,{className:`flex h-full min-h-0 flex-col`,children:$}):(0,g.jsx)(se,{open:e,onOpenChange:e=>{t?.(e),e||Q()},children:(0,g.jsx)(oe,{className:`p-0 flex flex-col`,resizable:!0,defaultWidth:900,storageKey:`plugin-generator`,children:$})})}export{_ as PluginGenerator};
@@ -1,4 +1,4 @@
1
- import{a as e,f as t,l as n,t as r,u as i}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as a}from"./arrow-right-B4Mrlj2-.js";import{t as o}from"./circle-alert-Q8cZk9Rv.js";import{t as s}from"./circle-x-C9USji_R.js";import{t as ee}from"./pencil-line-Cqe41E4h.js";import{t as c}from"./refresh-cw-CG3HaiQT.js";import{t as te}from"./wand-sparkles-wkul5vje.js";import"./es2015-CfXu88Y7.js";import{i as ne,o as re,r as ie}from"./ai-config-store-DQXVJVn_.js";import{A as ae,B as l,H as u,U as d,_ as oe,b as f,ft as se,g as ce,h as le,lt as ue,m as p,ot as m,pt as de,q as h,st as fe,v as pe,y as me,z as g}from"./index-L7uWxTnp.js";import{t as _}from"./body-diff-view-D7dCWajG.js";import{n as he,t as ge}from"./monaco-editor-B3brLg8j.js";import{t as _e}from"./textarea-C6NooVK1.js";var ve=n(`circle-play`,[[`path`,{d:`M9 9.003a1 1 0 0 1 1.517-.859l4.997 2.997a1 1 0 0 1 0 1.718l-4.997 2.997A1 1 0 0 1 9 14.996z`,key:`kmsa83`}],[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),v=t(i(),1),y=e();function b(e){let t=new Map;return!e||typeof e!=`object`||Object.entries(e).forEach(([e,n])=>{t.set(e.toLowerCase(),{displayKey:e,value:n==null?``:String(n)})}),t}function x(e,t){let n=b(e),r=b(t);return Array.from(new Set([...n.keys(),...r.keys()])).sort().map(e=>{let t=n.get(e),i=r.get(e),a=t?.value??``,o=i?.value??``,s=`unchanged`;return!t&&i?s=`added`:t&&!i?s=`removed`:a!==o&&(s=`changed`),{key:e,displayKey:i?.displayKey??t?.displayKey??e,originalValue:a,modifiedValue:o,status:s}})}function S(e,t){let n=`rounded-md border px-2 py-1.5`;return e===`unchanged`?`${n} border-transparent`:e===`changed`?`${n} border-orange-300 bg-orange-500/10`:e===`added`?t===`modified`?`${n} border-green-300 bg-green-500/10`:`${n} border-transparent opacity-50`:e===`removed`?t===`original`?`${n} border-red-300 bg-red-500/10`:`${n} border-transparent opacity-50`:n}function ye({original:e,modified:t,mode:n=`split`}){let r=x(e,t);return n===`inline`?(0,y.jsx)(`div`,{className:`bg-muted/50 rounded-md p-2 text-xs font-mono max-h-[220px] overflow-auto space-y-1`,children:r.map(e=>(0,y.jsxs)(`div`,{className:`rounded-md border px-2 py-1.5 ${e.status===`unchanged`?`border-transparent`:e.status===`changed`?`border-orange-300 bg-orange-500/10`:e.status===`added`?`border-green-300 bg-green-500/10`:`border-red-300 bg-red-500/10`}`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,y.jsx)(`span`,{className:`text-muted-foreground`,children:e.displayKey}),(0,y.jsx)(g,{variant:`outline`,className:`h-5 px-1.5 text-[10px] font-normal`,children:e.status===`unchanged`?`未变`:e.status===`changed`?`修改`:e.status===`added`?`新增`:`删除`})]}),e.status===`changed`&&(0,y.jsxs)(`div`,{className:`mt-1 space-y-1`,children:[(0,y.jsxs)(`div`,{className:`text-red-700 dark:text-red-300`,children:[(0,y.jsx)(`span`,{className:`mr-1`,children:`-`}),e.originalValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]}),(0,y.jsxs)(`div`,{className:`text-green-700 dark:text-green-300`,children:[(0,y.jsx)(`span`,{className:`mr-1`,children:`+`}),e.modifiedValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]})]}),e.status===`added`&&(0,y.jsxs)(`div`,{className:`mt-1 text-green-700 dark:text-green-300`,children:[(0,y.jsx)(`span`,{className:`mr-1`,children:`+`}),e.modifiedValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]}),e.status===`removed`&&(0,y.jsxs)(`div`,{className:`mt-1 text-red-700 dark:text-red-300`,children:[(0,y.jsx)(`span`,{className:`mr-1`,children:`-`}),e.originalValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]}),e.status===`unchanged`&&(0,y.jsx)(`div`,{className:`mt-1`,children:e.modifiedValue||e.originalValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})})]},e.key))}):(0,y.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`div`,{className:`text-[10px] text-muted-foreground mb-0.5`,children:`原始`}),(0,y.jsx)(`div`,{className:`bg-muted/50 rounded-md p-2 text-xs font-mono max-h-[220px] overflow-auto space-y-1`,children:r.map(e=>(0,y.jsxs)(`div`,{className:S(e.status,`original`),children:[(0,y.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.displayKey,`:`]}),` `,e.originalValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]},`original-${e.key}`))})]}),(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`div`,{className:`text-[10px] text-muted-foreground mb-0.5`,children:`修改后`}),(0,y.jsx)(`div`,{className:`bg-muted/50 rounded-md p-2 text-xs font-mono max-h-[220px] overflow-auto space-y-1`,children:r.map(e=>(0,y.jsxs)(`div`,{className:S(e.status,`modified`),children:[(0,y.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.displayKey,`:`]}),` `,e.modifiedValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]},`modified-${e.key}`))})]})]})}function be(e){switch(e){case`generating`:return`AI 正在流式生成修复代码`;case`saving`:return`正在保存修复后的插件代码`;case`reloading`:return`正在热加载插件`;case`retesting`:return`正在重新执行插件测试`;default:return``}}function C({open:e=!1,onOpenChange:t,embedded:n=!1,pluginId:i,pluginName:b,hooks:x,onPluginFixed:S}){let[C,xe]=(0,v.useState)(!1),[w,T]=(0,v.useState)(!1),[Se,Ce]=(0,v.useState)(`https://365.wps.cn/home`),[we,Te]=(0,v.useState)(`GET`),[E,D]=(0,v.useState)(`standalone`),[O,k]=(0,v.useState)(null),[A,Ee]=(0,v.useState)(`split`),[j,De]=(0,v.useState)(`inline`),[M,N]=(0,v.useState)(null),[P,F]=(0,v.useState)(``),[I,L]=(0,v.useState)(``),[R,Oe]=(0,v.useState)(!1),[z,B]=(0,v.useState)(null),[V,H]=(0,v.useState)(``),[ke,U]=(0,v.useState)(`normal`),[W,Ae]=(0,v.useState)(``),[G,K]=(0,v.useState)(`idle`),q=ie(),J=ne(q),je=J?{provider:J.provider,apiKey:J.apiKey,baseUrl:J.baseUrl,model:J.model}:{provider:q.provider,apiKey:q.apiKey,baseUrl:q.baseUrl,model:q.model},Y=re(q),X=i.startsWith(`local.`)?`${i.slice(6)}.js`:``,Z=(0,v.useCallback)(async()=>{if(!X||!e){F(``),L(``),B(null);return}Oe(!0),B(null);try{let e=await fetch(`/api/plugins/custom/${encodeURIComponent(X)}/code`);if(!e.ok){let t=await e.json();throw Error(t.error||`读取插件源码失败`)}let t=await e.json();F(t.code||``),!w&&!V&&L(t.code||``)}catch(e){F(``),L(``),B(e instanceof Error?e.message:`读取插件源码失败`)}finally{Oe(!1)}},[X,w,V,e]);(0,v.useEffect)(()=>{Z()},[Z]);let Q=(0,v.useMemo)(()=>{let e=[];return O?.error&&e.push({hookName:`test`,message:O.error}),Object.entries(O?.hookResults||{}).forEach(([t,n])=>{n?.status===`error`&&e.push({hookName:t,message:n.error||`未知错误`,stack:n.stack})}),O?.realRequest?.fetchError&&e.push({hookName:`fetch`,message:O.realRequest.fetchError}),e},[O]),Me=Q.length>0&&!!X,Ne=!!I&&!!(V||G===`idle`&&I&&P&&I!==P),Pe=async(e,t,n)=>{K(`saving`);let r=await fetch(`/api/plugins/custom/${encodeURIComponent(X)}/code`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:e})});if(!r.ok){let e=await r.json();throw Error(e.error||`保存修复后的代码失败`)}K(`reloading`);let i=await fetch(`/api/plugins/reload`,{method:`POST`});if(!i.ok){let e=await i.json().catch(()=>({error:`热加载失败`}));throw Error(e.error||`热加载失败`)}F(e),H(e),U(`diff`),window.dispatchEvent(new CustomEvent(`plugins-custom-updated`)),S?.(),n&&(K(`retesting`),await Fe()),N({status:`success`,message:t}),K(`idle`)},Fe=async()=>{xe(!0),k(null),N(null);try{let e=await fetch(`/api/plugins/test`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({pluginId:i,url:Se,method:we,integrated:E===`integrated`})});if(!e.ok){let t=await e.json();throw Error(t.error||`测试失败`)}k((await e.json()).results)}catch(e){k({error:e instanceof Error?e.message:`测试失败`})}finally{xe(!1)}},$=(0,y.jsxs)(y.Fragment,{children:[(0,y.jsxs)(pe,{className:`px-6 pt-6 pb-4`,children:[(0,y.jsxs)(me,{className:`flex items-center gap-2`,children:[(0,y.jsx)(h,{className:`h-5 w-5`}),`测试插件: `,b]}),(0,y.jsx)(oe,{children:`发起真实 HTTP 请求,在请求/响应过程中运行插件代码`})]}),(0,y.jsx)(p,{}),(0,y.jsxs)(`div`,{className:`app-panel-content`,children:[(0,y.jsxs)(`div`,{className:`app-section`,children:[(0,y.jsxs)(`div`,{className:`app-field-group`,children:[(0,y.jsx)(f,{htmlFor:`testUrl`,children:`请求 URL`}),(0,y.jsx)(ae,{id:`testUrl`,value:Se,onChange:e=>Ce(e.target.value),placeholder:`https://example.com/page`,disabled:C})]}),(0,y.jsxs)(`div`,{className:`app-field-group`,children:[(0,y.jsx)(f,{children:`HTTP 方法`}),(0,y.jsx)(`div`,{className:`flex gap-2`,children:[`GET`,`POST`,`PUT`,`DELETE`].map(e=>(0,y.jsx)(r,{type:`button`,variant:we===e?`selected`:`outline`,size:`sm`,onClick:()=>Te(e),disabled:C,children:e},e))})]}),(0,y.jsxs)(`div`,{className:`app-field-group`,children:[(0,y.jsx)(f,{children:`测试模式`}),(0,y.jsxs)(`div`,{className:`flex gap-2 flex-wrap`,children:[(0,y.jsx)(r,{type:`button`,variant:E===`standalone`?`selected`:`outline`,size:`sm`,onClick:()=>D(`standalone`),disabled:C,title:`直接请求 URL,不走路由与 Mock,便于排查插件自身逻辑`,children:`单独测试`}),(0,y.jsx)(r,{type:`button`,variant:E===`integrated`?`selected`:`outline`,size:`sm`,onClick:()=>D(`integrated`),disabled:C,title:`与真实代理一致:先路由解析、Mock 匹配,再请求,便于排查整体链路`,children:`集成测试`})]}),(0,y.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:E===`standalone`?`直接请求上述 URL,不经过路由规则和 Mock,适合验证插件逻辑。`:`先按路由规则解析目标、匹配 Mock,再请求,与经代理的真实请求一致,适合排查链路问题。`})]}),(0,y.jsx)(`div`,{className:`bg-blue-50 dark:bg-blue-950/20 border border-blue-200 dark:border-blue-900 rounded-md p-3`,children:(0,y.jsxs)(`p`,{className:`text-xs text-blue-700 dark:text-blue-300`,children:[(0,y.jsx)(`strong`,{children:`测试流程:`}),` 发起真实请求 → 获取服务器响应 → 运行插件 Hook(`,x.join(`, `),`)→ 展示对比结果`]})})]}),!!X&&(0,y.jsxs)(`div`,{className:`space-y-3`,children:[(0,y.jsx)(p,{}),(0,y.jsxs)(`div`,{className:`space-y-2`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,y.jsxs)(`h3`,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,y.jsx)(se,{className:`h-4 w-4`}),`插件代码`]}),(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,y.jsx)(l,{value:ke,onValueChange:e=>U(e),children:(0,y.jsxs)(u,{className:`h-7`,children:[(0,y.jsx)(d,{value:`normal`,className:`px-2 text-xs`,children:`正常视图`}),(0,y.jsx)(d,{value:`diff`,className:`px-2 text-xs`,disabled:!Ne,children:`Diff 视图`})]})}),(0,y.jsx)(g,{variant:`outline`,className:`text-xs font-normal`,children:X}),(0,y.jsx)(r,{size:`sm`,variant:`ghost`,onClick:Z,disabled:R||w,children:R?(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(m,{className:`h-4 w-4 mr-1 animate-spin`}),`读取中`]}):(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(c,{className:`h-4 w-4 mr-1`}),`刷新代码`]})})]})]}),z?(0,y.jsx)(`div`,{className:`rounded-md border border-red-200 bg-red-50/80 p-3 text-sm text-red-700 dark:border-red-900 dark:bg-red-950/20 dark:text-red-300`,children:z}):ke===`diff`&&Ne?(0,y.jsxs)(`div`,{className:`space-y-2`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,y.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`左侧是原代码,右侧是 AI 修复后的代码`}),G!==`idle`&&(0,y.jsx)(g,{variant:`outline`,className:`text-xs font-normal`,children:be(G)})]}),(0,y.jsx)(ge,{original:I||P,modified:V||P,language:`javascript`,minHeight:`320px`})]}):(0,y.jsx)(he,{value:w&&V?V:P,onChange:()=>{},language:`javascript`,readOnly:!0,minHeight:`260px`}),(0,y.jsxs)(`div`,{className:`space-y-2 pt-2`,children:[(0,y.jsx)(f,{htmlFor:`plugin-extra-instruction`,children:`额外信息`}),(0,y.jsx)(_e,{id:`plugin-extra-instruction`,value:W,onChange:e=>Ae(e.target.value),placeholder:`例如:补充 onBeforeResponse 里对 JSON 响应的判空逻辑;保留现有 hooks 和 manifest,不要改插件 id。`,className:`min-h-[88px]`,disabled:w||R}),(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,y.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`输入额外要求后,AI 会基于当前插件代码直接更新并热加载。`}),(0,y.jsx)(r,{size:`sm`,variant:`outline`,onClick:async()=>{if(!(!X||!W.trim()||!Y||w)){T(!0),N(null),H(``),L(P);try{K(`generating`);let e=await fetch(`/api/plugins/revise-stream`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({originalCode:P,instruction:W.trim(),requirement:{name:b,description:`根据额外要求更新插件 ${b},并保持 hooks 行为正确。Hooks: ${x.join(`, `)}`,hooks:x},aiConfig:je})});if(!e.ok){let t=await e.json();throw Error(t.error||`AI 更新代码失败`)}let t=e.body?.getReader(),n=new TextDecoder;if(!t)throw Error(`无法读取 AI 更新流`);let r=``,i=``;for(;;){let{done:e,value:a}=await t.read();if(e)break;i+=n.decode(a,{stream:!0});let o=i.split(`
1
+ import{a as e,f as t,l as n,t as r,u as i}from"./button-BTToMaBW.js";import"./dist-C6eaYCUo.js";import{t as a}from"./arrow-right-B4Mrlj2-.js";import{t as o}from"./circle-alert-Q8cZk9Rv.js";import{t as s}from"./circle-x-C9USji_R.js";import{t as ee}from"./pencil-line-Cqe41E4h.js";import{t as c}from"./refresh-cw-CG3HaiQT.js";import{t as te}from"./wand-sparkles-wkul5vje.js";import"./es2015-CfXu88Y7.js";import{i as ne,o as re,r as ie}from"./ai-config-store-DQXVJVn_.js";import{A as ae,B as l,H as u,U as d,_ as oe,b as f,ft as se,g as ce,h as le,lt as ue,m as p,ot as m,pt as de,q as h,st as fe,v as pe,y as me,z as g}from"./index-DTeCUv1G.js";import{t as _}from"./body-diff-view-D7dCWajG.js";import{n as he,t as ge}from"./monaco-editor-DboIGERI.js";import{t as _e}from"./textarea-C6NooVK1.js";var ve=n(`circle-play`,[[`path`,{d:`M9 9.003a1 1 0 0 1 1.517-.859l4.997 2.997a1 1 0 0 1 0 1.718l-4.997 2.997A1 1 0 0 1 9 14.996z`,key:`kmsa83`}],[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),v=t(i(),1),y=e();function b(e){let t=new Map;return!e||typeof e!=`object`||Object.entries(e).forEach(([e,n])=>{t.set(e.toLowerCase(),{displayKey:e,value:n==null?``:String(n)})}),t}function x(e,t){let n=b(e),r=b(t);return Array.from(new Set([...n.keys(),...r.keys()])).sort().map(e=>{let t=n.get(e),i=r.get(e),a=t?.value??``,o=i?.value??``,s=`unchanged`;return!t&&i?s=`added`:t&&!i?s=`removed`:a!==o&&(s=`changed`),{key:e,displayKey:i?.displayKey??t?.displayKey??e,originalValue:a,modifiedValue:o,status:s}})}function S(e,t){let n=`rounded-md border px-2 py-1.5`;return e===`unchanged`?`${n} border-transparent`:e===`changed`?`${n} border-orange-300 bg-orange-500/10`:e===`added`?t===`modified`?`${n} border-green-300 bg-green-500/10`:`${n} border-transparent opacity-50`:e===`removed`?t===`original`?`${n} border-red-300 bg-red-500/10`:`${n} border-transparent opacity-50`:n}function ye({original:e,modified:t,mode:n=`split`}){let r=x(e,t);return n===`inline`?(0,y.jsx)(`div`,{className:`bg-muted/50 rounded-md p-2 text-xs font-mono max-h-[220px] overflow-auto space-y-1`,children:r.map(e=>(0,y.jsxs)(`div`,{className:`rounded-md border px-2 py-1.5 ${e.status===`unchanged`?`border-transparent`:e.status===`changed`?`border-orange-300 bg-orange-500/10`:e.status===`added`?`border-green-300 bg-green-500/10`:`border-red-300 bg-red-500/10`}`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,y.jsx)(`span`,{className:`text-muted-foreground`,children:e.displayKey}),(0,y.jsx)(g,{variant:`outline`,className:`h-5 px-1.5 text-[10px] font-normal`,children:e.status===`unchanged`?`未变`:e.status===`changed`?`修改`:e.status===`added`?`新增`:`删除`})]}),e.status===`changed`&&(0,y.jsxs)(`div`,{className:`mt-1 space-y-1`,children:[(0,y.jsxs)(`div`,{className:`text-red-700 dark:text-red-300`,children:[(0,y.jsx)(`span`,{className:`mr-1`,children:`-`}),e.originalValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]}),(0,y.jsxs)(`div`,{className:`text-green-700 dark:text-green-300`,children:[(0,y.jsx)(`span`,{className:`mr-1`,children:`+`}),e.modifiedValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]})]}),e.status===`added`&&(0,y.jsxs)(`div`,{className:`mt-1 text-green-700 dark:text-green-300`,children:[(0,y.jsx)(`span`,{className:`mr-1`,children:`+`}),e.modifiedValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]}),e.status===`removed`&&(0,y.jsxs)(`div`,{className:`mt-1 text-red-700 dark:text-red-300`,children:[(0,y.jsx)(`span`,{className:`mr-1`,children:`-`}),e.originalValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]}),e.status===`unchanged`&&(0,y.jsx)(`div`,{className:`mt-1`,children:e.modifiedValue||e.originalValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})})]},e.key))}):(0,y.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`div`,{className:`text-[10px] text-muted-foreground mb-0.5`,children:`原始`}),(0,y.jsx)(`div`,{className:`bg-muted/50 rounded-md p-2 text-xs font-mono max-h-[220px] overflow-auto space-y-1`,children:r.map(e=>(0,y.jsxs)(`div`,{className:S(e.status,`original`),children:[(0,y.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.displayKey,`:`]}),` `,e.originalValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]},`original-${e.key}`))})]}),(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`div`,{className:`text-[10px] text-muted-foreground mb-0.5`,children:`修改后`}),(0,y.jsx)(`div`,{className:`bg-muted/50 rounded-md p-2 text-xs font-mono max-h-[220px] overflow-auto space-y-1`,children:r.map(e=>(0,y.jsxs)(`div`,{className:S(e.status,`modified`),children:[(0,y.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.displayKey,`:`]}),` `,e.modifiedValue||(0,y.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})]},`modified-${e.key}`))})]})]})}function be(e){switch(e){case`generating`:return`AI 正在流式生成修复代码`;case`saving`:return`正在保存修复后的插件代码`;case`reloading`:return`正在热加载插件`;case`retesting`:return`正在重新执行插件测试`;default:return``}}function C({open:e=!1,onOpenChange:t,embedded:n=!1,pluginId:i,pluginName:b,hooks:x,onPluginFixed:S}){let[C,xe]=(0,v.useState)(!1),[w,T]=(0,v.useState)(!1),[Se,Ce]=(0,v.useState)(`https://365.wps.cn/home`),[we,Te]=(0,v.useState)(`GET`),[E,D]=(0,v.useState)(`standalone`),[O,k]=(0,v.useState)(null),[A,Ee]=(0,v.useState)(`split`),[j,De]=(0,v.useState)(`inline`),[M,N]=(0,v.useState)(null),[P,F]=(0,v.useState)(``),[I,L]=(0,v.useState)(``),[R,Oe]=(0,v.useState)(!1),[z,B]=(0,v.useState)(null),[V,H]=(0,v.useState)(``),[ke,U]=(0,v.useState)(`normal`),[W,Ae]=(0,v.useState)(``),[G,K]=(0,v.useState)(`idle`),q=ie(),J=ne(q),je=J?{provider:J.provider,apiKey:J.apiKey,baseUrl:J.baseUrl,model:J.model}:{provider:q.provider,apiKey:q.apiKey,baseUrl:q.baseUrl,model:q.model},Y=re(q),X=i.startsWith(`local.`)?`${i.slice(6)}.js`:``,Z=(0,v.useCallback)(async()=>{if(!X||!e){F(``),L(``),B(null);return}Oe(!0),B(null);try{let e=await fetch(`/api/plugins/custom/${encodeURIComponent(X)}/code`);if(!e.ok){let t=await e.json();throw Error(t.error||`读取插件源码失败`)}let t=await e.json();F(t.code||``),!w&&!V&&L(t.code||``)}catch(e){F(``),L(``),B(e instanceof Error?e.message:`读取插件源码失败`)}finally{Oe(!1)}},[X,w,V,e]);(0,v.useEffect)(()=>{Z()},[Z]);let Q=(0,v.useMemo)(()=>{let e=[];return O?.error&&e.push({hookName:`test`,message:O.error}),Object.entries(O?.hookResults||{}).forEach(([t,n])=>{n?.status===`error`&&e.push({hookName:t,message:n.error||`未知错误`,stack:n.stack})}),O?.realRequest?.fetchError&&e.push({hookName:`fetch`,message:O.realRequest.fetchError}),e},[O]),Me=Q.length>0&&!!X,Ne=!!I&&!!(V||G===`idle`&&I&&P&&I!==P),Pe=async(e,t,n)=>{K(`saving`);let r=await fetch(`/api/plugins/custom/${encodeURIComponent(X)}/code`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:e})});if(!r.ok){let e=await r.json();throw Error(e.error||`保存修复后的代码失败`)}K(`reloading`);let i=await fetch(`/api/plugins/reload`,{method:`POST`});if(!i.ok){let e=await i.json().catch(()=>({error:`热加载失败`}));throw Error(e.error||`热加载失败`)}F(e),H(e),U(`diff`),window.dispatchEvent(new CustomEvent(`plugins-custom-updated`)),S?.(),n&&(K(`retesting`),await Fe()),N({status:`success`,message:t}),K(`idle`)},Fe=async()=>{xe(!0),k(null),N(null);try{let e=await fetch(`/api/plugins/test`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({pluginId:i,url:Se,method:we,integrated:E===`integrated`})});if(!e.ok){let t=await e.json();throw Error(t.error||`测试失败`)}k((await e.json()).results)}catch(e){k({error:e instanceof Error?e.message:`测试失败`})}finally{xe(!1)}},$=(0,y.jsxs)(y.Fragment,{children:[(0,y.jsxs)(pe,{className:`px-6 pt-6 pb-4`,children:[(0,y.jsxs)(me,{className:`flex items-center gap-2`,children:[(0,y.jsx)(h,{className:`h-5 w-5`}),`测试插件: `,b]}),(0,y.jsx)(oe,{children:`发起真实 HTTP 请求,在请求/响应过程中运行插件代码`})]}),(0,y.jsx)(p,{}),(0,y.jsxs)(`div`,{className:`app-panel-content`,children:[(0,y.jsxs)(`div`,{className:`app-section`,children:[(0,y.jsxs)(`div`,{className:`app-field-group`,children:[(0,y.jsx)(f,{htmlFor:`testUrl`,children:`请求 URL`}),(0,y.jsx)(ae,{id:`testUrl`,value:Se,onChange:e=>Ce(e.target.value),placeholder:`https://example.com/page`,disabled:C})]}),(0,y.jsxs)(`div`,{className:`app-field-group`,children:[(0,y.jsx)(f,{children:`HTTP 方法`}),(0,y.jsx)(`div`,{className:`flex gap-2`,children:[`GET`,`POST`,`PUT`,`DELETE`].map(e=>(0,y.jsx)(r,{type:`button`,variant:we===e?`selected`:`outline`,size:`sm`,onClick:()=>Te(e),disabled:C,children:e},e))})]}),(0,y.jsxs)(`div`,{className:`app-field-group`,children:[(0,y.jsx)(f,{children:`测试模式`}),(0,y.jsxs)(`div`,{className:`flex gap-2 flex-wrap`,children:[(0,y.jsx)(r,{type:`button`,variant:E===`standalone`?`selected`:`outline`,size:`sm`,onClick:()=>D(`standalone`),disabled:C,title:`直接请求 URL,不走路由与 Mock,便于排查插件自身逻辑`,children:`单独测试`}),(0,y.jsx)(r,{type:`button`,variant:E===`integrated`?`selected`:`outline`,size:`sm`,onClick:()=>D(`integrated`),disabled:C,title:`与真实代理一致:先路由解析、Mock 匹配,再请求,便于排查整体链路`,children:`集成测试`})]}),(0,y.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:E===`standalone`?`直接请求上述 URL,不经过路由规则和 Mock,适合验证插件逻辑。`:`先按路由规则解析目标、匹配 Mock,再请求,与经代理的真实请求一致,适合排查链路问题。`})]}),(0,y.jsx)(`div`,{className:`bg-blue-50 dark:bg-blue-950/20 border border-blue-200 dark:border-blue-900 rounded-md p-3`,children:(0,y.jsxs)(`p`,{className:`text-xs text-blue-700 dark:text-blue-300`,children:[(0,y.jsx)(`strong`,{children:`测试流程:`}),` 发起真实请求 → 获取服务器响应 → 运行插件 Hook(`,x.join(`, `),`)→ 展示对比结果`]})})]}),!!X&&(0,y.jsxs)(`div`,{className:`space-y-3`,children:[(0,y.jsx)(p,{}),(0,y.jsxs)(`div`,{className:`space-y-2`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,y.jsxs)(`h3`,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,y.jsx)(se,{className:`h-4 w-4`}),`插件代码`]}),(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,y.jsx)(l,{value:ke,onValueChange:e=>U(e),children:(0,y.jsxs)(u,{className:`h-7`,children:[(0,y.jsx)(d,{value:`normal`,className:`px-2 text-xs`,children:`正常视图`}),(0,y.jsx)(d,{value:`diff`,className:`px-2 text-xs`,disabled:!Ne,children:`Diff 视图`})]})}),(0,y.jsx)(g,{variant:`outline`,className:`text-xs font-normal`,children:X}),(0,y.jsx)(r,{size:`sm`,variant:`ghost`,onClick:Z,disabled:R||w,children:R?(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(m,{className:`h-4 w-4 mr-1 animate-spin`}),`读取中`]}):(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(c,{className:`h-4 w-4 mr-1`}),`刷新代码`]})})]})]}),z?(0,y.jsx)(`div`,{className:`rounded-md border border-red-200 bg-red-50/80 p-3 text-sm text-red-700 dark:border-red-900 dark:bg-red-950/20 dark:text-red-300`,children:z}):ke===`diff`&&Ne?(0,y.jsxs)(`div`,{className:`space-y-2`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,y.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`左侧是原代码,右侧是 AI 修复后的代码`}),G!==`idle`&&(0,y.jsx)(g,{variant:`outline`,className:`text-xs font-normal`,children:be(G)})]}),(0,y.jsx)(ge,{original:I||P,modified:V||P,language:`javascript`,minHeight:`320px`})]}):(0,y.jsx)(he,{value:w&&V?V:P,onChange:()=>{},language:`javascript`,readOnly:!0,minHeight:`260px`}),(0,y.jsxs)(`div`,{className:`space-y-2 pt-2`,children:[(0,y.jsx)(f,{htmlFor:`plugin-extra-instruction`,children:`额外信息`}),(0,y.jsx)(_e,{id:`plugin-extra-instruction`,value:W,onChange:e=>Ae(e.target.value),placeholder:`例如:补充 onBeforeResponse 里对 JSON 响应的判空逻辑;保留现有 hooks 和 manifest,不要改插件 id。`,className:`min-h-[88px]`,disabled:w||R}),(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,y.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`输入额外要求后,AI 会基于当前插件代码直接更新并热加载。`}),(0,y.jsx)(r,{size:`sm`,variant:`outline`,onClick:async()=>{if(!(!X||!W.trim()||!Y||w)){T(!0),N(null),H(``),L(P);try{K(`generating`);let e=await fetch(`/api/plugins/revise-stream`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({originalCode:P,instruction:W.trim(),requirement:{name:b,description:`根据额外要求更新插件 ${b},并保持 hooks 行为正确。Hooks: ${x.join(`, `)}`,hooks:x},aiConfig:je})});if(!e.ok){let t=await e.json();throw Error(t.error||`AI 更新代码失败`)}let t=e.body?.getReader(),n=new TextDecoder;if(!t)throw Error(`无法读取 AI 更新流`);let r=``,i=``;for(;;){let{done:e,value:a}=await t.read();if(e)break;i+=n.decode(a,{stream:!0});let o=i.split(`
2
2
  `);i=o.pop()||``;for(let e of o){if(!e.startsWith(`data:`))continue;let t=e.slice(5).trim();if(t)try{let e=JSON.parse(t);if(e.status===`generating`)N({status:`success`,message:`AI 正在根据额外要求更新插件代码...`});else if(e.chunk)r=e.accumulated||`${r}${e.chunk}`,H(r),U(`diff`);else if(e.status===`success`)r=e.revisedCode||r,H(r),U(`diff`);else if(e.error)throw Error(e.error)}catch(e){if(e instanceof Error&&e.message!==`Unexpected end of JSON input`)throw e}}}if(!r||typeof r!=`string`)throw Error(`AI 未返回有效代码`);N({status:`success`,message:`AI 已生成更新后的代码,正在保存并热加载...`}),await Pe(r,`AI 已根据额外要求更新插件代码并完成热加载。`,!1),Ae(``)}catch(e){N({status:`error`,message:e instanceof Error?e.message:`AI 更新代码失败`})}finally{K(`idle`),T(!1)}}},disabled:!X||!W.trim()||!Y||w||R||!!z,children:w&&G!==`retesting`?(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(m,{className:`h-4 w-4 mr-1 animate-spin`}),`AI 更新中...`]}):(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(ee,{className:`h-4 w-4 mr-1`}),`根据额外信息更新代码`]})})]})]})]})]}),O&&(0,y.jsxs)(`div`,{className:`space-y-3`,children:[(0,y.jsx)(p,{}),O.error?(0,y.jsx)(`div`,{className:`bg-red-50 dark:bg-red-950/20 border border-red-200 dark:border-red-900 rounded-md p-3`,children:(0,y.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,y.jsx)(s,{className:`h-4 w-4 text-red-600 mt-0.5 shrink-0`}),(0,y.jsx)(`span`,{className:`text-sm text-red-700 dark:text-red-300`,children:O.error})]})}):(0,y.jsxs)(y.Fragment,{children:[(0,y.jsxs)(`div`,{className:`flex flex-wrap gap-4 items-center rounded-md border bg-muted/20 px-3 py-2`,children:[(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,y.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Header 对比`}),(0,y.jsx)(l,{value:A,onValueChange:e=>Ee(e),children:(0,y.jsxs)(u,{className:`h-7`,children:[(0,y.jsx)(d,{value:`split`,className:`px-2 text-xs`,children:`分栏`}),(0,y.jsx)(d,{value:`inline`,className:`px-2 text-xs`,children:`行内`})]})})]}),(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,y.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Body 对比`}),(0,y.jsx)(l,{value:j,onValueChange:e=>De(e),children:(0,y.jsxs)(u,{className:`h-7`,children:[(0,y.jsx)(d,{value:`inline`,className:`px-2 text-xs`,children:`行内`}),(0,y.jsx)(d,{value:`split`,className:`px-2 text-xs`,children:`分栏`})]})})]})]}),O.realRequest&&(0,y.jsxs)(`div`,{className:`space-y-2`,children:[(0,y.jsxs)(`h3`,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,y.jsx)(fe,{className:`h-4 w-4`}),`真实请求`,O.realRequest.testMode&&(0,y.jsx)(g,{variant:`outline`,className:`text-xs font-normal`,children:O.realRequest.testMode===`integrated`?`集成测试`:`单独测试`})]}),(0,y.jsxs)(`div`,{className:`bg-muted/50 rounded-md p-3 text-xs space-y-1`,children:[(0,y.jsxs)(`div`,{className:`flex gap-2`,children:[(0,y.jsx)(g,{variant:`outline`,className:`text-xs`,children:O.realRequest.method}),(0,y.jsx)(`span`,{className:`font-mono break-all`,children:O.realRequest.url})]}),O.realRequest.fetchError?(0,y.jsxs)(`div`,{className:`text-red-600 flex items-center gap-1 mt-1`,children:[(0,y.jsx)(s,{className:`h-3 w-3`}),`请求失败: `,O.realRequest.fetchError]}):(0,y.jsxs)(`div`,{className:`text-muted-foreground space-y-0.5`,children:[(0,y.jsxs)(`div`,{children:[`耗时: `,O.realRequest.fetchDuration,`ms`,O.originalResponse&&(0,y.jsxs)(y.Fragment,{children:[` · 状态码: `,(0,y.jsx)(g,{variant:`outline`,className:`text-xs`,children:O.originalResponse.statusCode}),` · 响应大小: `,O.originalResponse.bodyLength,` 字符`]})]}),(O.realRequest.targetResolved||O.realRequest.usedMock)&&(0,y.jsxs)(`div`,{className:`flex flex-wrap gap-1 mt-1`,children:[O.realRequest.targetResolved&&(0,y.jsx)(g,{variant:`outline`,className:`text-xs text-blue-600 border-blue-300`,children:`路由已改写`}),O.realRequest.usedMock&&(0,y.jsx)(g,{variant:`outline`,className:`text-xs text-orange-600 border-orange-300`,children:`已使用 Mock`})]})]})]})]}),(0,y.jsxs)(`div`,{className:`space-y-2`,children:[(0,y.jsxs)(`h3`,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,y.jsx)(h,{className:`h-4 w-4`}),`Hook 执行结果`]}),Object.keys(O.hookResults||{}).length===0?(0,y.jsx)(`div`,{className:`text-xs text-muted-foreground bg-muted/50 rounded-md p-3`,children:`没有 Hook 被执行`}):(0,y.jsx)(`div`,{className:`space-y-2`,children:Object.entries(O.hookResults||{}).map(([e,t])=>(0,y.jsxs)(`div`,{className:`border rounded-md p-3 ${t.status===`success`?`bg-green-50 dark:bg-green-950/20 border-green-200 dark:border-green-900`:`bg-red-50 dark:bg-red-950/20 border-red-200 dark:border-red-900`}`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[t.status===`success`?(0,y.jsx)(de,{className:`h-4 w-4 text-green-600`}):(0,y.jsx)(s,{className:`h-4 w-4 text-red-600`}),(0,y.jsx)(`span`,{className:`font-medium text-sm`,children:e})]}),t.duration!==void 0&&(0,y.jsxs)(g,{variant:`outline`,className:`text-xs`,children:[t.duration,`ms`]})]}),t.status===`error`&&(0,y.jsxs)(`div`,{className:`mt-2 space-y-2`,children:[(0,y.jsxs)(`div`,{className:`rounded-md border border-red-200 bg-red-100/60 px-2 py-2 text-xs text-red-800 dark:border-red-900 dark:bg-red-950/20 dark:text-red-300`,children:[(0,y.jsx)(`div`,{className:`font-medium mb-1`,children:`错误原因`}),(0,y.jsx)(`pre`,{className:`font-mono whitespace-pre-wrap break-all`,children:t.error})]}),t.stack&&(0,y.jsxs)(`details`,{className:`rounded-md border border-red-200 bg-background/60 px-2 py-2 text-xs dark:border-red-900`,children:[(0,y.jsx)(`summary`,{className:`cursor-pointer text-red-700 dark:text-red-300`,children:`查看错误堆栈`}),(0,y.jsx)(`pre`,{className:`font-mono whitespace-pre-wrap break-all mt-2 text-muted-foreground`,children:t.stack})]})]}),t.targetChanged&&(0,y.jsxs)(`div`,{className:`text-xs text-blue-700 mt-1 flex items-center gap-1`,children:[(0,y.jsx)(a,{className:`h-3 w-3`}),`Target 已修改为: `,t.targetChanged]})]},e))})]}),Q.length>0&&(0,y.jsxs)(`div`,{className:`space-y-2`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,y.jsxs)(`h3`,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,y.jsx)(o,{className:`h-4 w-4 text-red-500`}),`错误详情`]}),(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[!Y&&(0,y.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`AI 未配置,无法自动修复`}),(0,y.jsx)(r,{size:`sm`,variant:`outline`,onClick:async()=>{if(!(!Me||!Y)){T(!0),N(null),H(``),L(P);try{K(`generating`);let e={code:P};if(!e.code)throw Error(`插件源码为空,无法修复`);let t=Q.map(e=>`Hook: ${e.hookName}\nError: ${e.message}${e.stack?`\nStack:\n${e.stack}`:``}`).join(`
3
3
 
4
4
  ---
@@ -1 +1 @@
1
- import{a as e,f as t,l as n,t as r,u as i}from"./button-BTToMaBW.js";import{t as a}from"./arrow-right-B4Mrlj2-.js";import{A as o,Q as s,W as c,a as l,lt as u,ot as d,z as f}from"./index-L7uWxTnp.js";var p=n(`locate-fixed`,[[`line`,{x1:`2`,x2:`5`,y1:`12`,y2:`12`,key:`bvdh0s`}],[`line`,{x1:`19`,x2:`22`,y1:`12`,y2:`12`,key:`1tbv5k`}],[`line`,{x1:`12`,x2:`12`,y1:`2`,y2:`5`,key:`11lu5j`}],[`line`,{x1:`12`,x2:`12`,y1:`19`,y2:`22`,key:`x3vr5v`}],[`circle`,{cx:`12`,cy:`12`,r:`7`,key:`fim9np`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),m=t(i(),1),h=e();function g({rules:e,activeFileName:t,embedded:n=!1,onRevealRule:i}){let[g,_]=(0,m.useState)(``),[v,y]=(0,m.useState)(!1),[b,x]=(0,m.useState)(null),[S,C]=(0,m.useState)(null),w=(0,m.useMemo)(()=>l(e),[e]),T=n?`global-route-preview-url`:`route-preview-url`;(0,m.useEffect)(()=>{if(!n)return;let e=window.requestAnimationFrame(()=>{document.getElementById(T)?.focus()});return()=>window.cancelAnimationFrame(e)},[n,T]);let E=(0,m.useCallback)(async()=>{let e=g.trim();if(!e){C(`请输入待预览的 URL`),x(null);return}y(!0),C(null);try{let t=await fetch(`/api/rules/preview`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({url:e,rulesText:w})}),n=await t.json();if(!t.ok)throw Error(n?.error||`预览失败`);x(n)}catch(e){x(null),C(e instanceof Error?e.message:`预览失败`)}finally{y(!1)}},[g,w]),D=(0,m.useCallback)(e=>{e.key===`Enter`&&E()},[E]);return(0,h.jsxs)(`div`,{className:n?`app-panel-content h-full`:`rounded-lg border bg-card p-4 space-y-3`,children:[(0,h.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,h.jsxs)(`div`,{className:`space-y-1`,children:[(0,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsx)(s,{className:`h-4 w-4 text-primary`}),(0,h.jsx)(`h3`,{className:`text-sm font-semibold`,children:`URL 预览`})]}),(0,h.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`输入一个请求 URL,后端会用当前编辑中的规则直接计算真实转发地址。`})]}),t&&(0,h.jsxs)(f,{variant:`outline`,className:`text-[11px] font-normal`,children:[(0,h.jsx)(u,{className:`h-3 w-3 mr-1`}),t]})]}),(0,h.jsxs)(`div`,{className:`flex gap-2`,children:[(0,h.jsx)(o,{id:T,value:g,onChange:e=>_(e.target.value),onKeyDown:D,placeholder:`https://solution.wps.cn/docs/price/detail.html?source=navbar`,className:`h-9 font-mono text-xs`}),(0,h.jsx)(r,{onClick:E,disabled:v,className:`h-9 shrink-0`,children:v?(0,h.jsx)(d,{className:`h-4 w-4 animate-spin`}):`预览`})]}),n&&(0,h.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`使用当前编辑区内尚未保存的规则进行计算,结果会与路由规则页的预览保持一致。`}),S&&(0,h.jsx)(`div`,{className:`rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800`,children:(0,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsx)(c,{className:`h-3.5 w-3.5 shrink-0`}),(0,h.jsx)(`span`,{children:S})]})}),b&&(0,h.jsxs)(`div`,{className:n?`min-h-0 flex-1 space-y-3 overflow-auto rounded-md border bg-muted/20 p-3`:`space-y-3 rounded-md border bg-muted/20 p-3`,children:[(0,h.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,h.jsx)(f,{className:b.matched?`bg-green-100 text-green-800 border-green-200`:`bg-blue-100 text-blue-800 border-blue-200`,children:b.matched?`已命中规则`:`未命中规则`}),b.matchedRule&&(0,h.jsx)(f,{variant:`outline`,className:`text-[11px] font-normal`,children:b.matchedRule.kind})]}),(0,h.jsxs)(`div`,{className:`space-y-1`,children:[(0,h.jsx)(`div`,{className:`text-[11px] uppercase tracking-wide text-muted-foreground`,children:`真实 URL`}),(0,h.jsx)(`div`,{className:`rounded-md border bg-background px-3 py-2 font-mono text-xs break-all`,children:b.resolvedUrl})]}),b.matchedRule&&(0,h.jsxs)(`div`,{className:`space-y-1`,children:[(0,h.jsx)(`div`,{className:`text-[11px] uppercase tracking-wide text-muted-foreground`,children:`命中规则`}),(0,h.jsxs)(`div`,{className:`flex items-stretch gap-2`,children:[(0,h.jsxs)(`div`,{className:`min-w-0 flex-1 rounded-md border bg-background px-3 py-2 font-mono text-xs break-all`,children:[b.matchedRule.pattern,(0,h.jsx)(`span`,{className:`text-muted-foreground`,children:` → `}),b.matchedRule.target]}),i&&(0,h.jsxs)(r,{type:`button`,variant:`outline`,size:`sm`,className:`h-auto shrink-0 gap-1.5 px-3 text-xs`,onClick:()=>b.matchedRule&&i(b.matchedRule),title:`在路由规则页面定位这条规则`,children:[(0,h.jsx)(p,{className:`h-3.5 w-3.5`}),`定位`]})]})]}),(0,h.jsxs)(`div`,{className:`space-y-1`,children:[(0,h.jsx)(`div`,{className:`text-[11px] uppercase tracking-wide text-muted-foreground`,children:`说明`}),(0,h.jsx)(`div`,{className:`space-y-1 rounded-md border bg-background px-3 py-2 text-xs`,children:b.notes.length>0?b.notes.map(e=>(0,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsx)(a,{className:`h-3 w-3 text-muted-foreground shrink-0`}),(0,h.jsx)(`span`,{children:e})]},e)):(0,h.jsx)(`span`,{className:`text-muted-foreground`,children:`无`})})]})]})]})}export{g as RoutePreview};
1
+ import{a as e,f as t,l as n,t as r,u as i}from"./button-BTToMaBW.js";import{t as a}from"./arrow-right-B4Mrlj2-.js";import{A as o,Q as s,W as c,a as l,lt as u,ot as d,z as f}from"./index-DTeCUv1G.js";var p=n(`locate-fixed`,[[`line`,{x1:`2`,x2:`5`,y1:`12`,y2:`12`,key:`bvdh0s`}],[`line`,{x1:`19`,x2:`22`,y1:`12`,y2:`12`,key:`1tbv5k`}],[`line`,{x1:`12`,x2:`12`,y1:`2`,y2:`5`,key:`11lu5j`}],[`line`,{x1:`12`,x2:`12`,y1:`19`,y2:`22`,key:`x3vr5v`}],[`circle`,{cx:`12`,cy:`12`,r:`7`,key:`fim9np`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),m=t(i(),1),h=e();function g({rules:e,activeFileName:t,embedded:n=!1,onRevealRule:i}){let[g,_]=(0,m.useState)(``),[v,y]=(0,m.useState)(!1),[b,x]=(0,m.useState)(null),[S,C]=(0,m.useState)(null),w=(0,m.useMemo)(()=>l(e),[e]),T=n?`global-route-preview-url`:`route-preview-url`;(0,m.useEffect)(()=>{if(!n)return;let e=window.requestAnimationFrame(()=>{document.getElementById(T)?.focus()});return()=>window.cancelAnimationFrame(e)},[n,T]);let E=(0,m.useCallback)(async()=>{let e=g.trim();if(!e){C(`请输入待预览的 URL`),x(null);return}y(!0),C(null);try{let t=await fetch(`/api/rules/preview`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({url:e,rulesText:w})}),n=await t.json();if(!t.ok)throw Error(n?.error||`预览失败`);x(n)}catch(e){x(null),C(e instanceof Error?e.message:`预览失败`)}finally{y(!1)}},[g,w]),D=(0,m.useCallback)(e=>{e.key===`Enter`&&E()},[E]);return(0,h.jsxs)(`div`,{className:n?`app-panel-content h-full`:`rounded-lg border bg-card p-4 space-y-3`,children:[(0,h.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,h.jsxs)(`div`,{className:`space-y-1`,children:[(0,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsx)(s,{className:`h-4 w-4 text-primary`}),(0,h.jsx)(`h3`,{className:`text-sm font-semibold`,children:`URL 预览`})]}),(0,h.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`输入一个请求 URL,后端会用当前编辑中的规则直接计算真实转发地址。`})]}),t&&(0,h.jsxs)(f,{variant:`outline`,className:`text-[11px] font-normal`,children:[(0,h.jsx)(u,{className:`h-3 w-3 mr-1`}),t]})]}),(0,h.jsxs)(`div`,{className:`flex gap-2`,children:[(0,h.jsx)(o,{id:T,value:g,onChange:e=>_(e.target.value),onKeyDown:D,placeholder:`https://solution.wps.cn/docs/price/detail.html?source=navbar`,className:`h-9 font-mono text-xs`}),(0,h.jsx)(r,{onClick:E,disabled:v,className:`h-9 shrink-0`,children:v?(0,h.jsx)(d,{className:`h-4 w-4 animate-spin`}):`预览`})]}),n&&(0,h.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:`使用当前编辑区内尚未保存的规则进行计算,结果会与路由规则页的预览保持一致。`}),S&&(0,h.jsx)(`div`,{className:`rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800`,children:(0,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsx)(c,{className:`h-3.5 w-3.5 shrink-0`}),(0,h.jsx)(`span`,{children:S})]})}),b&&(0,h.jsxs)(`div`,{className:n?`min-h-0 flex-1 space-y-3 overflow-auto rounded-md border bg-muted/20 p-3`:`space-y-3 rounded-md border bg-muted/20 p-3`,children:[(0,h.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,h.jsx)(f,{className:b.matched?`bg-green-100 text-green-800 border-green-200`:`bg-blue-100 text-blue-800 border-blue-200`,children:b.matched?`已命中规则`:`未命中规则`}),b.matchedRule&&(0,h.jsx)(f,{variant:`outline`,className:`text-[11px] font-normal`,children:b.matchedRule.kind})]}),(0,h.jsxs)(`div`,{className:`space-y-1`,children:[(0,h.jsx)(`div`,{className:`text-[11px] uppercase tracking-wide text-muted-foreground`,children:`真实 URL`}),(0,h.jsx)(`div`,{className:`rounded-md border bg-background px-3 py-2 font-mono text-xs break-all`,children:b.resolvedUrl})]}),b.matchedRule&&(0,h.jsxs)(`div`,{className:`space-y-1`,children:[(0,h.jsx)(`div`,{className:`text-[11px] uppercase tracking-wide text-muted-foreground`,children:`命中规则`}),(0,h.jsxs)(`div`,{className:`flex items-stretch gap-2`,children:[(0,h.jsxs)(`div`,{className:`min-w-0 flex-1 rounded-md border bg-background px-3 py-2 font-mono text-xs break-all`,children:[b.matchedRule.pattern,(0,h.jsx)(`span`,{className:`text-muted-foreground`,children:` → `}),b.matchedRule.target]}),i&&(0,h.jsxs)(r,{type:`button`,variant:`outline`,size:`sm`,className:`h-auto shrink-0 gap-1.5 px-3 text-xs`,onClick:()=>b.matchedRule&&i(b.matchedRule),title:`在路由规则页面定位这条规则`,children:[(0,h.jsx)(p,{className:`h-3.5 w-3.5`}),`定位`]})]})]}),(0,h.jsxs)(`div`,{className:`space-y-1`,children:[(0,h.jsx)(`div`,{className:`text-[11px] uppercase tracking-wide text-muted-foreground`,children:`说明`}),(0,h.jsx)(`div`,{className:`space-y-1 rounded-md border bg-background px-3 py-2 text-xs`,children:b.notes.length>0?b.notes.map(e=>(0,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsx)(a,{className:`h-3 w-3 text-muted-foreground shrink-0`}),(0,h.jsx)(`span`,{children:e})]},e)):(0,h.jsx)(`span`,{className:`text-muted-foreground`,children:`无`})})]})]})]})}export{g as RoutePreview};
@@ -1,4 +1,4 @@
1
- import{a as e,f as t,t as n,u as r}from"./button-BTToMaBW.js";import{t as i}from"./wand-sparkles-wkul5vje.js";import{i as a,o,r as s}from"./ai-config-store-DQXVJVn_.js";import{X as c,a as l,i as u,ot as d,z as f}from"./index-L7uWxTnp.js";import{n as p,t as m}from"./alert-COF-DIAE.js";import{t as h}from"./textarea-C6NooVK1.js";var g=t(r(),1);function _(e){return e.replace(/^```[a-z]*\n?/i,``).replace(/\n?```$/i,``).trim()}function v(){let e=s(),t=a(e);return t?{enabled:e.enabled,provider:t.provider,apiKey:t.apiKey,baseUrl:t.baseUrl,model:t.model}:e}function y(e,t){return{system:`你是 Meddle 的路由规则整理助手。你的任务是合并和精简用户的路由规则,在不改变语义的前提下尽量减少规则数量。
1
+ import{a as e,f as t,t as n,u as r}from"./button-BTToMaBW.js";import{t as i}from"./wand-sparkles-wkul5vje.js";import{i as a,o,r as s}from"./ai-config-store-DQXVJVn_.js";import{X as c,a as l,i as u,ot as d,z as f}from"./index-DTeCUv1G.js";import{n as p,t as m}from"./alert-COF-DIAE.js";import{t as h}from"./textarea-C6NooVK1.js";var g=t(r(),1);function _(e){return e.replace(/^```[a-z]*\n?/i,``).replace(/\n?```$/i,``).trim()}function v(){let e=s(),t=a(e);return t?{enabled:e.enabled,provider:t.provider,apiKey:t.apiKey,baseUrl:t.baseUrl,model:t.model}:e}function y(e,t){return{system:`你是 Meddle 的路由规则整理助手。你的任务是合并和精简用户的路由规则,在不改变语义的前提下尽量减少规则数量。
2
2
 
3
3
  请严格遵守以下要求:
4
4
  1. 只输出最终规则文本,不要输出解释、标题、Markdown 代码块或额外说明。
@@ -1,4 +1,4 @@
1
- import{a as e,d as t,f as n,l as r,n as i,t as a,u as o}from"./button-BTToMaBW.js";import{c as s}from"./dist-C6eaYCUo.js";import{n as c,t as l}from"./checkbox-DIBarrJx.js";import{t as u}from"./plus-tVxSydJ8.js";import{a as d,c as f,i as p,n as m,o as h,r as g,s as _,t as v}from"./dist-CxdY_A67.js";import"./es2015-CfXu88Y7.js";import{$ as y,A as b,B as x,G as S,H as C,I as w,L as T,M as E,O as D,P as O,R as k,S as A,U as j,a as M,ct as N,d as P,f as F,i as I,k as L,mt as R,n as ee,ot as z,p as te,r as B,u as ne,z as V}from"./index-L7uWxTnp.js";import{n as H}from"./syntax-highlight-DVhPdkuV.js";import{a as re,i as ie,n as ae,o as oe,r as U,t as se}from"./table-CT97lAYq.js";import{t as ce}from"./file-system-access-CtcvBfj4.js";var le=r(`arrow-up-to-line`,[[`path`,{d:`M5 3h14`,key:`7usisc`}],[`path`,{d:`m18 13-6-6-6 6`,key:`1kf1n9`}],[`path`,{d:`M12 7v14`,key:`1akyts`}]]),ue=r(`clipboard-paste`,[[`path`,{d:`M11 14h10`,key:`1w8e9d`}],[`path`,{d:`M16 4h2a2 2 0 0 1 2 2v1.344`,key:`1e62lh`}],[`path`,{d:`m17 18 4-4-4-4`,key:`z2g111`}],[`path`,{d:`M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 1.793-1.113`,key:`bjbb7m`}],[`rect`,{x:`8`,y:`2`,width:`8`,height:`4`,rx:`1`,key:`ublpy`}]]),de=r(`file-code-corner`,[[`path`,{d:`M4 12.15V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2h-3.35`,key:`1wthlu`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`m5 16-3 3 3 3`,key:`331omg`}],[`path`,{d:`m9 22 3-3-3-3`,key:`lsp7cz`}]]),fe=r(`folder-open`,[[`path`,{d:`m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2`,key:`usdka0`}]]),pe=r(`git-branch`,[[`line`,{x1:`6`,x2:`6`,y1:`3`,y2:`15`,key:`17qcm7`}],[`circle`,{cx:`18`,cy:`6`,r:`3`,key:`1h7g24`}],[`circle`,{cx:`6`,cy:`18`,r:`3`,key:`fqmcym`}],[`path`,{d:`M18 9a9 9 0 0 1-9 9`,key:`n2h4wq`}]]),me=r(`table-2`,[[`path`,{d:`M9 3H5a2 2 0 0 0-2 2v4m6-6h10a2 2 0 0 1 2 2v4M9 3v18m0 0h10a2 2 0 0 0 2-2V9M9 21H5a2 2 0 0 1-2-2V9m0 0h18`,key:`gugj83`}]]),he=r(`toggle-left`,[[`circle`,{cx:`9`,cy:`12`,r:`3`,key:`u3jwor`}],[`rect`,{width:`20`,height:`14`,x:`2`,y:`5`,rx:`7`,key:`g7kal2`}]]),ge=r(`toggle-right`,[[`circle`,{cx:`15`,cy:`12`,r:`3`,key:`1afu0r`}],[`rect`,{width:`20`,height:`14`,x:`2`,y:`5`,rx:`7`,key:`g7kal2`}]]),_e=t((e=>{var t=o();function n(e,t){return e===t&&(e!==0||1/e==1/t)||e!==e&&t!==t}var r=typeof Object.is==`function`?Object.is:n,i=t.useState,a=t.useEffect,s=t.useLayoutEffect,c=t.useDebugValue;function l(e,t){var n=t(),r=i({inst:{value:n,getSnapshot:t}}),o=r[0].inst,l=r[1];return s(function(){o.value=n,o.getSnapshot=t,u(o)&&l({inst:o})},[e,n,t]),a(function(){return u(o)&&l({inst:o}),e(function(){u(o)&&l({inst:o})})},[e]),c(n),n}function u(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!r(e,n)}catch{return!0}}function d(e,t){return t()}var f=typeof window>`u`||window.document===void 0||window.document.createElement===void 0?d:l;e.useSyncExternalStore=t.useSyncExternalStore===void 0?f:t.useSyncExternalStore})),ve=t(((e,t)=>{t.exports=_e()})),W=n(o()),G=e();function ye({className:e,...t}){return(0,G.jsx)(z,{role:`status`,"aria-label":`Loading`,className:i(`size-4 animate-spin`,e),...t})}var be=n(s());function xe(){var e=[...arguments];return(0,W.useMemo)(()=>t=>{e.forEach(e=>e(t))},e)}var Se=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;function Ce(e){let t=Object.prototype.toString.call(e);return t===`[object Window]`||t===`[object global]`}function we(e){return`nodeType`in e}function K(e){return e?Ce(e)?e:we(e)?e.ownerDocument?.defaultView??window:window:window}function Te(e){let{Document:t}=K(e);return e instanceof t}function Ee(e){return Ce(e)?!1:e instanceof K(e).HTMLElement}function De(e){return e instanceof K(e).SVGElement}function Oe(e){return e?Ce(e)?e.document:we(e)?Te(e)?e:Ee(e)||De(e)?e.ownerDocument:document:document:document}var ke=Se?W.useLayoutEffect:W.useEffect;function Ae(e){let t=(0,W.useRef)(e);return ke(()=>{t.current=e}),(0,W.useCallback)(function(){var e=[...arguments];return t.current==null?void 0:t.current(...e)},[])}function je(){let e=(0,W.useRef)(null);return[(0,W.useCallback)((t,n)=>{e.current=setInterval(t,n)},[]),(0,W.useCallback)(()=>{e.current!==null&&(clearInterval(e.current),e.current=null)},[])]}function Me(e,t){t===void 0&&(t=[e]);let n=(0,W.useRef)(e);return ke(()=>{n.current!==e&&(n.current=e)},t),n}function Ne(e,t){let n=(0,W.useRef)();return(0,W.useMemo)(()=>{let t=e(n.current);return n.current=t,t},[...t])}function Pe(e){let t=Ae(e),n=(0,W.useRef)(null);return[n,(0,W.useCallback)(e=>{e!==n.current&&t?.(e,n.current),n.current=e},[])]}function Fe(e){let t=(0,W.useRef)();return(0,W.useEffect)(()=>{t.current=e},[e]),t.current}var Ie={};function Le(e,t){return(0,W.useMemo)(()=>{if(t)return t;let n=Ie[e]==null?0:Ie[e]+1;return Ie[e]=n,e+`-`+n},[e,t])}function Re(e){return function(t){return[...arguments].slice(1).reduce((t,n)=>{let r=Object.entries(n);for(let[n,i]of r){let r=t[n];r!=null&&(t[n]=r+e*i)}return t},{...t})}}var ze=Re(1),Be=Re(-1);function Ve(e){return`clientX`in e&&`clientY`in e}function He(e){if(!e)return!1;let{KeyboardEvent:t}=K(e.target);return t&&e instanceof t}function Ue(e){if(!e)return!1;let{TouchEvent:t}=K(e.target);return t&&e instanceof t}function We(e){if(Ue(e)){if(e.touches&&e.touches.length){let{clientX:t,clientY:n}=e.touches[0];return{x:t,y:n}}else if(e.changedTouches&&e.changedTouches.length){let{clientX:t,clientY:n}=e.changedTouches[0];return{x:t,y:n}}}return Ve(e)?{x:e.clientX,y:e.clientY}:null}var Ge=Object.freeze({Translate:{toString(e){if(!e)return;let{x:t,y:n}=e;return`translate3d(`+(t?Math.round(t):0)+`px, `+(n?Math.round(n):0)+`px, 0)`}},Scale:{toString(e){if(!e)return;let{scaleX:t,scaleY:n}=e;return`scaleX(`+t+`) scaleY(`+n+`)`}},Transform:{toString(e){if(e)return[Ge.Translate.toString(e),Ge.Scale.toString(e)].join(` `)}},Transition:{toString(e){let{property:t,duration:n,easing:r}=e;return t+` `+n+`ms `+r}}}),Ke=`a,frame,iframe,input:not([type=hidden]):not(:disabled),select:not(:disabled),textarea:not(:disabled),button:not(:disabled),*[tabindex]`;function qe(e){return e.matches(Ke)?e:e.querySelector(Ke)}var Je={display:`none`};function Ye(e){let{id:t,value:n}=e;return W.createElement(`div`,{id:t,style:Je},n)}function Xe(e){let{id:t,announcement:n,ariaLiveType:r=`assertive`}=e;return W.createElement(`div`,{id:t,style:{position:`fixed`,top:0,left:0,width:1,height:1,margin:-1,border:0,padding:0,overflow:`hidden`,clip:`rect(0 0 0 0)`,clipPath:`inset(100%)`,whiteSpace:`nowrap`},role:`status`,"aria-live":r,"aria-atomic":!0},n)}function Ze(){let[e,t]=(0,W.useState)(``);return{announce:(0,W.useCallback)(e=>{e!=null&&t(e)},[]),announcement:e}}var Qe=(0,W.createContext)(null);function $e(e){let t=(0,W.useContext)(Qe);(0,W.useEffect)(()=>{if(!t)throw Error(`useDndMonitor must be used within a children of <DndContext>`);return t(e)},[e,t])}function et(){let[e]=(0,W.useState)(()=>new Set),t=(0,W.useCallback)(t=>(e.add(t),()=>e.delete(t)),[e]);return[(0,W.useCallback)(t=>{let{type:n,event:r}=t;e.forEach(e=>e[n]?.call(e,r))},[e]),t]}var tt={draggable:`
1
+ import{a as e,d as t,f as n,l as r,n as i,t as a,u as o}from"./button-BTToMaBW.js";import{c as s}from"./dist-C6eaYCUo.js";import{n as c,t as l}from"./checkbox-D0y07vOb.js";import{t as u}from"./plus-tVxSydJ8.js";import{a as d,c as f,i as p,n as m,o as h,r as g,s as _,t as v}from"./dist-CxdY_A67.js";import"./es2015-CfXu88Y7.js";import{$ as y,A as b,B as x,G as S,H as C,I as w,L as T,M as E,O as D,P as O,R as k,S as A,U as j,a as M,ct as N,d as P,f as F,i as I,k as L,mt as R,n as ee,ot as z,p as te,r as B,u as ne,z as V}from"./index-DTeCUv1G.js";import{n as H}from"./syntax-highlight-DVhPdkuV.js";import{a as re,i as ie,n as ae,o as oe,r as U,t as se}from"./table-CT97lAYq.js";import{t as ce}from"./file-system-access-CtcvBfj4.js";var le=r(`arrow-up-to-line`,[[`path`,{d:`M5 3h14`,key:`7usisc`}],[`path`,{d:`m18 13-6-6-6 6`,key:`1kf1n9`}],[`path`,{d:`M12 7v14`,key:`1akyts`}]]),ue=r(`clipboard-paste`,[[`path`,{d:`M11 14h10`,key:`1w8e9d`}],[`path`,{d:`M16 4h2a2 2 0 0 1 2 2v1.344`,key:`1e62lh`}],[`path`,{d:`m17 18 4-4-4-4`,key:`z2g111`}],[`path`,{d:`M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 1.793-1.113`,key:`bjbb7m`}],[`rect`,{x:`8`,y:`2`,width:`8`,height:`4`,rx:`1`,key:`ublpy`}]]),de=r(`file-code-corner`,[[`path`,{d:`M4 12.15V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2h-3.35`,key:`1wthlu`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`m5 16-3 3 3 3`,key:`331omg`}],[`path`,{d:`m9 22 3-3-3-3`,key:`lsp7cz`}]]),fe=r(`folder-open`,[[`path`,{d:`m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2`,key:`usdka0`}]]),pe=r(`git-branch`,[[`line`,{x1:`6`,x2:`6`,y1:`3`,y2:`15`,key:`17qcm7`}],[`circle`,{cx:`18`,cy:`6`,r:`3`,key:`1h7g24`}],[`circle`,{cx:`6`,cy:`18`,r:`3`,key:`fqmcym`}],[`path`,{d:`M18 9a9 9 0 0 1-9 9`,key:`n2h4wq`}]]),me=r(`table-2`,[[`path`,{d:`M9 3H5a2 2 0 0 0-2 2v4m6-6h10a2 2 0 0 1 2 2v4M9 3v18m0 0h10a2 2 0 0 0 2-2V9M9 21H5a2 2 0 0 1-2-2V9m0 0h18`,key:`gugj83`}]]),he=r(`toggle-left`,[[`circle`,{cx:`9`,cy:`12`,r:`3`,key:`u3jwor`}],[`rect`,{width:`20`,height:`14`,x:`2`,y:`5`,rx:`7`,key:`g7kal2`}]]),ge=r(`toggle-right`,[[`circle`,{cx:`15`,cy:`12`,r:`3`,key:`1afu0r`}],[`rect`,{width:`20`,height:`14`,x:`2`,y:`5`,rx:`7`,key:`g7kal2`}]]),_e=t((e=>{var t=o();function n(e,t){return e===t&&(e!==0||1/e==1/t)||e!==e&&t!==t}var r=typeof Object.is==`function`?Object.is:n,i=t.useState,a=t.useEffect,s=t.useLayoutEffect,c=t.useDebugValue;function l(e,t){var n=t(),r=i({inst:{value:n,getSnapshot:t}}),o=r[0].inst,l=r[1];return s(function(){o.value=n,o.getSnapshot=t,u(o)&&l({inst:o})},[e,n,t]),a(function(){return u(o)&&l({inst:o}),e(function(){u(o)&&l({inst:o})})},[e]),c(n),n}function u(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!r(e,n)}catch{return!0}}function d(e,t){return t()}var f=typeof window>`u`||window.document===void 0||window.document.createElement===void 0?d:l;e.useSyncExternalStore=t.useSyncExternalStore===void 0?f:t.useSyncExternalStore})),ve=t(((e,t)=>{t.exports=_e()})),W=n(o()),G=e();function ye({className:e,...t}){return(0,G.jsx)(z,{role:`status`,"aria-label":`Loading`,className:i(`size-4 animate-spin`,e),...t})}var be=n(s());function xe(){var e=[...arguments];return(0,W.useMemo)(()=>t=>{e.forEach(e=>e(t))},e)}var Se=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;function Ce(e){let t=Object.prototype.toString.call(e);return t===`[object Window]`||t===`[object global]`}function we(e){return`nodeType`in e}function K(e){return e?Ce(e)?e:we(e)?e.ownerDocument?.defaultView??window:window:window}function Te(e){let{Document:t}=K(e);return e instanceof t}function Ee(e){return Ce(e)?!1:e instanceof K(e).HTMLElement}function De(e){return e instanceof K(e).SVGElement}function Oe(e){return e?Ce(e)?e.document:we(e)?Te(e)?e:Ee(e)||De(e)?e.ownerDocument:document:document:document}var ke=Se?W.useLayoutEffect:W.useEffect;function Ae(e){let t=(0,W.useRef)(e);return ke(()=>{t.current=e}),(0,W.useCallback)(function(){var e=[...arguments];return t.current==null?void 0:t.current(...e)},[])}function je(){let e=(0,W.useRef)(null);return[(0,W.useCallback)((t,n)=>{e.current=setInterval(t,n)},[]),(0,W.useCallback)(()=>{e.current!==null&&(clearInterval(e.current),e.current=null)},[])]}function Me(e,t){t===void 0&&(t=[e]);let n=(0,W.useRef)(e);return ke(()=>{n.current!==e&&(n.current=e)},t),n}function Ne(e,t){let n=(0,W.useRef)();return(0,W.useMemo)(()=>{let t=e(n.current);return n.current=t,t},[...t])}function Pe(e){let t=Ae(e),n=(0,W.useRef)(null);return[n,(0,W.useCallback)(e=>{e!==n.current&&t?.(e,n.current),n.current=e},[])]}function Fe(e){let t=(0,W.useRef)();return(0,W.useEffect)(()=>{t.current=e},[e]),t.current}var Ie={};function Le(e,t){return(0,W.useMemo)(()=>{if(t)return t;let n=Ie[e]==null?0:Ie[e]+1;return Ie[e]=n,e+`-`+n},[e,t])}function Re(e){return function(t){return[...arguments].slice(1).reduce((t,n)=>{let r=Object.entries(n);for(let[n,i]of r){let r=t[n];r!=null&&(t[n]=r+e*i)}return t},{...t})}}var ze=Re(1),Be=Re(-1);function Ve(e){return`clientX`in e&&`clientY`in e}function He(e){if(!e)return!1;let{KeyboardEvent:t}=K(e.target);return t&&e instanceof t}function Ue(e){if(!e)return!1;let{TouchEvent:t}=K(e.target);return t&&e instanceof t}function We(e){if(Ue(e)){if(e.touches&&e.touches.length){let{clientX:t,clientY:n}=e.touches[0];return{x:t,y:n}}else if(e.changedTouches&&e.changedTouches.length){let{clientX:t,clientY:n}=e.changedTouches[0];return{x:t,y:n}}}return Ve(e)?{x:e.clientX,y:e.clientY}:null}var Ge=Object.freeze({Translate:{toString(e){if(!e)return;let{x:t,y:n}=e;return`translate3d(`+(t?Math.round(t):0)+`px, `+(n?Math.round(n):0)+`px, 0)`}},Scale:{toString(e){if(!e)return;let{scaleX:t,scaleY:n}=e;return`scaleX(`+t+`) scaleY(`+n+`)`}},Transform:{toString(e){if(e)return[Ge.Translate.toString(e),Ge.Scale.toString(e)].join(` `)}},Transition:{toString(e){let{property:t,duration:n,easing:r}=e;return t+` `+n+`ms `+r}}}),Ke=`a,frame,iframe,input:not([type=hidden]):not(:disabled),select:not(:disabled),textarea:not(:disabled),button:not(:disabled),*[tabindex]`;function qe(e){return e.matches(Ke)?e:e.querySelector(Ke)}var Je={display:`none`};function Ye(e){let{id:t,value:n}=e;return W.createElement(`div`,{id:t,style:Je},n)}function Xe(e){let{id:t,announcement:n,ariaLiveType:r=`assertive`}=e;return W.createElement(`div`,{id:t,style:{position:`fixed`,top:0,left:0,width:1,height:1,margin:-1,border:0,padding:0,overflow:`hidden`,clip:`rect(0 0 0 0)`,clipPath:`inset(100%)`,whiteSpace:`nowrap`},role:`status`,"aria-live":r,"aria-atomic":!0},n)}function Ze(){let[e,t]=(0,W.useState)(``);return{announce:(0,W.useCallback)(e=>{e!=null&&t(e)},[]),announcement:e}}var Qe=(0,W.createContext)(null);function $e(e){let t=(0,W.useContext)(Qe);(0,W.useEffect)(()=>{if(!t)throw Error(`useDndMonitor must be used within a children of <DndContext>`);return t(e)},[e,t])}function et(){let[e]=(0,W.useState)(()=>new Set),t=(0,W.useCallback)(t=>(e.add(t),()=>e.delete(t)),[e]);return[(0,W.useCallback)(t=>{let{type:n,event:r}=t;e.forEach(e=>e[n]?.call(e,r))},[e]),t]}var tt={draggable:`
2
2
  To pick up a draggable item, press the space bar.
3
3
  While dragging, use the arrow keys to move the item.
4
4
  Press space again to drop the item in its new position, or press escape to cancel.