import{A as e,C as t,D as n,E as r,F as i,L as a,N as o,O as ee,P as s,R as te,S as c,T as l,a as ne,b as u,c as d,d as re,f as ie,g as ae,h as oe,i as se,j as f,k as ce,p as le,r as ue,s as de,t as p,u as m,v as fe,w as h,x as g,y as _,z as v}from"./index-BnlAnYlB.js";var pe={class:`settings-view`},me={class:`settings-section`},he={class:`section-title`},ge={class:`title-right`},_e={class:`section-body`},ve={class:`server-control-bar`},ye={class:`server-info`},be={class:`model-chip`},xe={class:`model-chip port-chip`},Se={class:`model-chip pid-chip`},Ce={key:1,class:`server-idle`},we={class:`server-actions`},Te=[`disabled`],Ee=[`disabled`],De={key:0,class:`error-msg llama-error`},Oe={class:`local-models`},ke={class:`local-models-header`},Ae=[`disabled`],je={key:0,class:`no-models`},Me={key:1,class:`model-list`},Ne=[`onClick`],Pe={class:`model-item-name`},Fe={class:`model-item-size`},Ie={class:`download-section`},Le={class:`download-form`},Re=[`disabled`],ze=[`disabled`],Be={key:0,class:`progress-wrap`},Ve={class:`progress-bar`},He={class:`progress-info`},Ue={key:1,class:`error-msg download-error`},We={key:2,class:`done-msg`},Ge={class:`form-grid`,style:{"margin-top":`16px`}},Ke={class:`field full-width`},qe={key:0,class:`field full-width`},Je=[`disabled`],Ye={class:`input-row`},Xe=[`placeholder`],Ze={key:1,class:`field full-width`},Qe=[`disabled`],$e=[`value`],et=[`value`],tt={key:3,class:`field-hint warn`},nt={key:2,class:`field`},rt={class:`field`},it={class:`field`},at={class:`field`},ot={class:`settings-section`},st={class:`section-title`},ct={class:`title-right`},lt={class:`section-body`},ut={class:`form-grid`},dt={class:`field full-width`},ft=[`disabled`],pt={class:`field full-width`},mt={class:`field full-width`},ht=[`disabled`],gt=[`value`],_t={key:0,class:`field-hint warn`},vt={class:`settings-section`},yt={class:`section-body`},bt={class:`form-grid`},xt={class:`field full-width`},St={class:`checkbox-label`},Ct={class:`field`},wt={class:`field`},Tt={class:`field full-width`},Et={class:`actions`},Dt=[`disabled`],Ot=[`disabled`],y=p(n({__name:`SettingsView`,setup(n){let p=i(!1),y=i(``),b=i(null),x=i({running:!1}),S=i(!1),C=i(!1),w=i([]),T=i(!1),E=i(``),D=i(!1),O=i(``),k=i(0),A=i(``),j=i(``),M=i(``),N=i(null),P=i(``),F=i(``),I=i(!1),L=null,R=i([]),z=i([]),B=s({worker:!1,architect:!1}),V=s({worker:``,architect:``}),H=s({worker:!1,architect:!1}),U=s({worker:null,architect:null}),W=s({worker:``,architect:``}),G=[{id:`deepseek-v4-flash`,name:`deepseek-v4-flash(推荐)`},{id:`deepseek-v4-pro`,name:`deepseek-v4-pro(推理模式)`},{id:`deepseek-coder`,name:`deepseek-coder`},{id:`gpt-4o-mini`,name:`gpt-4o-mini`},{id:`gpt-4o`,name:`gpt-4o`},{id:`claude-3-5-sonnet-20241022`,name:`claude-3.5-sonnet`},{id:`qwen-plus`,name:`qwen-plus`},{id:`qwen-max`,name:`qwen-max`}],K=i(null),q=s({worker:{backend:`mock`,model:``,base_url:``,port:8901,temperature:.3,max_fix_attempts:2,code_timeout_s:10},architect:{model:`deepseek-v4-flash`,base_url:`https://api.deepseek.com`,api_key:``},pipeline:{fast_path:!0,rounds_cap:6,api_token_cap:8e3,breach_policy:`architect_do`}}),kt=c(()=>q.worker.backend===`llama_server`?`http://127.0.0.1:${q.worker.port}/v1`:`http://127.0.0.1:11434/v1`),At=c(()=>K.value?JSON.stringify(q)!==JSON.stringify(K.value):!1);function J(e){return e>=1e9?(e/1e9).toFixed(1)+` GB`:e>=1e6?(e/1e6).toFixed(1)+` MB`:e>=1e3?(e/1e3).toFixed(0)+` KB`:e+` B`}async function jt(){try{let e=await ne();return x.value=e,e}catch{return x.value={running:!1},{running:!1}}}async function Y(){T.value=!0;try{w.value=await de()}catch{w.value=[]}finally{T.value=!1}}async function Mt(){if(!q.worker.model){alert(`请先从上方「本地模型」列表中选择一个模型,再启动服务`);return}S.value=!0;try{let e=await ie(q.worker.model,q.worker.port,99,4096);x.value=e,e.running&&(q.worker.backend=`llama_server`,q.worker.base_url=`http://127.0.0.1:${e.port}/v1`,await Y(),await Z())}catch(e){x.value={running:!1,error:String(e?.message||e)}}finally{S.value=!1}}async function Nt(){C.value=!0;try{await le(),x.value={running:!1}}catch{x.value={running:!1}}finally{C.value=!1}}function Pt(e){E.value=e.id,q.worker.model=e.id}function Ft(){O.value.trim()&&(F.value=``,I.value=!1,k.value=0,A.value=``,j.value=``,M.value=`0 B`,N.value=null,D.value=!0,ue(O.value.trim()).then(e=>{if(e.error){F.value=e.error,D.value=!1;return}if(e.done){X(e);return}L=ae(O.value.trim()),L.subscribe({onProgress:X,onDone:e=>{X(e),L?.close(),L=null}})}))}function X(e){k.value=Math.round(e.progress_pct),A.value=e.speed,j.value=e.eta,M.value=J(e.downloaded_bytes),N.value=e.total_bytes?J(e.total_bytes):null,P.value=e.dest,e.done&&(D.value=!1,e.error?F.value=e.error:(I.value=!0,Y()))}async function It(){V.worker=``,R.value=[],q.worker.backend!==`mock`&&await Z()}async function Lt(){V.architect=``,z.value=[],await Q()}async function Z(){if(q.worker.backend!==`mock`){B.worker=!0,V.worker=``;try{let e=await d(q.worker.backend,q.worker.base_url,``);e.error?q.worker.backend===`llama_server`?V.worker=`💡 llama-server 未启动,请先点击上方「启动服务」`:V.worker=e.error||`连接失败`:R.value=e.models||[]}catch{V.worker=`获取模型列表失败`}finally{B.worker=!1}}}async function Q(){if(B.architect=!0,V.architect=``,!q.architect.base_url){z.value=[...G],B.architect=!1;return}try{let e=await d(`openai`,q.architect.base_url,q.architect.api_key||``);e.error?(V.architect=e.error,z.value=[...G]):(e.models||[]).length>0?z.value=e.models||[]:z.value=[...G]}catch{V.architect=`获取模型列表失败`,z.value=[...G]}finally{B.architect=!1}}async function Rt(){if(q.worker.backend!==`mock`){H.worker=!0,U.worker=null,W.worker=``;try{let e=await m(q.worker.backend,q.worker.base_url,``);U.worker=e.ok,e.ok||(W.worker=e.detail||`连接失败`)}catch(e){U.worker=!1,W.worker=e?.message||String(e)}finally{H.worker=!1}}}async function zt(){if(!q.architect.base_url){U.architect=!1,W.architect=`请先填写 API 端点`;return}H.architect=!0,U.architect=null,W.architect=``;try{let e=await m(`openai`,q.architect.base_url,q.architect.api_key||``);U.architect=e.ok,e.ok||(W.architect=e.detail||`连接失败`)}catch(e){U.architect=!1,W.architect=e?.message||String(e)}finally{H.architect=!1}}function $(e,t){if(t)for(let n of Object.keys(e))t[n]!==void 0&&(typeof e[n]==`object`&&typeof t[n]==`object`&&e[n]!==null?$(e[n],t[n]):e[n]=t[n])}async function Bt(){y.value=``;try{let[e,t]=await Promise.all([se(),jt()]);x.value=t,e.worker&&$(q.worker,e.worker),e.architect&&$(q.architect,e.architect),e.pipeline&&$(q.pipeline,e.pipeline),K.value=JSON.parse(JSON.stringify(q)),await Y(),z.value=[...G],q.worker.backend!==`mock`&&Z(),q.worker.model&&(E.value=q.worker.model)}catch(e){y.value=`加载配置失败:`+(e?.message||String(e))}}async function Vt(){p.value=!0,b.value=null;try{let e=JSON.parse(JSON.stringify(q));e.architect.api_key||delete e.architect.api_key;let t=await oe(e);$(q.worker,t.worker||{}),$(q.architect,t.architect||{}),$(q.pipeline,t.pipeline||{}),K.value=JSON.parse(JSON.stringify(q)),b.value={ok:!0,msg:`✅ 设置已保存,管线已重建`},setTimeout(()=>b.value=null,3e3)}catch(e){b.value={ok:!1,msg:`❌ 保存失败:`+(e?.message||String(e))}}finally{p.value=!1}}async function Ht(){if(confirm(`确定恢复默认设置?`)){p.value=!0,b.value=null;try{let e=await re();$(q.worker,e.worker||{}),$(q.architect,e.architect||{}),$(q.pipeline,e.pipeline||{}),K.value=JSON.parse(JSON.stringify(q)),R.value=[],z.value=[...G],U.worker=null,U.architect=null,b.value={ok:!0,msg:`✅ 已恢复默认设置`},setTimeout(()=>b.value=null,3e3)}catch(e){b.value={ok:!1,msg:`❌ 重置失败:`+(e?.message||String(e))}}finally{p.value=!1}}}return ee(Bt),ce(()=>{L?.close()}),(n,i)=>(e(),l(`div`,pe,[i[40]||=t(`header`,{class:`settings-header`},[t(`h2`,null,`⚙️ 模型设置`),t(`p`,{class:`subtitle`},`配置小模型(Worker)与大模型(Architect)参数,保存后实时生效`)],-1),t(`section`,me,[t(`div`,he,[i[17]||=t(`span`,null,`🔧 小模型 (Worker · 本地 llama.cpp)`,-1),t(`div`,ge,[t(`span`,{class:a([`server-badge`,x.value.running?`badge-running`:`badge-stopped`])},v(x.value.running?`● 运行中`:`○ 已停止`),3)])]),t(`div`,_e,[t(`div`,ve,[t(`div`,ye,[x.value.running?(e(),l(g,{key:0},[t(`span`,be,v(x.value.model?.split(/[/\\]/).pop()),1),t(`span`,xe,`:`+v(x.value.port),1),t(`span`,Se,`PID `+v(x.value.pid),1)],64)):(e(),l(`span`,Ce,`llama-server 未运行 — 点击「启动服务」即可启用`))]),t(`div`,we,[x.value.running?(e(),l(`button`,{key:1,class:`btn-stop`,disabled:S.value||C.value,onClick:Nt},v(C.value?`停止中…`:`■ 停止服务`),9,Ee)):(e(),l(`button`,{key:0,class:`btn-start`,disabled:S.value||C.value,onClick:Mt},v(S.value?`启动中…`:`▶ 启动服务`),9,Te))])]),x.value.error?(e(),l(`div`,De,v(x.value.error),1)):h(``,!0),t(`div`,Oe,[t(`div`,ke,[t(`span`,null,`📁 本地模型 (`+v(w.value.length)+`)`,1),t(`button`,{class:`btn-refresh`,disabled:T.value,onClick:Y},v(T.value?`…`:`🔄`),9,Ae)]),w.value.length===0&&!T.value?(e(),l(`div`,je,` 暂无本地模型,请下载或放置 .gguf 文件到 models/ 目录 `)):(e(),l(`div`,Me,[(e(!0),l(g,null,f(w.value,n=>(e(),l(`div`,{key:n.id,class:a([`model-item`,E.value===n.id?`selected`:``]),onClick:e=>Pt(n)},[t(`span`,Pe,v(n.name),1),t(`span`,Fe,v(n.size_mb)+` MB`,1)],10,Ne))),128))]))]),t(`div`,Ie,[i[18]||=t(`div`,{class:`download-header`},`⬇️ 下载模型`,-1),t(`div`,Le,[o(t(`input`,{"onUpdate:modelValue":i[0]||=e=>O.value=e,class:`download-input`,placeholder:`HuggingFace 路径或直链,如:Qwen/Qwen3-4B-GGUF/Qwen3-4B-Q4_K_M.gguf`,disabled:D.value},null,8,Re),[[u,O.value]]),t(`button`,{class:`btn-download`,disabled:D.value||!O.value.trim(),onClick:Ft},v(D.value?k.value+`%`:`下载`),9,ze)]),D.value?(e(),l(`div`,Be,[t(`div`,Ve,[t(`div`,{class:`progress-fill`,style:te({width:k.value+`%`})},null,4)]),t(`div`,He,[t(`span`,null,v(A.value),1),t(`span`,null,v(j.value),1),t(`span`,null,v(M.value)+`/`+v(N.value||`?`),1)])])):h(``,!0),F.value?(e(),l(`div`,Ue,v(F.value),1)):h(``,!0),I.value&&!F.value?(e(),l(`div`,We,` ✅ 下载完成:`+v(P.value),1)):h(``,!0)]),t(`div`,Ge,[t(`div`,Ke,[i[20]||=t(`label`,null,`后端类型`,-1),o(t(`select`,{"onUpdate:modelValue":i[1]||=e=>q.worker.backend=e,onChange:It},[...i[19]||=[t(`option`,{value:`mock`},`mock(模拟,不真实调用)`,-1),t(`option`,{value:`llama_server`},`llama_server(内置本地服务,推荐)`,-1),t(`option`,{value:`openai`},`openai / 兼容 API(Ollama 等)`,-1)]],544),[[_,q.worker.backend]])]),q.worker.backend===`mock`?h(``,!0):(e(),l(`div`,qe,[t(`label`,null,[i[21]||=r(` API 地址 `,-1),t(`button`,{class:`btn-refresh btn-inline`,disabled:H.worker,onClick:Rt},v(H.worker?`…`:`🔗 连接测试`),9,Je)]),t(`div`,Ye,[o(t(`input`,{"onUpdate:modelValue":i[2]||=e=>q.worker.base_url=e,placeholder:kt.value,onBlur:It},null,40,Xe),[[u,q.worker.base_url]]),U.worker===null?h(``,!0):(e(),l(`span`,{key:0,class:a([`ping-badge`,U.worker?`ping-ok`:`ping-err`])},v(U.worker?`✅ 正常`:`❌ `+W.worker),3))])])),q.worker.backend===`mock`?h(``,!0):(e(),l(`div`,Ze,[t(`label`,null,[i[22]||=r(` 模型 `,-1),t(`button`,{class:`btn-refresh btn-inline`,disabled:B.worker,onClick:Z},v(B.worker?`…`:`🔄 刷新列表`),9,Qe)]),q.worker.backend===`llama_server`?o((e(),l(`select`,{key:0,"onUpdate:modelValue":i[3]||=e=>q.worker.model=e},[i[23]||=t(`option`,{value:``,disabled:``},`—— 从本地模型中选择 ——`,-1),(e(!0),l(g,null,f(w.value,t=>(e(),l(`option`,{key:t.id,value:t.id},v(t.name),9,$e))),128))],512)),[[_,q.worker.model]]):q.worker.backend===`openai`?o((e(),l(`select`,{key:1,"onUpdate:modelValue":i[4]||=e=>q.worker.model=e},[i[24]||=t(`option`,{value:``,disabled:``},`—— 从 API 获取 ——`,-1),(e(!0),l(g,null,f(R.value,t=>(e(),l(`option`,{key:t.id,value:t.id},v(t.name||t.id),9,et))),128))],512)),[[_,q.worker.model]]):o((e(),l(`input`,{key:2,"onUpdate:modelValue":i[5]||=e=>q.worker.model=e,placeholder:`输入模型名称…`},null,512)),[[u,q.worker.model]]),V.worker?(e(),l(`span`,tt,v(V.worker),1)):h(``,!0)])),q.worker.backend===`llama_server`?(e(),l(`div`,nt,[i[25]||=t(`label`,null,`端口`,-1),o(t(`input`,{"onUpdate:modelValue":i[6]||=e=>q.worker.port=e,type:`number`,min:`1`,max:`65535`},null,512),[[u,q.worker.port,void 0,{number:!0}]])])):h(``,!0),t(`div`,rt,[i[26]||=t(`label`,null,`Temperature`,-1),o(t(`input`,{"onUpdate:modelValue":i[7]||=e=>q.worker.temperature=e,type:`number`,min:`0`,max:`2`,step:`0.05`},null,512),[[u,q.worker.temperature,void 0,{number:!0}]])]),t(`div`,it,[i[27]||=t(`label`,null,`最大修复轮次`,-1),o(t(`input`,{"onUpdate:modelValue":i[8]||=e=>q.worker.max_fix_attempts=e,type:`number`,min:`0`,max:`10`},null,512),[[u,q.worker.max_fix_attempts,void 0,{number:!0}]])]),t(`div`,at,[i[28]||=t(`label`,null,`代码执行超时 (秒)`,-1),o(t(`input`,{"onUpdate:modelValue":i[9]||=e=>q.worker.code_timeout_s=e,type:`number`,min:`1`,max:`300`},null,512),[[u,q.worker.code_timeout_s,void 0,{number:!0}]])])])])]),t(`section`,ot,[t(`div`,st,[i[29]||=t(`span`,null,`🧠 大模型 (Architect · API 云端)`,-1),t(`div`,ct,[U.architect===null?h(``,!0):(e(),l(`span`,{key:0,class:a([`ping-badge`,U.architect?`ping-ok`:`ping-err`])},v(U.architect?`✅ 已连接`:`❌ `+W.architect),3))])]),t(`div`,lt,[t(`div`,ut,[t(`div`,dt,[t(`label`,null,[i[30]||=r(` API 端点 `,-1),t(`button`,{class:`btn-refresh btn-inline`,disabled:H.architect,onClick:zt},v(H.architect?`…`:`🔗 连接测试`),9,ft)]),o(t(`input`,{"onUpdate:modelValue":i[10]||=e=>q.architect.base_url=e,placeholder:`https://api.deepseek.com`,onBlur:Lt},null,544),[[u,q.architect.base_url]])]),t(`div`,pt,[i[31]||=t(`label`,null,`API Key(保存后加密存储)`,-1),o(t(`input`,{"onUpdate:modelValue":i[11]||=e=>q.architect.api_key=e,type:`password`,placeholder:`sk-xxxxxxxxxxxxxxxx`,autocomplete:`off`},null,512),[[u,q.architect.api_key]])]),t(`div`,mt,[t(`label`,null,[i[32]||=r(` 模型 `,-1),t(`button`,{class:`btn-refresh btn-inline`,disabled:B.architect,onClick:Q},v(B.architect?`…`:`🔄 刷新列表`),9,ht)]),o(t(`select`,{"onUpdate:modelValue":i[12]||=e=>q.architect.model=e,class:`model-select`},[i[33]||=t(`option`,{value:``,disabled:``},`—— 从 API 获取模型列表 ——`,-1),(e(!0),l(g,null,f(z.value,t=>(e(),l(`option`,{key:t.id,value:t.id},v(t.name||t.id),9,gt))),128))],512),[[_,q.architect.model]]),V.architect?(e(),l(`span`,_t,v(V.architect),1)):h(``,!0)])])])]),t(`section`,vt,[i[39]||=t(`div`,{class:`section-title`},[t(`span`,null,`⚙️ 协作管线 (Pipeline)`)],-1),t(`div`,yt,[t(`div`,bt,[t(`div`,xt,[t(`label`,St,[o(t(`input`,{type:`checkbox`,"onUpdate:modelValue":i[13]||=e=>q.pipeline.fast_path=e},null,512),[[fe,q.pipeline.fast_path]]),i[34]||=r(` 启用快路径(简单查询跳过本地模型,直接由大模型回答,省 API 费用) `,-1)])]),t(`div`,Ct,[i[35]||=t(`label`,null,`最大协作轮次`,-1),o(t(`input`,{"onUpdate:modelValue":i[14]||=e=>q.pipeline.rounds_cap=e,type:`number`,min:`1`,max:`20`},null,512),[[u,q.pipeline.rounds_cap,void 0,{number:!0}]])]),t(`div`,wt,[i[36]||=t(`label`,null,`API Token 熔断上限`,-1),o(t(`input`,{"onUpdate:modelValue":i[15]||=e=>q.pipeline.api_token_cap=e,type:`number`,min:`100`,max:`100000`},null,512),[[u,q.pipeline.api_token_cap,void 0,{number:!0}]])]),t(`div`,Tt,[i[38]||=t(`label`,null,`超限策略`,-1),o(t(`select`,{"onUpdate:modelValue":i[16]||=e=>q.pipeline.breach_policy=e},[...i[37]||=[t(`option`,{value:`architect_do`},`architect_do(超限交给大模型处理,推荐)`,-1),t(`option`,{value:`local_only`},`local_only(强制留在本地小模型)`,-1)]],512),[[_,q.pipeline.breach_policy]])])])])]),t(`div`,Et,[t(`button`,{class:`btn-primary`,disabled:p.value||!At.value,onClick:Vt},v(p.value?`保存中…`:`💾 保存设置`),9,Dt),t(`button`,{class:`btn-secondary`,disabled:p.value,onClick:Ht},` 🔁 恢复默认 `,8,Ot)]),b.value?(e(),l(`div`,{key:0,class:a([`toast`,b.value.ok?`toast-ok`:`toast-err`])},v(b.value.msg),3)):h(``,!0)]))}}),[[`__scopeId`,`data-v-1b54937b`]]);export{y as default};