@jonathanleelx/meddle 0.2.2 → 0.3.1

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 (35) hide show
  1. package/README.md +29 -0
  2. package/bin/commands/session/create.js +20 -17
  3. package/bin/commands/start.js +16 -13
  4. package/bin/commands/supervise.js +16 -7
  5. package/bin/lib/dispatch.js +34 -0
  6. package/bin/lib/spawn-proxy.js +51 -0
  7. package/bin/main.js +34 -0
  8. package/mcp-server.js +22 -16
  9. package/package.json +2 -2
  10. package/web/dist/assets/{checkbox-D0y07vOb.js → checkbox-BWULYytd.js} +1 -1
  11. package/web/dist/assets/{code-fixer-DOrMk-4V.js → code-fixer-5eQnwT8X.js} +2 -2
  12. package/web/dist/assets/{detail-panel-CGfKk7-i.js → detail-panel-BpOhMCBc.js} +1 -1
  13. package/web/dist/assets/{global-panel-shell-COyDpKbS.js → global-panel-shell-BAYOGxQQ.js} +1 -1
  14. package/web/dist/assets/{health-panel-CgEmCIeC.js → health-panel-kmPJnyYQ.js} +1 -1
  15. package/web/dist/assets/{index-DTeCUv1G.js → index-DboWpNx1.js} +2 -2
  16. package/web/dist/assets/{mobile-proxy-panel-BCUn96iR.js → mobile-proxy-panel-DmB_Xpfw.js} +1 -1
  17. package/web/dist/assets/mock-config-iBp0BDov.js +1 -0
  18. package/web/dist/assets/{mock-editor-panel-Ctf1EX-d.js → mock-editor-panel-CXXDTlEW.js} +1 -1
  19. package/web/dist/assets/{monaco-editor-DboIGERI.js → monaco-editor-Z1BRT9kx.js} +2 -2
  20. package/web/dist/assets/{plugin-code-editor-DuaSNWGF.js → plugin-code-editor-BlDjbDTI.js} +1 -1
  21. package/web/dist/assets/{plugin-config-D7H47wsJ.js → plugin-config-CAt68TW2.js} +1 -1
  22. package/web/dist/assets/{plugin-generator-xGpWo1Fc.js → plugin-generator-DQPeKPiv.js} +1 -1
  23. package/web/dist/assets/{plugin-test-dialog-BfxPpCfE.js → plugin-test-dialog-DzxpHPhR.js} +1 -1
  24. package/web/dist/assets/{route-preview-CvoRZiwx.js → route-preview-DE5VQpeQ.js} +1 -1
  25. package/web/dist/assets/{rule-ai-assistant-panel-B0UlJVO3.js → rule-ai-assistant-panel-CzFwse2h.js} +1 -1
  26. package/web/dist/assets/rule-config-CSjkrM2g.js +15 -0
  27. package/web/dist/assets/{select-CH0aJ3Dd.js → select-DOK-k_l8.js} +1 -1
  28. package/web/dist/assets/{settings-panel-BvaGZmBw.js → settings-panel-Ccdeqa9n.js} +1 -1
  29. package/web/dist/index.html +1 -1
  30. package/dist/core/plugin-compiler.d.ts +0 -37
  31. package/dist/core/plugin-compiler.d.ts.map +0 -1
  32. package/dist/core/plugin-compiler.js +0 -172
  33. package/dist/core/plugin-compiler.js.map +0 -1
  34. package/web/dist/assets/mock-config-DNMSOrLv.js +0 -1
  35. package/web/dist/assets/rule-config-BmrlYakh.js +0 -15
@@ -1 +0,0 @@
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};