@kimicode/cli 1.0.39 → 1.0.40

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 (120) hide show
  1. package/LICENSE.md +12 -0
  2. package/README.md +427 -31
  3. package/bin/stt/requirements.txt +32 -0
  4. package/bin/stt/stt_server.py +619 -0
  5. package/bin/tts/requirements.txt +21 -0
  6. package/bin/tts/tts_server.py +404 -0
  7. package/cli-wrapper.cjs +4 -0
  8. package/llms.txt +88 -0
  9. package/package.json +30 -11
  10. package/web/dist/assets/AssistantsView-BiUiWjhF.js +1 -0
  11. package/web/dist/assets/AutomationView-Dcf_yNaI.js +1 -0
  12. package/web/dist/assets/ChannelConfigView-BLnxsMGm.js +8 -0
  13. package/web/dist/assets/ConnectorsView-CX3E6X6c.js +1 -0
  14. package/web/dist/assets/DesignSystemView--x-P-lpD.js +1 -0
  15. package/web/dist/assets/Drawer-CjAgqH3B.js +1 -0
  16. package/web/dist/assets/{FileTreeView-hBtHBbAV.js → FileTreeView-Chb_fzTK.js} +3 -3
  17. package/web/dist/assets/HookConfigView-EafYlWdN.js +1 -0
  18. package/web/dist/assets/InputArea-BbHslX7b.js +50 -0
  19. package/web/dist/assets/ModelsView-CGN5Nljr.js +1 -0
  20. package/web/dist/assets/PluginsView-CDiJgvI8.js +2 -0
  21. package/web/dist/assets/ProjectsView-C5Usmwqy.js +1 -0
  22. package/web/dist/assets/SessionGrid-Drxg0r_u.js +4 -0
  23. package/web/dist/assets/SettingsModal-Cmts6aBG.js +10 -0
  24. package/web/dist/assets/Skeleton-Dsk6B0U3.js +1 -0
  25. package/web/dist/assets/SkillsView-TEDR_3XX.js +1 -0
  26. package/web/dist/assets/TemplatesTab-DtN5Kdgh.js +1 -0
  27. package/web/dist/assets/ToolsView-VukZnIt1.js +1 -0
  28. package/web/dist/assets/VizCardsSkeleton-C_GaEfXd.js +1 -0
  29. package/web/dist/assets/abnfDiagram-YUKMZFIV-BIFw6B_N.js +1 -0
  30. package/web/dist/assets/arc-BZQ951h9.js +1 -0
  31. package/web/dist/assets/architectureDiagram-47P4ROYG-BP5qiXzf.js +36 -0
  32. package/web/dist/assets/blockDiagram-E7TT5TSB-DtRpcE7F.js +140 -0
  33. package/web/dist/assets/c4Diagram-CRA5TL53-Gdzn8UBh.js +38 -0
  34. package/web/dist/assets/channel-BND6_KSH.js +1 -0
  35. package/web/dist/assets/chunk-2Q5K7J3B-3U6HMlsm.js +1 -0
  36. package/web/dist/assets/chunk-5VM5RSS4-CYl9mwa-.js +15 -0
  37. package/web/dist/assets/chunk-7TKQ45FW-Dn6ktcY5.js +1 -0
  38. package/web/dist/assets/chunk-AW2ZBBNX-De0QX6p1.js +88 -0
  39. package/web/dist/assets/chunk-FVRAUYC3-CpXDfvz4.js +2 -0
  40. package/web/dist/assets/chunk-HTAEGDNF-D1KDvcDd.js +1 -0
  41. package/web/dist/assets/chunk-JWPE2WC7-umm4A-fq.js +1 -0
  42. package/web/dist/assets/chunk-KQW6MTUR-JYH94hpE.js +1 -0
  43. package/web/dist/assets/chunk-XXDRQBXY-CSlCFByc.js +1 -0
  44. package/web/dist/assets/classDiagram-v2-K4WV4PDN-DnFwS0qN.js +217 -0
  45. package/web/dist/assets/cose-bilkent-JH36ORCC-BxUTUyep.js +1 -0
  46. package/web/dist/assets/cynefin-EF2NZ3EQ-CiMvulJr.js +141 -0
  47. package/web/dist/assets/cynefinDiagram-3GCD6N5R-DuXFORdW.js +62 -0
  48. package/web/dist/assets/cytoscape.esm-Ix0LnXOy.js +331 -0
  49. package/web/dist/assets/dagre-W4DXFKR2-DzMZHXci.js +4 -0
  50. package/web/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  51. package/web/dist/assets/diagram-2UJZ2QOL-B6tO5G1v.js +200 -0
  52. package/web/dist/assets/diagram-OVF4WLC6-DRZt8tGc.js +24 -0
  53. package/web/dist/assets/diagram-PFPMY2P6-DGh6IecR.js +30 -0
  54. package/web/dist/assets/diagram-UMYRVEAY-BLbnt0yT.js +24 -0
  55. package/web/dist/assets/diagram-YEKJPTXX-C-S5DVhj.js +41 -0
  56. package/web/dist/assets/diagram-ZIFT7M5P-JrGHTWbo.js +3 -0
  57. package/web/dist/assets/ebnfDiagram-VR2GEFS7-DPXA-YOi.js +1 -0
  58. package/web/dist/assets/elk-IJKZMXRS-CINeWt2W.js +27 -0
  59. package/web/dist/assets/erDiagram-O2IAPWRE-PPaHmqA1.js +99 -0
  60. package/web/dist/assets/flowDiagram-OXPTDLAJ-t-u0QXEA.js +213 -0
  61. package/web/dist/assets/ganttDiagram-R7TSEDQI-Bw49ZD_b.js +292 -0
  62. package/web/dist/assets/gitGraphDiagram-XJZIOB7I-BAfOqeeg.js +106 -0
  63. package/web/dist/assets/graph-Bn3Yngep.js +1 -0
  64. package/web/dist/assets/{icons-BxNxyk-c.js → icons-Bm_ZzSAy.js} +320 -160
  65. package/web/dist/assets/index-CeeLdENM.js +677 -0
  66. package/web/dist/assets/index-Ceez9lYk.css +1 -0
  67. package/web/dist/assets/infoDiagram-5W2HQ5XZ-Bv4RBxYW.js +2 -0
  68. package/web/dist/assets/init-Gi6I4Gst.js +1 -0
  69. package/web/dist/assets/ishikawaDiagram-K3B6WC7H-DEpj0bRp.js +70 -0
  70. package/web/dist/assets/journeyDiagram-COXZFDF6-MJu84Iiz.js +139 -0
  71. package/web/dist/assets/kanban-definition-P3RFRI5V-mlYSRALK.js +89 -0
  72. package/web/dist/assets/linear-5j9gt8MV.js +1 -0
  73. package/web/dist/assets/{markdown-B2L4Mq-x.js → markdown-BWXjRrSw.js} +8 -8
  74. package/web/dist/assets/mermaid.core-DLb6eAON.js +314 -0
  75. package/web/dist/assets/mindmap-definition-LZFPQGKD-C9v_57Ex.js +96 -0
  76. package/web/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  77. package/web/dist/assets/{panels-P_I7Q72_.js → panels-BQOvnbWH.js} +1 -1
  78. package/web/dist/assets/pegDiagram-BGZESJAR-KQP26s3-.js +1 -0
  79. package/web/dist/assets/pieDiagram-CAPJLFHJ-DN3RQ_ih.js +39 -0
  80. package/web/dist/assets/profileChange-B7TaQ18u.js +1 -0
  81. package/web/dist/assets/quadrantDiagram-GDMTTRAM-BpL_ZL76.js +7 -0
  82. package/web/dist/assets/railroadDiagram-SM67HX2B-DZ-fPU85.js +1 -0
  83. package/web/dist/assets/{react-vendor-B2V_5iSS.js → react-vendor-C0HIWSpf.js} +1 -1
  84. package/web/dist/assets/requirementDiagram-X7JNWC4A-mKPGj64L.js +84 -0
  85. package/web/dist/assets/sankeyDiagram-UM26HJRW-Bs4xfjQP.js +40 -0
  86. package/web/dist/assets/sequenceDiagram-ZO4K6R2Y-BjUmzZaO.js +169 -0
  87. package/web/dist/assets/sizeCapture-INFHLROL-BXBM3j_Q.js +1 -0
  88. package/web/dist/assets/{state-0T92JV0u.js → state-Kfon1nTr.js} +1 -1
  89. package/web/dist/assets/stateDiagram-v2-TBUQTH76-FGgFDGUU.js +291 -0
  90. package/web/dist/assets/sttLanguages-C7kVulzY.js +1 -0
  91. package/web/dist/assets/swimlanes-N4OXWK64-wkd_n4HU.js +1 -0
  92. package/web/dist/assets/swimlanesDiagram-K3J5GTZL-CKnwEuq_.js +8 -0
  93. package/web/dist/assets/timeline-definition-YOQAKGHF-DyBln1jw.js +120 -0
  94. package/web/dist/assets/usecaseDiagram-VIAY4XPW-Cqis3XHX.js +370 -0
  95. package/web/dist/assets/vennDiagram-BLWOH2XV-BaiFLOVS.js +34 -0
  96. package/web/dist/assets/wardleyDiagram-YMQ3BMBF-C4CzpJto.js +78 -0
  97. package/web/dist/assets/xychartDiagram-TAQBALBS-Dp1hfe3-.js +7 -0
  98. package/web/dist/figma-demo/product-1.jpg +0 -0
  99. package/web/dist/figma-demo/product-2.jpg +0 -0
  100. package/web/dist/figma-demo/trail-1.jpg +0 -0
  101. package/web/dist/figma-demo/trail-2.jpg +0 -0
  102. package/web/dist/figma-demo/trail-3.jpg +0 -0
  103. package/web/dist/index.html +8 -8
  104. package/web/dist/assets/AssistantsView-0aLB_cG6.js +0 -1
  105. package/web/dist/assets/AutomationView-CAMjPhJ2.js +0 -1
  106. package/web/dist/assets/ChannelConfigView-FcioeeYb.js +0 -8
  107. package/web/dist/assets/ConnectorsView-DERP7zAW.js +0 -1
  108. package/web/dist/assets/HookConfigView-NModtSB8.js +0 -1
  109. package/web/dist/assets/ModelsView-BPpO50C_.js +0 -1
  110. package/web/dist/assets/PluginsView-D0NE7zrt.js +0 -1
  111. package/web/dist/assets/ProjectsView-PIv7Gx4q.js +0 -1
  112. package/web/dist/assets/SessionGrid-BsDL3lov.js +0 -47
  113. package/web/dist/assets/SettingsModal-DdebvEmv.js +0 -10
  114. package/web/dist/assets/SkillsView-BNoigImJ.js +0 -1
  115. package/web/dist/assets/TemplatesTab-D8Pa68fj.js +0 -1
  116. package/web/dist/assets/ToolsView-NY-yk5YX.js +0 -1
  117. package/web/dist/assets/WorkspaceDirPicker-C5knnArH.js +0 -6
  118. package/web/dist/assets/index-DaiVo1RY.css +0 -1
  119. package/web/dist/assets/index-RB5ffy32.js +0 -620
  120. package/web/dist/assets/profileChange-C7Jg9C61.js +0 -1
@@ -1,8 +0,0 @@
1
- import{j as a}from"./markdown-B2L4Mq-x.js";import{a as I,bC as ft,aT as gt,a2 as mt,aI as kt,am as ne,A as vt,bD as Te,aP as xt,o as Et,g as Tt,k as Bt}from"./icons-BxNxyk-c.js";import{u as _,an as Be,ao as G,ap as W,aq as J,M as St,a as Me,t as re}from"./index-RB5ffy32.js";import"./react-vendor-B2V_5iSS.js";import"./state-0T92JV0u.js";import"./panels-P_I7Q72_.js";const Pe=[{labelKey:"im",types:["wechat","feishu","dingtalk"]},{labelKey:"international",types:["telegram","discord","slack","signal","whatsapp"]},{labelKey:"eastAsia",types:["line","qqbot"]},{labelKey:"collaboration",types:["matrix","mattermost","msteams","googlechat"]},{labelKey:"classic",types:["irc","imessage","sms"]},{labelKey:"other",types:["nextcloud-talk","nostr","synology-chat","tlon","twitch","zalo","zalouser"]},{labelKey:"builtin",types:["clickclack","raft","qa-channel"]}];function Rt(){const{t:n}=_(),{channels:i,availableTypes:s,typesLoaded:t,selectedType:e,selectType:r,loadTypes:o}=Be();I.useEffect(()=>{o()},[o]);const c=I.useMemo(()=>{if(s.length===0)return[];const x=new Set(s),h=Pe.map(y=>({...y,types:y.types.filter(A=>x.has(A))})).filter(y=>y.types.length>0),d=new Set(Pe.flatMap(y=>y.types)),p=s.filter(y=>!d.has(y));return p.length>0?[...h,{labelKey:"plugins",types:p}]:h},[s]),l=I.useMemo(()=>{const x=new Map;for(const h of i){const d=x.get(h.type)??{count:0,connected:0};x.set(h.type,{count:d.count+1,connected:d.connected+(h.connected?1:0)})}return x},[i]),u=s.length>0,g=I.useMemo(()=>u?i.filter(x=>s.includes(x.type)):[],[u,i,s]);return a.jsxs("div",{className:"flex flex-col h-full min-h-0 border-r border-dark-border bg-dark-surface",children:[a.jsxs("div",{className:"shrink-0 px-4 py-3 border-b border-dark-border",children:[a.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-dark-muted",children:n("channels.sidebar.title")}),a.jsx("p",{className:"text-[11px] text-dark-muted mt-0.5",children:g.length>0?n("channels.sidebar.configuredCount",{n:g.length}):n(u?"channels.sidebar.clickToConfigure":"channels.sidebar.emptyHint")})]}),a.jsxs("div",{className:"flex-1 overflow-y-auto custom-scrollbar",children:[t&&!u&&a.jsxs("div",{className:"px-4 py-10 text-center",children:[a.jsx("p",{className:"text-xs text-dark-muted",children:n("channels.sidebar.empty")}),a.jsx("p",{className:"text-[11px] text-dark-muted/70 mt-1.5 leading-relaxed",children:n("channels.sidebar.emptyHint")})]}),c.map(x=>{const h=x.types.filter(d=>l.has(d));return h.length===0?null:a.jsxs("div",{children:[a.jsx("div",{className:"sticky top-0 bg-dark-surface/95 backdrop-blur px-4 py-1.5 text-[10px] font-semibold uppercase tracking-wider text-dark-muted/60",children:n(`channels.categories.${x.labelKey}`)}),h.map(d=>{const p=l.get(d);return a.jsx(Le,{label:J(d),icon:W(d),isSelected:e===d,experimental:G(d),info:p,onClick:()=>r(d)},d)})]},x.labelKey)}),(()=>{const x=c.flatMap(h=>h.types).filter(h=>!l.has(h));return x.length===0?null:a.jsxs("div",{children:[a.jsx("div",{className:"sticky top-0 bg-dark-surface/95 backdrop-blur px-4 py-1.5 text-[10px] font-semibold uppercase tracking-wider text-dark-muted/60",children:n("channels.sidebar.unconfigured")}),x.map(h=>a.jsx(Le,{label:J(h),icon:W(h),isSelected:e===h,experimental:G(h),onClick:()=>r(h)},h))]})})()]})]})}function Le({label:n,icon:i,isSelected:s,experimental:t,info:e,onClick:r}){const{t:o}=_();return a.jsxs("button",{onClick:r,className:`w-full flex items-center gap-2.5 px-4 py-2.5 text-left transition-colors hover:bg-dark-hover ${s?"bg-accent-blue/10 border-l-2 border-accent-blue":"border-l-2 border-transparent"}`,children:[a.jsx("span",{className:"text-lg shrink-0 w-7 h-7 flex items-center justify-center rounded-md bg-dark-bg",children:i}),a.jsxs("div",{className:"flex-1 min-w-0",children:[a.jsxs("div",{className:"flex items-center gap-1.5",children:[a.jsx("span",{className:"text-sm font-medium text-dark-text truncate",children:n}),t&&a.jsxs("span",{className:"inline-flex items-center gap-0.5 text-[9px] text-yellow-500 bg-yellow-500/10 px-1 py-0.5 rounded shrink-0",title:o("channels.experimentalTip"),children:[a.jsx(ft,{className:"w-2.5 h-2.5"})," ",o("channels.experimentalShort")]}),e&&a.jsx("span",{className:"text-[10px] text-dark-muted bg-dark-hover px-1.5 py-0.5 rounded shrink-0",children:e.count})]}),a.jsx("div",{className:"flex items-center gap-1 mt-0.5",children:e?e.connected>0?a.jsxs("span",{className:"flex items-center gap-1 text-[11px] text-green-400",children:[a.jsx(gt,{className:"w-3 h-3"}),e.connected===e.count?o("channels.status.connected"):o("channels.sidebar.partialConnected",{connected:e.connected,count:e.count})]}):a.jsxs("span",{className:"flex items-center gap-1 text-[11px] text-dark-muted",children:[a.jsx(mt,{className:"w-3 h-3"}),o("channels.status.disconnected")]}):a.jsx("span",{className:"text-[11px] text-dark-muted",children:o("channels.sidebar.unconfigured")})})]})]})}const z={name:"",type:"wechat",appId:"",appSecret:"",token:"",encodingAESKey:"",enabled:!0};function At(){const{t:n}=_(),{channels:i,selectedType:s,availableTypes:t,create:e,update:r,remove:o,toggle:c,error:l,clearError:u,openQr:g,load:x}=Be(),h=I.useMemo(()=>t.length>0&&!!s&&!t.includes(s),[t,s]),d=I.useMemo(()=>s?i.filter(f=>f.type===s):[],[i,s]),[p,y]=I.useState(""),[A,N]=I.useState(z),[R,T]=I.useState(!1),j=p==="__new__",k=I.useMemo(()=>j?null:d.find(f=>f.id===p)??null,[d,p,j]);I.useEffect(()=>{y(""),N(z),T(!1),u()},[s]),I.useEffect(()=>{s==="wechat"&&d.length===0&&!h&&g(null)},[s,d.length,h,g]),I.useEffect(()=>{k?N({name:k.name,type:k.type,appId:k.appId||"",appSecret:"",token:"",encodingAESKey:k.encodingAESKey||"",enabled:k.enabled}):j&&N(f=>({...f,type:s}))},[p]);const m=(f,B)=>{u(),N(M=>({...M,[f]:B}))},b=f=>{y(f),u()},C=()=>{y("__new__"),N({...z,type:s}),u()},w=()=>{y(""),N(z),u()},S=async()=>{if(!A.name.trim())return;T(!0);const f=k?await r(k.id,A):await e(A);T(!1),f&&(y(""),N(z))},v=async f=>{if(!confirm(n("channels.actions.deleteConfirmShort")))return;await o(f)&&p===f&&(y(""),N(z))},E=(f,B)=>{c(f,B)};return s?a.jsxs("div",{className:"flex-1 flex flex-col min-h-0 overflow-hidden",children:[a.jsx("div",{className:"shrink-0 px-6 py-4 border-b border-dark-border",children:a.jsxs("div",{className:"flex items-center justify-between",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("span",{className:"text-2xl",children:W(s)}),a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("h2",{className:"font-semibold text-base text-dark-text",children:J(s)}),G(s)&&a.jsxs("span",{className:"inline-flex items-center gap-0.5 text-[10px] text-yellow-500 bg-yellow-500/10 px-1.5 py-0.5 rounded",title:n("channels.experimentalTip"),children:[a.jsx(ft,{className:"w-3 h-3"})," ",n("channels.experimentalLabel")]})]}),a.jsx("p",{className:"text-xs text-dark-muted mt-0.5",children:d.length>0?n("channels.instancesCount",{n:d.length}):n("channels.notConfiguredYet")}),G(s)&&a.jsx("p",{className:"text-[10px] text-yellow-600/70 mt-1",children:n("channels.experimentalDesc")})]})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("button",{onClick:()=>x(),className:"text-xs px-3 py-1.5 rounded-lg border border-dark-border text-dark-muted hover:text-dark-text hover:bg-dark-hover transition-colors",children:n("channels.actions.refresh")}),a.jsxs("button",{onClick:C,className:"flex items-center gap-1.5 text-xs px-3 py-1.5 rounded-lg bg-accent-blue hover:bg-accent-blue/90 text-white transition-colors",children:[a.jsx(ne,{className:"w-3.5 h-3.5"})," ",n("channels.createInstance")]})]})]})}),l&&a.jsxs("div",{className:"shrink-0 mx-6 mt-3 bg-red-500/10 border border-red-500/40 text-red-400 px-3 py-2 rounded-lg text-sm flex justify-between items-center",children:[a.jsx("span",{children:l}),a.jsx("button",{onClick:u,className:"text-red-400 hover:text-red-300",children:a.jsx("span",{className:"w-4 h-4 inline-flex items-center justify-center",children:"×"})})]}),h&&a.jsxs("div",{className:"shrink-0 mx-6 mt-3 flex items-start gap-2 bg-amber-500/10 border border-amber-500/40 text-amber-400 px-3 py-2 rounded-lg text-xs",children:[a.jsx(vt,{className:"w-3.5 h-3.5 mt-0.5 shrink-0"}),a.jsx("span",{children:n("channels.pluginMissingWarning",{name:s==="wechat"?" WeChat Channel":` ${J(s)}`})})]}),a.jsxs("div",{className:"flex-1 overflow-y-auto custom-scrollbar p-6",children:[d.length>1&&!j&&a.jsxs("div",{className:"mb-4",children:[a.jsx("label",{className:"block text-xs text-dark-muted mb-1.5",children:n("channels.selectInstance")}),a.jsxs("div",{className:"flex flex-wrap gap-2",children:[d.map(f=>a.jsxs("button",{onClick:()=>b(f.id),className:`flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-xs border transition-colors ${p===f.id?"bg-accent-blue/10 border-accent-blue/40 text-accent-blue":"border-dark-border text-dark-muted hover:text-dark-text hover:bg-dark-hover"}`,children:[a.jsx("span",{className:`w-1.5 h-1.5 rounded-full ${f.connected?"bg-green-500":"bg-gray-500"}`}),f.name]},f.id)),a.jsxs("button",{onClick:C,className:"flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-xs border border-dashed border-dark-border text-dark-muted hover:text-dark-text hover:bg-dark-hover transition-colors",children:[a.jsx(ne,{className:"w-3 h-3"})," ",n("channels.createShort")]})]})]}),d.length===0&&p===""&&a.jsxs("div",{className:"flex flex-col items-center justify-center py-12 text-center",children:[a.jsx("div",{className:"text-4xl mb-3",children:W(s)}),a.jsx("p",{className:"text-dark-text font-medium",children:n("channels.emptyWithType",{type:J(s)})}),a.jsx("p",{className:"text-sm text-dark-muted mt-1 mb-4",children:n(s==="wechat"?"channels.wechatBindHint":"channels.startWithCreate")}),s==="wechat"&&a.jsxs("button",{onClick:()=>g(null),className:"flex items-center gap-1.5 text-sm px-4 py-2 rounded-lg bg-green-600/15 hover:bg-green-600/25 text-green-400 border border-green-600/40 transition-colors mb-3",children:[a.jsx(Te,{className:"w-4 h-4"})," ",n("channels.scanToBind")]}),a.jsxs("button",{onClick:C,className:"flex items-center gap-1.5 text-sm px-4 py-2 rounded-lg bg-accent-blue hover:bg-accent-blue/90 text-white transition-colors",children:[a.jsx(ne,{className:"w-4 h-4"})," ",n("channels.createInstance")]})]}),d.length===1&&p===""&&d[0]&&a.jsx(qe,{channel:d[0],onEdit:()=>b(d[0].id),onDelete:()=>v(d[0].id),onToggle:f=>E(d[0].id,f),onQr:()=>g(d[0])}),d.length>1&&p===""&&a.jsx("div",{className:"space-y-3",children:d.map(f=>a.jsx(qe,{channel:f,onEdit:()=>b(f.id),onDelete:()=>v(f.id),onToggle:B=>E(f.id,B),onQr:()=>g(f)},f.id))}),p!==""&&(j||k)&&a.jsx(It,{form:A,upd:m,saving:R,editing:!!k,channel:k??void 0,onSave:S,onCancel:w,onDelete:k?()=>v(k.id):void 0,onQr:k?()=>g(k):void 0})]})]}):a.jsx("div",{className:"flex-1 flex items-center justify-center",children:a.jsxs("div",{className:"text-center",children:[a.jsx(kt,{className:"w-12 h-12 mx-auto mb-3 text-dark-muted/40"}),a.jsx("p",{className:"text-dark-muted text-sm",children:n("channels.selectTypeHint")})]})})}function qe({channel:n,onEdit:i,onDelete:s,onToggle:t,onQr:e}){const{t:r}=_();return a.jsxs("div",{className:"border border-dark-border rounded-lg bg-dark-surface overflow-hidden",children:[a.jsx("div",{className:"p-5",children:a.jsxs("div",{className:"flex items-start justify-between",children:[a.jsxs("div",{children:[a.jsx("h3",{className:"font-medium text-dark-text",children:n.name}),a.jsxs("div",{className:"flex items-center gap-3 mt-2",children:[a.jsx("span",{className:`flex items-center gap-1 text-xs ${n.connected?"text-green-400":"text-dark-muted"}`,children:n.connected?a.jsxs(a.Fragment,{children:[a.jsx(gt,{className:"w-3 h-3"})," ",r("channels.status.connected")]}):a.jsxs(a.Fragment,{children:[a.jsx(mt,{className:"w-3 h-3"})," ",r("channels.status.disconnected")]})}),a.jsxs("span",{className:"text-xs text-dark-muted",children:["AppID: ",n.appId||"—"]})]})]}),a.jsx("button",{onClick:()=>t(!n.enabled),className:`w-9 h-5 rounded-full relative transition-colors shrink-0 ${n.enabled?"bg-green-600":"bg-gray-600"}`,children:a.jsx("span",{className:`absolute top-0.5 w-4 h-4 bg-white rounded-full transition-all ${n.enabled?"left-[18px]":"left-0.5"}`})})]})}),a.jsxs("div",{className:"flex items-center gap-1 px-5 py-2.5 bg-dark-bg/50 border-t border-dark-border",children:[n.type==="wechat"&&a.jsxs("button",{onClick:e,className:"flex items-center gap-1.5 text-xs px-3 py-1.5 rounded-md text-green-400 hover:bg-green-500/10 transition-colors",children:[a.jsx(Te,{className:"w-3.5 h-3.5"})," ",r("channels.actions.qrLogin")]}),a.jsxs("button",{onClick:i,className:"flex items-center gap-1.5 text-xs px-3 py-1.5 rounded-md text-accent-blue hover:bg-accent-blue/10 transition-colors",children:[a.jsx("span",{className:"w-3.5 h-3.5 inline-flex items-center justify-center",children:"✎"})," ",r("channels.actions.edit")]}),a.jsxs("button",{onClick:s,className:"flex items-center gap-1.5 text-xs px-3 py-1.5 rounded-md text-red-400 hover:bg-red-500/10 transition-colors ml-auto",children:[a.jsx(xt,{className:"w-3.5 h-3.5"})," ",r("channels.actions.delete")]})]})]})}function It({form:n,upd:i,saving:s,editing:t,channel:e,onSave:r,onCancel:o,onDelete:c,onQr:l}){const{t:u}=_();return a.jsxs("div",{className:"border border-dark-border rounded-lg bg-dark-surface overflow-hidden",children:[a.jsx("div",{className:"px-5 py-4 border-b border-dark-border",children:a.jsx("h3",{className:"font-medium text-dark-text",children:u(t?"channels.editConfig":"channels.createConfig")})}),a.jsxs("div",{className:"p-5 space-y-4",children:[a.jsx(De,{label:u("channels.form.name"),required:!0,children:a.jsx("input",{value:n.name,onChange:g=>i("name",g.target.value),placeholder:u("channels.form.namePlaceholderDev"),className:O})}),a.jsxs(De,{label:u("channels.form.credentials"),children:[a.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[a.jsxs("div",{children:[a.jsx("label",{className:"block text-[10px] text-dark-muted mb-1",children:u("channels.form.appId")}),a.jsx("input",{value:n.appId,onChange:g=>i("appId",g.target.value),placeholder:"AppID",className:O})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-[10px] text-dark-muted mb-1",children:"AppSecret"}),a.jsx("input",{type:"password",value:n.appSecret,onChange:g=>i("appSecret",g.target.value),placeholder:u(t?"channels.form.leaveBlankUnchanged":"channels.form.appSecretValue"),className:O})]}),a.jsxs("div",{children:[a.jsx("label",{className:"block text-[10px] text-dark-muted mb-1",children:"Token"}),a.jsx("input",{value:n.token,onChange:g=>i("token",g.target.value),placeholder:u(t?"channels.form.leaveBlankUnchanged":"channels.form.tokenCallback"),className:O})]}),n.type==="wechat"&&a.jsxs("div",{children:[a.jsx("label",{className:"block text-[10px] text-dark-muted mb-1",children:"EncodingAESKey"}),a.jsx("input",{value:n.encodingAESKey,onChange:g=>i("encodingAESKey",g.target.value),placeholder:u("channels.form.optionalShort"),className:O})]})]}),n.type==="wechat"&&a.jsx("p",{className:"text-xs text-dark-muted mt-2",children:u("channels.form.wechatIlinkHint")})]}),a.jsxs("div",{className:"flex items-center justify-between rounded-lg border border-dark-border px-3 py-2.5",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-sm text-dark-text",children:u("channels.form.enabled")}),a.jsx("p",{className:"text-xs text-dark-muted",children:u("channels.form.enabledOffHint")})]}),a.jsx("button",{onClick:()=>i("enabled",!n.enabled),className:`w-9 h-5 rounded-full relative transition-colors shrink-0 ${n.enabled?"bg-green-600":"bg-gray-600"}`,children:a.jsx("span",{className:`absolute top-0.5 w-4 h-4 bg-white rounded-full transition-all ${n.enabled?"left-[18px]":"left-0.5"}`})})]}),t&&(e==null?void 0:e.type)==="wechat"&&l&&a.jsxs("button",{onClick:l,className:"w-full flex items-center justify-center gap-2 text-sm bg-green-600/15 hover:bg-green-600/25 text-green-400 border border-green-600/40 px-3 py-2.5 rounded-lg transition-colors",children:[a.jsx(Te,{className:"w-4 h-4"})," ",u("channels.qrLoginReauth")]})]}),a.jsxs("div",{className:"flex items-center justify-between px-5 py-3 bg-dark-bg/50 border-t border-dark-border",children:[a.jsx("div",{children:t&&c&&a.jsxs("button",{onClick:c,className:"flex items-center gap-1.5 text-xs px-3 py-1.5 rounded-md text-red-400 hover:bg-red-500/10 transition-colors",children:[a.jsx(xt,{className:"w-3.5 h-3.5"})," ",u("channels.actions.delete")]})}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("button",{onClick:o,className:"px-4 py-2 text-sm text-dark-muted hover:text-dark-text transition-colors",children:u("channels.actions.cancel")}),a.jsxs("button",{onClick:r,disabled:s||!n.name.trim(),className:"flex items-center gap-1.5 px-4 py-2 text-sm bg-accent-blue hover:bg-accent-blue/90 text-white rounded-lg disabled:opacity-50 transition-colors",children:[a.jsx(Et,{className:"w-3.5 h-3.5"}),u(s?"channels.saving":"channels.save")]})]})]})]})}function De({label:n,required:i,children:s}){return a.jsxs("div",{children:[a.jsxs("label",{className:"block text-xs text-dark-muted mb-1.5",children:[n,i&&a.jsx("span",{className:"text-red-400 ml-0.5",children:"*"})]}),s]})}const O="w-full bg-dark-bg border border-dark-border rounded-lg px-3 py-2 text-sm text-dark-text placeholder-dark-muted/60 focus:outline-none focus:border-accent-blue transition-colors";var V={},se,_e;function Mt(){return _e||(_e=1,se=function(){return typeof Promise=="function"&&Promise.prototype&&Promise.prototype.then}),se}var ie={},D={},Ue;function U(){if(Ue)return D;Ue=1;let n;const i=[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];return D.getSymbolSize=function(t){if(!t)throw new Error('"version" cannot be null or undefined');if(t<1||t>40)throw new Error('"version" should be in range from 1 to 40');return t*4+17},D.getSymbolTotalCodewords=function(t){return i[t]},D.getBCHDigit=function(s){let t=0;for(;s!==0;)t++,s>>>=1;return t},D.setToSJISFunction=function(t){if(typeof t!="function")throw new Error('"toSJISFunc" is not a valid function.');n=t},D.isKanjiModeEnabled=function(){return typeof n<"u"},D.toSJIS=function(t){return n(t)},D}var ae={},Fe;function Se(){return Fe||(Fe=1,(function(n){n.L={bit:1},n.M={bit:0},n.Q={bit:3},n.H={bit:2};function i(s){if(typeof s!="string")throw new Error("Param is not a string");switch(s.toLowerCase()){case"l":case"low":return n.L;case"m":case"medium":return n.M;case"q":case"quartile":return n.Q;case"h":case"high":return n.H;default:throw new Error("Unknown EC Level: "+s)}}n.isValid=function(t){return t&&typeof t.bit<"u"&&t.bit>=0&&t.bit<4},n.from=function(t,e){if(n.isValid(t))return t;try{return i(t)}catch{return e}}})(ae)),ae}var oe,Ke;function Pt(){if(Ke)return oe;Ke=1;function n(){this.buffer=[],this.length=0}return n.prototype={get:function(i){const s=Math.floor(i/8);return(this.buffer[s]>>>7-i%8&1)===1},put:function(i,s){for(let t=0;t<s;t++)this.putBit((i>>>s-t-1&1)===1)},getLengthInBits:function(){return this.length},putBit:function(i){const s=Math.floor(this.length/8);this.buffer.length<=s&&this.buffer.push(0),i&&(this.buffer[s]|=128>>>this.length%8),this.length++}},oe=n,oe}var le,ze;function Lt(){if(ze)return le;ze=1;function n(i){if(!i||i<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=i,this.data=new Uint8Array(i*i),this.reservedBit=new Uint8Array(i*i)}return n.prototype.set=function(i,s,t,e){const r=i*this.size+s;this.data[r]=t,e&&(this.reservedBit[r]=!0)},n.prototype.get=function(i,s){return this.data[i*this.size+s]},n.prototype.xor=function(i,s,t){this.data[i*this.size+s]^=t},n.prototype.isReserved=function(i,s){return this.reservedBit[i*this.size+s]},le=n,le}var ce={},Ve;function qt(){return Ve||(Ve=1,(function(n){const i=U().getSymbolSize;n.getRowColCoords=function(t){if(t===1)return[];const e=Math.floor(t/7)+2,r=i(t),o=r===145?26:Math.ceil((r-13)/(2*e-2))*2,c=[r-7];for(let l=1;l<e-1;l++)c[l]=c[l-1]-o;return c.push(6),c.reverse()},n.getPositions=function(t){const e=[],r=n.getRowColCoords(t),o=r.length;for(let c=0;c<o;c++)for(let l=0;l<o;l++)c===0&&l===0||c===0&&l===o-1||c===o-1&&l===0||e.push([r[c],r[l]]);return e}})(ce)),ce}var de={},He;function Dt(){if(He)return de;He=1;const n=U().getSymbolSize,i=7;return de.getPositions=function(t){const e=n(t);return[[0,0],[e-i,0],[0,e-i]]},de}var ue={},Oe;function _t(){return Oe||(Oe=1,(function(n){n.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};const i={N1:3,N2:3,N3:40,N4:10};n.isValid=function(e){return e!=null&&e!==""&&!isNaN(e)&&e>=0&&e<=7},n.from=function(e){return n.isValid(e)?parseInt(e,10):void 0},n.getPenaltyN1=function(e){const r=e.size;let o=0,c=0,l=0,u=null,g=null;for(let x=0;x<r;x++){c=l=0,u=g=null;for(let h=0;h<r;h++){let d=e.get(x,h);d===u?c++:(c>=5&&(o+=i.N1+(c-5)),u=d,c=1),d=e.get(h,x),d===g?l++:(l>=5&&(o+=i.N1+(l-5)),g=d,l=1)}c>=5&&(o+=i.N1+(c-5)),l>=5&&(o+=i.N1+(l-5))}return o},n.getPenaltyN2=function(e){const r=e.size;let o=0;for(let c=0;c<r-1;c++)for(let l=0;l<r-1;l++){const u=e.get(c,l)+e.get(c,l+1)+e.get(c+1,l)+e.get(c+1,l+1);(u===4||u===0)&&o++}return o*i.N2},n.getPenaltyN3=function(e){const r=e.size;let o=0,c=0,l=0;for(let u=0;u<r;u++){c=l=0;for(let g=0;g<r;g++)c=c<<1&2047|e.get(u,g),g>=10&&(c===1488||c===93)&&o++,l=l<<1&2047|e.get(g,u),g>=10&&(l===1488||l===93)&&o++}return o*i.N3},n.getPenaltyN4=function(e){let r=0;const o=e.data.length;for(let l=0;l<o;l++)r+=e.data[l];return Math.abs(Math.ceil(r*100/o/5)-10)*i.N4};function s(t,e,r){switch(t){case n.Patterns.PATTERN000:return(e+r)%2===0;case n.Patterns.PATTERN001:return e%2===0;case n.Patterns.PATTERN010:return r%3===0;case n.Patterns.PATTERN011:return(e+r)%3===0;case n.Patterns.PATTERN100:return(Math.floor(e/2)+Math.floor(r/3))%2===0;case n.Patterns.PATTERN101:return e*r%2+e*r%3===0;case n.Patterns.PATTERN110:return(e*r%2+e*r%3)%2===0;case n.Patterns.PATTERN111:return(e*r%3+(e+r)%2)%2===0;default:throw new Error("bad maskPattern:"+t)}}n.applyMask=function(e,r){const o=r.size;for(let c=0;c<o;c++)for(let l=0;l<o;l++)r.isReserved(l,c)||r.xor(l,c,s(e,l,c))},n.getBestMask=function(e,r){const o=Object.keys(n.Patterns).length;let c=0,l=1/0;for(let u=0;u<o;u++){r(u),n.applyMask(u,e);const g=n.getPenaltyN1(e)+n.getPenaltyN2(e)+n.getPenaltyN3(e)+n.getPenaltyN4(e);n.applyMask(u,e),g<l&&(l=g,c=u)}return c}})(ue)),ue}var $={},Qe;function pt(){if(Qe)return $;Qe=1;const n=Se(),i=[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],s=[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];return $.getBlocksCount=function(e,r){switch(r){case n.L:return i[(e-1)*4+0];case n.M:return i[(e-1)*4+1];case n.Q:return i[(e-1)*4+2];case n.H:return i[(e-1)*4+3];default:return}},$.getTotalCodewordsCount=function(e,r){switch(r){case n.L:return s[(e-1)*4+0];case n.M:return s[(e-1)*4+1];case n.Q:return s[(e-1)*4+2];case n.H:return s[(e-1)*4+3];default:return}},$}var he={},Q={},Je;function Ut(){if(Je)return Q;Je=1;const n=new Uint8Array(512),i=new Uint8Array(256);return(function(){let t=1;for(let e=0;e<255;e++)n[e]=t,i[t]=e,t<<=1,t&256&&(t^=285);for(let e=255;e<512;e++)n[e]=n[e-255]})(),Q.log=function(t){if(t<1)throw new Error("log("+t+")");return i[t]},Q.exp=function(t){return n[t]},Q.mul=function(t,e){return t===0||e===0?0:n[i[t]+i[e]]},Q}var Ye;function Ft(){return Ye||(Ye=1,(function(n){const i=Ut();n.mul=function(t,e){const r=new Uint8Array(t.length+e.length-1);for(let o=0;o<t.length;o++)for(let c=0;c<e.length;c++)r[o+c]^=i.mul(t[o],e[c]);return r},n.mod=function(t,e){let r=new Uint8Array(t);for(;r.length-e.length>=0;){const o=r[0];for(let l=0;l<e.length;l++)r[l]^=i.mul(e[l],o);let c=0;for(;c<r.length&&r[c]===0;)c++;r=r.slice(c)}return r},n.generateECPolynomial=function(t){let e=new Uint8Array([1]);for(let r=0;r<t;r++)e=n.mul(e,new Uint8Array([1,i.exp(r)]));return e}})(he)),he}var fe,$e;function Kt(){if($e)return fe;$e=1;const n=Ft();function i(s){this.genPoly=void 0,this.degree=s,this.degree&&this.initialize(this.degree)}return i.prototype.initialize=function(t){this.degree=t,this.genPoly=n.generateECPolynomial(this.degree)},i.prototype.encode=function(t){if(!this.genPoly)throw new Error("Encoder not initialized");const e=new Uint8Array(t.length+this.degree);e.set(t);const r=n.mod(e,this.genPoly),o=this.degree-r.length;if(o>0){const c=new Uint8Array(this.degree);return c.set(r,o),c}return r},fe=i,fe}var ge={},me={},xe={},Ge;function bt(){return Ge||(Ge=1,xe.isValid=function(i){return!isNaN(i)&&i>=1&&i<=40}),xe}var P={},We;function wt(){if(We)return P;We=1;const n="[0-9]+",i="[A-Z $%*+\\-./:]+";let s="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";s=s.replace(/u/g,"\\u");const t="(?:(?![A-Z0-9 $%*+\\-./:]|"+s+`)(?:.|[\r
2
- ]))+`;P.KANJI=new RegExp(s,"g"),P.BYTE_KANJI=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g"),P.BYTE=new RegExp(t,"g"),P.NUMERIC=new RegExp(n,"g"),P.ALPHANUMERIC=new RegExp(i,"g");const e=new RegExp("^"+s+"$"),r=new RegExp("^"+n+"$"),o=new RegExp("^[A-Z0-9 $%*+\\-./:]+$");return P.testKanji=function(l){return e.test(l)},P.testNumeric=function(l){return r.test(l)},P.testAlphanumeric=function(l){return o.test(l)},P}var Xe;function F(){return Xe||(Xe=1,(function(n){const i=bt(),s=wt();n.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]},n.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]},n.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]},n.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]},n.MIXED={bit:-1},n.getCharCountIndicator=function(r,o){if(!r.ccBits)throw new Error("Invalid mode: "+r);if(!i.isValid(o))throw new Error("Invalid version: "+o);return o>=1&&o<10?r.ccBits[0]:o<27?r.ccBits[1]:r.ccBits[2]},n.getBestModeForData=function(r){return s.testNumeric(r)?n.NUMERIC:s.testAlphanumeric(r)?n.ALPHANUMERIC:s.testKanji(r)?n.KANJI:n.BYTE},n.toString=function(r){if(r&&r.id)return r.id;throw new Error("Invalid mode")},n.isValid=function(r){return r&&r.bit&&r.ccBits};function t(e){if(typeof e!="string")throw new Error("Param is not a string");switch(e.toLowerCase()){case"numeric":return n.NUMERIC;case"alphanumeric":return n.ALPHANUMERIC;case"kanji":return n.KANJI;case"byte":return n.BYTE;default:throw new Error("Unknown mode: "+e)}}n.from=function(r,o){if(n.isValid(r))return r;try{return t(r)}catch{return o}}})(me)),me}var Ze;function zt(){return Ze||(Ze=1,(function(n){const i=U(),s=pt(),t=Se(),e=F(),r=bt(),o=7973,c=i.getBCHDigit(o);function l(h,d,p){for(let y=1;y<=40;y++)if(d<=n.getCapacity(y,p,h))return y}function u(h,d){return e.getCharCountIndicator(h,d)+4}function g(h,d){let p=0;return h.forEach(function(y){const A=u(y.mode,d);p+=A+y.getBitsLength()}),p}function x(h,d){for(let p=1;p<=40;p++)if(g(h,p)<=n.getCapacity(p,d,e.MIXED))return p}n.from=function(d,p){return r.isValid(d)?parseInt(d,10):p},n.getCapacity=function(d,p,y){if(!r.isValid(d))throw new Error("Invalid QR Code version");typeof y>"u"&&(y=e.BYTE);const A=i.getSymbolTotalCodewords(d),N=s.getTotalCodewordsCount(d,p),R=(A-N)*8;if(y===e.MIXED)return R;const T=R-u(y,d);switch(y){case e.NUMERIC:return Math.floor(T/10*3);case e.ALPHANUMERIC:return Math.floor(T/11*2);case e.KANJI:return Math.floor(T/13);case e.BYTE:default:return Math.floor(T/8)}},n.getBestVersionForData=function(d,p){let y;const A=t.from(p,t.M);if(Array.isArray(d)){if(d.length>1)return x(d,A);if(d.length===0)return 1;y=d[0]}else y=d;return l(y.mode,y.getLength(),A)},n.getEncodedBits=function(d){if(!r.isValid(d)||d<7)throw new Error("Invalid QR Code version");let p=d<<12;for(;i.getBCHDigit(p)-c>=0;)p^=o<<i.getBCHDigit(p)-c;return d<<12|p}})(ge)),ge}var pe={},et;function Vt(){if(et)return pe;et=1;const n=U(),i=1335,s=21522,t=n.getBCHDigit(i);return pe.getEncodedBits=function(r,o){const c=r.bit<<3|o;let l=c<<10;for(;n.getBCHDigit(l)-t>=0;)l^=i<<n.getBCHDigit(l)-t;return(c<<10|l)^s},pe}var be={},we,tt;function Ht(){if(tt)return we;tt=1;const n=F();function i(s){this.mode=n.NUMERIC,this.data=s.toString()}return i.getBitsLength=function(t){return 10*Math.floor(t/3)+(t%3?t%3*3+1:0)},i.prototype.getLength=function(){return this.data.length},i.prototype.getBitsLength=function(){return i.getBitsLength(this.data.length)},i.prototype.write=function(t){let e,r,o;for(e=0;e+3<=this.data.length;e+=3)r=this.data.substr(e,3),o=parseInt(r,10),t.put(o,10);const c=this.data.length-e;c>0&&(r=this.data.substr(e),o=parseInt(r,10),t.put(o,c*3+1))},we=i,we}var ye,nt;function Ot(){if(nt)return ye;nt=1;const n=F(),i=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function s(t){this.mode=n.ALPHANUMERIC,this.data=t}return s.getBitsLength=function(e){return 11*Math.floor(e/2)+6*(e%2)},s.prototype.getLength=function(){return this.data.length},s.prototype.getBitsLength=function(){return s.getBitsLength(this.data.length)},s.prototype.write=function(e){let r;for(r=0;r+2<=this.data.length;r+=2){let o=i.indexOf(this.data[r])*45;o+=i.indexOf(this.data[r+1]),e.put(o,11)}this.data.length%2&&e.put(i.indexOf(this.data[r]),6)},ye=s,ye}var Ne,rt;function Qt(){if(rt)return Ne;rt=1;const n=F();function i(s){this.mode=n.BYTE,typeof s=="string"?this.data=new TextEncoder().encode(s):this.data=new Uint8Array(s)}return i.getBitsLength=function(t){return t*8},i.prototype.getLength=function(){return this.data.length},i.prototype.getBitsLength=function(){return i.getBitsLength(this.data.length)},i.prototype.write=function(s){for(let t=0,e=this.data.length;t<e;t++)s.put(this.data[t],8)},Ne=i,Ne}var Ce,st;function Jt(){if(st)return Ce;st=1;const n=F(),i=U();function s(t){this.mode=n.KANJI,this.data=t}return s.getBitsLength=function(e){return e*13},s.prototype.getLength=function(){return this.data.length},s.prototype.getBitsLength=function(){return s.getBitsLength(this.data.length)},s.prototype.write=function(t){let e;for(e=0;e<this.data.length;e++){let r=i.toSJIS(this.data[e]);if(r>=33088&&r<=40956)r-=33088;else if(r>=57408&&r<=60351)r-=49472;else throw new Error("Invalid SJIS character: "+this.data[e]+`
3
- Make sure your charset is UTF-8`);r=(r>>>8&255)*192+(r&255),t.put(r,13)}},Ce=s,Ce}var je={exports:{}},it;function Yt(){return it||(it=1,(function(n){var i={single_source_shortest_paths:function(s,t,e){var r={},o={};o[t]=0;var c=i.PriorityQueue.make();c.push(t,0);for(var l,u,g,x,h,d,p,y,A;!c.empty();){l=c.pop(),u=l.value,x=l.cost,h=s[u]||{};for(g in h)h.hasOwnProperty(g)&&(d=h[g],p=x+d,y=o[g],A=typeof o[g]>"u",(A||y>p)&&(o[g]=p,c.push(g,p),r[g]=u))}if(typeof e<"u"&&typeof o[e]>"u"){var N=["Could not find a path from ",t," to ",e,"."].join("");throw new Error(N)}return r},extract_shortest_path_from_predecessor_list:function(s,t){for(var e=[],r=t;r;)e.push(r),s[r],r=s[r];return e.reverse(),e},find_path:function(s,t,e){var r=i.single_source_shortest_paths(s,t,e);return i.extract_shortest_path_from_predecessor_list(r,e)},PriorityQueue:{make:function(s){var t=i.PriorityQueue,e={},r;s=s||{};for(r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e.queue=[],e.sorter=s.sorter||t.default_sorter,e},default_sorter:function(s,t){return s.cost-t.cost},push:function(s,t){var e={value:s,cost:t};this.queue.push(e),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};n.exports=i})(je)),je.exports}var at;function $t(){return at||(at=1,(function(n){const i=F(),s=Ht(),t=Ot(),e=Qt(),r=Jt(),o=wt(),c=U(),l=Yt();function u(N){return unescape(encodeURIComponent(N)).length}function g(N,R,T){const j=[];let k;for(;(k=N.exec(T))!==null;)j.push({data:k[0],index:k.index,mode:R,length:k[0].length});return j}function x(N){const R=g(o.NUMERIC,i.NUMERIC,N),T=g(o.ALPHANUMERIC,i.ALPHANUMERIC,N);let j,k;return c.isKanjiModeEnabled()?(j=g(o.BYTE,i.BYTE,N),k=g(o.KANJI,i.KANJI,N)):(j=g(o.BYTE_KANJI,i.BYTE,N),k=[]),R.concat(T,j,k).sort(function(b,C){return b.index-C.index}).map(function(b){return{data:b.data,mode:b.mode,length:b.length}})}function h(N,R){switch(R){case i.NUMERIC:return s.getBitsLength(N);case i.ALPHANUMERIC:return t.getBitsLength(N);case i.KANJI:return r.getBitsLength(N);case i.BYTE:return e.getBitsLength(N)}}function d(N){return N.reduce(function(R,T){const j=R.length-1>=0?R[R.length-1]:null;return j&&j.mode===T.mode?(R[R.length-1].data+=T.data,R):(R.push(T),R)},[])}function p(N){const R=[];for(let T=0;T<N.length;T++){const j=N[T];switch(j.mode){case i.NUMERIC:R.push([j,{data:j.data,mode:i.ALPHANUMERIC,length:j.length},{data:j.data,mode:i.BYTE,length:j.length}]);break;case i.ALPHANUMERIC:R.push([j,{data:j.data,mode:i.BYTE,length:j.length}]);break;case i.KANJI:R.push([j,{data:j.data,mode:i.BYTE,length:u(j.data)}]);break;case i.BYTE:R.push([{data:j.data,mode:i.BYTE,length:u(j.data)}])}}return R}function y(N,R){const T={},j={start:{}};let k=["start"];for(let m=0;m<N.length;m++){const b=N[m],C=[];for(let w=0;w<b.length;w++){const S=b[w],v=""+m+w;C.push(v),T[v]={node:S,lastCount:0},j[v]={};for(let E=0;E<k.length;E++){const f=k[E];T[f]&&T[f].node.mode===S.mode?(j[f][v]=h(T[f].lastCount+S.length,S.mode)-h(T[f].lastCount,S.mode),T[f].lastCount+=S.length):(T[f]&&(T[f].lastCount=S.length),j[f][v]=h(S.length,S.mode)+4+i.getCharCountIndicator(S.mode,R))}}k=C}for(let m=0;m<k.length;m++)j[k[m]].end=0;return{map:j,table:T}}function A(N,R){let T;const j=i.getBestModeForData(N);if(T=i.from(R,j),T!==i.BYTE&&T.bit<j.bit)throw new Error('"'+N+'" cannot be encoded with mode '+i.toString(T)+`.
4
- Suggested mode is: `+i.toString(j));switch(T===i.KANJI&&!c.isKanjiModeEnabled()&&(T=i.BYTE),T){case i.NUMERIC:return new s(N);case i.ALPHANUMERIC:return new t(N);case i.KANJI:return new r(N);case i.BYTE:return new e(N)}}n.fromArray=function(R){return R.reduce(function(T,j){return typeof j=="string"?T.push(A(j,null)):j.data&&T.push(A(j.data,j.mode)),T},[])},n.fromString=function(R,T){const j=x(R,c.isKanjiModeEnabled()),k=p(j),m=y(k,T),b=l.find_path(m.map,"start","end"),C=[];for(let w=1;w<b.length-1;w++)C.push(m.table[b[w]].node);return n.fromArray(d(C))},n.rawSplit=function(R){return n.fromArray(x(R,c.isKanjiModeEnabled()))}})(be)),be}var ot;function Gt(){if(ot)return ie;ot=1;const n=U(),i=Se(),s=Pt(),t=Lt(),e=qt(),r=Dt(),o=_t(),c=pt(),l=Kt(),u=zt(),g=Vt(),x=F(),h=$t();function d(m,b){const C=m.size,w=r.getPositions(b);for(let S=0;S<w.length;S++){const v=w[S][0],E=w[S][1];for(let f=-1;f<=7;f++)if(!(v+f<=-1||C<=v+f))for(let B=-1;B<=7;B++)E+B<=-1||C<=E+B||(f>=0&&f<=6&&(B===0||B===6)||B>=0&&B<=6&&(f===0||f===6)||f>=2&&f<=4&&B>=2&&B<=4?m.set(v+f,E+B,!0,!0):m.set(v+f,E+B,!1,!0))}}function p(m){const b=m.size;for(let C=8;C<b-8;C++){const w=C%2===0;m.set(C,6,w,!0),m.set(6,C,w,!0)}}function y(m,b){const C=e.getPositions(b);for(let w=0;w<C.length;w++){const S=C[w][0],v=C[w][1];for(let E=-2;E<=2;E++)for(let f=-2;f<=2;f++)E===-2||E===2||f===-2||f===2||E===0&&f===0?m.set(S+E,v+f,!0,!0):m.set(S+E,v+f,!1,!0)}}function A(m,b){const C=m.size,w=u.getEncodedBits(b);let S,v,E;for(let f=0;f<18;f++)S=Math.floor(f/3),v=f%3+C-8-3,E=(w>>f&1)===1,m.set(S,v,E,!0),m.set(v,S,E,!0)}function N(m,b,C){const w=m.size,S=g.getEncodedBits(b,C);let v,E;for(v=0;v<15;v++)E=(S>>v&1)===1,v<6?m.set(v,8,E,!0):v<8?m.set(v+1,8,E,!0):m.set(w-15+v,8,E,!0),v<8?m.set(8,w-v-1,E,!0):v<9?m.set(8,15-v-1+1,E,!0):m.set(8,15-v-1,E,!0);m.set(w-8,8,1,!0)}function R(m,b){const C=m.size;let w=-1,S=C-1,v=7,E=0;for(let f=C-1;f>0;f-=2)for(f===6&&f--;;){for(let B=0;B<2;B++)if(!m.isReserved(S,f-B)){let M=!1;E<b.length&&(M=(b[E]>>>v&1)===1),m.set(S,f-B,M),v--,v===-1&&(E++,v=7)}if(S+=w,S<0||C<=S){S-=w,w=-w;break}}}function T(m,b,C){const w=new s;C.forEach(function(B){w.put(B.mode.bit,4),w.put(B.getLength(),x.getCharCountIndicator(B.mode,m)),B.write(w)});const S=n.getSymbolTotalCodewords(m),v=c.getTotalCodewordsCount(m,b),E=(S-v)*8;for(w.getLengthInBits()+4<=E&&w.put(0,4);w.getLengthInBits()%8!==0;)w.putBit(0);const f=(E-w.getLengthInBits())/8;for(let B=0;B<f;B++)w.put(B%2?17:236,8);return j(w,m,b)}function j(m,b,C){const w=n.getSymbolTotalCodewords(b),S=c.getTotalCodewordsCount(b,C),v=w-S,E=c.getBlocksCount(b,C),f=w%E,B=E-f,M=Math.floor(w/E),H=Math.floor(v/E),Nt=H+1,Re=M-H,Ct=new l(Re);let X=0;const Y=new Array(E),Ae=new Array(E);let Z=0;const jt=new Uint8Array(m.buffer);for(let K=0;K<E;K++){const te=K<B?H:Nt;Y[K]=jt.slice(X,X+te),Ae[K]=Ct.encode(Y[K]),X+=te,Z=Math.max(Z,te)}const ee=new Uint8Array(w);let Ie=0,L,q;for(L=0;L<Z;L++)for(q=0;q<E;q++)L<Y[q].length&&(ee[Ie++]=Y[q][L]);for(L=0;L<Re;L++)for(q=0;q<E;q++)ee[Ie++]=Ae[q][L];return ee}function k(m,b,C,w){let S;if(Array.isArray(m))S=h.fromArray(m);else if(typeof m=="string"){let M=b;if(!M){const H=h.rawSplit(m);M=u.getBestVersionForData(H,C)}S=h.fromString(m,M||40)}else throw new Error("Invalid data");const v=u.getBestVersionForData(S,C);if(!v)throw new Error("The amount of data is too big to be stored in a QR Code");if(!b)b=v;else if(b<v)throw new Error(`
5
- The chosen QR Code version cannot contain this amount of data.
6
- Minimum version required to store current data is: `+v+`.
7
- `);const E=T(b,C,S),f=n.getSymbolSize(b),B=new t(f);return d(B,b),p(B),y(B,b),N(B,C,0),b>=7&&A(B,b),R(B,E),isNaN(w)&&(w=o.getBestMask(B,N.bind(null,B,C))),o.applyMask(w,B),N(B,C,w),{modules:B,version:b,errorCorrectionLevel:C,maskPattern:w,segments:S}}return ie.create=function(b,C){if(typeof b>"u"||b==="")throw new Error("No input text");let w=i.M,S,v;return typeof C<"u"&&(w=i.from(C.errorCorrectionLevel,i.M),S=u.from(C.version),v=o.from(C.maskPattern),C.toSJISFunc&&n.setToSJISFunction(C.toSJISFunc)),k(b,S,w,v)},ie}var ke={},ve={},lt;function yt(){return lt||(lt=1,(function(n){function i(s){if(typeof s=="number"&&(s=s.toString()),typeof s!="string")throw new Error("Color should be defined as hex string");let t=s.slice().replace("#","").split("");if(t.length<3||t.length===5||t.length>8)throw new Error("Invalid hex color: "+s);(t.length===3||t.length===4)&&(t=Array.prototype.concat.apply([],t.map(function(r){return[r,r]}))),t.length===6&&t.push("F","F");const e=parseInt(t.join(""),16);return{r:e>>24&255,g:e>>16&255,b:e>>8&255,a:e&255,hex:"#"+t.slice(0,6).join("")}}n.getOptions=function(t){t||(t={}),t.color||(t.color={});const e=typeof t.margin>"u"||t.margin===null||t.margin<0?4:t.margin,r=t.width&&t.width>=21?t.width:void 0,o=t.scale||4;return{width:r,scale:r?4:o,margin:e,color:{dark:i(t.color.dark||"#000000ff"),light:i(t.color.light||"#ffffffff")},type:t.type,rendererOpts:t.rendererOpts||{}}},n.getScale=function(t,e){return e.width&&e.width>=t+e.margin*2?e.width/(t+e.margin*2):e.scale},n.getImageWidth=function(t,e){const r=n.getScale(t,e);return Math.floor((t+e.margin*2)*r)},n.qrToImageData=function(t,e,r){const o=e.modules.size,c=e.modules.data,l=n.getScale(o,r),u=Math.floor((o+r.margin*2)*l),g=r.margin*l,x=[r.color.light,r.color.dark];for(let h=0;h<u;h++)for(let d=0;d<u;d++){let p=(h*u+d)*4,y=r.color.light;if(h>=g&&d>=g&&h<u-g&&d<u-g){const A=Math.floor((h-g)/l),N=Math.floor((d-g)/l);y=x[c[A*o+N]?1:0]}t[p++]=y.r,t[p++]=y.g,t[p++]=y.b,t[p]=y.a}}})(ve)),ve}var ct;function Wt(){return ct||(ct=1,(function(n){const i=yt();function s(e,r,o){e.clearRect(0,0,r.width,r.height),r.style||(r.style={}),r.height=o,r.width=o,r.style.height=o+"px",r.style.width=o+"px"}function t(){try{return document.createElement("canvas")}catch{throw new Error("You need to specify a canvas element")}}n.render=function(r,o,c){let l=c,u=o;typeof l>"u"&&(!o||!o.getContext)&&(l=o,o=void 0),o||(u=t()),l=i.getOptions(l);const g=i.getImageWidth(r.modules.size,l),x=u.getContext("2d"),h=x.createImageData(g,g);return i.qrToImageData(h.data,r,l),s(x,u,g),x.putImageData(h,0,0),u},n.renderToDataURL=function(r,o,c){let l=c;typeof l>"u"&&(!o||!o.getContext)&&(l=o,o=void 0),l||(l={});const u=n.render(r,o,l),g=l.type||"image/png",x=l.rendererOpts||{};return u.toDataURL(g,x.quality)}})(ke)),ke}var Ee={},dt;function Xt(){if(dt)return Ee;dt=1;const n=yt();function i(e,r){const o=e.a/255,c=r+'="'+e.hex+'"';return o<1?c+" "+r+'-opacity="'+o.toFixed(2).slice(1)+'"':c}function s(e,r,o){let c=e+r;return typeof o<"u"&&(c+=" "+o),c}function t(e,r,o){let c="",l=0,u=!1,g=0;for(let x=0;x<e.length;x++){const h=Math.floor(x%r),d=Math.floor(x/r);!h&&!u&&(u=!0),e[x]?(g++,x>0&&h>0&&e[x-1]||(c+=u?s("M",h+o,.5+d+o):s("m",l,0),l=0,u=!1),h+1<r&&e[x+1]||(c+=s("h",g),g=0)):l++}return c}return Ee.render=function(r,o,c){const l=n.getOptions(o),u=r.modules.size,g=r.modules.data,x=u+l.margin*2,h=l.color.light.a?"<path "+i(l.color.light,"fill")+' d="M0 0h'+x+"v"+x+'H0z"/>':"",d="<path "+i(l.color.dark,"stroke")+' d="'+t(g,u,l.margin)+'"/>',p='viewBox="0 0 '+x+" "+x+'"',A='<svg xmlns="http://www.w3.org/2000/svg" '+(l.width?'width="'+l.width+'" height="'+l.width+'" ':"")+p+' shape-rendering="crispEdges">'+h+d+`</svg>
8
- `;return typeof c=="function"&&c(null,A),A},Ee}var ut;function Zt(){if(ut)return V;ut=1;const n=Mt(),i=Gt(),s=Wt(),t=Xt();function e(r,o,c,l,u){const g=[].slice.call(arguments,1),x=g.length,h=typeof g[x-1]=="function";if(!h&&!n())throw new Error("Callback required as last argument");if(h){if(x<2)throw new Error("Too few arguments provided");x===2?(u=c,c=o,o=l=void 0):x===3&&(o.getContext&&typeof u>"u"?(u=l,l=void 0):(u=l,l=c,c=o,o=void 0))}else{if(x<1)throw new Error("Too few arguments provided");return x===1?(c=o,o=l=void 0):x===2&&!o.getContext&&(l=c,c=o,o=void 0),new Promise(function(d,p){try{const y=i.create(c,l);d(r(y,o,l))}catch(y){p(y)}})}try{const d=i.create(c,l);u(null,r(d,o,l))}catch(d){u(d)}}return V.create=i.create,V.toCanvas=e.bind(null,s.render),V.toDataURL=e.bind(null,s.renderToDataURL),V.toString=e.bind(null,function(r,o,c){return t.render(r,c)}),V}var en=Zt();const tn=Tt(en),nn=2e3,ht=5;function rn({channel:n,onClose:i}){const{t:s}=_(),[t,e]=I.useState("loading"),[r,o]=I.useState(null),[c,l]=I.useState(null),[u,g]=I.useState(""),x=I.useRef(null),h=I.useRef(0),d=I.useRef(null),p=I.useRef(!1),y=()=>{d.current&&(clearTimeout(d.current),d.current=null),p.current=!0},A=async k=>{if(x.current)try{await tn.toCanvas(x.current,k,{width:240,margin:2,color:{dark:"#000000ff",light:"#ffffffff"}})}catch(m){console.warn("[WechatQr] Canvas QR generation failed, falling back to URL:",m)}},N=async()=>{if(!(p.current||!c))try{const k=await Me.channels.weixin.bindStatus(c),m=(k==null?void 0:k.data)??k,b=(m==null?void 0:m.status)??"";if(h.current=0,b==="confirmed"){e("confirmed"),re.success(n?s("channels.toastReauthSuccess",{name:n.name}):s("channels.toastBindSuccess")),setTimeout(i,2400);return}if(b==="scaned")e("scanned");else if(b==="expired"){e("expired");return}p.current||(d.current=setTimeout(N,nn))}catch(k){if(h.current++,console.warn("[WechatQr] poll error ("+h.current+"/"+ht+")",k),h.current>=ht)e("error"),g(s("channels.pollFailedRefresh")),re.error(s("channels.pollFailedToast"));else if(!p.current){const m=Math.min(1e3*Math.pow(2,h.current),1e4);d.current=setTimeout(N,m)}}},R=()=>{y(),p.current=!1,h.current=0,d.current=setTimeout(N,1e3)},T=async()=>{e("loading"),o(null),l(null),g(""),h.current=0;try{const k=await Me.channels.weixin.bind(),m=(k==null?void 0:k.data)??k,b=(m==null?void 0:m.qrcode_img_content)??"",C=(m==null?void 0:m.qrcode)??"";if(!b||!C){e("error"),g(s("channels.qrDataMissing",{data:JSON.stringify(m)}));return}o(b),l(C),await A(b),e("waiting")}catch(k){e("error");const m=String((k==null?void 0:k.message)??k);g(m),re.error(s("channels.fetchWechatQrFailed",{error:m}))}},j=()=>{T()};return I.useEffect(()=>(T(),y),[]),I.useEffect(()=>(c&&R(),y),[c]),a.jsx(St,{isOpen:!0,onClose:i,title:s("channels.bindTitle",{name:(n==null?void 0:n.name)??s("channels.typeLabels.wechat")}),size:"sm",children:a.jsxs("div",{className:"flex flex-col items-center gap-4 py-2",children:[a.jsxs("div",{className:"relative w-60 h-60 rounded-lg bg-white flex items-center justify-center overflow-hidden",children:[t==="loading"&&a.jsx("span",{className:"text-gray-400 text-sm",children:s("channels.qr.generating")}),t!=="error"&&t!=="expired"&&a.jsx("canvas",{ref:x,width:240,height:240,className:`w-full h-full object-contain ${t==="waiting"?"":"opacity-30"}`}),t==="scanned"&&a.jsxs("div",{className:"absolute inset-0 bg-black/70 flex flex-col items-center justify-center text-white gap-1",children:[a.jsx("span",{className:"text-2xl",children:"✓"}),a.jsx("span",{className:"text-sm",children:s("channels.qr.scanned")})]}),t==="confirmed"&&a.jsxs("div",{className:"absolute inset-0 bg-green-600/90 flex flex-col items-center justify-center text-white gap-2 px-4 text-center",children:[a.jsx("span",{className:"text-2xl",children:"🎉"}),a.jsx("span",{className:"text-sm font-medium",children:s("channels.bindSuccess")}),a.jsx("span",{className:"text-xs opacity-90",children:n?s("channels.connectedReady",{name:n.name}):s("channels.createdConnectedReady")}),a.jsx("button",{onClick:i,className:"mt-1 text-xs bg-white/20 hover:bg-white/30 px-3 py-1.5 rounded-md transition-colors",children:s("channels.startUsing")})]}),t==="expired"&&a.jsxs("div",{className:"absolute inset-0 bg-black/80 flex flex-col items-center justify-center text-white gap-2",children:[a.jsx("span",{className:"text-sm",children:s("channels.qr.expired")}),a.jsx("button",{onClick:j,className:"text-xs bg-green-600 hover:bg-green-500 px-3 py-1 rounded",children:s("channels.clickToRefresh")})]}),t==="error"&&a.jsxs("div",{className:"absolute inset-0 bg-black/80 flex flex-col items-center justify-center text-red-300 gap-2 px-4 text-center",children:[a.jsx("span",{className:"text-xs",children:u||s("channels.unknownError")}),a.jsx("button",{onClick:j,className:"text-xs bg-blue-600 hover:bg-blue-500 px-3 py-1 rounded text-white",children:s("channels.retry")})]})]}),a.jsxs("p",{className:"text-sm text-dark-muted text-center",children:[t==="waiting"&&s("channels.waitingAuthorize"),t==="scanned"&&s("channels.scannedConfirming"),t==="confirmed"&&s("channels.confirmedClosing"),t==="loading"&&s("channels.connectingIlink"),(t==="expired"||t==="error")&&(t==="expired"?s("channels.qr.expired"):"")]}),r&&t==="waiting"&&a.jsxs("button",{onClick:()=>window.open(r,"_blank","width=480,height=600,noopener"),className:"w-full flex items-center justify-center gap-2 text-sm bg-green-600/15 hover:bg-green-600/25 text-green-400 border border-green-600/40 px-3 py-2.5 rounded-lg transition-colors",children:[a.jsx("span",{children:"🔔"})," ",s("channels.openInNewTabFallback")]})]})})}function un(){const{t:n}=_(),{load:i,loading:s,qrOpen:t,qrChannel:e,closeQr:r}=Be();return I.useEffect(()=>{i()},[]),a.jsxs("div",{className:"flex h-full min-h-0 flex-col bg-dark-bg text-dark-text",children:[a.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b border-dark-border shrink-0",children:[a.jsxs("div",{children:[a.jsx("h2",{className:"font-semibold text-base",children:n("channels.title")}),a.jsx("p",{className:"text-xs text-dark-muted mt-0.5",children:n("channels.viewSubtitle")})]}),a.jsx("div",{className:"flex items-center gap-2",children:a.jsx("button",{onClick:()=>i(),title:n("channels.actions.refresh"),className:"p-2 rounded-lg text-dark-muted hover:text-dark-text hover:bg-dark-hover transition-colors",children:a.jsx(Bt,{className:`w-4 h-4 ${s?"animate-spin":""}`})})})]}),a.jsxs("div",{className:"flex-1 flex min-h-0 overflow-hidden",children:[a.jsx("div",{className:"w-[260px] shrink-0",children:a.jsx(Rt,{})}),a.jsx("div",{className:"flex-1 min-w-0",children:a.jsx(At,{})})]}),t&&a.jsx(rn,{channel:e,onClose:r})]})}export{un as ChannelConfigView};
@@ -1 +0,0 @@
1
- import{j as s}from"./markdown-B2L4Mq-x.js";import{a as c,i as w,A as O,aI as q,am as pe,k as be,b9 as ge,bi as he,b as G,aE as fe,a1 as V,a8 as D,S as H,av as je,bc as M,aP as ve,D as Y,w as ke}from"./icons-BxNxyk-c.js";import{u as Ne,w as ye,a as p}from"./index-RB5ffy32.js";import"./react-vendor-B2V_5iSS.js";import"./state-0T92JV0u.js";import"./panels-P_I7Q72_.js";const we={"code-intelligence":"🧠 代码智能",filesystem:"📂 文件系统",databases:"🗄️ 数据库","browser-automation":"🌐 浏览器自动化","knowledge-memory":"🧠 知识/记忆","search-web":"🔎 搜索/网页","cloud-platforms":"☁️ 云平台",communication:"💬 通讯","developer-tools":"🛠️ 开发者工具",security:"🔒 安全","test-demo":"🧪 测试/Demo",other:"📦 其他"};function Ae({onNavigate:C}){const{t:n}=Ne(),[b,i]=c.useState([]),[Q,T]=c.useState(!0),[A,B]=c.useState(null),[S,m]=c.useState({}),[L,u]=c.useState(null),[E,W]=c.useState(""),[g,_]=c.useState(null),[z,J]=c.useState("all"),[X,j]=c.useState(null),[Z,P]=c.useState({}),[ee,$]=c.useState(!1),[o,x]=c.useState({name:"",command:"",args:"",env:"",transport:"stdio",url:"",headers:""}),[h,F]=c.useState(null),[R,v]=c.useState(!1),[U,f]=c.useState(null),se=async()=>{v(!0),f(null);try{const e=await p.tools.get("computer_use");F(e.success&&e.data?!!e.data.enabled:!1)}catch(e){f(e instanceof Error?e.message:String(e))}v(!1)},te=async()=>{if(h===null)return;const e=!h;v(!0),f(null);try{const t=await p.tools.toggle("computer_use",e);t.success?F(e):f(t.error||"切换 Computer Use 失败")}catch(t){f(t instanceof Error?t.message:String(t))}v(!1)},re=()=>x({name:"",command:"",args:"",env:"",transport:"stdio",url:"",headers:""}),I=e=>Object.fromEntries(e.split(",").map(t=>t.trim()).filter(Boolean).map(t=>{const a=t.indexOf("=");return a>0?[t.slice(0,a).trim(),t.slice(a+1).trim()]:[t,""]})),ae=async()=>{const e=o.transport!=="stdio";if(!o.name.trim()||!e&&!o.command.trim()||e&&!o.url.trim()){u(n("connectors.customFormRequired"));return}m(t=>({...t,__add:!0})),u(null);try{const t=await p.connectors.addCustom({name:o.name.trim(),command:e?void 0:o.command.trim(),args:e?void 0:o.args.split(/\s+/).filter(Boolean),env:I(o.env),url:e?o.url.trim():void 0,transport:e?o.transport:void 0,headers:e?I(o.headers):void 0});t.success&&t.data?(i(a=>[...a,t.data]),$(!1),re()):u(t.error||"添加失败")}catch(t){u(t instanceof Error?t.message:String(t))}finally{m(t=>({...t,__add:!1}))}},ne=async e=>{m(t=>({...t,[e.id]:!0}));try{const t=await p.connectors.removeCustom(e.id);t.success?i(a=>a.filter(r=>r.id!==e.id)):u(t.error||"删除失败")}finally{m(t=>({...t,[e.id]:!1}))}},k=async()=>{var t;T(!0),B(null);const e=await p.connectors.list();e.success&&Array.isArray((t=e.data)==null?void 0:t.connectors)?i(e.data.connectors):B(e.error||"加载连接器失败"),T(!1)};c.useEffect(()=>{k(),se()},[]),c.useEffect(()=>{let e=null;const t=r=>{if(!r||r.type!=="mcp_update")return;let l;try{l=typeof r.data=="string"?JSON.parse(r.data):r.data||{}}catch{return}const d=String(l.server||l.name||"");/^(managed|custom)-connector-/.test(d)&&(e&&clearTimeout(e),e=setTimeout(()=>{e=null,k()},150))},a=ye.onMessage(t);return()=>{e&&clearTimeout(e),a()}},[]);const N=(e,t,a,r)=>{u(a||null),i(l=>l.map(d=>d.id===e?{...d,enabled:!!r,status:"error"}:d))},le=async(e,t,a)=>{u(null),m(r=>({...r,[e.id]:!0})),i(r=>r.map(l=>l.id===e.id?{...l,enabled:t,status:t?"connecting":"installed"}:l));try{const r=await p.connectors.toggle(e.id,t,a);r.success&&r.data?i(l=>l.map(d=>d.id===e.id?r.data:d)):N(e.id,void 0,r.error||`切换 ${e.name} 失败`,!t)}catch(r){N(e.id,void 0,r instanceof Error?r.message:String(r),!t)}finally{m(r=>({...r,[e.id]:!1}))}},oe=e=>{var t,a;if(!e.enabled&&((t=e.requiresEnv)!=null&&t.length)&&((a=e.missingEnv)!=null&&a.length)){j(e.id);return}j(null),le(e,!e.enabled)},ce=async(e,t)=>{j(null),u(null),m(a=>({...a,[e.id]:!0})),i(a=>a.map(r=>r.id===e.id?{...r,enabled:!0,status:"connecting"}:r));try{const a=await p.connectors.connect(e.id,t);a.success&&a.data?(i(r=>r.map(l=>l.id===e.id?a.data:l)),P(r=>({...r,[e.id]:{}}))):N(e.id,void 0,a.error||`连接 ${e.name} 失败`,!1)}catch(a){N(e.id,void 0,a instanceof Error?a.message:String(a),!1)}finally{m(a=>({...a,[e.id]:!1}))}},de=e=>{const t="inline-flex items-center gap-1 px-2 py-0.5 rounded text-xs font-medium";if(!e.installed)return s.jsxs("span",{className:`${t} bg-dark-hover text-dark-muted`,children:[s.jsx(Y,{size:12}),n("connectors.notInstalled")]});switch(e.status){case"ready":return s.jsxs("span",{className:`${t} bg-accent-green/15 text-accent-green`,children:[s.jsx(ke,{size:12}),n("connectors.ready")]});case"connecting":return s.jsxs("span",{className:`${t} bg-accent-blue/15 text-accent-blue`,children:[s.jsx(w,{size:12,className:"animate-spin"}),n("connectors.connecting")]});case"error":return s.jsxs("span",{className:`${t} bg-accent-red/15 text-accent-red`,children:[s.jsx(O,{size:12}),n("connectors.error")]});case"disabled":return s.jsx("span",{className:`${t} bg-dark-hover text-dark-muted`,children:n("connectors.disabled")});default:return s.jsx("span",{className:`${t} bg-dark-hover text-dark-muted`,children:n("connectors.installed")})}},y=b.filter(e=>z==="all"||e.kind===z),K=y.filter(e=>{if(E){const t=E.toLowerCase();if(![e.name,e.id,e.description,e.category??"",e.kind,...e.languages??[]].join(" ").toLowerCase().includes(t))return!1}return!(g&&e.category!==g)}).sort((e,t)=>e.enabled!==t.enabled?e.enabled?-1:1:e.name.localeCompare(t.name)),ie=[...new Set(y.map(e=>e.category).filter(Boolean))];if(Q)return s.jsx("div",{className:"flex-1 flex items-center justify-center",children:s.jsxs("div",{className:"text-center",children:[s.jsx(w,{size:32,className:"animate-spin mx-auto mb-2 text-accent-blue"}),s.jsx("p",{className:"text-dark-muted",children:n("common.loading")})]})});if(A)return s.jsx("div",{className:"flex-1 flex items-center justify-center",children:s.jsxs("div",{className:"text-center",children:[s.jsx(O,{size:32,className:"mx-auto mb-2 text-accent-red"}),s.jsx("p",{className:"text-accent-red mb-4",children:A}),s.jsx("button",{onClick:()=>void k(),className:"px-4 py-2 bg-accent-blue text-white rounded-lg",children:n("common.retry")})]})});const me=e=>{const t=Z[e.id]??{},a=(r,l)=>P(d=>({...d,[e.id]:{...d[e.id]??{},[r]:l}}));return s.jsxs("div",{className:"mt-3 pt-3 border-t border-dark-border",children:[s.jsxs("div",{className:"text-xs text-dark-muted mb-2 flex items-center gap-1",children:[s.jsx(M,{size:12}),n("connectors.needCredentials")]}),s.jsx("div",{className:"space-y-2",children:(e.requiresEnv??[]).map(r=>s.jsxs("div",{children:[s.jsx("label",{className:"block text-[11px] text-dark-muted mb-1",children:r.label}),s.jsx("input",{type:r.secret?"password":"text",value:t[r.key]??"",onChange:l=>a(r.key,l.target.value),placeholder:r.key,className:"w-full px-3 py-1.5 bg-dark-bg border border-dark-border rounded-lg text-sm text-dark-text placeholder-dark-muted focus:border-accent-blue focus:outline-none"})]},r.key))}),s.jsxs("div",{className:"flex gap-2 mt-2",children:[s.jsx("button",{onClick:()=>void ce(e,t),className:"px-3 py-1.5 bg-accent-blue text-white rounded-lg text-sm",children:n("connectors.connect")}),s.jsx("button",{onClick:()=>j(null),className:"px-3 py-1.5 bg-dark-surface border border-dark-border rounded-lg text-sm",children:n("common.cancel")})]})]})},ue=e=>{var r,l,d;const t=!!S[e.id],a=X===e.id;return s.jsxs("div",{className:`bg-dark-surface border border-dark-border rounded-lg p-4 transition-opacity ${e.enabled?"":"opacity-80"}`,children:[s.jsxs("div",{className:"flex items-start justify-between gap-4",children:[s.jsxs("div",{className:"flex items-start gap-3 flex-1 min-w-0",children:[s.jsx("span",{className:`mt-0.5 shrink-0 px-2 py-1 rounded-md text-[11px] font-semibold uppercase ${e.kind==="lsp"?"bg-accent-purple/15 text-accent-purple":"bg-accent-green/15 text-accent-green"}`,children:e.kind==="lsp"?"LSP":"MCP"}),s.jsxs("div",{className:"min-w-0",children:[s.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[s.jsx("span",{className:"font-medium text-sm truncate",children:e.name}),e.custom?s.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-accent-purple/15 text-accent-purple",children:n("connectors.custom")}):null,e.official?s.jsxs("span",{title:"Official",className:"text-[10px] px-1.5 py-0.5 rounded bg-accent-yellow/15 text-accent-yellow",children:["🎖️ ",n("connectors.official")]}):null,e.scope==="cloud"?s.jsxs("span",{title:"Cloud",className:"inline-flex items-center gap-0.5 text-[10px] px-1.5 py-0.5 rounded bg-accent-blue/15 text-accent-blue",children:[s.jsx(D,{size:9}),n("connectors.cloud")]}):s.jsxs("span",{title:"Local",className:"inline-flex items-center gap-0.5 text-[10px] px-1.5 py-0.5 rounded bg-dark-hover text-dark-muted",children:[s.jsx(H,{size:9}),n("connectors.local")]}),e.language?s.jsx("span",{className:"text-[10px]",children:e.language}):null,de(e)]}),s.jsx("p",{className:"text-xs text-dark-muted mt-1 line-clamp-2",children:e.description}),s.jsxs("div",{className:"flex items-center gap-3 mt-2 text-[11px] text-dark-muted flex-wrap",children:[s.jsxs("span",{className:"inline-flex items-center gap-1",children:[s.jsx(H,{size:11}),s.jsx("code",{className:"text-[10px]",children:e.installHint})]}),e.transport&&e.transport!=="stdio"?s.jsxs("span",{className:"inline-flex items-center gap-1 text-accent-blue",children:[s.jsx(D,{size:11}),e.transport==="sse"?"SSE":"Streamable HTTP"]}):null,(r=e.languages)!=null&&r.length?s.jsxs("span",{className:"inline-flex items-center gap-1",children:[s.jsx(je,{size:11}),e.languages.join(", ")]}):null,e.kind==="mcp"&&e.toolCount!==void 0?s.jsxs("span",{className:"inline-flex items-center gap-1",children:[s.jsx(q,{size:11}),n("connectors.toolCount",{count:e.toolCount})]}):null,(l=e.requiresEnv)!=null&&l.length?s.jsxs("span",{className:"inline-flex items-center gap-1 text-accent-yellow",children:[s.jsx(M,{size:11}),(d=e.missingEnv)!=null&&d.length?`${e.missingEnv.join(", ")} ${n("connectors.missing")}`:n("connectors.envConfigured")]}):null,e.docsUrl?s.jsxs("a",{href:e.docsUrl,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-1 hover:text-accent-blue",onClick:xe=>xe.stopPropagation(),children:[s.jsx(G,{size:11}),n("connectors.docs")]}):null]}),e.error?s.jsx("p",{className:"text-[11px] text-accent-red mt-1",children:e.error}):null]})]}),s.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[e.custom?s.jsx("button",{onClick:()=>void ne(e),disabled:t,title:n("connectors.removeCustom"),className:"p-1.5 rounded-lg text-dark-muted hover:text-accent-red hover:bg-accent-red/10 transition-colors disabled:opacity-40",children:s.jsx(ve,{size:14})}):null,!e.installed&&e.enabled?s.jsxs("span",{className:"text-[11px] text-accent-blue flex items-center gap-1",children:[s.jsx(Y,{size:11,className:"animate-pulse"}),n("connectors.installing")]}):null,s.jsx("button",{role:"switch","aria-checked":e.enabled,disabled:t,onClick:()=>oe(e),className:`relative w-12 h-6 rounded-full transition-colors disabled:opacity-50 ${e.enabled?"bg-accent-green":"bg-dark-border"}`,children:s.jsx("span",{className:`absolute top-1 w-4 h-4 bg-white rounded-full transition-transform ${e.enabled?"left-7":"left-1"}`})})]})]}),a?me(e):null]},e.id)};return s.jsxs("div",{className:"flex-1 flex flex-col overflow-hidden p-4",children:[s.jsxs("div",{className:"flex items-center justify-between mb-3",children:[s.jsxs("h2",{className:"text-lg font-semibold flex items-center gap-2",children:[s.jsx(q,{size:20}),n("nav.connectors"),s.jsxs("span",{className:"text-sm font-normal text-dark-muted",children:["· ",b.filter(e=>e.enabled).length,"/",b.length]})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsxs("button",{onClick:()=>$(e=>!e),className:"flex items-center gap-2 px-3 py-1.5 bg-accent-blue text-white rounded hover:bg-accent-blue/90 transition-colors",children:[s.jsx(pe,{size:14}),n("connectors.addCustom")]}),s.jsxs("button",{onClick:()=>void k(),className:"flex items-center gap-2 px-3 py-1.5 bg-dark-surface border border-dark-border rounded hover:bg-dark-hover transition-colors",children:[s.jsx(be,{size:14}),n("common.refresh")]})]})]}),s.jsxs("div",{className:"mb-4 p-4 bg-dark-surface border border-dark-border rounded-lg space-y-3",children:[s.jsxs("div",{className:"flex items-center justify-between gap-3",children:[s.jsxs("div",{className:"min-w-0 flex items-start gap-2",children:[s.jsx(ge,{size:16,className:"text-accent-blue mt-0.5 shrink-0"}),s.jsxs("div",{children:[s.jsx("div",{className:"text-sm text-dark-text",children:"Computer Use"}),s.jsx("div",{className:"text-xs text-dark-muted mt-0.5",children:"GUI 截屏 + 鼠标键盘操控(Windows)。每次调用需审批;需要视觉模型读屏。"})]})]}),s.jsx("button",{type:"button",role:"switch","aria-checked":!!h,disabled:R,onClick:()=>void te(),className:`relative w-9 h-5 rounded-full transition-colors shrink-0 disabled:opacity-50 ${h?"bg-accent-blue":"bg-dark-border"}`,children:R?s.jsx(w,{size:12,className:"absolute left-[7px] top-[3px] animate-spin text-white"}):s.jsx("span",{className:`absolute top-0.5 left-0 w-4 h-4 rounded-full bg-white shadow transition-transform ${h?"translate-x-[18px]":"translate-x-0.5"}`})})]}),s.jsxs("div",{className:"pt-3 border-t border-dark-border flex items-center justify-between gap-3",children:[s.jsxs("div",{className:"min-w-0 flex items-start gap-2",children:[s.jsx(he,{size:16,className:"text-accent-yellow mt-0.5 shrink-0"}),s.jsxs("div",{children:[s.jsx("div",{className:"text-sm text-dark-text",children:"xAI (Grok) API"}),s.jsx("div",{className:"text-xs text-dark-muted mt-0.5",children:"官方 OpenAI 兼容端点,支持 X 实时数据的 Grok 系列模型。"})]})]}),s.jsxs("button",{onClick:()=>C==null?void 0:C("models"),className:"flex items-center gap-1.5 px-3 py-1.5 bg-accent-blue/10 text-accent-blue border border-accent-blue/30 rounded-lg hover:bg-accent-blue/20 transition-colors text-xs shrink-0",children:["配置",s.jsx(G,{size:11})]})]}),U?s.jsx("div",{className:"text-xs text-accent-red bg-accent-red/10 border border-accent-red/30 rounded-lg px-3 py-2",children:U}):null]}),ee?s.jsxs("div",{className:"mb-4 p-4 bg-dark-surface border border-dark-border rounded-lg",children:[s.jsxs("div",{className:"flex items-center justify-between mb-3",children:[s.jsxs("div",{className:"flex items-center gap-2 text-sm font-medium",children:[s.jsx(fe,{size:15,className:"text-accent-purple"}),n("connectors.customTitle")]}),s.jsx("div",{className:"flex gap-1",children:[["stdio","🖥️ "+n("connectors.customLocal")],["http","🌐 HTTP"],["sse","📡 SSE"]].map(([e,t])=>s.jsx("button",{onClick:()=>x(a=>({...a,transport:e})),className:`px-3 py-1.5 rounded-lg text-xs transition-colors ${o.transport===e?"bg-accent-blue text-white":"bg-dark-bg border border-dark-border hover:bg-dark-hover"}`,children:t},e))})]}),s.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[s.jsxs("div",{children:[s.jsx("label",{className:"block text-[11px] text-dark-muted mb-1",children:n("connectors.customName")}),s.jsx("input",{value:o.name,onChange:e=>x(t=>({...t,name:e.target.value})),placeholder:"my-server",className:"w-full px-3 py-1.5 bg-dark-bg border border-dark-border rounded-lg text-sm text-dark-text placeholder-dark-muted focus:border-accent-blue focus:outline-none"})]}),o.transport==="stdio"?s.jsxs(s.Fragment,{children:[s.jsxs("div",{children:[s.jsx("label",{className:"block text-[11px] text-dark-muted mb-1",children:n("connectors.customCommand")}),s.jsx("input",{value:o.command,onChange:e=>x(t=>({...t,command:e.target.value})),placeholder:"npx -y @some/mcp-server",className:"w-full px-3 py-1.5 bg-dark-bg border border-dark-border rounded-lg text-sm text-dark-text placeholder-dark-muted focus:border-accent-blue focus:outline-none"})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-[11px] text-dark-muted mb-1",children:n("connectors.customArgs")}),s.jsx("input",{value:o.args,onChange:e=>x(t=>({...t,args:e.target.value})),placeholder:"--arg value",className:"w-full px-3 py-1.5 bg-dark-bg border border-dark-border rounded-lg text-sm text-dark-text placeholder-dark-muted focus:border-accent-blue focus:outline-none"})]})]}):s.jsxs("div",{children:[s.jsx("label",{className:"block text-[11px] text-dark-muted mb-1",children:n("connectors.customUrl")}),s.jsx("input",{value:o.url,onChange:e=>x(t=>({...t,url:e.target.value})),placeholder:"https://mcp.example.com/mcp",className:"w-full px-3 py-1.5 bg-dark-bg border border-dark-border rounded-lg text-sm text-dark-text placeholder-dark-muted focus:border-accent-blue focus:outline-none"})]}),o.transport==="stdio"?s.jsxs("div",{children:[s.jsx("label",{className:"block text-[11px] text-dark-muted mb-1",children:n("connectors.customEnv")}),s.jsx("input",{value:o.env,onChange:e=>x(t=>({...t,env:e.target.value})),placeholder:"KEY=value, KEY2=value2",className:"w-full px-3 py-1.5 bg-dark-bg border border-dark-border rounded-lg text-sm text-dark-text placeholder-dark-muted focus:border-accent-blue focus:outline-none"})]}):s.jsxs("div",{children:[s.jsx("label",{className:"block text-[11px] text-dark-muted mb-1",children:n("connectors.customHeaders")}),s.jsx("input",{value:o.headers,onChange:e=>x(t=>({...t,headers:e.target.value})),placeholder:"Authorization=Bearer xxx",className:"w-full px-3 py-1.5 bg-dark-bg border border-dark-border rounded-lg text-sm text-dark-text placeholder-dark-muted focus:border-accent-blue focus:outline-none"})]})]}),s.jsxs("div",{className:"flex gap-2 mt-3",children:[s.jsx("button",{onClick:()=>void ae(),disabled:!!S.__add,className:"px-3 py-1.5 bg-accent-blue text-white rounded-lg text-sm disabled:opacity-50",children:S.__add?s.jsx(w,{size:14,className:"animate-spin"}):n("connectors.add")}),s.jsx("button",{onClick:()=>$(!1),className:"px-3 py-1.5 bg-dark-surface border border-dark-border rounded-lg text-sm",children:n("common.cancel")})]})]}):null,s.jsx("div",{className:"flex gap-1 mb-3",children:[["all",`${n("connectors.all")} (${b.length})`],["lsp",`LSP (${b.filter(e=>e.kind==="lsp").length})`],["mcp",`MCP (${b.filter(e=>e.kind==="mcp").length})`]].map(([e,t])=>s.jsx("button",{onClick:()=>J(e),className:`px-3 py-1.5 rounded-lg text-sm transition-colors ${z===e?"bg-accent-blue text-white":"bg-dark-surface border border-dark-border hover:bg-dark-hover"}`,children:t},e))}),s.jsx("div",{className:"flex gap-3 mb-3",children:s.jsxs("div",{className:"flex-1 relative",children:[s.jsx(V,{size:16,className:"absolute left-3 top-1/2 -translate-y-1/2 text-dark-muted"}),s.jsx("input",{type:"text",value:E,onChange:e=>W(e.target.value),placeholder:n("connectors.searchPlaceholder"),className:"w-full pl-10 pr-4 py-2 bg-dark-surface border border-dark-border rounded-lg text-dark-text placeholder-dark-muted focus:border-accent-blue focus:outline-none"})]})}),s.jsxs("div",{className:"flex gap-1 mb-4 flex-wrap",children:[s.jsxs("button",{onClick:()=>_(null),className:`px-3 py-1.5 rounded-lg text-sm transition-colors ${g?"bg-dark-surface border border-dark-border hover:bg-dark-hover":"bg-accent-blue text-white"}`,children:[n("connectors.all")," ",s.jsxs("span",{className:"opacity-70 text-xs",children:["(",y.length,")"]})]}),ie.map(e=>{const t=y.filter(a=>a.category===e).length;return s.jsxs("button",{onClick:()=>_(g===e?null:e),className:`px-3 py-1.5 rounded-lg text-sm transition-colors ${g===e?"bg-accent-blue text-white":"bg-dark-surface border border-dark-border hover:bg-dark-hover"}`,children:[we[e]??e," ",s.jsxs("span",{className:"opacity-70 text-xs",children:["(",t,")"]})]},e)})]}),L?s.jsx("div",{className:"mb-4 px-3 py-2 bg-accent-red/10 border border-accent-red/30 rounded-lg text-accent-red text-sm",children:L}):null,s.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto custom-scrollbar",children:K.length===0?s.jsxs("div",{className:"text-center text-dark-muted text-sm py-10",children:[s.jsx(V,{size:24,className:"mx-auto mb-2 opacity-50"}),n("connectors.noResults")]}):s.jsx("div",{className:"space-y-2",children:K.map(ue)})})]})}export{Ae as ConnectorsView};
@@ -1 +0,0 @@
1
- import{j as e}from"./markdown-B2L4Mq-x.js";import{a as y,b4 as L,t as D,b5 as $,aP as B,X as z,j as G,ah as J,Y as W,b6 as _,aX as q,aY as X,k as V,aU as K,D as Q,am as Z}from"./icons-BxNxyk-c.js";import{c as ee}from"./state-0T92JV0u.js";import{a as j,u as E}from"./index-RB5ffy32.js";import"./react-vendor-B2V_5iSS.js";import"./panels-P_I7Q72_.js";const P=ee((l,d)=>({rules:[],stats:null,events:[],agents:[],loading:!1,error:null,fieldErrors:null,formOpen:!1,editingRule:null,dryRunResult:null,loadRules:async()=>{const t=await j.hooks.list();t.success&&Array.isArray(t.data)?l({rules:t.data}):t.success&&t.data&&!Array.isArray(t.data)?l({error:"服务端返回的规则数据格式异常"}):l({error:t.error||"Failed to load rules"})},loadStats:async()=>{const t=await j.hooks.stats();t.success&&t.data&&l({stats:t.data})},loadEvents:async()=>{const t=await j.hooks.events();t.success&&Array.isArray(t.data)?l({events:t.data}):t.success&&t.data&&!Array.isArray(t.data)&&l({error:"服务端返回的事件数据格式异常"})},loadAgents:async()=>{const t=await j.hooks.agents();t.success&&Array.isArray(t.data)?l({agents:t.data}):t.success&&t.data&&!Array.isArray(t.data)&&l({error:"服务端返回的Agent数据格式异常"})},loadAll:async()=>{l({loading:!0,error:null});try{await Promise.all([d().loadRules(),d().loadStats(),d().loadEvents(),d().loadAgents()])}catch(t){l({error:String(t)})}finally{l({loading:!1})}},createRule:async t=>{l({fieldErrors:null});const r=await j.hooks.create(t);if(r.success)return await d().loadRules(),await d().loadStats(),l({formOpen:!1,editingRule:null}),!0;if(r.error){l({error:r.error});try{const c=JSON.parse(r.error);c.fieldErrors&&l({fieldErrors:c.fieldErrors})}catch{}}return!1},updateRule:async(t,r)=>{l({fieldErrors:null});const c=await j.hooks.update(t,r);return c.success?(await d().loadRules(),l({formOpen:!1,editingRule:null}),!0):(l({error:c.error||"Update failed"}),!1)},deleteRule:async t=>{const r=await j.hooks.delete(t);return r.success?(await d().loadRules(),await d().loadStats(),!0):(l({error:r.error||"Delete failed"}),!1)},batchDelete:async t=>{const r=await j.hooks.batchDelete(t);return r.success?(await d().loadRules(),await d().loadStats(),!0):(l({error:r.error||"Batch delete failed"}),!1)},toggleRule:async(t,r)=>(await j.hooks.toggle(t,r)).success?(l(x=>({rules:x.rules.map(p=>p.name===t?{...p,enabled:r}:p)})),!0):(await d().loadRules(),!1),batchToggle:async(t,r)=>(await j.hooks.batchToggle(t,r)).success?(l(x=>({rules:x.rules.map(p=>t.includes(p.name)?{...p,enabled:r}:p)})),!0):(await d().loadRules(),!1),dryRun:async t=>{const r=await j.hooks.dryRun(t);return r.success&&r.data?(l({dryRunResult:r.data}),r.data):(l({error:r.error||"Dry-run failed"}),null)},openForm:t=>l({formOpen:!0,editingRule:t||null,dryRunResult:null,fieldErrors:null}),closeForm:()=>l({formOpen:!1,editingRule:null,dryRunResult:null,fieldErrors:null}),setDryRunResult:t=>l({dryRunResult:t}),clearError:()=>l({error:null}),clearFieldErrors:()=>l({fieldErrors:null})})),te={SYSTEM:"bg-accent-red/15 text-accent-red",SECURITY:"bg-accent-orange/15 text-accent-orange",PROJECT:"bg-accent-blue/15 text-accent-blue",USER:"bg-accent-green/15 text-accent-green",PLUGIN:"bg-accent-purple/15 text-accent-purple"},ae={SHELL:"bg-accent-yellow/15 text-accent-yellow",HTTP:"bg-accent-cyan/15 text-accent-cyan",PROMPT:"bg-accent-purple/15 text-accent-purple",AGENT:"bg-accent-blue/15 text-accent-blue"};function se({rules:l,onEdit:d}){const{t}=E(),{toggleRule:r,deleteRule:c,batchDelete:x,batchToggle:p}=P(),[k,b]=y.useState(new Set),[R,v]=y.useState(!1),T=Array.isArray(l)?l:[];if(T.length===0)return e.jsxs("div",{className:"flex flex-1 flex-col items-center justify-center gap-3 py-16 text-dark-muted",children:[e.jsx("div",{className:"text-4xl opacity-60",children:"🪝"}),e.jsx("p",{className:"text-sm",children:t("hook.noRules")}),e.jsx("p",{className:"text-xs text-dark-muted/70",children:t("hook.noRulesHint")})]});const C=n=>{const s=new Set(k);s.has(n)?s.delete(n):s.add(n),b(s),v(s.size===T.length)},h=()=>{R?(b(new Set),v(!1)):(b(new Set(T.map(n=>n.name))),v(!0))},w=()=>{k.size!==0&&confirm(t("hook.batchDeleteConfirm",{n:k.size}))&&(x(Array.from(k)),b(new Set),v(!1))},m=n=>{k.size!==0&&(p(Array.from(k),n),b(new Set),v(!1))};return e.jsxs("div",{className:"flex flex-1 flex-col min-h-0",children:[k.size>0&&e.jsxs("div",{className:"mb-2 flex items-center gap-2 rounded-lg border border-accent-blue/30 bg-accent-blue/5 px-3 py-1.5 text-sm",children:[e.jsx("span",{className:"text-dark-muted",children:t("hook.selectedItems",{n:k.size})}),e.jsx("button",{onClick:()=>m(!0),className:"rounded bg-accent-green/15 px-2 py-0.5 text-accent-green transition-colors hover:bg-accent-green/25",children:t("hook.enableAll")}),e.jsx("button",{onClick:()=>m(!1),className:"rounded bg-dark-hover px-2 py-0.5 text-dark-text transition-colors hover:bg-dark-border",children:t("hook.disableAll")}),e.jsx("button",{onClick:w,className:"rounded bg-accent-red/15 px-2 py-0.5 text-accent-red transition-colors hover:bg-accent-red/25",children:t("common.delete")})]}),e.jsx("div",{className:"flex-1 min-h-0 overflow-auto custom-scrollbar rounded-xl border border-dark-border",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{className:"sticky top-0 bg-dark-hover text-dark-muted",children:e.jsxs("tr",{children:[e.jsx("th",{className:"w-8 p-2.5",children:e.jsx("button",{onClick:h,children:R?e.jsx(L,{size:14}):e.jsx(D,{size:14})})}),e.jsx("th",{className:"p-2.5 text-left font-medium",children:t("hook.colName")}),e.jsx("th",{className:"p-2.5 text-left font-medium",children:t("hook.colEvents")}),e.jsx("th",{className:"p-2.5 text-left font-medium",children:t("hook.colType")}),e.jsx("th",{className:"p-2.5 text-left font-medium",children:t("hook.fieldPriority")}),e.jsx("th",{className:"p-2.5 text-left font-medium",children:t("hook.colStatus")}),e.jsx("th",{className:"p-2.5 text-right font-medium",children:t("hook.colActions")})]})}),e.jsx("tbody",{className:"divide-y divide-dark-border",children:T.map(n=>e.jsxs("tr",{className:"transition-colors hover:bg-dark-hover/50",children:[e.jsx("td",{className:"p-2.5",children:e.jsx("button",{onClick:()=>C(n.name),children:k.has(n.name)?e.jsx(L,{size:14,className:"text-accent-blue"}):e.jsx(D,{size:14,className:"text-dark-muted"})})}),e.jsxs("td",{className:"p-2.5",children:[e.jsx("div",{className:"font-medium text-dark-text",children:n.name}),n.description&&e.jsx("div",{className:"mt-0.5 max-w-[220px] truncate text-xs text-dark-muted",children:n.description})]}),e.jsx("td",{className:"p-2.5",children:e.jsxs("div",{className:"flex flex-wrap gap-1",children:[Array.isArray(n.events)&&n.events.slice(0,3).map(s=>e.jsx("span",{className:"rounded bg-dark-hover px-1.5 py-0.5 text-xs text-dark-text",children:s},s)),Array.isArray(n.events)&&n.events.length>3&&e.jsxs("span",{className:"px-1 py-0.5 text-xs text-dark-muted",children:["+",n.events.length-3]})]})}),e.jsx("td",{className:"p-2.5",children:e.jsx("span",{className:`rounded px-1.5 py-0.5 text-xs font-medium ${ae[n.implementationType]||"bg-dark-hover text-dark-muted"}`,children:n.implementationType})}),e.jsx("td",{className:"p-2.5",children:e.jsx("span",{className:`rounded px-1.5 py-0.5 text-xs font-medium ${te[n.priority]||"bg-dark-hover text-dark-muted"}`,children:n.priority})}),e.jsx("td",{className:"p-2.5",children:e.jsx("button",{onClick:()=>r(n.name,!n.enabled),className:`relative h-5 w-9 rounded-full transition-colors ${n.enabled?"bg-accent-green":"bg-dark-border"}`,title:n.enabled?t("hook.clickToDisable"):t("hook.clickToEnable"),children:e.jsx("span",{className:`absolute top-0.5 block h-3.5 w-3.5 rounded-full bg-white transition-all ${n.enabled?"left-[18px]":"left-[2px]"}`})})}),e.jsx("td",{className:"p-2.5",children:e.jsxs("div",{className:"flex items-center justify-end gap-1",children:[e.jsx("button",{onClick:()=>d(n),className:"rounded p-1 text-dark-muted transition-colors hover:bg-dark-hover hover:text-accent-blue",title:t("hook.actionEdit"),children:e.jsx($,{size:14})}),e.jsx("button",{onClick:()=>{confirm(t("hook.deleteRuleConfirm",{name:n.name}))&&c(n.name)},className:"rounded p-1 text-dark-muted transition-colors hover:bg-dark-hover hover:text-accent-red",title:t("common.delete"),children:e.jsx(B,{size:14})})]})})]},n.name))})]})})]})}const re={name:"",description:"",events:[],implementationType:"SHELL",command:"",url:"",promptTemplate:"",agentName:"",priority:"USER",tools:[],matcherToolNamePattern:"",matcherFromState:"",matcherToState:"",timeoutMs:3e4,enabled:!0,failOpen:!0,scope:"project"},le=[{value:"SYSTEM",label:"SYSTEM (100)"},{value:"SECURITY",label:"SECURITY (80)"},{value:"PROJECT",label:"PROJECT (60)"},{value:"USER",label:"USER (40)"},{value:"PLUGIN",label:"PLUGIN (20)"}],g=l=>`w-full rounded-lg border bg-dark-bg px-3 py-2 text-sm text-dark-text placeholder-dark-muted/60 transition-colors focus:outline-none focus:ring-2 ${l?"border-accent-red focus:border-accent-red focus:ring-accent-red/20":"border-dark-border focus:border-accent-blue focus:ring-accent-blue/20"}`,f="mb-1 block text-xs font-medium text-dark-muted";function ne({events:l,agents:d}){const{t}=E(),{editingRule:r,fieldErrors:c,dryRunResult:x,createRule:p,updateRule:k,closeForm:b,dryRun:R,setDryRunResult:v,clearFieldErrors:T}=P(),C=[{value:"SHELL",label:t("hook.implShell"),desc:t("hook.implShellDesc")},{value:"HTTP",label:t("hook.implHttp"),desc:t("hook.implHttpDesc")},{value:"PROMPT",label:"LLM Prompt",desc:t("hook.implPromptDesc")},{value:"AGENT",label:"AI Agent",desc:t("hook.implAgentDesc")}],h=Array.isArray(l)?l:[],w=Array.isArray(d)?d:[],[m,n]=y.useState(0),[s,N]=y.useState(re),[S,O]=y.useState("");y.useEffect(()=>{var a,o,i;r&&N({name:r.name,description:r.description||"",events:r.events,implementationType:r.implementationType,command:r.command||"",url:r.url||"",promptTemplate:r.promptTemplate||"",agentName:r.agentName||"",priority:r.priority,tools:r.tools||[],matcherToolNamePattern:((a=r.matchers)==null?void 0:a.toolNamePattern)||"",matcherFromState:((o=r.matchers)==null?void 0:o.fromState)||"",matcherToState:((i=r.matchers)==null?void 0:i.toState)||"",timeoutMs:r.timeoutMs,enabled:r.enabled,failOpen:r.failOpen,scope:r.scope||"project"})},[r]);const u=(a,o)=>{N(i=>({...i,[a]:o})),T()},I=a=>{N(o=>({...o,events:o.events.includes(a)?o.events.filter(i=>i!==a):[...o.events,a]}))},F=a=>{const o=a.every(i=>s.events.includes(i));N(o?i=>({...i,events:i.events.filter(A=>!a.includes(A))}):i=>({...i,events:[...new Set([...i.events,...a])]}))},U=async()=>{const a={};s.matcherToolNamePattern&&(a.toolNamePattern=s.matcherToolNamePattern),s.matcherFromState&&(a.fromState=s.matcherFromState),s.matcherToState&&(a.toState=s.matcherToState);const i={...{...s,tools:s.tools.length>0?s.tools:[]}};i.matchers=a,delete i.matcherToolNamePattern,delete i.matcherFromState,delete i.matcherToState,r?await k(r.name,i):await p(i)},M=async()=>{v(null);const a={};s.matcherToolNamePattern&&(a.toolNamePattern=s.matcherToolNamePattern),await R({hook:{name:s.name||"dry-run",description:s.description,events:s.events,implementationType:s.implementationType,command:s.command,url:s.url,promptTemplate:s.promptTemplate,agentName:s.agentName,priority:s.priority,tools:s.tools,matchers:a,timeoutMs:s.timeoutMs,enabled:!0,failOpen:s.failOpen,scope:s.scope},eventType:s.events[0]||"PRE_TOOL_USE",toolName:"",toolInput:""})},H=S?h.map(a=>({...a,events:Array.isArray(a.events)?a.events.filter(o=>o.name.toLowerCase().includes(S.toLowerCase())||o.summary.includes(S)):[]})).filter(a=>a.events.length>0):h,Y=[{title:t("hook.stepBasicTitle"),desc:t("hook.stepBasicDesc")},{title:t("hook.stepImplTitle"),desc:t("hook.stepImplDesc")},{title:t("hook.stepAdvancedTitle"),desc:t("hook.stepAdvancedDesc")}];return e.jsxs("div",{className:"fixed inset-0 z-50 flex justify-end",children:[e.jsx("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-sm",onClick:b}),e.jsxs("div",{className:"relative flex h-full w-[560px] flex-col border-l border-dark-border bg-dark-bg shadow-2xl animate-slide-in-right",children:[e.jsxs("div",{className:"flex flex-shrink-0 items-center justify-between border-b border-dark-border px-4 py-3.5",children:[e.jsx("h3",{className:"text-base font-semibold text-dark-text",children:r?t("hook.editRule",{name:r.name}):t("hook.addRule")}),e.jsx("button",{onClick:b,className:"rounded-lg p-1 text-dark-muted transition-colors hover:bg-dark-hover hover:text-dark-text",children:e.jsx(z,{size:18})})]}),e.jsx("div",{className:"flex flex-shrink-0 border-b border-dark-border",children:Y.map((a,o)=>{const i=o===m,A=o<m;return e.jsxs("button",{onClick:()=>n(o),className:`relative flex-1 border-b-2 px-2 py-2.5 text-center text-xs transition-colors ${i?"border-accent-blue bg-accent-blue/5 text-accent-blue":A?"border-transparent text-dark-text":"border-transparent text-dark-muted hover:text-dark-text"}`,children:[e.jsx("span",{className:`mr-1 inline-flex h-4 w-4 items-center justify-center rounded-full text-[10px] ${i?"bg-accent-blue text-white":A?"bg-accent-green text-white":"bg-dark-hover text-dark-muted"}`,children:A?"✓":o+1}),e.jsx("span",{className:"font-medium",children:a.title})]},a.title)})}),e.jsxs("div",{className:"flex-1 min-h-0 space-y-4 overflow-auto custom-scrollbar p-4",children:[c&&Object.keys(c).length>0&&e.jsx("div",{className:"rounded-lg border border-accent-red/40 bg-accent-red/10 p-2.5 text-xs text-accent-red",children:Object.entries(c).map(([a,o])=>e.jsxs("div",{children:[e.jsxs("strong",{children:[a,":"]})," ",o]},a))}),m===0&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:f,children:t("hook.fieldName")}),e.jsx("input",{value:s.name,onChange:a=>u("name",a.target.value),placeholder:"my-custom-hook",className:g(c==null?void 0:c.name)})]}),e.jsxs("div",{children:[e.jsx("label",{className:f,children:t("hook.fieldDescription")}),e.jsx("textarea",{value:s.description,onChange:a=>u("description",a.target.value),placeholder:t("hook.descriptionPlaceholder"),rows:2,className:g()})]}),e.jsxs("div",{children:[e.jsx("label",{className:f,children:"Scope"}),e.jsxs("select",{value:s.scope,onChange:a=>u("scope",a.target.value),className:g(),children:[e.jsx("option",{value:"project",children:"project (.agent/hooks.json)"}),e.jsx("option",{value:"user",children:"user (~/.agent/hooks.json)"}),e.jsx("option",{value:"local",children:"local (.agent/hooks.local.json)"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-1 flex items-center justify-between",children:[e.jsx("label",{className:"text-xs font-medium text-dark-muted",children:t("hook.fieldEvents")}),e.jsx("span",{className:"text-xs text-accent-blue",children:t("hook.eventsSelected",{n:s.events.length})})]}),e.jsx("input",{value:S,onChange:a=>O(a.target.value),placeholder:t("hook.searchEventsPlaceholder"),className:g()+" mb-2"}),e.jsx("div",{className:"max-h-[280px] space-y-2 overflow-auto custom-scrollbar rounded-lg border border-dark-border bg-dark-surface p-2",children:H.map(a=>e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>F(a.events.map(o=>o.name)),className:"mb-1 text-xs font-medium text-dark-muted transition-colors hover:text-dark-text",children:[a.category," — ",t("hook.toggleAllEvents")]}),a.events.map(o=>{const i=s.events.includes(o.name);return e.jsxs("label",{className:"flex cursor-pointer items-center gap-2 rounded px-1 py-1 transition-colors hover:bg-dark-hover",children:[e.jsx("input",{type:"checkbox",checked:i,onChange:()=>I(o.name),className:"h-3.5 w-3.5 accent-accent-blue"}),e.jsx("span",{className:"text-xs text-dark-text",children:o.name}),e.jsxs("span",{className:"truncate text-xs text-dark-muted",children:["— ",o.summary]})]},o.name)})]},a.category))})]})]}),m===1&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:f,children:t("hook.fieldImplType")}),e.jsx("div",{className:"grid grid-cols-2 gap-2",children:C.map(a=>{const o=s.implementationType===a.value;return e.jsxs("button",{onClick:()=>u("implementationType",a.value),className:`rounded-lg border p-3 text-left transition-colors ${o?"border-accent-blue bg-accent-blue/10 ring-1 ring-accent-blue/30":"border-dark-border bg-dark-surface hover:bg-dark-hover"}`,children:[e.jsx("div",{className:`text-sm font-medium ${o?"text-accent-blue":"text-dark-text"}`,children:a.label}),e.jsx("div",{className:"mt-1 text-xs text-dark-muted",children:a.desc})]},a.value)})})]}),s.implementationType==="SHELL"&&e.jsxs("div",{children:[e.jsx("label",{className:f,children:t("hook.fieldCommand")}),e.jsx("input",{value:s.command,onChange:a=>u("command",a.target.value),placeholder:"python3 .agent/hooks/audit.py",className:`font-mono ${g(c==null?void 0:c.command)}`})]}),s.implementationType==="HTTP"&&e.jsxs("div",{children:[e.jsx("label",{className:f,children:"URL *"}),e.jsx("input",{value:s.url,onChange:a=>u("url",a.target.value),placeholder:"https://example.com/hooks/audit",className:g(c==null?void 0:c.url)})]}),s.implementationType==="PROMPT"&&e.jsxs("div",{children:[e.jsx("label",{className:f,children:t("hook.fieldPromptTemplate")}),e.jsx("textarea",{value:s.promptTemplate,onChange:a=>u("promptTemplate",a.target.value),placeholder:t("hook.promptTemplatePlaceholder"),rows:5,className:`font-mono ${g(c==null?void 0:c.promptTemplate)}`})]}),s.implementationType==="AGENT"&&e.jsxs("div",{children:[e.jsx("label",{className:f,children:"Agent *"}),e.jsxs("select",{value:s.agentName,onChange:a=>u("agentName",a.target.value),className:g(c==null?void 0:c.agentName),children:[e.jsx("option",{value:"",children:t("hook.selectAgentPlaceholder")}),w.map(a=>e.jsxs("option",{value:a.id,children:[a.name," (",a.description,")"]},a.id))]}),e.jsx("p",{className:"mt-1 text-xs text-dark-muted",children:t("hook.agentReadOnlyHint")})]})]}),m===2&&e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:f,children:t("hook.fieldPriority")}),e.jsx("select",{value:s.priority,onChange:a=>u("priority",a.target.value),className:g(),children:le.map(a=>e.jsx("option",{value:a.value,children:a.label},a.value))})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsxs("div",{children:[e.jsx("label",{className:f,children:t("hook.fieldTimeout")}),e.jsx("input",{type:"number",value:s.timeoutMs,onChange:a=>u("timeoutMs",parseInt(a.target.value)||3e4),min:100,max:3e5,step:1e3,className:g()})]}),e.jsxs("div",{className:"flex flex-col gap-2.5",children:[e.jsxs("label",{className:"flex items-center gap-2 text-sm text-dark-text",children:[e.jsx("input",{type:"checkbox",checked:s.enabled,onChange:a=>u("enabled",a.target.checked),className:"h-3.5 w-3.5 accent-accent-blue"}),t("hook.labelEnabled")]}),e.jsxs("label",{className:"flex items-center gap-2 text-sm text-dark-text",children:[e.jsx("input",{type:"checkbox",checked:s.failOpen,onChange:a=>u("failOpen",a.target.checked),className:"h-3.5 w-3.5 accent-accent-blue"}),t("hook.failOpenLabel")]})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:f,children:t("hook.fieldToolFilter")}),e.jsx("input",{value:s.matcherToolNamePattern,onChange:a=>u("matcherToolNamePattern",a.target.value),placeholder:"Bash.*|FileWrite.*",className:`font-mono ${g()}`})]}),s.events.some(a=>a.includes("STATE"))&&e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsxs("div",{children:[e.jsx("label",{className:f,children:"From State"}),e.jsx("input",{value:s.matcherFromState,onChange:a=>u("matcherFromState",a.target.value),className:g()})]}),e.jsxs("div",{children:[e.jsx("label",{className:f,children:"To State"}),e.jsx("input",{value:s.matcherToState,onChange:a=>u("matcherToState",a.target.value),className:g()})]})]}),x&&e.jsxs("div",{className:"rounded-lg border border-dark-border bg-dark-surface p-3",children:[e.jsx("div",{className:"mb-2 text-xs font-medium text-dark-text",children:t("hook.dryRunResultTitle")}),e.jsxs("div",{className:"space-y-1 text-xs",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-dark-muted",children:t("hook.dryRunDecision")}),e.jsx("span",{className:x.decision==="ALLOW"?"text-accent-green":x.decision==="DENY"?"text-accent-red":"text-accent-yellow",children:x.decision})]}),e.jsxs("div",{children:[e.jsx("span",{className:"text-dark-muted",children:t("hook.dryRunReason")}),e.jsx("span",{className:"text-dark-text",children:x.reason})]}),x.contextOutput&&e.jsxs("div",{children:[e.jsx("span",{className:"text-dark-muted",children:t("hook.dryRunOutput")}),e.jsx("span",{className:"text-dark-text",children:x.contextOutput})]})]})]}),e.jsxs("button",{onClick:M,className:"inline-flex items-center gap-1.5 rounded-lg border border-dark-border bg-dark-surface px-3 py-1.5 text-xs text-dark-text transition-colors hover:bg-dark-hover",children:[e.jsx(G,{size:12})," ",t("hook.dryRunButton")]})]})]}),e.jsxs("div",{className:"flex flex-shrink-0 items-center justify-between border-t border-dark-border px-4 py-3",children:[e.jsx("div",{className:"flex gap-2",children:m>0&&e.jsxs("button",{onClick:()=>n(m-1),className:"inline-flex items-center gap-1 rounded-lg border border-dark-border bg-dark-surface px-3 py-1.5 text-sm text-dark-text transition-colors hover:bg-dark-hover",children:[e.jsx(J,{size:14})," ",t("hook.prevStep")]})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("button",{onClick:b,className:"rounded-lg border border-dark-border bg-dark-surface px-4 py-1.5 text-sm text-dark-text transition-colors hover:bg-dark-hover",children:t("common.cancel")}),m<2?e.jsxs("button",{onClick:()=>n(m+1),className:"inline-flex items-center gap-1 rounded-lg bg-accent-blue px-4 py-1.5 text-sm text-white transition-colors hover:bg-accent-blue/90",children:[t("hook.nextStep")," ",e.jsx(W,{size:14})]}):e.jsx("button",{onClick:U,className:"rounded-lg bg-accent-blue px-4 py-1.5 text-sm text-white transition-colors hover:bg-accent-blue/90",children:t(r?"hook.saveChanges":"hook.createRule")})]})]})]})]})}function oe({stats:l}){const{t:d}=E();if(!l)return null;const t=[{id:"total",label:d("hook.statTotal"),value:l.totalHooks,icon:_,iconWrap:"bg-accent-blue/15 text-accent-blue"},{id:"enabled",label:d("common.enabled"),value:l.enabledCount,icon:q,iconWrap:"bg-accent-green/15 text-accent-green"},{id:"disabled",label:d("common.disabled"),value:l.disabledCount,icon:X,iconWrap:"bg-dark-hover text-dark-muted"}];return e.jsx("div",{className:"grid grid-cols-3 gap-3",children:t.map(r=>{const c=r.icon;return e.jsxs("div",{className:"flex items-center gap-3 rounded-xl border border-dark-border bg-dark-surface px-4 py-3",children:[e.jsx("span",{className:`flex h-9 w-9 shrink-0 items-center justify-center rounded-lg ${r.iconWrap}`,children:e.jsx(c,{size:18})}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-xl font-bold text-dark-text",children:r.value}),e.jsx("div",{className:"text-xs text-dark-muted",children:r.label})]})]},r.id)})})}function ue(){const{t:l}=E(),{rules:d,stats:t,events:r,agents:c,loading:x,error:p,formOpen:k,loadAll:b,openForm:R,clearError:v}=P();y.useEffect(()=>{b()},[]);const T=y.useCallback(async()=>{const h=await j.hooks.export();if(h.success&&h.data){const w=new Blob([JSON.stringify(h.data,null,2)],{type:"application/json"}),m=URL.createObjectURL(w),n=document.createElement("a");n.href=m,n.download="hooks-export.json",n.click(),URL.revokeObjectURL(m)}},[]),C=y.useCallback(()=>{const h=document.createElement("input");h.type="file",h.accept=".json",h.onchange=async w=>{var s;const m=(s=w.target.files)==null?void 0:s[0];if(!m)return;const n=await m.text();try{const N=JSON.parse(n),S=confirm(l("hook.importMergeConfirm"))?"merge":"replace";(await j.hooks.import({...N,mergeMode:S})).success&&b()}catch(N){console.error("Import failed:",N)}},h.click()},[b,l]);return e.jsxs("div",{className:"flex h-full min-h-0 flex-col bg-dark-bg text-dark-text",children:[e.jsxs("div",{className:"flex shrink-0 flex-wrap items-center justify-between gap-3 border-b border-dark-border px-6 py-4",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-base font-semibold text-dark-text",children:l("hook.configTitle")}),e.jsx("p",{className:"mt-0.5 text-xs text-dark-muted",children:l("hook.configDesc")})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{onClick:b,title:l("common.refresh"),className:"rounded-lg p-2 text-dark-muted transition-colors hover:bg-dark-hover hover:text-dark-text",children:e.jsx(V,{size:16,className:x?"animate-spin":""})}),e.jsxs("button",{onClick:C,className:"inline-flex items-center gap-1.5 rounded-lg border border-dark-border bg-dark-surface px-3 py-2 text-sm text-dark-text transition-colors hover:bg-dark-hover",children:[e.jsx(K,{size:14}),l("hook.import")]}),e.jsxs("button",{onClick:T,className:"inline-flex items-center gap-1.5 rounded-lg border border-dark-border bg-dark-surface px-3 py-2 text-sm text-dark-text transition-colors hover:bg-dark-hover",children:[e.jsx(Q,{size:14}),l("hook.export")]}),e.jsxs("button",{onClick:()=>R(),className:"inline-flex items-center gap-1.5 rounded-lg bg-accent-blue px-3 py-2 text-sm text-white transition-colors hover:bg-accent-blue/90",children:[e.jsx(Z,{size:14}),l("hook.newRule")]})]})]}),e.jsxs("div",{className:"flex-1 min-h-0 overflow-auto custom-scrollbar px-6 py-4",children:[p&&e.jsxs("div",{className:"mb-3 flex items-center justify-between rounded-lg border border-accent-red/40 bg-accent-red/10 px-4 py-2 text-sm text-accent-red",children:[e.jsx("span",{children:p}),e.jsx("button",{onClick:v,className:"text-accent-red/70 transition-colors hover:text-accent-red",children:e.jsx(z,{size:16})})]}),e.jsx(oe,{stats:t}),e.jsxs("section",{className:"mt-4 min-w-0 rounded-xl border border-dark-border bg-dark-surface p-4",children:[e.jsxs("div",{className:"mb-3 flex items-center justify-between",children:[e.jsx("h3",{className:"text-sm font-semibold text-dark-text",children:l("hook.ruleList")}),e.jsx("span",{className:"text-xs text-dark-muted",children:l("hook.ruleCount",{n:d.length})})]}),x&&d.length===0?e.jsx("div",{className:"flex h-[520px] items-center justify-center text-dark-muted",children:l("common.loading")}):e.jsx("div",{className:"min-h-[520px]",children:e.jsx(se,{rules:d,onEdit:h=>R(h)})})]})]}),k&&e.jsx(ne,{events:r,agents:c})]})}export{ue as HookConfigView};
@@ -1 +0,0 @@
1
- import{j as e}from"./markdown-B2L4Mq-x.js";import{a as o,k as ne,aw as Hs,am as ke,a1 as de,X as $e,aO as Gs,e as se,aP as Fe,aQ as ps,aD as qs,m as _s,aR as Vs,aS as Ws,D as Ys,aI as Qs,a2 as xs,A as Js,aT as Xs}from"./icons-BxNxyk-c.js";import{a as j,u as Zs,t as M,f as ce,M as hs,P as et}from"./index-RB5ffy32.js";import"./react-vendor-B2V_5iSS.js";import"./state-0T92JV0u.js";import"./panels-P_I7Q72_.js";function st(){const[k,v]=o.useState([]),[C,t]=o.useState("1.0"),[P,Pe]=o.useState(!0),[g,ie]=o.useState(!0),[Te,X]=o.useState(null),Z=o.useCallback(async()=>{ie(!0),X(null);try{const N=await j.providers.presets();N.success&&N.data?(v(Array.isArray(N.data.providers)?N.data.providers:[]),t(N.data.version||"1.0"),Pe(N.data.customSupported!==!1)):X(N.error||"获取 Provider 列表失败")}catch(N){X(N instanceof Error?N.message:"未知错误")}finally{ie(!1)}},[]);return o.useEffect(()=>{Z()},[Z]),{presets:k,loading:g,error:Te,version:C,customSupported:P,reload:Z}}const tt=[{key:"global",labelKey:"chat.globalDefault",color:"text-accent-red",bg:"bg-accent-red/20"},{key:"goal",labelKey:"chat.goalDefault",color:"text-accent-purple",bg:"bg-accent-purple/20"}],at={providerKey:"",apiKeys:[],modelIds:"",baseUrl:"",apiType:"",fullPath:!1,setDefault:!1,modelOverrides:{}},bs=et,Ne={"openai-chat-completions":"OpenAI Chat","openai-completions":"OpenAI Compatible","openai-responses":"OpenAI Responses","anthropic-messages":"Anthropic Messages","codex-responses":"Codex (本机登录)","claude-code":"Claude Code (本机登录)"};function te(k){return k.trim().split("|")[0].trim()}function lt(k){const v=k.toLowerCase();return v.startsWith("claude-code://")||v.includes("/backend-api/codex")?v.startsWith("claude-code://")?"claude-code":"codex-responses":v.includes("/anthropic")||v.includes("/coding")||v.includes("/claude")||v.includes("/messages")?"anthropic-messages":v.includes("/responses")?"openai-responses":"openai-completions"}function ze(k){if(!k)return{};const v={};for(const C of k.models){const t={};C.apiType&&C.apiType!==k.apiType&&(t.apiType=C.apiType),C.baseUrl&&(t.baseUrl=C.baseUrl),Object.keys(t).length>0&&(v[C.id]=t)}return v}const we={"opencode-free":5,"opencode-go":6,commandcode:7,deepseek:10,moonshotai:20,"moonshotai-cn":21,"kimi-for-coding":22,zhipuai:30,zai:31,"alibaba-cn":40,alibaba:41,minimax:50,"minimax-cn":51,moark:60,siliconflow:70,"siliconflow-cn":71,"stepfun-ai":80,stepfun:81,modelscope:90,openai:100,anthropic:110,google:120,"google-vertex":121,meta:130,mistral:140,groq:150,xai:160,cohere:170,openrouter:180,huggingface:190};function ut(){var ls,rs,os,ns,ds,cs,is;const{presets:k,loading:v,reload:C}=st(),{t}=Zs(),[P,Pe]=o.useState([]),[g,ie]=o.useState(null),[Te,X]=o.useState(!0),[Z,N]=o.useState(null),[Ee,Le]=o.useState(null),[n,fs]=o.useState(null),[$,gs]=o.useState([]),[vs,V]=o.useState(!1),[Re,W]=o.useState("select"),[T,B]=o.useState(null),[i,f]=o.useState(at),[ys,L]=o.useState(""),[Oe,Be]=o.useState(!1),[He,R]=o.useState(null),[Se,ae]=o.useState(!1),[ue,Ge]=o.useState(!1),[le,me]=o.useState(""),[Me,qe]=o.useState(!1),[K,Y]=o.useState([]),[pe,F]=o.useState(new Set),[_e,H]=o.useState(null),[xe,re]=o.useState(""),[Ke,Ve]=o.useState(!1),[he,G]=o.useState(null),We=o.useMemo(()=>{const s=xe.trim().toLowerCase();return s?K.filter(a=>a.id.toLowerCase().includes(s)||a.name.toLowerCase().includes(s)):K},[K,xe]),Q=o.useCallback(async()=>{try{const s=await j.config.provider.get();s.success&&s.data&&(fs(s.data),gs(Array.isArray(s.data.entries)?s.data.entries:[]))}catch{}},[]),D=o.useCallback(async()=>{X(!0),N(null);try{const[s,a]=await Promise.all([j.models.list(),j.system.status()]);if(await Q(),s.success&&s.data&&Array.isArray(s.data.models)&&Pe(s.data.models),a.success&&a.data){const l=a.data.models||{total:0,online:0,offline:0};ie({overallStatus:l.offline===0?"healthy":l.online>0?"degraded":"unhealthy",healthRate:l.total>0?l.online/l.total:0,healthyInstances:l.online,totalInstances:l.total,totalRequests:0})}}catch{N(t("models.loadFailed"))}finally{X(!1)}},[Q,t]);o.useEffect(()=>{D()},[D]),o.useEffect(()=>{const s=()=>{D(),Q()};return window.addEventListener("models-updated",s),()=>window.removeEventListener("models-updated",s)},[D,Q]);const be=o.useCallback(s=>`${s.provider}:${s.id}`,[]),U=o.useMemo(()=>{const s=[...k];return s.find(a=>a.key==="custom")||s.push({key:"custom",name:"Custom",baseUrl:"",apiType:"openai-completions",defaultModel:"",isCustom:!0}),s},[k]),fe=o.useMemo(()=>[...U].sort((s,a)=>{if(s.isCustom)return-1;if(a.isCustom)return 1;const l=we[s.key],d=we[a.key];return l!==void 0&&d!==void 0?l-d:l!==void 0?-1:d!==void 0?1:s.name.localeCompare(a.name)}),[U]),Ye=o.useMemo(()=>{const s=le.trim().toLowerCase();return s?fe.filter(a=>a.name.toLowerCase().includes(s)||a.key.toLowerCase().includes(s)||(a.defaultModel||"").toLowerCase().includes(s)||(a.baseUrl||"").toLowerCase().includes(s)||(a.models||[]).some(l=>String(l).toLowerCase().includes(s))):fe},[fe,le]),O=o.useMemo(()=>{var d,r,c,u;const s=(n==null?void 0:n.providers)||{},a=new Set(U.map(m=>m.key)),l=Object.entries(s).filter(([m])=>!a.has(m));if(l.length!==0)return{keys:l.map(([m])=>m),modelCount:l.reduce((m,[,b])=>m+(b.modelCount||0),0),hasApiKey:l.some(([,m])=>m.hasApiKey),baseUrl:((r=(d=l.find(([,m])=>m.baseUrl))==null?void 0:d[1])==null?void 0:r.baseUrl)||"",apiType:((u=(c=l.find(([,m])=>m.apiType))==null?void 0:c[1])==null?void 0:u.apiType)||"openai-completions"}},[n,U]),J=T==="custom"?i.providerKey.trim():T||"",De=o.useMemo(()=>J?P.filter(s=>s.provider===J):[],[P,J]),js=o.useMemo(()=>{const s=new Map;for(const l of P)s.has(l.provider)||s.set(l.provider,[]),s.get(l.provider).push(l);for(const l of $)s.has(l.key)||s.set(l.key,[]);const a=[...s.keys()];return a.sort((l,d)=>{const r=we[l],c=we[d];return r!==void 0&&c!==void 0?r-c:r!==void 0?-1:c!==void 0?1:l.localeCompare(d)}),a.map(l=>({provider:l,models:s.get(l)||[]}))},[P,$]),Qe=o.useCallback(s=>{var u,m;const a=(u=n==null?void 0:n.providers)==null?void 0:u[s.key],l=$.find(b=>b.key===s.key),d=P.filter(b=>b.provider===s.key).map(b=>b.id),r=((m=s.models)==null?void 0:m.slice(0,3).join(", "))||s.defaultModel,c=d.length>0?d.join(", "):r;B(s.key),L(""),f({providerKey:s.key,apiKeys:[""],modelIds:c,baseUrl:(a==null?void 0:a.baseUrl)||s.baseUrl,apiType:(a==null?void 0:a.apiType)||s.apiType,fullPath:(a==null?void 0:a.fullPath)===!0,setDefault:(n==null?void 0:n.defaultProvider)!==s.key,modelOverrides:ze(l)}),W("form"),V(!0),R(null),ae(!1),Y([]),F(new Set),H(null),re("")},[P,n,$]),ks=o.useCallback(s=>{var r;const a=(r=n==null?void 0:n.providers)==null?void 0:r[s],l=$.find(c=>c.key===s),d=P.filter(c=>c.provider===s).map(c=>c.id).join(", ");B("custom"),L(s),f({providerKey:s,apiKeys:[""],modelIds:d,baseUrl:(a==null?void 0:a.baseUrl)||"",apiType:(a==null?void 0:a.apiType)||"",fullPath:(a==null?void 0:a.fullPath)===!0,setDefault:(n==null?void 0:n.defaultProvider)!==s,modelOverrides:ze(l)}),R(null),ae(!1),Y([]),F(new Set),H(null),re("")},[n,P,$]),Ue=o.useCallback(()=>{B("custom"),L(""),f({providerKey:"",apiKeys:[""],modelIds:"",baseUrl:"",apiType:"",fullPath:!1,setDefault:!(n!=null&&n.configured),modelOverrides:{}}),W("form"),V(!0),R(null),ae(!1),Y([]),F(new Set),H(null),re("")},[n]),Ns=o.useCallback(async()=>{var d;const s=i.baseUrl;if(!s){H(t("models.baseUrlRequired"));return}qe(!0),H(null),Y([]),F(new Set);const a=U.find(r=>r.key===T)||null,l=!!a&&!a.isCustom&&(i.baseUrl||"")===a.baseUrl&&i.fullPath!==!0;try{const r=(i.apiKeys||[]).map(m=>m.trim()).filter(Boolean)[0]||"",c=r.replace(/[^\x00-\xFF]/g,"");c!==r&&M.warning(t("models.apiKeySanitized"));const u=await j.models.fetch(s,c,i.fullPath===!0,l?a.key:void 0);if(u.success&&((d=u.data)!=null&&d.models)){const m=u.data.models;Y(m);const b={};for(const h of m)h.protocol&&h.protocol!==i.apiType&&(b[h.id]={apiType:h.protocol});Object.keys(b).length>0&&f(h=>{var p;const S={...h.modelOverrides};for(const[E,y]of Object.entries(b))(p=S[E])!=null&&p.apiType||(S[E]={...S[E]||{},...y});return{...h,modelOverrides:S}});const I=new Set(m.map(h=>h.id)),z=i.modelIds.split(",").map(h=>h.trim()).filter(Boolean),x=z.filter(h=>I.has(h.split("|")[0].trim())),q=z.filter(h=>!I.has(h.split("|")[0].trim()));if(F(new Set(x.map(h=>h.split("|")[0].trim()))),q.length>0){const h=q.map(S=>S.split("|")[0].trim());f(S=>({...S,modelIds:x.join(", ")})),M.warning(t("models.autoRemovedMissingModels",{models:h.join(", ")}))}M.success(t("models.fetchedCount",{n:m.length}))}else H(u.error||t("models.fetchFailed"))}catch(r){H(r instanceof Error?r.message:t("models.requestFailed"))}finally{qe(!1)}},[i.baseUrl,i.apiKeys,i.modelIds,i.apiType,i.fullPath,T,U,t]),ws=o.useCallback(async()=>{var a,l;const s=i.baseUrl;if(!s){G({ok:!1,message:t("models.baseUrlRequired")});return}Ve(!0),G(null);try{const d=(i.apiKeys||[]).map(u=>u.trim()).filter(Boolean)[0]||"",r=d.replace(/[^\x00-\xFF]/g,"");r!==d&&M.warning(t("models.apiKeySanitized"));const c=await j.providers.testConnection(s,r);if(c.success&&((a=c.data)!=null&&a.reachable)){const u=c.data,m={};u.resolvedBaseUrl&&u.resolvedBaseUrl!==i.baseUrl&&(m.baseUrl=u.resolvedBaseUrl),u.detectedApiType&&i.apiType===""&&(m.apiType=u.detectedApiType),Object.keys(m).length>0&&f(z=>({...z,...m}));const b=[];m.baseUrl&&b.push(t("models.baseUrlAutoCompleted",{url:m.baseUrl})),m.apiType&&b.push(t("models.apiTypeAutoSelected",{type:Ne[m.apiType]}));const I=u.message||t("models.connectionSuccess");G({ok:!0,message:b.length>0?t("models.connectionSuccessWithHints",{message:I,hints:b.join(t("models.hintJoiner"))}):I})}else G({ok:!1,message:((l=c.data)==null?void 0:l.message)||c.error||t("models.connectionFailed")})}catch(d){G({ok:!1,message:d instanceof Error?d.message:t("models.requestFailed")})}finally{Ve(!1)}},[i.baseUrl,i.apiKeys,i.apiType,t]),Cs=o.useCallback(s=>{const a=new Set(pe);a.has(s)?a.delete(s):a.add(s),F(a),f(l=>({...l,modelIds:Array.from(a).join(", ")}))},[pe]),Ps=o.useCallback(s=>{const a=i.modelIds.split(",").map(c=>c.trim()).filter(Boolean),d=a.some(c=>te(c)===s.id)?a.filter(c=>te(c)!==s.id):[...a,s.name&&s.name!==s.id?`${s.id}|${s.name}`:s.id];f(c=>({...c,modelIds:d.join(", ")}));const r=new Set(K.map(c=>c.id));F(new Set(d.map(te).filter(c=>r.has(c))))},[i.modelIds,K]),[Ts,Je]=o.useState(!1),[Ie,Xe]=o.useState(""),[Ze,ge]=o.useState([]),[Ss,es]=o.useState(!1),[ss,ve]=o.useState(null),[ye,Ms]=o.useState(!1),[je,Ks]=o.useState(!0),Ds=o.useCallback(()=>{Xe(""),ge([]),ve(null),Je(!0),oe("",{reason:!1,tool:!0})},[]),oe=o.useCallback(async(s,a)=>{es(!0),ve(null);try{const l=await j.models.catalogSearch({q:s,reasoning:(a==null?void 0:a.reason)??!1,toolCall:(a==null?void 0:a.tool)??!0,limit:30});l.success&&l.data?ge(l.data.hits||[]):(ve(l.error||t("models.catalogSearchFailed")),ge([]))}catch(l){ve(l instanceof Error?l.message:t("models.requestFailed")),ge([])}finally{es(!1)}},[t]),Us=o.useCallback(s=>{f(a=>{const l=a.modelIds.split(",").map(d=>d.trim()).filter(Boolean);return l.includes(s.model.id)?a:{...a,modelIds:[...l,s.model.id].join(", ")}}),M.success(t("models.addedModel",{id:s.model.id}))},[t]),[Ae,Is]=o.useState(null),As=o.useCallback(s=>{Xe(s),Ae&&clearTimeout(Ae),Is(setTimeout(()=>{oe(s,{reason:ye,tool:je})},300))},[Ae,ye,je,oe]),$s=async s=>{const a=s.provider,l=s.id,d=s.enabled!==!1,r=s.name||l,c=u=>d&&/default model/i.test(u);try{const u=await j.models.toggle(a,l);if(u.success){await D();return}const m=u.error||"";c(m)?M.error(t("models.defaultModelDisableBlocked",{name:r})):M.error(m||t("models.operationFailed"))}catch(u){const m=u instanceof Error?u.message:"";c(m)?M.error(t("models.defaultModelDisableBlocked",{name:r})):M.error(m||t("models.operationFailed"))}},Fs=async s=>{const a=be(s);Le(a);try{await j.models.test(s.id),await D()}finally{Le(null)}},zs=async(s,a)=>{if(confirm(t("models.deleteModelConfirm",{id:a})))try{(await j.models.delete(s,a)).success&&await D()}catch{}},ts=o.useCallback(s=>{var c;const a=$.find(u=>u.key===s),l=U.find(u=>u.key===s),d=!l||l.isCustom,r=(c=n==null?void 0:n.providers)==null?void 0:c[s];B(d?"custom":s),L(d?s:""),f({providerKey:s,apiKeys:[""],modelIds:(a==null?void 0:a.models.map(u=>u.name&&u.name!==u.id?`${u.id}|${u.name}`:u.id).join(", "))||"",baseUrl:(a==null?void 0:a.baseUrl)||(r==null?void 0:r.baseUrl)||(l==null?void 0:l.baseUrl)||"",apiType:(a==null?void 0:a.apiType)||(r==null?void 0:r.apiType)||(l==null?void 0:l.apiType)||"",fullPath:(a==null?void 0:a.fullPath)===!0||(r==null?void 0:r.fullPath)===!0,setDefault:(n==null?void 0:n.defaultProvider)!==s,modelOverrides:ze(a)}),W("form"),V(!0),R(null),ae(!1),Y([]),F(new Set),H(null),re("")},[$,U,n]),Es=s=>{ts(s.provider)},Ls=async()=>{var h,S;const s=U.find(p=>p.key===T)||null,a=T==="custom"?i.providerKey.trim():(s==null?void 0:s.key)||"";if(!a){R(t("models.providerNameRequired"));return}const l=(i.apiKeys||[]).map(p=>p.trim()).filter(Boolean),d=!!((S=(h=n==null?void 0:n.providers)==null?void 0:h[a])!=null&&S.hasApiKey);if(l.length===0&&!d){R(t("models.apiKeyRequired"));return}const r=s||{baseUrl:"",apiType:"openai-completions",defaultModel:""},c=l.map(p=>p.replace(/[^\x00-\xFF]/g,"")).filter(Boolean),u=K.length>0?new Set(K.map(p=>p.id)):null,m=(i.modelIds||r.defaultModel||"").split(",").map(p=>p.trim()).filter(Boolean),b=u?m.filter(p=>u.has(p.split("|")[0].trim())):m,I=u?m.filter(p=>!u.has(p.split("|")[0].trim())):[];I.length>0&&M.warning(t("models.autoSkippedMissingModels",{models:I.map(p=>p.split("|")[0].trim()).join(", ")}));const z=b.map(te).filter(Boolean),x=new Set;for(const p of P)p.provider!==a||z.includes(p.id)||(p.isGlobalDefault&&x.add("global"),p.isGoalDefault&&x.add("goal"));const q={provider:a,name:a,baseUrl:i.baseUrl||r.baseUrl,fullPath:i.fullPath===!0,apiType:i.apiType||lt(i.baseUrl||r.baseUrl)||r.apiType,models:b.map((p,E)=>{var ms;const y=p.trim().split("|").map(Bs=>Bs.trim()).filter(Boolean),A=y[0]||"",w=i.modelOverrides[A],us=(w==null?void 0:w.apiType)||((ms=s==null?void 0:s.modelApiTypes)==null?void 0:ms[A]);return{id:A,name:y[1]||A,aliases:y.length>2?y.slice(2):void 0,enabled:!0,priority:10+E,...us?{apiType:us}:{},...w!=null&&w.baseUrl?{baseUrl:w.baseUrl}:{}}}).filter(p=>p.id.length>0)};c.length>0&&(q.apiKeys=c),(!(n!=null&&n.configured)||i.setDefault)&&(q.setDefault=!0),Be(!0),R(null);try{const p=await j.config.provider.save(q);if(p.success){if(x.size>0){const E=z[0]||"",y={};if(E){const A=`${a}:${E}`;for(const w of x)y[w]=A}else{const A=P.find(w=>w.provider!==a);for(const w of x)w==="goal"?y[w]=null:A&&(y[w]=`${A.provider}:${A.id}`)}Object.keys(y).length>0&&(await j.models.setDefaults(y)).success&&M.success(t("models.defaultsAutoUpdated"))}V(!1),W("select"),B(null),L(""),await Q(),await D()}else R(p.error||t("models.saveFailed"))}catch(p){R(p instanceof Error?p.message:t("models.unknownError"))}finally{Be(!1)}},as=async s=>{if(confirm(t("models.removeConfirm",{providerKey:s})))try{await j.config.provider.delete(s),await Q(),await D()}catch{}},Rs=s=>{switch(s){case"online":return"text-accent-green";case"offline":return"text-dark-muted";case"error":return"text-accent-red";default:return"text-dark-muted"}},Os=s=>{switch(s){case"online":return e.jsx(Xs,{size:14});case"offline":return e.jsx(xs,{size:14});case"error":return e.jsx(Js,{size:14});default:return e.jsx(xs,{size:14})}},ee=o.useMemo(()=>U.find(s=>s.key===T)||null,[T,U]);return Te?e.jsx("div",{className:"flex h-64 items-center justify-center text-dark-muted",children:t("models.loading")}):Z?e.jsx("div",{className:"flex h-64 items-center justify-center text-accent-red",children:Z}):e.jsx("div",{className:"ui-page flex-1 min-h-0",children:e.jsxs("div",{className:"ui-page-inner space-y-6",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsx("h2",{className:"text-base font-semibold",children:t("models.providerConfig")}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("button",{onClick:async()=>{try{await j.providers.refresh(),M.success(t("models.providerListRefreshed")),Ge(!0),await C(),setTimeout(()=>{C()},3e3)}catch{M.error(t("models.refreshFailed"))}},className:"btn btn-secondary px-3 py-2 text-xs",title:t("models.refreshListTitle"),children:[e.jsx(ne,{size:12}),t("models.refreshList")]}),e.jsxs("button",{onClick:()=>{ue&&me(""),Ge(s=>!s)},className:"btn btn-accent px-3 py-2 text-xs",children:[ue?e.jsx(Hs,{size:12}):e.jsx(ke,{size:12}),t(ue?"models.collapse":"models.addProvider")]})]})]}),ue&&e.jsxs("div",{children:[e.jsxs("div",{className:"relative mb-3 max-w-md",children:[e.jsx(de,{size:13,className:"absolute left-2.5 top-1/2 -translate-y-1/2 text-dark-muted"}),e.jsx("input",{value:le,onChange:s=>me(s.target.value),className:"w-full pl-8 pr-8 py-1.5 text-xs bg-dark-bg border border-dark-border rounded focus:outline-none focus:border-accent-blue",placeholder:t("models.providerSearchPlaceholder")}),le&&e.jsx("button",{onClick:()=>me(""),className:"absolute right-2 top-1/2 -translate-y-1/2 text-dark-muted hover:text-white",title:t("models.clear"),"aria-label":t("models.clearSearch"),children:e.jsx($e,{size:13})})]}),e.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-3 max-h-[420px] overflow-y-auto custom-scrollbar pr-1",children:v?e.jsxs("div",{className:"col-span-full flex items-center justify-center py-4 text-dark-muted text-sm",children:[e.jsx(Gs,{size:14,className:"mr-2 animate-spin"}),t("models.loadingProviders")]}):Ye.length===0?e.jsxs("div",{className:"col-span-full border border-accent-red/30 bg-accent-red/10 rounded-lg p-4 text-center",children:[e.jsx("div",{className:"text-sm text-accent-red font-medium mb-1",children:t("models.noMatchingProviders")}),e.jsx("div",{className:"text-xs text-dark-muted mb-3",children:t("models.noMatchingProvidersHint",{query:le})}),e.jsxs("div",{className:"flex items-center justify-center gap-2",children:[e.jsxs("button",{onClick:()=>me(""),className:"inline-flex items-center gap-1 px-2.5 py-1 text-xs border border-dark-border rounded hover:bg-dark-hover",children:[e.jsx($e,{size:12}),t("models.clearSearch")]}),e.jsxs("button",{onClick:Ue,className:"inline-flex items-center gap-1 px-2.5 py-1 text-xs bg-accent-blue text-white rounded hover:opacity-90",children:[e.jsx(ke,{size:12}),t("models.addCustomProvider")]})]})]}):Ye.map(s=>{var c,u;const a=s.key==="custom",l=a?O:(c=n==null?void 0:n.providers)==null?void 0:c[s.key],d=l==null?void 0:l.hasApiKey,r=a?!!(n!=null&&n.defaultProvider)&&((O==null?void 0:O.keys)||[]).includes(n.defaultProvider):(n==null?void 0:n.defaultProvider)===s.key;return e.jsxs("div",{className:`ui-card-interactive text-left p-4 relative ${d?"border-accent-green/30 bg-dark-surface hover:border-accent-green/50":"border-dark-border bg-dark-surface hover:border-dark-hover"}`,children:[e.jsxs("div",{onClick:()=>s.key==="custom"?Ue():Qe(s),className:"cursor-pointer",children:[e.jsxs("div",{className:"flex items-center justify-between mb-1",children:[e.jsx("span",{className:"text-sm font-medium",children:s.name}),d&&e.jsx(se,{size:14,className:"text-accent-green"})]}),e.jsxs("div",{className:"text-[10px] text-dark-muted space-y-0.5",children:[e.jsx("div",{className:"truncate",children:a?(l==null?void 0:l.baseUrl)||t("models.customBaseUrl"):s.baseUrl||t("models.customBaseUrl")}),e.jsx("div",{className:"truncate",children:a&&O?`${O.keys.join(", ")}`:s.defaultModel||t("models.noDefaultModel")}),e.jsxs("div",{children:[l?t("models.configuredCount",{n:l.modelCount}):t("models.availableCount",{n:((u=s.models)==null?void 0:u.length)||0}),s.models&&s.models.length>0&&!l&&e.jsx("span",{className:"text-accent-blue",children:" ✓"})]})]}),r&&e.jsx("div",{className:"mt-1 text-[10px] text-accent-red",children:t("models.defaultProviderBadge")})]}),d&&s.key!=="custom"&&e.jsx("button",{onClick:m=>{m.stopPropagation(),as(s.key)},className:"absolute top-1.5 right-1.5 p-1 rounded text-dark-muted hover:bg-accent-red/10 hover:text-accent-red transition-colors",title:t("models.deleteProvider"),"aria-label":t("models.deleteProviderNamed",{name:s.name}),children:e.jsx(Fe,{size:13})})]},s.key)})})]})]}),g&&e.jsxs("div",{className:"grid grid-cols-4 gap-4",children:[e.jsx(Ce,{title:t("models.overallStatus"),value:g.totalInstances===0?t("models.notConfigured"):g.overallStatus==="healthy"?t("models.healthy"):g.overallStatus==="degraded"?t("models.degraded"):t("models.abnormal"),color:g.totalInstances===0?"blue":g.overallStatus==="healthy"?"green":g.overallStatus==="degraded"?"yellow":"red"}),e.jsx(Ce,{title:t("models.healthRate"),value:g.totalInstances===0?"N/A":`${(g.healthRate*100).toFixed(0)}%`,color:g.totalInstances===0?"blue":g.healthRate>.8?"green":g.healthRate>.5?"yellow":"red"}),e.jsx(Ce,{title:t("models.onlineInstances"),value:g.totalInstances===0?t("models.none"):`${g.healthyInstances}/${g.totalInstances}`,color:g.healthyInstances>0?"green":"red"}),e.jsx(Ce,{title:t("models.totalRequests"),value:g.totalRequests>0?g.totalRequests.toLocaleString():"0",color:"blue"})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsx("h3",{className:"text-sm font-medium",children:t("models.configuredModels")}),e.jsx("span",{className:"text-[10px] text-dark-muted",title:t("models.actIsGlobalHint"),children:t("models.actIsGlobalHint")})]}),e.jsxs("div",{className:"space-y-4 max-h-[640px] overflow-y-auto custom-scrollbar pr-1",children:[js.map(s=>{var d;const a=$.find(r=>r.key===s.provider),l=(d=n==null?void 0:n.providers)==null?void 0:d[s.provider];return e.jsxs("div",{className:"rounded-lg border border-dark-border overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 px-3 py-2 bg-dark-bg border-b border-dark-border",children:[e.jsxs("div",{className:"flex items-center gap-2 min-w-0 flex-wrap",children:[e.jsx("span",{className:"text-xs font-semibold whitespace-nowrap text-accent-purple",children:s.provider}),(n==null?void 0:n.defaultProvider)===s.provider&&e.jsx("span",{className:"text-[9px] px-1.5 py-0.5 rounded bg-accent-red/20 text-accent-red whitespace-nowrap",children:t("models.defaultShort")}),e.jsx("span",{className:"text-[10px] text-dark-muted truncate",children:(l==null?void 0:l.baseUrl)||(a==null?void 0:a.baseUrl)||""}),e.jsx("span",{className:"text-[10px] text-dark-muted whitespace-nowrap",children:(a==null?void 0:a.apiType)||(l==null?void 0:l.apiType)||""}),l!=null&&l.hasApiKey||a!=null&&a.hasApiKey?e.jsx("span",{className:"text-[9px] px-1.5 py-0.5 rounded bg-accent-green/20 text-accent-green whitespace-nowrap",children:t("models.hasKey")}):e.jsx("span",{className:"text-[9px] px-1.5 py-0.5 rounded bg-accent-red/20 text-accent-red whitespace-nowrap",children:t("models.noKey")})]}),e.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[e.jsx("button",{onClick:()=>ts(s.provider),className:"p-1.5 rounded hover:bg-accent-blue/10 text-dark-muted hover:text-accent-blue",title:t("models.editProviderNamed",{name:s.provider}),children:e.jsx(ps,{size:13})}),e.jsx("button",{onClick:()=>as(s.provider),className:"p-1.5 rounded hover:bg-accent-red/10 text-dark-muted hover:text-accent-red",title:t("models.deleteProviderNamed",{name:s.provider}),children:e.jsx(Fe,{size:13})})]})]}),e.jsxs("div",{className:"space-y-2 p-2 bg-dark-surface/40",children:[s.models.map(r=>{var m,b,I,z;const c=a==null?void 0:a.models.find(x=>x.id===r.id),u=!!(c!=null&&c.apiType&&c.apiType!==(a==null?void 0:a.apiType));return e.jsx("div",{className:`bg-dark-surface border rounded-lg p-3 ${r.status==="online"?"border-accent-green":"border-dark-border"} ${r.enabled===!1?"opacity-60":""}`,children:e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1 flex-wrap",children:[e.jsx("span",{className:Rs(r.status),children:Os(r.status)}),e.jsx("span",{className:"font-medium text-sm text-accent-blue",children:r.name}),e.jsx("span",{className:"text-[10px] text-accent-purple px-1.5 py-0.5 bg-accent-purple/10 rounded",children:r.provider}),r.apiType&&e.jsx("span",{className:`text-[10px] px-1.5 py-0.5 rounded ${r.apiType==="anthropic-messages"||r.apiType==="openai-responses"?"bg-accent-purple/20 text-accent-purple":"bg-accent-blue/20 text-accent-blue"}`,children:Ne[r.apiType]||r.apiType}),u&&e.jsx("span",{className:"text-[9px] px-1 py-0.5 rounded bg-accent-yellow/20 text-accent-yellow font-medium",title:t("models.overrideTitle"),children:t("models.overrideBadge")}),r.isGlobalDefault&&e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-accent-red/20 text-accent-red font-medium",title:t("models.globalDefaultUnsettable"),children:t("chat.globalDefault")}),r.isActDefault&&!r.isGlobalDefault&&e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-accent-yellow/20 text-accent-yellow font-medium",children:t("chat.actDefault")}),r.isGoalDefault&&e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded bg-accent-purple/20 text-accent-purple font-medium",children:t("chat.goalDefault")})]}),e.jsxs("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-3 text-xs",children:[e.jsx(_,{label:t("models.loadLabel"),value:`${r.load}/${r.maxLoad}`}),e.jsx(_,{label:t("models.tokenUsageLabel"),value:`${ce(r.tokens)}/${ce(r.maxTokens)}`}),e.jsx(_,{label:t("models.inputPrice"),value:`$${r.price.input}/M`}),e.jsx(_,{label:t("models.outputPrice"),value:`$${r.price.output}/M`})]}),e.jsxs("div",{className:"mt-3 grid grid-cols-2 sm:grid-cols-4 gap-3 text-xs",children:[e.jsx(_,{label:t("models.inputTokensLabel"),value:ce(((m=r.usage)==null?void 0:m.input)??0)}),e.jsx(_,{label:t("models.outputTokensLabel"),value:ce(((b=r.usage)==null?void 0:b.output)??0)}),e.jsx(_,{label:t("models.totalTokensLabel"),value:ce(((I=r.usage)==null?void 0:I.total)??0)}),e.jsx(_,{label:t("models.usageRequestsLabel"),value:String(((z=r.usage)==null?void 0:z.requests)??0)})]})]}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[tt.map(x=>{const q=x.key==="global"?r.isGlobalDefault:r.isGoalDefault,h=x.key==="global"?t("models.setGlobalDefaultTitle"):t("models.setGoalDefaultTitle"),S=t("models.unsetGoalDefaultTitle"),p=t("models.unsetGoalDefaultFailed"),E=t("models.setGoalDefaultFailed");return q?x.key==="global"?e.jsxs("span",{className:`inline-flex items-center gap-1 px-2 py-1 rounded text-[10px] border ${x.bg} ${x.color} font-medium`,title:t("chat.globalDefault"),children:[e.jsx(se,{size:11}),t(x.labelKey)]},x.key):e.jsxs("button",{onClick:async()=>{try{await j.models.setDefaults({[x.key]:null}),await D()}catch(y){N(y instanceof Error?y.message:p)}},className:`inline-flex items-center gap-1 px-2 py-1 rounded text-[10px] border ${x.bg} ${x.color} font-medium cursor-pointer hover:opacity-80`,title:S,children:[e.jsx(se,{size:11}),t(x.labelKey)]},x.key):r.enabled===!1?null:e.jsx("button",{onClick:async()=>{try{await j.models.setDefaults({[x.key]:`${r.provider}:${r.id}`}),await D()}catch(y){N(y instanceof Error?y.message:E)}},className:"px-2 py-1 rounded text-[10px] border border-dark-border text-dark-muted hover:text-dark-text hover:border-dark-hover",title:h,children:t(x.labelKey)},x.key)}),e.jsx("button",{onClick:()=>Es(r),className:"p-1.5 rounded hover:bg-accent-blue/10 text-dark-muted hover:text-accent-blue",title:t("models.editModel"),children:e.jsx(ps,{size:13})}),e.jsx("button",{onClick:()=>zs(r.provider,r.id),className:"p-1.5 rounded hover:bg-accent-red/10 text-dark-muted hover:text-accent-red",title:t("models.deleteModel"),children:e.jsx(Fe,{size:13})}),e.jsx("button",{onClick:()=>Fs(r),disabled:Ee===be(r),className:"p-1.5 rounded hover:bg-dark-hover disabled:opacity-50",title:t("models.refresh"),children:e.jsx(ne,{size:13,className:Ee===be(r)?"animate-spin":""})}),e.jsx("button",{onClick:()=>$s(r),className:`px-2 py-0.5 rounded text-xs transition-colors ${r.enabled===!1?"bg-accent-green/20 text-accent-green hover:bg-accent-green/30":"bg-accent-red/20 text-accent-red hover:bg-accent-red/30"}`,children:r.enabled===!1?t("models.enable"):t("models.disable")})]})]})},be(r))}),s.models.length===0&&e.jsx("div",{className:"text-center text-[11px] text-dark-muted py-3",children:t("models.noModelsInProvider")})]})]},s.provider)}),P.length===0&&$.length===0&&e.jsxs("div",{className:"text-center text-dark-muted py-6",children:[e.jsx(qs,{size:36,className:"mx-auto mb-2 opacity-40"}),e.jsx("p",{className:"text-sm",children:t("models.emptyHint")})]})]})]}),e.jsx(hs,{isOpen:vs,onClose:()=>{V(!1),W("select"),B(null),L("")},title:Re==="select"?t("chat.selectProvider"):(ee==null?void 0:ee.name)||t("models.providerConfig"),size:"xl",children:Re==="select"?e.jsx("div",{className:"space-y-4",children:e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3",children:[fe.filter(s=>s.key!=="custom").map(s=>e.jsxs("button",{onClick:()=>Qe(s),className:"text-left p-3 rounded-lg border border-dark-border bg-dark-bg hover:border-accent-blue transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx(se,{size:14,className:"text-accent-blue"}),e.jsx("span",{className:"text-sm font-medium",children:s.name})]}),e.jsx("div",{className:"text-xs text-dark-muted",children:s.defaultModel})]},s.key)),e.jsxs("button",{onClick:Ue,className:"text-left p-3 rounded-lg border border-dashed border-dark-border bg-dark-bg hover:border-accent-blue transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx(_s,{size:14,className:"text-accent-blue"}),e.jsx("span",{className:"text-sm font-medium",children:t("models.customProvider")})]}),e.jsx("div",{className:"text-xs text-dark-muted",children:t("models.customProviderDesc")})]})]})}):e.jsxs("div",{className:"space-y-3",children:[T==="custom"&&e.jsxs("div",{className:"space-y-3",children:[O&&O.keys.length>0&&e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm text-dark-muted mb-1",children:t("models.editExistingConfig")}),e.jsxs("select",{value:ys,onChange:s=>{const a=s.target.value;a?ks(a):(L(""),f(l=>({...l,providerKey:"",modelIds:"",baseUrl:"",apiType:"",apiKeys:[""]})))},className:"w-full px-3 py-2 bg-dark-bg border border-dark-border rounded text-sm focus:outline-none focus:border-accent-blue",children:[e.jsx("option",{value:"",children:t("models.newCustomProviderOption")}),O.keys.map(s=>e.jsx("option",{value:s,children:s},s))]}),e.jsx("div",{className:"text-[11px] text-dark-muted/60 mt-1",children:t("models.editExistingConfigHint")})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm text-dark-muted mb-1",children:t("models.providerNameLabel")}),e.jsx("input",{value:i.providerKey,onChange:s=>f(a=>({...a,providerKey:s.target.value})),className:"w-full px-3 py-2 bg-dark-bg border border-dark-border rounded text-sm focus:outline-none focus:border-accent-blue",placeholder:t("models.providerNamePlaceholder")})]})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm text-dark-muted mb-1",children:["API Keys",(rs=(ls=n==null?void 0:n.providers)==null?void 0:ls[T==="custom"?i.providerKey.trim():T||""])!=null&&rs.hasApiKey?"":" *",e.jsx("span",{className:"text-dark-muted/60 text-xs",children:(ns=(os=n==null?void 0:n.providers)==null?void 0:os[T==="custom"?i.providerKey.trim():T||""])!=null&&ns.hasApiKey?t("models.apiKeysHintConfigured"):t("models.apiKeysHintNew")})]}),e.jsx("div",{className:"space-y-1.5",children:((ds=i.apiKeys)!=null&&ds.length?i.apiKeys:[""]).map((s,a)=>e.jsxs("div",{className:"flex gap-1.5 items-center",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx("input",{type:Se?"text":"password",value:s,autoComplete:"off",spellCheck:!1,onChange:l=>f(d=>({...d,apiKeys:d.apiKeys.map((r,c)=>c===a?l.target.value:r)})),className:"w-full px-3 py-2 pr-9 bg-dark-bg border border-dark-border rounded text-sm focus:outline-none focus:border-accent-blue",placeholder:t("models.apiKeyDefaultPlaceholder")}),e.jsx("button",{type:"button",onClick:()=>ae(l=>!l),className:"absolute right-2 top-1/2 -translate-y-1/2 text-dark-muted hover:text-white",title:t(Se?"models.hideKeyTitle":"models.showKeyTitle"),children:Se?e.jsx(Vs,{size:14}):e.jsx(Ws,{size:14})})]}),a===0?e.jsxs("button",{type:"button",onClick:()=>f(l=>({...l,apiKeys:[...l.apiKeys,""]})),className:"shrink-0 inline-flex items-center gap-1 px-3 py-2 rounded text-sm border border-dashed border-dark-border text-dark-muted hover:text-accent-blue hover:border-accent-blue/50 transition-colors",title:t("models.addApiKeyTitle"),children:[e.jsx(ke,{size:14}),e.jsx("span",{className:"hidden sm:inline",children:t("models.addApiKey")})]}):e.jsx("button",{type:"button",onClick:()=>f(l=>({...l,apiKeys:l.apiKeys.filter((d,r)=>r!==a)})),className:"shrink-0 inline-flex items-center px-3 py-2 rounded text-sm text-dark-muted hover:text-accent-red hover:bg-accent-red/10 transition-colors",title:t("models.removeApiKeyTitle"),children:e.jsx($e,{size:14})})]},a))})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm text-dark-muted mb-1",children:t("models.modelIdLabel")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{value:i.modelIds,onChange:s=>{const a=s.target.value;f(l=>({...l,modelIds:a})),F(()=>{const l=new Set;for(const d of a.split(",")){const r=d.trim().split("|")[0].trim();r&&K.some(c=>c.id===r)&&l.add(r)}return l})},className:"flex-1 px-3 py-2 bg-dark-bg border border-dark-border rounded text-sm focus:outline-none focus:border-accent-blue",placeholder:(ee==null?void 0:ee.defaultModel)||t("models.modelIdPlaceholder")}),e.jsxs("button",{onClick:Ns,disabled:Me||!i.baseUrl,className:"inline-flex items-center gap-1 px-3 py-2 rounded text-sm border border-accent-blue/30 text-accent-blue hover:bg-accent-blue/10 disabled:opacity-50 whitespace-nowrap",title:t("models.fetchModelsTitle"),children:[Me?e.jsx(ne,{size:13,className:"animate-spin"}):e.jsx(Ys,{size:13}),t(Me?"models.fetchingModels":"models.fetchModels")]}),e.jsxs("button",{onClick:ws,disabled:Ke||!i.baseUrl,className:"inline-flex items-center gap-1 px-3 py-2 rounded text-sm border border-accent-yellow/30 text-accent-yellow hover:bg-accent-yellow/10 disabled:opacity-50 whitespace-nowrap",title:t("models.testConnectionTitle"),children:[Ke?e.jsx(ne,{size:13,className:"animate-spin"}):e.jsx(Qs,{size:13}),t(Ke?"models.testingConnection":"models.testConnection")]}),e.jsxs("button",{onClick:Ds,className:"inline-flex items-center gap-1 px-3 py-2 rounded text-sm border border-accent-green/30 text-accent-green hover:bg-accent-green/10 whitespace-nowrap",title:t("models.catalogSearchTitle"),children:[e.jsx(de,{size:13}),t("models.catalogSearch")]})]}),he&&e.jsxs("div",{className:`mt-1 text-xs ${he.ok?"text-accent-green":"text-accent-red"}`,children:[he.ok?"✓ ":"✗ ",he.message]}),_e&&e.jsx("div",{className:"mt-1 text-xs text-accent-red",children:_e}),K.length===0&&De.length>0&&e.jsxs("div",{className:"mt-2 border border-dark-border rounded-lg bg-dark-bg p-2",children:[e.jsx("div",{className:"flex items-center justify-between mb-2",children:e.jsxs("span",{className:"text-xs text-dark-muted",children:[t("models.configuredPanelPrefix"),e.jsx("strong",{className:"text-dark-text",children:De.length}),t("models.configuredPanelSuffix"),e.jsx("span",{className:"text-accent-green/70",children:t("models.configuredPanelHint")})]})}),e.jsx("div",{className:"max-h-48 overflow-y-auto custom-scrollbar grid grid-cols-2 sm:grid-cols-3 gap-1",children:De.map(s=>{const a=i.modelIds.split(",").map(te).filter(Boolean).includes(s.id);return e.jsxs("div",{role:"checkbox","aria-checked":a,title:s.name&&s.name!==s.id?`${s.id} — ${s.name}`:s.name||s.id,tabIndex:-1,onMouseDown:l=>l.preventDefault(),onClick:()=>Ps(s),className:`flex items-start gap-1.5 px-2 py-1 rounded cursor-pointer text-xs transition-colors select-none ${a?"bg-accent-green/20 text-accent-green border border-accent-green/30":"hover:bg-dark-hover border border-transparent"}`,children:[e.jsx("span",{className:"shrink-0 mt-[3px]",children:a?e.jsx(se,{size:10}):e.jsx("div",{className:"w-2.5 h-2.5 rounded border border-dark-border"})}),e.jsx("span",{className:"min-w-0 flex-1 break-words leading-snug",children:s.name||s.id}),s.isGlobalDefault&&e.jsx("span",{className:"text-[9px] px-1 rounded bg-accent-red/20 text-accent-red shrink-0",children:t("models.globalShort")}),s.isActDefault&&!s.isGlobalDefault&&e.jsx("span",{className:"text-[9px] px-1 rounded bg-accent-yellow/20 shrink-0",children:"Act"}),s.isGoalDefault&&e.jsx("span",{className:"text-[9px] px-1 rounded bg-accent-purple/20 shrink-0",children:"Goal"})]},s.id)})})]}),K.length>0&&e.jsxs("div",{className:"mt-2 border border-dark-border rounded-lg bg-dark-bg p-2",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsxs("span",{className:"text-xs text-dark-muted",children:[t("models.fetchedPanelPrefix"),e.jsx("strong",{className:"text-dark-text",children:K.length}),t("models.fetchedPanelMiddle"),e.jsx("strong",{className:"text-accent-blue",children:pe.size}),t("models.fetchedPanelSuffix"),e.jsx("span",{className:"text-accent-blue/70",children:t("models.fetchedPanelHint")})]}),e.jsx("button",{onClick:()=>{Y([]),F(new Set)},className:"px-2 py-0.5 text-[10px] border border-dark-border rounded hover:bg-dark-hover",children:t("models.close")})]}),e.jsxs("div",{className:"relative mb-2",children:[e.jsx(de,{size:12,className:"absolute left-2 top-1/2 -translate-y-1/2 text-dark-muted"}),e.jsx("input",{value:xe,onChange:s=>re(s.target.value),className:"w-full pl-7 pr-2 py-1 text-xs bg-dark-bg border border-dark-border rounded focus:outline-none focus:border-accent-blue",placeholder:t("models.modelSearchPlaceholder")})]}),xe.trim()!==""&&e.jsxs("div",{className:"mb-1 text-[10px] text-dark-muted",children:[t("models.searchMatchPrefix"),e.jsx("strong",{className:"text-accent-blue",children:We.length}),t("models.searchMatchSuffix",{total:K.length})]}),e.jsx("div",{className:"max-h-72 overflow-y-auto custom-scrollbar grid grid-cols-1 sm:grid-cols-2 gap-1",children:We.map(s=>{const a=pe.has(s.id);return e.jsxs("div",{role:"checkbox","aria-checked":a,title:s.name&&s.name!==s.id?`${s.id} — ${s.name}`:s.id,tabIndex:-1,onMouseDown:l=>l.preventDefault(),onClick:()=>Cs(s.id),className:`flex items-start gap-1.5 px-2 py-1 rounded cursor-pointer text-xs transition-colors select-none ${a?"bg-accent-blue/20 text-accent-blue border border-accent-blue/30":"hover:bg-dark-hover border border-transparent"}`,children:[e.jsx("span",{className:"shrink-0 mt-[3px]",children:a?e.jsx(se,{size:10}):e.jsx("div",{className:"w-2.5 h-2.5 rounded border border-dark-border"})}),e.jsx("span",{className:"min-w-0 flex-1 break-all leading-snug",children:s.id})]},s.id)})})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm text-dark-muted mb-1",children:"Base URL"}),e.jsx("input",{value:i.baseUrl,onChange:s=>{f(a=>({...a,baseUrl:s.target.value})),G(null)},className:"w-full px-3 py-2 bg-dark-bg border border-dark-border rounded text-sm focus:outline-none focus:border-accent-blue",placeholder:"https://api.example.com/v1"}),e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer select-none mt-2",children:[e.jsx("button",{type:"button",role:"switch","aria-checked":i.fullPath,onClick:()=>{f(s=>({...s,fullPath:!s.fullPath})),G(null)},className:`relative w-9 h-5 rounded-full transition-colors shrink-0 ${i.fullPath?"bg-accent-green":"bg-dark-border"}`,children:e.jsx("span",{className:`absolute top-0.5 left-0 w-4 h-4 rounded-full bg-white shadow transition-transform ${i.fullPath?"translate-x-[18px]":"translate-x-0.5"}`})}),e.jsx("span",{className:"text-sm text-dark-muted",children:t("models.fullPathLabel")})]}),e.jsx("div",{className:"text-[11px] text-dark-muted/60 mt-1",children:t("models.fullPathHint")})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm text-dark-muted mb-1",children:t("models.apiTypeLabel")}),e.jsxs("select",{value:i.apiType,onChange:s=>{f(a=>({...a,apiType:s.target.value})),G(null)},className:"w-full px-3 py-2 bg-dark-bg border border-dark-border rounded text-sm focus:outline-none focus:border-accent-blue",children:[e.jsx("option",{value:"",children:t("models.apiTypeAutoDetect")}),bs.map(s=>e.jsx("option",{value:s,children:Ne[s]},s))]}),e.jsx("div",{className:"text-[11px] text-dark-muted/60 mt-1",children:t("models.apiTypeHint")})]}),e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm text-dark-muted mb-1",children:[t("models.modelApiTypeLabel"),e.jsx("span",{className:"text-dark-muted/60 text-xs",children:t("models.modelApiTypeHint")})]}),e.jsx("div",{className:"border border-dark-border rounded-lg divide-y divide-dark-border max-h-40 overflow-y-auto custom-scrollbar",children:(()=>{const s=i.modelIds.split(",").map(te).filter(Boolean);return s.length===0?e.jsx("div",{className:"px-3 py-2 text-xs text-dark-muted",children:t("models.modelApiTypeEmpty")}):s.map(a=>{var l;return e.jsxs("div",{className:"flex items-start justify-between gap-2 px-3 py-1.5",children:[e.jsx("span",{className:"text-xs min-w-0 flex-1 break-all leading-snug",title:a,children:a}),e.jsxs("select",{value:((l=i.modelOverrides[a])==null?void 0:l.apiType)||"",onChange:d=>f(r=>({...r,modelOverrides:{...r.modelOverrides,[a]:{...r.modelOverrides[a]||{},apiType:d.target.value}}})),className:"w-52 px-2 py-1 text-xs bg-dark-bg border border-dark-border rounded focus:outline-none focus:border-accent-blue",children:[e.jsx("option",{value:"",children:"继承 Provider(默认)"}),bs.map(d=>e.jsx("option",{value:d,children:Ne[d]},d))]})]},a)})})()})]}),e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:i.setDefault,onChange:s=>f(a=>({...a,setDefault:s.target.checked})),className:"accent-accent-blue"}),e.jsx("span",{className:"text-sm text-dark-muted",children:t("models.setDefaultProvider")})]}),He&&e.jsx("div",{className:"text-sm text-accent-red",children:He}),e.jsxs("div",{className:"flex justify-between gap-2 pt-2",children:[e.jsx("div",{children:J&&((is=(cs=n==null?void 0:n.providers)==null?void 0:cs[J])==null?void 0:is.hasApiKey)&&e.jsx("button",{onClick:async()=>{if(confirm(t("models.deleteProviderConfirm",{key:J})))try{await j.config.provider.delete(J),V(!1),W("select"),B(null),L(""),await Q(),await D()}catch{}},className:"px-4 py-2 rounded border border-accent-red/30 text-accent-red hover:bg-accent-red/10 transition-colors text-sm",children:t("models.deleteProvider")})}),e.jsx("button",{onClick:()=>{W("select"),B(null),L(""),V(!1)},className:"px-4 py-2 rounded border border-dark-border hover:bg-dark-hover transition-colors text-sm",children:t("common.cancel")}),e.jsx("button",{onClick:Ls,disabled:Oe,className:"px-4 py-2 bg-accent-blue text-white rounded hover:bg-accent-blue/80 transition-colors text-sm disabled:opacity-50",children:t(Oe?"common.saving":"common.save")})]})]})}),e.jsx(hs,{isOpen:Ts,onClose:()=>Je(!1),title:e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx(de,{size:15,className:"text-accent-green"}),t("models.catalogTitle")]}),size:"2xl",children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(de,{size:14,className:"absolute left-3 top-1/2 -translate-y-1/2 text-dark-muted"}),e.jsx("input",{value:Ie,onChange:s=>As(s.target.value),className:"w-full pl-9 pr-3 py-2 bg-dark-bg border border-dark-border rounded text-sm focus:outline-none focus:border-accent-green",placeholder:t("models.catalogSearchPlaceholder"),autoFocus:!0})]}),e.jsxs("label",{className:"inline-flex items-center gap-1.5 text-xs text-dark-muted whitespace-nowrap cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:je,onChange:s=>{const a=s.target.checked;Ks(a),oe(Ie,{reason:ye,tool:a})},className:"accent-accent-green"}),t("models.catalogOnlyToolCall")]}),e.jsxs("label",{className:"inline-flex items-center gap-1.5 text-xs text-dark-muted whitespace-nowrap cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:ye,onChange:s=>{const a=s.target.checked;Ms(a),oe(Ie,{reason:a,tool:je})},className:"accent-accent-green"}),t("models.catalogOnlyReasoning")]})]}),ss&&e.jsx("div",{className:"text-xs text-accent-red bg-accent-red/10 p-2 rounded",children:ss}),Ss?e.jsxs("div",{className:"flex items-center justify-center py-10 text-dark-muted",children:[e.jsx(ne,{size:18,className:"animate-spin mr-2"})," ",t("models.searching")]}):e.jsx("div",{className:"max-h-96 overflow-y-auto custom-scrollbar border border-dark-border rounded-lg divide-y divide-dark-border",children:Ze.length===0?e.jsx("div",{className:"py-10 text-center text-dark-muted text-sm",children:t("models.catalogNoResults")}):Ze.map(s=>{var a,l,d;return e.jsxs("div",{className:"flex items-center gap-3 px-3 py-2 hover:bg-dark-hover",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm font-medium text-dark-text truncate",children:s.model.name||s.model.id}),e.jsx("code",{className:"text-[10px] px-1.5 py-0.5 bg-dark-bg border border-dark-border rounded text-dark-muted truncate",children:s.model.id}),s.model.reasoning&&e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 bg-accent-yellow/10 text-accent-yellow rounded",children:t("models.badgeReasoning")}),s.model.tool_call&&e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 bg-accent-blue/10 text-accent-blue rounded",children:t("models.badgeToolCall")}),s.model.attachment&&e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 bg-accent-green/10 text-accent-green rounded",children:t("models.badgeMultimodal")})]}),e.jsxs("div",{className:"text-[11px] text-dark-muted mt-0.5",children:[s.providerName,(a=s.model.limit)!=null&&a.context?` · ${t("models.ctxLimit",{k:(s.model.limit.context/1e3).toFixed(0)})}`:"",(l=s.model.limit)!=null&&l.output?` · ${t("models.outLimit",{k:(s.model.limit.output/1e3).toFixed(0)})}`:"",((d=s.model.cost)==null?void 0:d.input)!==void 0?` · $${s.model.cost.input}/M in / $${s.model.cost.output}/M out`:""]})]}),e.jsxs("button",{onClick:()=>Us(s),className:"shrink-0 inline-flex items-center gap-1 px-2.5 py-1 text-xs border border-accent-green/30 text-accent-green rounded hover:bg-accent-green/10 whitespace-nowrap",title:t("models.catalogAddTitle"),children:[e.jsx(ke,{size:12})," ",t("models.add")]})]},`${s.providerId}:${s.model.id}`)})}),e.jsx("div",{className:"text-[11px] text-dark-muted/60",children:t("models.catalogSourceHint")})]})})]})})}function Ce({title:k,value:v,color:C}){const t={green:"bg-accent-green/10 text-accent-green",yellow:"bg-accent-yellow/10 text-accent-yellow",red:"bg-accent-red/10 text-accent-red",blue:"bg-accent-blue/10 text-accent-blue"};return e.jsxs("div",{className:`${t[C]} rounded-lg p-3`,children:[e.jsx("div",{className:"text-xs opacity-70",children:k}),e.jsx("div",{className:"text-xl font-semibold",children:v})]})}function _({label:k,value:v}){return e.jsxs("div",{children:[e.jsx("div",{className:"text-dark-muted",children:k}),e.jsx("div",{children:v})]})}export{ut as ModelsView,ut as default};
@@ -1 +0,0 @@
1
- import{j as t}from"./markdown-B2L4Mq-x.js";import{a as s,aI as be,k as me,a1 as ge,X as J,A as he,n as W,a0 as ke,bB as ve,aP as fe,D as ee,ah as je,Y as ye}from"./icons-BxNxyk-c.js";import{u as Ne,at as p,C as Ce}from"./index-RB5ffy32.js";import"./react-vendor-B2V_5iSS.js";import"./state-0T92JV0u.js";import"./panels-P_I7Q72_.js";const E=12,we="other",Se=[{value:"all"},{value:"builtin"},{value:"openclaw"},{value:"deepseek-harness"}];function Pe(a){return a==="wired"?"bg-emerald-500/15 text-emerald-400 border-emerald-500/30":a==="pending"||a==="pending_wiring"?"bg-amber-500/15 text-amber-400 border-amber-500/30":"bg-dark-hover text-dark-muted border-dark-border"}function te(a){var n;return((n=a.category)==null?void 0:n.trim())||we}function $e(a,n){const f=n.trim().toLowerCase();return f?[a.id,a.name,a.description,a.category,...a.tags??[]].filter(S=>typeof S=="string").join(" ").toLowerCase().includes(f):!0}function Re(){const{t:a}=Ne(),[n,f]=s.useState("installed"),[b,S]=s.useState([]),[R,re]=s.useState([]),[F,ae]=s.useState(null),[j,B]=s.useState(!0),[P,L]=s.useState(null),[i,O]=s.useState(null),[$,U]=s.useState(null),[y,V]=s.useState(null),[N,M]=s.useState(null),[_,D]=s.useState(null),[m,q]=s.useState(""),[o,se]=s.useState(null),[c,le]=s.useState(null),[u,z]=s.useState(1),x=s.useCallback((e,r)=>{V({kind:e,text:r}),window.setTimeout(()=>V(null),4e3)},[]),g=s.useCallback(async()=>{B(!0),L(null);const[e,r]=await Promise.all([p.get("/api/plugins"),p.get("/api/plugins/market")]);e.success&&e.data?(S(e.data.plugins),ae(e.data.schemaVersion??null)):L(e.error??"Failed to load plugins"),r.success&&r.data&&re(r.data.plugins),B(!1)},[]);s.useEffect(()=>{g()},[g]);const T=s.useMemo(()=>b.filter(e=>e.installable!==!0),[b]),h=s.useMemo(()=>[...b.filter(e=>e.installable===!0),...R.filter(e=>!b.some(r=>r.id===e.id||r.marketId===e.id))],[b,R]),C=s.useCallback(e=>e.filter(r=>o&&te(r)!==o||c&&(r.market??null)!==c?!1:$e(r,m)),[o,m,c]),k=s.useMemo(()=>C(T),[C,T]),v=s.useMemo(()=>C(h),[C,h]),G=s.useMemo(()=>{const e=new Set;for(const r of h)e.add(te(r));return["all",...Array.from(e).sort()]},[h]),Y=e=>Math.max(1,Math.ceil(e/E)),H=(e,r)=>e.slice((r-1)*E,r*E),A=Y(k.length),I=Y(v.length),ne=s.useMemo(()=>H(k,Math.min(u,A)),[k,u,A]),de=s.useMemo(()=>H(v,Math.min(u,I)),[v,u,I]);s.useEffect(()=>{z(1)},[n,m,o,c]);const ie=m.trim().length>0||o!==null||c!==null,w=s.useCallback(async(e,r,d)=>{O(e),U(r);try{const l=await d();l&&l.success===!1?x("err",String(l.error??"Request failed")):(x("ok",`${r} ${e} ✓`),await g())}catch(l){x("err",l instanceof Error?l.message:String(l))}finally{O(null),U(null)}},[g,x]),K=(e,r)=>w(e,r?"installed+activated":"installed",()=>p.post("/api/plugins/install",{id:e,activate:r})),oe=e=>w(e,"activated",()=>p.post(`/api/plugins/${encodeURIComponent(e)}/activate`)),ce=e=>w(e,"deactivated",()=>p.post(`/api/plugins/${encodeURIComponent(e)}/deactivate`)),ue=e=>w(e,"uninstalled",()=>p.delete(`/api/plugins/${encodeURIComponent(e)}`)),xe=async e=>{D(e);try{const r=await p.post(`/api/plugins/l2/provider/${encodeURIComponent(e)}`);r.success&&r.data?(x("ok",`Provider ${r.data.applied} applied to config ✓`),await g()):x("err",r.error??"Apply failed")}catch(r){x("err",r instanceof Error?r.message:String(r))}finally{D(null)}},Q=e=>{const r=e==="bundled"?"bg-blue-500/15 text-blue-400 border-blue-500/30":e==="npm"?"bg-purple-500/15 text-purple-400 border-purple-500/30":e==="local"?"bg-cyan-500/15 text-cyan-400 border-cyan-500/30":"bg-dark-hover text-dark-muted border-dark-border";return t.jsx("span",{className:`px-1.5 py-0.5 rounded text-[11px] border ${r}`,children:e})},pe=e=>{if(!e)return null;const r=e==="builtin"?"bg-dark-hover text-dark-muted border-dark-border":e==="openclaw"?"bg-amber-500/15 text-amber-400 border-amber-500/30":e==="deepseek-harness"?"bg-emerald-500/15 text-emerald-400 border-emerald-500/30":"bg-dark-hover text-dark-muted border-dark-border";return t.jsx("span",{className:`px-1.5 py-0.5 rounded text-[11px] border ${r}`,children:e})},X=(e,r)=>r>1?t.jsxs("div",{className:"flex items-center justify-center gap-3 pt-3 pb-1 select-none",children:[t.jsxs("button",{onClick:()=>z(d=>Math.max(1,d-1)),disabled:u<=1,className:"flex items-center gap-1 px-2 py-1 rounded border border-dark-border bg-dark-hover text-dark-muted text-[11px] hover:text-dark-text disabled:opacity-40 disabled:cursor-not-allowed transition-colors",children:[t.jsx(je,{size:12})," ",a("plugins.prevPage")]}),t.jsx("span",{className:"text-[11px] text-dark-muted",children:a("plugins.pageInfo",{page:Math.min(u,r),pages:r,count:e})}),t.jsxs("button",{onClick:()=>z(d=>Math.min(r,d+1)),disabled:u>=r,className:"flex items-center gap-1 px-2 py-1 rounded border border-dark-border bg-dark-hover text-dark-muted text-[11px] hover:text-dark-text disabled:opacity-40 disabled:cursor-not-allowed transition-colors",children:[a("plugins.nextPage")," ",t.jsx(ye,{size:12})]})]}):null,Z=e=>t.jsx("div",{className:"mt-8 text-center text-[12px] text-dark-muted",children:ie?a("plugins.noMatch"):e});return t.jsxs("div",{className:"h-full flex flex-col min-h-0 bg-dark-bg",children:[t.jsxs("div",{className:"h-11 flex items-center gap-2 px-3 border-b border-dark-border bg-dark-bg shrink-0 select-none",children:[t.jsx(be,{size:15,className:"text-accent-blue"}),t.jsx("span",{className:"truncate text-[13px] font-medium text-dark-text",children:a("nav.plugins")}),F!==null&&t.jsxs("span",{className:"px-1.5 py-0.5 rounded text-[10px] bg-dark-hover text-dark-muted border border-dark-border",children:["schema v",F]}),t.jsx("div",{className:"flex-1"}),t.jsx("button",{onClick:()=>void g(),className:"p-1.5 rounded hover:bg-dark-hover text-dark-muted hover:text-dark-text transition-colors",title:"Refresh",children:t.jsx(me,{size:14,className:j?"animate-spin":""})})]}),t.jsx("div",{className:"flex items-center gap-1 px-3 pt-2 shrink-0",children:["installed","available"].map(e=>t.jsx("button",{onClick:()=>f(e),className:`px-3 py-1.5 rounded-t text-[12px] transition-colors ${n===e?"bg-dark-surface text-accent-blue border border-b-0 border-dark-border":"text-dark-muted hover:text-dark-text"}`,children:e==="installed"?a("plugins.installedTab",{count:T.length}):a("plugins.availableTab",{count:h.length})},e))}),t.jsxs("div",{className:"shrink-0 px-3 pt-2 pb-1 space-y-2 bg-dark-bg",children:[t.jsxs("div",{className:"relative",children:[t.jsx(ge,{size:13,className:"absolute left-2.5 top-1/2 -translate-y-1/2 text-dark-muted pointer-events-none"}),t.jsx("input",{value:m,onChange:e=>q(e.target.value),placeholder:a("plugins.searchPlaceholder"),className:"w-full pl-8 pr-8 py-1.5 rounded bg-dark-hover border border-dark-border text-[12px] text-dark-text placeholder-dark-muted outline-none focus:border-accent-blue/50 transition-colors"}),m&&t.jsx("button",{onClick:()=>q(""),className:"absolute right-2 top-1/2 -translate-y-1/2 p-0.5 rounded text-dark-muted hover:text-dark-text transition-colors",title:a("plugins.clear"),children:t.jsx(J,{size:12})})]}),n==="available"&&G.length>2&&t.jsx("div",{className:"flex flex-wrap items-center gap-1.5",children:G.map(e=>t.jsx("button",{onClick:()=>se(e==="all"?null:e),className:`px-2 py-0.5 rounded-full text-[11px] border transition-colors ${e==="all"&&o===null||o===e?"bg-accent-blue/20 text-accent-blue border-accent-blue/40":"bg-dark-hover text-dark-muted border-dark-border hover:text-dark-text"}`,children:e==="all"?a("plugins.allCategories"):e},e))}),n==="available"&&t.jsx("div",{className:"flex flex-wrap items-center gap-1.5",children:Se.map(e=>{const r=e.value==="all"?a("plugins.marketFilterAll"):e.value==="builtin"?a("plugins.marketFilterBuiltin"):e.value;return t.jsx("button",{onClick:()=>le(e.value==="all"?null:e.value),className:`px-2 py-0.5 rounded-full text-[11px] border transition-colors ${e.value==="all"&&c===null||c===e.value?"bg-accent-blue/20 text-accent-blue border-accent-blue/40":"bg-dark-hover text-dark-muted border-dark-border hover:text-dark-text"}`,children:r},e.value)})})]}),t.jsxs("div",{className:"flex-1 min-h-0 overflow-y-auto px-3 pb-4",children:[P&&t.jsxs("div",{className:"mt-3 flex items-center gap-2 px-3 py-2 rounded bg-red-500/10 border border-red-500/30 text-red-400 text-[12px]",children:[t.jsx(he,{size:14})," ",P]}),j&&!P&&t.jsx("div",{className:"mt-10 flex justify-center",children:t.jsx("div",{className:"w-5 h-5 border-2 border-accent-blue border-t-transparent rounded-full animate-spin"})}),!j&&n==="installed"&&t.jsxs("div",{className:"mt-3 space-y-2",children:[k.length===0&&Z(a("plugins.emptyInstalled")),ne.map(e=>{const r=e.l2??[],d=e.status==="active";return t.jsxs("div",{className:"rounded-lg border border-dark-border bg-dark-surface p-3",children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"text-[13px] font-medium text-dark-text truncate",children:e.name||e.id}),e.version&&t.jsx("span",{className:"text-[11px] text-dark-muted shrink-0",children:e.version}),Q(e.source),t.jsx("span",{className:`px-1.5 py-0.5 rounded text-[11px] border shrink-0 ${d?"bg-emerald-500/15 text-emerald-400 border-emerald-500/30":"bg-dark-hover text-dark-muted border-dark-border"}`,children:d?"active":"installed"}),e.httpMounted&&t.jsx("span",{className:"px-1.5 py-0.5 rounded text-[11px] bg-emerald-500/15 text-emerald-400 border border-emerald-500/30 shrink-0",children:"http mounted"}),t.jsx("div",{className:"flex-1"}),t.jsx("span",{className:"text-[11px] text-dark-muted font-mono shrink-0",children:e.id})]}),e.description&&t.jsx("p",{className:"mt-1 text-[12px] text-dark-muted",children:e.description}),r.length>0&&t.jsxs("div",{className:"mt-2 flex flex-wrap gap-1.5",children:[r.map(l=>t.jsxs("span",{title:l.note||l.id,className:`px-1.5 py-0.5 rounded text-[11px] border cursor-help ${Pe(l.status)}`,children:[l.kind," · ",l.status,l.status==="wired"&&t.jsx(W,{size:10,className:"inline ml-0.5"})]},`${l.kind}-${l.id}`)),r.filter(l=>l.kind==="provider"&&l.status==="wired").map(l=>t.jsx("button",{disabled:_===l.id,onClick:()=>void xe(l.id),className:"px-1.5 py-0.5 rounded text-[11px] border border-accent-blue/40 text-accent-blue hover:bg-accent-blue/10 disabled:opacity-50 transition-colors",title:a("plugins.applyProviderTitle"),children:_===l.id?"applying…":"apply provider"},`apply-${l.id}`))]}),t.jsxs("div",{className:"mt-2 flex items-center gap-1.5",children:[d?t.jsxs("button",{onClick:()=>void ce(e.id),disabled:i===e.id,className:"flex items-center gap-1 px-2 py-1 rounded bg-amber-500/15 border border-amber-500/30 text-amber-400 text-[11px] hover:bg-amber-500/25 disabled:opacity-50 transition-colors",children:[t.jsx(ke,{size:11})," ",i===e.id?`${$}…`:a("plugins.deactivate")]}):t.jsxs("button",{onClick:()=>void oe(e.id),disabled:i===e.id,className:"flex items-center gap-1 px-2 py-1 rounded bg-emerald-500/15 border border-emerald-500/30 text-emerald-400 text-[11px] hover:bg-emerald-500/25 disabled:opacity-50 transition-colors",children:[t.jsx(ve,{size:11})," ",i===e.id?`${$}…`:a("plugins.activate")]}),t.jsxs("button",{onClick:()=>M(e.id),disabled:i===e.id,className:"flex items-center gap-1 px-2 py-1 rounded bg-dark-hover border border-dark-border text-dark-muted text-[11px] hover:text-red-400 hover:border-red-500/40 disabled:opacity-50 transition-colors",children:[t.jsx(fe,{size:11})," ",a("plugins.uninstall")]})]})]},e.id)}),X(k.length,A)]}),!j&&n==="available"&&t.jsxs("div",{className:"mt-3 space-y-2",children:[v.length===0&&Z(a("plugins.emptyMarket")),de.map(e=>t.jsxs("div",{className:"rounded-lg border border-dark-border bg-dark-surface p-3",children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"text-[13px] font-medium text-dark-text truncate",children:e.name||e.id}),e.version&&t.jsx("span",{className:"text-[11px] text-dark-muted shrink-0",children:e.version}),Q(e.source),pe(e.market),e.category&&t.jsx("span",{className:"px-1.5 py-0.5 rounded text-[11px] bg-dark-hover text-dark-muted border border-dark-border shrink-0",children:e.category}),t.jsx("div",{className:"flex-1"}),t.jsx("span",{className:"text-[11px] text-dark-muted font-mono shrink-0",children:e.id})]}),e.description&&t.jsx("p",{className:"mt-1 text-[12px] text-dark-muted",children:e.description}),t.jsxs("div",{className:"mt-2 flex items-center gap-1.5",children:[t.jsxs("button",{onClick:()=>void K(e.id,!0),disabled:i===e.id,className:"flex items-center gap-1 px-2 py-1 rounded bg-accent-blue/20 border border-accent-blue/40 text-accent-blue text-[11px] hover:bg-accent-blue/30 disabled:opacity-50 transition-colors",children:[t.jsx(ee,{size:11})," ",i===e.id?`${$}…`:a("plugins.installActivate")]}),t.jsxs("button",{onClick:()=>void K(e.id,!1),disabled:i===e.id,className:"flex items-center gap-1 px-2 py-1 rounded bg-dark-hover border border-dark-border text-dark-muted text-[11px] hover:text-dark-text disabled:opacity-50 transition-colors",children:[t.jsx(ee,{size:11})," ",a("plugins.installOnly")]})]})]},e.id)),X(v.length,I)]})]}),y&&t.jsxs("div",{className:`fixed bottom-4 right-4 z-50 flex items-center gap-2 px-3 py-2 rounded-lg border text-[12px] shadow-lg ${y.kind==="ok"?"bg-emerald-500/15 border-emerald-500/30 text-emerald-400":"bg-red-500/15 border-red-500/30 text-red-400"}`,children:[y.kind==="ok"?t.jsx(W,{size:13}):t.jsx(J,{size:13})," ",y.text]}),t.jsx(Ce,{isOpen:N!==null,title:a("plugins.uninstallTitle"),message:a("plugins.uninstallConfirm",{id:N??""}),onConfirm:()=>{N&&ue(N),M(null)},onClose:()=>M(null)})]})}export{Re as PluginsView};
@@ -1 +0,0 @@
1
- import{j as e}from"./markdown-B2L4Mq-x.js";import{a as u,F as ae,C as ne,aR as oe,aF as me,f as he,Y as X,a4 as pe,n as je,X as de,bq as be,w as ge,bH as le,b7 as fe,A as Z,N as ke,aK as ye,aq as ve,ao as Ne,M as we,a1 as ue,ah as Ce,a0 as Se,k as Pe,bI as Ee}from"./icons-BxNxyk-c.js";import{au as h,av as Me,u as H,a1 as Q,c as N,aw as Ie,ax as z,ay as ze,az as Ae,aA as De,aB as Re,aC as Te,aD as Fe,aE as _e,aF as Be,aG as Le,aH as $e,aI as He,t as L,N as Ke,aJ as Oe}from"./index-RB5ffy32.js";import{D as qe}from"./WorkspaceDirPicker-C5knnArH.js";import"./react-vendor-B2V_5iSS.js";import"./state-0T92JV0u.js";import"./panels-P_I7Q72_.js";function Ve(b={}){const t=b.enabled!==!1,i=h(o=>o.projects),l=h(o=>o.total),c=h(o=>o.hidden),n=h(o=>o.detail),g=h(o=>o.detailLoading),r=h(o=>o.detailError),j=h(o=>o.query),y=h(o=>o.sort),s=h(o=>o.stale),f=h(o=>o.loading),P=h(o=>o.lastError),E=h(o=>o.disabled),I=h(o=>o.refresh);u.useEffect(()=>{t&&h.getState().refresh()},[t]),u.useEffect(()=>{!t||!s||h.getState().scheduleRefresh()},[t,s]),u.useEffect(()=>{if(!t||typeof document>"u")return;const o=()=>{document.visibilityState==="visible"&&h.getState().refresh()};return document.addEventListener("visibilitychange",o),()=>document.removeEventListener("visibilitychange",o)},[t]);const v=new Set(c),C=Me(i,y).filter(o=>!v.has(o.projectId));return{projects:C.filter(o=>o.rootExists),hiddenCount:i.length-C.length,total:l,detail:n,detailLoading:g,detailError:r,query:j,sort:y,stale:s,loading:f,lastError:P,disabled:E,setQuery:o=>h.getState().setQuery(o),setSort:o=>h.getState().setSort(o),openProject:o=>void h.getState().openProject(o),closeDetail:()=>h.getState().closeDetail(),createProject:(o,x)=>h.getState().createProject(o,x),hideProject:o=>h.getState().hideProject(o),unhideAll:()=>h.getState().unhideAll(),probeEntry:()=>void h.getState().probeEntry(),refresh:()=>void I()}}const Ge={neutral:"border-dark-border bg-dark-hover/40 text-dark-muted",ok:"border-accent-green/30 bg-accent-green/10 text-accent-green",warn:"border-accent-yellow/40 bg-accent-yellow/10 text-accent-yellow"};function q({tone:b="neutral",testid:t,title:i,children:l}){return e.jsx("span",{"data-testid":t,title:i,className:N("inline-flex items-center gap-0.5 rounded-full border px-1.5 py-px text-[10.5px] leading-4",Ge[b]),children:l})}function se({icon:b,label:t,hint:i,disabled:l,testid:c,onClick:n}){const g=l?`${t} — ${i??""}`:t;return e.jsx("button",{type:"button","aria-label":g,title:g,"data-testid":c,"data-disabled":l?"true":"false",disabled:l,onClick:r=>{r.stopPropagation(),n()},className:"inline-flex h-6 w-6 items-center justify-center rounded-md text-dark-muted transition-colors hover:bg-dark-hover hover:text-dark-text disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:bg-transparent",children:b})}const Qe=u.memo(function({project:t,onOpen:i,onOpenFolder:l,onCopyRoot:c,onHide:n,now:g}){const{t:r}=H(),j=!t.rootExists,y=Object.values(t.threads).reduce((f,P)=>f+P,0),s=Q(t.lastActivityAt,g,r);return e.jsxs("div",{role:"button",tabIndex:0,onClick:()=>i(t.projectId),onKeyDown:f=>{(f.key==="Enter"||f.key===" ")&&f.target===f.currentTarget&&(f.preventDefault(),i(t.projectId))},className:N("group relative cursor-pointer rounded-xl border bg-dark-surface p-3.5 text-left shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent-blue",j?"border-dashed border-dark-border/60 opacity-70":"border-dark-border hover:border-accent-blue/40 hover:shadow-md"),"data-testid":`project-card-${t.projectId}`,"data-root-missing":j?"true":"false",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{"aria-hidden":"true",className:N("h-3.5 w-3.5 shrink-0 rounded-[4px] border",j?"border-dark-muted/40 bg-dark-muted/10":"border-accent-blue/50 bg-accent-blue/15")}),e.jsx("button",{type:"button",onClick:f=>{f.stopPropagation(),i(t.projectId)},className:"min-w-0 flex-1 truncate text-left text-[13px] font-semibold text-dark-text",title:t.root,"data-testid":`project-open-${t.projectId}`,children:t.name}),e.jsx("span",{className:"shrink-0 rounded border border-dark-border px-1 py-px text-[10px] leading-4 text-dark-muted",children:r("projects.visibility")})]}),e.jsxs("div",{className:"mt-1 flex items-center gap-2 text-[11px] text-dark-muted",children:[s&&e.jsx("span",{className:"font-mono tabular-nums","data-testid":`project-activity-${t.projectId}`,children:s}),j&&e.jsx("span",{className:"text-accent-yellow",children:r("projects.rootMissing")})]}),e.jsxs("div",{className:"mt-2 flex flex-wrap items-center gap-1",children:[e.jsxs(q,{testid:`project-sessions-${t.projectId}`,children:[r("projects.sessionCount",{count:t.sessions.total}),t.sessions.running>0&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"text-dark-muted/40","aria-hidden":"true",children:"·"}),e.jsx("span",{className:"inline-flex items-center gap-0.5 text-accent-blue","data-testid":"project-running",children:r("projects.runningCount",{count:t.sessions.running})})]})]}),e.jsx(q,{testid:`project-threads-${t.projectId}`,children:y>0?r("projects.threadCount",{count:y}):r("projects.noThreads")}),t.agentMd.present?e.jsx(q,{tone:t.agentMd.truncated?"warn":"ok",testid:`project-agentmd-${t.projectId}`,title:t.agentMd.truncated?r("projects.agentMdTruncated",{bytes:t.agentMd.bytes??0}):r("projects.agentMdBytes",{bytes:t.agentMd.bytes??0}),children:t.agentMd.truncated?r("projects.agentMdTruncatedShort"):r("projects.agentMdReady")}):e.jsx(q,{testid:`project-agentmd-${t.projectId}`,children:r("projects.agentMdAbsent")}),j&&e.jsx(q,{tone:"warn",testid:`project-missing-${t.projectId}`,children:r("projects.rootMissingChip")})]}),e.jsx("div",{className:"mt-1.5 truncate font-mono text-[10.5px] text-dark-muted/80",title:t.root,children:t.root}),e.jsxs("div",{className:"mt-2.5 flex items-center gap-0.5 border-t border-dark-border/40 pt-2",onClick:f=>f.stopPropagation(),children:[e.jsx(se,{icon:e.jsx(ae,{size:13,"aria-hidden":"true"}),label:r("projects.openFolder"),hint:j?r("projects.openFolderDisabled"):void 0,disabled:j,testid:`project-open-folder-${t.projectId}`,onClick:()=>l(t.root)}),e.jsx(se,{icon:e.jsx(ne,{size:13,"aria-hidden":"true"}),label:r("projects.copyRoot"),testid:`project-copy-root-${t.projectId}`,onClick:()=>c(t.root)}),e.jsx(se,{icon:e.jsx(oe,{size:13,"aria-hidden":"true"}),label:r(j?"projects.removeView":"projects.hide"),hint:r("projects.hideHint"),testid:`project-hide-${t.projectId}`,onClick:()=>n(t.projectId)})]})]})});function Ue(b,t){const i=b.fields,l=c=>typeof i[c]=="string"?i[c]:"";switch(b.type){case"pm_started":return e.jsx("span",{children:t("projects.pmStarted")});case"pm_stopped":return e.jsx("span",{children:t("projects.pmStopped")});case"pm_wakeup":{const c=l("reason"),n=l("summary");return e.jsxs("span",{children:[t("projects.pmWakeup"),c?e.jsxs("span",{className:"text-dark-text-secondary",children:[" · ",c]}):null,n?e.jsx("span",{className:"block text-dark-text-secondary",children:n}):null]})}case"pm_report":{const c=l("title"),n=l("progressSummary"),g=l("nextAction"),r=typeof i.approvalsPending=="number"?i.approvalsPending:0;return e.jsxs("span",{children:[c?e.jsx("span",{className:"font-medium",children:c}):e.jsx("span",{children:t("projects.pmReport")}),n?e.jsx("span",{className:"block text-dark-text-secondary",children:n}):null,g?e.jsxs("span",{className:"block text-dark-text-secondary",children:[t("projects.pmNextAction"),": ",g]}):null,r>0?e.jsxs("span",{className:"mt-0.5 inline-flex items-center gap-1 text-amber-400",children:[e.jsx(pe,{size:12,"aria-hidden":"true"})," ",r," ",t("projects.pmApprovalsPending")]}):null]})}case"pm_approval_requested":return e.jsx("span",{children:t("projects.pmApprovalRequested")});case"pm_approval_resolved":return e.jsxs("span",{children:[t("projects.pmApprovalResolved"),l("decision")?e.jsxs("span",{className:"text-dark-text-secondary",children:[" · ",l("decision")]}):null]});default:return e.jsx("span",{children:b.type})}}const Ye=u.memo(function({root:t}){const{t:i}=H(),l=u.useMemo(()=>Ie(t)??"",[t]),c=z(x=>x.residentByProject[l]??!1),n=z(x=>x.activityByProject[l]??ze),g=z(x=>Ae(x,l)),r=z(x=>x.resolveApproval),[j,y]=u.useState(!1),[s,f]=u.useState(""),[P,E]=u.useState(!1),[I,v]=u.useState(!1);u.useEffect(()=>{l&&De(l)},[l]);const C=async()=>{if(!(!l||I)){v(!0);try{await Re(l,!c)}finally{v(!1)}}},w=async()=>{const x=s.trim();if(!(!x||!l||P)){E(!0);try{await Te(l,x),f("")}finally{E(!1)}}},o=n.slice(-20).reverse();return e.jsxs("section",{"aria-label":i("projects.pmPanel"),className:"border-b border-dark-border",children:[e.jsxs("div",{className:"flex items-center gap-2 px-3 py-2",children:[e.jsx(me,{size:14,"aria-hidden":"true",className:c?"text-accent-green":"text-dark-text-secondary"}),e.jsx("span",{className:"text-xs font-medium",children:i("projects.pmPanel")}),e.jsxs("span",{className:N("inline-flex items-center gap-1 rounded-full px-1.5 py-0.5 text-[10px]",c?"bg-accent-green/15 text-accent-green":"bg-dark-bg-tertiary text-dark-text-secondary"),children:[e.jsx("span",{className:N("h-1.5 w-1.5 rounded-full",c?"bg-accent-green":"bg-dark-text-secondary"),"aria-hidden":"true"}),i(c?"projects.pmResident":"projects.pmOff")]}),e.jsxs("div",{className:"ml-auto flex items-center gap-1",children:[e.jsx("button",{type:"button",onClick:C,disabled:I||!l,className:N("rounded px-2 py-0.5 text-[11px] transition-colors",c?"text-dark-text-secondary hover:bg-dark-bg-tertiary hover:text-dark-text-primary":"bg-accent-green/15 text-accent-green hover:bg-accent-green/25"),children:i(c?"projects.pmStop":"projects.pmStart")}),e.jsx("button",{type:"button",onClick:()=>y(x=>!x),"aria-expanded":j,"aria-label":i("projects.pmToggleTimeline"),className:"rounded p-1 text-dark-text-secondary hover:bg-dark-bg-tertiary hover:text-dark-text-primary",children:j?e.jsx(he,{size:14,"aria-hidden":"true"}):e.jsx(X,{size:14,"aria-hidden":"true"})})]})]}),g.length>0&&e.jsx("ul",{className:"space-y-1.5 px-3 pb-2",children:g.map(x=>e.jsx("li",{className:"rounded-md border border-amber-500/30 bg-amber-500/5 p-2",children:e.jsxs("div",{className:"flex items-start gap-1.5",children:[e.jsx(pe,{size:13,"aria-hidden":"true",className:"mt-0.5 shrink-0 text-amber-400"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("p",{className:"truncate text-xs font-medium text-dark-text-primary",children:x.title||x.requestedAction||i("projects.pmApprovalCard")}),x.summary?e.jsx("p",{className:"mt-0.5 line-clamp-3 text-[11px] text-dark-text-secondary",children:x.summary}):null,e.jsxs("div",{className:"mt-1.5 flex gap-1.5",children:[e.jsxs("button",{type:"button",onClick:()=>void r(x.escalationId,"approve"),className:"inline-flex items-center gap-1 rounded bg-accent-green/15 px-2 py-0.5 text-[11px] text-accent-green hover:bg-accent-green/25",children:[e.jsx(je,{size:11,"aria-hidden":"true"})," ",i("projects.pmApprove")]}),e.jsxs("button",{type:"button",onClick:()=>void r(x.escalationId,"reject"),className:"inline-flex items-center gap-1 rounded bg-red-500/10 px-2 py-0.5 text-[11px] text-red-400 hover:bg-red-500/20",children:[e.jsx(de,{size:11,"aria-hidden":"true"})," ",i("projects.pmReject")]})]})]})]})},x.escalationId))}),e.jsx("div",{className:"px-3 pb-2",children:e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("input",{value:s,onChange:x=>f(x.target.value),onKeyDown:x=>{x.key==="Enter"&&!x.nativeEvent.isComposing&&w()},placeholder:i(c?"projects.pmInputPlaceholder":"projects.pmInputDisabled"),disabled:!c,className:"min-w-0 flex-1 rounded-md border border-dark-border bg-dark-bg-tertiary px-2 py-1 text-xs text-dark-text-primary placeholder:text-dark-text-secondary focus:border-accent-green/50 focus:outline-none disabled:opacity-50"}),e.jsx("button",{type:"button",onClick:()=>void w(),disabled:!c||!s.trim()||P,"aria-label":i("projects.pmSend"),className:"rounded p-1.5 text-accent-green hover:bg-accent-green/10 disabled:opacity-40",children:e.jsx(be,{size:13,"aria-hidden":"true"})})]})}),j&&o.length>0&&e.jsx("div",{className:"px-3 pb-2",children:e.jsx("ul",{className:"max-h-48 space-y-1.5 overflow-y-auto",children:o.map(x=>e.jsxs("li",{className:"flex items-start gap-1.5 text-xs",children:[x.type==="pm_report"?e.jsx(ge,{size:12,"aria-hidden":"true",className:"mt-0.5 shrink-0 text-accent-green"}):e.jsx("span",{className:"mt-1 h-1.5 w-1.5 shrink-0 rounded-full bg-dark-text-secondary","aria-hidden":"true"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-dark-text-primary",children:Ue(x,i)}),e.jsx("div",{className:"text-[10px] text-dark-text-secondary",children:Q(x.at)})]})]},x.id))})})]})}),We=["read file","read files","write file","edit file","list dir","list directory","apply patch","web search","web fetch","bash:","bash:","powershell:","powershell:","cmd:","cmd:","todo_write","notify_sessions","send_to_session","plugin_","mcp__"],Je=/^(?:grep|glob)(?:[ \t]+(?![\u4e00-\u9fff])|(?=[^\s\u4e00-\u9fff]))/;function ce(b){const t=b.trim().toLowerCase();return t?/^-{2,}/.test(t)||Je.test(t)?!0:We.some(i=>t.startsWith(i)):!1}const Xe=u.memo(function({currentProjectId:t,currentName:i,currentRootExists:l,currentLastActivityAt:c,onSelectProject:n,children:g}){var R;const{t:r}=H(),j=z(p=>p.managers),y=z(p=>p.dutyProjectKey),s=z(p=>p.managersLoading),f=z(p=>p.managersError),P=z(p=>p.residentByProject),E=z(p=>p.fetchManagers),I=z(p=>p.setDuty);u.useEffect(()=>{E()},[E]);const v=Date.now(),C=j.find(p=>p.projectKey===t)??null,w=j.filter(p=>p.projectKey!==t),o=y?((R=j.find(p=>p.projectKey===y))==null?void 0:R.name)??y:null,x=y===t,D=C?C.resident:P[t]??!1;return e.jsxs("div",{className:"flex min-h-0 min-w-0 flex-1 flex-col","data-testid":"manager-roster",children:[e.jsxs("div",{className:"flex shrink-0 items-center gap-2 px-3 pb-1 pt-2",children:[e.jsx("span",{className:"text-xs font-medium text-dark-text","data-testid":"manager-roster-title",children:r("projects.managersTitle")}),y?e.jsxs("span",{className:"flex min-w-0 items-center gap-1 rounded-full border border-accent-yellow/40 bg-accent-yellow/10 px-1.5 py-px text-[10px] text-accent-yellow","data-testid":"manager-duty-now",children:[e.jsx(le,{size:10,className:"shrink-0","aria-hidden":"true"}),e.jsx("span",{className:"truncate",children:r("projects.dutyNow",{name:o??""})})]}):e.jsx("span",{className:"rounded-full border border-dark-border bg-dark-hover/40 px-1.5 py-px text-[10px] text-dark-muted",title:r("projects.managersVacantHint"),"data-testid":"manager-duty-vacant",children:r("projects.dutyVacant")}),y&&e.jsxs("button",{type:"button",onClick:()=>void I(null),disabled:s,className:"ml-auto flex shrink-0 items-center gap-1 rounded border border-dark-border bg-dark-hover px-1.5 py-0.5 text-[10px] text-dark-muted transition-colors hover:text-dark-text disabled:cursor-not-allowed disabled:opacity-50",title:r("projects.managersVacantHint"),"data-testid":"manager-vacate",children:[e.jsx(fe,{size:10,"aria-hidden":"true"}),r("projects.dutyVacate")]})]}),f&&e.jsxs("div",{className:"mx-2 mb-1 flex shrink-0 items-center gap-1.5 rounded-lg border border-accent-red/40 bg-accent-red/10 px-2 py-1 text-[10px] leading-relaxed text-accent-red","data-testid":"manager-roster-error",children:[e.jsx(Z,{size:11,className:"shrink-0","aria-hidden":"true"}),e.jsx("span",{className:"min-w-0 flex-1 truncate",children:r("projects.managersLoadFailed")}),e.jsx("button",{type:"button",onClick:()=>void E(),className:"shrink-0 underline hover:no-underline","data-testid":"manager-roster-retry",children:r("projects.retry")})]}),e.jsxs("div",{className:"mx-2 flex min-h-0 flex-1 flex-col rounded-xl border border-accent-blue/30 bg-dark-hover/10","data-testid":"manager-row-current",children:[e.jsxs("div",{className:"flex shrink-0 items-center gap-1.5 border-b border-dark-border/50 px-2.5 py-1.5",children:[e.jsx(le,{size:11,className:N("shrink-0",x?"text-accent-yellow":"text-dark-muted/40"),"aria-hidden":"true"}),e.jsx("span",{className:"min-w-0 truncate text-xs font-medium text-dark-text",title:t,children:i}),x&&e.jsx(V,{tone:"duty",label:r("projects.managerBadgeDuty")}),D&&e.jsx(V,{tone:"resident",label:r("projects.managerBadgeResident")}),!l&&e.jsx(V,{tone:"missing",label:r("projects.managerBadgeMissing")}),c&&e.jsx("span",{className:"ml-auto shrink-0 font-mono text-[10px] tabular-nums text-dark-muted",children:Q(c,v,r)})]}),g]}),w.length>0&&e.jsx("div",{className:"mx-2 mb-2 mt-1.5 flex max-h-40 shrink-0 flex-col gap-1 overflow-y-auto custom-scrollbar",children:w.map((p,_)=>e.jsxs("button",{type:"button",onClick:()=>n==null?void 0:n(p.projectKey),disabled:!n,title:p.managerSessionId,className:N("flex w-full shrink-0 items-center gap-1.5 rounded-lg border border-dark-border/70 bg-dark-surface/60 px-2.5 py-1.5 text-left transition-colors",n&&"hover:border-accent-blue/40 hover:bg-dark-hover/40",!n&&"cursor-default"),"data-testid":`manager-row-${_}`,"data-project-id":p.projectKey,children:[e.jsx("span",{className:N("h-1.5 w-1.5 shrink-0 rounded-full",p.resident?"bg-accent-green":"bg-dark-muted/50"),"aria-hidden":"true"}),e.jsx("span",{className:"min-w-0 flex-1 truncate text-xs text-dark-text",children:p.name}),p.isDuty&&e.jsx(V,{tone:"duty",label:r("projects.managerBadgeDuty")}),!p.rootExists&&e.jsx(V,{tone:"missing",label:r("projects.managerBadgeMissing")}),e.jsx("span",{className:"shrink-0 font-mono text-[10px] tabular-nums text-dark-muted",children:Q(p.lastActivityAt,v,r)}),e.jsx(X,{size:12,className:"shrink-0 text-dark-muted","aria-hidden":"true"})]},p.projectKey))})]})});function V({tone:b,label:t}){return e.jsx("span",{className:N("shrink-0 rounded-full border px-1.5 py-px text-[10px] leading-4",b==="duty"&&"border-accent-yellow/40 bg-accent-yellow/10 text-accent-yellow",b==="resident"&&"border-accent-blue/40 bg-accent-blue/10 text-accent-blue",b==="missing"&&"border-dark-border bg-dark-hover/40 text-dark-muted"),children:t})}const G=50,Ze=u.memo(function({projectId:t,onBack:i,onOpenFolder:l,onCopyRoot:c,onNewSessionHere:n,onOpenThreadSession:g,onOpenSession:r,onHide:j,onSelectProject:y}){const{t:s}=H(),[f,P]=u.useState(!1),[E,I]=u.useState(null),[v,C]=u.useState(""),[w,o]=u.useState("all"),[x,D]=u.useState(1),[R,p]=u.useState(!1),{state:_,open:K,openAt:ee,close:U}=Fe(),A=h(a=>a.detail),Y=h(a=>a.detailLoading),T=h(a=>a.detailError);u.useEffect(()=>{h.getState().openProject(t)},[t]),u.useEffect(()=>{I(null),P(!1),C(""),o("all"),D(1),p(!1)},[t]);const d=(A==null?void 0:A.project)??null,S=d?!d.rootExists:!1,W=Date.now(),$=(A==null?void 0:A.sessions)??[],F=u.useMemo(()=>{const a=v.trim().toLowerCase();return!a&&w==="all"?$:$.filter(B=>w==="running"&&!B.running?!1:a?B.title.toLowerCase().includes(a)||(B.preview??"").toLowerCase().includes(a):!0)},[$,v,w]),{mainSessions:M,noiseSessions:O}=u.useMemo(()=>{if(v.trim()!=="")return{mainSessions:F,noiseSessions:[]};const a=F.filter(te=>ce(te.title));return{mainSessions:F.filter(te=>!ce(te.title)),noiseSessions:a}},[F,v]),m=Math.max(1,Math.ceil(M.length/G)),k=Math.min(x,m),J=u.useMemo(()=>M.slice((k-1)*G,k*G),[M,k]);u.useEffect(()=>{D(1)},[v,w]);const ie=u.useMemo(()=>{if(!d)return[];const a=[{kind:"item",id:"copy-root",label:s("projects.copyRoot"),icon:ne,onSelect:()=>c(d.root)}];return j&&a.push({kind:"item",id:"hide-view",label:s(S?"projects.removeView":"projects.hide"),icon:oe,onSelect:()=>j(d.projectId)}),a},[d,S,c,j,s]);return e.jsxs("div",{className:"flex h-full min-h-0 flex-col","data-testid":"project-detail",children:[e.jsxs("div",{className:"flex shrink-0 items-center gap-2 border-b border-dark-border px-3 py-2.5",children:[e.jsx("button",{type:"button",onClick:i,className:"ui-icon-button",title:s("projects.back"),"aria-label":s("projects.back"),"data-testid":"project-detail-back",children:e.jsx(ke,{size:15,"aria-hidden":"true"})}),e.jsxs("nav",{className:"min-w-0 flex items-baseline gap-1.5 text-sm",children:[e.jsx("button",{type:"button",onClick:i,className:"shrink-0 text-dark-muted transition-colors hover:text-dark-text",children:s("projects.title")}),e.jsx("span",{className:"shrink-0 text-dark-muted/50","aria-hidden":"true",children:"›"}),e.jsx("span",{className:"truncate font-medium text-dark-text","data-testid":"project-detail-name",children:(d==null?void 0:d.name)??t})]}),e.jsxs("div",{className:"ml-auto flex items-center gap-2",children:[d&&e.jsx("span",{className:"hidden min-w-0 max-w-[240px] truncate font-mono text-[10.5px] text-dark-muted lg:block",title:d.root,"data-testid":"project-detail-root",children:d.root}),e.jsxs("button",{type:"button",onClick:()=>d&&l(d.root),disabled:S||!d,className:"btn shrink-0 text-[11px] disabled:cursor-not-allowed disabled:opacity-50",title:S?s("projects.openFolderDisabled"):d==null?void 0:d.root,"data-testid":"project-detail-open-folder",children:[e.jsx(ae,{size:12,"aria-hidden":"true"}),s("projects.openFolder")]}),e.jsx("span",{className:"rounded bg-dark-hover/70 px-1.5 py-px text-[10px] text-dark-muted",children:s("projects.overview")}),e.jsx("button",{type:"button",onClick:()=>P(a=>!a),"aria-expanded":f,className:"ui-icon-button",title:s("projects.settings"),"aria-label":s("projects.settings"),"data-testid":"project-detail-settings",children:e.jsx(ye,{size:14,"aria-hidden":"true"})}),e.jsx("button",{type:"button",onClick:a=>K(a,null),onKeyDown:a=>{if(a.key==="Enter"||a.key===" "){a.preventDefault();const B=a.currentTarget.getBoundingClientRect();ee(B.left,B.bottom+4,null,{height:_e(ie.length)})}},className:"ui-icon-button",title:s("projects.moreActions"),"aria-label":s("projects.moreActions"),"aria-haspopup":"menu","data-testid":"project-detail-more",children:e.jsx(ve,{size:14,"aria-hidden":"true"})})]})]}),S&&d&&e.jsxs("div",{className:"flex shrink-0 items-start gap-1.5 border-b border-accent-yellow/30 bg-accent-yellow/10 px-3 py-2 text-[10.5px] leading-relaxed text-accent-yellow","data-testid":"project-detail-missing",children:[e.jsx(Z,{size:12,className:"mt-[1px] shrink-0","aria-hidden":"true"}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("b",{className:"font-semibold",children:s("projects.rootMissingTitle")}),d&&e.jsx("span",{className:"mx-1 font-mono",children:d.root}),e.jsx("br",{}),s("projects.rootMissingBody")]})]}),f&&d&&e.jsxs("div",{className:"shrink-0 space-y-1 border-b border-dark-border bg-dark-hover/20 px-3 py-2","data-testid":"project-settings",children:[e.jsx(re,{icon:e.jsx(ae,{size:12,"aria-hidden":"true"}),label:s("projects.openFolder"),hint:d.root,disabled:S,disabledHint:S?s("projects.openFolderDisabled"):void 0,onClick:()=>l(d.root),testId:"project-settings-open-folder"}),e.jsx(re,{icon:e.jsx(ne,{size:12,"aria-hidden":"true"}),label:s("projects.copyRoot"),hint:d.root,onClick:()=>c(d.root),testId:"project-settings-copy-root"}),e.jsx(re,{icon:e.jsx(Ne,{size:12,"aria-hidden":"true"}),label:s("projects.rename"),disabled:!0,disabledHint:s("projects.renameDisabled"),testId:"project-settings-rename"})]}),e.jsxs("div",{className:"flex min-h-0 flex-1",children:[e.jsxs(Xe,{currentProjectId:t,currentName:(d==null?void 0:d.name)??t,currentRootExists:d?d.rootExists:!0,currentLastActivityAt:d==null?void 0:d.lastActivityAt,onSelectProject:y,children:[e.jsxs("div",{className:"flex shrink-0 flex-col gap-2 px-3 py-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-xs font-medium text-dark-text",children:s("projects.sessions")}),d&&e.jsx("span",{className:"rounded-full border border-dark-border bg-dark-hover/40 px-1.5 py-px text-[10px] leading-4 text-dark-muted","data-testid":"project-sessions-count",children:s("projects.sessionsCount",{count:M.length})}),e.jsx("div",{className:"ml-auto flex items-center rounded-md bg-dark-hover/60 p-0.5",role:"group",children:["all","running"].map(a=>e.jsx("button",{type:"button",onClick:()=>o(a),"aria-pressed":w===a,className:N("shrink-0 rounded px-1.5 py-0.5 text-[10.5px] transition-colors",w===a?"bg-dark-surface text-dark-text":"text-dark-muted hover:text-dark-text"),"data-testid":`project-sessions-filter-${a}`,children:s(`projects.sessionsFilter.${a}`)},a))}),e.jsxs("button",{type:"button",onClick:()=>d&&n(d.root),disabled:S||!d,className:"btn btn-primary shrink-0 text-[11px] disabled:cursor-not-allowed disabled:opacity-60",title:s(S?"projects.newSessionDisabled":"projects.newSessionHere"),"data-testid":"project-new-session","data-disabled":S?"true":"false",children:[e.jsx(we,{size:12,"aria-hidden":"true"}),s("projects.newSessionHere")]})]}),e.jsxs("div",{className:"flex items-center gap-2 rounded-lg border border-dark-border bg-dark-surface px-2.5 py-1.5 transition-colors focus-within:border-accent-blue/50",children:[e.jsx(ue,{size:13,className:"shrink-0 text-dark-muted","aria-hidden":"true"}),e.jsx("input",{type:"text",value:v,onChange:a=>C(a.target.value),placeholder:s("projects.sessionsSearchPlaceholder"),"aria-label":s("projects.sessionsSearchPlaceholder"),"data-testid":"project-sessions-search",className:"min-w-0 flex-1 bg-transparent text-xs text-dark-text placeholder:text-dark-muted focus:outline-none"}),v&&e.jsx("button",{type:"button",onClick:()=>C(""),className:"shrink-0 rounded p-0.5 text-dark-muted transition-colors hover:text-dark-text","aria-label":s("projects.searchClear"),"data-testid":"project-sessions-search-clear",children:e.jsx(de,{size:12,"aria-hidden":"true"})})]})]}),e.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto px-2 pb-3 custom-scrollbar",children:T?e.jsxs("div",{className:"flex items-start gap-1.5 rounded-lg border border-accent-red/40 bg-accent-red/10 px-2 py-1.5 text-[10.5px] leading-relaxed text-accent-red","data-testid":"project-detail-error",children:[e.jsx(Z,{size:12,className:"mt-[1px] shrink-0","aria-hidden":"true"}),e.jsx("span",{className:"min-w-0 flex-1",children:s("projects.detailLoadFailed",{message:T})}),e.jsx("button",{type:"button",onClick:()=>void h.getState().openProject(t),className:"shrink-0 underline hover:no-underline","data-testid":"project-detail-retry",children:s("projects.retry")})]}):Y&&!A?e.jsx("p",{className:"px-2 py-4 text-center text-[10.5px] text-dark-muted",children:s("common.loading")}):$.length===0?e.jsxs("div",{className:"px-2 py-6 text-center","data-testid":"project-sessions-empty",children:[e.jsx("p",{className:"text-[11px] text-dark-text",children:s("projects.noSessions")}),e.jsx("p",{className:"mt-1 text-[10.5px] leading-relaxed text-dark-muted",children:s("projects.noSessionsHint")})]}):F.length===0?e.jsxs("div",{className:"px-2 py-6 text-center","data-testid":"project-sessions-no-match",children:[e.jsx("p",{className:"text-[11px] text-dark-text",children:s("projects.sessionsNoMatch")}),e.jsx("p",{className:"mt-1 text-[10.5px] leading-relaxed text-dark-muted",children:s("projects.sessionsNoMatchHint")})]}):e.jsxs(e.Fragment,{children:[M.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"space-y-1.5","data-testid":"project-sessions-list",children:J.map(a=>e.jsx(xe,{id:a.id,title:a.title,preview:a.preview,running:a.running,updatedAt:a.updatedAt,now:W,onClick:()=>r==null?void 0:r(a.id,S||d==null?void 0:d.root,a.title)},a.id))}),m>1&&e.jsxs("div",{className:"flex select-none items-center justify-center gap-3 pt-3","data-testid":"project-sessions-pagination",children:[e.jsxs("button",{type:"button",onClick:()=>D(a=>Math.max(1,a-1)),disabled:k<=1,className:"flex items-center gap-1 rounded border border-dark-border bg-dark-hover px-2 py-1 text-[11px] text-dark-muted transition-colors hover:text-dark-text disabled:cursor-not-allowed disabled:opacity-40","data-testid":"project-sessions-prev",children:[e.jsx(Ce,{size:12,"aria-hidden":"true"}),s("common.prevPage")]}),e.jsx("span",{className:"text-[11px] tabular-nums text-dark-muted",children:s("common.pageInfo",{start:(k-1)*G+1,end:Math.min(k*G,M.length),total:M.length})}),e.jsxs("button",{type:"button",onClick:()=>D(a=>Math.min(m,a+1)),disabled:k>=m,className:"flex items-center gap-1 rounded border border-dark-border bg-dark-hover px-2 py-1 text-[11px] text-dark-muted transition-colors hover:text-dark-text disabled:cursor-not-allowed disabled:opacity-40","data-testid":"project-sessions-next",children:[s("common.nextPage"),e.jsx(X,{size:12,"aria-hidden":"true"})]})]})]}),O.length>0&&e.jsxs("div",{className:"mt-2 rounded-lg border border-dark-border/60 bg-dark-surface/40","data-testid":"project-noise-group",children:[e.jsxs("button",{type:"button",onClick:()=>p(a=>!a),"aria-expanded":R||M.length===0,className:"flex w-full items-center gap-1.5 px-2.5 py-1.5 text-left","data-testid":"project-noise-toggle",children:[e.jsx(X,{size:12,className:N("shrink-0 text-dark-muted transition-transform",(R||M.length===0)&&"rotate-90"),"aria-hidden":"true"}),e.jsx("span",{className:"text-[10.5px] text-dark-muted",children:s("projects.noiseGroupCount",{count:O.length})})]}),(R||M.length===0)&&e.jsx("div",{className:"max-h-48 space-y-1 overflow-y-auto border-t border-dark-border/60 p-1.5 custom-scrollbar",children:O.map(a=>e.jsx(xe,{id:a.id,title:a.title,preview:a.preview,running:a.running,updatedAt:a.updatedAt,now:W,onClick:()=>r==null?void 0:r(a.id,S||d==null?void 0:d.root,a.title)},a.id))})]})]})})]}),e.jsxs("div",{className:"flex min-h-0 w-[392px] shrink-0 flex-col border-l border-dark-border",children:[(d==null?void 0:d.root)&&e.jsx(Ye,{root:d.root}),E?e.jsx(Be,{threadId:E,onBack:()=>I(null),onOpenSession:g}):e.jsx(Le,{workspaceId:t,onOpenThread:I})]})]}),e.jsx($e,{items:ie,position:_?{x:_.x,y:_.y}:null,onClose:U,ariaLabel:s("projects.moreActions")})]})});function re({icon:b,label:t,hint:i,disabled:l,disabledHint:c,onClick:n,testId:g}){return e.jsxs("button",{type:"button",onClick:n,disabled:l,className:N("flex w-full items-center gap-2 rounded px-1.5 py-1 text-left text-[11px] transition-colors",l?"cursor-not-allowed text-dark-muted/60":"text-dark-text hover:bg-dark-hover"),"data-testid":g,"data-disabled":l?"true":"false",title:l?c:i,children:[e.jsx("span",{className:"shrink-0",children:b}),e.jsx("span",{className:"shrink-0",children:t}),e.jsx("span",{className:"ml-auto min-w-0 truncate font-mono text-[10px] text-dark-muted/70",children:l?c:i})]})}function xe({id:b,title:t,preview:i,running:l,updatedAt:c,now:n,onClick:g}){const{t:r}=H();return e.jsxs("button",{type:"button",onClick:g,className:"block w-full rounded-lg border border-dark-border/70 bg-dark-surface/60 px-2.5 py-2 text-left transition-colors hover:border-accent-blue/40 hover:bg-dark-hover/40","data-testid":`project-session-${b}`,children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:N("h-1.5 w-1.5 shrink-0 rounded-full",l?"bg-accent-blue":"bg-dark-muted/50"),"aria-hidden":"true"}),e.jsx("span",{className:"min-w-0 flex-1 truncate text-xs text-dark-text",title:t,children:t}),e.jsx("span",{className:"shrink-0 font-mono text-[10px] tabular-nums text-dark-muted",children:Q(c,n,r)})]}),i&&e.jsx("p",{className:"mt-0.5 truncate pl-3 text-[10.5px] text-dark-muted/80",children:i})]})}const et=250,it=u.memo(function({workspaceDir:t,onNewSessionHere:i,onOpenThreadSession:l,onOpenSession:c}){const{t:n}=H(),{projects:g,hiddenCount:r,query:j,sort:y,loading:s,lastError:f,disabled:P,setQuery:E,setSort:I,openProject:v,closeDetail:C,createProject:w,hideProject:o,unhideAll:x,refresh:D}=Ve(),[R,p]=u.useState(null),[_,K]=u.useState(!1),[ee,U]=u.useState(!1),[A,Y]=u.useState(j),T=u.useRef(null);u.useEffect(()=>{Y(j)},[j]),u.useEffect(()=>()=>{T.current&&clearTimeout(T.current)},[]);const d=m=>{Y(m),T.current&&clearTimeout(T.current),T.current=setTimeout(()=>E(m),et)},[S,W]=u.useState(()=>Date.now());u.useEffect(()=>{const m=setInterval(()=>W(Date.now()),3e4);return()=>clearInterval(m)},[]);const $=u.useMemo(()=>He,[]),F=m=>{Oe.openFolder(m).then(k=>{k.ok||L.error(k.error||n("projects.openFolderFailed"),5e3)})},M=m=>{var J;const k=(J=navigator.clipboard)==null?void 0:J.writeText(m);k&&k.then(()=>L.success(n("projects.copied"),2e3),()=>L.error(n("projects.copyFailed"),4e3))},O=m=>{K(!1),U(!0),w(m).then(k=>{if(U(!1),!k.ok){L.error(k.error,6e3);return}L.success(n("projects.created"),3e3),k.projectId&&p(k.projectId)})};return P?e.jsx("div",{className:"flex h-full items-center justify-center p-6","data-testid":"projects-disabled",children:e.jsxs("div",{className:"max-w-md rounded-xl border border-dark-border bg-dark-surface p-4 text-center",children:[e.jsx(Se,{size:18,className:"mx-auto text-dark-muted","aria-hidden":"true"}),e.jsx("p",{className:"mt-2 text-xs leading-relaxed text-dark-muted",children:n("projects.disabled")})]})}):e.jsxs("div",{className:"flex h-full min-h-0 flex-col","data-testid":"projects-view",children:[R?e.jsx(Ze,{projectId:R,onBack:()=>{p(null),C()},onOpenFolder:F,onCopyRoot:M,onNewSessionHere:i,onOpenThreadSession:l,onOpenSession:c,onHide:m=>{o(m),L.info(n("projects.hiddenToast"),4e3),p(null),C()},onSelectProject:m=>p(m)}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex shrink-0 items-center gap-2 border-b border-dark-border px-3 py-2.5",children:[e.jsx("span",{className:"text-sm font-medium text-dark-text",children:n("projects.title")}),e.jsx("span",{className:"rounded-full border border-dark-border bg-dark-hover/40 px-1.5 py-px text-[10px] leading-4 text-dark-muted","data-testid":"projects-count-pill",children:n("projects.projectCount",{count:g.length})}),e.jsx("div",{className:"ml-1 flex items-center rounded-md bg-dark-hover/60 p-0.5",role:"group",children:$.map(m=>e.jsx("button",{type:"button",onClick:()=>I(m),"aria-pressed":y===m,className:N("shrink-0 rounded px-1.5 py-0.5 text-[10.5px] transition-colors",y===m?"bg-dark-surface text-dark-text":"text-dark-muted hover:text-dark-text"),"data-testid":`projects-sort-${m}`,children:n(`projects.sort.${m}`)},m))}),e.jsxs("div",{className:"ml-auto flex items-center gap-1",children:[e.jsx("button",{type:"button",onClick:D,disabled:s,className:"ui-icon-button disabled:opacity-50",title:n("common.refresh"),"aria-label":n("common.refresh"),"data-testid":"projects-refresh",children:e.jsx(Pe,{size:14,className:N(s&&"animate-spin"),"aria-hidden":"true"})}),e.jsxs("button",{type:"button",onClick:()=>K(!0),disabled:ee,className:"btn btn-primary shrink-0 text-[11px] disabled:opacity-60","data-testid":"projects-new",children:[e.jsx(Ee,{size:13,"aria-hidden":"true"}),n("projects.new")]})]})]}),f&&e.jsx("div",{className:"shrink-0 px-3 pt-2","data-testid":"projects-status-banner",children:e.jsxs("div",{className:"flex items-start gap-1.5 rounded-lg border border-accent-red/40 bg-accent-red/10 px-2 py-1.5 text-[10.5px] leading-relaxed text-accent-red",children:[e.jsx(Z,{size:12,className:"mt-[1px] shrink-0","aria-hidden":"true"}),e.jsx("span",{className:"min-w-0 flex-1",children:n("projects.loadFailed",{message:f})}),e.jsx("button",{type:"button",onClick:D,className:"shrink-0 underline hover:no-underline","data-testid":"projects-retry",children:n("projects.retry")})]})}),r>0&&e.jsx("div",{className:"shrink-0 px-3 pt-2","data-testid":"projects-hidden-banner",children:e.jsxs("div",{className:"flex items-center gap-1.5 rounded-lg border border-dark-border bg-dark-hover/40 px-2 py-1.5 text-[10.5px] text-dark-muted",children:[e.jsx(oe,{size:11,className:"shrink-0","aria-hidden":"true"}),e.jsx("span",{className:"min-w-0 flex-1",children:n("projects.hiddenCount",{count:r})}),e.jsx("button",{type:"button",onClick:x,className:"shrink-0 underline hover:no-underline","data-testid":"projects-unhide-all",children:n("projects.unhideAll")})]})}),e.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto px-3 py-3 custom-scrollbar",children:e.jsxs("div",{className:"mx-auto flex max-w-[860px] flex-col",children:[e.jsx("h1",{className:"text-lg font-semibold text-dark-text",children:n("projects.title")}),e.jsx("p",{className:"mt-0.5 text-xs leading-relaxed text-dark-muted",children:n("projects.subtitle")}),e.jsxs("div",{className:"mt-4 flex items-center gap-2 rounded-lg border border-dark-border bg-dark-surface px-2.5 py-1.5 transition-colors focus-within:border-accent-blue/50",children:[e.jsx(ue,{size:13,className:"shrink-0 text-dark-muted","aria-hidden":"true"}),e.jsx("input",{type:"text",value:A,onChange:m=>d(m.target.value),placeholder:n("projects.searchPlaceholder"),"aria-label":n("projects.searchPlaceholder"),"data-testid":"projects-search",className:"min-w-0 flex-1 bg-transparent text-xs text-dark-text placeholder:text-dark-muted focus:outline-none"}),A&&e.jsx("button",{type:"button",onClick:()=>d(""),className:"shrink-0 rounded p-0.5 text-dark-muted transition-colors hover:text-dark-text","aria-label":n("projects.searchClear"),"data-testid":"projects-search-clear",children:e.jsx(de,{size:12,"aria-hidden":"true"})}),e.jsx("span",{className:"shrink-0 text-[10px] text-dark-muted/70",children:n("projects.serverFilterHint")})]}),g.length===0?j.trim()?e.jsxs("div",{className:"mt-6 rounded-xl border border-dashed border-dark-border/60 py-8 text-center","data-testid":"projects-search-empty",children:[e.jsx("p",{className:"text-xs text-dark-text",children:n("projects.searchEmpty")}),e.jsx("p",{className:"mt-1 text-[10.5px] leading-relaxed text-dark-muted",children:n("projects.searchEmptyHint",{q:j.trim()})})]}):e.jsxs("div",{className:"mt-6 rounded-xl border border-dashed border-dark-border/60 py-8 text-center","data-testid":"projects-empty",children:[e.jsx("p",{className:"text-xs text-dark-text",children:n("projects.empty")}),e.jsx("p",{className:"mt-1 text-[10.5px] leading-relaxed text-dark-muted",children:n("projects.emptyHint")})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"mb-3 mt-5 flex items-center gap-2 text-[10px] font-semibold uppercase tracking-wide text-dark-muted/60",children:[e.jsx("span",{className:"shrink-0",children:n("projects.yourProjects")}),e.jsx("span",{className:"h-px flex-1 bg-dark-border/60","aria-hidden":"true"})]}),e.jsx("div",{className:"grid [grid-template-columns:repeat(auto-fill,minmax(250px,1fr))] gap-3","data-testid":"projects-list",children:g.map(m=>e.jsx(Qe,{project:m,onOpen:k=>{p(k),v(k)},onOpenFolder:F,onCopyRoot:M,onHide:k=>{o(k),L.info(n("projects.hiddenToast"),4e3)},now:S},m.projectId))})]})]})})]}),_&&Ke.createPortal(e.jsx(qe,{initial:t||"",onClose:()=>K(!1),onConfirm:O}),document.body)]})});export{it as ProjectsView};