turbollm 1.7.2 → 1.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +13 -11
  2. package/dist/chunk-TPYU5ZAX.js +175 -0
  3. package/dist/cli.js +2124 -1948
  4. package/dist/distiller-UROKYEBN.js +9 -0
  5. package/dist/webdist/assets/AgentEditPage-DLuckXeR.js +1 -0
  6. package/dist/webdist/assets/ChatScreen-BOZjtqGu.js +65 -0
  7. package/dist/webdist/assets/CustomizeScreen-DoVGTM4C.js +4 -0
  8. package/dist/webdist/assets/DeveloperScreen-BJ7m4ZxK.js +1 -0
  9. package/dist/webdist/assets/EnginesScreen-D3b9VNx0.js +7 -0
  10. package/dist/webdist/assets/{MessageBubble-COuZ8jTd.js → MessageBubble-mJwFfOab.js} +15 -16
  11. package/dist/webdist/assets/ModelDetailDialog-M2tPWvP4.js +1 -0
  12. package/dist/webdist/assets/ModelDirs-CaIf1TUh.js +1 -0
  13. package/dist/webdist/assets/{ModelsScreen-DncNvsj6.js → ModelsScreen--sPDS_sx.js} +2 -2
  14. package/dist/webdist/assets/SettingsScreen-lBpo_MAD.js +1 -0
  15. package/dist/webdist/assets/SkillEditPage-B5S9Gtlh.js +1 -0
  16. package/dist/webdist/assets/WorkspaceScreen-Cpm-gLG1.js +1 -0
  17. package/dist/webdist/assets/agent-api-B3GXwr4Y.js +1 -0
  18. package/dist/webdist/assets/{arc-BrQAHE5c.js → arc-CRcL8nar.js} +1 -1
  19. package/dist/webdist/assets/{architectureDiagram-3BPJPVTR-DzOwDk0E.js → architectureDiagram-3BPJPVTR-BmOKGMd0.js} +1 -1
  20. package/dist/webdist/assets/{blockDiagram-GPEHLZMM-Cbs2lNCh.js → blockDiagram-GPEHLZMM-C4vusmQ-.js} +1 -1
  21. package/dist/webdist/assets/{c4Diagram-AAUBKEIU-BAull9Yv.js → c4Diagram-AAUBKEIU-DdY0YXKs.js} +1 -1
  22. package/dist/webdist/assets/channel-BB6NPD_B.js +1 -0
  23. package/dist/webdist/assets/chat-api-DrMO_g5m.js +3 -0
  24. package/dist/webdist/assets/check-BLFw3EpE.js +1 -0
  25. package/dist/webdist/assets/chevron-left-CfyO2AXW.js +1 -0
  26. package/dist/webdist/assets/chevron-right--1OIa5uV.js +1 -0
  27. package/dist/webdist/assets/{chunk-2J33WTMH-B38k4sJL.js → chunk-2J33WTMH-DzCJsNN1.js} +1 -1
  28. package/dist/webdist/assets/{chunk-4BX2VUAB-VxAkYvb7.js → chunk-4BX2VUAB-BNPfO47j.js} +1 -1
  29. package/dist/webdist/assets/{chunk-55IACEB6-CAz9ZWyR.js → chunk-55IACEB6-_vELiE2B.js} +1 -1
  30. package/dist/webdist/assets/{chunk-727SXJPM-CvLX5ghS.js → chunk-727SXJPM-CsQCgUxY.js} +1 -1
  31. package/dist/webdist/assets/{chunk-AQP2D5EJ-CZ0fsnc1.js → chunk-AQP2D5EJ-G0waQ7sq.js} +1 -1
  32. package/dist/webdist/assets/{chunk-FMBD7UC4-tjHz_yw8.js → chunk-FMBD7UC4-CkNtvlrw.js} +1 -1
  33. package/dist/webdist/assets/{chunk-ND2GUHAM-DVSh5E5_.js → chunk-ND2GUHAM-DGnw4n1I.js} +1 -1
  34. package/dist/webdist/assets/{chunk-QZHKN3VN-D1rUM2SU.js → chunk-QZHKN3VN-BpJ4HH0V.js} +1 -1
  35. package/dist/webdist/assets/circle-check-ByN99MCf.js +1 -0
  36. package/dist/webdist/assets/classDiagram-4FO5ZUOK-DwCs4wFr.js +1 -0
  37. package/dist/webdist/assets/classDiagram-v2-Q7XG4LA2-DwCs4wFr.js +1 -0
  38. package/dist/webdist/assets/collapsible-B_M28W08.js +1 -0
  39. package/dist/webdist/assets/{common-BD4Wa3KL.js → common-Cy1uxtS_.js} +1 -1
  40. package/dist/webdist/assets/{copy-button-DypRNkqI.js → copy-button-DgYGL35x.js} +1 -1
  41. package/dist/webdist/assets/{cose-bilkent-S5V4N54A-DIUqY7o2.js → cose-bilkent-S5V4N54A-fol9bGNP.js} +1 -1
  42. package/dist/webdist/assets/{dagre-BM42HDAG-BzTcsgZ1.js → dagre-BM42HDAG-kyg4YiiE.js} +1 -1
  43. package/dist/webdist/assets/{diagram-2AECGRRQ-DanHH-W_.js → diagram-2AECGRRQ-CK_mQs9l.js} +1 -1
  44. package/dist/webdist/assets/{diagram-5GNKFQAL-DQ5sWHUL.js → diagram-5GNKFQAL-MBl66jsh.js} +1 -1
  45. package/dist/webdist/assets/{diagram-KO2AKTUF-Jqr_pLwu.js → diagram-KO2AKTUF-IxjaUqTu.js} +1 -1
  46. package/dist/webdist/assets/{diagram-LMA3HP47-BZ89-cp0.js → diagram-LMA3HP47-Cc_fuuLo.js} +1 -1
  47. package/dist/webdist/assets/{diagram-OG6HWLK6-cidBc5qa.js → diagram-OG6HWLK6-DvprGLFT.js} +1 -1
  48. package/dist/webdist/assets/{dialog-3hyZ9j4e.js → dialog-d6eLRBbl.js} +1 -1
  49. package/dist/webdist/assets/{erDiagram-TEJ5UH35-DEAKZN7b.js → erDiagram-TEJ5UH35-BEebeQO0.js} +1 -1
  50. package/dist/webdist/assets/{flowDiagram-I6XJVG4X-Cyx8gMzN.js → flowDiagram-I6XJVG4X--NtrYHee.js} +1 -1
  51. package/dist/webdist/assets/folder-input-C5Td4Oz0.js +1 -0
  52. package/dist/webdist/assets/{ganttDiagram-6RSMTGT7-CqXYW44d.js → ganttDiagram-6RSMTGT7-DOx3A2YH.js} +1 -1
  53. package/dist/webdist/assets/{gitGraphDiagram-PVQCEYII-0dv_zKYA.js → gitGraphDiagram-PVQCEYII-BEY69HKU.js} +1 -1
  54. package/dist/webdist/assets/index-B8H9eSFq.css +1 -0
  55. package/dist/webdist/assets/{index-DHmOrvk5.js → index-Tpho8qZ0.js} +1 -1
  56. package/dist/webdist/assets/index-tVO2x-Rw.js +10 -0
  57. package/dist/webdist/assets/{infoDiagram-5YYISTIA-PxeM6E3u.js → infoDiagram-5YYISTIA-C4X5I5eI.js} +1 -1
  58. package/dist/webdist/assets/{ishikawaDiagram-YF4QCWOH-BnNdTjj1.js → ishikawaDiagram-YF4QCWOH-BhUZzSmP.js} +1 -1
  59. package/dist/webdist/assets/{journeyDiagram-JHISSGLW-D3AHUGxz.js → journeyDiagram-JHISSGLW-R-rmKLZ-.js} +1 -1
  60. package/dist/webdist/assets/{kanban-definition-UN3LZRKU-YARl6SUt.js → kanban-definition-UN3LZRKU-DUcDGDiT.js} +1 -1
  61. package/dist/webdist/assets/{linear-CMEhaWGh.js → linear-Cbr5iYFb.js} +1 -1
  62. package/dist/webdist/assets/{mermaid.core-Dfl2pPvv.js → mermaid.core-DJVxydy1.js} +4 -4
  63. package/dist/webdist/assets/{mindmap-definition-RKZ34NQL-BojWC6jk.js → mindmap-definition-RKZ34NQL-BSOgl-Cn.js} +1 -1
  64. package/dist/webdist/assets/pencil-Blh_Q7or.js +1 -0
  65. package/dist/webdist/assets/personas-Dm0JD8kn.js +305 -0
  66. package/dist/webdist/assets/{pieDiagram-4H26LBE5-cjsdMtJJ.js → pieDiagram-4H26LBE5-BwQ854zg.js} +1 -1
  67. package/dist/webdist/assets/plus-D4IwdkJ3.js +1 -0
  68. package/dist/webdist/assets/{quadrantDiagram-W4KKPZXB-DYVcgQuL.js → quadrantDiagram-W4KKPZXB-BOQGjhZD.js} +1 -1
  69. package/dist/webdist/assets/{radix-BY-fjzwm.js → radix-DVGeLgPN.js} +2 -2
  70. package/dist/webdist/assets/{refresh-cw-Cco9RapO.js → refresh-cw-BVSLL9xa.js} +1 -1
  71. package/dist/webdist/assets/{requirementDiagram-4Y6WPE33-Dkj58nhB.js → requirementDiagram-4Y6WPE33-b3dNYy6K.js} +1 -1
  72. package/dist/webdist/assets/rotate-ccw-B7QiZxpr.js +1 -0
  73. package/dist/webdist/assets/{sankeyDiagram-5OEKKPKP-l3GwUuNl.js → sankeyDiagram-5OEKKPKP-C26ntsbR.js} +1 -1
  74. package/dist/webdist/assets/{save-CSISNMk8.js → save-DI4M5kP-.js} +1 -1
  75. package/dist/webdist/assets/{sequenceDiagram-3UESZ5HK-CWj1Dplo.js → sequenceDiagram-3UESZ5HK-Bp8i1DIR.js} +1 -1
  76. package/dist/webdist/assets/{skeleton-CBRf-twG.js → skeleton-D6toQA7p.js} +1 -1
  77. package/dist/webdist/assets/star-BCxsXqcv.js +1 -0
  78. package/dist/webdist/assets/{stateDiagram-AJRCARHV-zbnPRcoE.js → stateDiagram-AJRCARHV-CmZpIELB.js} +1 -1
  79. package/dist/webdist/assets/stateDiagram-v2-BHNVJYJU-CswfYrBO.js +1 -0
  80. package/dist/webdist/assets/{timeline-definition-PNZ67QCA-C_zAo1WZ.js → timeline-definition-PNZ67QCA-slNuxmat.js} +1 -1
  81. package/dist/webdist/assets/{trash-2-DJmVqx0w.js → trash-2-DGVXsIsP.js} +1 -1
  82. package/dist/webdist/assets/{vendor-W5GIuFcv.js → vendor-BE0HADM8.js} +1 -1
  83. package/dist/webdist/assets/{vennDiagram-CIIHVFJN-DxfcocQu.js → vennDiagram-CIIHVFJN-Lf4xPS3i.js} +1 -1
  84. package/dist/webdist/assets/{vram-Dn53zt7R.js → vram-DVAmNgRC.js} +1 -1
  85. package/dist/webdist/assets/{wardley-L42UT6IY-BnZ8BinJ.js → wardley-L42UT6IY-DbEeYkcX.js} +1 -1
  86. package/dist/webdist/assets/{wardleyDiagram-YWT4CUSO-DMk9z7hr.js → wardleyDiagram-YWT4CUSO-WNGbDcCj.js} +1 -1
  87. package/dist/webdist/assets/wrench-DzoqtmhJ.js +1 -0
  88. package/dist/webdist/assets/{xychartDiagram-2RQKCTM6-BUtTPXPF.js → xychartDiagram-2RQKCTM6-D2kBZ8cG.js} +1 -1
  89. package/dist/webdist/index.html +4 -4
  90. package/package.json +1 -1
  91. package/dist/webdist/assets/AgentsScreen-sMeMB3IQ.js +0 -2
  92. package/dist/webdist/assets/ChatScreen-rXB7PrWJ.js +0 -65
  93. package/dist/webdist/assets/CustomizeScreen-BBwvtk28.js +0 -4
  94. package/dist/webdist/assets/DeveloperScreen-fXV-qXB5.js +0 -1
  95. package/dist/webdist/assets/EnginesScreen-CrmYzhio.js +0 -7
  96. package/dist/webdist/assets/ModelDetailDialog-Dlt5uF3h.js +0 -1
  97. package/dist/webdist/assets/ModelDirs-BYN-DmHL.js +0 -1
  98. package/dist/webdist/assets/SettingsScreen-DXX3r4Ep.js +0 -1
  99. package/dist/webdist/assets/arrow-left-Dp4XRnbs.js +0 -1
  100. package/dist/webdist/assets/channel-Bt5-ol5R.js +0 -1
  101. package/dist/webdist/assets/check-jMeH6YsH.js +0 -1
  102. package/dist/webdist/assets/chevron-down-C5ZMFCtb.js +0 -1
  103. package/dist/webdist/assets/chevron-right-DNVnXbZ1.js +0 -1
  104. package/dist/webdist/assets/circle-check-qnghY_qF.js +0 -1
  105. package/dist/webdist/assets/circle-x-FM28MwOL.js +0 -1
  106. package/dist/webdist/assets/classDiagram-4FO5ZUOK-jfnUpxOr.js +0 -1
  107. package/dist/webdist/assets/classDiagram-v2-Q7XG4LA2-jfnUpxOr.js +0 -1
  108. package/dist/webdist/assets/collapsible-CwqYFc9v.js +0 -1
  109. package/dist/webdist/assets/index-B_WtFoLC.css +0 -1
  110. package/dist/webdist/assets/index-CriwC5VH.js +0 -10
  111. package/dist/webdist/assets/pencil-CS33zp9q.js +0 -1
  112. package/dist/webdist/assets/personas-CzcXp8zg.js +0 -75
  113. package/dist/webdist/assets/plus-BO3vGy6f.js +0 -1
  114. package/dist/webdist/assets/stateDiagram-v2-BHNVJYJU-Ukx8AVKZ.js +0 -1
  115. package/dist/webdist/assets/wrench-Di5WLTz2.js +0 -1
@@ -0,0 +1 @@
1
+ import{g as $,X as ae,f as q,k as we,l as Se,m as Pe,n as Ae,o as Le,u as Fe,p as Re,A as D,B as G,t as H}from"./index-tVO2x-Rw.js";import{R as ze,j as e,P as Ge,a as Ee,C as Te,b as De,D as Ue}from"./radix-DVGeLgPN.js";import{r as g}from"./vendor-BE0HADM8.js";import{e as $e,g as qe,A as Ve,a as Be,b as Ke,c as He,d as Ie,f as Oe,h as _e,i as We}from"./vram-DVAmNgRC.js";import{E as Qe}from"./refresh-cw-BVSLL9xa.js";import{C as Je}from"./circle-check-ByN99MCf.js";import{S as Xe}from"./save-DI4M5kP-.js";import{R as Ze}from"./rotate-ccw-B7QiZxpr.js";const Ye=[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]],ee=$("gauge",Ye);const et=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],St=$("search",et);const tt=[["path",{d:"M10 5H3",key:"1qgfaw"}],["path",{d:"M12 19H3",key:"yhmn1j"}],["path",{d:"M14 3v4",key:"1sua03"}],["path",{d:"M16 17v4",key:"1q0r14"}],["path",{d:"M21 12h-9",key:"1o4lsq"}],["path",{d:"M21 19h-5",key:"1rlt1p"}],["path",{d:"M21 5h-7",key:"1oszz2"}],["path",{d:"M8 10v4",key:"tgpxqk"}],["path",{d:"M8 12H3",key:"a7s4jb"}]],Pt=$("sliders-horizontal",tt);const nt=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],se=$("zap",nt);function te(){return{splitMode:"layer",tensorSplit:[],mainGpu:-1,tensorParallelSize:1}}function at(){return{maxModelLen:0,gpuMemoryUtilization:.9,maxNumSeqs:0,dtype:"auto",kvCacheDtype:"auto",enforceEager:!1,trustRemoteCode:!1}}const st=ze,le=g.forwardRef(({className:n,children:s,...l},r)=>e.jsx(Ge,{children:e.jsxs(Ee,{ref:r,className:q("tllm-sheet fixed z-50 flex flex-col border-border bg-panel shadow-[var(--shadow-2)] focus:outline-none",n),...l,children:[s,e.jsx(Te,{className:"absolute right-4 top-4 rounded-sm text-muted hover:text-ink","aria-label":"Close",children:e.jsx(ae,{size:16})})]})}));le.displayName="SheetContent";function lt({className:n,...s}){return e.jsx("div",{className:q("mb-4 flex flex-col gap-1",n),...s})}const oe=g.forwardRef(({className:n,...s},l)=>e.jsx(De,{ref:l,className:q("text-[16px] font-semibold tracking-[-0.01em] text-ink",n),...s}));oe.displayName="SheetTitle";const re=g.forwardRef(({className:n,...s},l)=>e.jsx(Ue,{ref:l,className:q("text-[13px] text-muted",n),...s}));re.displayName="SheetDescription";function ot(n){switch(n){case"llama-server":return"llamacpp";case"mlx":return"mlx";case"vllm":return"vllm";default:return"none"}}function At({modelKey:n,onClose:s,onViewRepo:l}){const r=we(),i=r.data?.engines.find(t=>t.id===r.data?.activeEngineId),c=Se(n,i?.id),d=Pe(),u=Ae(),f=Le(),[y,S]=g.useState(null),[a,j]=g.useState(null),[J,me]=g.useState(!1),[V,pe]=g.useState(!0),xe=Fe(),o=c.data,B=Re().data?.engine.state;g.useEffect(()=>{o&&j(structuredClone(o.profile))},[o]),g.useEffect(()=>{if(!n)return;const t=document.documentElement,m=parseInt(rt()??"",10);if(m>0){const h=Math.min(Math.max(m,Q),ce());t.style.setProperty("--tllm-config-w",`${h}px`)}return t.classList.add("tllm-config-open"),()=>t.classList.remove("tllm-config-open")},[n]),g.useEffect(()=>{y&&(B==="stopped"||B==="error")&&(u.start.mutate({key:y,base:a??void 0}),S(null))},[y,B,u.start]);const ue=i?.capabilities.kvTypes??["f16"],E=i?.capabilities.flags??[],A=t=>E.length===0||E.includes(t),X=t=>E.length===0||E.includes(`spec-type:${t}`),he=(o?.arch??"").toLowerCase(),fe=(o?.name??"").toLowerCase(),ge=/gemma4/.test(he)||/gemma[ _-]?4/.test(fe),ve=(o?.nextnLayers??0)>0,L=["off"];A("--spec-type")&&A("--mtp-head")&&ge&&L.push("mtp"),A("--spec-type")&&A("--model-draft")&&ve&&(X("nextn")||X("draft-mtp"))&&L.push("nextn"),A("--model-draft")&&L.push("draft");const T=g.useMemo(()=>!o||!a?null:$e(a,o,qe(o.gpus??[],a.gpu)),[o,a]),p=(t,m)=>j(h=>h&&{...h,[t]:m}),C=(t,m)=>j(h=>h&&{...h,sampling:{...h.sampling,[t]:m}}),Z=(t,m)=>j(h=>h&&{...h,gpu:{...h.gpu??te(),[t]:m}}),N=(t,m)=>j(h=>h&&{...h,vllm:{...h.vllm??at(),[t]:m}}),Y=d.load.error instanceof D?d.load.error.message:null,F=!!f&&f.modelKey===o?.key,je=!!f?.running&&F,R=!!f?.done&&F&&!f.running,be=u.start.error instanceof D?u.start.error.message:null,K=ot(i?.kind),P=K==="llamacpp",ye=K==="mlx",ke=K==="vllm",Ce=()=>{o&&(o.loaded?(S(o.key),d.eject.mutate()):u.start.mutate({key:o.key,base:a??void 0}))};g.useEffect(()=>{R&&o?.key&&xe.invalidateQueries({queryKey:["model",o.key]})},[R,o?.key]);const Ne=t=>{u.save.mutate(void 0,{onSuccess:()=>{if(H.success("Tuned settings saved"),t){const m=document.createElement("a");m.href="/api/v1/bench/log",m.click()}},onError:m=>H.error(m instanceof D?m.message:"Could not save tuned settings.")}),s()},Me=()=>{u.cancel.mutate(),s()};return e.jsxs(e.Fragment,{children:[e.jsx(st,{open:!!n,onOpenChange:t=>!t&&s(),modal:!1,children:e.jsxs(le,{className:"overflow-y-auto p-5",onPointerDownOutside:t=>t.preventDefault(),onInteractOutside:t=>t.preventDefault(),children:[e.jsx(it,{}),e.jsxs(lt,{children:[e.jsx(oe,{className:"truncate",children:o?.name??"Model"}),e.jsx(re,{children:o?`${o.arch} · ${o.quant} · ${gt(o.sizeBytes)}`:"Load settings"}),o?.sourceRepo&&l&&e.jsxs("button",{type:"button",onClick:()=>l(o.sourceRepo),className:"mt-1 inline-flex w-fit items-center gap-1 text-[12px] font-medium text-accent hover:underline",title:`View ${o.sourceRepo} on Hugging Face`,children:[e.jsx(Qe,{size:12})," Model card & quants on Hugging Face"]})]}),!o||!a?e.jsx("div",{className:"py-10 text-center text-[13px] text-muted",children:"Loading…"}):e.jsxs("div",{className:"flex flex-col gap-4",children:[T&&e.jsx(dt,{estMb:T.estMb,totalMb:T.totalVramMb,verdict:T.verdict}),P&&o.gpu&&e.jsx(mt,{running:je,done:R,step:F?f?.step:void 0,bestTps:F?f?.bestTps:void 0,resultError:R?f?.error:void 0,benchTps:o.benchTps,tuned:a.tunedBy==="bench",loaded:o.loaded,startError:be,pending:u.start.isPending||y!==null,onStart:Ce,onCancel:()=>u.cancel.mutate()}),ye&&e.jsxs("div",{className:"rounded-md border border-border bg-panel-2 px-3 py-2.5 text-[12px] text-muted",children:["MLX (Apple Silicon, mlx-lm) manages context and KV cache automatically — there are no context/GPU-layer/KV knobs to set. Only the ",e.jsx("span",{className:"text-ink",children:"sampling defaults"})," below apply at load; per-conversation overrides still work in chat."]}),ke&&e.jsxs(M,{children:[e.jsx(x,{label:"Max model length",hint:"vLLM --max-model-len. Max context tokens. Leave blank to derive from the model config.",children:e.jsx(k,{value:a.vllm?.maxModelLen||void 0,placeholder:"from model",min:1,max:o.nativeCtx||1048576,step:1024,onChange:t=>N("maxModelLen",t??0)})}),e.jsx(v,{label:"GPU memory utilization",hint:"vLLM --gpu-memory-utilization. Fraction of VRAM vLLM may reserve. Lower it to share the GPU.",value:Math.round((a.vllm?.gpuMemoryUtilization??.9)*100),min:10,max:100,step:5,onChange:t=>N("gpuMemoryUtilization",t/100),fmt:t=>`${t}%`}),e.jsx(x,{label:"Max concurrent sequences",hint:"vLLM --max-num-seqs. Requests served in parallel.",children:e.jsx(k,{value:a.vllm?.maxNumSeqs||void 0,placeholder:"auto",min:1,max:1024,step:1,onChange:t=>N("maxNumSeqs",t??0)})}),e.jsx(x,{label:"Compute dtype",hint:"vLLM --dtype. 'auto' follows the model's config.",children:e.jsx(_,{value:a.vllm?.dtype??"auto",options:["auto","bfloat16","float16","float32"],onChange:t=>N("dtype",t)})}),e.jsx(x,{label:"KV cache dtype",hint:"vLLM --kv-cache-dtype. fp8 roughly halves KV-cache memory.",children:e.jsx(_,{value:a.vllm?.kvCacheDtype??"auto",options:["auto","fp8"],onChange:t=>N("kvCacheDtype",t)})}),e.jsx(w,{label:"Enforce eager",hint:"vLLM --enforce-eager. Skips CUDA graphs: less VRAM, somewhat slower.",value:a.vllm?.enforceEager??!1,onChange:t=>N("enforceEager",t)}),e.jsx(w,{label:"Trust remote code",hint:"vLLM --trust-remote-code. Needed for models that ship custom modelling code.",value:a.vllm?.trustRemoteCode??!1,onChange:t=>N("trustRemoteCode",t)})]}),P&&e.jsxs(M,{children:[e.jsx(v,{label:"Context length",hint:"Tokens of history the model can use.",value:a.ctx,min:512,max:Math.max(512,o.nativeCtx||8192),step:512,onChange:t=>p("ctx",t),fmt:t=>t.toLocaleString()}),o.gpu&&e.jsx(v,{label:"GPU layers",hint:o.blockCount>0?`${o.blockCount} total layers.`:"All layers on GPU = max performance.",value:a.ngl,min:0,max:o.blockCount>0?o.blockCount:99,step:1,onChange:t=>p("ngl",t),fmt:t=>t>=(o.blockCount>0?o.blockCount:99)?"All":String(t)}),o.moe&&o.blockCount>0&&e.jsx(v,{label:"MoE experts on CPU",hint:"Higher = less VRAM, slower. Lower = faster if it fits.",value:a.nCpuMoe,min:0,max:o.blockCount,step:1,onChange:t=>p("nCpuMoe",t)}),e.jsx(x,{label:"Context overflow",hint:"What to do when the context window fills up.",children:e.jsx(z,{value:a.contextOverflow,options:["shift","keep"],onChange:t=>p("contextOverflow",t)})}),a.contextOverflow==="keep"&&e.jsx(x,{label:"Tokens to keep",hint:"Preserve this many tokens from the start (e.g. system prompt length) when shifting.",children:e.jsx(U,{value:a.nKeep,min:0,max:a.ctx,onChange:t=>p("nKeep",t)})}),e.jsx(x,{label:"Batch size",hint:"--batch-size: logical prompt-processing batch. Larger = faster prefill, more VRAM.",children:e.jsx(k,{value:a.batchSize,placeholder:"2048",min:1,max:65536,step:128,onChange:t=>p("batchSize",t)})}),e.jsx(x,{label:"Micro-batch size",hint:"--ubatch-size: physical micro-batch. Must be ≤ batch size.",children:e.jsx(k,{value:a.uBatchSize,placeholder:"512",min:1,max:65536,step:128,onChange:t=>p("uBatchSize",t)})})]}),o.gpus&&o.gpus.length>1&&(i?.kind==="llama-server"||i?.kind==="vllm")&&e.jsxs(e.Fragment,{children:[e.jsxs(O,{children:["Multi-GPU · ",o.gpus.length," GPUs"]}),e.jsx(M,{children:i.kind==="vllm"?e.jsx(x,{label:"Tensor parallel size",hint:"Shard the model across this many GPUs.",children:e.jsx(U,{value:a.gpu?.tensorParallelSize??1,min:1,max:o.gpus.length,onChange:t=>Z("tensorParallelSize",t)})}):e.jsx(pt,{gpus:o.gpus,gpu:a.gpu??te(),setG:Z})})]}),P&&e.jsxs(M,{children:[e.jsx(x,{label:"Parallel slots",children:e.jsx(U,{value:a.parallel,min:1,max:16,onChange:t=>p("parallel",t)})}),e.jsx(x,{label:"KV cache type",hint:"turbo* are TurboQuant-fork exclusive.",children:e.jsx(_,{value:a.kvTypeK,options:ue,onChange:t=>j(m=>m&&{...m,kvTypeK:t,kvTypeV:t})})}),e.jsx(x,{label:"Flash attention",children:e.jsx(z,{value:a.flashAttn,options:["auto","on","off"],onChange:t=>p("flashAttn",t)})}),e.jsx(x,{label:"KV cache",hint:"VRAM is fastest; RAM frees VRAM for bigger models.",children:e.jsx(z,{value:a.kvOffload===!1?"RAM":"GPU",options:["GPU","RAM"],onChange:t=>p("kvOffload",t==="GPU")})}),e.jsx(w,{label:"Use Jinja chat template",value:a.useJinja,onChange:t=>p("useJinja",t)}),a.useJinja&&e.jsx(W,{label:"Template file path (optional)",hint:"Leave empty to use model's built-in template.",value:a.chatTemplateFile,placeholder:"Path to .jinja template file",onChange:t=>p("chatTemplateFile",t)})]}),e.jsx(O,{children:"Sampling"}),e.jsxs(M,{children:[e.jsx(v,{label:"Temperature",value:a.sampling.temp,min:0,max:2,step:.05,onChange:t=>C("temp",t),fmt:t=>t.toFixed(2)}),e.jsx(v,{label:"Top P",value:a.sampling.topP,min:0,max:1,step:.01,onChange:t=>C("topP",t),fmt:t=>t.toFixed(2)}),e.jsx(v,{label:"Top K",value:a.sampling.topK,min:0,max:200,step:1,onChange:t=>C("topK",t)}),e.jsx(v,{label:"Min P",value:a.sampling.minP,min:0,max:1,step:.01,onChange:t=>C("minP",t),fmt:t=>t.toFixed(2)}),P&&e.jsxs(e.Fragment,{children:[e.jsx(v,{label:"Repeat penalty",hint:"Penalise tokens that appeared earlier. 1.0 = off.",value:a.sampling.repeatPenalty,min:1,max:2,step:.05,onChange:t=>C("repeatPenalty",t),fmt:t=>t.toFixed(2)}),e.jsx(v,{label:"Presence penalty",hint:"Flat penalty for any token that appeared. 0 = off.",value:a.sampling.presencePenalty,min:0,max:2,step:.05,onChange:t=>C("presencePenalty",t),fmt:t=>t.toFixed(2)}),e.jsx(v,{label:"Frequency penalty",hint:"Penalty proportional to how often a token appeared. 0 = off.",value:a.sampling.frequencyPenalty,min:0,max:2,step:.05,onChange:t=>C("frequencyPenalty",t),fmt:t=>t.toFixed(2)}),e.jsx(x,{label:"Stop strings",hint:"Halt generation when any of these sequences is produced.",children:e.jsx("div",{className:"w-full"})}),e.jsx(ht,{value:a.sampling.stop,onChange:t=>j(m=>m&&{...m,sampling:{...m.sampling,stop:t}})})]})]}),P&&L.length>1&&e.jsxs(e.Fragment,{children:[e.jsx(O,{children:"Speculative decoding"}),e.jsxs(M,{children:[e.jsx(x,{label:"Mode",hint:"Predict extra tokens per step — faster generation.",children:e.jsx(ut,{value:a.speculative,options:L,onChange:t=>p("speculative",t)})}),a.speculative==="mtp"&&e.jsx(W,{label:"MTP head GGUF",hint:"Gemma-4 assistant model file.",value:a.mtpHeadPath,placeholder:"Path to gemma-4-mtp-assistant.gguf",onChange:t=>p("mtpHeadPath",t)}),a.speculative==="nextn"&&e.jsx("p",{className:"text-[11px] text-faint",children:"Uses this model's built-in NextN head — no extra file needed."}),a.speculative==="draft"&&e.jsx(W,{label:"Draft model GGUF",hint:"A small same-family model.",value:a.draftModelPath,placeholder:"Path to small draft model",onChange:t=>p("draftModelPath",t)}),a.speculative!=="off"&&e.jsxs(e.Fragment,{children:[e.jsx(x,{label:"Max drafts",hint:"Tokens the draft head proposes per step before verification (--draft-max). Default 16.",children:e.jsx(k,{value:a.draftMax,placeholder:"16",min:1,max:64,onChange:t=>p("draftMax",t)})}),e.jsx(x,{label:"Min drafts",hint:"Minimum tokens drafted per step before the main model verifies (--draft-min). Default 1.",children:e.jsx(k,{value:a.draftMin,placeholder:"1",min:0,max:8,onChange:t=>p("draftMin",t)})})]})]})]}),P&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{type:"button",onClick:()=>me(t=>!t),className:"flex items-center gap-1 text-[13px] font-medium text-muted hover:text-ink",children:[e.jsx(Je,{size:14,className:J?"rotate-180 transition-transform":"transition-transform"}),"Advanced"]}),J&&e.jsxs(M,{children:[e.jsx(v,{label:"CPU threads",hint:a.threads===0?`Auto — half your cores (${ft(o.cores)} of ${o.cores||"?"})`:`${a.threads} of ${o.cores||"?"} cores`,value:a.threads,min:0,max:Math.max(1,o.cores||64),step:1,onChange:t=>p("threads",t),fmt:t=>t===0?"Auto":String(t)}),e.jsx(w,{label:"Reuse cached prompt",hint:"Skips re-processing the unchanged start of a prompt on repeated or continued requests — faster first token. Recommended on.",value:a.cacheReuse>0,onChange:t=>p("cacheReuse",t?256:0)}),o.vision&&e.jsx(w,{label:"Vision encoder on GPU",value:a.mmprojGpu,onChange:t=>p("mmprojGpu",t)}),a.parallel>1&&e.jsx(w,{label:"Unified KV across slots",value:a.kvUnified,onChange:t=>p("kvUnified",t)}),e.jsx(x,{label:"RoPE scaling",hint:"Extend context beyond the model's trained limit. 'none' = model native.",children:e.jsx(z,{value:a.ropeScalingType,options:["none","linear","yarn"],onChange:t=>p("ropeScalingType",t)})}),a.ropeScalingType!=="none"&&e.jsxs(e.Fragment,{children:[e.jsx(x,{label:"RoPE freq base",hint:"Base frequency override. Leave blank for model native.",children:e.jsx(k,{value:a.ropeFreqBase||void 0,placeholder:"model native",min:1,max:1e7,onChange:t=>p("ropeFreqBase",t??0)})}),e.jsx(x,{label:"RoPE freq scale",hint:"Frequency scale — e.g. 0.25 for 4× context. Leave blank for model native.",children:e.jsx(k,{value:a.ropeFreqScale||void 0,placeholder:"model native",min:.01,max:10,step:.01,onChange:t=>p("ropeFreqScale",t??0)})})]})]})]}),Y&&e.jsx("p",{className:"text-[12px]",style:{color:"var(--err)"},children:Y}),e.jsxs("label",{className:"flex cursor-pointer items-center gap-2 pt-1 text-[13px] text-ink",children:[e.jsx("input",{type:"checkbox",checked:V,onChange:t=>pe(t.target.checked),className:"h-4 w-4 accent-[var(--accent)]"}),"Remember these settings",e.jsx("span",{className:"text-[11px] text-faint",children:V?"· saved as this model's default":"· this load only"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(G,{className:"flex-1",onClick:()=>{const t=()=>d.load.mutate({key:o.key,overrides:a},{onError:m=>H.error(m instanceof D?`Could not load model: ${m.message}`:"Could not load model — check the engine logs on the Engines screen.")});V?d.save.mutate({key:o.key,profile:a,engineId:i?.id??"*"},{onSuccess:t,onError:t}):t(),s()},disabled:d.load.isPending,children:[e.jsx(se,{size:14}),o.loaded?"Reload":"Load model"]}),e.jsxs(G,{variant:"outline",onClick:()=>d.save.mutate({key:o.key,profile:a,engineId:i?.id??"*"}),disabled:d.save.isPending,title:"Save without reloading",children:[e.jsx(Xe,{size:14}),"Save"]}),e.jsx(G,{variant:"ghost",onClick:()=>d.reset.mutate({key:o.key,engineId:i?.id??"*"}),disabled:d.reset.isPending,title:"Reset to defaults",children:e.jsx(Ze,{size:14})})]})]})]})}),e.jsx(ct,{result:R&&F?f?.result:void 0,modelName:o?.name,onSave:Ne,onCancel:Me})]})}const ie="tllm-config-w",Q=360;function ce(){return Math.max(Q,Math.min(760,window.innerWidth-220))}function rt(){try{return localStorage.getItem(ie)}catch{return null}}function it(){const n=s=>{if(s.button!==0)return;s.preventDefault();const l=document.documentElement;l.classList.add("tllm-resizing");const r=c=>{const d=Math.min(Math.max(window.innerWidth-c.clientX,Q),ce());l.style.setProperty("--tllm-config-w",`${Math.round(d)}px`)},i=()=>{l.classList.remove("tllm-resizing"),window.removeEventListener("pointermove",r),window.removeEventListener("pointerup",i);try{localStorage.setItem(ie,getComputedStyle(l).getPropertyValue("--tllm-config-w").trim())}catch{}};window.addEventListener("pointermove",r),window.addEventListener("pointerup",i)};return e.jsx("div",{className:"tllm-config-resizer",onPointerDown:n,role:"separator","aria-orientation":"vertical","aria-label":"Resize panel"})}function b({label:n,value:s,tag:l}){return e.jsxs("div",{className:"flex items-center justify-between gap-3 py-[3px]",children:[e.jsx("span",{className:"text-muted",children:n}),e.jsxs("span",{className:"flex items-center gap-1.5",children:[l&&e.jsx("span",{className:"rounded px-1 py-0.5 text-[10px] font-medium uppercase tracking-wide",style:{color:"var(--accent)",background:"color-mix(in srgb, var(--accent) 12%, transparent)"},children:l}),e.jsx("span",{className:"font-mono text-ink",children:s})]})]})}function I({title:n}){return e.jsx("div",{className:"mt-2 pb-1 pt-1 text-[11px] font-semibold uppercase tracking-wide text-faint first:mt-0 first:pt-0",children:n})}function ct({result:n,modelName:s,onSave:l,onCancel:r}){const[i,c]=g.useState(!0),d=n?.recommendedSampling,u=n?.sampling,f=a=>d?.[a]!=null,y=!!d&&(d.temp!=null||d.topP!=null||d.topK!=null||d.minP!=null),S=[{label:"Temperature",key:"temp"},{label:"Top-K",key:"topK"},{label:"Top-P",key:"topP"},{label:"Min-P",key:"minP"}];return e.jsx(Ve,{open:!!n,onOpenChange:a=>{a||r()},children:e.jsxs(Be,{children:[e.jsxs(Ke,{children:[e.jsx(He,{children:"Auto-tune complete"}),e.jsx(Ie,{asChild:!0,children:e.jsxs("div",{className:"flex flex-col gap-2.5 text-[13px]",children:[e.jsxs("span",{className:"text-muted",children:["Fastest config found on your machine —"," ",e.jsxs("span",{className:"font-mono font-medium",style:{color:"var(--ok)"},children:[n?.tps.toFixed(1)," tok/s"]}),". Save applies this complete config to ",s??"this model",":"]}),n&&e.jsxs("div",{className:"rounded-md border border-border bg-panel-2 px-3 py-1.5",children:[e.jsx(I,{title:"Runtime"}),e.jsx(b,{label:"GPU layers",value:n.params.ngl}),n.params.nCpuMoe>0&&e.jsx(b,{label:"MoE experts on CPU",value:n.params.nCpuMoe}),e.jsx(b,{label:"Context length",value:`${n.params.ctx.toLocaleString()} tok`}),e.jsx(b,{label:"KV cache type",value:n.params.kvTypeK}),e.jsx(b,{label:"Flash attention",value:n.params.flashAttn}),n.params.parallel>1&&e.jsx(b,{label:"Parallel slots",value:n.params.parallel}),e.jsx(I,{title:"Sampling"}),u?S.map(({label:a,key:j})=>e.jsx(b,{label:a,value:u[j]??"—",tag:f(j)?"from card":void 0},j)):e.jsx(b,{label:"Sampling",value:"model defaults"}),e.jsx(I,{title:"Measured"}),e.jsx(b,{label:"Speed",value:`${n.tps.toFixed(1)} tok/s`}),n.vramMb!=null&&e.jsx(b,{label:"VRAM used",value:`~${n.vramMb.toLocaleString()} MB`}),n.ttftMs?e.jsx(b,{label:"First token",value:`${Math.round(n.ttftMs)} ms`}):null]}),e.jsxs("span",{className:"text-faint",children:[y?e.jsxs(e.Fragment,{children:["Values tagged ",e.jsx("span",{style:{color:"var(--accent)"},children:"from card"})," were read from the model's Hugging Face page. "]}):e.jsx(e.Fragment,{children:"No sampling recommendation was found on the model's card — sampling stays at your current values. "}),"Change any of these later in Sampling."]})]})})]}),e.jsxs(Oe,{children:[e.jsxs("label",{className:"mr-auto flex cursor-pointer items-center gap-1.5 text-[12px] text-muted",children:[e.jsx("input",{type:"checkbox",checked:i,onChange:a=>c(a.target.checked),className:"h-3.5 w-3.5 accent-[var(--accent)]"}),"Download run log"]}),e.jsx(_e,{onClick:r,children:"Cancel"}),e.jsx(We,{onClick:()=>l(i),children:"Save"})]})]})})}function dt({estMb:n,totalMb:s,verdict:l}){if(l==="cpu"||s===0)return e.jsx("div",{className:"rounded-md border border-border bg-panel-2 px-3 py-2 text-[12px] text-muted",children:"CPU-only — no GPU detected."});const r=l==="fits"?"var(--ok)":l==="tight"?"var(--warn)":"var(--err)",i=Math.min(100,Math.round(n/s*100)),c=l==="overflow"?"will spill to system RAM — expect severe slowdown":l==="tight"?"may slow under desktop load":"fits comfortably";return e.jsxs("div",{className:"rounded-md border border-border bg-panel-2 px-3 py-2.5",children:[e.jsxs("div",{className:"mb-1.5 flex items-center justify-between text-[12px]",children:[e.jsx("span",{className:"text-muted",children:"Estimated VRAM"}),e.jsxs("span",{style:{color:r},children:["~",(n/1e3).toFixed(1)," / ",(s/1e3).toFixed(1)," GB · ",c]})]}),e.jsx("div",{className:"h-2 overflow-hidden rounded-full",style:{background:"var(--border)"},children:e.jsx("div",{className:"h-full rounded-full transition-all",style:{width:`${i}%`,background:r}})})]})}function mt({running:n,done:s,step:l,bestTps:r,resultError:i,benchTps:c,tuned:d,loaded:u,startError:f,pending:y,onStart:S,onCancel:a}){return e.jsx("div",{className:"rounded-lg border border-border bg-panel p-3",children:n?e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{className:"flex items-center gap-2 text-[13px] text-ink",children:[e.jsx(ee,{size:14,className:"animate-pulse",style:{color:"var(--accent)"}}),"Auto-tuning…"]}),e.jsxs(G,{variant:"outline",onClick:a,children:[e.jsx(ae,{size:14}),"Cancel"]})]}),e.jsx("p",{className:"font-mono text-[12px] text-muted",children:l??"Preparing…"}),r!==void 0&&e.jsxs("p",{className:"text-[12px] text-ink",children:["Best so far: ",e.jsxs("span",{className:"font-mono",style:{color:"var(--ok)"},children:[r.toFixed(1)," tok/s"]})]})]}):e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-1.5 text-[13px] font-medium text-ink",children:[e.jsx(ee,{size:14,style:{color:"var(--accent)"}}),"Auto-tune"]}),e.jsx("p",{className:"text-[11px] text-faint",children:c!==null?`Tuned: ${c.toFixed(1)} tok/s on your machine${d?" · settings applied below":""}`:"Measures real speed on your hardware and saves the fastest settings (~3 min)."})]}),e.jsxs(G,{variant:"outline",onClick:S,disabled:y,children:[e.jsx(se,{size:14}),u?"Stop & benchmark":"Auto-tune"]})]}),s&&r!==void 0&&!i&&e.jsxs("p",{className:"text-[12px] text-ink",children:["Done — ",e.jsxs("span",{className:"font-mono",style:{color:"var(--ok)"},children:[r.toFixed(1)," tok/s"]}),". Saved as this model's default."]}),s&&i&&e.jsx("p",{className:"text-[12px]",style:{color:"var(--warn)"},children:i}),f&&e.jsx("p",{className:"text-[12px]",style:{color:"var(--err)"},children:f})]})})}function M({children:n}){return e.jsx("div",{className:"flex flex-col gap-3 rounded-lg border border-border bg-panel p-3",children:n})}function O({children:n}){return e.jsx("div",{className:"text-[12px] font-semibold uppercase tracking-wide text-faint",children:n})}function v({label:n,hint:s,value:l,min:r,max:i,step:c,onChange:d,fmt:u}){return e.jsxs("div",{children:[e.jsxs("div",{className:"mb-1 flex items-baseline justify-between",children:[e.jsx("span",{className:"text-[13px] text-ink",children:n}),e.jsx("span",{className:"font-mono text-[12px] text-muted",children:u?u(l):l})]}),e.jsx("input",{type:"range",min:r,max:i,step:c,value:l,onChange:f=>d(Number(f.target.value)),className:"w-full accent-[var(--accent)]"}),s&&e.jsx("p",{className:"mt-0.5 text-[11px] text-faint",children:s})]})}function x({label:n,hint:s,children:l}){return e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[13px] text-ink",children:n}),s&&e.jsx("div",{className:"text-[11px] text-faint",children:s})]}),e.jsx("div",{className:"shrink-0",children:l})]})}function U({value:n,min:s,max:l,step:r=1,onChange:i}){return e.jsx("input",{type:"number",min:s,max:l,step:r,value:n,onChange:c=>i(Math.max(s,Math.min(l,Number(c.target.value)||s))),className:"w-20 rounded-md border border-border bg-bg px-2 py-1 text-right text-[13px] text-ink outline-none"})}function k({value:n,placeholder:s,min:l,max:r,step:i=1,onChange:c}){return e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("input",{type:"number",min:l,max:r,step:i,value:n??"",placeholder:s,onChange:d=>{const u=d.target.value;c(u===""?void 0:Math.max(l,Math.min(r,Number(u))))},className:"w-20 rounded-md border border-border bg-bg px-2 py-1 text-right text-[13px] text-ink outline-none placeholder:text-faint"}),n!==void 0&&e.jsx("button",{type:"button",onClick:()=>c(void 0),className:"shrink-0 text-faint hover:text-ink",title:"Reset to default",children:"×"})]})}function _({value:n,options:s,onChange:l}){return e.jsx("select",{value:n,onChange:r=>l(r.target.value),className:"rounded-md border border-border bg-bg px-2 py-1 text-[13px] text-ink outline-none",children:s.map(r=>e.jsx("option",{value:r,children:r},r))})}function z({value:n,options:s,onChange:l}){return e.jsx("div",{className:"flex overflow-hidden rounded-md border border-border",children:s.map(r=>e.jsx("button",{type:"button",onClick:()=>l(r),className:"px-2.5 py-1 text-[12px] capitalize transition-colors",style:{background:n===r?"var(--accent)":"transparent",color:n===r?"var(--on-accent)":"var(--muted)"},children:r},r))})}function de(n,s){const l=n.vramMb?` (${Math.round(n.vramMb/1024)} GB)`:"";return`GPU ${s}${n.name?` · ${n.name}`:""}${l}`}function ne({gpus:n,value:s,allowAuto:l,onChange:r}){return e.jsxs("select",{value:String(s),onChange:i=>r(Number(i.target.value)),className:"max-w-[260px] rounded-md border border-border bg-bg px-2 py-1 text-[13px] text-ink outline-none",children:[l&&e.jsx("option",{value:"-1",children:"Auto"}),n.map((i,c)=>e.jsx("option",{value:String(c),children:de(i,c)},c))]})}function pt({gpus:n,gpu:s,setG:l}){const r=s.tensorSplit.length>0;return e.jsxs(e.Fragment,{children:[e.jsx(x,{label:"Split mode",hint:"layer = by layers (default) · row = tensor-parallel · none = single GPU.",children:e.jsx(z,{value:s.splitMode,options:["layer","row","none"],onChange:i=>l("splitMode",i)})}),s.splitMode==="none"?e.jsx(x,{label:"GPU",hint:"Which GPU to load the model on.",children:e.jsx(ne,{gpus:n,value:s.mainGpu>=0?s.mainGpu:0,allowAuto:!1,onChange:i=>l("mainGpu",i)})}):e.jsxs(e.Fragment,{children:[e.jsx(x,{label:"Main GPU",hint:"Holds the KV cache / small tensors. Auto lets the engine choose.",children:e.jsx(ne,{gpus:n,value:s.mainGpu,allowAuto:!0,onChange:i=>l("mainGpu",i)})}),e.jsx(w,{label:"Custom GPU split",hint:"Off = even split across GPUs. On = set each GPU's share.",value:r,onChange:i=>l("tensorSplit",i?n.map(()=>1):[])}),r&&e.jsx("div",{className:"flex flex-col gap-2 pl-1",children:n.map((i,c)=>e.jsx(x,{label:de(i,c),children:e.jsx(U,{value:s.tensorSplit[c]??0,min:0,max:100,onChange:d=>l("tensorSplit",n.map((u,f)=>f===c?d:s.tensorSplit[f]??0))})},c))})]})]})}const xt={off:"Off",mtp:"MTP",nextn:"NextN",draft:"Draft"};function ut({value:n,options:s,onChange:l}){return e.jsx("div",{className:"flex overflow-hidden rounded-md border border-border",children:s.map(r=>e.jsx("button",{type:"button",onClick:()=>l(r),className:"px-2.5 py-1 text-[12px] transition-colors",style:{background:n===r?"var(--accent)":"transparent",color:n===r?"var(--on-accent)":"var(--muted)"},children:xt[r]},r))})}function W({label:n,hint:s,value:l,placeholder:r,onChange:i}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"text-[12px] text-ink",children:[n,s&&e.jsx("span",{className:"ml-1 text-faint",children:s})]}),e.jsx("input",{type:"text",value:l,placeholder:r,onChange:c=>i(c.target.value),className:"w-full rounded-md border border-border bg-bg px-2 py-1 font-mono text-[12px] text-ink outline-none placeholder:text-faint"})]})}function ht({value:n,onChange:s}){const[l,r]=g.useState(""),i=c=>{const d=c.trim();d&&!n.includes(d)&&s([...n,d]),r("")};return e.jsxs("div",{className:"flex flex-col gap-1.5",children:[n.length>0&&e.jsx("div",{className:"flex flex-wrap gap-1",children:n.map(c=>e.jsxs("span",{className:"flex items-center gap-0.5 rounded border border-border bg-panel-2 px-1.5 py-0.5 font-mono text-[11px] text-ink",children:[c,e.jsx("button",{type:"button",onClick:()=>s(n.filter(d=>d!==c)),className:"ml-0.5 text-muted hover:text-[var(--err)]",children:"×"})]},c))}),e.jsx("input",{type:"text",value:l,placeholder:n.length?"Add another…":"Type a stop string, press Enter",onChange:c=>r(c.target.value),onKeyDown:c=>{c.key==="Enter"&&(c.preventDefault(),i(l)),c.key==="Backspace"&&!l&&n.length&&s(n.slice(0,-1))},onBlur:()=>{l.trim()&&i(l)},className:"w-full rounded-md border border-border bg-bg px-2 py-1 font-mono text-[12px] text-ink outline-none placeholder:text-faint"})]})}function w({label:n,hint:s,value:l,onChange:r}){return e.jsxs("label",{className:"flex cursor-pointer items-center justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("span",{className:"text-[13px] text-ink",children:n}),s&&e.jsx("p",{className:"text-[11px] text-faint",children:s})]}),e.jsx("input",{type:"checkbox",checked:l,onChange:i=>r(i.target.checked),className:"h-4 w-4 shrink-0 accent-[var(--accent)]"})]})}function ft(n){return Math.max(1,Math.floor((n||2)/2))}function gt(n){return n>=1e9?`${(n/1e9).toFixed(1)} GB`:`${Math.round(n/1e6)} MB`}export{At as M,St as S,se as Z,Pt as a,st as b,le as c,lt as d,oe as e,re as f};
@@ -0,0 +1 @@
1
+ import{j as e}from"./radix-DVGeLgPN.js";import{r as c}from"./vendor-BE0HADM8.js";import{A as m,X as x,I as p,B as u}from"./index-tVO2x-Rw.js";import{S as f}from"./star-BCxsXqcv.js";import{F as g}from"./save-DI4M5kP-.js";function D({dirs:a,primaryDir:s,mut:t}){const[o,i]=c.useState(""),n=t.addDir.error instanceof m?t.addDir.error.message:null,l=()=>{const r=o.trim();r&&t.addDir.mutate(r,{onSuccess:()=>i("")})};return e.jsxs("div",{className:"mb-5 rounded-lg border border-border bg-panel-2 p-4",children:[e.jsx("div",{className:"mb-2 text-[13px] font-medium text-ink",children:"Model folders"}),a.length>0&&e.jsx("div",{className:"mb-3 flex flex-col gap-1.5",children:a.map(r=>{const d=r===s;return e.jsxs("div",{className:"group/dir flex items-center gap-2 text-[13px]",children:[e.jsx("span",{className:"flex-1 truncate font-mono text-muted",children:r}),d?e.jsx(h,{tone:"ok",children:"Primary"}):e.jsxs("button",{type:"button",onClick:()=>t.setPrimaryDir.mutate(r),disabled:t.setPrimaryDir.isPending,title:"Downloads and imports will land in this folder",className:"flex items-center gap-1 rounded px-1.5 py-0.5 text-[11px] text-faint opacity-0 transition-opacity hover:text-ink focus:opacity-100 group-hover/dir:opacity-100",children:[e.jsx(f,{size:12}),"Set as primary"]}),e.jsx("button",{type:"button","aria-label":`Remove ${r}`,onClick:()=>t.removeDir.mutate(r),className:"rounded p-1 text-muted transition-colors hover:text-ink",children:e.jsx(x,{size:14})})]},r)})}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(p,{value:o,onChange:r=>i(r.target.value),onKeyDown:r=>r.key==="Enter"&&l(),placeholder:"Paste an absolute folder path, e.g. D:\\\\models",className:"flex-1 font-mono text-[13px]"}),e.jsxs(u,{size:"sm",onClick:l,disabled:t.addDir.isPending||!o.trim(),children:[e.jsx(g,{size:14}),"Add folder"]})]}),n&&e.jsx("p",{className:"mt-2 text-[12px]",style:{color:"var(--err)"},children:n})]})}function h({children:a,tone:s}){const t=s==="ok"?"var(--ok)":s==="warn"?"var(--warn)":s==="err"?"var(--err)":s==="spec"?"var(--accent)":"var(--muted)";return e.jsx("span",{className:"rounded px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide",style:{color:t,background:`color-mix(in srgb, ${t} 12%, transparent)`},children:a})}export{D as M};