@jonathanleelx/meddle 0.5.0-beta.18 → 0.5.0-beta.19

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 (143) hide show
  1. package/bin/lib/file-access.js +41 -24
  2. package/dist/core/custom-plugin-loader.d.ts.map +1 -1
  3. package/dist/core/custom-plugin-loader.js +2 -0
  4. package/dist/core/custom-plugin-loader.js.map +1 -1
  5. package/dist/core/mock-handler.d.ts +33 -0
  6. package/dist/core/mock-handler.d.ts.map +1 -1
  7. package/dist/core/mock-handler.js +284 -25
  8. package/dist/core/mock-handler.js.map +1 -1
  9. package/dist/core/mock-utils.d.ts +28 -0
  10. package/dist/core/mock-utils.d.ts.map +1 -1
  11. package/dist/core/mock-utils.js +50 -0
  12. package/dist/core/mock-utils.js.map +1 -1
  13. package/dist/core/plugin-bootstrap-runner.d.ts +1 -0
  14. package/dist/core/plugin-bootstrap-runner.d.ts.map +1 -1
  15. package/dist/core/plugin-bootstrap-runner.js +37 -1
  16. package/dist/core/plugin-bootstrap-runner.js.map +1 -1
  17. package/dist/core/plugin-source.d.ts +24 -0
  18. package/dist/core/plugin-source.d.ts.map +1 -0
  19. package/dist/core/plugin-source.js +47 -0
  20. package/dist/core/plugin-source.js.map +1 -0
  21. package/dist/core/types.d.ts +7 -0
  22. package/dist/core/types.d.ts.map +1 -1
  23. package/dist/server/app-info.d.ts +19 -0
  24. package/dist/server/app-info.d.ts.map +1 -0
  25. package/dist/server/app-info.js +84 -0
  26. package/dist/server/app-info.js.map +1 -0
  27. package/dist/server/config.d.ts +1 -0
  28. package/dist/server/config.d.ts.map +1 -1
  29. package/dist/server/config.js +23 -3
  30. package/dist/server/config.js.map +1 -1
  31. package/dist/server/health.d.ts.map +1 -1
  32. package/dist/server/health.js +8 -0
  33. package/dist/server/health.js.map +1 -1
  34. package/dist/server/index.d.ts +14 -0
  35. package/dist/server/index.d.ts.map +1 -1
  36. package/dist/server/index.js +2 -0
  37. package/dist/server/index.js.map +1 -1
  38. package/dist/server/mocks.d.ts +23 -0
  39. package/dist/server/mocks.d.ts.map +1 -1
  40. package/dist/server/mocks.js +107 -13
  41. package/dist/server/mocks.js.map +1 -1
  42. package/dist/server/plugins.d.ts.map +1 -1
  43. package/dist/server/plugins.js +56 -11
  44. package/dist/server/plugins.js.map +1 -1
  45. package/index.js +16 -3
  46. package/package.json +1 -1
  47. package/web/dist/assets/alert-BmsRCcSL.js +1 -0
  48. package/web/dist/assets/arrow-right-BNum_060.js +1 -0
  49. package/web/dist/assets/{body-diff-view-BsgpSjQv.js → body-diff-view-ByCHr9bv.js} +2 -2
  50. package/web/dist/assets/{button-yArHqw81.js → button-BFNlGZ5p.js} +1 -1
  51. package/web/dist/assets/check-BkfHQ6re.js +1 -0
  52. package/web/dist/assets/checkbox-v2kzp7K8.js +1 -0
  53. package/web/dist/assets/chevron-down-DHwUtL4O.js +1 -0
  54. package/web/dist/assets/{circle-alert-DAWy5HuM.js → circle-alert-zMagrFuI.js} +1 -1
  55. package/web/dist/assets/{circle-x-BjSs1hQK.js → circle-x-BEkinhez.js} +1 -1
  56. package/web/dist/assets/code-DD-AYxxu.js +1 -0
  57. package/web/dist/assets/{copy-qMUl4peN.js → copy-BRnscYy1.js} +1 -1
  58. package/web/dist/assets/{detail-panel-DSDekH6Z.js → detail-panel-DyvoHlCG.js} +3 -3
  59. package/web/dist/assets/dist-BCvvYbmI.js +1 -0
  60. package/web/dist/assets/dist-BNcjMpca.js +1 -0
  61. package/web/dist/assets/{dist-CjLkNKST.js → dist-C-E2R2jk.js} +1 -1
  62. package/web/dist/assets/{dist-CwP5Ad1_.js → dist-CFZ4xMSF.js} +1 -1
  63. package/web/dist/assets/{dist-DGuRBXW6.js → dist-CRmX_NvH.js} +1 -1
  64. package/web/dist/assets/dist-DD7AvbXP.js +1 -0
  65. package/web/dist/assets/dist-LiAcI8CK.js +1 -0
  66. package/web/dist/assets/dist-UcOFuoN0.js +5 -0
  67. package/web/dist/assets/{dist-D2vbXHYx.js → dist-YM3jbhT-.js} +1 -1
  68. package/web/dist/assets/{editor-pane-actions-BAh-C02t.js → editor-pane-actions-DN-pxFsl.js} +1 -1
  69. package/web/dist/assets/es2015-CRmLuA2o.js +41 -0
  70. package/web/dist/assets/{global-panel-shell-CadrLZYn.js → global-panel-shell-BJaQ_VLp.js} +4 -4
  71. package/web/dist/assets/health-panel-BnxNCGvw.js +1 -0
  72. package/web/dist/assets/index-Bu3zaxzE.js +18 -0
  73. package/web/dist/assets/index-D9jGD_NA.css +2 -0
  74. package/web/dist/assets/mobile-proxy-panel-BxJ8OmLu.js +8 -0
  75. package/web/dist/assets/mock-config-Dp2D5iiv.js +1 -0
  76. package/web/dist/assets/mock-editor-panel-zqouxTGb.js +20 -0
  77. package/web/dist/assets/mocks-file-missing-note-B8TTBWtG.js +1 -0
  78. package/web/dist/assets/{monaco-editor-CLApq_Ip.js → monaco-editor-DeJNlo9k.js} +2 -2
  79. package/web/dist/assets/pane-split-Db1aWKUO.js +1 -0
  80. package/web/dist/assets/panel-heading-BAI_lNmT.js +1 -0
  81. package/web/dist/assets/{pencil-line-jiAfwHPx.js → pencil-line-CEZ7D-de.js} +1 -1
  82. package/web/dist/assets/plugin-code-editor-CQqpaaCR.js +2 -0
  83. package/web/dist/assets/plugin-config-CjcRhSZm.js +2 -0
  84. package/web/dist/assets/plugin-generator-Cr_gk3Tp.js +2 -0
  85. package/web/dist/assets/plugin-test-dialog-B5mVM3XE.js +7 -0
  86. package/web/dist/assets/plus-ixZQRprm.js +1 -0
  87. package/web/dist/assets/{refresh-cw-DdzbeDXU.js → refresh-cw-BfLoHqg5.js} +1 -1
  88. package/web/dist/assets/rotate-ccw-CRguJya4.js +1 -0
  89. package/web/dist/assets/route-preview-BZ3vhvsc.js +1 -0
  90. package/web/dist/assets/{rule-ai-assistant-panel-BwcsnKPL.js → rule-ai-assistant-panel-DfivYxZH.js} +2 -2
  91. package/web/dist/assets/rule-config-DSX8bBHe.js +15 -0
  92. package/web/dist/assets/rule-overview-panel-D5gY3akK.js +1 -0
  93. package/web/dist/assets/{server-CktUTlNz.js → server-eYXq3PbE.js} +1 -1
  94. package/web/dist/assets/settings-panel-Bfzfsovk.js +1 -0
  95. package/web/dist/assets/{shield-check-UHsTa1Dy.js → shield-check-hQXjdfZ7.js} +1 -1
  96. package/web/dist/assets/smartphone-D4Q7cQfm.js +1 -0
  97. package/web/dist/assets/switch-DpLnRvOJ.js +1 -0
  98. package/web/dist/assets/{syntax-highlight-mzmpJVhp.js → syntax-highlight-EJCxGikd.js} +1 -1
  99. package/web/dist/assets/{table-2-BE3hfnr0.js → table-2-DvGHhMm4.js} +1 -1
  100. package/web/dist/assets/table-C3mgEjkP.js +1 -0
  101. package/web/dist/assets/{textarea-3G4iMpe_.js → textarea-BjWF0pk4.js} +1 -1
  102. package/web/dist/assets/{wand-sparkles-B9ZnNs8E.js → wand-sparkles-DDGjzjnX.js} +1 -1
  103. package/web/dist/assets/{wifi-fTyrNPN8.js → wifi-QkTcTrED.js} +1 -1
  104. package/web/dist/assets/{zap-h2l6wVxY.js → zap-CEVoVkAg.js} +1 -1
  105. package/web/dist/index.html +17 -14
  106. package/web/dist/assets/alert-VYHxU7hf.js +0 -1
  107. package/web/dist/assets/arrow-right-DGB2MxsX.js +0 -1
  108. package/web/dist/assets/check-ByTjANaY.js +0 -1
  109. package/web/dist/assets/checkbox-Cz2-SWCV.js +0 -1
  110. package/web/dist/assets/chevron-down-vKjBY-BY.js +0 -1
  111. package/web/dist/assets/code-DAB_mRnu.js +0 -1
  112. package/web/dist/assets/dist-BW-gQyc_.js +0 -5
  113. package/web/dist/assets/dist-CymFeFOA.js +0 -1
  114. package/web/dist/assets/es2015-BiaNLfVn.js +0 -41
  115. package/web/dist/assets/health-panel-C1l1UYhP.js +0 -1
  116. package/web/dist/assets/index-BSIqySKG.css +0 -2
  117. package/web/dist/assets/index-F8M6NlaE.js +0 -18
  118. package/web/dist/assets/mobile-proxy-panel-DPvkiTMH.js +0 -8
  119. package/web/dist/assets/mock-config-nmYcctYW.js +0 -1
  120. package/web/dist/assets/mock-editor-panel-BlY81zhQ.js +0 -20
  121. package/web/dist/assets/pane-split-HuLbAVKX.js +0 -1
  122. package/web/dist/assets/panel-heading-0g2lYNqi.js +0 -1
  123. package/web/dist/assets/plugin-code-editor-CoXaIHMU.js +0 -2
  124. package/web/dist/assets/plugin-config-D3N-Ri5Z.js +0 -2
  125. package/web/dist/assets/plugin-generator-DyLJaca1.js +0 -2
  126. package/web/dist/assets/plugin-test-dialog-usuwZXfx.js +0 -7
  127. package/web/dist/assets/plus-BdrJey8J.js +0 -1
  128. package/web/dist/assets/rotate-ccw-_UaUgje4.js +0 -1
  129. package/web/dist/assets/route-preview-BFGlyZUy.js +0 -1
  130. package/web/dist/assets/rule-config-BTW8N6k2.js +0 -15
  131. package/web/dist/assets/rule-overview-panel-BB40JxzX.js +0 -1
  132. package/web/dist/assets/settings-panel-T2H_IWdm.js +0 -1
  133. package/web/dist/assets/smartphone-D5HBDIeh.js +0 -1
  134. package/web/dist/assets/switch-IUacG_eP.js +0 -1
  135. package/web/dist/assets/table-C5seB8Am.js +0 -1
  136. /package/web/dist/assets/{ai-config-store-pCWI7jgN.js → ai-config-store-B_VpGvwx.js} +0 -0
  137. /package/web/dist/assets/{babel-CvZe7MdW.js → babel-D1quDdNt.js} +0 -0
  138. /package/web/dist/assets/{clipboard-B46WvJwc.js → clipboard-DUgC_tNv.js} +0 -0
  139. /package/web/dist/assets/{dist-DQDFV3o1.js → dist-Bq2klZ3g.js} +0 -0
  140. /package/web/dist/assets/{estree-B2B6FyMe.js → estree--Vq99DGn.js} +0 -0
  141. /package/web/dist/assets/{html-Br6k1zjS.js → html-D2PZBPnP.js} +0 -0
  142. /package/web/dist/assets/{postcss-C5G0ZFoV.js → postcss-DfIslWug.js} +0 -0
  143. /package/web/dist/assets/{standalone-D2u92lem.js → standalone-D-fjaAIs.js} +0 -0
@@ -1 +0,0 @@
1
- import{f as e,s as t,t as n,u as r}from"./button-yArHqw81.js";import"./dist-CwP5Ad1_.js";import{t as i}from"./refresh-cw-DdzbeDXU.js";import{t as ee}from"./table-2-BE3hfnr0.js";import{A as a,F as o,G as s,I as c,J as l,M as u,N as d,P as f,U as te,W as p,Y as m,j as h,mt as g,nt as _,o as v,ut as y,yt as b}from"./index-F8M6NlaE.js";import{a as x,i as S,n as C,o as w,r as T,t as E}from"./table-C5seB8Am.js";var D=e(r(),1),O=t(),k=`border-l-2 border-l-transparent`,A=`text-muted-foreground opacity-75`;function j(e){return e.length>0?e.map(e=>`!${e}`).join(` `):`—`}function M({rules:e,activeFileName:t,onLocateRule:r,onSelectFile:M}){let[N,ne]=(0,D.useState)(null),[P,F]=(0,D.useState)(!0),[I,L]=(0,D.useState)(null),[R,z]=(0,D.useState)(`merged`),[B,V]=(0,D.useState)(``),H=(0,D.useDeferredValue)(B),U=(0,D.useCallback)(async()=>{F(!0),L(null);try{let e=await fetch(`/api/rule-files/overview`);if(!e.ok)throw Error(`加载失败(${e.status})`);ne(await e.json())}catch(e){L(e instanceof Error?e.message:`加载失败`)}finally{F(!1)}},[]);(0,D.useEffect)(()=>{U()},[U]);let W=(0,D.useMemo)(()=>N?.perFileRules.find(e=>e.name===t)??null,[N,t]),G=(0,D.useMemo)(()=>{if(!W||W.error)return!1;let t=W.rules.map(e=>({rule:e.rawRule,target:e.rawTarget,enabled:e.enabled,exclusions:e.exclusions}));return v(e)!==v(t)},[W,e]),K=(0,D.useMemo)(()=>{let e=new Map;for(let t of N?.conflicts??[])e.set(t.pattern,t);return e},[N]),q=(0,D.useCallback)(e=>{let t=H.trim().toLowerCase();return t?e.some(e=>e&&e.toLowerCase().includes(t)):!0},[H]),J=(0,D.useMemo)(()=>(N?.mergedRules??[]).map(e=>({winner:e,shadowed:K.get(e.pattern)?.shadowed??[]})).filter(({winner:e,shadowed:t})=>q([e.rawRule,e.rawTarget,e.file])||t.some(e=>q([e.rawRule,e.rawTarget,e.file]))),[N,K,q]),Y=N?.mergedRules.length??0,X=N?.conflicts.reduce((e,t)=>e+t.shadowed.length,0)??0,Z=(0,D.useMemo)(()=>(N?.perFileRules??[]).map(e=>({...e,matched:e.rules.filter(t=>q([t.rawRule,t.rawTarget,e.name]))})).filter(e=>e.error!=null||q([e.name])||e.matched.length>0),[N,q]),re=N?.perFileRules.reduce((e,t)=>e+t.rules.length,0)??0,ie=Z.reduce((e,t)=>e+t.matched.length,0),Q=(0,D.useCallback)((e,t,n)=>{r(e,t,n)},[r]),ae=(0,D.useCallback)((e,t)=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),M(t))},[M]),oe=()=>{if(P)return(0,O.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col gap-2 p-2`,children:[(0,O.jsx)(m,{className:`h-8 w-full`}),(0,O.jsx)(m,{className:`h-8 w-full`}),(0,O.jsx)(m,{className:`h-8 w-3/4`})]});if(I)return(0,O.jsxs)(h,{className:`min-h-0 flex-1`,children:[(0,O.jsxs)(f,{children:[(0,O.jsx)(o,{variant:`icon`,children:(0,O.jsx)(_,{})}),(0,O.jsx)(c,{children:`加载失败`}),(0,O.jsx)(d,{children:I})]}),(0,O.jsx)(u,{children:(0,O.jsxs)(n,{variant:`outline`,onClick:()=>void U(),children:[(0,O.jsx)(i,{"data-icon":`inline-start`}),`重试`]})})]});let e=(N?.files.length??0)>0,t=N?.perFileRules.some(e=>e.rules.length>0||e.error!=null)??!1,r=H.trim().length>0;return e?t?R===`merged`&&!r&&(N?.mergedRules.length??0)===0?(0,O.jsx)(h,{className:`min-h-0 flex-1`,children:(0,O.jsxs)(f,{children:[(0,O.jsx)(o,{variant:`icon`,children:(0,O.jsx)(g,{})}),(0,O.jsx)(c,{children:`没有生效中的规则`}),(0,O.jsx)(d,{children:`规则全部被禁用,或没有启用任何规则文件;切换到「按文件」查看全部规则`})]})}):r&&R===`merged`&&J.length===0||r&&R===`files`&&Z.every(e=>e.matched.length===0&&e.error==null)?$():R===`merged`?se():ce():(0,O.jsx)(h,{className:`min-h-0 flex-1`,children:(0,O.jsxs)(f,{children:[(0,O.jsx)(o,{variant:`icon`,children:(0,O.jsx)(b,{})}),(0,O.jsx)(c,{children:`所有规则文件都是空的`}),(0,O.jsx)(d,{children:`还没有任何路由规则,先去路由规则页添加一条吧`})]})}):(0,O.jsx)(h,{className:`min-h-0 flex-1`,children:(0,O.jsxs)(f,{children:[(0,O.jsx)(o,{variant:`icon`,children:(0,O.jsx)(ee,{})}),(0,O.jsx)(c,{children:`还没有规则文件`}),(0,O.jsx)(d,{children:`在路由规则页点击「+」创建第一个规则文件`})]})})},$=()=>(0,O.jsxs)(h,{className:`min-h-0 flex-1`,children:[(0,O.jsxs)(f,{children:[(0,O.jsx)(o,{variant:`icon`,children:(0,O.jsx)(y,{})}),(0,O.jsx)(c,{children:`无匹配结果`}),(0,O.jsxs)(d,{children:[`没有找到符合「`,H.trim(),`」的规则`]})]}),(0,O.jsx)(u,{children:(0,O.jsx)(n,{variant:`outline`,onClick:()=>V(``),children:`清空筛选`})})]}),se=()=>(0,O.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden rounded-md border`,children:[(0,O.jsx)(`div`,{className:`meddle-thin-scroll shrink-0 overflow-x-auto bg-card`,children:(0,O.jsxs)(E,{className:`table-fixed`,children:[(0,O.jsxs)(`colgroup`,{children:[(0,O.jsx)(`col`,{style:{width:`6rem`}}),(0,O.jsx)(`col`,{}),(0,O.jsx)(`col`,{style:{width:`8rem`}}),(0,O.jsx)(`col`,{})]}),(0,O.jsx)(x,{children:(0,O.jsxs)(w,{children:[(0,O.jsx)(S,{children:`来源`}),(0,O.jsx)(S,{children:`规则`}),(0,O.jsx)(S,{className:`hidden md:table-cell`,children:`排除`}),(0,O.jsx)(S,{children:`目标`})]})})]})}),(0,O.jsx)(a,{className:`min-h-0 flex-1`,children:(0,O.jsxs)(E,{className:`table-fixed`,children:[(0,O.jsxs)(`colgroup`,{children:[(0,O.jsx)(`col`,{style:{width:`6rem`}}),(0,O.jsx)(`col`,{}),(0,O.jsx)(`col`,{style:{width:`8rem`}}),(0,O.jsx)(`col`,{})]}),(0,O.jsx)(C,{children:J.map(({winner:e,shadowed:t})=>(0,O.jsxs)(D.Fragment,{children:[(0,O.jsxs)(w,{className:`${k} cursor-pointer`,onClick:()=>Q(e.file,e.rawRule,e.rawTarget),title:`点击定位到该规则`,children:[(0,O.jsx)(T,{className:`truncate text-xs text-muted-foreground`,children:e.file}),(0,O.jsxs)(T,{className:`break-all font-mono text-xs`,children:[e.rawRule,t.length>0&&(0,O.jsx)(s,{variant:`default`,className:`ml-2 px-1 py-0 text-[10px]`,title:`同名规则最终生效的定义`,children:`生效`})]}),(0,O.jsx)(T,{className:`hidden break-all font-mono text-xs text-muted-foreground md:table-cell`,children:j(e.exclusions)}),(0,O.jsx)(T,{className:`break-all font-mono text-xs`,children:e.rawTarget})]}),t.map((t,n)=>(0,O.jsxs)(w,{className:`${k} cursor-pointer ${A}`,onClick:()=>Q(t.file,t.rawRule,t.rawTarget),title:`点击定位到该规则`,children:[(0,O.jsx)(T,{className:`truncate text-xs`,children:t.file}),(0,O.jsx)(T,{className:`break-all font-mono text-xs`,children:(0,O.jsxs)(`span`,{className:`inline-flex flex-wrap items-center gap-1.5`,children:[t.rawRule,(0,O.jsx)(s,{variant:`destructive`,className:`px-1 py-0 text-[10px]`,title:`已被 ${e.file} 中的同名规则覆盖,实际不生效`,children:`已被覆盖`})]})}),(0,O.jsx)(T,{className:`hidden break-all font-mono text-xs md:table-cell`,children:`—`}),(0,O.jsx)(T,{className:`break-all font-mono text-xs`,children:t.rawTarget})]},`merged-shadowed-${n}`))]},`merged-group-${e.pattern}`))})]})})]}),ce=()=>(0,O.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden rounded-md border`,children:[(0,O.jsx)(`div`,{className:`meddle-thin-scroll shrink-0 overflow-x-auto bg-card`,children:(0,O.jsxs)(E,{className:`table-fixed`,children:[(0,O.jsxs)(`colgroup`,{children:[(0,O.jsx)(`col`,{style:{width:`3.5rem`}}),(0,O.jsx)(`col`,{}),(0,O.jsx)(`col`,{style:{width:`8rem`}}),(0,O.jsx)(`col`,{})]}),(0,O.jsx)(x,{children:(0,O.jsxs)(w,{children:[(0,O.jsx)(S,{children:`状态`}),(0,O.jsx)(S,{children:`规则`}),(0,O.jsx)(S,{className:`hidden md:table-cell`,children:`排除`}),(0,O.jsx)(S,{children:`目标`})]})})]})}),(0,O.jsx)(a,{className:`min-h-0 flex-1`,children:(0,O.jsxs)(E,{className:`table-fixed`,children:[(0,O.jsxs)(`colgroup`,{children:[(0,O.jsx)(`col`,{style:{width:`3.5rem`}}),(0,O.jsx)(`col`,{}),(0,O.jsx)(`col`,{style:{width:`8rem`}}),(0,O.jsx)(`col`,{})]}),(0,O.jsx)(C,{children:Z.map(e=>(0,O.jsxs)(D.Fragment,{children:[(0,O.jsx)(w,{className:`hover:bg-accent/60`,children:(0,O.jsx)(T,{colSpan:4,className:`cursor-pointer bg-muted/50 p-2 align-middle`,role:`button`,tabIndex:0,onClick:()=>M(e.name),onKeyDown:t=>ae(t,e.name),title:`点击切换到该规则文件`,children:(0,O.jsxs)(`span`,{className:`flex flex-wrap items-center gap-2 font-medium`,children:[e.name,(0,O.jsx)(s,{variant:e.enabled?`default`:`secondary`,className:`px-1 py-0 text-[10px]`,children:e.enabled?`启用`:`禁用`}),(0,O.jsx)(s,{variant:`secondary`,className:`px-1 py-0 text-[10px]`,children:e.rules.length})]})})}),e.error&&(0,O.jsx)(w,{className:`text-destructive`,children:(0,O.jsx)(T,{colSpan:4,className:`p-2 text-xs`,children:(0,O.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(_,{className:`h-3.5 w-3.5 shrink-0`}),`读取失败:`,e.error]})})}),e.matched.map((t,n)=>(0,O.jsxs)(w,{className:`cursor-pointer ${t.enabled?``:`opacity-60`}`,onClick:()=>Q(e.name,t.rawRule,t.rawTarget),title:`点击定位到该规则`,children:[(0,O.jsx)(T,{children:(0,O.jsx)(s,{variant:t.enabled?`default`:`secondary`,className:`px-1 py-0 text-[10px]`,children:t.enabled?`启用`:`禁用`})}),(0,O.jsx)(T,{className:`break-all font-mono text-xs`,children:t.rawRule}),(0,O.jsx)(T,{className:`hidden break-all font-mono text-xs text-muted-foreground md:table-cell`,children:j(t.exclusions)}),(0,O.jsx)(T,{className:`break-all font-mono text-xs ${t.enabled?``:`line-through`}`,children:t.rawTarget})]},`file-rule-${n}`))]},`file-group-${e.name}`))})]})})]}),le=R===`merged`?Y+X:re,ue=R===`merged`?J.reduce((e,t)=>e+1+t.shadowed.length,0):ie;return(0,O.jsxs)(`div`,{className:`app-panel-content flex h-full flex-col gap-3`,children:[(0,O.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,O.jsxs)(te,{type:`single`,value:R,onValueChange:e=>{e&&z(e)},variant:`outline`,size:`sm`,className:`bg-background`,"aria-label":`总览视图`,children:[(0,O.jsx)(p,{value:`merged`,children:`生效规则`}),(0,O.jsx)(p,{value:`files`,children:`按文件`})]}),(0,O.jsxs)(`div`,{className:`relative min-w-40 flex-1`,children:[(0,O.jsx)(y,{className:`pointer-events-none absolute top-1/2 left-2 h-4 w-4 -translate-y-1/2 text-muted-foreground`}),(0,O.jsx)(l,{value:B,onChange:e=>V(e.target.value),placeholder:`搜索规则 / 目标 / 文件名`,className:`h-8 pl-8`,"aria-label":`搜索规则`})]}),(0,O.jsx)(n,{type:`button`,variant:`ghost`,size:`icon-sm`,onClick:()=>void U(),disabled:P,"aria-label":`刷新总览`,title:`刷新`,children:(0,O.jsx)(i,{})})]}),G&&(0,O.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800`,children:[(0,O.jsx)(_,{className:`h-3.5 w-3.5 shrink-0`}),(0,O.jsxs)(`span`,{children:[`「`,t,`」有未保存修改,此处展示的是代理当前使用的`,(0,O.jsx)(`b`,{children:`已保存内容`})]})]}),!P&&!I&&(N?.files.length??0)>0&&(0,O.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 text-xs text-muted-foreground`,children:[(0,O.jsxs)(`span`,{children:[ue,` / `,le,` 条`,R===`merged`&&H.trim()===``&&X>0?`,其中 ${X} 条被同名规则覆盖`:``]}),R===`merged`&&(0,O.jsx)(`span`,{children:`按代理实际生效顺序排列(后定义覆盖先定义)`}),R===`files`&&(0,O.jsx)(`span`,{children:`点击文件名切换到该文件`})]}),oe()]})}export{M as RuleOverviewPanel};
@@ -1 +0,0 @@
1
- import{f as e,l as t,s as n,t as r,u as i}from"./button-yArHqw81.js";import"./dist-CwP5Ad1_.js";import{t as ee}from"./check-ByTjANaY.js";import{t as a}from"./circle-alert-DAWy5HuM.js";import{t as o}from"./circle-x-BjSs1hQK.js";import{t as s}from"./plus-BdrJey8J.js";import{t as te}from"./refresh-cw-DdzbeDXU.js";import{t as ne}from"./rotate-ccw-_UaUgje4.js";import{t as c}from"./smartphone-D5HBDIeh.js";import"./es2015-BiaNLfVn.js";import{t as re}from"./switch-IUacG_eP.js";import{a as l,c as ie,l as ae,n as oe,o as se,r as u,s as ce,t as le}from"./ai-config-store-pCWI7jgN.js";import{B as d,C as ue,Ct as f,E as p,Et as m,G as de,H as fe,J as h,L as pe,R as me,S as g,T as he,U as _,V as ge,W as v,_ as _e,_t as ve,b as ye,c as be,ct as xe,d as y,dt as b,f as Se,g as x,gt as Ce,l as we,lt as Te,m as S,ot as Ee,p as De,rt as C,s as Oe,u as w,v as ke,w as T,x as Ae,y as je,z as E}from"./index-F8M6NlaE.js";import{n as Me,r as Ne,t as Pe}from"./alert-VYHxU7hf.js";var Fe=t(`eye-off`,[[`path`,{d:`M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49`,key:`ct8e1f`}],[`path`,{d:`M14.084 14.158a3 3 0 0 1-4.242-4.242`,key:`151rxh`}],[`path`,{d:`M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143`,key:`13bj9a`}],[`path`,{d:`m2 2 20 20`,key:`1ooewy`}]]),Ie=t(`eye`,[[`path`,{d:`M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0`,key:`1nclc0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),D=t(`stethoscope`,[[`path`,{d:`M11 2v2`,key:`1539x4`}],[`path`,{d:`M5 2v2`,key:`1yf1q8`}],[`path`,{d:`M5 3H4a2 2 0 0 0-2 2v4a6 6 0 0 0 12 0V5a2 2 0 0 0-2-2h-1`,key:`rb5t3r`}],[`path`,{d:`M8 15a6 6 0 0 0 12 0v-3`,key:`x18d4x`}],[`circle`,{cx:`20`,cy:`10`,r:`2`,key:`ts1r5v`}]]),O=e(i(),1),k=n(),Le=[{value:`75`,label:`75%`,scale:.75},{value:`90`,label:`90%`,scale:.9},{value:`100`,label:`100%`,scale:1},{value:`110`,label:`110%`,scale:1.1},{value:`125`,label:`125%`,scale:1.25},{value:`150`,label:`150%`,scale:1.5}],Re=[{value:`auto`,label:`自动`,color:`linear-gradient(135deg, oklch(0.623 0.214 259.815), oklch(0.606 0.25 292.717))`},{value:`neutral`,label:`中性`,color:`oklch(0.556 0 0)`},{value:`blue`,label:`蓝色`,color:`oklch(0.623 0.214 259.815)`},{value:`violet`,label:`紫色`,color:`oklch(0.606 0.25 292.717)`},{value:`green`,label:`绿色`,color:`oklch(0.627 0.194 149.214)`},{value:`orange`,label:`橙色`,color:`oklch(0.646 0.222 41.116)`},{value:`rose`,label:`玫红`,color:`oklch(0.645 0.246 16.439)`}],A=`app-panel-content mt-0`,j=`app-field-group`,M=`app-section`,N=e=>{if(!e)return`100`;let t={small:`90`,medium:`100`,large:`110`};return e in t?t[e]:Le.some(t=>t.value===e)?e:`100`};function ze({open:e=!1,onOpenChange:t,embedded:n=!1}){let{theme:i,accentColor:ze,setTheme:Be,setAccentColor:Ve,setZoom:P}=Oe(),[F,He]=(0,O.useState)(`preferences`),[I,L]=(0,O.useState)(()=>u()),[R,Ue]=(0,O.useState)(!1),[z,B]=(0,O.useState)(!1),[V,H]=(0,O.useState)(null),[We,U]=(0,O.useState)(``),[W,G]=(0,O.useState)(null),[K,Ge]=(0,O.useState)(``),[Ke,qe]=(0,O.useState)([]),[q,J]=(0,O.useState)({}),[Y,Je]=(0,O.useState)(``),[X,Ye]=(0,O.useState)(``),[Z,Q]=(0,O.useState)(null),[Xe,Ze]=(0,O.useState)(!1),[$,Qe]=(0,O.useState)(()=>N(be().fontSize)),[$e,et]=(0,O.useState)(!1);(0,O.useEffect)(()=>{we().then(e=>{let t=N(e.fontSize);Qe(t),P(parseInt(t,10)/100),et(!0)}).catch(()=>{et(!0)})},[P]),(0,O.useEffect)(()=>{if(!$e)return;let e=N($);P(parseInt(e,10)/100),w({fontSize:e}).catch(console.error)},[P,$e,$]),(0,O.useEffect)(()=>{(e||n)&&(we().then(e=>{L(e.aiConfig),Ge(e.mocksFilePath||``),J(e.clientAliases||{})}).catch(()=>{L(u())}),H(null),U(``),fetch(`/api/rule-files`).then(e=>e.json()).then(e=>{Array.isArray(e)&&qe(e)}).catch(()=>{}))},[e,n]);let tt=e=>{let t=l(e);L({...I,provider:e,baseUrl:t.baseUrl,model:t.model})},nt=async()=>{B(!0);try{await w({aiConfig:I}),ie(I),H(`success`),U(`AI 配置保存成功`),y.success(`AI 配置保存成功`)}catch(e){let t=e instanceof Error?e.message:`保存失败`;H(`error`),U(t),y.error(t)}finally{B(!1)}},rt=()=>{ce(),L(u()),H(null),U(``)},it=async()=>{if(!se(I)){H(`error`),U(`请填写完整的配置信息`);return}B(!0),H(null),U(`测试中...`);try{let e=I.baseUrl,t={"Content-Type":`application/json`},n;I.provider===`anthropic`?(t[`x-api-key`]=I.apiKey,t[`anthropic-version`]=`2023-06-01`,n={model:I.model,max_tokens:100,system:`You are a helpful assistant.`,messages:[{role:`user`,content:`Say "test successful"`}],temperature:.3}):(t.Authorization=`Bearer ${I.apiKey}`,n={model:I.model,messages:[{role:`system`,content:`You are a helpful assistant.`},{role:`user`,content:`Say "test successful"`}],temperature:.3,max_tokens:100});let r=await fetch(e,{method:`POST`,headers:t,body:JSON.stringify(n)});if(!r.ok){let e=await r.text();throw Error(`API错误 (${r.status}): ${e}`)}let i=await r.json();if(I.provider===`anthropic`){if(!i.content?.[0]?.text)throw Error(`API响应格式不正确`)}else if(!i.choices?.[0]?.message?.content)throw Error(`API响应格式不正确`);H(`success`),U(`连接测试成功! API配置正常`)}catch(e){H(`error`),U(e instanceof Error?e.message:`测试失败`)}finally{B(!1)}},at=(0,O.useCallback)(async()=>{try{let e=await fetch(`/api/refresh-config`,{method:`POST`});if(e.ok){let t=await e.json();H(`success`),U(t.message||`配置已刷新`),setTimeout(()=>{H(null),U(``)},2e3)}else{let t=await e.json();H(`error`),U(t.error||`刷新配置失败`),setTimeout(()=>{H(null),U(``)},2e3)}}catch(e){console.error(`刷新配置失败:`,e),H(`error`),U(`刷新配置失败`),setTimeout(()=>{H(null),U(``)},2e3)}},[]),ot=(0,O.useCallback)(async()=>{Ze(!0),Q(null);try{let e=await fetch(`/api/config-doctor`);e.ok?Q(await e.json()):(H(`error`),U(`诊断失败`),setTimeout(()=>{H(null),U(``)},2e3))}catch(e){console.error(`诊断失败:`,e),H(`error`),U(`诊断失败`),setTimeout(()=>{H(null),U(``)},2e3)}finally{Ze(!1)}},[]),st=()=>{let e=Y.trim(),t=X.trim();!e||!t||(J(n=>({...n,[e]:t})),Je(``),Ye(``))},ct=async()=>{B(!0);try{await w({clientAliases:q}),H(`success`),U(`客户端名称已保存,新请求立即生效`),y.success(`客户端名称保存成功`)}catch(e){let t=e instanceof Error?e.message:`保存失败`;H(`error`),U(t),y.error(t)}finally{B(!1)}},lt=async()=>{B(!0);try{await w({mocksFilePath:K}),H(`success`),U(`Mock 文件路径已更新,刷新页面后生效`),y.success(`Mock 文件路径保存成功`),setTimeout(()=>{H(null),U(``)},3e3)}catch(e){let t=e instanceof Error?e.message:`保存失败`;H(`error`),U(t),y.error(t)}finally{B(!1)}};Se({active:(e||n)&&F!==`preferences`,enabled:!z,priority:De.panel,onSave:()=>{if(F===`config`)return lt();if(F===`clients`)return ct();if(F===`ai`)return nt()}});let ut=(0,k.jsxs)(k.Fragment,{children:[!n&&(0,k.jsxs)(ye,{className:`px-6 pt-6 pb-4`,children:[(0,k.jsxs)(Ae,{className:`flex items-center gap-2`,children:[(0,k.jsx)(Te,{className:`h-5 w-5`}),`系统设置`]}),(0,k.jsx)(je,{children:`管理系统偏好、配置和 AI 功能`})]}),(0,k.jsxs)(ue,{value:F,onValueChange:e=>He(e),orientation:`vertical`,className:`min-h-0 flex-1 gap-0`,children:[(0,k.jsxs)(he,{"aria-label":`设置分类`,className:`h-full w-14 shrink-0 self-stretch justify-start gap-1 rounded-none border-r bg-muted/25 p-2 group-data-[orientation=vertical]/tabs:!h-full sm:w-44 sm:p-3`,children:[(0,k.jsxs)(p,{value:`preferences`,className:`h-9 w-full flex-none justify-start px-2.5 sm:px-3`,children:[(0,k.jsx)(Te,{}),(0,k.jsx)(`span`,{className:`hidden sm:inline`,children:`偏好设置`})]}),(0,k.jsxs)(p,{value:`config`,className:`h-9 w-full flex-none justify-start px-2.5 sm:px-3`,children:[(0,k.jsx)(f,{}),(0,k.jsx)(`span`,{className:`hidden sm:inline`,children:`配置文件`})]}),(0,k.jsxs)(p,{value:`clients`,className:`h-9 w-full flex-none justify-start px-2.5 sm:px-3`,children:[(0,k.jsx)(c,{}),(0,k.jsx)(`span`,{className:`hidden sm:inline`,children:`客户端`})]}),(0,k.jsxs)(p,{value:`ai`,className:`h-9 w-full flex-none justify-start px-2.5 sm:px-3`,children:[(0,k.jsx)(xe,{}),(0,k.jsx)(`span`,{className:`hidden sm:inline`,children:`AI 配置`})]})]}),(0,k.jsxs)(T,{value:`preferences`,className:A,children:[(0,k.jsxs)(`div`,{className:j,children:[(0,k.jsx)(g,{className:`text-sm`,children:`主题`}),(0,k.jsxs)(pe,{value:i,onValueChange:e=>Be(e),children:[(0,k.jsx)(ge,{children:(0,k.jsx)(fe,{placeholder:`选择主题`})}),(0,k.jsx)(me,{children:(0,k.jsxs)(E,{children:[(0,k.jsx)(d,{value:`system`,children:(0,k.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,k.jsx)(ve,{className:`size-4`}),`跟随系统`]})}),(0,k.jsx)(d,{value:`light`,children:(0,k.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,k.jsx)(Ee,{className:`size-4`}),`浅色模式`]})}),(0,k.jsx)(d,{value:`dark`,children:(0,k.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,k.jsx)(Ce,{className:`size-4`}),`深色模式`]})})]})})]})]}),(0,k.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,k.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,k.jsx)(g,{className:`text-sm`,children:`强调色`}),(0,k.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`统一按钮、状态、选中项和焦点样式。自动模式会根据明暗主题选择合适的颜色。`})]}),(0,k.jsx)(_,{type:`single`,value:ze,onValueChange:e=>{e&&Ve(e)},variant:`outline`,spacing:1,className:`flex-wrap justify-start`,"aria-label":`强调色`,children:Re.map(e=>(0,k.jsxs)(v,{value:e.value,"aria-label":e.label,children:[e.value===`auto`?(0,k.jsx)(xe,{"data-icon":`inline-start`}):(0,k.jsx)(`span`,{className:`size-3 rounded-full border border-foreground/10`,style:{background:e.color}}),e.label]},e.value))})]}),(0,k.jsxs)(`div`,{className:j,children:[(0,k.jsx)(g,{className:`text-sm`,children:`缩放比例`}),(0,k.jsxs)(pe,{value:$,onValueChange:Qe,children:[(0,k.jsx)(ge,{children:(0,k.jsx)(fe,{placeholder:`选择缩放比例`})}),(0,k.jsx)(me,{children:(0,k.jsx)(E,{children:Le.map(e=>(0,k.jsx)(d,{value:e.value,children:e.label},e.value))})})]})]}),(0,k.jsx)(x,{}),(0,k.jsxs)(`div`,{className:j,children:[(0,k.jsx)(`h3`,{className:`text-sm font-medium`,children:`关于`}),(0,k.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Meddle - HTTP 调试代理工具`}),(0,k.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`版本: 1.0.0`})]})]}),(0,k.jsxs)(T,{value:`config`,className:A,children:[(0,k.jsxs)(`div`,{className:M,children:[(0,k.jsx)(g,{className:`text-sm font-medium`,children:`路由规则文件`}),(0,k.jsxs)(`div`,{className:j,children:[(0,k.jsxs)(`div`,{className:`flex items-center gap-2 p-3 bg-muted rounded-md`,children:[(0,k.jsx)(f,{className:`h-4 w-4 text-muted-foreground shrink-0`}),(0,k.jsx)(`span`,{className:`text-xs font-mono truncate flex-1`,children:`~/.meddle/route-rules/`})]}),Ke.length>0?(0,k.jsx)(`div`,{className:`space-y-2`,children:Ke.map(e=>(0,k.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border px-3 py-2.5 text-sm`,children:[(0,k.jsx)(de,{variant:e.enabled?`default`:`secondary`,className:`text-[10px]`,children:e.enabled?`已启用`:`未启用`}),(0,k.jsxs)(`span`,{className:`flex-1 truncate text-xs`,children:[e.name,`.txt`]}),(0,k.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[e.ruleCount,` 条规则`]})]},e.name))}):(0,k.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`暂无规则文件`}),(0,k.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`规则文件存放于 ~/.meddle/route-rules/ 目录,纯文本格式。在"路由规则"页面管理。`})]})]}),(0,k.jsx)(x,{}),(0,k.jsxs)(`div`,{className:M,children:[(0,k.jsx)(g,{className:`text-sm font-medium`,children:`Mock 规则文件`}),(0,k.jsxs)(`div`,{className:j,children:[(0,k.jsxs)(`div`,{className:`flex items-center gap-2 p-3 bg-muted rounded-md`,children:[(0,k.jsx)(f,{className:`h-4 w-4 text-muted-foreground shrink-0`}),(0,k.jsx)(`span`,{className:`text-xs font-mono truncate flex-1`,children:K||`默认: ~/.meddle/mocks.json`})]}),(0,k.jsxs)(`div`,{className:j,children:[(0,k.jsx)(g,{htmlFor:`mocksPath`,className:`text-xs text-muted-foreground`,children:`自定义 Mock 规则文件路径(留空使用默认)`}),(0,k.jsxs)(`div`,{className:`flex gap-2`,children:[(0,k.jsx)(h,{id:`mocksPath`,value:K,onChange:e=>Ge(e.target.value),placeholder:`如: /path/to/my-mocks.json`,className:`flex-1 h-8 text-sm font-mono`}),(0,k.jsxs)(S,{variant:`outline`,size:`sm`,onClick:lt,disabled:z,className:`h-8`,children:[(0,k.jsx)(b,{"data-icon":`inline-start`,className:`h-3 w-3`}),`应用`]})]}),(0,k.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`必须是 JSON 格式的 Mock 规则文件`})]})]})]}),(0,k.jsx)(x,{}),(0,k.jsxs)(`div`,{className:j,children:[(0,k.jsx)(`h3`,{className:`text-sm font-medium`,children:`操作`}),(0,k.jsxs)(`div`,{className:`flex gap-2`,children:[(0,k.jsxs)(r,{variant:`outline`,size:`sm`,onClick:at,children:[(0,k.jsx)(te,{className:`h-4 w-4 mr-1`}),`重新加载配置`]}),(0,k.jsxs)(r,{variant:`outline`,size:`sm`,onClick:ot,disabled:Xe,children:[(0,k.jsx)(D,{className:`h-4 w-4 mr-1`}),Xe?`诊断中...`:`诊断配置`]})]}),(0,k.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`点击重新加载可应用修改后的配置文件,点击诊断配置可检查配置有效性`})]}),Z&&(0,k.jsxs)(`div`,{className:M,children:[(0,k.jsx)(x,{}),(0,k.jsxs)(`div`,{children:[(0,k.jsxs)(`h3`,{className:`mb-4 flex items-center gap-2 text-sm font-medium`,children:[(0,k.jsx)(D,{className:`h-4 w-4`}),`诊断结果`]}),(0,k.jsxs)(`div`,{className:`mb-3 p-3 rounded-md border ${Z.status===`ok`?`bg-green-50 dark:bg-green-950/20 border-green-200 dark:border-green-900`:Z.status===`warning`?`bg-yellow-50 dark:bg-yellow-950/20 border-yellow-200 dark:border-yellow-900`:`bg-red-50 dark:bg-red-950/20 border-red-200 dark:border-red-900`}`,children:[Z.status===`ok`&&(0,k.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,k.jsx)(m,{className:`h-5 w-5 text-green-600 dark:text-green-400`}),(0,k.jsx)(`span`,{className:`text-sm font-medium text-green-700 dark:text-green-300`,children:`所有检查通过!配置正常。`})]}),Z.status===`warning`&&(0,k.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,k.jsx)(a,{className:`h-5 w-5 text-yellow-600 dark:text-yellow-400`}),(0,k.jsxs)(`span`,{className:`text-sm font-medium text-yellow-700 dark:text-yellow-300`,children:[`发现 `,Z.warnings.length,` 个警告`]})]}),Z.status===`error`&&(0,k.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,k.jsx)(o,{className:`h-5 w-5 text-red-600 dark:text-red-400`}),(0,k.jsxs)(`span`,{className:`text-sm font-medium text-red-700 dark:text-red-300`,children:[`发现 `,Z.errors.length,` 个错误`]})]})]}),(0,k.jsx)(`div`,{className:j,children:Z.checks.map((e,t)=>(0,k.jsx)(`div`,{className:`p-2 rounded border bg-card`,children:(0,k.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,k.jsx)(m,{className:`h-4 w-4 text-green-600 dark:text-green-400 mt-0.5 shrink-0`}),(0,k.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,k.jsx)(`div`,{className:`text-sm font-medium`,children:e.name}),(0,k.jsx)(`div`,{className:`text-xs text-muted-foreground font-mono truncate`,children:e.path}),e.details&&(0,k.jsxs)(`div`,{className:`text-xs text-muted-foreground mt-1`,children:[e.details.totalFiles!==void 0&&`${e.details.enabledFiles}/${e.details.totalFiles} 个文件已启用`,e.details.totalRules!==void 0&&` · ${e.details.totalRules} 条规则`,e.details.rules!==void 0&&`${e.details.rules} 条规则`,e.details.total!==void 0&&`${e.details.total} 条规则 (${e.details.enabled} 已启用)`,e.details.size!==void 0&&` · ${e.details.size} bytes`]})]})]})},t))}),Z.warnings&&Z.warnings.length>0&&(0,k.jsxs)(`div`,{className:`mt-3 space-y-1`,children:[(0,k.jsx)(`div`,{className:`text-xs font-medium text-yellow-700 dark:text-yellow-300`,children:`警告:`}),Z.warnings.map((e,t)=>(0,k.jsxs)(`div`,{className:`flex items-start gap-2 text-xs text-yellow-600 dark:text-yellow-400`,children:[(0,k.jsx)(a,{className:`h-3 w-3 mt-0.5 shrink-0`}),(0,k.jsx)(`span`,{children:e})]},t))]}),Z.errors&&Z.errors.length>0&&(0,k.jsxs)(`div`,{className:`mt-3 space-y-1`,children:[(0,k.jsx)(`div`,{className:`text-xs font-medium text-red-700 dark:text-red-300`,children:`错误:`}),Z.errors.map((e,t)=>(0,k.jsxs)(`div`,{className:`flex items-start gap-2 text-xs text-red-600 dark:text-red-400`,children:[(0,k.jsx)(o,{className:`h-3 w-3 mt-0.5 shrink-0`}),(0,k.jsx)(`span`,{children:e})]},t))]})]})]})]}),(0,k.jsxs)(T,{value:`clients`,className:A,children:[(0,k.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,k.jsxs)(`h3`,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,k.jsx)(c,{className:`h-4 w-4`}),`远程客户端名称`]}),(0,k.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`将日志中的客户端 IP 映射为设备名称。保存后新请求立即生效,无需重启代理。`})]}),(0,k.jsx)(`div`,{className:j,children:Object.entries(q).length===0?(0,k.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-center text-xs text-muted-foreground`,children:`尚未配置设备名称`}):Object.entries(q).map(([e,t])=>(0,k.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,k.jsx)(h,{value:e,readOnly:!0,className:`h-8 flex-1 font-mono text-xs bg-muted/40`,"aria-label":`客户端 IP ${e}`}),(0,k.jsx)(h,{value:t,onChange:t=>{let n=t.target.value;J(t=>({...t,[e]:n}))},className:`h-8 flex-1 text-sm`,"aria-label":`${e} 的设备名称`}),(0,k.jsx)(r,{variant:`ghost`,size:`icon-sm`,className:`text-muted-foreground hover:text-destructive`,onClick:()=>{J(t=>{let n={...t};return delete n[e],n})},title:`删除设备名称`,"aria-label":`删除设备名称`,children:(0,k.jsx)(C,{className:`h-4 w-4`})})]},e))}),(0,k.jsx)(x,{}),(0,k.jsxs)(`div`,{className:j,children:[(0,k.jsx)(g,{className:`text-sm`,children:`添加设备`}),(0,k.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,k.jsx)(h,{value:Y,onChange:e=>Je(e.target.value),placeholder:`客户端 IP,例如 10.13.232.187`,className:`h-8 flex-1 font-mono text-xs`}),(0,k.jsx)(h,{value:X,onChange:e=>Ye(e.target.value),onKeyDown:e=>{e.key===`Enter`&&st()},placeholder:`设备名称,例如 iPhone`,className:`h-8 flex-1 text-sm`}),(0,k.jsxs)(r,{variant:`outline`,size:`sm`,className:`h-8`,onClick:st,disabled:!Y.trim()||!X.trim(),children:[(0,k.jsx)(s,{className:`h-4 w-4 mr-1`}),`添加`]})]})]}),(0,k.jsxs)(S,{onClick:ct,disabled:z,children:[(0,k.jsx)(b,{"data-icon":`inline-start`,className:`h-4 w-4`}),z?`保存中...`:`保存客户端名称`]})]}),(0,k.jsxs)(T,{value:`ai`,className:A,children:[(0,k.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,k.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,k.jsx)(g,{className:`text-sm`,children:`启用 AI 功能`}),(0,k.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`启用智能代码修复功能`})]}),(0,k.jsx)(re,{checked:I.enabled,onCheckedChange:e=>L({...I,enabled:e}),"aria-label":`启用 AI 功能`})]}),(0,k.jsx)(x,{}),(0,k.jsxs)(`div`,{className:M,children:[(0,k.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,k.jsx)(g,{className:`text-sm`,children:`AI 模型配置`}),(0,k.jsxs)(r,{variant:`outline`,size:`sm`,onClick:()=>{G({name:``,provider:`openai`,apiKey:``,baseUrl:`https://api.openai.com/v1/chat/completions`,model:`gpt-4o-mini`})},children:[(0,k.jsx)(s,{className:`h-4 w-4 mr-1`}),`添加模型`]})]}),(0,k.jsx)(`div`,{className:j,children:I.models&&I.models.length>0?I.models.map(e=>(0,k.jsx)(`div`,{className:`p-3 rounded-md border ${I.activeModelId===e.id?`border-primary bg-primary/5`:`border-border`}`,children:(0,k.jsxs)(`div`,{className:`flex items-start justify-between`,children:[(0,k.jsxs)(`div`,{className:`flex-1`,children:[(0,k.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,k.jsx)(`span`,{className:`font-medium text-sm`,children:e.name}),I.activeModelId===e.id&&(0,k.jsx)(de,{variant:`default`,className:`text-xs`,children:`当前使用`})]}),(0,k.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:[e.provider===`openai`?`OpenAI`:`Anthropic`,` - `,e.model]})]}),(0,k.jsxs)(`div`,{className:`flex gap-1`,children:[I.activeModelId!==e.id&&(0,k.jsxs)(r,{variant:`ghost`,size:`xs`,onClick:()=>L(ae(I,e.id)),children:[(0,k.jsx)(ee,{className:`h-3 w-3 mr-1`}),`使用`]}),(0,k.jsx)(r,{variant:`ghost`,size:`icon-sm`,onClick:()=>L(oe(I,e.id)),className:`text-destructive`,"aria-label":`删除模型`,children:(0,k.jsx)(C,{className:`h-3 w-3`})})]})]})},e.id)):(0,k.jsx)(`p`,{className:`text-xs text-muted-foreground italic py-4 text-center`,children:`暂无模型配置,点击"添加模型"创建`})}),W&&(0,k.jsxs)(`div`,{className:`space-y-5 rounded-md border border-primary bg-primary/5 p-4`,children:[(0,k.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,k.jsx)(g,{className:`text-sm font-medium`,children:`新增模型`}),(0,k.jsx)(r,{variant:`ghost`,size:`icon-xs`,onClick:()=>G(null),"aria-label":`关闭新增模型表单`,children:(0,k.jsx)(o,{className:`h-4 w-4`})})]}),(0,k.jsxs)(`div`,{className:j,children:[(0,k.jsx)(g,{htmlFor:`newModelName`,className:`text-xs`,children:`模型名称`}),(0,k.jsx)(h,{id:`newModelName`,value:W.name||``,onChange:e=>G({...W,name:e.target.value}),placeholder:`如:GPT-4o Mini`,className:`h-8 text-sm`})]}),(0,k.jsxs)(`div`,{className:j,children:[(0,k.jsx)(g,{className:`text-xs`,children:`服务商`}),(0,k.jsxs)(_,{type:`single`,value:W.provider,onValueChange:e=>{if(e===`openai`){let e=l(`openai`);G({...W,provider:`openai`,baseUrl:e.baseUrl,model:e.model})}else if(e===`anthropic`){let e=l(`anthropic`);G({...W,provider:`anthropic`,baseUrl:e.baseUrl,model:e.model})}},variant:`outline`,size:`sm`,spacing:0,children:[(0,k.jsx)(v,{value:`openai`,children:`OpenAI`}),(0,k.jsx)(v,{value:`anthropic`,children:`Anthropic`})]})]}),(0,k.jsxs)(`div`,{className:j,children:[(0,k.jsx)(g,{htmlFor:`newModelApiKey`,className:`text-xs`,children:`API Key`}),(0,k.jsx)(h,{id:`newModelApiKey`,type:R?`text`:`password`,value:W.apiKey||``,onChange:e=>G({...W,apiKey:e.target.value}),placeholder:`输入 API Key`,className:`h-8 text-sm`})]}),(0,k.jsxs)(`div`,{className:j,children:[(0,k.jsx)(g,{htmlFor:`newModelModel`,className:`text-xs`,children:`模型`}),(0,k.jsx)(h,{id:`newModelModel`,value:W.model||``,onChange:e=>G({...W,model:e.target.value}),placeholder:`模型名称`,className:`h-8 text-sm`})]}),(0,k.jsxs)(`div`,{className:j,children:[(0,k.jsx)(g,{htmlFor:`newModelBaseUrl`,className:`text-xs`,children:`API 端点`}),(0,k.jsx)(h,{id:`newModelBaseUrl`,value:W.baseUrl||``,onChange:e=>G({...W,baseUrl:e.target.value}),placeholder:`API 端点`,className:`h-8 text-sm`})]}),(0,k.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2`,children:[(0,k.jsx)(r,{variant:`outline`,size:`xs`,onClick:()=>G(null),children:`取消`}),(0,k.jsxs)(r,{size:`xs`,onClick:()=>{W.name&&W.apiKey&&W.model&&W.baseUrl&&(L(le(I,W)),G(null))},disabled:!W.name||!W.apiKey||!W.model||!W.baseUrl,children:[(0,k.jsx)(s,{className:`h-3 w-3 mr-1`}),`添加`]})]})]})]}),(0,k.jsx)(x,{}),(0,k.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,k.jsx)(g,{className:`text-sm`,children:`传统配置(向后兼容)`}),(0,k.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`如果未配置多模型,将使用此配置`})]}),(0,k.jsxs)(`div`,{className:j,children:[(0,k.jsx)(g,{className:`text-xs`,children:`AI 服务商`}),(0,k.jsxs)(_,{type:`single`,value:I.provider,onValueChange:e=>{(e===`openai`||e===`anthropic`)&&tt(e)},variant:`outline`,size:`sm`,spacing:0,children:[(0,k.jsx)(v,{value:`openai`,children:`OpenAI`}),(0,k.jsx)(v,{value:`anthropic`,children:`Anthropic`})]})]}),(0,k.jsxs)(`div`,{className:j,children:[(0,k.jsx)(g,{htmlFor:`apiKey`,className:`text-xs`,children:`API Key`}),(0,k.jsxs)(`div`,{className:`flex gap-2`,children:[(0,k.jsx)(h,{id:`apiKey`,type:R?`text`:`password`,value:I.apiKey,onChange:e=>L({...I,apiKey:e.target.value}),placeholder:`输入 API Key`,className:`flex-1 h-8 text-sm`}),(0,k.jsx)(r,{variant:`outline`,size:`icon-sm`,onClick:()=>Ue(!R),"aria-label":R?`隐藏 API Key`:`显示 API Key`,children:R?(0,k.jsx)(Fe,{className:`h-4 w-4`}):(0,k.jsx)(Ie,{className:`h-4 w-4`})})]})]}),(0,k.jsxs)(`div`,{className:j,children:[(0,k.jsx)(g,{htmlFor:`model`,className:`text-xs`,children:`模型`}),(0,k.jsx)(h,{id:`model`,value:I.model,onChange:e=>L({...I,model:e.target.value}),placeholder:`模型名称`,className:`h-8 text-sm`})]}),(0,k.jsxs)(`div`,{className:j,children:[(0,k.jsx)(g,{htmlFor:`baseUrl`,className:`text-xs`,children:`API 端点`}),(0,k.jsx)(h,{id:`baseUrl`,value:I.baseUrl,onChange:e=>L({...I,baseUrl:e.target.value}),placeholder:I.provider===`openai`?`https://api.openai.com/v1/chat/completions`:`https://api.anthropic.com/v1/messages`,className:`h-8 text-sm`})]}),We&&(0,k.jsxs)(Pe,{variant:V===`error`?`destructive`:`default`,children:[V===`success`?(0,k.jsx)(m,{}):V===`error`?(0,k.jsx)(o,{}):(0,k.jsx)(a,{}),(0,k.jsx)(Ne,{children:V===`success`?`操作成功`:V===`error`?`操作失败`:`处理中`}),(0,k.jsx)(Me,{children:We})]}),(0,k.jsx)(x,{}),(0,k.jsxs)(`div`,{className:`flex justify-between`,children:[(0,k.jsxs)(r,{variant:`outline`,size:`sm`,onClick:rt,children:[(0,k.jsx)(ne,{className:`h-4 w-4 mr-1`}),`重置`]}),(0,k.jsxs)(`div`,{className:`flex gap-2`,children:[(0,k.jsx)(r,{variant:`outline`,size:`sm`,onClick:it,disabled:!se(I)||z,children:`测试连接`}),(0,k.jsxs)(S,{size:`sm`,onClick:nt,disabled:z,children:[(0,k.jsx)(b,{"data-icon":`inline-start`,className:`h-4 w-4`}),z?`保存中...`:`保存`]})]})]})]})]})]});return n?(0,k.jsx)(`div`,{"data-testid":`settings-fullwidth`,className:`app-workspace-content flex h-full min-h-0 w-full flex-col overflow-hidden p-0`,children:(0,k.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden rounded-md border bg-card`,children:ut})}):(0,k.jsx)(_e,{open:e,onOpenChange:t,children:(0,k.jsx)(ke,{className:`p-0 flex flex-col`,resizable:!0,defaultWidth:600,storageKey:`settings-panel`,children:ut})})}export{ze as SettingsPanel};
@@ -1 +0,0 @@
1
- import{l as e}from"./button-yArHqw81.js";var t=e(`smartphone`,[[`rect`,{width:`14`,height:`20`,x:`5`,y:`2`,rx:`2`,ry:`2`,key:`1yt0o3`}],[`path`,{d:`M12 18h.01`,key:`mhygvu`}]]);export{t};
@@ -1 +0,0 @@
1
- import{a as e,c as t,f as n,s as r,u as i}from"./button-yArHqw81.js";import{a,o,r as s,t as c}from"./dist-CwP5Ad1_.js";import{K as l,q as u}from"./index-F8M6NlaE.js";var d=n(i(),1),f=r(),p=`Switch`,[m,h]=a(p),[g,_]=m(p),v=d.forwardRef((t,n)=>{let{__scopeSwitch:r,name:i,checked:a,defaultChecked:l,required:u,disabled:m,value:h=`on`,onCheckedChange:_,form:v,...y}=t,[b,x]=d.useState(null),w=e(n,e=>x(e)),T=d.useRef(!1),E=b?v||!!b.closest(`form`):!0,[D,O]=c({prop:a,defaultProp:l??!1,onChange:_,caller:p});return(0,f.jsxs)(g,{scope:r,checked:D,disabled:m,children:[(0,f.jsx)(o.button,{type:`button`,role:`switch`,"aria-checked":D,"aria-required":u,"data-state":C(D),"data-disabled":m?``:void 0,disabled:m,value:h,...y,ref:w,onClick:s(t.onClick,e=>{O(e=>!e),E&&(T.current=e.isPropagationStopped(),T.current||e.stopPropagation())})}),E&&(0,f.jsx)(S,{control:b,bubbles:!T.current,name:i,value:h,checked:D,required:u,disabled:m,form:v,style:{transform:`translateX(-100%)`}})]})});v.displayName=p;var y=`SwitchThumb`,b=d.forwardRef((e,t)=>{let{__scopeSwitch:n,...r}=e,i=_(y,n);return(0,f.jsx)(o.span,{"data-state":C(i.checked),"data-disabled":i.disabled?``:void 0,...r,ref:t})});b.displayName=y;var x=`SwitchBubbleInput`,S=d.forwardRef(({__scopeSwitch:t,control:n,checked:r,bubbles:i=!0,...a},o)=>{let s=d.useRef(null),c=e(s,o),p=u(r),m=l(n);return d.useEffect(()=>{let e=s.current;if(!e)return;let t=window.HTMLInputElement.prototype,n=Object.getOwnPropertyDescriptor(t,`checked`).set;if(p!==r&&n){let t=new Event(`click`,{bubbles:i});n.call(e,r),e.dispatchEvent(t)}},[p,r,i]),(0,f.jsx)(`input`,{type:`checkbox`,"aria-hidden":!0,defaultChecked:r,...a,tabIndex:-1,ref:c,style:{...a.style,...m,position:`absolute`,pointerEvents:`none`,opacity:0,margin:0}})});S.displayName=x;function C(e){return e?`checked`:`unchecked`}var w=v,T=b;function E({className:e,...n}){return(0,f.jsx)(w,{"data-slot":`switch`,className:t(`peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-5 w-9 shrink-0 items-center rounded-full border-2 border-transparent shadow-xs transition-colors outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50`,e),...n,children:(0,f.jsx)(T,{"data-slot":`switch-thumb`,className:t(`bg-background pointer-events-none block size-4 rounded-full ring-0 shadow-lg transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0`)})})}export{E as t};
@@ -1 +0,0 @@
1
- import{c as e,f as t,s as n,u as r}from"./button-yArHqw81.js";t(r(),1);var i=n();function a({className:t,...n}){return(0,i.jsx)(`div`,{"data-slot":`table-container`,className:`meddle-thin-scroll relative w-full overflow-x-auto`,children:(0,i.jsx)(`table`,{"data-slot":`table`,className:e(`w-full caption-bottom text-sm`,t),...n})})}function o({className:t,...n}){return(0,i.jsx)(`thead`,{"data-slot":`table-header`,className:e(`[&_tr]:border-b`,t),...n})}function s({className:t,...n}){return(0,i.jsx)(`tbody`,{"data-slot":`table-body`,className:e(`[&_tr:last-child]:border-0`,t),...n})}function c({className:t,...n}){return(0,i.jsx)(`tr`,{"data-slot":`table-row`,className:e(`hover:bg-accent/60 hover:text-accent-foreground data-[state=selected]:bg-accent data-[state=selected]:text-accent-foreground border-b transition-colors`,t),...n})}function l({className:t,...n}){return(0,i.jsx)(`th`,{"data-slot":`table-head`,className:e(`text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]`,t),...n})}function u({className:t,...n}){return(0,i.jsx)(`td`,{"data-slot":`table-cell`,className:e(`p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]`,t),...n})}export{o as a,l as i,s as n,c as o,u as r,a as t};