pikiclaw 0.3.24 → 0.3.26

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.
@@ -1 +1 @@
1
- import{r,j as e}from"./react-vendor-DTcmqLiz.js";import{u as I,e as xe,a as H,g as R,B as y,E as ge,S as q,d as Y,c as pe}from"./index-Bbf__IXB.js";import{B as he}from"./BrandIcon-BAXeIuGD.js";import{M as ve,a as be,L as P}from"./Modal-utaCOq7k.js";import{S as K}from"./Select-DBMtcZku.js";import{S as Z}from"./shared-BRvVjyDB.js";import"./router-emLofBBH.js";const je=["claude","codex","gemini"];function Ne(t){return t==="zh-CN"?{defaultsTitle:"新会话默认值",defaultsHint:"新会话会默认采用这里的智能体、模型和推理强度。",defaultsEditTitle:"编辑新会话默认值",defaultsEditHint:"在弹窗中选择默认智能体、模型和推理强度,保存后对新会话生效。",defaultsSaved:"新会话默认值已保存",editDefaults:"修改默认值",agentsTitle:"可用智能体",defaultAgent:"默认智能体",defaultModel:"默认模型",defaultEffort:"推理强度",status:"状态",model:"模型",models:"模型",version:"版本",defaultBadge:"默认",installed:"已安装",notInstalled:"未安装",noModel:"暂无可选模型",currentModelPrefix:"当前模型",availableModelsSuffix:"个可选",availableModels:"可用模型",recommendedFor:"建议场景",currentConfig:"当前配置",effort:"推理强度",readyHint:"已安装,可直接作为新会话执行智能体。",installHint:"尚未安装,需要先完成本地 CLI 安装。",noVersion:"版本未知",moreModels:s=>`+${s}`,install:"安装",installing:"安装中...",noEffort:"不支持调整",loadFailed:"无法加载智能体状态",latestVersion:"最新版本",updateAvailable:"有新版本可用",updateSkipped:"自动更新已跳过",updateFailed:"自动更新失败",update:"手动升级",updating:"升级中...",checkUpdate:"检查更新",checking:"检查中...",upToDate:"已是最新"}:{defaultsTitle:"New Session Defaults",defaultsHint:"New sessions use this agent, model, and effort by default.",defaultsEditTitle:"Edit New Session Defaults",defaultsEditHint:"Choose the default agent, model, and effort in the modal, then save them for new sessions.",defaultsSaved:"New session defaults saved",editDefaults:"Edit Defaults",agentsTitle:"Available Agents",defaultAgent:"Default Agent",defaultModel:"Default Model",defaultEffort:"Effort",status:"Status",model:"Model",models:"Models",version:"Version",defaultBadge:"Default",installed:"Installed",notInstalled:"Not installed",noModel:"No selectable models",currentModelPrefix:"Current model",availableModelsSuffix:"available",availableModels:"Available models",recommendedFor:"Recommended for",currentConfig:"Current config",effort:"Effort",readyHint:"Installed and ready for new sessions.",installHint:"Not installed locally yet.",noVersion:"Version unavailable",moreModels:s=>`+${s}`,install:"Install",installing:"Installing...",noEffort:"Not supported",loadFailed:"Failed to load agent status",latestVersion:"Latest",updateAvailable:"Update available",updateSkipped:"Auto-update skipped",updateFailed:"Auto-update failed",update:"Update",updating:"Updating...",checkUpdate:"Check update",checking:"Checking...",upToDate:"Up to date"}}function Me(t,s){const n=t.filter(u=>u.installed);return(n.length?n:t).map(u=>({value:u.agent,label:`${R(u.agent).label} · ${u.installed?u.version||s.installed:s.notInstalled}`}))}function ke(t){if(!t)return[];const s=t.models.map(n=>({value:n.id,label:n.alias?`${n.alias} · ${n.id}`:n.id}));return t.selectedModel&&!s.some(n=>n.value===t.selectedModel)&&s.unshift({value:t.selectedModel,label:t.selectedModel}),s}function Ae(t){return t?ge[t.agent].map(s=>({value:s,label:s})):[]}function Ee(t,s){if(!t.models.length)return s.noModel;const n=t.selectedModel?t.models.find(u=>u.id===t.selectedModel):t.models[0],m=n?.alias||n?.id||s.noModel;return`${s.currentModelPrefix}: ${m} · ${t.models.length} ${s.availableModelsSuffix}`}function se(t){return t?t.alias||t.id:"—"}function le(t,s){if(!t.models.length)return s.noModel;const n=t.selectedModel?t.models.find(m=>m.id===t.selectedModel):t.models[0];return se(n)}function Se(t,s=4){const n=new Set;return t.models.map(u=>({key:u.id,label:se(u)})).filter(u=>n.has(u.key)?!1:(n.add(u.key),!0)).slice(0,s)}function ee(t,s){t({defaultAgent:s.defaultAgent,agents:s.agents})}function te(t,s){return{agent:t?.agent||s,model:t?.selectedModel||"",effort:t?.selectedEffort||""}}function G({label:t,value:s,hint:n,loading:m=!1}){return e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt px-3.5 py-2.5",children:[e.jsx("div",{className:"text-[10px] font-semibold uppercase tracking-[0.14em] text-fg-5",children:t}),e.jsxs("div",{className:"mt-1 flex items-center gap-2 text-[13px] font-semibold text-fg-2",children:[m&&e.jsx(q,{className:"h-3.5 w-3.5"}),e.jsx("span",{children:s})]}),n&&e.jsx("div",{className:"mt-0.5 text-[10px] leading-relaxed text-fg-5",children:n})]})}function we({agent:t,copy:s,t:n,installing:m,onInstall:u,updatingAgent:o,checkingAgent:d,onUpdate:A,onCheckUpdate:U,loading:c=!1}){const E=R(t.agent),V=Ee(t,s),O=le(t,s),j=E.advantageKey?n(E.advantageKey):"—",D=Se(t),F=Math.max(0,t.models.length-D.length),_=t.selectedEffort||s.noEffort,S=t.version||s.noVersion,N=c?n("status.loading"):t.installed?s.installed:s.notInstalled,i=c?"muted":t.installed?"ok":"warn",w=c?n("status.loading"):t.installed?s.readyHint:s.installHint,C=c?n("status.loading"):O,g=c?n("status.loading"):_,p=c?n("status.loading"):j,h=c?n("status.loading"):V;return e.jsx("div",{className:"glass rounded-md border border-edge px-4 py-3 shadow-[0_1px_0_rgba(255,255,255,0.02),0_4px_12px_rgba(15,23,42,0.05)]",children:e.jsxs("div",{className:"grid gap-x-5 gap-y-3 xl:grid-cols-[220px_130px_220px_minmax(0,1fr)_auto] xl:items-start",children:[e.jsx("div",{className:"min-w-0",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"flex h-10 w-10 shrink-0 items-center justify-center rounded-md border border-edge bg-panel-alt",children:e.jsx(he,{brand:t.agent,size:22})}),e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("div",{className:"text-[15px] font-semibold text-fg",children:E.label}),t.isDefault&&e.jsx(Y,{variant:"accent",children:s.defaultBadge})]}),e.jsxs("div",{className:"mt-1 text-[12px] leading-relaxed text-fg-5",children:[s.version,": ",S,t.latestVersion&&t.updateAvailable&&e.jsxs("span",{className:"ml-1.5 text-amber-400",children:["→ ",t.latestVersion]}),t.latestVersion&&!t.updateAvailable&&t.installed&&e.jsx("span",{className:"ml-1.5 text-emerald-400",children:"✓"})]})]})]})}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[10px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:s.status}),e.jsx("div",{className:"mt-1.5",children:e.jsxs(Y,{variant:i,children:[c&&e.jsx(q,{className:"h-3 w-3"}),N]})}),e.jsx("div",{className:"mt-1.5 text-[12px] leading-relaxed text-fg-5",children:w})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[10px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:s.currentConfig}),e.jsxs("div",{className:"mt-1.5 space-y-1.5 text-[13px] leading-relaxed text-fg-3",children:[e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:"w-16 shrink-0 text-fg-5",children:s.model}),e.jsx("span",{className:"min-w-0 break-words text-fg-2",children:C})]}),e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:"w-16 shrink-0 text-fg-5",children:s.effort}),e.jsx("span",{className:"text-fg-2",children:g})]})]})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[10px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:s.recommendedFor}),e.jsx("div",{className:"mt-1.5 text-[13px] leading-relaxed text-fg-3",children:p}),e.jsx("div",{className:"mt-2.5 text-[10px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:s.availableModels}),e.jsxs("div",{className:"mt-1.5 flex flex-wrap items-center gap-1.5",children:[!c&&D.length>0?D.map(v=>e.jsx("span",{className:"inline-flex h-6 max-w-full items-center rounded-md border border-edge bg-panel-alt px-2 text-[11px] text-fg-3",title:v.key,children:e.jsx("span",{className:"truncate",children:v.label})},v.key)):e.jsx("span",{className:"text-[12px] text-fg-5",children:c?n("status.loading"):s.noModel}),!c&&F>0&&e.jsx("span",{className:"inline-flex h-6 items-center rounded-md border border-edge bg-panel-alt px-2 text-[11px] text-fg-5",children:s.moreModels(F)})]}),e.jsx("div",{className:"mt-1.5 text-[12px] leading-relaxed text-fg-5",children:h})]}),e.jsxs("div",{className:pe("flex flex-col items-start gap-1.5 xl:items-end",t.installed&&"xl:self-start"),children:[c&&e.jsxs("div",{className:"inline-flex h-7 items-center gap-2 rounded-md border border-edge bg-transparent px-2.5 text-[11px] text-fg-5",children:[e.jsx(q,{className:"h-3 w-3"}),n("status.loading")]}),!c&&!t.installed&&e.jsx(y,{variant:"outline",size:"sm",disabled:m,onClick:()=>u(t),children:m?s.installing:s.install}),!c&&t.installed&&t.updateAvailable&&e.jsx(y,{variant:"primary",size:"sm",disabled:o,onClick:()=>A(t),children:o?s.updating:s.update}),!c&&t.installed&&!t.updateAvailable&&e.jsx(y,{variant:"ghost",size:"sm",disabled:d,onClick:()=>U(t),children:d?s.checking:s.checkUpdate}),!c&&t.installed&&t.updateAvailable&&t.updateStatus==="skipped"&&t.updateDetail&&e.jsxs("div",{className:"text-[11px] leading-relaxed text-amber-400",children:[s.updateSkipped,": ",t.updateDetail]}),!c&&t.installed&&t.updateStatus==="failed"&&t.updateDetail&&e.jsxs("div",{className:"text-[11px] leading-relaxed text-red-400",children:[s.updateFailed,": ",t.updateDetail]})]})]})})}function Ve(){const t=I(l=>l.locale),s=I(l=>l.toast),n=I(l=>l.agentStatus),m=I(l=>l.setAgentStatus),u=I(l=>l.refreshAgentStatus),o=r.useMemo(()=>xe(t),[t]),d=Ne(t),[A,U]=r.useState(n?{defaultAgent:n.defaultAgent,agents:n.agents}:null),[c,E]=r.useState(!n),[V,O]=r.useState(null),[j,D]=r.useState(!1),[F,_]=r.useState(null),[S,N]=r.useState(!1),[i,w]=r.useState({agent:"codex",model:"",effort:""}),C=r.useRef(!!n);r.useEffect(()=>{n&&(ee(U,n),C.current||(C.current=!0,E(!1)))},[n]);const g=r.useCallback(l=>{ee(U,l),m(l)},[m]),p=r.useCallback(async()=>{C.current||E(!0);try{const l=await H.getAgentStatus();return g(l),O(null),C.current=!0,l}catch(l){const a=l instanceof Error?l.message:d.loadFailed;return O(a),C.current||s(a,!1),null}finally{E(!1)}},[g,d.loadFailed,s]);r.useEffect(()=>{n?u():p()},[]);const h=r.useMemo(()=>{const l=A?.agents||[],a=new Map(l.map(f=>[f.agent,f]));return je.map(f=>{const T=a.get(f);if(T)return T;const b=R(f);return{agent:f,label:b.label,installed:!1,version:void 0,installCommand:void 0,selectedModel:null,selectedEffort:null,isDefault:A?.defaultAgent===f,models:[],usage:null}})},[A]),v=A?.defaultAgent||"codex",M=h.find(l=>l.agent===v)||null,J=h.filter(l=>l.installed).length>0,ae=Me(h,d),x=h.find(l=>l.agent===i.agent)||null,L=ke(x),$=Ae(x),Q=r.useCallback(async l=>{D(!0);try{const a=await H.updateRuntimeAgent(l);if(!a.ok)throw new Error(a.error||o("config.applyFailed"));return g(a),a}catch(a){const f=a instanceof Error?a.message:o("config.applyFailed");return s(f,!1),p(),null}finally{D(!1)}},[g,p,o,s]);r.useEffect(()=>{S&&w(te(M,v))},[v,M,S]),r.useEffect(()=>{if(!S||!x)return;const l=x.selectedModel||"",a=!i.model||L.some(b=>b.value===i.model),f=x.selectedEffort||"",T=!i.effort||$.some(b=>b.value===i.effort);a&&T||w(b=>({...b,model:a?b.model:l,effort:T?b.effort:f}))},[S,i.effort,i.model,x,$,L]);const ne=r.useCallback(l=>{const a=h.find(f=>f.agent===l);a?.installed&&w(te(a,a.agent))},[h]),de=r.useCallback(async()=>{if(!x?.installed)return;const l={};if(i.agent!==v&&(l.defaultAgent=i.agent),i.model&&i.model!==(x.selectedModel||"")&&(l.agent=i.agent,l.model=i.model),i.effort&&i.effort!==(x.selectedEffort||"")&&(l.agent=i.agent,l.effort=i.effort),Object.keys(l).length===0){N(!1);return}await Q(l)&&(s(d.defaultsSaved),N(!1))},[d.defaultsSaved,v,i.agent,i.effort,i.model,x,s,Q]),ie=r.useCallback(async l=>{if(!F){_(l.agent);try{const a=await H.installAgent(l.agent);if(!a.ok)throw new Error(a.error||o("config.agentInstallFailed"));g(a),s(o("config.agentInstalled"))}catch(a){const f=a instanceof Error?a.message:o("config.agentInstallFailed");s(f,!1),p()}finally{_(a=>a===l.agent?null:a)}}},[g,F,p,o,s]),[B,W]=r.useState(null),[z,X]=r.useState(null),re=r.useCallback(async l=>{if(!B){W(l.agent);try{const a=await H.updateAgent(l.agent);if(!a.ok)throw new Error(a.error||o("config.agentInstallFailed"));g(a),s(d.upToDate)}catch(a){const f=a instanceof Error?a.message:d.updateFailed;s(f,!1),p()}finally{W(a=>a===l.agent?null:a)}}},[g,d.updateFailed,d.upToDate,p,o,s,B]),oe=r.useCallback(async l=>{if(!z){X(l.agent);try{const a=await H.checkAgentUpdate(l.agent);if(!a.ok)throw new Error(a.error||d.loadFailed);g(a)}catch(a){const f=a instanceof Error?a.message:d.loadFailed;s(f,!1),p()}finally{X(a=>a===l.agent?null:a)}}},[g,z,d.loadFailed,p,s]),k=c&&!A,ce=k?o("status.loading"):M?R(M.agent).label:d.notInstalled,fe=k?o("status.loading"):M?.installed?d.installed:d.notInstalled,ue=k?o("status.loading"):M?le(M,d):d.noModel,me=k?o("status.loading"):M?.selectedEffort||d.noEffort;return e.jsxs("div",{className:"animate-in space-y-4",children:[e.jsx("section",{className:"space-y-3",children:e.jsxs(Z,{className:"space-y-3",children:[e.jsxs("div",{className:"flex flex-col gap-3 lg:flex-row lg:items-start lg:justify-between",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-base font-semibold tracking-tight text-fg",children:d.defaultsTitle}),e.jsx("div",{className:"mt-0.5 text-[13px] leading-relaxed text-fg-4",children:d.defaultsHint})]}),e.jsx("div",{className:"flex justify-end",children:e.jsx(y,{variant:"secondary",onClick:()=>N(!0),disabled:j||!J,children:d.editDefaults})})]}),e.jsxs("div",{className:"grid gap-2.5 lg:grid-cols-3",children:[e.jsx(G,{label:d.defaultAgent,value:ce,hint:fe,loading:k}),e.jsx(G,{label:d.defaultModel,value:ue,loading:k}),e.jsx(G,{label:d.defaultEffort,value:me,loading:k})]})]})}),e.jsxs("section",{className:"space-y-3",children:[e.jsx("div",{className:"text-[11px] font-semibold uppercase tracking-[0.18em] text-fg-5",children:d.agentsTitle}),e.jsx("div",{className:"space-y-3",children:h.map(l=>e.jsx(we,{agent:l,copy:d,t:o,installing:F===l.agent,loading:k,onInstall:ie,updatingAgent:B===l.agent,checkingAgent:z===l.agent,onUpdate:re,onCheckUpdate:oe},l.agent))})]}),V&&e.jsx(Z,{className:"border-amber-500/20 bg-amber-500/5",children:e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsx("div",{className:"text-[13px] text-fg-2",children:V}),e.jsx(y,{variant:"outline",size:"sm",onClick:()=>{p()},children:o("sessions.retry")})]})}),e.jsxs(ve,{open:S,onClose:()=>N(!1),children:[e.jsx(be,{title:d.defaultsEditTitle,description:d.defaultsEditHint,onClose:()=>N(!1)}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx(P,{children:d.defaultAgent}),e.jsx(K,{value:i.agent,options:ae,onChange:ne,disabled:j||!J,placeholder:d.notInstalled})]}),e.jsxs("div",{children:[e.jsx(P,{children:d.defaultModel}),e.jsx(K,{value:i.model,options:L,onChange:l=>w(a=>({...a,model:l})),disabled:j||!x?.installed||L.length===0,placeholder:d.noModel})]}),e.jsxs("div",{children:[e.jsx(P,{children:d.defaultEffort}),e.jsx(K,{value:i.effort,options:$,onChange:l=>w(a=>({...a,effort:l})),disabled:j||!x?.installed||$.length===0,placeholder:d.noEffort})]})]}),e.jsxs("div",{className:"mt-6 flex justify-end gap-2",children:[e.jsx(y,{variant:"ghost",onClick:()=>N(!1),children:o("modal.cancel")}),e.jsx(y,{variant:"primary",disabled:j||!x?.installed,onClick:()=>{de()},children:o(j?"config.validating":"modal.save")})]})]})]})}export{Ve as AgentTab,Ve as default};
1
+ import{r,j as e}from"./react-vendor-DTcmqLiz.js";import{u as I,e as xe,a as H,g as R,B as y,E as ge,S as q,d as Y,c as pe}from"./index-BFtrf-rI.js";import{B as he}from"./BrandIcon-DHNapeU6.js";import{M as ve,a as be,L as P}from"./Modal-CQ3_xUJW.js";import{S as K}from"./Select-CoN6w4C5.js";import{S as Z}from"./shared-CHbIVrko.js";import"./router-emLofBBH.js";const je=["claude","codex","gemini"];function Ne(t){return t==="zh-CN"?{defaultsTitle:"新会话默认值",defaultsHint:"新会话会默认采用这里的智能体、模型和推理强度。",defaultsEditTitle:"编辑新会话默认值",defaultsEditHint:"在弹窗中选择默认智能体、模型和推理强度,保存后对新会话生效。",defaultsSaved:"新会话默认值已保存",editDefaults:"修改默认值",agentsTitle:"可用智能体",defaultAgent:"默认智能体",defaultModel:"默认模型",defaultEffort:"推理强度",status:"状态",model:"模型",models:"模型",version:"版本",defaultBadge:"默认",installed:"已安装",notInstalled:"未安装",noModel:"暂无可选模型",currentModelPrefix:"当前模型",availableModelsSuffix:"个可选",availableModels:"可用模型",recommendedFor:"建议场景",currentConfig:"当前配置",effort:"推理强度",readyHint:"已安装,可直接作为新会话执行智能体。",installHint:"尚未安装,需要先完成本地 CLI 安装。",noVersion:"版本未知",moreModels:s=>`+${s}`,install:"安装",installing:"安装中...",noEffort:"不支持调整",loadFailed:"无法加载智能体状态",latestVersion:"最新版本",updateAvailable:"有新版本可用",updateSkipped:"自动更新已跳过",updateFailed:"自动更新失败",update:"手动升级",updating:"升级中...",checkUpdate:"检查更新",checking:"检查中...",upToDate:"已是最新"}:{defaultsTitle:"New Session Defaults",defaultsHint:"New sessions use this agent, model, and effort by default.",defaultsEditTitle:"Edit New Session Defaults",defaultsEditHint:"Choose the default agent, model, and effort in the modal, then save them for new sessions.",defaultsSaved:"New session defaults saved",editDefaults:"Edit Defaults",agentsTitle:"Available Agents",defaultAgent:"Default Agent",defaultModel:"Default Model",defaultEffort:"Effort",status:"Status",model:"Model",models:"Models",version:"Version",defaultBadge:"Default",installed:"Installed",notInstalled:"Not installed",noModel:"No selectable models",currentModelPrefix:"Current model",availableModelsSuffix:"available",availableModels:"Available models",recommendedFor:"Recommended for",currentConfig:"Current config",effort:"Effort",readyHint:"Installed and ready for new sessions.",installHint:"Not installed locally yet.",noVersion:"Version unavailable",moreModels:s=>`+${s}`,install:"Install",installing:"Installing...",noEffort:"Not supported",loadFailed:"Failed to load agent status",latestVersion:"Latest",updateAvailable:"Update available",updateSkipped:"Auto-update skipped",updateFailed:"Auto-update failed",update:"Update",updating:"Updating...",checkUpdate:"Check update",checking:"Checking...",upToDate:"Up to date"}}function Me(t,s){const n=t.filter(u=>u.installed);return(n.length?n:t).map(u=>({value:u.agent,label:`${R(u.agent).label} · ${u.installed?u.version||s.installed:s.notInstalled}`}))}function ke(t){if(!t)return[];const s=t.models.map(n=>({value:n.id,label:n.alias?`${n.alias} · ${n.id}`:n.id}));return t.selectedModel&&!s.some(n=>n.value===t.selectedModel)&&s.unshift({value:t.selectedModel,label:t.selectedModel}),s}function Ae(t){return t?ge[t.agent].map(s=>({value:s,label:s})):[]}function Ee(t,s){if(!t.models.length)return s.noModel;const n=t.selectedModel?t.models.find(u=>u.id===t.selectedModel):t.models[0],m=n?.alias||n?.id||s.noModel;return`${s.currentModelPrefix}: ${m} · ${t.models.length} ${s.availableModelsSuffix}`}function se(t){return t?t.alias||t.id:"—"}function le(t,s){if(!t.models.length)return s.noModel;const n=t.selectedModel?t.models.find(m=>m.id===t.selectedModel):t.models[0];return se(n)}function Se(t,s=4){const n=new Set;return t.models.map(u=>({key:u.id,label:se(u)})).filter(u=>n.has(u.key)?!1:(n.add(u.key),!0)).slice(0,s)}function ee(t,s){t({defaultAgent:s.defaultAgent,agents:s.agents})}function te(t,s){return{agent:t?.agent||s,model:t?.selectedModel||"",effort:t?.selectedEffort||""}}function G({label:t,value:s,hint:n,loading:m=!1}){return e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt px-3.5 py-2.5",children:[e.jsx("div",{className:"text-[10px] font-semibold uppercase tracking-[0.14em] text-fg-5",children:t}),e.jsxs("div",{className:"mt-1 flex items-center gap-2 text-[13px] font-semibold text-fg-2",children:[m&&e.jsx(q,{className:"h-3.5 w-3.5"}),e.jsx("span",{children:s})]}),n&&e.jsx("div",{className:"mt-0.5 text-[10px] leading-relaxed text-fg-5",children:n})]})}function we({agent:t,copy:s,t:n,installing:m,onInstall:u,updatingAgent:o,checkingAgent:d,onUpdate:A,onCheckUpdate:U,loading:c=!1}){const E=R(t.agent),V=Ee(t,s),O=le(t,s),j=E.advantageKey?n(E.advantageKey):"—",D=Se(t),F=Math.max(0,t.models.length-D.length),_=t.selectedEffort||s.noEffort,S=t.version||s.noVersion,N=c?n("status.loading"):t.installed?s.installed:s.notInstalled,i=c?"muted":t.installed?"ok":"warn",w=c?n("status.loading"):t.installed?s.readyHint:s.installHint,C=c?n("status.loading"):O,g=c?n("status.loading"):_,p=c?n("status.loading"):j,h=c?n("status.loading"):V;return e.jsx("div",{className:"glass rounded-md border border-edge px-4 py-3 shadow-[0_1px_0_rgba(255,255,255,0.02),0_4px_12px_rgba(15,23,42,0.05)]",children:e.jsxs("div",{className:"grid gap-x-5 gap-y-3 xl:grid-cols-[220px_130px_220px_minmax(0,1fr)_auto] xl:items-start",children:[e.jsx("div",{className:"min-w-0",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"flex h-10 w-10 shrink-0 items-center justify-center rounded-md border border-edge bg-panel-alt",children:e.jsx(he,{brand:t.agent,size:22})}),e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("div",{className:"text-[15px] font-semibold text-fg",children:E.label}),t.isDefault&&e.jsx(Y,{variant:"accent",children:s.defaultBadge})]}),e.jsxs("div",{className:"mt-1 text-[12px] leading-relaxed text-fg-5",children:[s.version,": ",S,t.latestVersion&&t.updateAvailable&&e.jsxs("span",{className:"ml-1.5 text-amber-400",children:["→ ",t.latestVersion]}),t.latestVersion&&!t.updateAvailable&&t.installed&&e.jsx("span",{className:"ml-1.5 text-emerald-400",children:"✓"})]})]})]})}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[10px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:s.status}),e.jsx("div",{className:"mt-1.5",children:e.jsxs(Y,{variant:i,children:[c&&e.jsx(q,{className:"h-3 w-3"}),N]})}),e.jsx("div",{className:"mt-1.5 text-[12px] leading-relaxed text-fg-5",children:w})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[10px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:s.currentConfig}),e.jsxs("div",{className:"mt-1.5 space-y-1.5 text-[13px] leading-relaxed text-fg-3",children:[e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:"w-16 shrink-0 text-fg-5",children:s.model}),e.jsx("span",{className:"min-w-0 break-words text-fg-2",children:C})]}),e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{className:"w-16 shrink-0 text-fg-5",children:s.effort}),e.jsx("span",{className:"text-fg-2",children:g})]})]})]}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[10px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:s.recommendedFor}),e.jsx("div",{className:"mt-1.5 text-[13px] leading-relaxed text-fg-3",children:p}),e.jsx("div",{className:"mt-2.5 text-[10px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:s.availableModels}),e.jsxs("div",{className:"mt-1.5 flex flex-wrap items-center gap-1.5",children:[!c&&D.length>0?D.map(v=>e.jsx("span",{className:"inline-flex h-6 max-w-full items-center rounded-md border border-edge bg-panel-alt px-2 text-[11px] text-fg-3",title:v.key,children:e.jsx("span",{className:"truncate",children:v.label})},v.key)):e.jsx("span",{className:"text-[12px] text-fg-5",children:c?n("status.loading"):s.noModel}),!c&&F>0&&e.jsx("span",{className:"inline-flex h-6 items-center rounded-md border border-edge bg-panel-alt px-2 text-[11px] text-fg-5",children:s.moreModels(F)})]}),e.jsx("div",{className:"mt-1.5 text-[12px] leading-relaxed text-fg-5",children:h})]}),e.jsxs("div",{className:pe("flex flex-col items-start gap-1.5 xl:items-end",t.installed&&"xl:self-start"),children:[c&&e.jsxs("div",{className:"inline-flex h-7 items-center gap-2 rounded-md border border-edge bg-transparent px-2.5 text-[11px] text-fg-5",children:[e.jsx(q,{className:"h-3 w-3"}),n("status.loading")]}),!c&&!t.installed&&e.jsx(y,{variant:"outline",size:"sm",disabled:m,onClick:()=>u(t),children:m?s.installing:s.install}),!c&&t.installed&&t.updateAvailable&&e.jsx(y,{variant:"primary",size:"sm",disabled:o,onClick:()=>A(t),children:o?s.updating:s.update}),!c&&t.installed&&!t.updateAvailable&&e.jsx(y,{variant:"ghost",size:"sm",disabled:d,onClick:()=>U(t),children:d?s.checking:s.checkUpdate}),!c&&t.installed&&t.updateAvailable&&t.updateStatus==="skipped"&&t.updateDetail&&e.jsxs("div",{className:"text-[11px] leading-relaxed text-amber-400",children:[s.updateSkipped,": ",t.updateDetail]}),!c&&t.installed&&t.updateStatus==="failed"&&t.updateDetail&&e.jsxs("div",{className:"text-[11px] leading-relaxed text-red-400",children:[s.updateFailed,": ",t.updateDetail]})]})]})})}function Ve(){const t=I(l=>l.locale),s=I(l=>l.toast),n=I(l=>l.agentStatus),m=I(l=>l.setAgentStatus),u=I(l=>l.refreshAgentStatus),o=r.useMemo(()=>xe(t),[t]),d=Ne(t),[A,U]=r.useState(n?{defaultAgent:n.defaultAgent,agents:n.agents}:null),[c,E]=r.useState(!n),[V,O]=r.useState(null),[j,D]=r.useState(!1),[F,_]=r.useState(null),[S,N]=r.useState(!1),[i,w]=r.useState({agent:"codex",model:"",effort:""}),C=r.useRef(!!n);r.useEffect(()=>{n&&(ee(U,n),C.current||(C.current=!0,E(!1)))},[n]);const g=r.useCallback(l=>{ee(U,l),m(l)},[m]),p=r.useCallback(async()=>{C.current||E(!0);try{const l=await H.getAgentStatus();return g(l),O(null),C.current=!0,l}catch(l){const a=l instanceof Error?l.message:d.loadFailed;return O(a),C.current||s(a,!1),null}finally{E(!1)}},[g,d.loadFailed,s]);r.useEffect(()=>{n?u():p()},[]);const h=r.useMemo(()=>{const l=A?.agents||[],a=new Map(l.map(f=>[f.agent,f]));return je.map(f=>{const T=a.get(f);if(T)return T;const b=R(f);return{agent:f,label:b.label,installed:!1,version:void 0,installCommand:void 0,selectedModel:null,selectedEffort:null,isDefault:A?.defaultAgent===f,models:[],usage:null}})},[A]),v=A?.defaultAgent||"codex",M=h.find(l=>l.agent===v)||null,J=h.filter(l=>l.installed).length>0,ae=Me(h,d),x=h.find(l=>l.agent===i.agent)||null,L=ke(x),$=Ae(x),Q=r.useCallback(async l=>{D(!0);try{const a=await H.updateRuntimeAgent(l);if(!a.ok)throw new Error(a.error||o("config.applyFailed"));return g(a),a}catch(a){const f=a instanceof Error?a.message:o("config.applyFailed");return s(f,!1),p(),null}finally{D(!1)}},[g,p,o,s]);r.useEffect(()=>{S&&w(te(M,v))},[v,M,S]),r.useEffect(()=>{if(!S||!x)return;const l=x.selectedModel||"",a=!i.model||L.some(b=>b.value===i.model),f=x.selectedEffort||"",T=!i.effort||$.some(b=>b.value===i.effort);a&&T||w(b=>({...b,model:a?b.model:l,effort:T?b.effort:f}))},[S,i.effort,i.model,x,$,L]);const ne=r.useCallback(l=>{const a=h.find(f=>f.agent===l);a?.installed&&w(te(a,a.agent))},[h]),de=r.useCallback(async()=>{if(!x?.installed)return;const l={};if(i.agent!==v&&(l.defaultAgent=i.agent),i.model&&i.model!==(x.selectedModel||"")&&(l.agent=i.agent,l.model=i.model),i.effort&&i.effort!==(x.selectedEffort||"")&&(l.agent=i.agent,l.effort=i.effort),Object.keys(l).length===0){N(!1);return}await Q(l)&&(s(d.defaultsSaved),N(!1))},[d.defaultsSaved,v,i.agent,i.effort,i.model,x,s,Q]),ie=r.useCallback(async l=>{if(!F){_(l.agent);try{const a=await H.installAgent(l.agent);if(!a.ok)throw new Error(a.error||o("config.agentInstallFailed"));g(a),s(o("config.agentInstalled"))}catch(a){const f=a instanceof Error?a.message:o("config.agentInstallFailed");s(f,!1),p()}finally{_(a=>a===l.agent?null:a)}}},[g,F,p,o,s]),[B,W]=r.useState(null),[z,X]=r.useState(null),re=r.useCallback(async l=>{if(!B){W(l.agent);try{const a=await H.updateAgent(l.agent);if(!a.ok)throw new Error(a.error||o("config.agentInstallFailed"));g(a),s(d.upToDate)}catch(a){const f=a instanceof Error?a.message:d.updateFailed;s(f,!1),p()}finally{W(a=>a===l.agent?null:a)}}},[g,d.updateFailed,d.upToDate,p,o,s,B]),oe=r.useCallback(async l=>{if(!z){X(l.agent);try{const a=await H.checkAgentUpdate(l.agent);if(!a.ok)throw new Error(a.error||d.loadFailed);g(a)}catch(a){const f=a instanceof Error?a.message:d.loadFailed;s(f,!1),p()}finally{X(a=>a===l.agent?null:a)}}},[g,z,d.loadFailed,p,s]),k=c&&!A,ce=k?o("status.loading"):M?R(M.agent).label:d.notInstalled,fe=k?o("status.loading"):M?.installed?d.installed:d.notInstalled,ue=k?o("status.loading"):M?le(M,d):d.noModel,me=k?o("status.loading"):M?.selectedEffort||d.noEffort;return e.jsxs("div",{className:"animate-in space-y-4",children:[e.jsx("section",{className:"space-y-3",children:e.jsxs(Z,{className:"space-y-3",children:[e.jsxs("div",{className:"flex flex-col gap-3 lg:flex-row lg:items-start lg:justify-between",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-base font-semibold tracking-tight text-fg",children:d.defaultsTitle}),e.jsx("div",{className:"mt-0.5 text-[13px] leading-relaxed text-fg-4",children:d.defaultsHint})]}),e.jsx("div",{className:"flex justify-end",children:e.jsx(y,{variant:"secondary",onClick:()=>N(!0),disabled:j||!J,children:d.editDefaults})})]}),e.jsxs("div",{className:"grid gap-2.5 lg:grid-cols-3",children:[e.jsx(G,{label:d.defaultAgent,value:ce,hint:fe,loading:k}),e.jsx(G,{label:d.defaultModel,value:ue,loading:k}),e.jsx(G,{label:d.defaultEffort,value:me,loading:k})]})]})}),e.jsxs("section",{className:"space-y-3",children:[e.jsx("div",{className:"text-[11px] font-semibold uppercase tracking-[0.18em] text-fg-5",children:d.agentsTitle}),e.jsx("div",{className:"space-y-3",children:h.map(l=>e.jsx(we,{agent:l,copy:d,t:o,installing:F===l.agent,loading:k,onInstall:ie,updatingAgent:B===l.agent,checkingAgent:z===l.agent,onUpdate:re,onCheckUpdate:oe},l.agent))})]}),V&&e.jsx(Z,{className:"border-amber-500/20 bg-amber-500/5",children:e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsx("div",{className:"text-[13px] text-fg-2",children:V}),e.jsx(y,{variant:"outline",size:"sm",onClick:()=>{p()},children:o("sessions.retry")})]})}),e.jsxs(ve,{open:S,onClose:()=>N(!1),children:[e.jsx(be,{title:d.defaultsEditTitle,description:d.defaultsEditHint,onClose:()=>N(!1)}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx(P,{children:d.defaultAgent}),e.jsx(K,{value:i.agent,options:ae,onChange:ne,disabled:j||!J,placeholder:d.notInstalled})]}),e.jsxs("div",{children:[e.jsx(P,{children:d.defaultModel}),e.jsx(K,{value:i.model,options:L,onChange:l=>w(a=>({...a,model:l})),disabled:j||!x?.installed||L.length===0,placeholder:d.noModel})]}),e.jsxs("div",{children:[e.jsx(P,{children:d.defaultEffort}),e.jsx(K,{value:i.effort,options:$,onChange:l=>w(a=>({...a,effort:l})),disabled:j||!x?.installed||$.length===0,placeholder:d.noEffort})]})]}),e.jsxs("div",{className:"mt-6 flex justify-end gap-2",children:[e.jsx(y,{variant:"ghost",onClick:()=>N(!1),children:o("modal.cancel")}),e.jsx(y,{variant:"primary",disabled:j||!x?.installed,onClick:()=>{de()},children:o(j?"config.validating":"modal.save")})]})]})]})}export{Ve as AgentTab,Ve as default};
@@ -1 +1 @@
1
- import{j as t}from"./react-vendor-DTcmqLiz.js";import{c as s}from"./index-Bbf__IXB.js";const o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAF+0lEQVRYha2XbXBUZxXHf+e5u4SkCZjg0NIWnQLJLgRF5UWnL75MP9gMjqPT2eyC0qlMiYxOUAR206LOyhiSTVscp52O0xamWgu7WTp0qLUz6kht6Qed1L7M5GUTsAoDTRSIJJos2b33+GFfWMJuNqmcT/c595z/+d3nOc+9zxXKWE9Li7tm0fjyqmT6H0t/Fp8sFz9XM+UCauouH8Rx+ifmWWdP7Q0sLRbT98g3lySC/mcSQd+GGwrQt2vzx1G2ZEa6KJ3S1mJxlpOKIDyEmEM3FGCk5vw5YCw3FmFbb9hXfV2gcm/26vINBfhS+LU0qgcKXB9xT1hbr6kdDhtgcYaDxHSNwVBg92Ao0DMY8n97zgAAZnK8U2AoX1D0++rzWfkC44k6wAVghP7C3EQo8Iiijyq61oEDiV2bPjojwKk234pEsPnh/lDgzpyv/olXrwi6qyDsjsQy2ZQXmJdefPWWvp0v3uZ/CLQ9NxZINpxJj84IYDvmOUT2G/T1DD0CUB/pflnhd1eT5Mcnwl90Adi23JzPl9TbAEN7fF9AeapQW5AOicftGQFEOJ+9tEDbB9v8x99r21wLYBlnJ5AGUKhfklz8QEbY3J71nVnZceziUPAbtzvGxAB3wdPH6yPRx6cXvw4gbbm/B5zIO5SvVKjdMxAMrKvviPcpHMyLqvyoN+ybh7AUwIi+M9TaVOGI/SJwc4Fsf6rS2SqgxQBkukPDYTM40RdCZB/Z5gKmEGmzjStq2alBoDqbvF2hEWgF9oEuAvlugdx/Deaz9ZEjvcWKFwXIWaLNv14cDqmwugDvFRVOi8qOrOMdhT6BzQhvoNxzjbjItxo6o8+VqjEjAMBQa1OFXbXwh4KGuLqmDleXToHzwG1FpLs9kah/uvf98IPz08nkSuZbp+vDL4zNCJAHaQt82lH9JfCJ2cQrTFjq8hiZGrfVtQGcDQhrFNYAywELuFw15SwRgN6dvrrahcnkreGXJ0pCtDZVOFULwsCerEBJExhVGAY8FH/Z2cBvPJHY1ySx13cbaXMaqACSwCVRLqlhVNBRVTOm4lxCOSdqPkB0FdA2m5kosGGEHpC3UP2z6uRJb9fx8SwsJEL+nwBNwEKgWqBSoXaORQqtH+VNhDdErJMNnYf/ViqwbBNO3lRbVZFSS9yyIG1jucRuVuGnM6TZZL4d/wS9KEgawIH/gF5EzAWBvzecto9KPG7PqgkBTu0NLHVs7VBlcxnwS8ALgtyp6Kco3S9/OF850lQWYCD41RpMZUiUH5BZmgkRDqmyVaCqeJYeS1dqwJq4UoG56S5w7hb4PMp6YH426LJR1+qSAOrzWYPLZCvIPuAWAIHXxGGXY3geWAV6DOTrJRR+r5q8P9dskNtJ1etBVl4R19FPdh4eLQowEPR5RKxfgebOeGMqGvLMX/V0YrK/W+B+4ATCYZRnEJ5E+Q5gFM4AFwQ+I8hbLks2Ltt/ZKTUg163Rwfamrcj5q/54spvLZes9nZ2/yIx0b8jW/wCLmeLOLoCAEdeAjmYnaWPGXga9Jiia1O28+bAbt8dswJQEFF5IrO2chGVBzxdsY0r2qNnBx5uvkuELkAFedDTHj+nIl4AIzJsjL2XTAOisB+XtqryKLBcLHNyKLSpsSyAgKrKJoRtbksaPV3R5yFz7BaHOOBGOdAQib6SRV4L4KQZqe+I/wvYmZWqE1ue8nbFggjbgDoH/VOxY3vZXdDT0uKuqR37I+jdIH9JV9r3NIbjU717fLe4jPkASDVEYhW5730i2PwqIvdlZkK3eCPdv06E/GuAbmCBJxJbUnIGill13b8fyxRnRG070BiOTwG4MeuyszBSeNiw3KZFYDTzdPLzU7u3LPZEYu+qTq5Tlev+K2YESAQD94rKjqzgl72Pxd/P3VNLsgAyXJizoj161kG3Z4d1aZP6HIC36/i4tyt6dE4AasQNDIhxNnoisXevvZndJcLw9DxvpLsb5XGE9yzD2ZlqzPpVPN0SIf854FaUZz1dsW0fVqdsD5Q05Qhgg7z+oTX+Xyv2pzNX+x+eTlGviPgh3AAAAABJRU5ErkJggg==",g="/assets/codex-DYadqqp0.png",r="/assets/feishu-C4OMrjCW.ico",a="/assets/gemini-BYkEpiWr.svg",n="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='16px'%20height='16px'%20viewBox='0%200%2016%2016'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3cdefs%3e%3clinearGradient%20x1='50%25'%20y1='0%25'%20x2='50%25'%20y2='100%25'%20id='linearGradient-1'%3e%3cstop%20stop-color='%2338AEEB'%20offset='0%25'%3e%3c/stop%3e%3cstop%20stop-color='%23279AD1'%20offset='100%25'%3e%3c/stop%3e%3c/linearGradient%3e%3c/defs%3e%3cg%20id='Artboard'%20stroke='none'%20stroke-width='1'%20fill='none'%20fill-rule='evenodd'%3e%3ccircle%20id='Oval'%20fill='url(%23linearGradient-1)'%20cx='8'%20cy='8'%20r='8'%3e%3c/circle%3e%3cpath%20d='M3.17026167,7.83635602%20C5.78750201,6.74265999%207.53273882,6.02162863%208.40597211,5.67326193%20C10.8992306,4.67860423%2011.2454541,4.53439191%2011.5831299,4.52864956%20C11.6573986,4.52743168%2011.8385417,4.55776042%2011.9798438,4.67645833%20C12.1211458,4.79515625%2012.1635786,4.87206678%2012.1755371,4.93908691%20C12.1874957,5.00610705%2012.1862759,5.21456762%2012.1744385,5.3338623%20C12.0393279,6.69547283%2011.5259342,9.83829771%2011.2285121,11.3633248%20C11.1026617,12.008621%2010.8548582,12.2249854%2010.6149558,12.2461596%20C10.0935924,12.2921758%209.69769267,11.9156852%209.19272668,11.5981993%20C8.40255458,11.1013965%208.13911734,10.9180161%207.3721185,10.4332283%20C6.48571864,9.87297217%206.85080034,9.6784879%207.35595703,9.17524981%20C7.48815894,9.04355001%209.67825076,7.04590073%209.71077046,6.86250183%20C9.7391276,6.70257812%209.7494847,6.68189389%209.67664063,6.60973958%20C9.60379655,6.53758527%209.51674192,6.54658941%209.46083149,6.55876051%20C9.38158015,6.57601267%208.17521836,7.33962686%205.84174612,8.84960308%20C5.48344358,9.08558775%205.15890428,9.20056741%204.86812819,9.19454205%20C4.54757089,9.18789957%203.93094724,9.02070014%203.47255094,8.87778221%20C2.91030922,8.70248755%202.46345069,8.609808%202.50236203,8.31210343%20C2.52262946,8.15704047%202.74526267,7.998458%203.17026167,7.83635602%20Z'%20id='Path-3'%20fill='%23FFFFFF'%3e%3c/path%3e%3c/g%3e%3c/svg%3e",d="data:image/svg+xml,%3csvg%20width='128'%20height='128'%20viewBox='0%200%20128%20128'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='128'%20height='128'%20rx='28'%20fill='%2307C160'/%3e%3cpath%20d='M42%2033c-16.569%200-30%2011.64-30%2026%200%208.084%204.283%2015.306%2011.008%2020.073L18%2095l20.832-8.102A37.33%2037.33%200%200%200%2042%2087c16.569%200%2030-11.64%2030-26S58.569%2033%2042%2033Z'%20fill='%23fff'/%3e%3cpath%20d='M85%2048c-13.807%200-25%209.402-25%2021%200%2011.598%2011.193%2021%2025%2021%202.545%200%205-.319%207.29-.91L109%2095l-4.772-12.27C109.078%2079.05%20112%2074.232%20112%2069c0-11.598-12.193-21-27-21Z'%20fill='%23fff'%20opacity='.95'/%3e%3ccircle%20cx='33'%20cy='56'%20r='4.5'%20fill='%2307C160'/%3e%3ccircle%20cx='50'%20cy='56'%20r='4.5'%20fill='%2307C160'/%3e%3ccircle%20cx='77'%20cy='66'%20r='4'%20fill='%2307C160'/%3e%3ccircle%20cx='92'%20cy='66'%20r='4'%20fill='%2307C160'/%3e%3c/svg%3e",w="/assets/playwright-BldPFZgC.ico",h="/assets/appium-Ra-JU1qL.png",x="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3e%3cpath%20d='M23.15%202.587L18.21.21a1.494%201.494%200%200%200-1.705.29l-9.46%208.63-4.12-3.128a.999.999%200%200%200-1.276.057L.327%207.261A1%201%200%200%200%20.326%208.74L3.899%2012%20.326%2015.26a1%201%200%200%200%20.001%201.479L1.65%2017.94a.999.999%200%200%200%201.276.057l4.12-3.128%209.46%208.63a1.492%201.492%200%200%200%201.704.29l4.942-2.377A1.5%201.5%200%200%200%2024%2020.06V3.939a1.5%201.5%200%200%200-.85-1.352zm-5.146%2014.861L10.826%2012l7.178-5.448v10.896z'%20fill='%23007ACC'/%3e%3c/svg%3e",f="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3e%3crect%20width='24'%20height='24'%20rx='5.5'%20fill='%2319191C'/%3e%3cpath%20d='M7%205l10%207-4.5%201.5L15.5%2019l-2.2.8-3-5.5L7%2017z'%20fill='%23fff'/%3e%3c/svg%3e",A="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3e%3crect%20width='24'%20height='24'%20rx='5.5'%20fill='%230BA48A'/%3e%3cpath%20d='M8%2018l2-12h2.5l-1.2%205h4.2L10%2018H8zm3.5-3.5l3-7.5'%20fill='%23fff'%20fill-rule='evenodd'/%3e%3c/svg%3e",v="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3e%3crect%20width='24'%20height='24'%20rx='5.5'%20fill='%234A90D9'/%3e%3crect%20x='5'%20y='5'%20width='14'%20height='12'%20rx='1.5'%20fill='%236DB3F2'/%3e%3crect%20x='5'%20y='5'%20width='14'%20height='3.5'%20rx='1.5'%20fill='%233D7ABF'/%3e%3ccircle%20cx='8.5'%20cy='6.8'%20r='.8'%20fill='%23FF5F57'/%3e%3ccircle%20cx='11'%20cy='6.8'%20r='.8'%20fill='%23FEBC2E'/%3e%3ccircle%20cx='13.5'%20cy='6.8'%20r='.8'%20fill='%2328C840'/%3e%3crect%20x='7'%20y='10.5'%20width='10'%20height='1'%20rx='.5'%20fill='%23fff'%20opacity='.7'/%3e%3crect%20x='7'%20y='13'%20width='7'%20height='1'%20rx='.5'%20fill='%23fff'%20opacity='.5'/%3e%3c/svg%3e",L={claude:o,codex:g,gemini:a,telegram:n,feishu:r,weixin:d,playwright:w,appium:h,vscode:x,cursor:f,windsurf:A,finder:v};function C({brand:i,size:e=18,className:l}){const c=L[i];return c?t.jsx("img",{src:c,alt:"","aria-hidden":"true",draggable:!1,className:s("shrink-0 object-contain select-none",l),style:{width:e,height:e}}):null}export{C as B};
1
+ import{j as t}from"./react-vendor-DTcmqLiz.js";import{c as s}from"./index-BFtrf-rI.js";const o="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAF+0lEQVRYha2XbXBUZxXHf+e5u4SkCZjg0NIWnQLJLgRF5UWnL75MP9gMjqPT2eyC0qlMiYxOUAR206LOyhiSTVscp52O0xamWgu7WTp0qLUz6kht6Qed1L7M5GUTsAoDTRSIJJos2b33+GFfWMJuNqmcT/c595z/+d3nOc+9zxXKWE9Li7tm0fjyqmT6H0t/Fp8sFz9XM+UCauouH8Rx+ifmWWdP7Q0sLRbT98g3lySC/mcSQd+GGwrQt2vzx1G2ZEa6KJ3S1mJxlpOKIDyEmEM3FGCk5vw5YCw3FmFbb9hXfV2gcm/26vINBfhS+LU0qgcKXB9xT1hbr6kdDhtgcYaDxHSNwVBg92Ao0DMY8n97zgAAZnK8U2AoX1D0++rzWfkC44k6wAVghP7C3EQo8Iiijyq61oEDiV2bPjojwKk234pEsPnh/lDgzpyv/olXrwi6qyDsjsQy2ZQXmJdefPWWvp0v3uZ/CLQ9NxZINpxJj84IYDvmOUT2G/T1DD0CUB/pflnhd1eT5Mcnwl90Adi23JzPl9TbAEN7fF9AeapQW5AOicftGQFEOJ+9tEDbB9v8x99r21wLYBlnJ5AGUKhfklz8QEbY3J71nVnZceziUPAbtzvGxAB3wdPH6yPRx6cXvw4gbbm/B5zIO5SvVKjdMxAMrKvviPcpHMyLqvyoN+ybh7AUwIi+M9TaVOGI/SJwc4Fsf6rS2SqgxQBkukPDYTM40RdCZB/Z5gKmEGmzjStq2alBoDqbvF2hEWgF9oEuAvlugdx/Deaz9ZEjvcWKFwXIWaLNv14cDqmwugDvFRVOi8qOrOMdhT6BzQhvoNxzjbjItxo6o8+VqjEjAMBQa1OFXbXwh4KGuLqmDleXToHzwG1FpLs9kah/uvf98IPz08nkSuZbp+vDL4zNCJAHaQt82lH9JfCJ2cQrTFjq8hiZGrfVtQGcDQhrFNYAywELuFw15SwRgN6dvrrahcnkreGXJ0pCtDZVOFULwsCerEBJExhVGAY8FH/Z2cBvPJHY1ySx13cbaXMaqACSwCVRLqlhVNBRVTOm4lxCOSdqPkB0FdA2m5kosGGEHpC3UP2z6uRJb9fx8SwsJEL+nwBNwEKgWqBSoXaORQqtH+VNhDdErJMNnYf/ViqwbBNO3lRbVZFSS9yyIG1jucRuVuGnM6TZZL4d/wS9KEgawIH/gF5EzAWBvzecto9KPG7PqgkBTu0NLHVs7VBlcxnwS8ALgtyp6Kco3S9/OF850lQWYCD41RpMZUiUH5BZmgkRDqmyVaCqeJYeS1dqwJq4UoG56S5w7hb4PMp6YH426LJR1+qSAOrzWYPLZCvIPuAWAIHXxGGXY3geWAV6DOTrJRR+r5q8P9dskNtJ1etBVl4R19FPdh4eLQowEPR5RKxfgebOeGMqGvLMX/V0YrK/W+B+4ATCYZRnEJ5E+Q5gFM4AFwQ+I8hbLks2Ltt/ZKTUg163Rwfamrcj5q/54spvLZes9nZ2/yIx0b8jW/wCLmeLOLoCAEdeAjmYnaWPGXga9Jiia1O28+bAbt8dswJQEFF5IrO2chGVBzxdsY0r2qNnBx5uvkuELkAFedDTHj+nIl4AIzJsjL2XTAOisB+XtqryKLBcLHNyKLSpsSyAgKrKJoRtbksaPV3R5yFz7BaHOOBGOdAQib6SRV4L4KQZqe+I/wvYmZWqE1ue8nbFggjbgDoH/VOxY3vZXdDT0uKuqR37I+jdIH9JV9r3NIbjU717fLe4jPkASDVEYhW5730i2PwqIvdlZkK3eCPdv06E/GuAbmCBJxJbUnIGill13b8fyxRnRG070BiOTwG4MeuyszBSeNiw3KZFYDTzdPLzU7u3LPZEYu+qTq5Tlev+K2YESAQD94rKjqzgl72Pxd/P3VNLsgAyXJizoj161kG3Z4d1aZP6HIC36/i4tyt6dE4AasQNDIhxNnoisXevvZndJcLw9DxvpLsb5XGE9yzD2ZlqzPpVPN0SIf854FaUZz1dsW0fVqdsD5Q05Qhgg7z+oTX+Xyv2pzNX+x+eTlGviPgh3AAAAABJRU5ErkJggg==",g="/assets/codex-DYadqqp0.png",r="/assets/feishu-C4OMrjCW.ico",a="/assets/gemini-BYkEpiWr.svg",n="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='16px'%20height='16px'%20viewBox='0%200%2016%2016'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3cdefs%3e%3clinearGradient%20x1='50%25'%20y1='0%25'%20x2='50%25'%20y2='100%25'%20id='linearGradient-1'%3e%3cstop%20stop-color='%2338AEEB'%20offset='0%25'%3e%3c/stop%3e%3cstop%20stop-color='%23279AD1'%20offset='100%25'%3e%3c/stop%3e%3c/linearGradient%3e%3c/defs%3e%3cg%20id='Artboard'%20stroke='none'%20stroke-width='1'%20fill='none'%20fill-rule='evenodd'%3e%3ccircle%20id='Oval'%20fill='url(%23linearGradient-1)'%20cx='8'%20cy='8'%20r='8'%3e%3c/circle%3e%3cpath%20d='M3.17026167,7.83635602%20C5.78750201,6.74265999%207.53273882,6.02162863%208.40597211,5.67326193%20C10.8992306,4.67860423%2011.2454541,4.53439191%2011.5831299,4.52864956%20C11.6573986,4.52743168%2011.8385417,4.55776042%2011.9798438,4.67645833%20C12.1211458,4.79515625%2012.1635786,4.87206678%2012.1755371,4.93908691%20C12.1874957,5.00610705%2012.1862759,5.21456762%2012.1744385,5.3338623%20C12.0393279,6.69547283%2011.5259342,9.83829771%2011.2285121,11.3633248%20C11.1026617,12.008621%2010.8548582,12.2249854%2010.6149558,12.2461596%20C10.0935924,12.2921758%209.69769267,11.9156852%209.19272668,11.5981993%20C8.40255458,11.1013965%208.13911734,10.9180161%207.3721185,10.4332283%20C6.48571864,9.87297217%206.85080034,9.6784879%207.35595703,9.17524981%20C7.48815894,9.04355001%209.67825076,7.04590073%209.71077046,6.86250183%20C9.7391276,6.70257812%209.7494847,6.68189389%209.67664063,6.60973958%20C9.60379655,6.53758527%209.51674192,6.54658941%209.46083149,6.55876051%20C9.38158015,6.57601267%208.17521836,7.33962686%205.84174612,8.84960308%20C5.48344358,9.08558775%205.15890428,9.20056741%204.86812819,9.19454205%20C4.54757089,9.18789957%203.93094724,9.02070014%203.47255094,8.87778221%20C2.91030922,8.70248755%202.46345069,8.609808%202.50236203,8.31210343%20C2.52262946,8.15704047%202.74526267,7.998458%203.17026167,7.83635602%20Z'%20id='Path-3'%20fill='%23FFFFFF'%3e%3c/path%3e%3c/g%3e%3c/svg%3e",d="data:image/svg+xml,%3csvg%20width='128'%20height='128'%20viewBox='0%200%20128%20128'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='128'%20height='128'%20rx='28'%20fill='%2307C160'/%3e%3cpath%20d='M42%2033c-16.569%200-30%2011.64-30%2026%200%208.084%204.283%2015.306%2011.008%2020.073L18%2095l20.832-8.102A37.33%2037.33%200%200%200%2042%2087c16.569%200%2030-11.64%2030-26S58.569%2033%2042%2033Z'%20fill='%23fff'/%3e%3cpath%20d='M85%2048c-13.807%200-25%209.402-25%2021%200%2011.598%2011.193%2021%2025%2021%202.545%200%205-.319%207.29-.91L109%2095l-4.772-12.27C109.078%2079.05%20112%2074.232%20112%2069c0-11.598-12.193-21-27-21Z'%20fill='%23fff'%20opacity='.95'/%3e%3ccircle%20cx='33'%20cy='56'%20r='4.5'%20fill='%2307C160'/%3e%3ccircle%20cx='50'%20cy='56'%20r='4.5'%20fill='%2307C160'/%3e%3ccircle%20cx='77'%20cy='66'%20r='4'%20fill='%2307C160'/%3e%3ccircle%20cx='92'%20cy='66'%20r='4'%20fill='%2307C160'/%3e%3c/svg%3e",w="/assets/playwright-BldPFZgC.ico",h="/assets/appium-Ra-JU1qL.png",x="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3e%3cpath%20d='M23.15%202.587L18.21.21a1.494%201.494%200%200%200-1.705.29l-9.46%208.63-4.12-3.128a.999.999%200%200%200-1.276.057L.327%207.261A1%201%200%200%200%20.326%208.74L3.899%2012%20.326%2015.26a1%201%200%200%200%20.001%201.479L1.65%2017.94a.999.999%200%200%200%201.276.057l4.12-3.128%209.46%208.63a1.492%201.492%200%200%200%201.704.29l4.942-2.377A1.5%201.5%200%200%200%2024%2020.06V3.939a1.5%201.5%200%200%200-.85-1.352zm-5.146%2014.861L10.826%2012l7.178-5.448v10.896z'%20fill='%23007ACC'/%3e%3c/svg%3e",f="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3e%3crect%20width='24'%20height='24'%20rx='5.5'%20fill='%2319191C'/%3e%3cpath%20d='M7%205l10%207-4.5%201.5L15.5%2019l-2.2.8-3-5.5L7%2017z'%20fill='%23fff'/%3e%3c/svg%3e",A="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3e%3crect%20width='24'%20height='24'%20rx='5.5'%20fill='%230BA48A'/%3e%3cpath%20d='M8%2018l2-12h2.5l-1.2%205h4.2L10%2018H8zm3.5-3.5l3-7.5'%20fill='%23fff'%20fill-rule='evenodd'/%3e%3c/svg%3e",v="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3e%3crect%20width='24'%20height='24'%20rx='5.5'%20fill='%234A90D9'/%3e%3crect%20x='5'%20y='5'%20width='14'%20height='12'%20rx='1.5'%20fill='%236DB3F2'/%3e%3crect%20x='5'%20y='5'%20width='14'%20height='3.5'%20rx='1.5'%20fill='%233D7ABF'/%3e%3ccircle%20cx='8.5'%20cy='6.8'%20r='.8'%20fill='%23FF5F57'/%3e%3ccircle%20cx='11'%20cy='6.8'%20r='.8'%20fill='%23FEBC2E'/%3e%3ccircle%20cx='13.5'%20cy='6.8'%20r='.8'%20fill='%2328C840'/%3e%3crect%20x='7'%20y='10.5'%20width='10'%20height='1'%20rx='.5'%20fill='%23fff'%20opacity='.7'/%3e%3crect%20x='7'%20y='13'%20width='7'%20height='1'%20rx='.5'%20fill='%23fff'%20opacity='.5'/%3e%3c/svg%3e",L={claude:o,codex:g,gemini:a,telegram:n,feishu:r,weixin:d,playwright:w,appium:h,vscode:x,cursor:f,windsurf:A,finder:v};function C({brand:i,size:e=18,className:l}){const c=L[i];return c?t.jsx("img",{src:c,alt:"","aria-hidden":"true",draggable:!1,className:s("shrink-0 object-contain select-none",l),style:{width:e,height:e}}):null}export{C as B};
@@ -1 +1 @@
1
- import{r,j as e}from"./react-vendor-DTcmqLiz.js";import{a as I,d as P,S as z}from"./index-Bbf__IXB.js";function W({initialPath:x,maxHeight:j=420,minHeight:N=200,onSelect:p,compact:l,t:o}){const[y,k]=r.useState(""),[h,m]=r.useState(""),[g,w]=r.useState([]),[i,S]=r.useState(""),[C,$]=r.useState(!1),[D,B]=r.useState([]),[E,c]=r.useState(!1),[u,d]=r.useState(""),a=r.useCallback(async t=>{c(!0),d("");try{const s=await I.lsDir(t);if(!s.ok){d(s.error||o("modal.cannotRead")),c(!1);return}k(s.path),m(s.path),w(s.dirs),S(s.parent),$(s.isGit);const G=s.path.split("/").filter(Boolean);let v="";B(G.map(b=>(v+="/"+b,{label:b,path:v}))),p?.(s.path,s.isGit)}catch{d(o("modal.loadFailed"))}finally{c(!1)}},[o,p]);r.useEffect(()=>{x!==void 0&&a(x||void 0)},[]);const n=l?"text-[11px]":"text-xs",f=l?"py-[5px]":"py-[7px]";return e.jsxs("div",{children:[e.jsxs("div",{className:`flex items-center gap-1 ${l?"text-[10px]":"text-[11px]"} font-mono text-fg-4 mb-2 flex-wrap`,children:[e.jsx("span",{className:"cursor-pointer hover:text-fg-2 transition-colors",onClick:()=>a("/"),children:"~"}),D.map((t,s)=>e.jsxs("span",{children:[e.jsx("span",{className:"text-fg-6",children:"/"}),e.jsx("span",{className:"cursor-pointer hover:text-fg-2 transition-colors",onClick:()=>a(t.path),children:t.label})]},s)),C&&e.jsx(P,{variant:"accent",className:"ml-1 !text-[9px] !py-0 !px-1.5",children:"git"})]}),e.jsxs("div",{className:"relative",children:[!l&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"pointer-events-none absolute inset-x-0 top-0 z-10 h-5 rounded-t-lg",style:{background:"linear-gradient(to bottom, var(--th-panel-alt), rgba(0, 0, 0, 0))"}}),e.jsx("div",{className:"pointer-events-none absolute inset-x-0 bottom-0 z-10 h-5 rounded-b-lg",style:{background:"linear-gradient(to top, var(--th-panel-alt), rgba(0, 0, 0, 0))"}})]}),e.jsx("div",{className:"border border-edge rounded-lg overflow-y-auto overscroll-contain scroll-smooth bg-panel-alt",style:{maxHeight:j,minHeight:N,scrollbarGutter:"stable"},children:E?e.jsx("div",{className:`${n} text-fg-5 p-4 text-center flex items-center justify-center gap-2`,children:e.jsx(z,{className:"h-3 w-3 text-fg-5"})}):u?e.jsx("div",{className:`${n} text-red-500/70 p-4`,children:u}):e.jsxs(e.Fragment,{children:[i&&i!==y&&e.jsxs("div",{className:`flex items-center gap-2 px-3 ${f} cursor-pointer hover:bg-panel transition-colors border-b border-edge`,onClick:()=>a(i),children:[e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",className:"text-fg-5 shrink-0",children:e.jsx("polyline",{points:"15 18 9 12 15 6"})}),e.jsx("span",{className:`${n} text-fg-4`,children:".."})]}),g.length===0&&!i&&e.jsx("div",{className:`${n} text-fg-5 p-4 text-center`,children:o("modal.emptyDir")}),g.map(t=>e.jsxs("div",{className:`flex items-center gap-2 px-3 ${f} cursor-pointer hover:bg-panel transition-colors`,onClick:()=>a(t.path),children:[e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:t.name===".git"?"var(--th-primary)":"currentColor",strokeWidth:"1.8",className:"text-fg-5 shrink-0",children:e.jsx("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"})}),e.jsx("span",{className:`${n} text-fg-3`,children:t.name})]},t.path))]})})]}),e.jsx("div",{className:"mt-2",children:e.jsx("input",{className:`w-full rounded-lg border border-edge bg-inset px-2.5 py-1.5 ${n} font-mono text-fg outline-none placeholder:text-fg-5 focus:border-edge-h transition-colors`,placeholder:o("modal.manualInput"),value:h,onChange:t=>m(t.target.value),onKeyDown:t=>{t.key==="Enter"&&a(h)}})})]})}export{W as D};
1
+ import{r,j as e}from"./react-vendor-DTcmqLiz.js";import{a as I,d as P,S as z}from"./index-BFtrf-rI.js";function W({initialPath:x,maxHeight:j=420,minHeight:N=200,onSelect:p,compact:l,t:o}){const[y,k]=r.useState(""),[h,m]=r.useState(""),[g,w]=r.useState([]),[i,S]=r.useState(""),[C,$]=r.useState(!1),[D,B]=r.useState([]),[E,c]=r.useState(!1),[u,d]=r.useState(""),a=r.useCallback(async t=>{c(!0),d("");try{const s=await I.lsDir(t);if(!s.ok){d(s.error||o("modal.cannotRead")),c(!1);return}k(s.path),m(s.path),w(s.dirs),S(s.parent),$(s.isGit);const G=s.path.split("/").filter(Boolean);let v="";B(G.map(b=>(v+="/"+b,{label:b,path:v}))),p?.(s.path,s.isGit)}catch{d(o("modal.loadFailed"))}finally{c(!1)}},[o,p]);r.useEffect(()=>{x!==void 0&&a(x||void 0)},[]);const n=l?"text-[11px]":"text-xs",f=l?"py-[5px]":"py-[7px]";return e.jsxs("div",{children:[e.jsxs("div",{className:`flex items-center gap-1 ${l?"text-[10px]":"text-[11px]"} font-mono text-fg-4 mb-2 flex-wrap`,children:[e.jsx("span",{className:"cursor-pointer hover:text-fg-2 transition-colors",onClick:()=>a("/"),children:"~"}),D.map((t,s)=>e.jsxs("span",{children:[e.jsx("span",{className:"text-fg-6",children:"/"}),e.jsx("span",{className:"cursor-pointer hover:text-fg-2 transition-colors",onClick:()=>a(t.path),children:t.label})]},s)),C&&e.jsx(P,{variant:"accent",className:"ml-1 !text-[9px] !py-0 !px-1.5",children:"git"})]}),e.jsxs("div",{className:"relative",children:[!l&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"pointer-events-none absolute inset-x-0 top-0 z-10 h-5 rounded-t-lg",style:{background:"linear-gradient(to bottom, var(--th-panel-alt), rgba(0, 0, 0, 0))"}}),e.jsx("div",{className:"pointer-events-none absolute inset-x-0 bottom-0 z-10 h-5 rounded-b-lg",style:{background:"linear-gradient(to top, var(--th-panel-alt), rgba(0, 0, 0, 0))"}})]}),e.jsx("div",{className:"border border-edge rounded-lg overflow-y-auto overscroll-contain scroll-smooth bg-panel-alt",style:{maxHeight:j,minHeight:N,scrollbarGutter:"stable"},children:E?e.jsx("div",{className:`${n} text-fg-5 p-4 text-center flex items-center justify-center gap-2`,children:e.jsx(z,{className:"h-3 w-3 text-fg-5"})}):u?e.jsx("div",{className:`${n} text-red-500/70 p-4`,children:u}):e.jsxs(e.Fragment,{children:[i&&i!==y&&e.jsxs("div",{className:`flex items-center gap-2 px-3 ${f} cursor-pointer hover:bg-panel transition-colors border-b border-edge`,onClick:()=>a(i),children:[e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",className:"text-fg-5 shrink-0",children:e.jsx("polyline",{points:"15 18 9 12 15 6"})}),e.jsx("span",{className:`${n} text-fg-4`,children:".."})]}),g.length===0&&!i&&e.jsx("div",{className:`${n} text-fg-5 p-4 text-center`,children:o("modal.emptyDir")}),g.map(t=>e.jsxs("div",{className:`flex items-center gap-2 px-3 ${f} cursor-pointer hover:bg-panel transition-colors`,onClick:()=>a(t.path),children:[e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:t.name===".git"?"var(--th-primary)":"currentColor",strokeWidth:"1.8",className:"text-fg-5 shrink-0",children:e.jsx("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"})}),e.jsx("span",{className:`${n} text-fg-3`,children:t.name})]},t.path))]})})]}),e.jsx("div",{className:"mt-2",children:e.jsx("input",{className:`w-full rounded-lg border border-edge bg-inset px-2.5 py-1.5 ${n} font-mono text-fg outline-none placeholder:text-fg-5 focus:border-edge-h transition-colors`,placeholder:o("modal.manualInput"),value:h,onChange:t=>m(t.target.value),onKeyDown:t=>{t.key==="Enter"&&a(h)}})})]})}export{W as D};
@@ -1 +1 @@
1
- import{r as l,j as e}from"./react-vendor-DTcmqLiz.js";import{u as q,a as f,b as se,B as m,S as R,D as oe,d as te,c as de}from"./index-Bbf__IXB.js";import{B as le}from"./BrandIcon-BAXeIuGD.js";import{M as re,a as ce,I as $}from"./Modal-utaCOq7k.js";import{S as ie,a as G,b as Q,c as Y}from"./shared-BRvVjyDB.js";import"./router-emLofBBH.js";function n(c,o,t){return c==="zh-CN"?o:t}function me(c){if(c.type==="http"&&c.url)return c.url;const o=c.args||[],t=c.command||"";return t==="npx"&&o.length>=2?o.filter(p=>p!=="-y").join(" "):[t,...o].join(" ")}function xe(c,o){const[t,p]=l.useState(c);return l.useEffect(()=>{const r=setTimeout(()=>p(c),o);return()=>clearTimeout(r)},[c,o]),t}const K=()=>e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M12 22v-5"}),e.jsx("path",{d:"M9 8V2"}),e.jsx("path",{d:"M15 8V2"}),e.jsx("path",{d:"M18 8v5a6 6 0 0 1-12 0V8z"})]}),ae=()=>e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:e.jsx("polygon",{points:"13 2 3 14 12 14 11 22 21 10 12 10 13 2"})}),he=()=>e.jsxs("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",children:[e.jsx("circle",{cx:"11",cy:"11",r:"8"}),e.jsx("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"})]});function ue({open:c,onClose:o,locale:t,recommended:p,installedNames:r,scope:x,workdir:b,onAdded:w}){const v=q(a=>a.toast),[B,C]=l.useState(""),S=xe(B,300),[M,j]=l.useState([]),[L,d]=l.useState(!1),[u,E]=l.useState(!1),[g,T]=l.useState(null),[F,_]=l.useState({}),[U,P]=l.useState(!1),[A,V]=l.useState(""),[I,D]=l.useState(""),[H,k]=l.useState(""),[h,z]=l.useState({});l.useEffect(()=>{c&&(C(""),j([]),T(null),P(!1),V(""),D(""),k(""),z({}))},[c]),l.useEffect(()=>{if(!S.trim()){j([]);return}let a=!1;return d(!0),f.searchMcp(S.trim()).then(s=>{a||j(s.results||[])}).catch(()=>{a||j([])}).finally(()=>{a||d(!1)}),()=>{a=!0}},[S]);const N=l.useCallback(async(a,s)=>{E(!0);try{await f.addMcpExtension(a,s,x,b),v(n(t,`${a} 已添加`,`${a} added`),!0),w(),o()}catch(i){v(i?.message||"Failed",!1)}finally{E(!1)}},[x,b,t,v,w,o]),J=l.useCallback(a=>{const s=Object.keys(a.envSchema);if(s.length>0){T({name:a.id,command:a.command,args:a.args.join(" "),envSchema:a.envSchema}),_(Object.fromEntries(s.map(i=>[i,""])));return}N(a.id,{command:a.command,args:a.args,enabled:!0})},[N]),X=l.useCallback(a=>{const s=a.npmPackage||a.name;N(a.name.replace(/^@/,"").replace(/\//g,"-"),{command:"npx",args:["-y",s],enabled:!0})},[N]),ee=l.useCallback(()=>{if(!g)return;const a=Object.fromEntries(Object.entries(F).filter(([,i])=>i.trim())),s=g.args.trim()?g.args.trim().split(/\s+/):[];N(g.name,{command:g.command,args:s,env:Object.keys(a).length?a:void 0,enabled:!0})},[g,F,N]),O=l.useCallback(()=>{if(!A.trim()||!I.trim())return;const a=H.trim()?H.trim().split(/\s+/):[],s=Object.fromEntries(Object.entries(h).filter(([,i])=>i.trim()));N(A.trim(),{command:I.trim(),args:a,env:Object.keys(s).length?s:void 0,enabled:!0})},[A,I,H,h,N]),W=!!B.trim(),Z=W?null:p;return e.jsxs(re,{open:c,onClose:o,wide:!0,children:[e.jsx(ce,{title:n(t,"添加 MCP 服务","Add MCP Server"),description:x==="global"?n(t,"添加到全局配置,对所有工作区生效。","Added to global config, available across all workspaces."):n(t,"添加到当前工作区 .mcp.json 文件。","Added to the workspace .mcp.json file."),onClose:o}),g?e.jsxs("div",{className:"space-y-4 animate-in",children:[e.jsxs("div",{className:"flex items-center gap-2 rounded-lg border border-edge bg-panel-alt px-3 py-2",children:[e.jsx("div",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-md border border-edge bg-panel text-fg-3",children:e.jsx(K,{})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-[13px] font-semibold text-fg",children:g.name}),e.jsxs("div",{className:"mt-0.5 font-mono text-[11px] text-fg-5",children:[g.command," ",g.args]})]})]}),e.jsx("div",{className:"space-y-2",children:Object.entries(g.envSchema).map(([a,s])=>e.jsxs("div",{children:[e.jsxs("label",{className:"mb-1 flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:[a,s.required&&e.jsx("span",{className:"text-err",children:"*"})]}),e.jsx($,{value:F[a]||"",onChange:i=>_({...F,[a]:i.target.value}),type:s.secret?"password":"text",placeholder:s.description})]},a))}),e.jsxs("div",{className:"flex justify-end gap-2 border-t border-edge pt-3",children:[e.jsx(m,{variant:"ghost",onClick:()=>T(null),children:n(t,"返回","Back")}),e.jsx(m,{variant:"primary",disabled:u,onClick:ee,children:u?e.jsx(R,{}):n(t,"安装","Install")})]})]}):U?e.jsxs("div",{className:"space-y-3 animate-in",children:[e.jsxs("button",{className:"mb-1 flex items-center gap-1 text-[12px] text-fg-4 hover:text-fg-2 transition-colors",onClick:()=>P(!1),children:[e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:e.jsx("polyline",{points:"15 18 9 12 15 6"})}),n(t,"返回搜索","Back to search")]}),e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"名称","Name")}),e.jsx($,{value:A,onChange:a=>V(a.target.value),placeholder:"my-server"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"命令","Command")}),e.jsx($,{value:I,onChange:a=>D(a.target.value),placeholder:"npx",className:"font-mono"})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"参数","Arguments")}),e.jsx($,{value:H,onChange:a=>k(a.target.value),placeholder:"-y @example/server",className:"font-mono"})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-1.5 flex items-center justify-between",children:[e.jsx("span",{className:"text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"环境变量","Env")}),e.jsxs("button",{className:"text-[11px] font-medium text-primary hover:text-primary/80 transition-colors",onClick:()=>z({...h,NEW_KEY:""}),children:["+ ",n(t,"添加","Add")]})]}),Object.entries(h).length>0&&e.jsx("div",{className:"space-y-1 rounded-md border border-edge bg-inset/50 p-2",children:Object.entries(h).map(([a,s])=>e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx($,{className:"w-2/5 !h-7 !text-[12px] font-mono",value:a,onChange:i=>{const y={...h};delete y[a],y[i.target.value]=s,z(y)},placeholder:"KEY"}),e.jsx($,{className:"flex-1 !h-7 !text-[12px] font-mono",value:s,onChange:i=>z({...h,[a]:i.target.value}),type:a.toLowerCase().includes("token")||a.toLowerCase().includes("secret")||a.toLowerCase().includes("key")?"password":"text",placeholder:"value"}),e.jsx("button",{className:"shrink-0 rounded p-1 text-fg-5 transition-colors hover:bg-panel-h hover:text-err",onClick:()=>{const i={...h};delete i[a],z(i)},children:e.jsxs("svg",{width:"9",height:"9",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]},a))})]}),e.jsxs("div",{className:"flex justify-end gap-2 border-t border-edge pt-3",children:[e.jsx(m,{variant:"ghost",onClick:()=>P(!1),children:n(t,"取消","Cancel")}),e.jsx(m,{variant:"primary",disabled:!A.trim()||!I.trim()||u,onClick:O,children:u?e.jsx(R,{}):n(t,"添加","Add")})]})]}):e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"relative group",children:[e.jsx("div",{className:"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-fg-5/50 group-focus-within:text-fg-4 transition-colors",children:e.jsx(he,{})}),e.jsx("input",{value:B,onChange:a=>C(a.target.value),placeholder:n(t,"搜索 MCP 服务...","Search MCP servers..."),className:"w-full rounded-lg border border-edge bg-inset/50 py-2.5 pl-9 pr-3 text-[13px] text-fg outline-none placeholder:text-fg-5/40 focus:border-primary/30 focus:bg-inset focus:shadow-[0_0_0_3px_rgba(99,102,241,0.06)] transition-all duration-200",autoFocus:!0}),L&&e.jsx("div",{className:"absolute right-3 top-1/2 -translate-y-1/2",children:e.jsx(R,{className:"h-3.5 w-3.5"})})]}),e.jsx("div",{className:"max-h-[380px] overflow-y-auto space-y-1 -mx-1 px-1",children:W?M.length>0?M.map((a,s)=>{const i=a.name.replace(/^@/,"").replace(/\//g,"-"),y=r.has(i)||r.has(a.name);return e.jsxs("div",{className:"flex items-center gap-3 rounded-lg border border-edge/60 bg-panel-alt/40 px-3 py-2.5 transition-colors hover:border-edge hover:bg-panel-alt/70",children:[e.jsx("div",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-md border border-edge bg-panel text-fg-4",children:e.jsx(K,{})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-[13px] font-semibold text-fg",children:a.name}),a.description&&e.jsx("div",{className:"mt-0.5 text-[11px] leading-relaxed text-fg-4 line-clamp-2",children:a.description}),a.npmPackage&&a.npmPackage!==a.name&&e.jsx("div",{className:"mt-0.5 font-mono text-[10px] text-fg-5/60",children:a.npmPackage})]}),e.jsx(m,{variant:y?"ghost":"primary",size:"sm",disabled:y||u,onClick:()=>X(a),className:"shrink-0",children:y?n(t,"已安装","Installed"):u?e.jsx(R,{}):n(t,"安装","Install")})]},s)}):L?null:e.jsx("div",{className:"py-8 text-center text-[13px] text-fg-5",children:n(t,"未找到匹配的 MCP 服务","No matching MCP servers found")}):Z?.map(a=>{const s=r.has(a.id);return e.jsxs("div",{className:"flex items-center gap-3 rounded-lg border border-edge/60 bg-panel-alt/40 px-3 py-2.5 transition-colors hover:border-edge hover:bg-panel-alt/70",children:[e.jsx("div",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-md border border-edge bg-panel text-fg-4",children:e.jsx(K,{})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-[13px] font-semibold text-fg",children:a.name}),e.jsx("div",{className:"mt-0.5 text-[11px] leading-relaxed text-fg-4",children:t==="zh-CN"?a.descriptionZh:a.description})]}),e.jsx(m,{variant:s?"ghost":"primary",size:"sm",disabled:s||u,onClick:()=>J(a),className:"shrink-0",children:s?n(t,"已安装","Installed"):n(t,"安装","Install")})]},a.id)})}),e.jsx("div",{className:"border-t border-edge pt-3 text-center",children:e.jsx("button",{className:"text-[12px] text-fg-4 hover:text-fg-2 transition-colors",onClick:()=>P(!0),children:n(t,"手动配置自定义服务 →","Manually configure a custom server →")})})]})]})}function ge({open:c,onClose:o,locale:t,recommended:p,scope:r,workdir:x,onInstalled:b}){const w=q(d=>d.toast),[v,B]=l.useState(""),[C,S]=l.useState(""),[M,j]=l.useState(!1);l.useEffect(()=>{c&&(B(""),S(""))},[c]);const L=l.useCallback(async d=>{const u=(d||v).trim();if(u){j(!0);try{const E=await f.installSkill(u,r==="global",C.trim()||void 0,x);E.ok?(w(n(t,"技能安装成功","Skill installed"),!0),b(),o()):w(E.error||n(t,"安装失败","Installation failed"),!1)}catch(E){w(E?.message||"Failed",!1)}finally{j(!1)}}},[v,C,r,x,t,w,b,o]);return e.jsxs(re,{open:c,onClose:o,wide:!0,children:[e.jsx(ce,{title:n(t,"安装技能","Install Skill"),description:r==="global"?n(t,"使用 npx skills add 安装到 ~/.pikiclaw/skills/。","Uses npx skills add to install to ~/.pikiclaw/skills/."):n(t,"安装到当前工作区 .pikiclaw/skills/ 目录。","Installs to the workspace .pikiclaw/skills/ directory."),onClose:o}),p.length>0&&e.jsx("div",{className:"mb-4 space-y-2",children:p.map(d=>e.jsxs("div",{className:"flex items-center gap-3 rounded-lg border border-edge/60 bg-panel-alt/40 px-3 py-2.5 transition-colors hover:border-edge hover:bg-panel-alt/70",children:[e.jsx("div",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-md border border-edge bg-panel text-fg-4",children:e.jsx(ae,{})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-[13px] font-semibold text-fg",children:d.name}),e.jsx("div",{className:"mt-0.5 text-[11px] leading-relaxed text-fg-4",children:t==="zh-CN"?d.descriptionZh:d.description}),e.jsx("div",{className:"mt-0.5 font-mono text-[10px] text-fg-5/60",children:d.source})]}),e.jsx(m,{variant:"primary",size:"sm",disabled:M,onClick:()=>{L(d.source)},className:"shrink-0",children:M?e.jsx(R,{}):n(t,"安装","Install")})]},d.id))}),e.jsx("div",{className:de(p.length>0&&"border-t border-edge pt-4"),children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"GitHub 来源","GitHub Source")}),e.jsx($,{value:v,onChange:d=>B(d.target.value),placeholder:"owner/repo",className:"font-mono"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"指定技能(可选)","Specific skill (optional)")}),e.jsx($,{value:C,onChange:d=>S(d.target.value),placeholder:n(t,"留空安装全部","Leave empty for all")})]}),e.jsxs("div",{className:"flex items-center justify-between pt-1",children:[e.jsx("div",{className:"text-[11px] text-fg-5",children:n(t,"通过 npx skills add 安装","Installs via npx skills add")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(m,{variant:"ghost",onClick:o,children:n(t,"取消","Cancel")}),e.jsx(m,{variant:"primary",disabled:!v.trim()||M,onClick:()=>{L()},children:M?e.jsx(R,{}):n(t,"安装","Install")})]})]})]})})]})}function Ne({onOpenBrowserSetup:c,onOpenDesktopSetup:o}){const t=q(s=>s.locale),p=q(s=>s.state),r=q(s=>s.toast),x=p?.config?.workdir||"",[b,w]=l.useState([]),[v,B]=l.useState([]),[C,S]=l.useState(!0),[M,j]=l.useState(!1),[L,d]=l.useState(null),[u,E]=l.useState([]),[g,T]=l.useState([]),[F,_]=l.useState(!0),[U,P]=l.useState(!1),[A,V]=l.useState(null),I=l.useMemo(()=>b.filter(s=>s.scope==="global"),[b]),D=l.useMemo(()=>u.filter(s=>s.scope==="global"),[u]),H=l.useMemo(()=>new Set(b.map(s=>s.name)),[b]),k=l.useCallback(async()=>{S(!0);try{const[s,i]=await Promise.all([f.getMcpExtensions(x),f.getRecommendedMcp()]);w(s.extensions||[]),B(i.servers||[])}catch(s){r(s?.message||"Failed",!1)}finally{S(!1)}},[x,r]),h=l.useCallback(async()=>{_(!0);try{const[s,i]=await Promise.all([f.getExtensionSkills(x),f.getRecommendedSkills()]);E(s.skills||[]),T(i.repos||[])}catch(s){r(s?.message||"Failed",!1)}finally{_(!1)}},[x,r]),z=l.useCallback(async()=>{try{V(await f.getBrowser())}catch{}},[]);l.useEffect(()=>{k()},[k]),l.useEffect(()=>{h()},[h]),l.useEffect(()=>{z()},[z,p]);const N=l.useCallback(async s=>{try{await f.updateMcpExtension(s.name,{enabled:s.config.enabled===!1},"global"),await k()}catch(i){r(i?.message||"Failed",!1)}},[r,k]),J=l.useCallback(async s=>{try{await f.removeMcpExtension(s.name,"global"),r(n(t,`${s.name} 已移除`,`${s.name} removed`),!0),await k()}catch(i){r(i?.message||"Failed",!1)}},[t,r,k]),X=l.useCallback(async s=>{d(s.name);try{const i=await f.checkMcpHealth(s.config);if(i.ok){const y=i.tools?.length??0,ne=i.elapsedMs?` (${i.elapsedMs}ms)`:"";r(n(t,`${s.name} 健康 — ${y} 工具${ne}`,`${s.name} healthy — ${y} tools${ne}`),!0)}else r(`${s.name}: ${i.error}`,!1)}catch(i){r(i?.message||"Failed",!1)}finally{d(null)}},[t,r]),ee=l.useCallback(async s=>{try{const i=await f.removeExtensionSkill(s.name,!0,x);i.ok?(r(n(t,`${s.name} 已移除`,`${s.name} removed`),!0),await h()):r(i.error||"Failed",!1)}catch(i){r(i?.message||"Failed",!1)}},[x,t,r,h]),O=A?.browser,W=A?.desktop,Z=O?O.enabled?O.running?{label:n(t,"运行中","Running"),variant:"ok"}:O.status==="ready"?{label:n(t,"就绪","Ready"),variant:"ok"}:{label:n(t,"需配置","Needs setup"),variant:"warn"}:{label:n(t,"已关闭","Disabled"),variant:"muted"}:{label:"...",variant:"muted"},a=W?W.installed?W.running?{label:n(t,"运行中","Running"),variant:"ok"}:{label:n(t,"已安装","Installed"),variant:"accent"}:{label:n(t,"未安装","Not installed"),variant:"muted"}:{label:"...",variant:"muted"};return e.jsxs("div",{className:"animate-in space-y-6",children:[e.jsx("div",{className:"text-[13px] leading-relaxed text-fg-4",children:n(t,"管理全局 MCP 服务、技能和自动化能力。项目级扩展请在工作台中对应工作区配置。","Manage global MCP servers, skills, and automation. Configure project-level extensions in the Workbench.")}),e.jsxs("section",{children:[e.jsxs("div",{className:"mb-2.5 flex items-center justify-between",children:[e.jsxs(se,{children:["MCP Servers",!C&&e.jsxs("span",{className:"ml-1.5 text-fg-5 font-normal lowercase tracking-normal",children:["(",I.length,")"]})]}),e.jsxs(m,{variant:"outline",size:"sm",onClick:()=>j(!0),children:[e.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",className:"mr-1",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),n(t,"添加","Add")]})]}),C?e.jsx("div",{className:"flex items-center justify-center py-10",children:e.jsx(R,{})}):I.length===0?e.jsxs(ie,{className:"flex flex-col items-center justify-center py-8 text-center",children:[e.jsx("div",{className:"mb-2 flex h-10 w-10 items-center justify-center rounded-full border border-edge bg-panel-alt text-fg-5",children:e.jsx(K,{})}),e.jsx("div",{className:"text-[13px] text-fg-4",children:n(t,"暂无全局 MCP 服务","No global MCP servers")}),e.jsx("button",{className:"mt-2 text-[12px] text-primary hover:text-primary/80 transition-colors",onClick:()=>j(!0),children:n(t,"搜索并添加 →","Search and add →")})]}):e.jsx("div",{className:"space-y-1.5",children:I.map(s=>{const i=s.config.enabled===!1||s.config.disabled===!0;return e.jsxs(G,{className:i?"opacity-50":void 0,children:[e.jsx(Q,{icon:e.jsx(K,{}),title:s.name,subtitle:e.jsx("span",{className:"font-mono",children:me(s.config)}),badge:e.jsx(oe,{variant:i?"idle":"ok"})}),e.jsx("div",{className:"min-w-0 xl:col-span-2"}),e.jsx(Y,{children:e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(m,{variant:"ghost",size:"sm",onClick:()=>{X(s)},disabled:L===s.name,children:L===s.name?e.jsx(R,{}):n(t,"检查","Check")}),e.jsx(m,{variant:"ghost",size:"sm",onClick:()=>{N(s)},children:i?n(t,"启用","Enable"):n(t,"禁用","Disable")}),e.jsx(m,{variant:"ghost",size:"sm",onClick:()=>{J(s)},className:"hover:!text-err",children:n(t,"移除","Remove")})]})})]},s.name)})})]}),e.jsxs("section",{children:[e.jsxs("div",{className:"mb-2.5 flex items-center justify-between",children:[e.jsxs(se,{children:["Skills",!F&&e.jsxs("span",{className:"ml-1.5 text-fg-5 font-normal lowercase tracking-normal",children:["(",D.length,")"]})]}),e.jsxs(m,{variant:"outline",size:"sm",onClick:()=>P(!0),children:[e.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",className:"mr-1",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),n(t,"安装","Install")]})]}),F?e.jsx("div",{className:"flex items-center justify-center py-10",children:e.jsx(R,{})}):D.length===0?e.jsxs(ie,{className:"flex flex-col items-center justify-center py-8 text-center",children:[e.jsx("div",{className:"mb-2 flex h-10 w-10 items-center justify-center rounded-full border border-edge bg-panel-alt text-fg-5",children:e.jsx(ae,{})}),e.jsx("div",{className:"text-[13px] text-fg-4",children:n(t,"暂无全局技能","No global skills")}),e.jsx("button",{className:"mt-2 text-[12px] text-primary hover:text-primary/80 transition-colors",onClick:()=>P(!0),children:n(t,"安装技能 →","Install skills →")})]}):e.jsx("div",{className:"space-y-1.5",children:D.map(s=>e.jsxs(G,{children:[e.jsx(Q,{icon:e.jsx(ae,{}),title:s.label||s.name,subtitle:s.description||void 0,badge:s.mcpRequires?.length?e.jsxs(te,{variant:"muted",children:["MCP: ",s.mcpRequires.join(", ")]}):void 0}),e.jsx("div",{className:"min-w-0 xl:col-span-2"}),e.jsx(Y,{children:e.jsx(m,{variant:"ghost",size:"sm",onClick:()=>{ee(s)},className:"hover:!text-err",children:n(t,"移除","Remove")})})]},s.name))})]}),e.jsxs("section",{children:[e.jsx("div",{className:"mb-2.5",children:e.jsx(se,{children:n(t,"内置自动化","Built-in Automation")})}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs(G,{children:[e.jsx(Q,{icon:e.jsx(le,{brand:"playwright",size:14}),title:n(t,"浏览器自动化","Browser Automation"),badge:e.jsx(te,{variant:Z.variant,children:Z.label})}),e.jsx("div",{className:"min-w-0 xl:col-span-2"}),e.jsx(Y,{children:e.jsx(m,{variant:"outline",size:"sm",onClick:c,children:O?.enabled?n(t,"管理","Manage"):n(t,"配置","Setup")})})]}),e.jsxs(G,{children:[e.jsx(Q,{icon:e.jsx(le,{brand:"appium",size:14}),title:n(t,"桌面自动化","Desktop Automation"),badge:e.jsx(te,{variant:a.variant,children:a.label})}),e.jsx("div",{className:"min-w-0 xl:col-span-2"}),e.jsx(Y,{children:e.jsx(m,{variant:"outline",size:"sm",onClick:o,children:W?.running?n(t,"管理","Manage"):n(t,"配置","Setup")})})]})]})]}),e.jsx(ue,{open:M,onClose:()=>j(!1),locale:t,recommended:v,installedNames:H,scope:"global",onAdded:k}),e.jsx(ge,{open:U,onClose:()=>P(!1),locale:t,recommended:g,scope:"global",workdir:x,onInstalled:h})]})}export{ue as AddMcpModal,Ne as ExtensionsTab,ge as InstallSkillModal};
1
+ import{r as l,j as e}from"./react-vendor-DTcmqLiz.js";import{u as q,a as f,b as se,B as m,S as R,D as oe,d as te,c as de}from"./index-BFtrf-rI.js";import{B as le}from"./BrandIcon-DHNapeU6.js";import{M as re,a as ce,I as $}from"./Modal-CQ3_xUJW.js";import{S as ie,a as G,b as Q,c as Y}from"./shared-CHbIVrko.js";import"./router-emLofBBH.js";function n(c,o,t){return c==="zh-CN"?o:t}function me(c){if(c.type==="http"&&c.url)return c.url;const o=c.args||[],t=c.command||"";return t==="npx"&&o.length>=2?o.filter(p=>p!=="-y").join(" "):[t,...o].join(" ")}function xe(c,o){const[t,p]=l.useState(c);return l.useEffect(()=>{const r=setTimeout(()=>p(c),o);return()=>clearTimeout(r)},[c,o]),t}const K=()=>e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("path",{d:"M12 22v-5"}),e.jsx("path",{d:"M9 8V2"}),e.jsx("path",{d:"M15 8V2"}),e.jsx("path",{d:"M18 8v5a6 6 0 0 1-12 0V8z"})]}),ae=()=>e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:e.jsx("polygon",{points:"13 2 3 14 12 14 11 22 21 10 12 10 13 2"})}),he=()=>e.jsxs("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",children:[e.jsx("circle",{cx:"11",cy:"11",r:"8"}),e.jsx("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"})]});function ue({open:c,onClose:o,locale:t,recommended:p,installedNames:r,scope:x,workdir:b,onAdded:w}){const v=q(a=>a.toast),[B,C]=l.useState(""),S=xe(B,300),[M,j]=l.useState([]),[L,d]=l.useState(!1),[u,E]=l.useState(!1),[g,T]=l.useState(null),[F,_]=l.useState({}),[U,P]=l.useState(!1),[A,V]=l.useState(""),[I,D]=l.useState(""),[H,k]=l.useState(""),[h,z]=l.useState({});l.useEffect(()=>{c&&(C(""),j([]),T(null),P(!1),V(""),D(""),k(""),z({}))},[c]),l.useEffect(()=>{if(!S.trim()){j([]);return}let a=!1;return d(!0),f.searchMcp(S.trim()).then(s=>{a||j(s.results||[])}).catch(()=>{a||j([])}).finally(()=>{a||d(!1)}),()=>{a=!0}},[S]);const N=l.useCallback(async(a,s)=>{E(!0);try{await f.addMcpExtension(a,s,x,b),v(n(t,`${a} 已添加`,`${a} added`),!0),w(),o()}catch(i){v(i?.message||"Failed",!1)}finally{E(!1)}},[x,b,t,v,w,o]),J=l.useCallback(a=>{const s=Object.keys(a.envSchema);if(s.length>0){T({name:a.id,command:a.command,args:a.args.join(" "),envSchema:a.envSchema}),_(Object.fromEntries(s.map(i=>[i,""])));return}N(a.id,{command:a.command,args:a.args,enabled:!0})},[N]),X=l.useCallback(a=>{const s=a.npmPackage||a.name;N(a.name.replace(/^@/,"").replace(/\//g,"-"),{command:"npx",args:["-y",s],enabled:!0})},[N]),ee=l.useCallback(()=>{if(!g)return;const a=Object.fromEntries(Object.entries(F).filter(([,i])=>i.trim())),s=g.args.trim()?g.args.trim().split(/\s+/):[];N(g.name,{command:g.command,args:s,env:Object.keys(a).length?a:void 0,enabled:!0})},[g,F,N]),O=l.useCallback(()=>{if(!A.trim()||!I.trim())return;const a=H.trim()?H.trim().split(/\s+/):[],s=Object.fromEntries(Object.entries(h).filter(([,i])=>i.trim()));N(A.trim(),{command:I.trim(),args:a,env:Object.keys(s).length?s:void 0,enabled:!0})},[A,I,H,h,N]),W=!!B.trim(),Z=W?null:p;return e.jsxs(re,{open:c,onClose:o,wide:!0,children:[e.jsx(ce,{title:n(t,"添加 MCP 服务","Add MCP Server"),description:x==="global"?n(t,"添加到全局配置,对所有工作区生效。","Added to global config, available across all workspaces."):n(t,"添加到当前工作区 .mcp.json 文件。","Added to the workspace .mcp.json file."),onClose:o}),g?e.jsxs("div",{className:"space-y-4 animate-in",children:[e.jsxs("div",{className:"flex items-center gap-2 rounded-lg border border-edge bg-panel-alt px-3 py-2",children:[e.jsx("div",{className:"flex h-7 w-7 shrink-0 items-center justify-center rounded-md border border-edge bg-panel text-fg-3",children:e.jsx(K,{})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-[13px] font-semibold text-fg",children:g.name}),e.jsxs("div",{className:"mt-0.5 font-mono text-[11px] text-fg-5",children:[g.command," ",g.args]})]})]}),e.jsx("div",{className:"space-y-2",children:Object.entries(g.envSchema).map(([a,s])=>e.jsxs("div",{children:[e.jsxs("label",{className:"mb-1 flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:[a,s.required&&e.jsx("span",{className:"text-err",children:"*"})]}),e.jsx($,{value:F[a]||"",onChange:i=>_({...F,[a]:i.target.value}),type:s.secret?"password":"text",placeholder:s.description})]},a))}),e.jsxs("div",{className:"flex justify-end gap-2 border-t border-edge pt-3",children:[e.jsx(m,{variant:"ghost",onClick:()=>T(null),children:n(t,"返回","Back")}),e.jsx(m,{variant:"primary",disabled:u,onClick:ee,children:u?e.jsx(R,{}):n(t,"安装","Install")})]})]}):U?e.jsxs("div",{className:"space-y-3 animate-in",children:[e.jsxs("button",{className:"mb-1 flex items-center gap-1 text-[12px] text-fg-4 hover:text-fg-2 transition-colors",onClick:()=>P(!1),children:[e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:e.jsx("polyline",{points:"15 18 9 12 15 6"})}),n(t,"返回搜索","Back to search")]}),e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"名称","Name")}),e.jsx($,{value:A,onChange:a=>V(a.target.value),placeholder:"my-server"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"命令","Command")}),e.jsx($,{value:I,onChange:a=>D(a.target.value),placeholder:"npx",className:"font-mono"})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"参数","Arguments")}),e.jsx($,{value:H,onChange:a=>k(a.target.value),placeholder:"-y @example/server",className:"font-mono"})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-1.5 flex items-center justify-between",children:[e.jsx("span",{className:"text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"环境变量","Env")}),e.jsxs("button",{className:"text-[11px] font-medium text-primary hover:text-primary/80 transition-colors",onClick:()=>z({...h,NEW_KEY:""}),children:["+ ",n(t,"添加","Add")]})]}),Object.entries(h).length>0&&e.jsx("div",{className:"space-y-1 rounded-md border border-edge bg-inset/50 p-2",children:Object.entries(h).map(([a,s])=>e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx($,{className:"w-2/5 !h-7 !text-[12px] font-mono",value:a,onChange:i=>{const y={...h};delete y[a],y[i.target.value]=s,z(y)},placeholder:"KEY"}),e.jsx($,{className:"flex-1 !h-7 !text-[12px] font-mono",value:s,onChange:i=>z({...h,[a]:i.target.value}),type:a.toLowerCase().includes("token")||a.toLowerCase().includes("secret")||a.toLowerCase().includes("key")?"password":"text",placeholder:"value"}),e.jsx("button",{className:"shrink-0 rounded p-1 text-fg-5 transition-colors hover:bg-panel-h hover:text-err",onClick:()=>{const i={...h};delete i[a],z(i)},children:e.jsxs("svg",{width:"9",height:"9",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]},a))})]}),e.jsxs("div",{className:"flex justify-end gap-2 border-t border-edge pt-3",children:[e.jsx(m,{variant:"ghost",onClick:()=>P(!1),children:n(t,"取消","Cancel")}),e.jsx(m,{variant:"primary",disabled:!A.trim()||!I.trim()||u,onClick:O,children:u?e.jsx(R,{}):n(t,"添加","Add")})]})]}):e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"relative group",children:[e.jsx("div",{className:"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-fg-5/50 group-focus-within:text-fg-4 transition-colors",children:e.jsx(he,{})}),e.jsx("input",{value:B,onChange:a=>C(a.target.value),placeholder:n(t,"搜索 MCP 服务...","Search MCP servers..."),className:"w-full rounded-lg border border-edge bg-inset/50 py-2.5 pl-9 pr-3 text-[13px] text-fg outline-none placeholder:text-fg-5/40 focus:border-primary/30 focus:bg-inset focus:shadow-[0_0_0_3px_rgba(99,102,241,0.06)] transition-all duration-200",autoFocus:!0}),L&&e.jsx("div",{className:"absolute right-3 top-1/2 -translate-y-1/2",children:e.jsx(R,{className:"h-3.5 w-3.5"})})]}),e.jsx("div",{className:"max-h-[380px] overflow-y-auto space-y-1 -mx-1 px-1",children:W?M.length>0?M.map((a,s)=>{const i=a.name.replace(/^@/,"").replace(/\//g,"-"),y=r.has(i)||r.has(a.name);return e.jsxs("div",{className:"flex items-center gap-3 rounded-lg border border-edge/60 bg-panel-alt/40 px-3 py-2.5 transition-colors hover:border-edge hover:bg-panel-alt/70",children:[e.jsx("div",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-md border border-edge bg-panel text-fg-4",children:e.jsx(K,{})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-[13px] font-semibold text-fg",children:a.name}),a.description&&e.jsx("div",{className:"mt-0.5 text-[11px] leading-relaxed text-fg-4 line-clamp-2",children:a.description}),a.npmPackage&&a.npmPackage!==a.name&&e.jsx("div",{className:"mt-0.5 font-mono text-[10px] text-fg-5/60",children:a.npmPackage})]}),e.jsx(m,{variant:y?"ghost":"primary",size:"sm",disabled:y||u,onClick:()=>X(a),className:"shrink-0",children:y?n(t,"已安装","Installed"):u?e.jsx(R,{}):n(t,"安装","Install")})]},s)}):L?null:e.jsx("div",{className:"py-8 text-center text-[13px] text-fg-5",children:n(t,"未找到匹配的 MCP 服务","No matching MCP servers found")}):Z?.map(a=>{const s=r.has(a.id);return e.jsxs("div",{className:"flex items-center gap-3 rounded-lg border border-edge/60 bg-panel-alt/40 px-3 py-2.5 transition-colors hover:border-edge hover:bg-panel-alt/70",children:[e.jsx("div",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-md border border-edge bg-panel text-fg-4",children:e.jsx(K,{})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-[13px] font-semibold text-fg",children:a.name}),e.jsx("div",{className:"mt-0.5 text-[11px] leading-relaxed text-fg-4",children:t==="zh-CN"?a.descriptionZh:a.description})]}),e.jsx(m,{variant:s?"ghost":"primary",size:"sm",disabled:s||u,onClick:()=>J(a),className:"shrink-0",children:s?n(t,"已安装","Installed"):n(t,"安装","Install")})]},a.id)})}),e.jsx("div",{className:"border-t border-edge pt-3 text-center",children:e.jsx("button",{className:"text-[12px] text-fg-4 hover:text-fg-2 transition-colors",onClick:()=>P(!0),children:n(t,"手动配置自定义服务 →","Manually configure a custom server →")})})]})]})}function ge({open:c,onClose:o,locale:t,recommended:p,scope:r,workdir:x,onInstalled:b}){const w=q(d=>d.toast),[v,B]=l.useState(""),[C,S]=l.useState(""),[M,j]=l.useState(!1);l.useEffect(()=>{c&&(B(""),S(""))},[c]);const L=l.useCallback(async d=>{const u=(d||v).trim();if(u){j(!0);try{const E=await f.installSkill(u,r==="global",C.trim()||void 0,x);E.ok?(w(n(t,"技能安装成功","Skill installed"),!0),b(),o()):w(E.error||n(t,"安装失败","Installation failed"),!1)}catch(E){w(E?.message||"Failed",!1)}finally{j(!1)}}},[v,C,r,x,t,w,b,o]);return e.jsxs(re,{open:c,onClose:o,wide:!0,children:[e.jsx(ce,{title:n(t,"安装技能","Install Skill"),description:r==="global"?n(t,"使用 npx skills add 安装到 ~/.pikiclaw/skills/。","Uses npx skills add to install to ~/.pikiclaw/skills/."):n(t,"安装到当前工作区 .pikiclaw/skills/ 目录。","Installs to the workspace .pikiclaw/skills/ directory."),onClose:o}),p.length>0&&e.jsx("div",{className:"mb-4 space-y-2",children:p.map(d=>e.jsxs("div",{className:"flex items-center gap-3 rounded-lg border border-edge/60 bg-panel-alt/40 px-3 py-2.5 transition-colors hover:border-edge hover:bg-panel-alt/70",children:[e.jsx("div",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-md border border-edge bg-panel text-fg-4",children:e.jsx(ae,{})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-[13px] font-semibold text-fg",children:d.name}),e.jsx("div",{className:"mt-0.5 text-[11px] leading-relaxed text-fg-4",children:t==="zh-CN"?d.descriptionZh:d.description}),e.jsx("div",{className:"mt-0.5 font-mono text-[10px] text-fg-5/60",children:d.source})]}),e.jsx(m,{variant:"primary",size:"sm",disabled:M,onClick:()=>{L(d.source)},className:"shrink-0",children:M?e.jsx(R,{}):n(t,"安装","Install")})]},d.id))}),e.jsx("div",{className:de(p.length>0&&"border-t border-edge pt-4"),children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"GitHub 来源","GitHub Source")}),e.jsx($,{value:v,onChange:d=>B(d.target.value),placeholder:"owner/repo",className:"font-mono"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"mb-1.5 block text-[11px] font-semibold uppercase tracking-[0.16em] text-fg-5",children:n(t,"指定技能(可选)","Specific skill (optional)")}),e.jsx($,{value:C,onChange:d=>S(d.target.value),placeholder:n(t,"留空安装全部","Leave empty for all")})]}),e.jsxs("div",{className:"flex items-center justify-between pt-1",children:[e.jsx("div",{className:"text-[11px] text-fg-5",children:n(t,"通过 npx skills add 安装","Installs via npx skills add")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(m,{variant:"ghost",onClick:o,children:n(t,"取消","Cancel")}),e.jsx(m,{variant:"primary",disabled:!v.trim()||M,onClick:()=>{L()},children:M?e.jsx(R,{}):n(t,"安装","Install")})]})]})]})})]})}function Ne({onOpenBrowserSetup:c,onOpenDesktopSetup:o}){const t=q(s=>s.locale),p=q(s=>s.state),r=q(s=>s.toast),x=p?.config?.workdir||"",[b,w]=l.useState([]),[v,B]=l.useState([]),[C,S]=l.useState(!0),[M,j]=l.useState(!1),[L,d]=l.useState(null),[u,E]=l.useState([]),[g,T]=l.useState([]),[F,_]=l.useState(!0),[U,P]=l.useState(!1),[A,V]=l.useState(null),I=l.useMemo(()=>b.filter(s=>s.scope==="global"),[b]),D=l.useMemo(()=>u.filter(s=>s.scope==="global"),[u]),H=l.useMemo(()=>new Set(b.map(s=>s.name)),[b]),k=l.useCallback(async()=>{S(!0);try{const[s,i]=await Promise.all([f.getMcpExtensions(x),f.getRecommendedMcp()]);w(s.extensions||[]),B(i.servers||[])}catch(s){r(s?.message||"Failed",!1)}finally{S(!1)}},[x,r]),h=l.useCallback(async()=>{_(!0);try{const[s,i]=await Promise.all([f.getExtensionSkills(x),f.getRecommendedSkills()]);E(s.skills||[]),T(i.repos||[])}catch(s){r(s?.message||"Failed",!1)}finally{_(!1)}},[x,r]),z=l.useCallback(async()=>{try{V(await f.getBrowser())}catch{}},[]);l.useEffect(()=>{k()},[k]),l.useEffect(()=>{h()},[h]),l.useEffect(()=>{z()},[z,p]);const N=l.useCallback(async s=>{try{await f.updateMcpExtension(s.name,{enabled:s.config.enabled===!1},"global"),await k()}catch(i){r(i?.message||"Failed",!1)}},[r,k]),J=l.useCallback(async s=>{try{await f.removeMcpExtension(s.name,"global"),r(n(t,`${s.name} 已移除`,`${s.name} removed`),!0),await k()}catch(i){r(i?.message||"Failed",!1)}},[t,r,k]),X=l.useCallback(async s=>{d(s.name);try{const i=await f.checkMcpHealth(s.config);if(i.ok){const y=i.tools?.length??0,ne=i.elapsedMs?` (${i.elapsedMs}ms)`:"";r(n(t,`${s.name} 健康 — ${y} 工具${ne}`,`${s.name} healthy — ${y} tools${ne}`),!0)}else r(`${s.name}: ${i.error}`,!1)}catch(i){r(i?.message||"Failed",!1)}finally{d(null)}},[t,r]),ee=l.useCallback(async s=>{try{const i=await f.removeExtensionSkill(s.name,!0,x);i.ok?(r(n(t,`${s.name} 已移除`,`${s.name} removed`),!0),await h()):r(i.error||"Failed",!1)}catch(i){r(i?.message||"Failed",!1)}},[x,t,r,h]),O=A?.browser,W=A?.desktop,Z=O?O.enabled?O.running?{label:n(t,"运行中","Running"),variant:"ok"}:O.status==="ready"?{label:n(t,"就绪","Ready"),variant:"ok"}:{label:n(t,"需配置","Needs setup"),variant:"warn"}:{label:n(t,"已关闭","Disabled"),variant:"muted"}:{label:"...",variant:"muted"},a=W?W.installed?W.running?{label:n(t,"运行中","Running"),variant:"ok"}:{label:n(t,"已安装","Installed"),variant:"accent"}:{label:n(t,"未安装","Not installed"),variant:"muted"}:{label:"...",variant:"muted"};return e.jsxs("div",{className:"animate-in space-y-6",children:[e.jsx("div",{className:"text-[13px] leading-relaxed text-fg-4",children:n(t,"管理全局 MCP 服务、技能和自动化能力。项目级扩展请在工作台中对应工作区配置。","Manage global MCP servers, skills, and automation. Configure project-level extensions in the Workbench.")}),e.jsxs("section",{children:[e.jsxs("div",{className:"mb-2.5 flex items-center justify-between",children:[e.jsxs(se,{children:["MCP Servers",!C&&e.jsxs("span",{className:"ml-1.5 text-fg-5 font-normal lowercase tracking-normal",children:["(",I.length,")"]})]}),e.jsxs(m,{variant:"outline",size:"sm",onClick:()=>j(!0),children:[e.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",className:"mr-1",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),n(t,"添加","Add")]})]}),C?e.jsx("div",{className:"flex items-center justify-center py-10",children:e.jsx(R,{})}):I.length===0?e.jsxs(ie,{className:"flex flex-col items-center justify-center py-8 text-center",children:[e.jsx("div",{className:"mb-2 flex h-10 w-10 items-center justify-center rounded-full border border-edge bg-panel-alt text-fg-5",children:e.jsx(K,{})}),e.jsx("div",{className:"text-[13px] text-fg-4",children:n(t,"暂无全局 MCP 服务","No global MCP servers")}),e.jsx("button",{className:"mt-2 text-[12px] text-primary hover:text-primary/80 transition-colors",onClick:()=>j(!0),children:n(t,"搜索并添加 →","Search and add →")})]}):e.jsx("div",{className:"space-y-1.5",children:I.map(s=>{const i=s.config.enabled===!1||s.config.disabled===!0;return e.jsxs(G,{className:i?"opacity-50":void 0,children:[e.jsx(Q,{icon:e.jsx(K,{}),title:s.name,subtitle:e.jsx("span",{className:"font-mono",children:me(s.config)}),badge:e.jsx(oe,{variant:i?"idle":"ok"})}),e.jsx("div",{className:"min-w-0 xl:col-span-2"}),e.jsx(Y,{children:e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(m,{variant:"ghost",size:"sm",onClick:()=>{X(s)},disabled:L===s.name,children:L===s.name?e.jsx(R,{}):n(t,"检查","Check")}),e.jsx(m,{variant:"ghost",size:"sm",onClick:()=>{N(s)},children:i?n(t,"启用","Enable"):n(t,"禁用","Disable")}),e.jsx(m,{variant:"ghost",size:"sm",onClick:()=>{J(s)},className:"hover:!text-err",children:n(t,"移除","Remove")})]})})]},s.name)})})]}),e.jsxs("section",{children:[e.jsxs("div",{className:"mb-2.5 flex items-center justify-between",children:[e.jsxs(se,{children:["Skills",!F&&e.jsxs("span",{className:"ml-1.5 text-fg-5 font-normal lowercase tracking-normal",children:["(",D.length,")"]})]}),e.jsxs(m,{variant:"outline",size:"sm",onClick:()=>P(!0),children:[e.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",className:"mr-1",children:[e.jsx("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),e.jsx("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),n(t,"安装","Install")]})]}),F?e.jsx("div",{className:"flex items-center justify-center py-10",children:e.jsx(R,{})}):D.length===0?e.jsxs(ie,{className:"flex flex-col items-center justify-center py-8 text-center",children:[e.jsx("div",{className:"mb-2 flex h-10 w-10 items-center justify-center rounded-full border border-edge bg-panel-alt text-fg-5",children:e.jsx(ae,{})}),e.jsx("div",{className:"text-[13px] text-fg-4",children:n(t,"暂无全局技能","No global skills")}),e.jsx("button",{className:"mt-2 text-[12px] text-primary hover:text-primary/80 transition-colors",onClick:()=>P(!0),children:n(t,"安装技能 →","Install skills →")})]}):e.jsx("div",{className:"space-y-1.5",children:D.map(s=>e.jsxs(G,{children:[e.jsx(Q,{icon:e.jsx(ae,{}),title:s.label||s.name,subtitle:s.description||void 0,badge:s.mcpRequires?.length?e.jsxs(te,{variant:"muted",children:["MCP: ",s.mcpRequires.join(", ")]}):void 0}),e.jsx("div",{className:"min-w-0 xl:col-span-2"}),e.jsx(Y,{children:e.jsx(m,{variant:"ghost",size:"sm",onClick:()=>{ee(s)},className:"hover:!text-err",children:n(t,"移除","Remove")})})]},s.name))})]}),e.jsxs("section",{children:[e.jsx("div",{className:"mb-2.5",children:e.jsx(se,{children:n(t,"内置自动化","Built-in Automation")})}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs(G,{children:[e.jsx(Q,{icon:e.jsx(le,{brand:"playwright",size:14}),title:n(t,"浏览器自动化","Browser Automation"),badge:e.jsx(te,{variant:Z.variant,children:Z.label})}),e.jsx("div",{className:"min-w-0 xl:col-span-2"}),e.jsx(Y,{children:e.jsx(m,{variant:"outline",size:"sm",onClick:c,children:O?.enabled?n(t,"管理","Manage"):n(t,"配置","Setup")})})]}),e.jsxs(G,{children:[e.jsx(Q,{icon:e.jsx(le,{brand:"appium",size:14}),title:n(t,"桌面自动化","Desktop Automation"),badge:e.jsx(te,{variant:a.variant,children:a.label})}),e.jsx("div",{className:"min-w-0 xl:col-span-2"}),e.jsx(Y,{children:e.jsx(m,{variant:"outline",size:"sm",onClick:o,children:W?.running?n(t,"管理","Manage"):n(t,"配置","Setup")})})]})]})]}),e.jsx(ue,{open:M,onClose:()=>j(!1),locale:t,recommended:v,installedNames:H,scope:"global",onAdded:k}),e.jsx(ge,{open:U,onClose:()=>P(!1),locale:t,recommended:g,scope:"global",workdir:x,onInstalled:h})]})}export{ue as AddMcpModal,Ne as ExtensionsTab,ge as InstallSkillModal};
@@ -1 +1 @@
1
- import{r as S,j as i}from"./react-vendor-DTcmqLiz.js";import{u as p,m as y,d as v,S as C,B as D}from"./index-Bbf__IXB.js";import{B as A}from"./BrandIcon-BAXeIuGD.js";import{a as j,b as V,d as w,c as N}from"./shared-BRvVjyDB.js";import"./router-emLofBBH.js";function L(t){return t==="zh-CN"?{status:"状态",summary:"接入摘要",loading:"加载中",chats:"个 chat",notConnected:"未接入",configuring:"配置中",connected:"已接入",failed:"配置异常",configure:"去配置",continueSetup:"继续配置",viewSettings:"查看设置",noWeixin:"尚未登录微信账号",noTelegram:"未配置 Bot Token",noFeishu:"未配置 App ID 与应用凭证",pendingValidation:"凭证已保存,等待验证。",connectedReady:"机器人已可正常接收消息。",validationFailed:"校验失败,请检查凭证或网络。",accountLinked:"已绑定账号",tokenSaved:"Token 已保存",appCredentialsSaved:"应用凭证已保存",allowedChats:"允许",notConnectedDetail:"尚未配置账号与接入凭证。"}:{status:"Status",summary:"Summary",loading:"Loading",chats:"chats",notConnected:"Not connected",configuring:"Configuring",connected:"Connected",failed:"Needs attention",configure:"Configure",continueSetup:"Continue setup",viewSettings:"View settings",noWeixin:"Weixin account not connected yet",noTelegram:"Bot token not configured",noFeishu:"App ID and credentials not configured",pendingValidation:"Credentials are saved and waiting for validation.",connectedReady:"This channel can receive messages.",validationFailed:"Validation failed. Check credentials or network.",accountLinked:"Account linked",tokenSaved:"Token saved",appCredentialsSaved:"Credentials saved",allowedChats:"Allows",notConnectedDetail:"Account and access credentials have not been configured yet."}}function g(t,e=4,a=4){const s=t.trim();return s?s.length<=e+a+3?s:`${s.slice(0,e)}...${s.slice(-a)}`:""}function B(t){return String(t||"").split(/[\n,;]/).map(e=>e.trim()).filter(Boolean).length}function u(t,e){return String(t?.[e]||"").trim()}function R(t,e){if(!t)return e;try{return new URL(t).host||t}catch{return t}}function h(t,e,a){if(t==="weixin"){const n=u(e,"weixinAccountId"),l=u(e,"weixinBaseUrl");return n?l?`${g(n)} · ${R(l,l)}`:`${a.accountLinked} ${g(n)}`:a.noWeixin}if(t==="telegram"){const n=u(e,"telegramBotToken"),l=B(u(e,"telegramAllowedChatIds"));return n?l>0?`${a.tokenSaved} · ${a.allowedChats} ${l} ${a.chats}`:a.tokenSaved:a.noTelegram}const s=u(e,"feishuAppId"),o=u(e,"feishuAppSecret");return!s||!o?a.noFeishu:`App ID ${g(s)} · ${a.appCredentialsSaved}`}function f(t,e){return!t||!t.configured?{statusLabel:e.notConnected,statusVariant:"muted",statusDescription:t?.detail||e.notConnectedDetail,actionLabel:e.configure}:t.ready?{statusLabel:e.connected,statusVariant:"ok",statusDescription:t.detail||e.connectedReady,actionLabel:e.viewSettings}:y(t)?{statusLabel:e.configuring,statusVariant:"accent",statusDescription:t.detail||e.pendingValidation,actionLabel:e.continueSetup}:{statusLabel:e.failed,statusVariant:"warn",statusDescription:t.detail||e.validationFailed,actionLabel:e.continueSetup}}function $({meta:t,locale:e}){const a=L(e);return i.jsxs(j,{children:[i.jsx(V,{icon:i.jsx(A,{brand:t.key,size:22}),title:t.title,subtitle:t.subtitle}),i.jsxs(w,{label:a.status,children:[i.jsx("div",{className:"flex flex-wrap items-center gap-1.5",children:i.jsxs(v,{variant:t.statusVariant,children:[t.loading&&i.jsx(C,{className:"h-3 w-3"}),t.statusLabel]})}),i.jsx("div",{className:"mt-1 text-[13px] leading-relaxed text-fg-3 xl:truncate xl:whitespace-nowrap",title:t.statusDescription,children:t.statusDescription})]}),i.jsx(w,{label:t.summaryLabel,children:i.jsx("div",{className:"break-words text-[13px] leading-relaxed text-fg-3",children:t.summary})}),i.jsx(N,{children:i.jsxs(D,{variant:t.channel?.ready?"outline":"primary",size:"sm",onClick:t.onAction,disabled:t.actionDisabled,children:[t.loading&&i.jsx(C,{className:"h-3 w-3"}),t.actionLabel]})})]})}function M({onOpenWeixin:t,onOpenTelegram:e,onOpenFeishu:a}){const s=p(r=>r.state),o=p(r=>r.locale),n=L(o),l=!s,d=s?.setupState?.channels||[],m=s?.config||{},k=S.useMemo(()=>{const r=d.find(c=>c.channel==="weixin")||null,b=d.find(c=>c.channel==="telegram")||null,x=d.find(c=>c.channel==="feishu")||null;return l?[{key:"weixin",title:"Weixin",subtitle:o==="zh-CN"?"二维码登录与账号接入":"QR login and account routing",channel:null,loading:!0,summary:n.loading,summaryLabel:n.summary,statusLabel:n.loading,statusVariant:"muted",statusDescription:n.loading,actionLabel:n.loading,actionDisabled:!0,onAction:t},{key:"telegram",title:"Telegram",subtitle:o==="zh-CN"?"Bot Token 与 chat allowlist":"Bot token and chat allowlist",channel:null,loading:!0,summary:n.loading,summaryLabel:n.summary,statusLabel:n.loading,statusVariant:"muted",statusDescription:n.loading,actionLabel:n.loading,actionDisabled:!0,onAction:e},{key:"feishu",title:"Feishu",subtitle:o==="zh-CN"?"应用凭证与机器人身份":"App credentials and bot identity",channel:null,loading:!0,summary:n.loading,summaryLabel:n.summary,statusLabel:n.loading,statusVariant:"muted",statusDescription:n.loading,actionLabel:n.loading,actionDisabled:!0,onAction:a}]:[{key:"weixin",title:"Weixin",subtitle:o==="zh-CN"?"二维码登录与账号接入":"QR login and account routing",channel:r,summary:h("weixin",m,n),summaryLabel:n.summary,...f(r,n),actionDisabled:!1,onAction:t},{key:"telegram",title:"Telegram",subtitle:o==="zh-CN"?"Bot Token 与 chat allowlist":"Bot token and chat allowlist",channel:b,summary:h("telegram",m,n),summaryLabel:n.summary,...f(b,n),actionDisabled:!1,onAction:e},{key:"feishu",title:"Feishu",subtitle:o==="zh-CN"?"应用凭证与机器人身份":"App credentials and bot identity",channel:x,summary:h("feishu",m,n),summaryLabel:n.summary,...f(x,n),actionDisabled:!1,onAction:a}]},[d,m,n,l,o,a,e,t]);return i.jsx("div",{className:"animate-in space-y-3",children:k.map(r=>i.jsx($,{meta:r,locale:o},r.key))})}export{M as IMAccessTab};
1
+ import{r as S,j as i}from"./react-vendor-DTcmqLiz.js";import{u as p,m as y,d as v,S as C,B as D}from"./index-BFtrf-rI.js";import{B as A}from"./BrandIcon-DHNapeU6.js";import{a as j,b as V,d as w,c as N}from"./shared-CHbIVrko.js";import"./router-emLofBBH.js";function L(t){return t==="zh-CN"?{status:"状态",summary:"接入摘要",loading:"加载中",chats:"个 chat",notConnected:"未接入",configuring:"配置中",connected:"已接入",failed:"配置异常",configure:"去配置",continueSetup:"继续配置",viewSettings:"查看设置",noWeixin:"尚未登录微信账号",noTelegram:"未配置 Bot Token",noFeishu:"未配置 App ID 与应用凭证",pendingValidation:"凭证已保存,等待验证。",connectedReady:"机器人已可正常接收消息。",validationFailed:"校验失败,请检查凭证或网络。",accountLinked:"已绑定账号",tokenSaved:"Token 已保存",appCredentialsSaved:"应用凭证已保存",allowedChats:"允许",notConnectedDetail:"尚未配置账号与接入凭证。"}:{status:"Status",summary:"Summary",loading:"Loading",chats:"chats",notConnected:"Not connected",configuring:"Configuring",connected:"Connected",failed:"Needs attention",configure:"Configure",continueSetup:"Continue setup",viewSettings:"View settings",noWeixin:"Weixin account not connected yet",noTelegram:"Bot token not configured",noFeishu:"App ID and credentials not configured",pendingValidation:"Credentials are saved and waiting for validation.",connectedReady:"This channel can receive messages.",validationFailed:"Validation failed. Check credentials or network.",accountLinked:"Account linked",tokenSaved:"Token saved",appCredentialsSaved:"Credentials saved",allowedChats:"Allows",notConnectedDetail:"Account and access credentials have not been configured yet."}}function g(t,e=4,a=4){const s=t.trim();return s?s.length<=e+a+3?s:`${s.slice(0,e)}...${s.slice(-a)}`:""}function B(t){return String(t||"").split(/[\n,;]/).map(e=>e.trim()).filter(Boolean).length}function u(t,e){return String(t?.[e]||"").trim()}function R(t,e){if(!t)return e;try{return new URL(t).host||t}catch{return t}}function h(t,e,a){if(t==="weixin"){const n=u(e,"weixinAccountId"),l=u(e,"weixinBaseUrl");return n?l?`${g(n)} · ${R(l,l)}`:`${a.accountLinked} ${g(n)}`:a.noWeixin}if(t==="telegram"){const n=u(e,"telegramBotToken"),l=B(u(e,"telegramAllowedChatIds"));return n?l>0?`${a.tokenSaved} · ${a.allowedChats} ${l} ${a.chats}`:a.tokenSaved:a.noTelegram}const s=u(e,"feishuAppId"),o=u(e,"feishuAppSecret");return!s||!o?a.noFeishu:`App ID ${g(s)} · ${a.appCredentialsSaved}`}function f(t,e){return!t||!t.configured?{statusLabel:e.notConnected,statusVariant:"muted",statusDescription:t?.detail||e.notConnectedDetail,actionLabel:e.configure}:t.ready?{statusLabel:e.connected,statusVariant:"ok",statusDescription:t.detail||e.connectedReady,actionLabel:e.viewSettings}:y(t)?{statusLabel:e.configuring,statusVariant:"accent",statusDescription:t.detail||e.pendingValidation,actionLabel:e.continueSetup}:{statusLabel:e.failed,statusVariant:"warn",statusDescription:t.detail||e.validationFailed,actionLabel:e.continueSetup}}function $({meta:t,locale:e}){const a=L(e);return i.jsxs(j,{children:[i.jsx(V,{icon:i.jsx(A,{brand:t.key,size:22}),title:t.title,subtitle:t.subtitle}),i.jsxs(w,{label:a.status,children:[i.jsx("div",{className:"flex flex-wrap items-center gap-1.5",children:i.jsxs(v,{variant:t.statusVariant,children:[t.loading&&i.jsx(C,{className:"h-3 w-3"}),t.statusLabel]})}),i.jsx("div",{className:"mt-1 text-[13px] leading-relaxed text-fg-3 xl:truncate xl:whitespace-nowrap",title:t.statusDescription,children:t.statusDescription})]}),i.jsx(w,{label:t.summaryLabel,children:i.jsx("div",{className:"break-words text-[13px] leading-relaxed text-fg-3",children:t.summary})}),i.jsx(N,{children:i.jsxs(D,{variant:t.channel?.ready?"outline":"primary",size:"sm",onClick:t.onAction,disabled:t.actionDisabled,children:[t.loading&&i.jsx(C,{className:"h-3 w-3"}),t.actionLabel]})})]})}function M({onOpenWeixin:t,onOpenTelegram:e,onOpenFeishu:a}){const s=p(r=>r.state),o=p(r=>r.locale),n=L(o),l=!s,d=s?.setupState?.channels||[],m=s?.config||{},k=S.useMemo(()=>{const r=d.find(c=>c.channel==="weixin")||null,b=d.find(c=>c.channel==="telegram")||null,x=d.find(c=>c.channel==="feishu")||null;return l?[{key:"weixin",title:"Weixin",subtitle:o==="zh-CN"?"二维码登录与账号接入":"QR login and account routing",channel:null,loading:!0,summary:n.loading,summaryLabel:n.summary,statusLabel:n.loading,statusVariant:"muted",statusDescription:n.loading,actionLabel:n.loading,actionDisabled:!0,onAction:t},{key:"telegram",title:"Telegram",subtitle:o==="zh-CN"?"Bot Token 与 chat allowlist":"Bot token and chat allowlist",channel:null,loading:!0,summary:n.loading,summaryLabel:n.summary,statusLabel:n.loading,statusVariant:"muted",statusDescription:n.loading,actionLabel:n.loading,actionDisabled:!0,onAction:e},{key:"feishu",title:"Feishu",subtitle:o==="zh-CN"?"应用凭证与机器人身份":"App credentials and bot identity",channel:null,loading:!0,summary:n.loading,summaryLabel:n.summary,statusLabel:n.loading,statusVariant:"muted",statusDescription:n.loading,actionLabel:n.loading,actionDisabled:!0,onAction:a}]:[{key:"weixin",title:"Weixin",subtitle:o==="zh-CN"?"二维码登录与账号接入":"QR login and account routing",channel:r,summary:h("weixin",m,n),summaryLabel:n.summary,...f(r,n),actionDisabled:!1,onAction:t},{key:"telegram",title:"Telegram",subtitle:o==="zh-CN"?"Bot Token 与 chat allowlist":"Bot token and chat allowlist",channel:b,summary:h("telegram",m,n),summaryLabel:n.summary,...f(b,n),actionDisabled:!1,onAction:e},{key:"feishu",title:"Feishu",subtitle:o==="zh-CN"?"应用凭证与机器人身份":"App credentials and bot identity",channel:x,summary:h("feishu",m,n),summaryLabel:n.summary,...f(x,n),actionDisabled:!1,onAction:a}]},[d,m,n,l,o,a,e,t]);return i.jsx("div",{className:"animate-in space-y-3",children:k.map(r=>i.jsx($,{meta:r,locale:o},r.key))})}export{M as IMAccessTab};
@@ -1 +1 @@
1
- import{j as e,r as d}from"./react-vendor-DTcmqLiz.js";import{c as s,B as x}from"./index-Bbf__IXB.js";function u({className:a,...t}){return e.jsx("input",{className:s("flex h-8 w-full rounded-md border border-edge bg-inset px-2.5 py-1.5 text-[13px] text-fg shadow-sm","transition-[border-color,box-shadow,background] duration-200 outline-none","placeholder:text-fg-5","focus:border-edge-h focus:shadow-[0_0_0_4px_var(--th-glow-a)]",a),...t})}function h({children:a,className:t}){return e.jsx("label",{className:s("mb-2 block text-sm font-medium text-fg-3",t),children:a})}function b({open:a,onClose:t,wide:r,panelStyle:i,children:o}){return d.useEffect(()=>{if(!a)return;const n=l=>{l.key==="Escape"&&t()};return document.addEventListener("keydown",n),()=>document.removeEventListener("keydown",n)},[a,t]),a?e.jsxs("div",{className:"fixed inset-0 z-100 flex items-center justify-center p-4",children:[e.jsx("div",{className:"absolute inset-0 backdrop-blur-[10px] backdrop-saturate-125",style:{background:"linear-gradient(180deg, color-mix(in oklab, var(--th-overlay) 68%, transparent), color-mix(in oklab, var(--th-overlay) 92%, transparent))"},onClick:t}),e.jsx("div",{className:"pointer-events-none absolute inset-0",style:{background:"radial-gradient(circle at center, color-mix(in oklab, white 12%, transparent), transparent 38%)"}}),e.jsx("div",{className:s("glass-strong relative max-h-[min(88vh,860px)] w-full overflow-hidden rounded-xl border border-edge-h shadow-[0_32px_96px_rgba(2,6,23,0.28),0_8px_24px_rgba(15,23,42,0.08)] animate-scale",r?"max-w-[720px]":"max-w-[480px]"),style:{...i,background:"linear-gradient(180deg, color-mix(in oklab, var(--th-modal-bg) 90%, white 10%), color-mix(in oklab, var(--th-modal-bg) 97%, white 3%))"},children:e.jsx("div",{className:"max-h-[inherit] overflow-y-auto p-6",children:o})})]}):null}function g({title:a,description:t,onClose:r}){return e.jsxs("div",{className:"mb-5 flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-base font-semibold tracking-tight text-fg",children:a}),t&&e.jsx("div",{className:"mt-1 text-sm leading-relaxed text-fg-4",children:t})]}),e.jsx(x,{variant:"ghost",size:"icon",onClick:r,className:"-mr-1 -mt-1 h-8 w-8 shrink-0",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})}export{u as I,h as L,b as M,g as a};
1
+ import{j as e,r as d}from"./react-vendor-DTcmqLiz.js";import{c as s,B as x}from"./index-BFtrf-rI.js";function u({className:a,...t}){return e.jsx("input",{className:s("flex h-8 w-full rounded-md border border-edge bg-inset px-2.5 py-1.5 text-[13px] text-fg shadow-sm","transition-[border-color,box-shadow,background] duration-200 outline-none","placeholder:text-fg-5","focus:border-edge-h focus:shadow-[0_0_0_4px_var(--th-glow-a)]",a),...t})}function h({children:a,className:t}){return e.jsx("label",{className:s("mb-2 block text-sm font-medium text-fg-3",t),children:a})}function b({open:a,onClose:t,wide:r,panelStyle:i,children:o}){return d.useEffect(()=>{if(!a)return;const n=l=>{l.key==="Escape"&&t()};return document.addEventListener("keydown",n),()=>document.removeEventListener("keydown",n)},[a,t]),a?e.jsxs("div",{className:"fixed inset-0 z-100 flex items-center justify-center p-4",children:[e.jsx("div",{className:"absolute inset-0 backdrop-blur-[10px] backdrop-saturate-125",style:{background:"linear-gradient(180deg, color-mix(in oklab, var(--th-overlay) 68%, transparent), color-mix(in oklab, var(--th-overlay) 92%, transparent))"},onClick:t}),e.jsx("div",{className:"pointer-events-none absolute inset-0",style:{background:"radial-gradient(circle at center, color-mix(in oklab, white 12%, transparent), transparent 38%)"}}),e.jsx("div",{className:s("glass-strong relative max-h-[min(88vh,860px)] w-full overflow-hidden rounded-xl border border-edge-h shadow-[0_32px_96px_rgba(2,6,23,0.28),0_8px_24px_rgba(15,23,42,0.08)] animate-scale",r?"max-w-[720px]":"max-w-[480px]"),style:{...i,background:"linear-gradient(180deg, color-mix(in oklab, var(--th-modal-bg) 90%, white 10%), color-mix(in oklab, var(--th-modal-bg) 97%, white 3%))"},children:e.jsx("div",{className:"max-h-[inherit] overflow-y-auto p-6",children:o})})]}):null}function g({title:a,description:t,onClose:r}){return e.jsxs("div",{className:"mb-5 flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-base font-semibold tracking-tight text-fg",children:a}),t&&e.jsx("div",{className:"mt-1 text-sm leading-relaxed text-fg-4",children:t})]}),e.jsx(x,{variant:"ghost",size:"icon",onClick:r,className:"-mr-1 -mt-1 h-8 w-8 shrink-0",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})}export{u as I,h as L,b as M,g as a};
@@ -1 +1 @@
1
- import{r as a,j as e}from"./react-vendor-DTcmqLiz.js";import{u as y,e as L,B,a as I,d as P}from"./index-Bbf__IXB.js";import{M as W,a as q,L as U,I as G}from"./Modal-utaCOq7k.js";import{D as V}from"./DirBrowser-HtXAEFE-.js";import"./router-emLofBBH.js";const O="https://ilinkai.weixin.qq.com";function Q(c){return c instanceof Error&&(c.name==="AbortError"||/aborted/i.test(c.message))}function H(c,h){return c instanceof Error&&/timed out/i.test(c.message)?h("modal.requestTimeout"):h("modal.networkError")}function se({open:c,onClose:h}){const N=y(x=>x.state),d=y(x=>x.toast),D=y(x=>x.reloadUntil),s=y(x=>x.locale),t=a.useMemo(()=>L(s),[s]),[u,v]=a.useState(""),[g,p]=a.useState(""),[w,S]=a.useState(!1),[b,o]=a.useState(!1),[k,l]=a.useState(null),[n,T]=a.useState(!1),j=a.useRef(null),F=a.useRef(N);F.current=N,a.useEffect(()=>{c?(v(F.current?.config.telegramBotToken||""),p(F.current?.config.telegramAllowedChatIds||""),S(!1),l(null),T(!F.current?.config.telegramBotToken)):(j.current?.abort(),j.current=null,o(!1))},[c]),a.useEffect(()=>()=>{j.current?.abort(),j.current=null},[]);const i=async()=>{if(!u.trim()){d(t("modal.inputToken"),!1);return}j.current?.abort();const x=new AbortController;j.current=x,o(!0),l(null);let r=!1;try{const f=await I.validateTelegramConfig(u.trim(),g.trim(),{signal:x.signal,timeoutMs:12e3});if(!f.ok){l({ok:!1,text:"✗ "+(f.error||t("modal.validationFailed"))});return}const C=f.normalizedAllowedChatIds??g.trim();l({ok:!0,text:"✓ @"+(f.bot?.username||"bot")+(f.bot?.displayName?" ("+f.bot.displayName+")":"")});const A=new Set((N?.setupState?.channels||[]).filter(E=>(E.ready||E.configured)&&E.channel!=="telegram").map(E=>E.channel));if(A.add("telegram"),await I.saveConfig({telegramBotToken:u.trim(),telegramAllowedChatIds:C,channels:[...A]}),!await D(E=>{const z=E.setupState?.channels?.find(K=>K.channel==="telegram");return E.config.telegramBotToken===u.trim()&&(E.config.telegramAllowedChatIds||"")===C&&!!z?.ready},{attempts:10,intervalMs:350})){l({ok:!1,text:"✗ "+t("modal.refreshStateFailed")}),d(t("modal.refreshStateFailed"),!1);return}d(t("modal.tgSaved")),r=!0}catch(f){if(Q(f))return;const C=H(f,t);l({ok:!1,text:"✗ "+C}),d(C,!1)}finally{j.current===x&&(j.current=null),o(!1),r&&h()}},m=()=>{j.current?.abort(),j.current=null,h()};return e.jsxs(W,{open:c,onClose:m,children:[e.jsx(q,{title:t("modal.configureTelegram"),onClose:m}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt",children:[e.jsxs("button",{type:"button",className:"flex w-full items-center justify-between px-3 py-2 text-xs font-medium text-fg-3 hover:text-fg-2 transition-colors",onClick:()=>T(!n),children:[e.jsx("span",{children:t("modal.tgGuideTitle")}),e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`transition-transform ${n?"rotate-180":""}`,children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),n&&e.jsxs("div",{className:"space-y-1 border-t border-edge px-3 pb-3 pt-2 text-xs leading-relaxed text-fg-4",children:[e.jsx("p",{children:t("modal.tgGuideStep1")}),e.jsx("p",{children:t("modal.tgGuideStep2")}),e.jsx("p",{children:t("modal.tgGuideStep3")}),e.jsx("p",{children:t("modal.tgGuideStep4")}),e.jsx("p",{className:"mt-2 text-[11px] text-fg-5",children:t("modal.tgGuideIdTip")})]})]}),e.jsxs("div",{children:[e.jsx(U,{children:t("modal.botToken")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(G,{type:w?"text":"password",className:"flex-1 font-mono text-xs",placeholder:t("modal.pasteToken"),value:u,onChange:x=>v(x.target.value)}),e.jsx(B,{variant:"ghost",size:"sm",className:"!w-[34px] !p-0",onClick:()=>S(!w),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",children:[e.jsx("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),e.jsx("circle",{cx:"12",cy:"12",r:"3"})]})})]})]}),k&&e.jsx("div",{className:"text-xs",style:{color:k.ok?"var(--th-ok)":"var(--th-err)"},children:k.text}),e.jsxs("div",{children:[e.jsxs(U,{children:[t("modal.allowedIds")," ",e.jsxs("span",{className:"text-fg-5",children:["(",t("modal.optional"),")"]})]}),e.jsx(G,{className:"font-mono text-xs",placeholder:t("modal.commaSep"),value:g,onChange:x=>p(x.target.value)})]})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx(B,{variant:"ghost",onClick:m,children:t("modal.cancel")}),e.jsx(B,{variant:"primary",disabled:b,onClick:i,children:t(b?"modal.validating":"modal.validateSave")})]})]})}function ae({open:c,onClose:h}){const N=y(i=>i.state),d=y(i=>i.toast),D=y(i=>i.reloadUntil),s=y(i=>i.locale),t=a.useMemo(()=>L(s),[s]),[u,v]=a.useState(""),[g,p]=a.useState(""),[w,S]=a.useState(!1),[b,o]=a.useState(null),[k,l]=a.useState(!1),n=a.useRef(null),T=a.useRef(N);T.current=N,a.useEffect(()=>{c?(v(T.current?.config.feishuAppId||""),p(T.current?.config.feishuAppSecret||""),o(null),l(!T.current?.config.feishuAppId)):(n.current?.abort(),n.current=null,S(!1))},[c]),a.useEffect(()=>()=>{n.current?.abort(),n.current=null},[]);const j=async()=>{if(!u.trim()){d(t("modal.inputAppId"),!1);return}n.current?.abort();const i=new AbortController;n.current=i,S(!0),o(null);let m=!1;try{const x=await I.validateFeishuConfig(u.trim(),g.trim(),{signal:i.signal,timeoutMs:2e4});if(!x.ok){o({ok:!1,text:"✗ "+(x.error||t("modal.validationFailed"))});return}o({ok:!0,text:"✓ "+(x.app?.displayName||x.app?.appId||u.trim())});const r=new Set((N?.setupState?.channels||[]).filter(C=>(C.ready||C.configured)&&C.channel!=="feishu").map(C=>C.channel));if(r.add("feishu"),await I.saveConfig({feishuAppId:u.trim(),feishuAppSecret:g.trim(),channels:[...r]}),!await D(C=>{const A=C.setupState?.channels?.find(R=>R.channel==="feishu");return C.config.feishuAppId===u.trim()&&C.config.feishuAppSecret===g.trim()&&!!A?.ready},{attempts:10,intervalMs:350})){o({ok:!1,text:"✗ "+t("modal.refreshStateFailed")}),d(t("modal.refreshStateFailed"),!1);return}d(t("modal.feishuSaved")),m=!0}catch(x){if(Q(x))return;const r=H(x,t);o({ok:!1,text:"✗ "+r}),d(r,!1)}finally{n.current===i&&(n.current=null),S(!1),m&&h()}},F=()=>{n.current?.abort(),n.current=null,h()};return e.jsxs(W,{open:c,onClose:F,children:[e.jsx(q,{title:t("modal.configureFeishu"),onClose:F}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt",children:[e.jsxs("button",{type:"button",className:"flex w-full items-center justify-between px-3 py-2 text-xs font-medium text-fg-3 hover:text-fg-2 transition-colors",onClick:()=>l(!k),children:[e.jsx("span",{children:t("modal.feishuGuideTitle")}),e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`transition-transform ${k?"rotate-180":""}`,children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),k&&e.jsxs("div",{className:"space-y-1 border-t border-edge px-3 pb-3 pt-2 text-xs leading-relaxed text-fg-4",children:[e.jsx("p",{children:t("modal.feishuGuideStep1")}),e.jsx("p",{children:t("modal.feishuGuideStep2")}),e.jsx("p",{children:t("modal.feishuGuideStep3")}),e.jsx("p",{children:t("modal.feishuGuideStep4")}),e.jsx("p",{className:"ml-3 font-mono text-[11px] text-fg-5",children:t("modal.feishuGuidePerms")}),e.jsx("p",{children:t("modal.feishuGuideStep5")}),e.jsx("p",{children:t("modal.feishuGuideStep6")}),e.jsx("p",{children:t("modal.feishuGuideStep7")}),e.jsx("p",{className:"mt-2 text-[11px] text-fg-5",children:t("modal.feishuGuideCardKitTip")})]})]}),e.jsxs("div",{children:[e.jsx(U,{children:t("modal.appId")}),e.jsx(G,{className:"font-mono text-xs",placeholder:t("modal.feishuPlaceholder"),value:u,onChange:i=>v(i.target.value)})]}),e.jsxs("div",{children:[e.jsx(U,{children:t("modal.appSecret")}),e.jsx(G,{type:"password",className:"font-mono text-xs",placeholder:t("modal.appSecret"),value:g,onChange:i=>p(i.target.value)})]}),b&&e.jsx("div",{className:"text-xs",style:{color:b.ok?"var(--th-ok)":"var(--th-err)"},children:b.text})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx(B,{variant:"ghost",onClick:F,children:t("modal.cancel")}),e.jsx(B,{variant:"primary",disabled:w,onClick:j,children:t(w?"modal.validating":"modal.validateSave")})]})]})}function le({open:c,onClose:h}){const N=y(m=>m.state),d=y(m=>m.toast),D=y(m=>m.reloadUntil),s=y(m=>m.locale),t=a.useMemo(()=>L(s),[s]),[u,v]=a.useState(O),[g,p]=a.useState(!1),[w,S]=a.useState(""),[b,o]=a.useState(""),[k,l]=a.useState(null),n=a.useRef(null),T=a.useRef(N);T.current=N,a.useEffect(()=>{c?(v(T.current?.config.weixinBaseUrl||O),p(!1),S(""),o(""),l(null)):(n.current?.abort(),n.current=null,p(!1))},[c]),a.useEffect(()=>()=>{n.current?.abort(),n.current=null},[]);const j=()=>{n.current?.abort(),n.current=null,h()},F=a.useCallback(async(m,x,r)=>{for(;!m.signal.aborted;){const f=await I.waitWeixinLogin(x,r,{signal:m.signal,timeoutMs:45e3});if(!f.ok&&!f.connected)return l({ok:!1,text:"✗ "+(f.error||f.message||t("modal.validationFailed"))}),!1;if(f.qrcodeUrl&&S(f.qrcodeUrl),f.status==="scaned"?l({ok:!0,text:t("modal.weixinScanned")}):f.status==="expired"?l({ok:!0,text:t("modal.weixinQrRefreshed")}):f.connected||l({ok:!0,text:t("modal.weixinWaitingScan")}),!f.connected)continue;l({ok:!0,text:t("modal.weixinLoginSuccess")});const C=f.baseUrl||r,A=f.botToken||"",R=f.accountId||"",E=await I.validateWeixinConfig(C,A,R,{signal:m.signal,timeoutMs:12e3});if(!E.ok)return l({ok:!1,text:"✗ "+(E.error||t("modal.validationFailed"))}),!1;const z=E.normalizedBaseUrl||C,K=new Set((T.current?.setupState?.channels||[]).filter(M=>(M.ready||M.configured)&&M.channel!=="weixin").map(M=>M.channel));return K.add("weixin"),await I.saveConfig({weixinBaseUrl:z,weixinBotToken:A,weixinAccountId:R,channels:[...K]}),await D(M=>{const _=M.setupState?.channels?.find($=>$.channel==="weixin");return M.config.weixinBaseUrl===z&&M.config.weixinBotToken===A&&M.config.weixinAccountId===R&&!!_?.ready},{attempts:12,intervalMs:350})?(d(t("modal.weixinSaved")),!0):(l({ok:!1,text:"✗ "+t("modal.refreshStateFailed")}),d(t("modal.refreshStateFailed"),!1),!1)}return!1},[D,t,d]),i=async()=>{if(!u.trim()){d(t("modal.inputWeixinBaseUrl"),!1);return}n.current?.abort();const m=new AbortController;n.current=m,p(!0),S(""),o(""),l(null);let x=!1;try{const r=await I.startWeixinLogin(u.trim(),{signal:m.signal,timeoutMs:12e3});if(!r.ok||!r.qrcodeUrl){l({ok:!1,text:"✗ "+(r.error||r.message||t("modal.validationFailed"))});return}S(r.qrcodeUrl),o(r.sessionKey),l({ok:!0,text:t("modal.weixinWaitingScan")}),x=await F(m,r.sessionKey,u.trim())}catch(r){if(Q(r))return;const f=H(r,t);l({ok:!1,text:"✗ "+f}),d(f,!1)}finally{n.current===m&&(n.current=null),p(!1),x&&h()}};return e.jsxs(W,{open:c,onClose:j,children:[e.jsx(q,{title:t("modal.configureWeixin"),onClose:j}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"text-xs leading-relaxed text-fg-4",children:t("modal.weixinScanHint")}),e.jsxs("div",{children:[e.jsx(U,{children:t("modal.weixinBaseUrl")}),e.jsx(G,{className:"font-mono text-xs",value:u,onChange:m=>v(m.target.value),placeholder:O}),e.jsx("div",{className:"mt-1 text-[11px] text-fg-5",children:t("modal.weixinDefaultBaseUrlHint")})]}),w&&e.jsxs("div",{className:"rounded-xl border border-edge bg-panel-alt p-4",children:[e.jsx("img",{src:w,alt:t("modal.weixinQrAlt"),className:"mx-auto h-56 w-56 rounded-lg bg-white p-3 object-contain"}),b&&e.jsx("div",{className:"mt-2 truncate text-center font-mono text-[10px] text-fg-5",children:b})]}),k&&e.jsx("div",{className:"text-xs",style:{color:k.ok?"var(--th-ok)":"var(--th-err)"},children:k.text})]}),e.jsxs("div",{className:"mt-6 flex justify-end gap-2",children:[e.jsx(B,{variant:"ghost",onClick:j,children:t("modal.cancel")}),e.jsx(B,{variant:"primary",disabled:g,onClick:i,children:t(g?w?"modal.validating":"modal.weixinGeneratingQr":w?"modal.weixinRetry":"modal.weixinGenerateQr")})]})]})}function ne({open:c,onClose:h}){const N=y(l=>l.state),d=y(l=>l.toast),D=y(l=>l.reload),s=y(l=>l.locale),t=a.useMemo(()=>L(s),[s]),u=N?.bot?.workdir||N?.runtimeWorkdir||"",[v,g]=a.useState(""),[p,w]=a.useState(!1),[S,b]=a.useState(0);a.useEffect(()=>{c&&(g(u),b(l=>l+1))},[c,u]);const o=a.useCallback(l=>{g(l)},[]),k=async()=>{const l=v.trim();if(!l){d(t("modal.selectDirFirst"),!1);return}w(!0);try{const n=await I.switchWorkdir(l);n.ok?(await D(),d(t("modal.switchedTo")+n.workdir),h()):d(n.error||t("modal.switchFailed"),!1)}catch{d(t("modal.switchFailed"),!1)}finally{w(!1)}};return e.jsx(W,{open:c,onClose:p?void 0:h,panelStyle:{width:"min(500px, calc(100vw - 2rem))",maxWidth:"min(500px, calc(100vw - 2rem))"},children:p?e.jsxs("div",{className:"flex flex-col items-center justify-center py-12 gap-4 animate-in",children:[e.jsxs("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",className:"animate-spin text-fg-3",style:{animationDuration:"1.2s"},children:[e.jsx("polyline",{points:"23 4 23 10 17 10"}),e.jsx("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"})]}),e.jsx("span",{className:"text-sm font-medium text-fg-3",children:t("modal.switching")}),e.jsx("span",{className:"text-xs text-fg-5 max-w-[280px] truncate",children:v})]}):e.jsxs(e.Fragment,{children:[e.jsx(q,{title:t("modal.switchWorkdir"),onClose:h}),e.jsx(V,{initialPath:u,onSelect:o,t},S),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx(B,{variant:"ghost",onClick:h,children:t("modal.cancel")}),e.jsx(B,{variant:"primary",onClick:k,children:t("modal.selectDir")})]})]})})}function re({open:c,onClose:h,onSaved:N}){const d=y(r=>r.toast),D=y(r=>r.locale),s=a.useMemo(()=>L(D),[D]),[t,u]=a.useState(null),[v,g]=a.useState(!1),[p,w]=a.useState(!1),[S,b]=a.useState(null);a.useEffect(()=>{c&&(g(!1),b(null),I.getBrowser().then(r=>{u(r),w(!!r.browser.enabled)}).catch(()=>u(null)))},[c]);const o=t?.browser,k=!!o?.enabled,l=!!o&&k!==p,n=o?.profileDir||"",T=s("ext.profileDir"),j=n,F=!!o?.chromeInstalled&&!!o?.profileCreated,i=t?o?.enabled?F?s("ext.browserReady"):o?.chromeInstalled?s("ext.chromeInstalled"):s("ext.needsSetup"):s("ext.disabled"):s("status.loading"),m=t&&o?.enabled?F?"ok":o?.chromeInstalled?"warn":"err":"muted",x=async()=>{g(!0),b(null);try{await I.saveConfig({browserEnabled:p});const r=await I.getBrowser();u(r),N?.()}catch{b({ok:!1,text:"✗ "+s("ext.browserModeSaveFailed")}),d(s("ext.browserModeSaveFailed"),!1),g(!1);return}if(!p){b({ok:!0,text:"✓ "+s("ext.browserDisabledSaved")}),d(s("ext.browserDisabledSaved")),g(!1);return}try{const r=await I.setupBrowser();if(!r.ok){b({ok:!1,text:"✗ "+(r.error||s("ext.browserLaunchFailed"))}),d(r.error||s("ext.browserLaunchFailed"),!1);return}u(f=>f?{...f,browser:r.browser}:{browser:r.browser,desktop:{enabled:!1,installed:!1,running:!1,appiumUrl:""}}),b({ok:!0,text:"✓ "+s("ext.browserEnabledLaunched")}),d(s("ext.browserEnabledLaunched")),N?.()}catch{b({ok:!1,text:"✗ "+s("ext.browserLaunchFailed")}),d(s("ext.browserLaunchFailed"),!1)}finally{g(!1)}};return e.jsxs(W,{open:c,onClose:h,children:[e.jsx(q,{title:s("ext.setupBrowser"),description:s("ext.setupBrowserDesc"),onClose:h}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(P,{variant:m,children:i}),o&&e.jsxs(e.Fragment,{children:[e.jsx(P,{variant:k?"accent":"muted",children:s(k?"ext.enabled":"ext.disabled")}),l&&e.jsx(P,{variant:"warn",children:s("ext.pendingModeChange")}),o.running&&e.jsxs(P,{variant:"accent",children:[s("ext.browserOpen"),o.pid?` · PID ${o.pid}`:""]})]})]}),e.jsxs("div",{className:"mt-3",children:[e.jsx(U,{children:T}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(G,{className:"font-mono text-xs flex-1",value:j||"—",readOnly:!0,onClick:r=>r.target.select()}),e.jsx(B,{variant:"outline",size:"sm",disabled:!j,onClick:()=>{j&&(navigator.clipboard.writeText(j),d(s("ext.step2Copied")))},children:s("ext.copyPath")})]})]}),e.jsx("div",{className:"mt-3 text-xs text-fg-5",children:s(p?"ext.profileModeDesc":"ext.browserDescDisabled")}),o?.detail&&e.jsx("div",{className:"mt-2 text-xs text-fg-5",children:o.detail}),S&&e.jsx("div",{className:"mt-3 text-xs",style:{color:S.ok?"var(--th-ok)":"var(--th-err)"},children:S.text})]}),e.jsx("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:e.jsxs("label",{className:"flex cursor-pointer items-start gap-3",children:[e.jsx("input",{type:"checkbox",checked:p,onChange:r=>w(r.target.checked),className:"mt-0.5 h-4 w-4 rounded border border-edge bg-inset"}),e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium text-fg-2 mb-1",children:s("ext.browserEnableToggle")}),e.jsx("div",{className:"text-xs text-fg-4",children:s("ext.browserEnableToggleDesc")})]})]})}),e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:[e.jsx("div",{className:"text-sm font-medium text-fg-2 mb-1",children:s(p?"ext.step2Title":"ext.browserDisabledStepTitle")}),e.jsx("div",{className:"text-xs text-fg-4",children:s(p?"ext.step2Desc":"ext.browserDisabledHint")})]})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx(B,{variant:"ghost",onClick:h,children:s("modal.cancel")}),e.jsx(B,{variant:"primary",disabled:v,onClick:x,children:s(v?"ext.launching":p?"ext.enableAndLaunchBrowser":"ext.saveBrowserDisabled")})]})]})}function ie({open:c,onClose:h,onSaved:N}){const d=y(i=>i.toast),D=y(i=>i.locale),s=a.useMemo(()=>L(D),[D]),[t,u]=a.useState(!1),[v,g]=a.useState(!1),[p,w]=a.useState(!1),[S,b]=a.useState(!1),[o,k]=a.useState(!1),[l,n]=a.useState(null);a.useEffect(()=>{c&&(u(!1),b(!1),k(!1),n(null),I.getBrowser().then(i=>{g(i.desktop.installed),w(i.desktop.enabled)}).catch(()=>{}))},[c]);const T=async()=>{u(!0),n(null);try{const i=await I.desktopInstall();i.ok?(g(!0),n({ok:!0,text:"✓ "+s("ext.desktopInstalled")}),d(s("ext.desktopInstalled"))):n({ok:!1,text:"✗ "+(i.error||s("ext.desktopInstallFailed"))})}catch{n({ok:!1,text:"✗ "+s("ext.desktopInstallFailed")})}finally{u(!1)}},j=async()=>{b(!0),n(null);try{const i=await I.desktopToggle(!0);i.ok?(w(!0),n({ok:!0,text:"✓ "+s("ext.desktopStarted")}),d(s("ext.desktopStarted")),N?.()):n({ok:!1,text:"✗ "+(i.error||s("ext.desktopInstallFailed"))})}catch{n({ok:!1,text:"✗ "+s("ext.desktopInstallFailed")})}finally{b(!1)}},F=async()=>{k(!0),n(null);try{const i=await I.desktopToggle(!1);i.ok?(w(!1),n({ok:!0,text:"✓ "+s("ext.desktopStopped")}),d(s("ext.desktopStopped")),N?.()):n({ok:!1,text:"✗ "+(i.error||s("ext.desktopInstallFailed"))})}catch{n({ok:!1,text:"✗ "+s("ext.desktopInstallFailed")})}finally{k(!1)}};return e.jsxs(W,{open:c,onClose:h,children:[e.jsx(q,{title:s("ext.setupDesktop"),description:s("ext.setupDesktopDesc"),onClose:h}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:[e.jsx("div",{className:"text-sm font-medium text-fg-2 mb-1",children:s("ext.desktopStep1Title")}),e.jsx("div",{className:"text-xs text-fg-4 mb-3",children:s("ext.desktopStep1Desc")}),l&&!v&&e.jsx("div",{className:"mb-2 text-xs",style:{color:l.ok?"var(--th-ok)":"var(--th-err)"},children:l.text}),e.jsx(B,{variant:v?"ghost":"outline",size:"sm",disabled:t||v,onClick:T,children:s(t?"ext.desktopInstalling":v?"ext.desktopStep1Done":"ext.desktopStep1Action")})]}),e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:[e.jsx("div",{className:"text-sm font-medium text-fg-2 mb-1",children:s("ext.desktopStep2Title")}),e.jsx("div",{className:"text-xs text-fg-4 mb-3",children:s("ext.desktopStep2Desc")}),l&&v&&e.jsx("div",{className:"mb-2 text-xs",style:{color:l.ok?"var(--th-ok)":"var(--th-err)"},children:l.text}),e.jsx("div",{className:"flex items-center gap-2",children:p?e.jsx(B,{variant:"outline",size:"sm",disabled:o,onClick:F,children:s(o?"ext.desktopStopping":"ext.disable")}):e.jsx(B,{variant:"primary",size:"sm",disabled:!v||S,onClick:j,children:s(S?"ext.desktopStarting":"ext.desktopStep2Action")})})]})]}),e.jsx("div",{className:"flex justify-end gap-2 mt-6",children:e.jsx(B,{variant:"ghost",onClick:h,children:s("modal.cancel")})})]})}export{re as BrowserSetupModal,ie as DesktopSetupModal,ae as FeishuModal,se as TelegramModal,le as WeixinModal,ne as WorkdirModal};
1
+ import{r as a,j as e}from"./react-vendor-DTcmqLiz.js";import{u as y,e as L,B,a as I,d as P}from"./index-BFtrf-rI.js";import{M as W,a as q,L as U,I as G}from"./Modal-CQ3_xUJW.js";import{D as V}from"./DirBrowser-rl1DwWxj.js";import"./router-emLofBBH.js";const O="https://ilinkai.weixin.qq.com";function Q(c){return c instanceof Error&&(c.name==="AbortError"||/aborted/i.test(c.message))}function H(c,h){return c instanceof Error&&/timed out/i.test(c.message)?h("modal.requestTimeout"):h("modal.networkError")}function se({open:c,onClose:h}){const N=y(x=>x.state),d=y(x=>x.toast),D=y(x=>x.reloadUntil),s=y(x=>x.locale),t=a.useMemo(()=>L(s),[s]),[u,v]=a.useState(""),[g,p]=a.useState(""),[w,S]=a.useState(!1),[b,o]=a.useState(!1),[k,l]=a.useState(null),[n,T]=a.useState(!1),j=a.useRef(null),F=a.useRef(N);F.current=N,a.useEffect(()=>{c?(v(F.current?.config.telegramBotToken||""),p(F.current?.config.telegramAllowedChatIds||""),S(!1),l(null),T(!F.current?.config.telegramBotToken)):(j.current?.abort(),j.current=null,o(!1))},[c]),a.useEffect(()=>()=>{j.current?.abort(),j.current=null},[]);const i=async()=>{if(!u.trim()){d(t("modal.inputToken"),!1);return}j.current?.abort();const x=new AbortController;j.current=x,o(!0),l(null);let r=!1;try{const f=await I.validateTelegramConfig(u.trim(),g.trim(),{signal:x.signal,timeoutMs:12e3});if(!f.ok){l({ok:!1,text:"✗ "+(f.error||t("modal.validationFailed"))});return}const C=f.normalizedAllowedChatIds??g.trim();l({ok:!0,text:"✓ @"+(f.bot?.username||"bot")+(f.bot?.displayName?" ("+f.bot.displayName+")":"")});const A=new Set((N?.setupState?.channels||[]).filter(E=>(E.ready||E.configured)&&E.channel!=="telegram").map(E=>E.channel));if(A.add("telegram"),await I.saveConfig({telegramBotToken:u.trim(),telegramAllowedChatIds:C,channels:[...A]}),!await D(E=>{const z=E.setupState?.channels?.find(K=>K.channel==="telegram");return E.config.telegramBotToken===u.trim()&&(E.config.telegramAllowedChatIds||"")===C&&!!z?.ready},{attempts:10,intervalMs:350})){l({ok:!1,text:"✗ "+t("modal.refreshStateFailed")}),d(t("modal.refreshStateFailed"),!1);return}d(t("modal.tgSaved")),r=!0}catch(f){if(Q(f))return;const C=H(f,t);l({ok:!1,text:"✗ "+C}),d(C,!1)}finally{j.current===x&&(j.current=null),o(!1),r&&h()}},m=()=>{j.current?.abort(),j.current=null,h()};return e.jsxs(W,{open:c,onClose:m,children:[e.jsx(q,{title:t("modal.configureTelegram"),onClose:m}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt",children:[e.jsxs("button",{type:"button",className:"flex w-full items-center justify-between px-3 py-2 text-xs font-medium text-fg-3 hover:text-fg-2 transition-colors",onClick:()=>T(!n),children:[e.jsx("span",{children:t("modal.tgGuideTitle")}),e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`transition-transform ${n?"rotate-180":""}`,children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),n&&e.jsxs("div",{className:"space-y-1 border-t border-edge px-3 pb-3 pt-2 text-xs leading-relaxed text-fg-4",children:[e.jsx("p",{children:t("modal.tgGuideStep1")}),e.jsx("p",{children:t("modal.tgGuideStep2")}),e.jsx("p",{children:t("modal.tgGuideStep3")}),e.jsx("p",{children:t("modal.tgGuideStep4")}),e.jsx("p",{className:"mt-2 text-[11px] text-fg-5",children:t("modal.tgGuideIdTip")})]})]}),e.jsxs("div",{children:[e.jsx(U,{children:t("modal.botToken")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(G,{type:w?"text":"password",className:"flex-1 font-mono text-xs",placeholder:t("modal.pasteToken"),value:u,onChange:x=>v(x.target.value)}),e.jsx(B,{variant:"ghost",size:"sm",className:"!w-[34px] !p-0",onClick:()=>S(!w),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",children:[e.jsx("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"}),e.jsx("circle",{cx:"12",cy:"12",r:"3"})]})})]})]}),k&&e.jsx("div",{className:"text-xs",style:{color:k.ok?"var(--th-ok)":"var(--th-err)"},children:k.text}),e.jsxs("div",{children:[e.jsxs(U,{children:[t("modal.allowedIds")," ",e.jsxs("span",{className:"text-fg-5",children:["(",t("modal.optional"),")"]})]}),e.jsx(G,{className:"font-mono text-xs",placeholder:t("modal.commaSep"),value:g,onChange:x=>p(x.target.value)})]})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx(B,{variant:"ghost",onClick:m,children:t("modal.cancel")}),e.jsx(B,{variant:"primary",disabled:b,onClick:i,children:t(b?"modal.validating":"modal.validateSave")})]})]})}function ae({open:c,onClose:h}){const N=y(i=>i.state),d=y(i=>i.toast),D=y(i=>i.reloadUntil),s=y(i=>i.locale),t=a.useMemo(()=>L(s),[s]),[u,v]=a.useState(""),[g,p]=a.useState(""),[w,S]=a.useState(!1),[b,o]=a.useState(null),[k,l]=a.useState(!1),n=a.useRef(null),T=a.useRef(N);T.current=N,a.useEffect(()=>{c?(v(T.current?.config.feishuAppId||""),p(T.current?.config.feishuAppSecret||""),o(null),l(!T.current?.config.feishuAppId)):(n.current?.abort(),n.current=null,S(!1))},[c]),a.useEffect(()=>()=>{n.current?.abort(),n.current=null},[]);const j=async()=>{if(!u.trim()){d(t("modal.inputAppId"),!1);return}n.current?.abort();const i=new AbortController;n.current=i,S(!0),o(null);let m=!1;try{const x=await I.validateFeishuConfig(u.trim(),g.trim(),{signal:i.signal,timeoutMs:2e4});if(!x.ok){o({ok:!1,text:"✗ "+(x.error||t("modal.validationFailed"))});return}o({ok:!0,text:"✓ "+(x.app?.displayName||x.app?.appId||u.trim())});const r=new Set((N?.setupState?.channels||[]).filter(C=>(C.ready||C.configured)&&C.channel!=="feishu").map(C=>C.channel));if(r.add("feishu"),await I.saveConfig({feishuAppId:u.trim(),feishuAppSecret:g.trim(),channels:[...r]}),!await D(C=>{const A=C.setupState?.channels?.find(R=>R.channel==="feishu");return C.config.feishuAppId===u.trim()&&C.config.feishuAppSecret===g.trim()&&!!A?.ready},{attempts:10,intervalMs:350})){o({ok:!1,text:"✗ "+t("modal.refreshStateFailed")}),d(t("modal.refreshStateFailed"),!1);return}d(t("modal.feishuSaved")),m=!0}catch(x){if(Q(x))return;const r=H(x,t);o({ok:!1,text:"✗ "+r}),d(r,!1)}finally{n.current===i&&(n.current=null),S(!1),m&&h()}},F=()=>{n.current?.abort(),n.current=null,h()};return e.jsxs(W,{open:c,onClose:F,children:[e.jsx(q,{title:t("modal.configureFeishu"),onClose:F}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt",children:[e.jsxs("button",{type:"button",className:"flex w-full items-center justify-between px-3 py-2 text-xs font-medium text-fg-3 hover:text-fg-2 transition-colors",onClick:()=>l(!k),children:[e.jsx("span",{children:t("modal.feishuGuideTitle")}),e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`transition-transform ${k?"rotate-180":""}`,children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),k&&e.jsxs("div",{className:"space-y-1 border-t border-edge px-3 pb-3 pt-2 text-xs leading-relaxed text-fg-4",children:[e.jsx("p",{children:t("modal.feishuGuideStep1")}),e.jsx("p",{children:t("modal.feishuGuideStep2")}),e.jsx("p",{children:t("modal.feishuGuideStep3")}),e.jsx("p",{children:t("modal.feishuGuideStep4")}),e.jsx("p",{className:"ml-3 font-mono text-[11px] text-fg-5",children:t("modal.feishuGuidePerms")}),e.jsx("p",{children:t("modal.feishuGuideStep5")}),e.jsx("p",{children:t("modal.feishuGuideStep6")}),e.jsx("p",{children:t("modal.feishuGuideStep7")}),e.jsx("p",{className:"mt-2 text-[11px] text-fg-5",children:t("modal.feishuGuideCardKitTip")})]})]}),e.jsxs("div",{children:[e.jsx(U,{children:t("modal.appId")}),e.jsx(G,{className:"font-mono text-xs",placeholder:t("modal.feishuPlaceholder"),value:u,onChange:i=>v(i.target.value)})]}),e.jsxs("div",{children:[e.jsx(U,{children:t("modal.appSecret")}),e.jsx(G,{type:"password",className:"font-mono text-xs",placeholder:t("modal.appSecret"),value:g,onChange:i=>p(i.target.value)})]}),b&&e.jsx("div",{className:"text-xs",style:{color:b.ok?"var(--th-ok)":"var(--th-err)"},children:b.text})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx(B,{variant:"ghost",onClick:F,children:t("modal.cancel")}),e.jsx(B,{variant:"primary",disabled:w,onClick:j,children:t(w?"modal.validating":"modal.validateSave")})]})]})}function le({open:c,onClose:h}){const N=y(m=>m.state),d=y(m=>m.toast),D=y(m=>m.reloadUntil),s=y(m=>m.locale),t=a.useMemo(()=>L(s),[s]),[u,v]=a.useState(O),[g,p]=a.useState(!1),[w,S]=a.useState(""),[b,o]=a.useState(""),[k,l]=a.useState(null),n=a.useRef(null),T=a.useRef(N);T.current=N,a.useEffect(()=>{c?(v(T.current?.config.weixinBaseUrl||O),p(!1),S(""),o(""),l(null)):(n.current?.abort(),n.current=null,p(!1))},[c]),a.useEffect(()=>()=>{n.current?.abort(),n.current=null},[]);const j=()=>{n.current?.abort(),n.current=null,h()},F=a.useCallback(async(m,x,r)=>{for(;!m.signal.aborted;){const f=await I.waitWeixinLogin(x,r,{signal:m.signal,timeoutMs:45e3});if(!f.ok&&!f.connected)return l({ok:!1,text:"✗ "+(f.error||f.message||t("modal.validationFailed"))}),!1;if(f.qrcodeUrl&&S(f.qrcodeUrl),f.status==="scaned"?l({ok:!0,text:t("modal.weixinScanned")}):f.status==="expired"?l({ok:!0,text:t("modal.weixinQrRefreshed")}):f.connected||l({ok:!0,text:t("modal.weixinWaitingScan")}),!f.connected)continue;l({ok:!0,text:t("modal.weixinLoginSuccess")});const C=f.baseUrl||r,A=f.botToken||"",R=f.accountId||"",E=await I.validateWeixinConfig(C,A,R,{signal:m.signal,timeoutMs:12e3});if(!E.ok)return l({ok:!1,text:"✗ "+(E.error||t("modal.validationFailed"))}),!1;const z=E.normalizedBaseUrl||C,K=new Set((T.current?.setupState?.channels||[]).filter(M=>(M.ready||M.configured)&&M.channel!=="weixin").map(M=>M.channel));return K.add("weixin"),await I.saveConfig({weixinBaseUrl:z,weixinBotToken:A,weixinAccountId:R,channels:[...K]}),await D(M=>{const _=M.setupState?.channels?.find($=>$.channel==="weixin");return M.config.weixinBaseUrl===z&&M.config.weixinBotToken===A&&M.config.weixinAccountId===R&&!!_?.ready},{attempts:12,intervalMs:350})?(d(t("modal.weixinSaved")),!0):(l({ok:!1,text:"✗ "+t("modal.refreshStateFailed")}),d(t("modal.refreshStateFailed"),!1),!1)}return!1},[D,t,d]),i=async()=>{if(!u.trim()){d(t("modal.inputWeixinBaseUrl"),!1);return}n.current?.abort();const m=new AbortController;n.current=m,p(!0),S(""),o(""),l(null);let x=!1;try{const r=await I.startWeixinLogin(u.trim(),{signal:m.signal,timeoutMs:12e3});if(!r.ok||!r.qrcodeUrl){l({ok:!1,text:"✗ "+(r.error||r.message||t("modal.validationFailed"))});return}S(r.qrcodeUrl),o(r.sessionKey),l({ok:!0,text:t("modal.weixinWaitingScan")}),x=await F(m,r.sessionKey,u.trim())}catch(r){if(Q(r))return;const f=H(r,t);l({ok:!1,text:"✗ "+f}),d(f,!1)}finally{n.current===m&&(n.current=null),p(!1),x&&h()}};return e.jsxs(W,{open:c,onClose:j,children:[e.jsx(q,{title:t("modal.configureWeixin"),onClose:j}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"text-xs leading-relaxed text-fg-4",children:t("modal.weixinScanHint")}),e.jsxs("div",{children:[e.jsx(U,{children:t("modal.weixinBaseUrl")}),e.jsx(G,{className:"font-mono text-xs",value:u,onChange:m=>v(m.target.value),placeholder:O}),e.jsx("div",{className:"mt-1 text-[11px] text-fg-5",children:t("modal.weixinDefaultBaseUrlHint")})]}),w&&e.jsxs("div",{className:"rounded-xl border border-edge bg-panel-alt p-4",children:[e.jsx("img",{src:w,alt:t("modal.weixinQrAlt"),className:"mx-auto h-56 w-56 rounded-lg bg-white p-3 object-contain"}),b&&e.jsx("div",{className:"mt-2 truncate text-center font-mono text-[10px] text-fg-5",children:b})]}),k&&e.jsx("div",{className:"text-xs",style:{color:k.ok?"var(--th-ok)":"var(--th-err)"},children:k.text})]}),e.jsxs("div",{className:"mt-6 flex justify-end gap-2",children:[e.jsx(B,{variant:"ghost",onClick:j,children:t("modal.cancel")}),e.jsx(B,{variant:"primary",disabled:g,onClick:i,children:t(g?w?"modal.validating":"modal.weixinGeneratingQr":w?"modal.weixinRetry":"modal.weixinGenerateQr")})]})]})}function ne({open:c,onClose:h}){const N=y(l=>l.state),d=y(l=>l.toast),D=y(l=>l.reload),s=y(l=>l.locale),t=a.useMemo(()=>L(s),[s]),u=N?.bot?.workdir||N?.runtimeWorkdir||"",[v,g]=a.useState(""),[p,w]=a.useState(!1),[S,b]=a.useState(0);a.useEffect(()=>{c&&(g(u),b(l=>l+1))},[c,u]);const o=a.useCallback(l=>{g(l)},[]),k=async()=>{const l=v.trim();if(!l){d(t("modal.selectDirFirst"),!1);return}w(!0);try{const n=await I.switchWorkdir(l);n.ok?(await D(),d(t("modal.switchedTo")+n.workdir),h()):d(n.error||t("modal.switchFailed"),!1)}catch{d(t("modal.switchFailed"),!1)}finally{w(!1)}};return e.jsx(W,{open:c,onClose:p?void 0:h,panelStyle:{width:"min(500px, calc(100vw - 2rem))",maxWidth:"min(500px, calc(100vw - 2rem))"},children:p?e.jsxs("div",{className:"flex flex-col items-center justify-center py-12 gap-4 animate-in",children:[e.jsxs("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",className:"animate-spin text-fg-3",style:{animationDuration:"1.2s"},children:[e.jsx("polyline",{points:"23 4 23 10 17 10"}),e.jsx("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"})]}),e.jsx("span",{className:"text-sm font-medium text-fg-3",children:t("modal.switching")}),e.jsx("span",{className:"text-xs text-fg-5 max-w-[280px] truncate",children:v})]}):e.jsxs(e.Fragment,{children:[e.jsx(q,{title:t("modal.switchWorkdir"),onClose:h}),e.jsx(V,{initialPath:u,onSelect:o,t},S),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx(B,{variant:"ghost",onClick:h,children:t("modal.cancel")}),e.jsx(B,{variant:"primary",onClick:k,children:t("modal.selectDir")})]})]})})}function re({open:c,onClose:h,onSaved:N}){const d=y(r=>r.toast),D=y(r=>r.locale),s=a.useMemo(()=>L(D),[D]),[t,u]=a.useState(null),[v,g]=a.useState(!1),[p,w]=a.useState(!1),[S,b]=a.useState(null);a.useEffect(()=>{c&&(g(!1),b(null),I.getBrowser().then(r=>{u(r),w(!!r.browser.enabled)}).catch(()=>u(null)))},[c]);const o=t?.browser,k=!!o?.enabled,l=!!o&&k!==p,n=o?.profileDir||"",T=s("ext.profileDir"),j=n,F=!!o?.chromeInstalled&&!!o?.profileCreated,i=t?o?.enabled?F?s("ext.browserReady"):o?.chromeInstalled?s("ext.chromeInstalled"):s("ext.needsSetup"):s("ext.disabled"):s("status.loading"),m=t&&o?.enabled?F?"ok":o?.chromeInstalled?"warn":"err":"muted",x=async()=>{g(!0),b(null);try{await I.saveConfig({browserEnabled:p});const r=await I.getBrowser();u(r),N?.()}catch{b({ok:!1,text:"✗ "+s("ext.browserModeSaveFailed")}),d(s("ext.browserModeSaveFailed"),!1),g(!1);return}if(!p){b({ok:!0,text:"✓ "+s("ext.browserDisabledSaved")}),d(s("ext.browserDisabledSaved")),g(!1);return}try{const r=await I.setupBrowser();if(!r.ok){b({ok:!1,text:"✗ "+(r.error||s("ext.browserLaunchFailed"))}),d(r.error||s("ext.browserLaunchFailed"),!1);return}u(f=>f?{...f,browser:r.browser}:{browser:r.browser,desktop:{enabled:!1,installed:!1,running:!1,appiumUrl:""}}),b({ok:!0,text:"✓ "+s("ext.browserEnabledLaunched")}),d(s("ext.browserEnabledLaunched")),N?.()}catch{b({ok:!1,text:"✗ "+s("ext.browserLaunchFailed")}),d(s("ext.browserLaunchFailed"),!1)}finally{g(!1)}};return e.jsxs(W,{open:c,onClose:h,children:[e.jsx(q,{title:s("ext.setupBrowser"),description:s("ext.setupBrowserDesc"),onClose:h}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(P,{variant:m,children:i}),o&&e.jsxs(e.Fragment,{children:[e.jsx(P,{variant:k?"accent":"muted",children:s(k?"ext.enabled":"ext.disabled")}),l&&e.jsx(P,{variant:"warn",children:s("ext.pendingModeChange")}),o.running&&e.jsxs(P,{variant:"accent",children:[s("ext.browserOpen"),o.pid?` · PID ${o.pid}`:""]})]})]}),e.jsxs("div",{className:"mt-3",children:[e.jsx(U,{children:T}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(G,{className:"font-mono text-xs flex-1",value:j||"—",readOnly:!0,onClick:r=>r.target.select()}),e.jsx(B,{variant:"outline",size:"sm",disabled:!j,onClick:()=>{j&&(navigator.clipboard.writeText(j),d(s("ext.step2Copied")))},children:s("ext.copyPath")})]})]}),e.jsx("div",{className:"mt-3 text-xs text-fg-5",children:s(p?"ext.profileModeDesc":"ext.browserDescDisabled")}),o?.detail&&e.jsx("div",{className:"mt-2 text-xs text-fg-5",children:o.detail}),S&&e.jsx("div",{className:"mt-3 text-xs",style:{color:S.ok?"var(--th-ok)":"var(--th-err)"},children:S.text})]}),e.jsx("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:e.jsxs("label",{className:"flex cursor-pointer items-start gap-3",children:[e.jsx("input",{type:"checkbox",checked:p,onChange:r=>w(r.target.checked),className:"mt-0.5 h-4 w-4 rounded border border-edge bg-inset"}),e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium text-fg-2 mb-1",children:s("ext.browserEnableToggle")}),e.jsx("div",{className:"text-xs text-fg-4",children:s("ext.browserEnableToggleDesc")})]})]})}),e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:[e.jsx("div",{className:"text-sm font-medium text-fg-2 mb-1",children:s(p?"ext.step2Title":"ext.browserDisabledStepTitle")}),e.jsx("div",{className:"text-xs text-fg-4",children:s(p?"ext.step2Desc":"ext.browserDisabledHint")})]})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx(B,{variant:"ghost",onClick:h,children:s("modal.cancel")}),e.jsx(B,{variant:"primary",disabled:v,onClick:x,children:s(v?"ext.launching":p?"ext.enableAndLaunchBrowser":"ext.saveBrowserDisabled")})]})]})}function ie({open:c,onClose:h,onSaved:N}){const d=y(i=>i.toast),D=y(i=>i.locale),s=a.useMemo(()=>L(D),[D]),[t,u]=a.useState(!1),[v,g]=a.useState(!1),[p,w]=a.useState(!1),[S,b]=a.useState(!1),[o,k]=a.useState(!1),[l,n]=a.useState(null);a.useEffect(()=>{c&&(u(!1),b(!1),k(!1),n(null),I.getBrowser().then(i=>{g(i.desktop.installed),w(i.desktop.enabled)}).catch(()=>{}))},[c]);const T=async()=>{u(!0),n(null);try{const i=await I.desktopInstall();i.ok?(g(!0),n({ok:!0,text:"✓ "+s("ext.desktopInstalled")}),d(s("ext.desktopInstalled"))):n({ok:!1,text:"✗ "+(i.error||s("ext.desktopInstallFailed"))})}catch{n({ok:!1,text:"✗ "+s("ext.desktopInstallFailed")})}finally{u(!1)}},j=async()=>{b(!0),n(null);try{const i=await I.desktopToggle(!0);i.ok?(w(!0),n({ok:!0,text:"✓ "+s("ext.desktopStarted")}),d(s("ext.desktopStarted")),N?.()):n({ok:!1,text:"✗ "+(i.error||s("ext.desktopInstallFailed"))})}catch{n({ok:!1,text:"✗ "+s("ext.desktopInstallFailed")})}finally{b(!1)}},F=async()=>{k(!0),n(null);try{const i=await I.desktopToggle(!1);i.ok?(w(!1),n({ok:!0,text:"✓ "+s("ext.desktopStopped")}),d(s("ext.desktopStopped")),N?.()):n({ok:!1,text:"✗ "+(i.error||s("ext.desktopInstallFailed"))})}catch{n({ok:!1,text:"✗ "+s("ext.desktopInstallFailed")})}finally{k(!1)}};return e.jsxs(W,{open:c,onClose:h,children:[e.jsx(q,{title:s("ext.setupDesktop"),description:s("ext.setupDesktopDesc"),onClose:h}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:[e.jsx("div",{className:"text-sm font-medium text-fg-2 mb-1",children:s("ext.desktopStep1Title")}),e.jsx("div",{className:"text-xs text-fg-4 mb-3",children:s("ext.desktopStep1Desc")}),l&&!v&&e.jsx("div",{className:"mb-2 text-xs",style:{color:l.ok?"var(--th-ok)":"var(--th-err)"},children:l.text}),e.jsx(B,{variant:v?"ghost":"outline",size:"sm",disabled:t||v,onClick:T,children:s(t?"ext.desktopInstalling":v?"ext.desktopStep1Done":"ext.desktopStep1Action")})]}),e.jsxs("div",{className:"rounded-lg border border-edge bg-panel-alt p-4",children:[e.jsx("div",{className:"text-sm font-medium text-fg-2 mb-1",children:s("ext.desktopStep2Title")}),e.jsx("div",{className:"text-xs text-fg-4 mb-3",children:s("ext.desktopStep2Desc")}),l&&v&&e.jsx("div",{className:"mb-2 text-xs",style:{color:l.ok?"var(--th-ok)":"var(--th-err)"},children:l.text}),e.jsx("div",{className:"flex items-center gap-2",children:p?e.jsx(B,{variant:"outline",size:"sm",disabled:o,onClick:F,children:s(o?"ext.desktopStopping":"ext.disable")}):e.jsx(B,{variant:"primary",size:"sm",disabled:!v||S,onClick:j,children:s(S?"ext.desktopStarting":"ext.desktopStep2Action")})})]})]}),e.jsx("div",{className:"flex justify-end gap-2 mt-6",children:e.jsx(B,{variant:"ghost",onClick:h,children:s("modal.cancel")})})]})}export{re as BrowserSetupModal,ie as DesktopSetupModal,ae as FeishuModal,se as TelegramModal,le as WeixinModal,ne as WorkdirModal};
@@ -1 +1 @@
1
- import{r as l,j as e}from"./react-vendor-DTcmqLiz.js";import{u,e as R,a as D,B as f,d as N}from"./index-Bbf__IXB.js";import{a as L,b as O,d as j,c as z}from"./shared-BRvVjyDB.js";import"./router-emLofBBH.js";const E=[{key:"accessibility",labelKey:"perm.accessibility",reasonZh:"允许控制桌面应用、点击和输入。",reasonEn:"Allows controlling desktop apps with clicks and typing.",guidePathKey:"perm.pathAccessibility",icon:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("circle",{cx:"12",cy:"5",r:"1.8"}),e.jsx("path",{d:"M12 7.7v10.2"}),e.jsx("path",{d:"M8.4 10h7.2"}),e.jsx("path",{d:"M9.6 19.2 12 15.1l2.4 4.1"})]})},{key:"screenRecording",labelKey:"perm.screenRecording",reasonZh:"允许读取屏幕内容,用于截图和界面分析。",reasonEn:"Allows reading the screen for screenshots and UI inspection.",guidePathKey:"perm.pathScreenRecording",icon:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"4",y:"5.5",width:"11.5",height:"10",rx:"2.4"}),e.jsx("path",{d:"m17.5 8.4 2.7-1.5v7.2l-2.7-1.5"}),e.jsx("circle",{cx:"9.75",cy:"10.5",r:"1.1",fill:"currentColor",stroke:"none"})]})},{key:"fullDiskAccess",labelKey:"perm.fullDiskAccess",reasonZh:"允许访问桌面、下载等受保护目录。",reasonEn:"Allows access to protected folders like Desktop and Downloads.",guidePathKey:"perm.pathFullDiskAccess",icon:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"6.2",y:"10.1",width:"11.6",height:"8.6",rx:"2.6"}),e.jsx("path",{d:"M9 10V7.8a3 3 0 1 1 6 0V10"}),e.jsx("circle",{cx:"12",cy:"13.5",r:"0.9",fill:"currentColor",stroke:"none"}),e.jsx("path",{d:"M12 14.6v1.8"})]})}];function K(o){return o==="zh-CN"?{introWithHost:"请在 macOS 中为 {hostApp} 开启以下权限。",intro:"请在 macOS 中开启以下权限。",status:"状态",summary:"系统位置",loading:"检查中",needsGrant:"需要授权",granted:"已授权",authorize:"授权",openSettings:"前往设置",refreshState:"刷新状态",checking:"检查中...",hostGranted:"{hostApp} 已可直接使用此权限。",hostGrantedFallback:"当前宿主应用已可直接使用此权限。",needsGrantDetail:"尚未授权,可通过右侧按钮发起系统授权。",needsSettingsDetail:"需要在系统设置中手动开启此权限。"}:{introWithHost:"Grant the following permissions to {hostApp} in macOS.",intro:"Grant the following permissions in macOS.",status:"Status",summary:"System path",loading:"Checking",needsGrant:"Needs access",granted:"Granted",authorize:"Authorize",openSettings:"Open settings",refreshState:"Refresh status",checking:"Checking...",hostGranted:"{hostApp} can use this permission now.",hostGrantedFallback:"The current host app can use this permission now.",needsGrantDetail:"Access has not been granted yet. Use the button on the right to trigger the macOS prompt.",needsSettingsDetail:"This permission needs to be enabled manually in System Settings."}}function B(){const o=u(t=>t.state),d=u(t=>t.locale),h=u(t=>t.reload),i=u(t=>t.toast),a=l.useMemo(()=>R(d),[d]),s=K(d),g=o?.permissions||{},p=o?.hostApp||null,c=!o,[m,x]=l.useState(null),S=l.useMemo(()=>E.map(t=>({...t,permission:g[t.key]})),[g]),b=l.useCallback(async t=>{if(!m){x(t);try{const n=await D.requestPermission(t);if(!n.ok){i(n.error||a("perm.requestFailed"),!1);return}n.action==="already_granted"?i(a("perm.alreadyGranted")):n.action==="prompted"?i(a("perm.promptOpened")):i(a("perm.settingsOpened")),await h()}catch(n){i(n instanceof Error?n.message:a("perm.requestFailed"),!1)}finally{x(n=>n===t?null:n)}}},[h,m,a,i]),k=l.useCallback(async()=>{await h()},[h]);return e.jsxs("div",{className:"animate-in space-y-3",children:[e.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between",children:[e.jsx("div",{className:"min-w-0 flex-1",children:e.jsx("div",{className:"text-[13px] leading-relaxed text-fg-4",children:p?s.introWithHost.replace("{hostApp}",p):s.intro})}),e.jsx(f,{variant:"outline",size:"sm",onClick:()=>{k()},children:s.refreshState})]}),S.map(t=>{const n=t.permission,r=!!n?.granted,y=!!n&&n.checkable,w=c?s.loading:n&&r?s.granted:s.needsGrant,v=c?"muted":r?"ok":"warn",A=c?s.loading:r?p?s.hostGranted.replace("{hostApp}",p):s.hostGrantedFallback:y?s.needsGrantDetail:s.needsSettingsDetail,G=c?s.checking:r?s.refreshState:y?s.authorize:s.openSettings,C=r?k:()=>{b(t.key)};return e.jsxs(L,{children:[e.jsx(O,{icon:t.icon,title:a(t.labelKey),subtitle:d==="zh-CN"?t.reasonZh:t.reasonEn}),e.jsxs(j,{label:s.status,children:[e.jsx("div",{className:"flex flex-wrap items-center gap-1.5",children:e.jsx(N,{variant:v,children:w})}),e.jsx("div",{className:"mt-1 text-[13px] leading-relaxed text-fg-3",children:A})]}),e.jsx(j,{label:s.summary,children:e.jsx("div",{className:"break-words text-[13px] leading-relaxed text-fg-3",children:a(t.guidePathKey)})}),e.jsx(z,{children:e.jsx(f,{variant:r?"outline":"primary",size:"sm",disabled:c||!!m,onClick:C,children:m===t.key?s.checking:G})})]},t.key)})]})}export{B as PermissionsTab};
1
+ import{r as l,j as e}from"./react-vendor-DTcmqLiz.js";import{u,e as R,a as D,B as f,d as N}from"./index-BFtrf-rI.js";import{a as L,b as O,d as j,c as z}from"./shared-CHbIVrko.js";import"./router-emLofBBH.js";const E=[{key:"accessibility",labelKey:"perm.accessibility",reasonZh:"允许控制桌面应用、点击和输入。",reasonEn:"Allows controlling desktop apps with clicks and typing.",guidePathKey:"perm.pathAccessibility",icon:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("circle",{cx:"12",cy:"5",r:"1.8"}),e.jsx("path",{d:"M12 7.7v10.2"}),e.jsx("path",{d:"M8.4 10h7.2"}),e.jsx("path",{d:"M9.6 19.2 12 15.1l2.4 4.1"})]})},{key:"screenRecording",labelKey:"perm.screenRecording",reasonZh:"允许读取屏幕内容,用于截图和界面分析。",reasonEn:"Allows reading the screen for screenshots and UI inspection.",guidePathKey:"perm.pathScreenRecording",icon:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"4",y:"5.5",width:"11.5",height:"10",rx:"2.4"}),e.jsx("path",{d:"m17.5 8.4 2.7-1.5v7.2l-2.7-1.5"}),e.jsx("circle",{cx:"9.75",cy:"10.5",r:"1.1",fill:"currentColor",stroke:"none"})]})},{key:"fullDiskAccess",labelKey:"perm.fullDiskAccess",reasonZh:"允许访问桌面、下载等受保护目录。",reasonEn:"Allows access to protected folders like Desktop and Downloads.",guidePathKey:"perm.pathFullDiskAccess",icon:e.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"6.2",y:"10.1",width:"11.6",height:"8.6",rx:"2.6"}),e.jsx("path",{d:"M9 10V7.8a3 3 0 1 1 6 0V10"}),e.jsx("circle",{cx:"12",cy:"13.5",r:"0.9",fill:"currentColor",stroke:"none"}),e.jsx("path",{d:"M12 14.6v1.8"})]})}];function K(o){return o==="zh-CN"?{introWithHost:"请在 macOS 中为 {hostApp} 开启以下权限。",intro:"请在 macOS 中开启以下权限。",status:"状态",summary:"系统位置",loading:"检查中",needsGrant:"需要授权",granted:"已授权",authorize:"授权",openSettings:"前往设置",refreshState:"刷新状态",checking:"检查中...",hostGranted:"{hostApp} 已可直接使用此权限。",hostGrantedFallback:"当前宿主应用已可直接使用此权限。",needsGrantDetail:"尚未授权,可通过右侧按钮发起系统授权。",needsSettingsDetail:"需要在系统设置中手动开启此权限。"}:{introWithHost:"Grant the following permissions to {hostApp} in macOS.",intro:"Grant the following permissions in macOS.",status:"Status",summary:"System path",loading:"Checking",needsGrant:"Needs access",granted:"Granted",authorize:"Authorize",openSettings:"Open settings",refreshState:"Refresh status",checking:"Checking...",hostGranted:"{hostApp} can use this permission now.",hostGrantedFallback:"The current host app can use this permission now.",needsGrantDetail:"Access has not been granted yet. Use the button on the right to trigger the macOS prompt.",needsSettingsDetail:"This permission needs to be enabled manually in System Settings."}}function B(){const o=u(t=>t.state),d=u(t=>t.locale),h=u(t=>t.reload),i=u(t=>t.toast),a=l.useMemo(()=>R(d),[d]),s=K(d),g=o?.permissions||{},p=o?.hostApp||null,c=!o,[m,x]=l.useState(null),S=l.useMemo(()=>E.map(t=>({...t,permission:g[t.key]})),[g]),b=l.useCallback(async t=>{if(!m){x(t);try{const n=await D.requestPermission(t);if(!n.ok){i(n.error||a("perm.requestFailed"),!1);return}n.action==="already_granted"?i(a("perm.alreadyGranted")):n.action==="prompted"?i(a("perm.promptOpened")):i(a("perm.settingsOpened")),await h()}catch(n){i(n instanceof Error?n.message:a("perm.requestFailed"),!1)}finally{x(n=>n===t?null:n)}}},[h,m,a,i]),k=l.useCallback(async()=>{await h()},[h]);return e.jsxs("div",{className:"animate-in space-y-3",children:[e.jsxs("div",{className:"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between",children:[e.jsx("div",{className:"min-w-0 flex-1",children:e.jsx("div",{className:"text-[13px] leading-relaxed text-fg-4",children:p?s.introWithHost.replace("{hostApp}",p):s.intro})}),e.jsx(f,{variant:"outline",size:"sm",onClick:()=>{k()},children:s.refreshState})]}),S.map(t=>{const n=t.permission,r=!!n?.granted,y=!!n&&n.checkable,w=c?s.loading:n&&r?s.granted:s.needsGrant,v=c?"muted":r?"ok":"warn",A=c?s.loading:r?p?s.hostGranted.replace("{hostApp}",p):s.hostGrantedFallback:y?s.needsGrantDetail:s.needsSettingsDetail,G=c?s.checking:r?s.refreshState:y?s.authorize:s.openSettings,C=r?k:()=>{b(t.key)};return e.jsxs(L,{children:[e.jsx(O,{icon:t.icon,title:a(t.labelKey),subtitle:d==="zh-CN"?t.reasonZh:t.reasonEn}),e.jsxs(j,{label:s.status,children:[e.jsx("div",{className:"flex flex-wrap items-center gap-1.5",children:e.jsx(N,{variant:v,children:w})}),e.jsx("div",{className:"mt-1 text-[13px] leading-relaxed text-fg-3",children:A})]}),e.jsx(j,{label:s.summary,children:e.jsx("div",{className:"break-words text-[13px] leading-relaxed text-fg-3",children:a(t.guidePathKey)})}),e.jsx(z,{children:e.jsx(f,{variant:r?"outline":"primary",size:"sm",disabled:c||!!m,onClick:C,children:m===t.key?s.checking:G})})]},t.key)})]})}export{B as PermissionsTab};
@@ -1 +1 @@
1
- import{r as s,j as e,b as H}from"./react-vendor-DTcmqLiz.js";import{c}from"./index-Bbf__IXB.js";function _(u,h){return!!(u&&h instanceof Node&&u.contains(h))}function M({value:u,options:h,onChange:y,className:w,placeholder:a="—",disabled:x=!1,readOnly:p=!1}){const f=h.find(n=>n.value===u),m=p||h.length<=1,[i,g]=s.useState(!1),[t,l]=s.useState(null),o=s.useRef(null),j=s.useRef(null);if(s.useEffect(()=>{if(!i)return;const n=d=>{_(o.current,d.target)||_(j.current,d.target)||g(!1)},r=d=>{d.key==="Escape"&&g(!1)};return document.addEventListener("mousedown",n),document.addEventListener("keydown",r),()=>{document.removeEventListener("mousedown",n),document.removeEventListener("keydown",r)}},[i]),s.useLayoutEffect(()=>{if(!i)return;const n=()=>{const r=o.current;if(!r)return;const d=r.getBoundingClientRect(),k=window.innerHeight-d.bottom-12,E=d.top-12,N=k<220&&E>k,L=Math.max(140,Math.min(260,N?E:k));l({left:d.left,top:N?Math.max(12,d.top-L-8):d.bottom+8,width:d.width,maxHeight:L})};return n(),window.addEventListener("resize",n),window.addEventListener("scroll",n,!0),()=>{window.removeEventListener("resize",n),window.removeEventListener("scroll",n,!0)}},[i]),m)return e.jsx("div",{className:c("flex h-8 w-full items-center rounded-md border border-edge bg-panel-alt px-2.5 text-[13px] text-fg-3 shadow-[inset_0_1px_0_var(--th-inset-hl),0_1px_2px_rgba(15,23,42,0.05)]",x&&"cursor-not-allowed opacity-50",w),children:e.jsx("span",{className:c("truncate",!f&&"text-fg-5"),children:f?.label||a})});const v=n=>{x||(y(n),g(!1))},b=i&&t?H.createPortal(e.jsx("div",{ref:j,role:"listbox",className:"fixed z-[220] overflow-hidden rounded-xl border border-edge-h bg-[var(--th-dropdown)] p-1.5 shadow-[0_24px_64px_rgba(2,6,23,0.22)] backdrop-blur-xl",style:{left:t.left,top:t.top,width:t.width},children:e.jsx("div",{className:"overflow-y-auto",style:{maxHeight:t.maxHeight},children:h.map(n=>{const r=n.value===u;return e.jsxs("button",{type:"button",role:"option","aria-selected":r,onClick:()=>v(n.value),className:c("flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-[13px] transition-colors duration-200",r?"bg-panel text-fg shadow-[inset_0_1px_0_rgba(255,255,255,0.03)]":"text-fg-3 hover:bg-panel-alt hover:text-fg-2"),children:[e.jsx("span",{className:"min-w-0 flex-1 truncate",children:n.label}),r&&e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"shrink-0 text-fg-4",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})})]},n.value)})})}),document.body):null;return e.jsxs("div",{ref:o,className:c("relative",w),children:[e.jsxs("button",{type:"button",disabled:x,"aria-haspopup":"listbox","aria-expanded":i,onClick:()=>g(n=>!n),className:c("flex h-8 w-full items-center rounded-md border border-edge bg-inset px-2.5 pr-8 text-left text-[13px] text-fg shadow-[inset_0_1px_0_var(--th-inset-hl),0_1px_2px_rgba(15,23,42,0.05)]","transition-[border-color,box-shadow,background] duration-200 outline-none","hover:border-edge-h hover:bg-panel","focus-visible:border-edge-h focus-visible:shadow-[0_0_0_4px_var(--th-glow-a)]","disabled:cursor-not-allowed disabled:opacity-50",i&&"border-edge-h bg-panel shadow-[0_0_0_4px_var(--th-glow-a)]"),children:[e.jsx("span",{className:c("min-w-0 flex-1 truncate",!f&&"text-fg-5"),children:f?.label||a}),e.jsx("span",{className:c("pointer-events-none absolute inset-y-0 right-3 flex items-center text-fg-4 transition-transform duration-200",i&&"rotate-180"),children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})})]}),b]})}function B({value:u,options:h,onChange:y,renderIcon:w}){const[a,x]=s.useState(!1),[p,f]=s.useState(null),m=s.useRef(null),i=s.useRef(null);s.useEffect(()=>{if(!a)return;const t=o=>{_(m.current,o.target)||_(i.current,o.target)||x(!1)},l=o=>{o.key==="Escape"&&x(!1)};return document.addEventListener("mousedown",t),document.addEventListener("keydown",l),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("keydown",l)}},[a]),s.useLayoutEffect(()=>{if(!a)return;const t=()=>{const l=m.current;if(!l)return;const o=l.getBoundingClientRect(),v=window.innerHeight-o.bottom-12,b=o.top-12,n=v<220&&b>v,r=Math.max(140,Math.min(260,n?b:v));f({left:o.left,top:n?Math.max(12,o.top-r-8):o.bottom+8,width:Math.max(o.width,160),maxHeight:r})};return t(),window.addEventListener("resize",t),window.addEventListener("scroll",t,!0),()=>{window.removeEventListener("resize",t),window.removeEventListener("scroll",t,!0)}},[a]);const g=a&&p?H.createPortal(e.jsx("div",{ref:i,role:"listbox",className:"fixed z-[220] overflow-hidden rounded-xl border border-edge-h bg-[var(--th-dropdown)] p-1.5 shadow-[0_24px_64px_rgba(2,6,23,0.22)] backdrop-blur-xl",style:{left:p.left,top:p.top,width:p.width},children:e.jsx("div",{className:"overflow-y-auto",style:{maxHeight:p.maxHeight},children:h.map(t=>{const l=t.value===u;return e.jsxs("button",{type:"button",role:"option","aria-selected":l,onClick:()=>{y(t.value),x(!1)},className:c("flex w-full items-center gap-2.5 rounded-lg px-2.5 py-2 text-left text-[13px] transition-colors duration-200",l?"bg-panel text-fg shadow-[inset_0_1px_0_rgba(255,255,255,0.03)]":"text-fg-3 hover:bg-panel-alt hover:text-fg-2"),children:[w(t.value),e.jsx("span",{className:"min-w-0 flex-1 truncate",children:t.label}),l&&e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"shrink-0 text-fg-4",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})})]},t.value)})})}),document.body):null;return e.jsxs("div",{ref:m,className:"relative shrink-0",children:[e.jsxs("button",{type:"button","aria-haspopup":"listbox","aria-expanded":a,onClick:()=>x(t=>!t),className:c("inline-flex items-center gap-1.5 rounded-lg border border-edge bg-inset px-2 py-1.5","transition-[border-color,box-shadow,background] duration-200 outline-none","hover:border-edge-h hover:bg-panel","focus-visible:border-edge-h focus-visible:shadow-[0_0_0_4px_var(--th-glow-a)]",a&&"border-edge-h bg-panel shadow-[0_0_0_4px_var(--th-glow-a)]"),children:[w(u),e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:c("text-fg-5 transition-transform duration-200",a&&"rotate-180"),children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),g]})}export{B as I,M as S};
1
+ import{r as s,j as e,b as H}from"./react-vendor-DTcmqLiz.js";import{c}from"./index-BFtrf-rI.js";function _(u,h){return!!(u&&h instanceof Node&&u.contains(h))}function M({value:u,options:h,onChange:y,className:w,placeholder:a="—",disabled:x=!1,readOnly:p=!1}){const f=h.find(n=>n.value===u),m=p||h.length<=1,[i,g]=s.useState(!1),[t,l]=s.useState(null),o=s.useRef(null),j=s.useRef(null);if(s.useEffect(()=>{if(!i)return;const n=d=>{_(o.current,d.target)||_(j.current,d.target)||g(!1)},r=d=>{d.key==="Escape"&&g(!1)};return document.addEventListener("mousedown",n),document.addEventListener("keydown",r),()=>{document.removeEventListener("mousedown",n),document.removeEventListener("keydown",r)}},[i]),s.useLayoutEffect(()=>{if(!i)return;const n=()=>{const r=o.current;if(!r)return;const d=r.getBoundingClientRect(),k=window.innerHeight-d.bottom-12,E=d.top-12,N=k<220&&E>k,L=Math.max(140,Math.min(260,N?E:k));l({left:d.left,top:N?Math.max(12,d.top-L-8):d.bottom+8,width:d.width,maxHeight:L})};return n(),window.addEventListener("resize",n),window.addEventListener("scroll",n,!0),()=>{window.removeEventListener("resize",n),window.removeEventListener("scroll",n,!0)}},[i]),m)return e.jsx("div",{className:c("flex h-8 w-full items-center rounded-md border border-edge bg-panel-alt px-2.5 text-[13px] text-fg-3 shadow-[inset_0_1px_0_var(--th-inset-hl),0_1px_2px_rgba(15,23,42,0.05)]",x&&"cursor-not-allowed opacity-50",w),children:e.jsx("span",{className:c("truncate",!f&&"text-fg-5"),children:f?.label||a})});const v=n=>{x||(y(n),g(!1))},b=i&&t?H.createPortal(e.jsx("div",{ref:j,role:"listbox",className:"fixed z-[220] overflow-hidden rounded-xl border border-edge-h bg-[var(--th-dropdown)] p-1.5 shadow-[0_24px_64px_rgba(2,6,23,0.22)] backdrop-blur-xl",style:{left:t.left,top:t.top,width:t.width},children:e.jsx("div",{className:"overflow-y-auto",style:{maxHeight:t.maxHeight},children:h.map(n=>{const r=n.value===u;return e.jsxs("button",{type:"button",role:"option","aria-selected":r,onClick:()=>v(n.value),className:c("flex w-full items-center gap-2 rounded-lg px-3 py-2 text-left text-[13px] transition-colors duration-200",r?"bg-panel text-fg shadow-[inset_0_1px_0_rgba(255,255,255,0.03)]":"text-fg-3 hover:bg-panel-alt hover:text-fg-2"),children:[e.jsx("span",{className:"min-w-0 flex-1 truncate",children:n.label}),r&&e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"shrink-0 text-fg-4",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})})]},n.value)})})}),document.body):null;return e.jsxs("div",{ref:o,className:c("relative",w),children:[e.jsxs("button",{type:"button",disabled:x,"aria-haspopup":"listbox","aria-expanded":i,onClick:()=>g(n=>!n),className:c("flex h-8 w-full items-center rounded-md border border-edge bg-inset px-2.5 pr-8 text-left text-[13px] text-fg shadow-[inset_0_1px_0_var(--th-inset-hl),0_1px_2px_rgba(15,23,42,0.05)]","transition-[border-color,box-shadow,background] duration-200 outline-none","hover:border-edge-h hover:bg-panel","focus-visible:border-edge-h focus-visible:shadow-[0_0_0_4px_var(--th-glow-a)]","disabled:cursor-not-allowed disabled:opacity-50",i&&"border-edge-h bg-panel shadow-[0_0_0_4px_var(--th-glow-a)]"),children:[e.jsx("span",{className:c("min-w-0 flex-1 truncate",!f&&"text-fg-5"),children:f?.label||a}),e.jsx("span",{className:c("pointer-events-none absolute inset-y-0 right-3 flex items-center text-fg-4 transition-transform duration-200",i&&"rotate-180"),children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})})]}),b]})}function B({value:u,options:h,onChange:y,renderIcon:w}){const[a,x]=s.useState(!1),[p,f]=s.useState(null),m=s.useRef(null),i=s.useRef(null);s.useEffect(()=>{if(!a)return;const t=o=>{_(m.current,o.target)||_(i.current,o.target)||x(!1)},l=o=>{o.key==="Escape"&&x(!1)};return document.addEventListener("mousedown",t),document.addEventListener("keydown",l),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("keydown",l)}},[a]),s.useLayoutEffect(()=>{if(!a)return;const t=()=>{const l=m.current;if(!l)return;const o=l.getBoundingClientRect(),v=window.innerHeight-o.bottom-12,b=o.top-12,n=v<220&&b>v,r=Math.max(140,Math.min(260,n?b:v));f({left:o.left,top:n?Math.max(12,o.top-r-8):o.bottom+8,width:Math.max(o.width,160),maxHeight:r})};return t(),window.addEventListener("resize",t),window.addEventListener("scroll",t,!0),()=>{window.removeEventListener("resize",t),window.removeEventListener("scroll",t,!0)}},[a]);const g=a&&p?H.createPortal(e.jsx("div",{ref:i,role:"listbox",className:"fixed z-[220] overflow-hidden rounded-xl border border-edge-h bg-[var(--th-dropdown)] p-1.5 shadow-[0_24px_64px_rgba(2,6,23,0.22)] backdrop-blur-xl",style:{left:p.left,top:p.top,width:p.width},children:e.jsx("div",{className:"overflow-y-auto",style:{maxHeight:p.maxHeight},children:h.map(t=>{const l=t.value===u;return e.jsxs("button",{type:"button",role:"option","aria-selected":l,onClick:()=>{y(t.value),x(!1)},className:c("flex w-full items-center gap-2.5 rounded-lg px-2.5 py-2 text-left text-[13px] transition-colors duration-200",l?"bg-panel text-fg shadow-[inset_0_1px_0_rgba(255,255,255,0.03)]":"text-fg-3 hover:bg-panel-alt hover:text-fg-2"),children:[w(t.value),e.jsx("span",{className:"min-w-0 flex-1 truncate",children:t.label}),l&&e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"shrink-0 text-fg-4",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})})]},t.value)})})}),document.body):null;return e.jsxs("div",{ref:m,className:"relative shrink-0",children:[e.jsxs("button",{type:"button","aria-haspopup":"listbox","aria-expanded":a,onClick:()=>x(t=>!t),className:c("inline-flex items-center gap-1.5 rounded-lg border border-edge bg-inset px-2 py-1.5","transition-[border-color,box-shadow,background] duration-200 outline-none","hover:border-edge-h hover:bg-panel","focus-visible:border-edge-h focus-visible:shadow-[0_0_0_4px_var(--th-glow-a)]",a&&"border-edge-h bg-panel shadow-[0_0_0_4px_var(--th-glow-a)]"),children:[w(u),e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:c("text-fg-5 transition-transform duration-200",a&&"rotate-180"),children:e.jsx("polyline",{points:"6 9 12 15 18 9"})})]}),g]})}export{B as I,M as S};
@@ -1 +1 @@
1
- import{r as t,j as s}from"./react-vendor-DTcmqLiz.js";import{u as he,e as He,g as Ne,s as Ce,a as E,S as pe,l as J}from"./index-Bbf__IXB.js";import{l as Me,n as Se,m as we,a as De,p as Pe,u as Ue,b as _e,T as $e,U as Ae,c as qe,d as xe,L as Be,I as Qe}from"./index-Bvi7jk1E.js";import"./router-emLofBBH.js";import"./Select-DBMtcZku.js";import"./Modal-utaCOq7k.js";import"./BrandIcon-BAXeIuGD.js";import"./DirBrowser-HtXAEFE-.js";import"./markdown-iTdiLvRJ.js";import"./shared-BRvVjyDB.js";import"./ExtensionsTab-RVDkgg0j.js";const Z=12,Te=160,Ke=96,Xe=20,R=new Map;function ze(v,r){return`${v}:${r}`}function Fe(v,r){for(R.delete(v),R.set(v,r);R.size>Xe;)R.delete(R.keys().next().value)}const lt=t.memo(function({session:r,workdir:d,active:ee=!0,onSessionChange:_,initialPendingPrompt:p,onPendingPromptConsumed:te}){const re=he(e=>e.locale),Re=he(e=>e.agentStatus?.agents?.find(n=>n.agent===r.agent)?.selectedEffort??null),$=r.thinkingEffort||Re,m=t.useMemo(()=>He(re),[re]),A=Ne(r.agent||""),ne=Ce(r),[a,q]=t.useState(null),[B,se]=t.useState(!p),[y,le]=t.useState(!1),[c,I]=t.useState(null),[H,O]=t.useState(!1),[ve,Q]=t.useState(null),[ye,ae]=t.useState(0),[Ie,K]=t.useState(null),[Oe,N]=t.useState(null),[u,ue]=t.useState(p||null),[k,ce]=t.useState([]),[ke,X]=t.useState(!1),[be,oe]=t.useState(null),z=t.useRef([]),fe=t.useRef(c),ie=t.useRef(H);fe.current=c,ie.current=H;const h=t.useRef(null),C=t.useRef(null),S=t.useRef(!0),x=t.useRef(!1),F=t.useRef(!1),G=t.useRef(!1),b=t.useRef(!!p),j=t.useRef(!1),M=t.useRef(!1),V=t.useRef(!1),W=t.useRef(!1);t.useEffect(()=>{V.current||!p||(V.current=!0,ae(e=>e+1),te?.())},[p,te]);const i=t.useCallback(()=>{ue(null),ce(e=>{for(const n of e)URL.revokeObjectURL(n);return[]}),z.current=[],X(!1)},[]),de=t.useCallback((e,n)=>{for(const f of z.current)URL.revokeObjectURL(f);ue(e||null);const l=n||[];ce(l),z.current=l,X(!!fe.current||ie.current)},[]),w=t.useCallback(async(e,n={})=>{try{const l=await Me({workdir:d,agent:r.agent||"",sessionId:r.sessionId,rich:!0,turnOffset:e.turnOffset,turnLimit:e.turnLimit,lastNTurns:e.lastNTurns},{force:n.force});return l.ok?Se(l):null}catch{return null}},[d,r.agent,r.sessionId]),o=t.useCallback(async({keepOlder:e,force:n=!1,scrollToBottom:l=!1})=>{if(F.current)return!1;F.current=!0;try{const f=await w({turnOffset:0,turnLimit:Z},{force:n});return f?(l&&(x.current=!0),q(me=>!me||!e?f:we(me,f)),j.current&&(j.current=!1,i()),M.current&&(M.current=!1,I(null)),!0):!1}finally{F.current=!1}},[w,i]),D=t.useCallback(async()=>{if(!a?.hasOlder||G.current)return;const e=h.current;e&&(C.current={scrollHeight:e.scrollHeight,scrollTop:e.scrollTop}),G.current=!0,le(!0);try{const n=await w({turnOffset:Math.max(0,a.totalTurns-a.startTurn),turnLimit:Z});n?q(l=>l?De(l,n):n):C.current=null}finally{G.current=!1,le(!1)}},[w,a]),P=t.useRef(null),T=t.useCallback(e=>{if(e?.sessionId&&e.sessionId!==r.sessionId&&(W.current=!0,Y.current=`${r.agent}:${e.sessionId}`,_?.({agent:r.agent||"",sessionId:e.sessionId,workdir:d})),!e){const n=P.current;O(!1),n==="streaming"?(j.current=!0,M.current=!0,o({keepOlder:!0,force:!0,scrollToBottom:S.current})):I(null),n==="done"?i():n===null&&b.current&&o({keepOlder:!0,force:!0}),b.current=!1,K(null),Q(null),N(null),P.current=null;return}Q(e.phase),K(e.taskId||null),N(e.queuedTaskId||null),e.phase==="streaming"?(I({phase:"streaming",text:e.text||"",thinking:e.thinking||"",activity:e.activity,plan:e.plan??null}),O(!0),e.queuedTaskId||X(!1),S.current&&(x.current=!0)):e.phase==="queued"?(I(null),O(!1)):e.phase==="done"&&(O(!1),P.current!=="done"&&(e.queuedTaskId||(j.current=!0),M.current=!0,o({keepOlder:!0,force:!0,scrollToBottom:S.current})),e.queuedTaskId||(b.current=!1)),P.current=e.phase},[i,o,r.sessionId,r.agent,_,d]),ge=t.useCallback(()=>{b.current=!0,ae(e=>e+1)},[]),je=t.useCallback(async e=>{try{await E.recallSessionMessage(e),i(),N(n=>n===e?null:n),K(n=>n===e?null:n)}catch{}},[i]),Le=t.useCallback(async e=>{try{await E.steerSession(e)}catch{}},[]),U=ze(r.agent||"",r.sessionId);t.useEffect(()=>{if(W.current){W.current=!1,o({keepOlder:!0,force:!0});return}let e=!1;const n=Pe({workdir:d,agent:r.agent||"",sessionId:r.sessionId,rich:!0,turnOffset:0,turnLimit:Z},{allowStale:!0}),l=!!p&&!V.current,f=n?.ok?Se(n):R.get(U)||null;return se(l?!1:!f),q(f),I(null),O(!1),Q(null),N(null),S.current=!0,x.current=!0,l||o({keepOlder:!1,force:!0}).finally(()=>{e||se(!1)}),()=>{e=!0}},[o,r.agent,r.sessionId,d,U]),t.useEffect(()=>{a&&a.turns.length>0&&Fe(U,a)},[U,a]),t.useEffect(()=>{ee&&o({keepOlder:!0,force:!0})},[ee,o]);const Y=t.useRef(`${r.agent}:${r.sessionId}`);Y.current=`${r.agent}:${r.sessionId}`,Ue("stream-update",t.useCallback(e=>{e.key===Y.current&&T(e.snapshot??null)},[T])),t.useEffect(()=>{let e=!0;return E.getSessionStreamState(r.agent||"",r.sessionId).then(n=>{e&&T(n.state)}).catch(()=>{}),()=>{e=!1}},[T,r.agent,r.sessionId,ye]),_e(t.useCallback(()=>{E.getSessionStreamState(r.agent||"",r.sessionId).then(e=>{T(e.state)}).catch(()=>{}),o({keepOlder:!0,force:!0})},[T,r.agent,r.sessionId,o])),t.useEffect(()=>{ne!=="running"&&!H&&!c&&(i(),b.current=!1)},[ne,H,c,i]),t.useLayoutEffect(()=>{const e=C.current,n=h.current;!e||!n||(C.current=null,n.scrollTop=e.scrollTop+(n.scrollHeight-e.scrollHeight))},[a?.turns.length]),t.useLayoutEffect(()=>{if(!x.current)return;const e=h.current;e&&(x.current=!1,e.scrollTop=e.scrollHeight,requestAnimationFrame(()=>{S.current&&(e.scrollTop=e.scrollHeight)}))},[a,c]),t.useLayoutEffect(()=>{if(!u)return;const e=h.current;e&&(e.scrollTop=e.scrollHeight)},[u]),t.useEffect(()=>{if(!a?.hasOlder||B||y)return;const e=h.current;e&&e.scrollHeight<=e.clientHeight+Te&&D()},[a?.hasOlder,a?.turns.length,D,B,y]);const Ee=t.useCallback(()=>{const e=h.current;if(!e)return;const n=e.scrollHeight-e.scrollTop-e.clientHeight;S.current=n<=Ke,e.scrollTop<=Te&&D()},[D]),g=a?.turns||[],L=t.useMemo(()=>{if(!c||!g.length)return g;const e=g[g.length-1];return!e.assistant||u&&e.user?.text?.trim()!==u.trim()?g:[...g.slice(0,-1),{...e,assistant:null}]},[g,c,u]);return s.jsxs("div",{className:"flex flex-col h-full overflow-hidden",children:[s.jsx("div",{ref:h,onScroll:Ee,className:"flex-1 overflow-y-auto overscroll-contain",children:B?s.jsx("div",{className:"flex items-center justify-center py-20",children:s.jsx(pe,{className:"h-5 w-5 text-fg-4"})}):L.length===0&&!u&&!k.length&&!c?s.jsx("div",{className:"py-20 text-center text-[13px] text-fg-5",children:m("hub.noMessages")}):s.jsxs("div",{className:"max-w-[900px] mx-auto px-6 py-6 space-y-0",children:[(a?.hasOlder||y)&&s.jsxs("div",{className:"mb-4 flex items-center justify-center gap-2 text-[11px] text-fg-5",children:[y?s.jsx(pe,{className:"h-3 w-3 text-fg-5"}):s.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-fg-5/35"}),s.jsx("span",{children:m(y?"hub.loadingOlderTurns":"hub.loadOlderTurnsHint")})]}),L.map((e,n)=>s.jsx($e,{turn:e,agent:r.agent||"",meta:A,model:r.model?J(r.model):void 0,effort:$,t:m,onResend:l=>{x.current=!0,de(l),E.sendSessionMessage(d,r.agent||"",r.sessionId,l).then(f=>{f.ok&&ge()}).catch(()=>{i()})},onEdit:l=>oe(l)},`${a?.startTurn||0}:${n}`)),(u||k.length>0)&&!ke&&!j.current&&!(u&&L.length>0&&L[L.length-1]?.user?.text?.trim()===u.trim())&&s.jsxs("div",{className:"session-turn",children:[s.jsx(Ae,{text:u||"",blocks:k.map(e=>({type:"image",content:e})),t:m}),!c&&s.jsx("div",{className:"mt-3 mb-5 animate-in",children:s.jsx(qe,{className:"text-fg-5"})})]}),c&&s.jsxs("div",{className:"mb-6",children:[!u&&!k.length&&s.jsx(xe,{agent:r.agent||"",meta:A,model:r.model?J(r.model):void 0,effort:$}),(u||k.length>0)&&s.jsx(xe,{agent:r.agent||"",meta:A,model:r.model?J(r.model):void 0,effort:$}),s.jsx(Be,{stream:c,t:m})]}),s.jsx("div",{className:"h-4"})]})}),s.jsx(Qe,{session:r,workdir:d,onStreamQueued:ge,onSendStart:de,onSessionChange:_,t:m,streamPhase:ve,streamTaskId:Ie,queuedTaskId:Oe,pendingPrompt:u,onRecall:je,onSteer:Le,editDraft:be,onEditDraftConsumed:()=>oe(null)})]})});export{lt as SessionPanel};
1
+ import{r as t,j as s}from"./react-vendor-DTcmqLiz.js";import{u as he,e as He,g as Ne,s as Ce,a as E,S as pe,l as J}from"./index-BFtrf-rI.js";import{l as Me,n as Se,m as we,a as De,p as Pe,u as Ue,b as _e,T as $e,U as Ae,c as qe,d as xe,L as Be,I as Qe}from"./index-LJda-MTD.js";import"./router-emLofBBH.js";import"./Select-CoN6w4C5.js";import"./Modal-CQ3_xUJW.js";import"./BrandIcon-DHNapeU6.js";import"./DirBrowser-rl1DwWxj.js";import"./markdown-iTdiLvRJ.js";import"./shared-CHbIVrko.js";import"./ExtensionsTab-BAsjoDaY.js";const Z=12,Te=160,Ke=96,Xe=20,R=new Map;function ze(v,r){return`${v}:${r}`}function Fe(v,r){for(R.delete(v),R.set(v,r);R.size>Xe;)R.delete(R.keys().next().value)}const lt=t.memo(function({session:r,workdir:d,active:ee=!0,onSessionChange:_,initialPendingPrompt:p,onPendingPromptConsumed:te}){const re=he(e=>e.locale),Re=he(e=>e.agentStatus?.agents?.find(n=>n.agent===r.agent)?.selectedEffort??null),$=r.thinkingEffort||Re,m=t.useMemo(()=>He(re),[re]),A=Ne(r.agent||""),ne=Ce(r),[a,q]=t.useState(null),[B,se]=t.useState(!p),[y,le]=t.useState(!1),[c,I]=t.useState(null),[H,O]=t.useState(!1),[ve,Q]=t.useState(null),[ye,ae]=t.useState(0),[Ie,K]=t.useState(null),[Oe,N]=t.useState(null),[u,ue]=t.useState(p||null),[k,ce]=t.useState([]),[ke,X]=t.useState(!1),[be,oe]=t.useState(null),z=t.useRef([]),fe=t.useRef(c),ie=t.useRef(H);fe.current=c,ie.current=H;const h=t.useRef(null),C=t.useRef(null),S=t.useRef(!0),x=t.useRef(!1),F=t.useRef(!1),G=t.useRef(!1),b=t.useRef(!!p),j=t.useRef(!1),M=t.useRef(!1),V=t.useRef(!1),W=t.useRef(!1);t.useEffect(()=>{V.current||!p||(V.current=!0,ae(e=>e+1),te?.())},[p,te]);const i=t.useCallback(()=>{ue(null),ce(e=>{for(const n of e)URL.revokeObjectURL(n);return[]}),z.current=[],X(!1)},[]),de=t.useCallback((e,n)=>{for(const f of z.current)URL.revokeObjectURL(f);ue(e||null);const l=n||[];ce(l),z.current=l,X(!!fe.current||ie.current)},[]),w=t.useCallback(async(e,n={})=>{try{const l=await Me({workdir:d,agent:r.agent||"",sessionId:r.sessionId,rich:!0,turnOffset:e.turnOffset,turnLimit:e.turnLimit,lastNTurns:e.lastNTurns},{force:n.force});return l.ok?Se(l):null}catch{return null}},[d,r.agent,r.sessionId]),o=t.useCallback(async({keepOlder:e,force:n=!1,scrollToBottom:l=!1})=>{if(F.current)return!1;F.current=!0;try{const f=await w({turnOffset:0,turnLimit:Z},{force:n});return f?(l&&(x.current=!0),q(me=>!me||!e?f:we(me,f)),j.current&&(j.current=!1,i()),M.current&&(M.current=!1,I(null)),!0):!1}finally{F.current=!1}},[w,i]),D=t.useCallback(async()=>{if(!a?.hasOlder||G.current)return;const e=h.current;e&&(C.current={scrollHeight:e.scrollHeight,scrollTop:e.scrollTop}),G.current=!0,le(!0);try{const n=await w({turnOffset:Math.max(0,a.totalTurns-a.startTurn),turnLimit:Z});n?q(l=>l?De(l,n):n):C.current=null}finally{G.current=!1,le(!1)}},[w,a]),P=t.useRef(null),T=t.useCallback(e=>{if(e?.sessionId&&e.sessionId!==r.sessionId&&(W.current=!0,Y.current=`${r.agent}:${e.sessionId}`,_?.({agent:r.agent||"",sessionId:e.sessionId,workdir:d})),!e){const n=P.current;O(!1),n==="streaming"?(j.current=!0,M.current=!0,o({keepOlder:!0,force:!0,scrollToBottom:S.current})):I(null),n==="done"?i():n===null&&b.current&&o({keepOlder:!0,force:!0}),b.current=!1,K(null),Q(null),N(null),P.current=null;return}Q(e.phase),K(e.taskId||null),N(e.queuedTaskId||null),e.phase==="streaming"?(I({phase:"streaming",text:e.text||"",thinking:e.thinking||"",activity:e.activity,plan:e.plan??null}),O(!0),e.queuedTaskId||X(!1),S.current&&(x.current=!0)):e.phase==="queued"?(I(null),O(!1)):e.phase==="done"&&(O(!1),P.current!=="done"&&(e.queuedTaskId||(j.current=!0),M.current=!0,o({keepOlder:!0,force:!0,scrollToBottom:S.current})),e.queuedTaskId||(b.current=!1)),P.current=e.phase},[i,o,r.sessionId,r.agent,_,d]),ge=t.useCallback(()=>{b.current=!0,ae(e=>e+1)},[]),je=t.useCallback(async e=>{try{await E.recallSessionMessage(e),i(),N(n=>n===e?null:n),K(n=>n===e?null:n)}catch{}},[i]),Le=t.useCallback(async e=>{try{await E.steerSession(e)}catch{}},[]),U=ze(r.agent||"",r.sessionId);t.useEffect(()=>{if(W.current){W.current=!1,o({keepOlder:!0,force:!0});return}let e=!1;const n=Pe({workdir:d,agent:r.agent||"",sessionId:r.sessionId,rich:!0,turnOffset:0,turnLimit:Z},{allowStale:!0}),l=!!p&&!V.current,f=n?.ok?Se(n):R.get(U)||null;return se(l?!1:!f),q(f),I(null),O(!1),Q(null),N(null),S.current=!0,x.current=!0,l||o({keepOlder:!1,force:!0}).finally(()=>{e||se(!1)}),()=>{e=!0}},[o,r.agent,r.sessionId,d,U]),t.useEffect(()=>{a&&a.turns.length>0&&Fe(U,a)},[U,a]),t.useEffect(()=>{ee&&o({keepOlder:!0,force:!0})},[ee,o]);const Y=t.useRef(`${r.agent}:${r.sessionId}`);Y.current=`${r.agent}:${r.sessionId}`,Ue("stream-update",t.useCallback(e=>{e.key===Y.current&&T(e.snapshot??null)},[T])),t.useEffect(()=>{let e=!0;return E.getSessionStreamState(r.agent||"",r.sessionId).then(n=>{e&&T(n.state)}).catch(()=>{}),()=>{e=!1}},[T,r.agent,r.sessionId,ye]),_e(t.useCallback(()=>{E.getSessionStreamState(r.agent||"",r.sessionId).then(e=>{T(e.state)}).catch(()=>{}),o({keepOlder:!0,force:!0})},[T,r.agent,r.sessionId,o])),t.useEffect(()=>{ne!=="running"&&!H&&!c&&(i(),b.current=!1)},[ne,H,c,i]),t.useLayoutEffect(()=>{const e=C.current,n=h.current;!e||!n||(C.current=null,n.scrollTop=e.scrollTop+(n.scrollHeight-e.scrollHeight))},[a?.turns.length]),t.useLayoutEffect(()=>{if(!x.current)return;const e=h.current;e&&(x.current=!1,e.scrollTop=e.scrollHeight,requestAnimationFrame(()=>{S.current&&(e.scrollTop=e.scrollHeight)}))},[a,c]),t.useLayoutEffect(()=>{if(!u)return;const e=h.current;e&&(e.scrollTop=e.scrollHeight)},[u]),t.useEffect(()=>{if(!a?.hasOlder||B||y)return;const e=h.current;e&&e.scrollHeight<=e.clientHeight+Te&&D()},[a?.hasOlder,a?.turns.length,D,B,y]);const Ee=t.useCallback(()=>{const e=h.current;if(!e)return;const n=e.scrollHeight-e.scrollTop-e.clientHeight;S.current=n<=Ke,e.scrollTop<=Te&&D()},[D]),g=a?.turns||[],L=t.useMemo(()=>{if(!c||!g.length)return g;const e=g[g.length-1];return!e.assistant||u&&e.user?.text?.trim()!==u.trim()?g:[...g.slice(0,-1),{...e,assistant:null}]},[g,c,u]);return s.jsxs("div",{className:"flex flex-col h-full overflow-hidden",children:[s.jsx("div",{ref:h,onScroll:Ee,className:"flex-1 overflow-y-auto overscroll-contain",children:B?s.jsx("div",{className:"flex items-center justify-center py-20",children:s.jsx(pe,{className:"h-5 w-5 text-fg-4"})}):L.length===0&&!u&&!k.length&&!c?s.jsx("div",{className:"py-20 text-center text-[13px] text-fg-5",children:m("hub.noMessages")}):s.jsxs("div",{className:"max-w-[900px] mx-auto px-6 py-6 space-y-0",children:[(a?.hasOlder||y)&&s.jsxs("div",{className:"mb-4 flex items-center justify-center gap-2 text-[11px] text-fg-5",children:[y?s.jsx(pe,{className:"h-3 w-3 text-fg-5"}):s.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-fg-5/35"}),s.jsx("span",{children:m(y?"hub.loadingOlderTurns":"hub.loadOlderTurnsHint")})]}),L.map((e,n)=>s.jsx($e,{turn:e,agent:r.agent||"",meta:A,model:r.model?J(r.model):void 0,effort:$,t:m,onResend:l=>{x.current=!0,de(l),E.sendSessionMessage(d,r.agent||"",r.sessionId,l).then(f=>{f.ok&&ge()}).catch(()=>{i()})},onEdit:l=>oe(l)},`${a?.startTurn||0}:${n}`)),(u||k.length>0)&&!ke&&!j.current&&!(u&&L.length>0&&L[L.length-1]?.user?.text?.trim()===u.trim())&&s.jsxs("div",{className:"session-turn",children:[s.jsx(Ae,{text:u||"",blocks:k.map(e=>({type:"image",content:e})),t:m}),!c&&s.jsx("div",{className:"mt-3 mb-5 animate-in",children:s.jsx(qe,{className:"text-fg-5"})})]}),c&&s.jsxs("div",{className:"mb-6",children:[!u&&!k.length&&s.jsx(xe,{agent:r.agent||"",meta:A,model:r.model?J(r.model):void 0,effort:$}),(u||k.length>0)&&s.jsx(xe,{agent:r.agent||"",meta:A,model:r.model?J(r.model):void 0,effort:$}),s.jsx(Be,{stream:c,t:m})]}),s.jsx("div",{className:"h-4"})]})}),s.jsx(Qe,{session:r,workdir:d,onStreamQueued:ge,onSendStart:de,onSessionChange:_,t:m,streamPhase:ve,streamTaskId:Ie,queuedTaskId:Oe,pendingPrompt:u,onRecall:je,onSteer:Le,editDraft:be,onEditDraftConsumed:()=>oe(null)})]})});export{lt as SessionPanel};