@minimaxclaw/cli 1.0.42 → 1.0.44
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.
- package/README.md +19 -21
- package/bin/dscode.exe +4 -0
- package/install.cjs +15 -0
- package/package.json +9 -9
- package/web/dist/assets/AssistantsView-Y4TXobGE.js +1 -0
- package/web/dist/assets/AutomationView-DfAF2L92.js +3 -0
- package/web/dist/assets/Button-D-g7PgYh.js +1 -0
- package/web/dist/assets/ChannelConfigView-WJ-zUV8p.js +12 -0
- package/web/dist/assets/ChartsView-CSAfGqTC.js +1 -0
- package/web/dist/assets/ConnectorsView-DaHmxnGE.js +2 -0
- package/web/dist/assets/{MessageBubble-CVGXupVH.js → DiffPreview-D8tIj_aF.js} +64 -67
- package/web/dist/assets/FileContextMenu-C5WYeBNu.js +1 -0
- package/web/dist/assets/FileTreeView-B7IN0KmE.js +1 -0
- package/web/dist/assets/HookConfigView-9gqvrRhQ.js +2 -0
- package/web/dist/assets/InboxView-BcEfijbj.js +1 -0
- package/web/dist/assets/InputArea-D5F91Uwk.js +14 -0
- package/web/dist/assets/Install-Cuelo0If.js +2 -0
- package/web/dist/assets/MemoryView-BvZSh5-T.js +1 -0
- package/web/dist/assets/ModelsView-BgvMN8xv.js +1 -0
- package/web/dist/assets/PluginsView-C3d6e8vV.js +1 -0
- package/web/dist/assets/ProjectsView-CM7GOsoK.js +1 -0
- package/web/dist/assets/SessionGrid-BQSrCDqQ.js +4 -0
- package/web/dist/assets/SettingsModal-BvGXq5EE.js +4 -0
- package/web/dist/assets/SkillsView-87kGRliE.js +1 -0
- package/web/dist/assets/TemplatesTab-8MLwVNwV.js +1 -0
- package/web/dist/assets/ToolsView-CjdYiaNz.js +1 -0
- package/web/dist/assets/{agentIconSet-B5GUQwel.js → agentIconSet-CDeMxTHf.js} +1 -1
- package/web/dist/assets/api-ZQf0Ys8y.js +1 -0
- package/web/dist/assets/channelMeta-BO645sjD.js +1 -0
- package/web/dist/assets/common-CPZxdYLs.js +304 -0
- package/web/dist/assets/icons-B8Ngx6rM.js +1 -0
- package/web/dist/assets/imageUrl-CrQM4gmf.js +74 -0
- package/web/dist/assets/index-Bm7r92T3.css +1 -0
- package/web/dist/assets/index-STsyoFCk.js +145 -0
- package/web/dist/assets/installDiagnosis-ZYUVgJIJ.js +3 -0
- package/web/dist/assets/{markdown-N5__3T-w.js → markdown-Cps-36Z5.js} +1 -1
- package/web/dist/assets/{panels-CIPgN61N.js → panels-DCwx2Pbu.js} +1 -1
- package/web/dist/assets/{react-vendor-CB4cLN-6.js → react-vendor-CXI113IS.js} +1 -1
- package/web/dist/assets/sessionKind-CZ1kQQII.js +1 -0
- package/web/dist/assets/{settingsStore-Xqln0d91.js → settingsStore-BSdi9gNd.js} +1 -1
- package/web/dist/assets/src-BK8SoTFV.js +1 -0
- package/web/dist/assets/{state-CSZ50keL.js → state-pOTP5BEk.js} +1 -1
- package/web/dist/assets/statusAxesRefresh--2evRuAU.js +1 -0
- package/web/dist/assets/sttLanguages-BPcOF0nQ.js +2 -0
- package/web/dist/assets/{types-JssxRFJn.js → threads-lr33dwqg.js} +1 -1
- package/web/dist/assets/useConfirm-CQjBnYuP.js +1 -0
- package/web/dist/assets/{useTranslation-B-mfApCn.js → useTranslation-gGKZZfux.js} +1 -1
- package/web/dist/assets/websocket-CeKJTCdp.js +1 -0
- package/web/dist/assets/whatsNewStore-C0hbStfc.js +1 -0
- package/web/dist/assets/{workspaceSemantics-RaIRer76.js → workspaceSemantics-CW8ytHq2.js} +3 -3
- package/web/dist/favicon.svg +31 -14
- package/web/dist/icons/icon-1024.png +0 -0
- package/web/dist/icons/icon-180.png +0 -0
- package/web/dist/icons/icon-192.png +0 -0
- package/web/dist/icons/icon-512.png +0 -0
- package/web/dist/icons/icon-maskable-512.png +0 -0
- package/web/dist/index.html +38 -35
- package/web/dist/logo.svg +42 -20
- package/web/dist/manifest.webmanifest +2 -2
- package/web/dist/assets/AssistantsView-Ct3BBpYf.js +0 -1
- package/web/dist/assets/AutomationView-CO-jVhee.js +0 -3
- package/web/dist/assets/ChannelConfigView-Ct1W584x.js +0 -8
- package/web/dist/assets/ChartsView-CAc37Sam.js +0 -1
- package/web/dist/assets/ConnectorsView-DP4bbh58.js +0 -1
- package/web/dist/assets/FileTreeView-DwsYfssO.js +0 -1
- package/web/dist/assets/HookConfigView-uFsqieii.js +0 -2
- package/web/dist/assets/InputArea-BY8quOiH.js +0 -14
- package/web/dist/assets/MemoryView-Bgd_lcTf.js +0 -1
- package/web/dist/assets/ModelsView-B271UV9L.js +0 -1
- package/web/dist/assets/PluginsView-Dz4fqQR1.js +0 -2
- package/web/dist/assets/ProjectsView-DF-YCV8y.js +0 -1
- package/web/dist/assets/SessionGrid-BIREstN2.js +0 -4
- package/web/dist/assets/SettingsModal-ZJeoZcCd.js +0 -4
- package/web/dist/assets/SkillsView-CH2ghYL2.js +0 -1
- package/web/dist/assets/TemplatesTab-BGe7_67s.js +0 -1
- package/web/dist/assets/ThreadsView-XditIHZ4.js +0 -2
- package/web/dist/assets/ToolsView-BBzsFdVZ.js +0 -1
- package/web/dist/assets/api-plEYhRn0.js +0 -1
- package/web/dist/assets/channelMeta-BGQXQxgj.js +0 -1
- package/web/dist/assets/common-Bbatsa0-.js +0 -192
- package/web/dist/assets/icons-CYDRRPKW.js +0 -1
- package/web/dist/assets/index-CTbLW314.js +0 -133
- package/web/dist/assets/index-DdzVrZye.css +0 -1
- package/web/dist/assets/src-49LUQhkG.js +0 -1
- package/web/dist/assets/sttLanguages-CSNMgUTz.js +0 -2
- package/web/dist/assets/ttsSettings-BwXYpDnk.js +0 -2
- package/web/dist/assets/useConfirm-Da8iQ_DZ.js +0 -1
- package/web/dist/assets/websocket-BnDwh01e.js +0 -1
- package/web/dist/assets/whatsNewStore-LpdLRLGl.js +0 -1
- /package/web/dist/assets/{MessageBubble-CCTRbIMZ.css → DiffPreview-CCTRbIMZ.css} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{A as t,Er as n,Ir as r,Jn as i,Or as a,Tr as o,Wn as s,Y as c,a as l,dt as u,ft as d,g as f,in as p,it as m,n as h,ni as g,o as _,v,yr as y,yt as ee}from"./icons-B8Ngx6rM.js";import{t as te}from"./useTranslation-gGKZZfux.js";import{i as b,r as x,t as S}from"./Button-D-g7PgYh.js";import{t as C}from"./src-BK8SoTFV.js";import{l as w}from"./workspaceSemantics-CW8ytHq2.js";import{t as T}from"./api-ZQf0Ys8y.js";import{I as E}from"./markdown-Cps-36Z5.js";import{r as ne,t as re}from"./useConfirm-CQjBnYuP.js";import{c as ie,d as ae,f as oe}from"./common-CPZxdYLs.js";import{_t as D,gt as se,vt as O}from"./index-STsyoFCk.js";var k=e(g(),1),A=E();function j(e){return e==null?``:String(e)}function ce({provider:e,modelId:t,current:n,catalog:r,onSaved:i,className:a}){let{t:o}=te(),[s,c]=(0,k.useState)(!1),[l,u]=(0,k.useState)({input:j(n?.input),output:j(n?.output),cacheRead:j(n?.cacheRead),cacheWrite:j(n?.cacheWrite)}),d=(0,k.useRef)(!1),f=`${n?.input??``}|${n?.output??``}|${n?.cacheRead??``}|${n?.cacheWrite??``}`;(0,k.useEffect)(()=>{d.current||u({input:j(n?.input),output:j(n?.output),cacheRead:j(n?.cacheRead),cacheWrite:j(n?.cacheWrite)})},[f]);let p=(0,k.useMemo)(()=>(r.input??0)>0||(r.output??0)>0?{input:String(r.input),output:String(r.output),cacheRead:String(r.cacheRead||r.input),cacheWrite:String(r.cacheWrite||r.input)}:{input:`—`,output:`—`,cacheRead:`—`,cacheWrite:`—`},[r.input,r.output,r.cacheRead,r.cacheWrite]),m=async()=>{let r={};for(let e of[`input`,`output`,`cacheRead`,`cacheWrite`]){let t=l[e].trim();if(t===``)continue;let n=Number(t);if(!Number.isFinite(n)||n<0){b.error(o(`models.priceInvalid`,{field:o(`models.price_${e}`)}));return}r[e]=n}let a=Object.keys(r).length===0;if((n?.input??void 0)!==r.input||(n?.output??void 0)!==r.output||(n?.cacheRead??void 0)!==r.cacheRead||(n?.cacheWrite??void 0)!==r.cacheWrite){c(!0),d.current=!0;try{let n=await T.models.update(e,t,{model:{pricing:a?null:r}});if(n.success===!1)throw Error(n.error||o(`models.priceSaveFailed`));b.success(o(`models.priceSaved`,{model:t})),i?.()}catch(e){b.error(e instanceof Error?e.message:o(`models.priceSaveFailed`))}finally{c(!1),window.setTimeout(()=>{d.current=!1},0)}}};return(0,A.jsxs)(`div`,{className:x(`flex flex-wrap items-center gap-2 text-xs`,a),children:[(0,A.jsx)(`span`,{className:`text-dark-muted whitespace-nowrap max-md:whitespace-normal`,title:o(`models.priceHint`),children:o(`models.priceOverride`)}),[`input`,`output`,`cacheRead`,`cacheWrite`].map(e=>(0,A.jsxs)(`label`,{className:`flex items-center gap-1`,children:[(0,A.jsx)(`span`,{className:`text-dark-tertiary whitespace-nowrap`,children:o(`models.price_${e}`)}),(0,A.jsx)(`input`,{type:`number`,min:0,step:`0.001`,inputMode:`decimal`,value:l[e],placeholder:p[e],disabled:s,onChange:t=>u(n=>({...n,[e]:t.target.value})),onBlur:()=>void m(),onKeyDown:e=>{e.key===`Enter`&&m()},className:x(`w-20 rounded border bg-dark-bg px-1.5 py-0.5 text-xs text-dark-text disabled:opacity-50`,l[e].trim()===``?`border-dark-border`:`border-accent-yellow`),title:`${o(`models.price_${e}`)} · ${o(`models.pricePerMillion`)}`})]},e)),(0,A.jsx)(`span`,{className:`text-badge text-dark-tertiary`,children:o(`models.pricePerMillion`)})]})}function le(e){return e==null?``:String(e)}function ue(e){let t=e.trim();if(t===``)return null;let n=Number(t);return!Number.isFinite(n)||n<=0?`invalid`:Math.floor(n)}function de({provider:e,modelId:t,current:n,defaults:r,onSaved:i,className:a}){let{t:o}=te(),[s,c]=(0,k.useState)(!1),[l,u]=(0,k.useState)({maxInput:le(n?.contextWindow),maxOutput:le(n?.maxTokens)}),d=(0,k.useRef)(!1),f=`${n?.contextWindow??``}|${n?.maxTokens??``}`;(0,k.useEffect)(()=>{d.current||u({maxInput:le(n?.contextWindow),maxOutput:le(n?.maxTokens)})},[f]);let p=async()=>{let r=ue(l.maxInput),a=ue(l.maxOutput);if(r===`invalid`||a===`invalid`)b.error(o(`models.budgetInvalid`,{field:o(r===`invalid`?`models.maxInputTokensLabel`:`models.maxOutputTokensLabel`)}));else if((n?.contextWindow??null)!==r||(n?.maxTokens??null)!==a){c(!0),d.current=!0;try{let n=await T.models.update(e,t,{model:{contextWindow:r,maxTokens:a}});if(n.success===!1)throw Error(n.error||o(`models.budgetSaveFailed`));b.success(o(`models.budgetSaved`,{model:t})),i?.()}catch(e){b.error(e instanceof Error?e.message:o(`models.budgetSaveFailed`))}finally{c(!1),window.setTimeout(()=>{d.current=!1},0)}}},m=[{key:`maxInput`,label:o(`models.maxInputTokensLabel`),title:o(`models.maxInputTokensTitle`),placeholder:String(r.input)},{key:`maxOutput`,label:o(`models.maxOutputTokensLabel`),title:o(`models.maxOutputTokensTitle`),placeholder:String(r.output)}];return(0,A.jsxs)(`div`,{className:x(`flex flex-wrap items-center gap-2 text-xs`,a),children:[(0,A.jsx)(`span`,{className:`text-dark-muted whitespace-nowrap`,children:o(`models.budgetLabel`)}),m.map(e=>(0,A.jsxs)(`label`,{className:`flex items-center gap-1`,children:[(0,A.jsx)(`span`,{className:`text-dark-tertiary whitespace-nowrap`,children:e.label}),(0,A.jsx)(`input`,{type:`number`,min:1,step:`1`,inputMode:`numeric`,value:l[e.key],placeholder:e.placeholder,disabled:s,onChange:t=>u(n=>({...n,[e.key]:t.target.value})),onBlur:()=>void p(),onKeyDown:e=>{e.key===`Enter`&&p()},className:x(`w-24 rounded border bg-dark-bg px-1.5 py-0.5 text-xs text-dark-text disabled:opacity-50`,l[e.key].trim()===``?`border-dark-border`:`border-accent-yellow`),title:`${e.title} ${o(`models.budgetBlankHint`)}`})]},e.key)),(0,A.jsx)(`span`,{className:`text-badge text-dark-tertiary`,children:o(`models.budgetBlankHint`)})]})}function fe({modelId:e,provider:t,className:n}){let{t:r}=te(),i=ie(e=>e.kinds),a=ie(e=>e.entries),o=ie(e=>e.saving),s=ie(e=>e.saveEntry),c=ie(e=>e.load);if((0,k.useEffect)(()=>{c()},[c]),i.length===0)return null;let l=e=>{let t=i.find(t=>t.id===e);return t?.labelKey?r(t.labelKey):e},u=n=>n?.model?n.model===`${t}/${e}`||n.model===`${t}:${e}`?!0:n.provider&&n.provider!==t?!1:n.model===e:!1,d=async n=>{let i=a[n],o=u(i),c=i?.model,d={...i??{}};o?(delete d.model,delete d.provider):(d.model=`${t}/${e}`,d.provider=t);let f=Object.values(d).some(e=>e!==void 0);await s(n,f?d:null)&&(o?b.success(r(`models.kindUnboundToast`,{kind:l(n),model:e})):c&&c!==e?b.success(r(`models.kindRebindToast`,{kind:l(n),from:c,to:e})):b.success(r(`models.kindBoundToast`,{kind:l(n),model:e})))};return(0,A.jsxs)(`div`,{className:x(`flex flex-wrap items-center gap-1.5 text-xs`,n),children:[(0,A.jsx)(`span`,{className:`text-dark-muted whitespace-nowrap max-md:whitespace-normal`,title:r(`models.kindTagsHint`),children:r(`models.kindTags`)}),i.map(e=>{let t=a[e.id],n=u(t),i=!n&&t?.model?t.model:null;return(0,A.jsx)(`button`,{type:`button`,disabled:o,onClick:()=>void d(e.id),title:i?r(`models.kindTakenHint`,{kind:l(e.id),model:i}):r(`models.kindTagsHint`),className:x(`px-1.5 py-0.5 rounded border transition-colors disabled:opacity-50`,n?`bg-accent-blue/20 border-accent-blue text-accent-blue font-medium`:i?`bg-dark-bg border-dark-border text-dark-tertiary`:`bg-dark-bg border-dark-border text-dark-muted hover:border-accent-blue/60 hover:text-dark-text`),children:l(e.id)},e.id)})]})}var M=46,pe=140,me=22,N=216,he=[{fill:`fill-accent-blue`,dot:`bg-accent-blue`},{fill:`fill-accent-purple`,dot:`bg-accent-purple`},{fill:`fill-accent-cyan`,dot:`bg-accent-cyan`},{fill:`fill-accent-green`,dot:`bg-accent-green`},{fill:`fill-accent-yellow`,dot:`bg-accent-yellow`},{fill:`fill-accent-orange`,dot:`bg-accent-orange`}],P={fill:`fill-dark-tertiary`,dot:`bg-dark-tertiary`},ge={fill:`fill-dark-muted`,dot:`bg-dark-muted`},_e={fill:`fill-accent-blue`,dot:`bg-accent-blue`};function F({points:e,showValueLabels:t=!1,showTokenLabels:n=!1}){let{t:r}=te(),[i,a]=(0,k.useState)(null),o=(0,k.useMemo)(()=>{let t=new Map;for(let n of e)for(let e of n.models??[])t.set(e.modelId,(t.get(e.modelId)??0)+e.totalTokens);return[...t.entries()].sort((e,t)=>t[1]-e[1]).map(([e])=>e)},[e]),s=o.length>0,c=(0,k.useMemo)(()=>{let e=new Map;return o.slice(0,he.length).forEach((t,n)=>{let r=he[n];r&&e.set(t,r)}),t=>{let n=t.models??[];if(n.length===0)return[{key:ge.fill,label:r(`insights.chartModelUnknown`),tokens:t.totalTokens,costDollars:t.costDollars,requests:t.requests,color:ge}];let i=[],a=null,o=0;for(let t of n){o+=t.totalTokens;let n=e.get(t.modelId);n?i.push({key:t.modelId,label:t.modelId,tokens:t.totalTokens,costDollars:t.costDollars,requests:t.requestCount,color:n}):(a||={key:`__rest`,label:r(`insights.chartModelRest`),tokens:0,costDollars:0,requests:0,color:P},a.tokens+=t.totalTokens,a.costDollars+=t.costDollars,a.requests+=t.requestCount)}a&&i.push(a);let s=t.totalTokens-o;return s>0&&i.push({key:`__unknown`,label:r(`insights.chartModelUnknown`),tokens:s,costDollars:0,requests:0,color:ge}),i.sort((e,t)=>t.tokens-e.tokens)}},[o,r]);if(e.length===0)return(0,A.jsx)(`div`,{className:`flex h-32 items-center justify-center text-xs text-dark-muted`,children:r(`insights.noUsageData`)});let l=+!!n+ +!!t,u=pe-(l===0?16:l===1?20:28)-me,d=Math.max(...e.map(e=>e.totalTokens),1),f=Math.max(...e.filter(e=>e.priced).map(e=>e.costDollars),0),p=e.length*M,m=e=>e<=0?0:Math.max(2,e/d*u),h=e=>f<=0?118:118-e/f*u,g=[],_=!1;e.forEach((e,t)=>{let n=t*M+M/2;if(!e.priced){_=!1;return}let r=h(e.costDollars);g.push(`${_?`L`:`M`} ${n.toFixed(1)} ${r.toFixed(1)}`),_=!0});let v=i?e.findIndex(e=>e.day===i):-1,y=v>=0?e[v]:null,ee=v>=0?v*M+M/2:0,b=Math.max(0,Math.min(ee-N/2,Math.max(0,p-N))),S=y?c(y):[],C=S.slice(0,6),w=S.slice(6),T=w.reduce((e,t)=>e+t.tokens,0),E=w.reduce((e,t)=>e+t.costDollars,0),ne=(0,k.useMemo)(()=>{if(!s)return[];let t=new Map;for(let n of e)for(let e of c(n)){if(e.tokens<=0)continue;let n=t.get(e.key);n?n.tokens+=e.tokens:t.set(e.key,{...e})}return[...t.values()].sort((e,t)=>t.tokens-e.tokens)},[s,e,c]);return(0,A.jsxs)(`div`,{className:`overflow-x-auto`,children:[(0,A.jsxs)(`div`,{className:`relative`,style:{width:p},children:[(0,A.jsxs)(`svg`,{width:p,height:pe,role:`img`,"aria-label":r(`insights.usageTrend`),children:[e.map((e,r)=>{let o=r*M+M/2,l=m(e.totalTokens),u=e.day===i,d=l>0?c(e):[],f=118;return(0,A.jsxs)(`g`,{"data-testid":l>0?`daily-bar`:void 0,"data-day":e.day,tabIndex:l>0?0:void 0,onMouseEnter:()=>a(e.day),onMouseLeave:()=>a(null),onFocus:()=>a(e.day),onBlur:()=>a(null),className:`outline-none`,children:[(0,A.jsx)(`rect`,{x:r*M,y:0,width:M,height:119,style:{fill:u&&l>0?`currentColor`:`transparent`,opacity:u&&l>0?.06:0,pointerEvents:l>0?`all`:`none`}}),(0,A.jsx)(`rect`,{x:o-11,y:118,width:22,height:1,className:`fill-dark-border`}),d.map((t,n)=>{let r=t.tokens/Math.max(e.totalTokens,1),i=n===d.length-1?Math.max(0,f-(118-l)):Math.max(1,r*l),a=f-i;return f=a,(0,A.jsx)(`rect`,{"data-testid":`daily-bar-seg`,"data-model":t.key,x:o-11,y:a,width:22,height:i,rx:d.length===1?2:0,className:s?t.color.fill:_e.fill,fillOpacity:s?.85:.7},t.key)}),n&&e.totalTokens>0&&(0,A.jsx)(`text`,{"data-testid":`daily-tokens`,x:o,y:118-l-4,textAnchor:`middle`,className:`fill-dark-text`,style:{fontSize:9},children:D(e.totalTokens)}),t&&e.totalTokens>0&&(0,A.jsx)(`text`,{"data-testid":`daily-value`,x:o,y:118-l-4-(n?10:0),textAnchor:`middle`,className:e.priced?`fill-accent-green`:`fill-dark-muted`,style:{fontSize:9},children:e.priced?O(e.costDollars):`—`}),(0,A.jsx)(`text`,{x:o,y:131,textAnchor:`middle`,className:x(`fill-dark-muted`,u&&`fill-dark-text`),style:{fontSize:9},children:e.day.slice(5)})]},e.day)}),g.length>0&&(0,A.jsx)(`path`,{d:g.join(` `),fill:`none`,className:`stroke-accent-green`,strokeWidth:1.6,strokeLinejoin:`round`,strokeLinecap:`round`})]}),y&&y.totalTokens>0&&(0,A.jsxs)(`div`,{"data-testid":`daily-tooltip`,className:`pointer-events-none absolute top-1 z-20 rounded border border-dark-border bg-dark-surface px-2 py-1.5 text-badge shadow-xl`,style:{left:b,width:N},children:[(0,A.jsxs)(`div`,{className:`mb-1 flex items-center justify-between gap-2`,children:[(0,A.jsx)(`span`,{className:`font-medium text-dark-text`,children:y.day}),(0,A.jsxs)(`span`,{className:`tabular-nums text-dark-muted`,children:[y.requests,`×`]})]}),(0,A.jsxs)(`div`,{className:`space-y-0.5`,children:[C.map(e=>(0,A.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,A.jsx)(`span`,{className:x(`inline-block h-2 w-2 shrink-0 rounded-sm`,e.color.dot)}),(0,A.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-dark-muted`,title:e.label,children:e.label}),(0,A.jsx)(`span`,{className:`shrink-0 tabular-nums text-dark-text`,children:D(e.tokens)}),(0,A.jsx)(`span`,{className:`w-14 shrink-0 text-end tabular-nums text-accent-yellow`,children:y.priced?O(e.costDollars):`—`})]},e.key)),T>0&&(0,A.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,A.jsx)(`span`,{className:`inline-block h-2 w-2 shrink-0 rounded-sm bg-dark-tertiary`}),(0,A.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-dark-muted`,children:`${r(`insights.chartModelRest`)} +${w.length}`}),(0,A.jsx)(`span`,{className:`shrink-0 tabular-nums text-dark-text`,children:D(T)}),(0,A.jsx)(`span`,{className:`w-14 shrink-0 text-end tabular-nums text-accent-yellow`,children:y.priced?O(E):`—`})]})]}),(0,A.jsxs)(`div`,{className:`mt-1 flex items-center justify-between gap-2 border-t border-dark-border/60 pt-1`,children:[(0,A.jsx)(`span`,{className:`text-dark-muted`,children:r(`insights.hoverTotal`)}),(0,A.jsxs)(`span`,{className:`tabular-nums text-dark-text`,children:[D(y.totalTokens),(0,A.jsx)(`span`,{className:`mx-1 opacity-50`,children:`·`}),y.priced?O(y.costDollars):r(`insights.costUnknown`)]})]})]})]}),(0,A.jsxs)(`div`,{className:`mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-badge text-dark-muted`,children:[s?ne.map(e=>(0,A.jsxs)(`span`,{className:`flex items-center gap-1`,title:e.label,children:[(0,A.jsx)(`span`,{className:x(`inline-block h-2 w-2 rounded-sm`,e.color.dot)}),(0,A.jsx)(`span`,{className:`max-w-[9rem] truncate`,children:e.label}),(0,A.jsx)(`span`,{className:`tabular-nums text-dark-tertiary`,children:D(e.tokens)})]},e.key)):(0,A.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,A.jsx)(`span`,{className:`inline-block h-2 w-2 rounded-sm bg-accent-blue/70`}),r(`insights.legendTokens`)]}),(0,A.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,A.jsx)(`span`,{className:`inline-block h-0.5 w-3 bg-accent-green`}),r(`insights.legendCost`)]})]})]})}var ve=14,I=`dsc.models.usageCollapsed`;function L(){try{return window.localStorage.getItem(I)===`1`}catch{return!1}}function R(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function z(e){if(!Array.isArray(e))return;let t=e=>typeof e==`number`&&Number.isFinite(e)?e:0,n=[];for(let r of e){if(!r||typeof r!=`object`)continue;let e=r,i=typeof e.modelId==`string`?e.modelId:``;i&&n.push({modelId:i,totalTokens:t(e.totalTokens),inputTokens:t(e.inputTokens),outputTokens:t(e.outputTokens),cacheReadTokens:t(e.cacheReadTokens),cacheWriteTokens:t(e.cacheWriteTokens),requestCount:t(e.requestCount),costDollars:t(e.costDollars)})}return n}function B(e){if(!e||typeof e!=`object`)return null;let t=e,n=typeof t.day==`string`?t.day:typeof t.date==`string`?t.date:void 0;if(!n)return null;let r=e=>typeof e==`number`&&Number.isFinite(e)?e:0;return{day:n,costDollars:r(t.costDollars),requests:r(t.requests),inputTokens:r(t.inputTokens),outputTokens:r(t.outputTokens),totalTokens:r(t.totalTokens),cacheReadTokens:r(t.cacheReadTokens),cacheWriteTokens:r(t.cacheWriteTokens),priced:t.priced===!0,models:z(t.models)}}function ye({className:e}){let{t}=te(),[r,i]=(0,k.useState)(null),[o,s]=(0,k.useState)(!1),[c,l]=(0,k.useState)(null),[u,d]=(0,k.useState)(0),[f,p]=(0,k.useState)(L),[h,g]=(0,k.useState)(!1),[_,y]=(0,k.useState)(!1);(0,k.useEffect)(()=>{if(!h)return;let e=window.setTimeout(()=>g(!1),4e3);return()=>window.clearTimeout(e)},[h]);let ee=()=>{p(e=>{let t=!e;try{window.localStorage.setItem(I,t?`1`:`0`)}catch{}return t})};(0,k.useEffect)(()=>{let e=()=>d(e=>e+1);return window.addEventListener(`models-updated`,e),()=>window.removeEventListener(`models-updated`,e)},[]),(0,k.useEffect)(()=>{let e=!1;return s(!0),l(null),(async()=>{try{let n=await T.observability.costs();if(e)return;n.success&&n.data?i(n.data):l(n.error||t(`models.usageLoadFailed`))}catch(n){e||l(n instanceof Error?n.message:t(`models.usageLoadFailed`))}finally{e||s(!1)}})(),()=>{e=!0}},[u]);let b=async()=>{if(!h)g(!0);else{g(!1),y(!0),l(null);try{let e=await T.observability.resetCosts();if(!e.success){l(e.error||t(`models.usageResetFailed`));return}d(e=>e+1)}catch(e){l(e instanceof Error?e.message:t(`models.usageResetFailed`))}finally{y(!1)}}},S=(0,k.useMemo)(()=>{let e=new Map;for(let t of r?.daily??[]){let n=B(t);n&&e.set(n.day,n)}let t=[],n=new Date;for(let r=13;r>=0;r--){let i=R(new Date(n.getFullYear(),n.getMonth(),n.getDate()-r)),a=e.get(i);t.push(a?{...a,empty:!1}:{day:i,costDollars:0,requests:0,inputTokens:0,outputTokens:0,totalTokens:0,cacheReadTokens:0,cacheWriteTokens:0,priced:!1,empty:!0})}return t},[r]),C=(0,k.useMemo)(()=>{let e=0,t=0,n=0,r=0;for(let i of S)e+=i.totalTokens,t+=i.requests,n+=i.cacheReadTokens,r+=i.inputTokens;return{tokens:e,requests:t,inputTokens:r,cacheReadTokens:n}},[S]),w=(0,k.useMemo)(()=>{let e=[...r?.byModel??[]].sort((e,t)=>t.totalCostDollars-e.totalCostDollars),t=Math.max(1e-9,...e.map(e=>e.totalCostDollars));return{rows:e.slice(0,5),maxCost:t}},[r]),E=!!(r&&(r.totalCostDollars>0||C.tokens>0||(r.byModel?.length??0)>0));return(0,A.jsxs)(`div`,{className:x(`rounded-lg border border-dark-border bg-dark-surface/40 p-3`,e),children:[(0,A.jsxs)(`div`,{className:`mb-2 flex items-center justify-between gap-2`,children:[(0,A.jsxs)(`button`,{type:`button`,onClick:ee,"aria-expanded":!f,className:`inline-flex min-w-0 items-center gap-1.5 text-sm font-medium hover:text-accent-blue`,title:t(f?`common.expand`:`common.collapse`),children:[f?(0,A.jsx)(n,{size:14,className:`shrink-0 text-dark-muted`}):(0,A.jsx)(a,{size:14,className:`shrink-0 text-dark-muted`}),(0,A.jsx)(`span`,{className:`truncate`,children:t(`models.usageTitle`)})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-2`,children:[f&&E&&(0,A.jsxs)(`span`,{className:`text-badge tabular-nums text-dark-muted`,children:[O(r.totalCostDollars),(0,A.jsx)(`span`,{className:`mx-1 opacity-60`,children:`·`}),D(C.tokens)]}),(0,A.jsxs)(`button`,{type:`button`,onClick:()=>d(e=>e+1),disabled:o,className:`inline-flex items-center gap-1 rounded border border-dark-border px-2 py-0.5 text-xs text-dark-muted hover:text-dark-text disabled:opacity-50`,title:t(`models.usageRefresh`),children:[(0,A.jsx)(m,{size:11,className:o?`animate-spin`:void 0}),t(`models.usageRefresh`)]}),(0,A.jsxs)(`button`,{type:`button`,onClick:b,disabled:_||o,className:x(`inline-flex items-center gap-1 rounded border px-2 py-0.5 text-xs disabled:opacity-50`,h?`border-accent-red/60 bg-accent-red/10 text-accent-red`:`border-dark-border text-dark-muted hover:text-dark-text`),title:t(`models.usageResetHint`),children:[(0,A.jsx)(v,{size:11,className:_?`animate-pulse`:void 0}),t(h?`models.usageResetConfirm`:_?`models.usageResetting`:`models.usageReset`)]})]})]}),c&&(0,A.jsx)(`div`,{className:`text-xs text-accent-red`,children:c}),!c&&!E&&!o&&(0,A.jsx)(`div`,{className:`py-6 text-center text-xs text-dark-muted`,children:t(`models.usageEmpty`)}),E&&!f&&(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`div`,{className:`mb-3 grid grid-cols-2 gap-2 sm:grid-cols-4`,children:[(0,A.jsx)(be,{label:t(`models.usageTotalCost`),value:O(r.totalCostDollars),tone:`cost`}),(0,A.jsx)(be,{label:t(`models.usageWindowTokens`,{days:ve}),value:D(C.tokens)}),(0,A.jsx)(be,{label:t(`models.usageWindowRequests`,{days:ve}),value:String(C.requests)}),(0,A.jsx)(be,{label:t(`models.usageCacheHitRate`),value:se(C.cacheReadTokens,C.inputTokens,0)})]}),(0,A.jsx)(`div`,{className:`mb-1 flex items-baseline justify-between`,children:(0,A.jsx)(`span`,{className:`text-badge text-dark-muted`,children:t(`models.usageDailyTitle`)})}),(0,A.jsx)(F,{points:S,showValueLabels:!0,showTokenLabels:!0}),w.rows.length>0&&(0,A.jsxs)(`div`,{className:`mt-3 border-t border-dark-border/60 pt-2`,children:[(0,A.jsx)(`div`,{className:`mb-1 text-badge text-dark-muted`,children:t(`models.usageTopModels`)}),(0,A.jsx)(`div`,{className:`space-y-1`,children:w.rows.map(e=>(0,A.jsxs)(`div`,{className:`flex items-center gap-2 text-xs`,children:[(0,A.jsx)(`span`,{className:`w-40 shrink-0 truncate text-dark-text max-md:w-20`,title:e.modelId,children:e.modelId}),(0,A.jsx)(`div`,{className:`h-2 flex-1 overflow-hidden rounded-full bg-dark-border/40`,children:(0,A.jsx)(`div`,{className:`h-full rounded-full bg-accent-purple/70`,style:{width:`${Math.max(1,e.totalCostDollars/w.maxCost*100)}%`}})}),(0,A.jsx)(`span`,{className:`w-20 shrink-0 text-end tabular-nums text-accent-yellow`,children:O(e.totalCostDollars)}),(0,A.jsx)(`span`,{className:`w-20 shrink-0 text-end tabular-nums text-dark-muted`,children:D(e.totalInputTokens+e.totalOutputTokens)}),(0,A.jsxs)(`span`,{className:`w-16 shrink-0 text-end tabular-nums text-dark-tertiary`,children:[e.requestCount,`×`]})]},e.modelId))})]}),S.some(e=>!e.priced&&!e.empty)&&(0,A.jsx)(`div`,{className:`mt-2 text-badge text-accent-yellow`,children:t(`models.usageCostUnknownHint`)})]})]})}function be({label:e,value:t,tone:n}){return(0,A.jsxs)(`div`,{className:`rounded border border-dark-border/60 bg-dark-bg px-2 py-1.5`,children:[(0,A.jsx)(`div`,{className:`text-badge text-dark-muted truncate`,children:e}),(0,A.jsx)(`div`,{className:x(`text-sm font-semibold tabular-nums`,n===`cost`?`text-accent-yellow`:`text-dark-text`),children:t})]})}function xe(){let[e,t]=(0,k.useState)([]),[n,r]=(0,k.useState)(`1.0`),[i,a]=(0,k.useState)(!0),[o,s]=(0,k.useState)(!0),[c,l]=(0,k.useState)(null),u=(0,k.useCallback)(async()=>{s(!0),l(null);try{let e=await T.providers.presets();e.success&&e.data?(t(Array.isArray(e.data.providers)?e.data.providers:[]),r(e.data.version||`1.0`),a(e.data.customSupported!==!1)):l(e.error||`获取 Provider 列表失败`)}catch(e){l(e instanceof Error?e.message:`未知错误`)}finally{s(!1)}},[]);return(0,k.useEffect)(()=>{u()},[u]),{presets:e,loading:o,error:c,version:n,customSupported:i,reload:u}}var Se=[{key:`global`,labelKey:`chat.globalDefault`,color:`text-accent-red`,bg:`bg-accent-red/20`},{key:`goal`,labelKey:`chat.goalDefault`,color:`text-accent-purple`,bg:`bg-accent-purple/20`}];function Ce(e){let t=Number((e??``).trim());return Number.isFinite(t)&&t>0?Math.floor(t):null}var we={providerKey:``,apiKeys:[],modelIds:``,baseUrl:``,apiType:``,fullPath:!1,imageUseCustom:!1,imageEndpoint:``,imageModel:``,imageApiKey:``,setDefault:!1,modelOverrides:{}},Te=C,Ee={"openai-chat-completions":`OpenAI Chat`,"openai-completions":`OpenAI Compatible`,"openai-responses":`OpenAI Responses`,"anthropic-messages":`Anthropic Messages`,"codex-responses":`Codex (本机登录)`,"claude-code":`Claude Code (本机登录)`};function V(e){return e.trim().split(`|`)[0].trim()}function De(e){let t=e.toLowerCase();return t.startsWith(`claude-code://`)||t.includes(`/backend-api/codex`)?t.startsWith(`claude-code://`)?`claude-code`:`codex-responses`:t.includes(`/anthropic`)||t.includes(`/coding`)||t.includes(`/claude`)||t.includes(`/messages`)?`anthropic-messages`:t.includes(`/responses`)?`openai-responses`:`openai-completions`}function Oe(e){if(!e)return{};let t={};for(let n of e.models){let r={};n.apiType&&n.apiType!==e.apiType&&(r.apiType=n.apiType),n.baseUrl&&(r.baseUrl=n.baseUrl),typeof n.contextWindow==`number`&&n.contextWindow!==e.contextWindow&&(r.maxInput=String(n.contextWindow)),typeof n.maxTokens==`number`&&n.maxTokens!==e.maxTokens&&(r.maxOutput=String(n.maxTokens)),Object.keys(r).length>0&&(t[n.id]=r)}return t}var ke={"opencode-free":5,"opencode-go":6,commandcode:7,deepseek:10,moonshotai:20,"moonshotai-cn":21,"kimi-for-coding":22,zhipuai:30,zai:31,"alibaba-cn":40,alibaba:41,minimax:50,"minimax-cn":51,moark:60,siliconflow:70,"siliconflow-cn":71,"stepfun-ai":80,stepfun:81,modelscope:90,openai:100,anthropic:110,google:120,"google-vertex":121,meta:130,mistral:140,groq:150,xai:160,cohere:170,openrouter:180,huggingface:190};function H(){let{presets:e,loading:n,reload:a}=xe(),{t:g}=te(),[x,C]=re(),[E,ie]=(0,k.useState)([]),[D,se]=(0,k.useState)(null),[O,j]=(0,k.useState)(!0),le=(0,k.useRef)(!1),[ue,M]=(0,k.useState)(null),[pe,me]=(0,k.useState)(null),[N,he]=(0,k.useState)(null),[P,ge]=(0,k.useState)([]),[_e,F]=(0,k.useState)(!1),[ve,I]=(0,k.useState)(`select`),[L,R]=(0,k.useState)(null),[z,B]=(0,k.useState)(we),[be,H]=(0,k.useState)(``),[je,Me]=(0,k.useState)(!1),[Ne,W]=(0,k.useState)(null),[Pe,Fe]=(0,k.useState)(!1),[Ie,Le]=(0,k.useState)(!1),[Re,ze]=(0,k.useState)(``),[Be,Ve]=(0,k.useState)(!1),[G,K]=(0,k.useState)([]),[He,q]=(0,k.useState)(new Set),[Ue,J]=(0,k.useState)(null),[We,Ge]=(0,k.useState)(``),[Ke,qe]=(0,k.useState)(!1),[Je,Ye]=(0,k.useState)(!1),[Xe,Y]=(0,k.useState)(null),Ze=(0,k.useMemo)(()=>{let e=We.trim().toLowerCase();return e?G.filter(t=>t.id.toLowerCase().includes(e)||t.name.toLowerCase().includes(e)):G},[G,We]),X=(0,k.useCallback)(async()=>{try{let e=await T.config.provider.get();e.success&&e.data&&(he(e.data),ge(Array.isArray(e.data.entries)?e.data.entries:[]))}catch{}},[]),Z=(0,k.useCallback)(async()=>{let e=!le.current;e&&j(!0),M(null);try{let[e,t]=await Promise.all([T.models.list(),T.system.status()]);if(await X(),e.success&&e.data&&Array.isArray(e.data.models)&&ie(e.data.models),t.success&&t.data){let e=t.data.models||{total:0,online:0,offline:0};se({overallStatus:e.offline===0?`healthy`:e.online>0?`degraded`:`unhealthy`,healthRate:e.total>0?e.online/e.total:0,healthyInstances:e.online,totalInstances:e.total,totalRequests:0})}le.current=!0}catch{e&&M(g(`models.loadFailed`))}finally{e&&j(!1)}},[X,g]);(0,k.useEffect)(()=>{Z()},[Z]),(0,k.useEffect)(()=>{let e=()=>{Z(),X()};return window.addEventListener(`models-updated`,e),()=>window.removeEventListener(`models-updated`,e)},[Z,X]);let Qe=(0,k.useCallback)(e=>`${e.provider}:${e.id}`,[]),Q=(0,k.useMemo)(()=>{let t=[...e];return t.find(e=>e.key===`custom`)||t.push({key:`custom`,name:`Custom`,baseUrl:``,apiType:`openai-completions`,defaultModel:``,isCustom:!0}),t},[e]),$e=(0,k.useMemo)(()=>[...Q].sort((e,t)=>{if(e.isCustom)return-1;if(t.isCustom)return 1;let n=ke[e.key],r=ke[t.key];return n!==void 0&&r!==void 0?n-r:n===void 0?r===void 0?e.name.localeCompare(t.name):1:-1}),[Q]),et=(0,k.useMemo)(()=>{let e=Re.trim().toLowerCase();return e?$e.filter(t=>t.name.toLowerCase().includes(e)||t.key.toLowerCase().includes(e)||(t.defaultModel||``).toLowerCase().includes(e)||(t.baseUrl||``).toLowerCase().includes(e)||(t.models||[]).some(t=>String(t).toLowerCase().includes(e))):$e},[$e,Re]),tt=(0,k.useMemo)(()=>{let e=N?.providers||{},t=new Set(Q.map(e=>e.key)),n=Object.entries(e).filter(([e])=>!t.has(e));if(n.length!==0)return{keys:n.map(([e])=>e),modelCount:n.reduce((e,[,t])=>e+(t.modelCount||0),0),hasApiKey:n.some(([,e])=>e.hasApiKey),baseUrl:n.find(([,e])=>e.baseUrl)?.[1]?.baseUrl||``,apiType:n.find(([,e])=>e.apiType)?.[1]?.apiType||`openai-completions`}},[N,Q]),$=L===`custom`?z.providerKey.trim():L||``,nt=(0,k.useMemo)(()=>$?E.filter(e=>e.provider===$):[],[E,$]),rt=(0,k.useMemo)(()=>{let e=new Map;for(let t of E)e.has(t.provider)||e.set(t.provider,[]),e.get(t.provider).push(t);for(let t of P)e.has(t.key)||e.set(t.key,[]);let t=[...e.keys()];return t.sort((e,t)=>{let n=ke[e],r=ke[t];return n!==void 0&&r!==void 0?n-r:n===void 0?r===void 0?e.localeCompare(t):1:-1}),t.map(t=>({provider:t,models:e.get(t)||[]}))},[E,P]),it=(0,k.useCallback)(e=>{let t=N?.providers?.[e.key],n=P.find(t=>t.key===e.key),r=E.filter(t=>t.provider===e.key).map(e=>e.id),i=e.models?.slice(0,3).join(`, `)||e.defaultModel,a=r.length>0?r.join(`, `):i;R(e.key),H(``),B({providerKey:e.key,apiKeys:[``],modelIds:a,baseUrl:t?.baseUrl||e.baseUrl,apiType:t?.apiType||e.apiType,fullPath:t?.fullPath===!0,imageUseCustom:!!n?.imageEndpoint,imageEndpoint:n?.imageEndpoint||``,imageModel:n?.imageModel||``,imageApiKey:``,setDefault:N?.defaultProvider!==e.key,modelOverrides:Oe(n)}),I(`form`),F(!0),W(null),Fe(!1),K([]),q(new Set),J(null),Ge(``)},[E,N,P]),at=(0,k.useCallback)(e=>{let t=N?.providers?.[e],n=P.find(t=>t.key===e),r=E.filter(t=>t.provider===e).map(e=>e.id).join(`, `);R(`custom`),H(e),B({providerKey:e,apiKeys:[``],modelIds:r,baseUrl:t?.baseUrl||``,apiType:t?.apiType||``,fullPath:t?.fullPath===!0,imageUseCustom:!!n?.imageEndpoint,imageEndpoint:n?.imageEndpoint||``,imageModel:n?.imageModel||``,imageApiKey:``,setDefault:N?.defaultProvider!==e,modelOverrides:Oe(n)}),W(null),Fe(!1),K([]),q(new Set),J(null),Ge(``)},[N,E,P]),ot=(0,k.useCallback)(()=>{R(`custom`),H(``),B({providerKey:``,apiKeys:[``],modelIds:``,baseUrl:``,apiType:``,fullPath:!1,imageUseCustom:!1,imageEndpoint:``,imageModel:``,imageApiKey:``,setDefault:!N?.configured,modelOverrides:{}}),I(`form`),F(!0),W(null),Fe(!1),K([]),q(new Set),J(null),Ge(``)},[N]),st=(0,k.useCallback)(async()=>{let e=z.baseUrl;if(!e){J(g(`models.baseUrlRequired`));return}Ve(!0),J(null),K([]),q(new Set);let t=Q.find(e=>e.key===L)||null,n=!!t&&!t.isCustom&&(z.baseUrl||``)===t.baseUrl&&z.fullPath!==!0;try{let r=(z.apiKeys||[]).map(e=>e.trim()).filter(Boolean)[0]||``,i=r.replace(/[^\x00-\xFF]/g,``);i!==r&&b.warning(g(`models.apiKeySanitized`));let a=await T.models.fetch(e,i,z.fullPath===!0,n?t.key:void 0);if(a.success&&a.data?.models){let e=a.data.models;K(e),qe(!0);let t={};for(let n of e)n.protocol&&n.protocol!==z.apiType&&(t[n.id]={apiType:n.protocol});Object.keys(t).length>0&&B(e=>{let n={...e.modelOverrides};for(let[e,r]of Object.entries(t))n[e]?.apiType||(n[e]={...n[e]||{},...r});return{...e,modelOverrides:n}});let n=new Set(e.map(e=>e.id)),r=z.modelIds.split(`,`).map(e=>e.trim()).filter(Boolean),i=r.filter(e=>n.has(e.split(`|`)[0].trim())),o=r.filter(e=>!n.has(e.split(`|`)[0].trim()));if(q(new Set(i.map(e=>e.split(`|`)[0].trim()))),o.length>0){let e=o.map(e=>e.split(`|`)[0].trim());B(e=>({...e,modelIds:i.join(`, `)})),b.warning(g(`models.autoRemovedMissingModels`,{models:e.join(`, `)}))}b.success(g(`models.fetchedCount`,{n:e.length}))}else J(a.error||g(`models.fetchFailed`))}catch(e){J(e instanceof Error?e.message:g(`models.requestFailed`))}finally{Ve(!1)}},[z.baseUrl,z.apiKeys,z.modelIds,z.apiType,z.fullPath,L,Q,g]),ct=(0,k.useCallback)((e,t,n)=>{if(n!==`supported`&&n!==`unsupported`&&n!==`unknown`)return;let r=n,i=r===`supported`?`Supported`:r===`unsupported`?`Unsupported`:`Unknown`;return{id:e,verdict:r,group:g(`models.${t}Label`),label:g(`models.${t}${i}`),hint:r===`supported`?``:g(`models.${t}Hint${i}`)}},[g]),lt=(0,k.useCallback)(async()=>{let e=z.baseUrl;if(!e){Y({ok:!1,message:g(`models.baseUrlRequired`)});return}let t=V((z.modelIds||``).split(`,`)[0]||``);Ye(!0),Y(null);try{let n=(z.apiKeys||[]).map(e=>e.trim()).filter(Boolean)[0]||``,r=n.replace(/[^\x00-\xFF]/g,``);r!==n&&b.warning(g(`models.apiKeySanitized`));let i=await T.providers.testConnection(e,r,t);if(i.success&&i.data?.reachable){let e=i.data,t={};e.resolvedBaseUrl&&e.resolvedBaseUrl!==z.baseUrl&&(t.baseUrl=e.resolvedBaseUrl),e.detectedApiType&&z.apiType===``&&(t.apiType=e.detectedApiType),Object.keys(t).length>0&&B(e=>({...e,...t}));let n=[];t.baseUrl&&n.push(g(`models.baseUrlAutoCompleted`,{url:t.baseUrl})),t.apiType&&n.push(g(`models.apiTypeAutoSelected`,{type:Ee[t.apiType]}));let r=e.message||g(`models.connectionSuccess`),a=[ct(`tools`,`toolProbe`,e.tools?.verdict),ct(`jsonMode`,`jsonProbe`,e.jsonMode?.verdict)].filter(e=>e!==void 0);Y({ok:!0,message:n.length>0?g(`models.connectionSuccessWithHints`,{message:r,hints:n.join(g(`models.hintJoiner`))}):r,probes:a})}else Y({ok:!1,message:i.data?.message||i.error||g(`models.connectionFailed`)})}catch(e){Y({ok:!1,message:e instanceof Error?e.message:g(`models.requestFailed`)})}finally{Ye(!1)}},[z.baseUrl,z.apiKeys,z.apiType,z.modelIds,ct,g]),ut=(0,k.useCallback)(e=>{let t=new Set(He);t.has(e)?t.delete(e):t.add(e),q(t),B(e=>({...e,modelIds:Array.from(t).join(`, `)}))},[He]),dt=(0,k.useCallback)(e=>{let t=z.modelIds.split(`,`).map(e=>e.trim()).filter(Boolean),n=t.some(t=>V(t)===e.id)?t.filter(t=>V(t)!==e.id):[...t,e.name&&e.name!==e.id?`${e.id}|${e.name}`:e.id];B(e=>({...e,modelIds:n.join(`, `)}));let r=new Set(G.map(e=>e.id));q(new Set(n.map(V).filter(e=>r.has(e))))},[z.modelIds,G]),[ft,pt]=(0,k.useState)(!1),[mt,ht]=(0,k.useState)(``),[gt,_t]=(0,k.useState)([]),[vt,yt]=(0,k.useState)(!1),[bt,xt]=(0,k.useState)(null),[St,Ct]=(0,k.useState)(!1),[wt,Tt]=(0,k.useState)(!0),Et=(0,k.useCallback)(()=>{ht(``),_t([]),xt(null),pt(!0),Dt(``,{reason:!1,tool:!0})},[]),Dt=(0,k.useCallback)(async(e,t)=>{yt(!0),xt(null);try{let n=await T.models.catalogSearch({q:e,reasoning:t?.reason??!1,toolCall:t?.tool??!0,limit:30});n.success&&n.data?_t(n.data.hits||[]):(xt(n.error||g(`models.catalogSearchFailed`)),_t([]))}catch(e){xt(e instanceof Error?e.message:g(`models.requestFailed`)),_t([])}finally{yt(!1)}},[g]),Ot=(0,k.useCallback)(e=>{B(t=>{let n=t.modelIds.split(`,`).map(e=>e.trim()).filter(Boolean);if(n.includes(e.model.id))return t;let r=e.model.limit?.context,i=e.model.limit?.output,a={...t.modelOverrides[e.model.id]||{},...typeof r==`number`&&r>0?{maxInput:String(r)}:{},...typeof i==`number`&&i>0?{maxOutput:String(i)}:{}};return{...t,modelIds:[...n,e.model.id].join(`, `),modelOverrides:Object.keys(a).length>0?{...t.modelOverrides,[e.model.id]:a}:t.modelOverrides}}),b.success(g(`models.addedModel`,{id:e.model.id}))},[g]),[kt,At]=(0,k.useState)(null),jt=(0,k.useCallback)(e=>{ht(e),kt&&clearTimeout(kt),At(setTimeout(()=>{Dt(e,{reason:St,tool:wt})},300))},[kt,St,wt,Dt]),Mt=async e=>{let t=e.provider,n=e.id,r=e.enabled!==!1,i=e.name||n,a=e=>r&&/default model/i.test(e);try{let e=await T.models.toggle(t,n);if(e.success){await Z();return}let r=e.error||``;a(r)?b.error(g(`models.defaultModelDisableBlocked`,{name:i})):b.error(r||g(`models.operationFailed`))}catch(e){let t=e instanceof Error?e.message:``;a(t)?b.error(g(`models.defaultModelDisableBlocked`,{name:i})):b.error(t||g(`models.operationFailed`))}},Nt=async e=>{let t=Qe(e);me(t);try{await T.models.test(e.id),await Z()}finally{me(null)}},Pt=async(e,t)=>{if(await C({message:g(`models.deleteModelConfirm`,{id:t}),variant:`danger`}))try{(await T.models.delete(e,t)).success&&await Z()}catch{}},Ft=(0,k.useCallback)(e=>{let t=P.find(t=>t.key===e),n=Q.find(t=>t.key===e),r=!n||n.isCustom,i=N?.providers?.[e];R(r?`custom`:e),H(r?e:``),B({providerKey:e,apiKeys:[``],modelIds:t?.models.map(e=>e.name&&e.name!==e.id?`${e.id}|${e.name}`:e.id).join(`, `)||``,baseUrl:t?.baseUrl||i?.baseUrl||n?.baseUrl||``,apiType:t?.apiType||i?.apiType||n?.apiType||``,fullPath:t?.fullPath===!0||i?.fullPath===!0,imageUseCustom:!!t?.imageEndpoint,imageEndpoint:t?.imageEndpoint||``,imageModel:t?.imageModel||``,imageApiKey:``,setDefault:N?.defaultProvider!==e,modelOverrides:Oe(t)}),I(`form`),F(!0),W(null),Fe(!1),K([]),q(new Set),J(null),Ge(``)},[P,Q,N]),It=e=>{Ft(e.provider)},Lt=async()=>{let e=Q.find(e=>e.key===L)||null,t=L===`custom`?z.providerKey.trim():e?.key||``;if(!t){W(g(`models.providerNameRequired`));return}let n=(z.apiKeys||[]).map(e=>e.trim()).filter(Boolean),r=!!N?.providers?.[t]?.hasApiKey;if(n.length===0&&!r){W(g(`models.apiKeyRequired`));return}if(z.imageUseCustom===!0&&!z.imageEndpoint.trim()){W(g(`models.imageEndpointRequired`));return}let i=e||{key:t,name:t,baseUrl:``,apiType:`openai-completions`,defaultModel:``},a=n.map(e=>e.replace(/[^\x00-\xFF]/g,``)).filter(Boolean),o=G.length>0?new Set(G.map(e=>e.id)):null,s=(z.modelIds||i.defaultModel||``).split(`,`).map(e=>e.trim()).filter(Boolean),c=o?s.filter(e=>o.has(e.split(`|`)[0].trim())):s,l=o?s.filter(e=>!o.has(e.split(`|`)[0].trim())):[];l.length>0&&b.warning(g(`models.autoSkippedMissingModels`,{models:l.map(e=>e.split(`|`)[0].trim()).join(`, `)}));let u=c.map(V).filter(Boolean),d=new Set;for(let e of E)e.provider!==t||u.includes(e.id)||(e.isGlobalDefault&&d.add(`global`),e.isGoalDefault&&d.add(`goal`));let f={provider:t,name:t,baseUrl:z.baseUrl||i.baseUrl,fullPath:z.fullPath===!0,apiType:z.apiType||De(z.baseUrl||i.baseUrl)||i.apiType,models:c.map((t,n)=>{let r=t.trim().split(`|`).map(e=>e.trim()).filter(Boolean),i=r[0]||``,a=z.modelOverrides[i],o=a?.apiType||e?.modelApiTypes?.[i];return{id:i,name:r[1]||i,aliases:r.length>2?r.slice(2):void 0,enabled:!0,priority:10+n,...o?{apiType:o}:{},...a?.baseUrl?{baseUrl:a.baseUrl}:{},contextWindow:Ce(a?.maxInput),maxTokens:Ce(a?.maxOutput)}}).filter(e=>e.id.length>0)};a.length>0&&(f.apiKeys=a);let p=z.imageUseCustom===!0;if(f.imageEndpoint=p?z.imageEndpoint.trim():``,f.imageModel=p?z.imageModel.trim():``,p){let e=z.imageApiKey.replace(/[^\x00-\xFF]/g,``).trim();e&&(f.imageApiKey=e)}(!N?.configured||z.setDefault)&&(f.setDefault=!0),Me(!0),W(null);try{let e=await T.config.provider.save(f);if(e.success){if(d.size>0){let e=u[0]||``,n={};if(e){let r=`${t}:${e}`;for(let e of d)n[e]=r}else{let e=E.find(e=>e.provider!==t);for(let t of d)t===`goal`?n[t]=null:e&&(n[t]=`${e.provider}:${e.id}`)}Object.keys(n).length>0&&(await T.models.setDefaults(n)).success&&b.success(g(`models.defaultsAutoUpdated`))}F(!1),I(`select`),R(null),H(``),await X(),await Z()}else W(e.error||g(`models.saveFailed`))}catch(e){W(e instanceof Error?e.message:g(`models.unknownError`))}finally{Me(!1)}},Rt=async e=>{if(await C({message:g(`models.removeConfirm`,{providerKey:e}),variant:`danger`}))try{await T.config.provider.delete(e),await X(),await Z()}catch{}},zt=e=>{switch(e){case`online`:return`text-accent-green`;case`offline`:return`text-dark-muted`;case`error`:return`text-accent-red`;default:return`text-dark-muted`}},Bt=e=>{switch(e){case`online`:return(0,A.jsx)(l,{size:14});case`offline`:return(0,A.jsx)(_,{size:14});case`error`:return(0,A.jsx)(f,{size:14});default:return(0,A.jsx)(_,{size:14})}},Vt=(0,k.useMemo)(()=>Q.find(e=>e.key===L)||null,[L,Q]);return O?(0,A.jsx)(`div`,{className:`h-64 overflow-y-auto p-4`,role:`status`,"aria-label":g(`models.loading`),children:(0,A.jsx)(oe,{count:4})}):ue?(0,A.jsx)(`div`,{className:`flex h-64 items-center justify-center text-accent-red`,children:ue}):(0,A.jsxs)(`div`,{className:`ui-page flex-1 min-h-0`,children:[x,(0,A.jsxs)(`div`,{className:`ui-page-inner space-y-6`,children:[(0,A.jsx)(ye,{}),(0,A.jsxs)(`div`,{children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between mb-3`,children:[(0,A.jsx)(`h2`,{className:`text-base font-semibold`,children:g(`models.providerConfig`)}),(0,A.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,A.jsxs)(`button`,{onClick:async()=>{try{await T.providers.refresh(),b.success(g(`models.providerListRefreshed`)),Le(!0),await a(),setTimeout(()=>{a()},3e3)}catch{b.error(g(`models.refreshFailed`))}},className:`btn btn-secondary px-3 py-2 text-xs`,title:g(`models.refreshListTitle`),children:[(0,A.jsx)(m,{size:12}),g(`models.refreshList`)]}),(0,A.jsxs)(`button`,{onClick:()=>{Ie&&ze(``),Le(e=>!e)},className:`btn btn-accent px-3 py-2 text-xs`,children:[Ie?(0,A.jsx)(o,{size:12}):(0,A.jsx)(u,{size:12}),g(Ie?`models.collapse`:`models.addProvider`)]})]})]}),Ie&&(0,A.jsxs)(`div`,{children:[(0,A.jsxs)(`div`,{className:`relative mb-3 max-w-md`,children:[(0,A.jsx)(c,{size:13,className:`absolute start-2.5 top-1/2 -translate-y-1/2 text-dark-muted`}),(0,A.jsx)(`input`,{value:Re,onChange:e=>ze(e.target.value),className:`w-full ps-8 pe-8 py-1.5 text-xs bg-dark-bg border border-dark-border rounded focus:outline-none focus:border-accent-blue`,placeholder:g(`models.providerSearchPlaceholder`)}),Re&&(0,A.jsx)(`button`,{onClick:()=>ze(``),className:`absolute end-2 top-1/2 -translate-y-1/2 text-dark-muted hover:text-dark-text`,title:g(`models.clear`),"aria-label":g(`models.clearSearch`),children:(0,A.jsx)(h,{size:13})})]}),(0,A.jsx)(`div`,{className:`grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-3 max-h-[420px] overflow-y-auto custom-scrollbar pe-1`,children:n?Array.from({length:10}).map((e,t)=>(0,A.jsxs)(`div`,{className:`ui-card p-4`,"aria-hidden":`true`,children:[(0,A.jsx)(ae,{variant:`text`,width:`45%`,height:16,className:`mb-2`}),(0,A.jsx)(ae,{variant:`text`,width:`85%`,height:11,className:`mb-1.5`}),(0,A.jsx)(ae,{variant:`text`,width:`70%`,height:11,className:`mb-1.5`}),(0,A.jsx)(ae,{variant:`text`,width:`55%`,height:11})]},`preset-skeleton-${t}`)):et.length===0?(0,A.jsxs)(`div`,{className:`col-span-full border border-accent-red/30 bg-accent-red/10 rounded-lg p-4 text-center`,children:[(0,A.jsx)(`div`,{className:`text-sm text-accent-red font-medium mb-1`,children:g(`models.noMatchingProviders`)}),(0,A.jsx)(`div`,{className:`text-xs text-dark-muted mb-3`,children:g(`models.noMatchingProvidersHint`,{query:Re})}),(0,A.jsxs)(`div`,{className:`flex items-center justify-center gap-2`,children:[(0,A.jsxs)(`button`,{onClick:()=>ze(``),className:`inline-flex items-center gap-1 px-2.5 py-1 text-xs border border-dark-border rounded hover:bg-dark-hover`,children:[(0,A.jsx)(h,{size:12}),g(`models.clearSearch`)]}),(0,A.jsx)(S,{variant:`accent`,size:`sm`,leftIcon:(0,A.jsx)(u,{size:12}),onClick:ot,children:g(`models.addCustomProvider`)})]})]}):et.map(e=>{let t=e.key===`custom`,n=t?tt:N?.providers?.[e.key],r=n?.hasApiKey,i=t?!!N?.defaultProvider&&(tt?.keys||[]).includes(N.defaultProvider):N?.defaultProvider===e.key;return(0,A.jsxs)(`div`,{className:`reveal-on-scroll ui-card-interactive text-start p-4 relative ${r?`border-accent-green/30 bg-dark-surface hover:border-accent-green/50`:`border-dark-border bg-dark-surface hover:border-dark-hover`}`,children:[(0,A.jsxs)(`div`,{onClick:()=>e.key===`custom`?ot():it(e),className:`cursor-pointer`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between mb-1`,children:[(0,A.jsx)(`span`,{className:`text-sm font-medium`,children:e.name}),r&&(0,A.jsx)(y,{size:14,className:`text-accent-green`})]}),(0,A.jsxs)(`div`,{className:`text-badge text-dark-muted space-y-0.5`,children:[(0,A.jsx)(`div`,{className:`truncate`,children:t?n?.baseUrl||g(`models.customBaseUrl`):e.baseUrl||g(`models.customBaseUrl`)}),(0,A.jsx)(`div`,{className:`truncate`,children:t&&tt?`${tt.keys.join(`, `)}`:e.defaultModel||g(`models.noDefaultModel`)}),(0,A.jsxs)(`div`,{children:[n?g(`models.configuredCount`,{n:n.modelCount}):g(`models.availableCount`,{n:e.models?.length||0}),e.models&&e.models.length>0&&!n&&(0,A.jsx)(`span`,{className:`text-accent-blue`,children:` ✓`})]})]}),i&&(0,A.jsx)(`div`,{className:`mt-1 text-badge text-accent-red`,children:g(`models.defaultProviderBadge`)})]}),r&&e.key!==`custom`&&(0,A.jsx)(`button`,{onClick:t=>{t.stopPropagation(),Rt(e.key)},className:`absolute top-1.5 end-1.5 p-1 rounded text-dark-muted hover:bg-accent-red/10 hover:text-accent-red transition-colors`,title:g(`models.deleteProvider`),"aria-label":g(`models.deleteProviderNamed`,{name:e.name}),children:(0,A.jsx)(v,{size:13})})]},e.key)})})]})]}),D&&(0,A.jsxs)(`div`,{className:`grid grid-cols-4 gap-4 max-md:grid-cols-2`,children:[(0,A.jsx)(Ae,{title:g(`models.overallStatus`),value:D.totalInstances===0?g(`models.notConfigured`):D.overallStatus===`healthy`?g(`models.healthy`):D.overallStatus===`degraded`?g(`models.degraded`):g(`models.abnormal`),color:D.totalInstances===0?`blue`:D.overallStatus===`healthy`?`green`:D.overallStatus===`degraded`?`yellow`:`red`}),(0,A.jsx)(Ae,{title:g(`models.healthRate`),value:D.totalInstances===0?`N/A`:`${(D.healthRate*100).toFixed(0)}%`,color:D.totalInstances===0?`blue`:D.healthRate>.8?`green`:D.healthRate>.5?`yellow`:`red`}),(0,A.jsx)(Ae,{title:g(`models.onlineInstances`),value:D.totalInstances===0?g(`models.none`):`${D.healthyInstances}/${D.totalInstances}`,color:D.healthyInstances>0?`green`:`red`}),(0,A.jsx)(Ae,{title:g(`models.totalRequests`),value:D.totalRequests>0?D.totalRequests.toLocaleString():`0`,color:`blue`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between mb-3`,children:[(0,A.jsx)(`h3`,{className:`text-sm font-medium`,children:g(`models.configuredModels`)}),(0,A.jsx)(`span`,{className:`text-badge text-dark-muted`,title:g(`models.actIsGlobalHint`),children:g(`models.actIsGlobalHint`)})]}),(0,A.jsxs)(`div`,{className:`space-y-4 max-h-[640px] overflow-y-auto custom-scrollbar pe-1`,children:[rt.map(e=>{let t=P.find(t=>t.key===e.provider),n=N?.providers?.[e.provider];return(0,A.jsxs)(`div`,{className:`rounded-lg border border-dark-border overflow-hidden`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between gap-2 px-3 py-2 bg-dark-bg border-b border-dark-border`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0 flex-wrap`,children:[(0,A.jsx)(`span`,{className:`text-xs font-semibold whitespace-nowrap text-accent-purple max-md:whitespace-normal`,children:e.provider}),N?.defaultProvider===e.provider&&(0,A.jsx)(`span`,{className:`text-avatar px-1.5 py-0.5 rounded bg-accent-red/20 text-accent-red whitespace-nowrap`,children:g(`models.defaultShort`)}),(0,A.jsx)(`span`,{className:`text-badge text-dark-muted truncate`,children:n?.baseUrl||t?.baseUrl||``}),(0,A.jsx)(`span`,{className:`text-badge text-dark-muted whitespace-nowrap`,children:t?.apiType||n?.apiType||``}),n?.hasApiKey||t?.hasApiKey?(0,A.jsx)(`span`,{className:`text-avatar px-1.5 py-0.5 rounded bg-accent-green/20 text-accent-green whitespace-nowrap`,children:g(`models.hasKey`)}):(0,A.jsx)(`span`,{className:`text-avatar px-1.5 py-0.5 rounded bg-accent-red/20 text-accent-red whitespace-nowrap`,children:g(`models.noKey`)})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-1 shrink-0`,children:[(0,A.jsx)(`button`,{onClick:()=>Ft(e.provider),className:`p-1.5 rounded hover:bg-accent-blue/10 text-dark-muted hover:text-accent-blue`,title:g(`models.editProviderNamed`,{name:e.provider}),children:(0,A.jsx)(ee,{size:13})}),(0,A.jsx)(`button`,{onClick:()=>Rt(e.provider),className:`p-1.5 rounded hover:bg-accent-red/10 text-dark-muted hover:text-accent-red`,title:g(`models.deleteProviderNamed`,{name:e.provider}),children:(0,A.jsx)(v,{size:13})})]})]}),(0,A.jsxs)(`div`,{className:`space-y-2 p-2 bg-dark-surface/40`,children:[e.models.map(n=>{let r=t?.models.find(e=>e.id===n.id),i=!!(r?.apiType&&r.apiType!==t?.apiType);return(0,A.jsx)(`div`,{className:`bg-dark-surface border rounded-lg p-3 ${n.status===`online`?`border-accent-green`:`border-dark-border`} ${n.enabled===!1?`opacity-60`:``}`,children:(0,A.jsxs)(`div`,{className:`flex items-start justify-between gap-4 max-md:flex-col max-md:gap-2`,children:[(0,A.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 mb-1 flex-wrap`,children:[(0,A.jsx)(`span`,{className:zt(n.status),children:Bt(n.status)}),(0,A.jsx)(`span`,{className:`font-medium text-sm text-accent-blue`,children:n.name}),(0,A.jsx)(`span`,{className:`text-badge text-accent-purple px-1.5 py-0.5 bg-accent-purple/10 rounded`,children:n.provider}),n.apiType&&(0,A.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 rounded ${n.apiType===`anthropic-messages`||n.apiType===`openai-responses`?`bg-accent-purple/20 text-accent-purple`:`bg-accent-blue/20 text-accent-blue`}`,children:Ee[n.apiType]||n.apiType}),i&&(0,A.jsx)(`span`,{className:`text-avatar px-1 py-0.5 rounded bg-accent-yellow/20 text-accent-yellow font-medium`,title:g(`models.overrideTitle`),children:g(`models.overrideBadge`)}),n.isGlobalDefault&&(0,A.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 rounded bg-accent-red/20 text-accent-red font-medium`,title:g(`models.globalDefaultUnsettable`),children:g(`chat.globalDefault`)}),n.isActDefault&&!n.isGlobalDefault&&(0,A.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 rounded bg-accent-yellow/20 text-accent-yellow font-medium`,children:g(`chat.actDefault`)}),n.isGoalDefault&&(0,A.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 rounded bg-accent-purple/20 text-accent-purple font-medium`,children:g(`chat.goalDefault`)})]}),(0,A.jsxs)(`div`,{className:`grid grid-cols-2 sm:grid-cols-3 md:grid-cols-6 gap-3 text-xs`,children:[(0,A.jsx)(U,{label:g(`models.loadLabel`),value:`${n.load}/${n.maxLoad}`}),(0,A.jsx)(U,{label:g(`models.tokenUsageLabel`),value:`${w(n.tokens)}/${w(n.maxTokens)}`}),(0,A.jsx)(U,{label:g(`models.inputPrice`),value:n.price.input===void 0?`—`:`$${n.price.input}/M`}),(0,A.jsx)(U,{label:g(`models.outputPrice`),value:n.price.output===void 0?`—`:`$${n.price.output}/M`}),(0,A.jsx)(U,{label:g(`models.cacheReadPrice`),value:n.price.cacheRead===void 0?`—`:`$${n.price.cacheRead}/M`}),(0,A.jsx)(U,{label:g(`models.cacheWritePrice`),value:n.price.cacheWrite===void 0?`—`:`$${n.price.cacheWrite}/M`})]}),(0,A.jsxs)(`div`,{className:`mt-3 grid grid-cols-2 sm:grid-cols-4 gap-3 text-xs`,children:[(0,A.jsx)(U,{label:g(`models.inputTokensLabel`),value:w(n.usage?.input??0)}),(0,A.jsx)(U,{label:g(`models.outputTokensLabel`),value:w(n.usage?.output??0)}),(0,A.jsx)(U,{label:g(`models.totalTokensLabel`),value:w(n.usage?.total??0)}),(0,A.jsx)(U,{label:g(`models.usageRequestsLabel`),value:String(n.usage?.requests??0)})]}),(0,A.jsx)(ce,{className:`mt-3 pt-2 border-t border-dark-border/60`,provider:e.provider,modelId:n.id,current:r?.pricing,catalog:{input:n.price.input,output:n.price.output,cacheRead:n.price.cacheRead,cacheWrite:n.price.cacheWrite},onSaved:Z}),(0,A.jsx)(de,{className:`mt-2`,provider:e.provider,modelId:n.id,current:{...typeof r?.contextWindow==`number`&&r.contextWindow!==t?.contextWindow?{contextWindow:r.contextWindow}:{},...typeof r?.maxTokens==`number`&&r.maxTokens!==t?.maxTokens?{maxTokens:r.maxTokens}:{}},defaults:{input:t?.contextWindow??2e5,output:t?.maxTokens??8e3},onSaved:Z}),(0,A.jsx)(fe,{modelId:n.id,provider:e.provider,className:`mt-2`})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0`,children:[Se.map(e=>{let t=e.key===`global`?n.isGlobalDefault:n.isGoalDefault,r=e.key===`global`?g(`models.setGlobalDefaultTitle`):g(`models.setGoalDefaultTitle`),i=g(`models.unsetGoalDefaultTitle`),a=g(`models.unsetGoalDefaultFailed`),o=g(`models.setGoalDefaultFailed`);return t?e.key===`global`?(0,A.jsxs)(`span`,{className:`inline-flex items-center gap-1 px-2 py-1 rounded text-badge border ${e.bg} ${e.color} font-medium`,title:g(`chat.globalDefault`),children:[(0,A.jsx)(y,{size:11}),g(e.labelKey)]},e.key):(0,A.jsxs)(`button`,{onClick:async()=>{try{await T.models.setDefaults({[e.key]:null}),await Z()}catch(e){M(e instanceof Error?e.message:a)}},className:`inline-flex items-center gap-1 px-2 py-1 rounded text-badge border ${e.bg} ${e.color} font-medium cursor-pointer hover:opacity-80`,title:i,children:[(0,A.jsx)(y,{size:11}),g(e.labelKey)]},e.key):n.enabled===!1?null:(0,A.jsx)(`button`,{onClick:async()=>{try{await T.models.setDefaults({[e.key]:`${n.provider}:${n.id}`}),await Z()}catch(e){M(e instanceof Error?e.message:o)}},className:`px-2 py-1 rounded text-badge border border-dark-border text-dark-muted hover:text-dark-text hover:border-dark-hover`,title:r,children:g(e.labelKey)},e.key)}),(0,A.jsx)(`button`,{onClick:()=>It(n),className:`p-1.5 rounded hover:bg-accent-blue/10 text-dark-muted hover:text-accent-blue`,title:g(`models.editModel`),children:(0,A.jsx)(ee,{size:13})}),(0,A.jsx)(`button`,{onClick:()=>Pt(n.provider,n.id),className:`p-1.5 rounded hover:bg-accent-red/10 text-dark-muted hover:text-accent-red`,title:g(`models.deleteModel`),children:(0,A.jsx)(v,{size:13})}),(0,A.jsx)(`button`,{onClick:()=>Nt(n),disabled:pe===Qe(n),className:`p-1.5 rounded hover:bg-dark-hover disabled:opacity-50`,title:g(`models.refresh`),children:(0,A.jsx)(m,{size:13,className:pe===Qe(n)?`animate-spin`:``})}),(0,A.jsx)(`button`,{onClick:()=>Mt(n),className:`px-2 py-0.5 rounded text-xs transition-colors ${n.enabled===!1?`bg-accent-green/20 text-accent-green hover:bg-accent-green/30`:`bg-accent-red/20 text-accent-red hover:bg-accent-red/30`}`,children:n.enabled===!1?g(`models.enable`):g(`models.disable`)})]})]})},Qe(n))}),e.models.length===0&&(0,A.jsx)(`div`,{className:`text-center text-meta text-dark-muted py-3`,children:g(`models.noModelsInProvider`)})]})]},e.provider)}),E.length===0&&P.length===0&&(0,A.jsxs)(`div`,{className:`text-center text-dark-muted py-6`,children:[(0,A.jsx)(r,{size:36,className:`mx-auto mb-2 opacity-40`}),(0,A.jsx)(`p`,{className:`text-sm`,children:g(`models.emptyHint`)})]})]})]}),(0,A.jsx)(ne,{isOpen:_e,onClose:()=>{F(!1),I(`select`),R(null),H(``)},title:ve===`select`?g(`chat.selectProvider`):Vt?.name||g(`models.providerConfig`),size:`xl`,children:ve===`select`?(0,A.jsx)(`div`,{className:`space-y-4`,children:(0,A.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-3`,children:[$e.filter(e=>e.key!==`custom`).map(e=>(0,A.jsxs)(`button`,{onClick:()=>it(e),className:`text-start p-3 rounded-lg border border-dark-border bg-dark-bg hover:border-accent-blue transition-colors`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 mb-1`,children:[(0,A.jsx)(y,{size:14,className:`text-accent-blue`}),(0,A.jsx)(`span`,{className:`text-sm font-medium`,children:e.name})]}),(0,A.jsx)(`div`,{className:`text-xs text-dark-muted`,children:e.defaultModel})]},e.key)),(0,A.jsxs)(`button`,{onClick:ot,className:`text-start p-3 rounded-lg border border-dashed border-dark-border bg-dark-bg hover:border-accent-blue transition-colors`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2 mb-1`,children:[(0,A.jsx)(t,{size:14,className:`text-accent-blue`}),(0,A.jsx)(`span`,{className:`text-sm font-medium`,children:g(`models.customProvider`)})]}),(0,A.jsx)(`div`,{className:`text-xs text-dark-muted`,children:g(`models.customProviderDesc`)})]})]})}):(0,A.jsxs)(`div`,{className:`space-y-3`,children:[L===`custom`&&(0,A.jsxs)(`div`,{className:`space-y-3`,children:[tt&&tt.keys.length>0&&(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:g(`models.editExistingConfig`)}),(0,A.jsxs)(`select`,{value:be,onChange:e=>{let t=e.target.value;t?at(t):(H(``),B(e=>({...e,providerKey:``,modelIds:``,baseUrl:``,apiType:``,apiKeys:[``]})))},className:`w-full px-3 py-2 bg-dark-bg border border-dark-border rounded text-sm focus:outline-none focus:border-accent-blue`,children:[(0,A.jsx)(`option`,{value:``,children:g(`models.newCustomProviderOption`)}),tt.keys.map(e=>(0,A.jsx)(`option`,{value:e,children:e},e))]}),(0,A.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:g(`models.editExistingConfigHint`)})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:g(`models.providerNameLabel`)}),(0,A.jsx)(`input`,{value:z.providerKey,onChange:e=>B(t=>({...t,providerKey:e.target.value})),className:`w-full px-3 py-2 bg-dark-bg border border-dark-border rounded text-sm focus:outline-none focus:border-accent-blue`,placeholder:g(`models.providerNamePlaceholder`)})]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsxs)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:[`API Keys`,N?.providers?.[L===`custom`?z.providerKey.trim():L||``]?.hasApiKey?``:` *`,(0,A.jsx)(`span`,{className:`text-dark-muted/60 text-xs`,children:N?.providers?.[L===`custom`?z.providerKey.trim():L||``]?.hasApiKey?g(`models.apiKeysHintConfigured`):g(`models.apiKeysHintNew`)})]}),(0,A.jsx)(`div`,{className:`space-y-1.5`,children:(z.apiKeys?.length?z.apiKeys:[``]).map((e,t)=>(0,A.jsxs)(`div`,{className:`flex gap-1.5 items-center`,children:[(0,A.jsxs)(`div`,{className:`relative flex-1`,children:[(0,A.jsx)(`input`,{type:Pe?`text`:`password`,value:e,autoComplete:`off`,spellCheck:!1,onChange:e=>B(n=>({...n,apiKeys:n.apiKeys.map((n,r)=>r===t?e.target.value:n)})),className:`w-full px-3 py-2 pe-9 bg-dark-bg border border-dark-border rounded text-sm focus:outline-none focus:border-accent-blue`,placeholder:g(`models.apiKeyDefaultPlaceholder`)}),(0,A.jsx)(`button`,{type:`button`,onClick:()=>Fe(e=>!e),className:`absolute end-2 top-1/2 -translate-y-1/2 text-dark-muted hover:text-dark-text`,title:g(Pe?`models.hideKeyTitle`:`models.showKeyTitle`),children:Pe?(0,A.jsx)(s,{size:14}):(0,A.jsx)(p,{size:14})})]}),t===0?(0,A.jsxs)(`button`,{type:`button`,onClick:()=>B(e=>({...e,apiKeys:[...e.apiKeys,``]})),className:`shrink-0 inline-flex items-center gap-1 px-3 py-2 rounded text-sm border border-dashed border-dark-border text-dark-muted hover:text-accent-blue hover:border-accent-blue/50 transition-colors`,title:g(`models.addApiKeyTitle`),children:[(0,A.jsx)(u,{size:14}),(0,A.jsx)(`span`,{className:`hidden sm:inline`,children:g(`models.addApiKey`)})]}):(0,A.jsx)(`button`,{type:`button`,onClick:()=>B(e=>({...e,apiKeys:e.apiKeys.filter((e,n)=>n!==t)})),className:`shrink-0 inline-flex items-center px-3 py-2 rounded text-sm text-dark-muted hover:text-accent-red hover:bg-accent-red/10 transition-colors`,title:g(`models.removeApiKeyTitle`),children:(0,A.jsx)(h,{size:14})})]},t))})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:g(`models.modelIdLabel`)}),(0,A.jsxs)(`div`,{className:`flex gap-2`,children:[(0,A.jsx)(`input`,{value:z.modelIds,onChange:e=>{let t=e.target.value;B(e=>({...e,modelIds:t})),q(()=>{let e=new Set;for(let n of t.split(`,`)){let t=n.trim().split(`|`)[0].trim();t&&G.some(e=>e.id===t)&&e.add(t)}return e})},className:`flex-1 px-3 py-2 bg-dark-bg border border-dark-border rounded text-sm focus:outline-none focus:border-accent-blue`,placeholder:Vt?.defaultModel||g(`models.modelIdPlaceholder`)}),(0,A.jsxs)(`button`,{onClick:st,disabled:Be||!z.baseUrl,className:`inline-flex items-center gap-1 px-3 py-2 rounded text-sm border border-accent-blue/30 text-accent-blue hover:bg-accent-blue/10 disabled:opacity-50 whitespace-nowrap max-md:whitespace-normal`,title:g(`models.fetchModelsTitle`),children:[Be?(0,A.jsx)(m,{size:13,className:`animate-spin`}):(0,A.jsx)(i,{size:13}),g(Be?`models.fetchingModels`:`models.fetchModels`)]}),(0,A.jsxs)(`button`,{onClick:lt,disabled:Je||!z.baseUrl,className:`inline-flex items-center gap-1 px-3 py-2 rounded text-sm border border-accent-yellow/30 text-accent-yellow hover:bg-accent-yellow/10 disabled:opacity-50 whitespace-nowrap max-md:whitespace-normal`,title:g(`models.testConnectionTitle`),children:[Je?(0,A.jsx)(m,{size:13,className:`animate-spin`}):(0,A.jsx)(d,{size:13}),g(Je?`models.testingConnection`:`models.testConnection`)]}),(0,A.jsxs)(`button`,{onClick:Et,className:`inline-flex items-center gap-1 px-3 py-2 rounded text-sm border border-accent-green/30 text-accent-green hover:bg-accent-green/10 whitespace-nowrap max-md:whitespace-normal`,title:g(`models.catalogSearchTitle`),children:[(0,A.jsx)(c,{size:13}),g(`models.catalogSearch`)]})]}),Xe&&(0,A.jsxs)(`div`,{className:`mt-1 text-xs ${Xe.ok?`text-accent-green`:`text-accent-red`}`,children:[Xe.ok?`✓ `:`✗ `,Xe.message,Xe.probes?.map(e=>(0,A.jsxs)(`div`,{className:`mt-0.5 ${e.verdict===`supported`?`text-accent-green`:e.verdict===`unsupported`?`text-accent-red`:`text-dark-muted`}`,children:[e.group,`: `,e.label,e.hint&&(0,A.jsxs)(`span`,{className:`opacity-70`,children:[` — `,e.hint]})]},e.id))]}),Ue&&(0,A.jsx)(`div`,{className:`mt-1 text-xs text-accent-red`,children:Ue}),G.length===0&&nt.length>0&&(0,A.jsxs)(`div`,{className:`mt-2 border border-dark-border rounded-lg bg-dark-bg p-2`,children:[(0,A.jsx)(`div`,{className:`flex items-center justify-between mb-2`,children:(0,A.jsxs)(`span`,{className:`text-xs text-dark-muted`,children:[g(`models.configuredPanelPrefix`),(0,A.jsx)(`strong`,{className:`text-dark-text`,children:nt.length}),g(`models.configuredPanelSuffix`),(0,A.jsx)(`span`,{className:`text-accent-green/70`,children:g(`models.configuredPanelHint`)})]})}),(0,A.jsx)(`div`,{className:`max-h-48 overflow-y-auto custom-scrollbar grid grid-cols-2 sm:grid-cols-3 gap-1`,children:nt.map(e=>{let t=z.modelIds.split(`,`).map(V).filter(Boolean).includes(e.id);return(0,A.jsxs)(`div`,{role:`checkbox`,"aria-checked":t,title:e.name&&e.name!==e.id?`${e.id} — ${e.name}`:e.name||e.id,tabIndex:-1,onMouseDown:e=>e.preventDefault(),onClick:()=>dt(e),className:`flex items-start gap-1.5 px-2 py-1 rounded cursor-pointer text-xs transition-colors select-none ${t?`bg-accent-green/20 text-accent-green border border-accent-green/30`:`hover:bg-dark-hover border border-transparent`}`,children:[(0,A.jsx)(`span`,{className:`shrink-0 mt-[3px]`,children:t?(0,A.jsx)(y,{size:10}):(0,A.jsx)(`div`,{className:`w-2.5 h-2.5 rounded border border-dark-border`})}),(0,A.jsx)(`span`,{className:`min-w-0 flex-1 break-words leading-snug`,children:e.name||e.id}),e.isGlobalDefault&&(0,A.jsx)(`span`,{className:`text-avatar px-1 rounded bg-accent-red/20 text-accent-red shrink-0`,children:g(`models.globalShort`)}),e.isActDefault&&!e.isGlobalDefault&&(0,A.jsx)(`span`,{className:`text-avatar px-1 rounded bg-accent-yellow/20 shrink-0`,children:`Act`}),e.isGoalDefault&&(0,A.jsx)(`span`,{className:`text-avatar px-1 rounded bg-accent-purple/20 shrink-0`,children:`Goal`})]},e.id)})})]}),G.length>0&&(0,A.jsxs)(`div`,{className:`mt-2 border border-dark-border rounded-lg bg-dark-bg p-2`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between mb-2`,children:[(0,A.jsxs)(`span`,{className:`text-xs text-dark-muted`,children:[g(`models.fetchedPanelPrefix`),(0,A.jsx)(`strong`,{className:`text-dark-text`,children:G.length}),g(`models.fetchedPanelMiddle`),(0,A.jsx)(`strong`,{className:`text-accent-blue`,children:He.size}),g(`models.fetchedPanelSuffix`),(0,A.jsx)(`span`,{className:`text-accent-blue/70`,children:g(`models.fetchedPanelHint`)})]}),(0,A.jsx)(`button`,{onClick:()=>{K([]),q(new Set)},className:`px-2 py-0.5 text-badge border border-dark-border rounded hover:bg-dark-hover`,children:g(`models.close`)})]}),(0,A.jsxs)(`div`,{className:`relative mb-2`,children:[(0,A.jsx)(c,{size:12,className:`absolute start-2 top-1/2 -translate-y-1/2 text-dark-muted`}),(0,A.jsx)(`input`,{value:We,onChange:e=>{let t=e.target.value;Ge(t),t.trim()&&qe(!1)},className:`w-full ps-7 pe-2 py-1 text-xs bg-dark-bg border border-dark-border rounded focus:outline-none focus:border-accent-blue`,placeholder:g(`models.modelSearchPlaceholder`)})]}),We.trim()!==``&&(0,A.jsxs)(`div`,{className:`mb-1 text-badge text-dark-muted`,children:[g(`models.searchMatchPrefix`),(0,A.jsx)(`strong`,{className:`text-accent-blue`,children:Ze.length}),g(`models.searchMatchSuffix`,{total:G.length})]}),(0,A.jsx)(`div`,{className:`max-h-72 overflow-y-auto custom-scrollbar grid grid-cols-1 sm:grid-cols-2 gap-1`,children:Ze.map(e=>{let t=He.has(e.id);return(0,A.jsxs)(`div`,{role:`checkbox`,"aria-checked":t,title:e.name&&e.name!==e.id?`${e.id} — ${e.name}`:e.id,tabIndex:-1,onMouseDown:e=>e.preventDefault(),onClick:()=>ut(e.id),className:`${Ke?`reveal-on-scroll `:``}flex items-start gap-1.5 px-2 py-1 rounded cursor-pointer text-xs transition-colors select-none ${t?`bg-accent-blue/20 text-accent-blue border border-accent-blue/30`:`hover:bg-dark-hover border border-transparent`}`,children:[(0,A.jsx)(`span`,{className:`shrink-0 mt-[3px]`,children:t?(0,A.jsx)(y,{size:10}):(0,A.jsx)(`div`,{className:`w-2.5 h-2.5 rounded border border-dark-border`})}),(0,A.jsx)(`span`,{className:`min-w-0 flex-1 break-all leading-snug`,children:e.id})]},e.id)})})]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:`Base URL`}),(0,A.jsx)(`input`,{value:z.baseUrl,onChange:e=>{B(t=>({...t,baseUrl:e.target.value})),Y(null)},className:`w-full px-3 py-2 bg-dark-bg border border-dark-border rounded text-sm focus:outline-none focus:border-accent-blue`,placeholder:`https://api.example.com/v1`}),(0,A.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer select-none mt-2`,children:[(0,A.jsx)(`button`,{type:`button`,role:`switch`,"aria-checked":z.fullPath,onClick:()=>{B(e=>({...e,fullPath:!e.fullPath})),Y(null)},className:`relative w-9 h-5 rounded-full transition-colors shrink-0 ${z.fullPath?`bg-accent-green`:`bg-dark-border`}`,children:(0,A.jsx)(`span`,{className:`absolute top-0.5 left-0 w-4 h-4 rounded-full bg-white shadow transition-transform ${z.fullPath?`translate-x-[18px]`:`translate-x-0.5`}`})}),(0,A.jsx)(`span`,{className:`text-sm text-dark-muted`,children:g(`models.fullPathLabel`)})]}),(0,A.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:g(`models.fullPathHint`)})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:g(`models.apiTypeLabel`)}),(0,A.jsxs)(`select`,{value:z.apiType,onChange:e=>{B(t=>({...t,apiType:e.target.value})),Y(null)},className:`w-full px-3 py-2 bg-dark-bg border border-dark-border rounded text-sm focus:outline-none focus:border-accent-blue`,children:[(0,A.jsx)(`option`,{value:``,children:g(`models.apiTypeAutoDetect`)}),Te.map(e=>(0,A.jsx)(`option`,{value:e,children:Ee[e]},e))]}),(0,A.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:g(`models.apiTypeHint`)})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer select-none`,children:[(0,A.jsx)(`button`,{type:`button`,role:`switch`,"aria-checked":z.imageUseCustom,onClick:()=>B(e=>({...e,imageUseCustom:!e.imageUseCustom})),className:`relative w-9 h-5 rounded-full transition-colors shrink-0 ${z.imageUseCustom?`bg-accent-green`:`bg-dark-border`}`,children:(0,A.jsx)(`span`,{className:`absolute top-0.5 left-0 w-4 h-4 rounded-full bg-white shadow transition-transform ${z.imageUseCustom?`translate-x-[18px]`:`translate-x-0.5`}`})}),(0,A.jsx)(`span`,{className:`text-sm text-dark-muted`,children:g(`models.imageGenerationLabel`)})]}),(0,A.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:g(`models.imageGenerationHint`)}),z.imageUseCustom&&(0,A.jsxs)(`div`,{className:`mt-2 space-y-2 border border-dark-border rounded-lg p-2.5`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block text-badge text-dark-muted/70 mb-0.5`,children:g(`models.imageEndpointLabel`)}),(0,A.jsx)(`input`,{value:z.imageEndpoint,onChange:e=>B(t=>({...t,imageEndpoint:e.target.value})),className:`w-full px-3 py-2 bg-dark-bg border border-dark-border rounded text-sm focus:outline-none focus:border-accent-blue`,placeholder:`https://api.openai.com/v1`}),(0,A.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:g(`models.imageEndpointHint`)})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block text-badge text-dark-muted/70 mb-0.5`,children:g(`models.imageModelLabel`)}),(0,A.jsx)(`input`,{value:z.imageModel,onChange:e=>B(t=>({...t,imageModel:e.target.value})),className:`w-full px-3 py-2 bg-dark-bg border border-dark-border rounded text-sm focus:outline-none focus:border-accent-blue`,placeholder:g(`models.imageModelPlaceholder`)}),(0,A.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:g(`models.imageModelHint`)})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block text-badge text-dark-muted/70 mb-0.5`,children:g(`models.imageApiKeyLabel`)}),(0,A.jsx)(`input`,{type:`password`,value:z.imageApiKey,onChange:e=>B(t=>({...t,imageApiKey:e.target.value})),className:`w-full px-3 py-2 bg-dark-bg border border-dark-border rounded text-sm focus:outline-none focus:border-accent-blue`,placeholder:P.find(e=>e.key===$)?.hasImageApiKey?g(`models.imageApiKeyKeep`):`sk-...`}),(0,A.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:g(`models.imageApiKeyHint`)})]})]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsxs)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:[g(`models.modelApiTypeLabel`),(0,A.jsx)(`span`,{className:`text-dark-muted/60 text-xs`,children:g(`models.modelApiTypeHint`)})]}),(0,A.jsx)(`div`,{className:`border border-dark-border rounded-lg divide-y divide-dark-border max-h-64 overflow-y-auto custom-scrollbar`,children:(()=>{let e=z.modelIds.split(`,`).map(V).filter(Boolean);if(e.length===0)return(0,A.jsx)(`div`,{className:`px-3 py-2 text-xs text-dark-muted`,children:g(`models.modelApiTypeEmpty`)});let t=P.find(e=>e.key===$),n=t?.contextWindow??2e5,r=t?.maxTokens??8e3,i=(e,t)=>B(n=>({...n,modelOverrides:{...n.modelOverrides,[e]:{...n.modelOverrides[e]||{},...t}}}));return e.map(e=>{let t=z.modelOverrides[e]||{};return(0,A.jsxs)(`div`,{className:`px-3 py-2 space-y-1.5`,children:[(0,A.jsx)(`div`,{className:`text-xs min-w-0 break-all leading-snug text-dark-text`,title:e,children:e}),(0,A.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-1.5`,children:[(0,A.jsxs)(`label`,{className:`block`,children:[(0,A.jsx)(`span`,{className:`block text-badge text-dark-muted/70 mb-0.5`,children:g(`models.apiTypeLabel`)}),(0,A.jsxs)(`select`,{value:t.apiType||``,onChange:t=>i(e,{apiType:t.target.value}),className:`w-full px-2 py-1 text-xs bg-dark-bg border border-dark-border rounded focus:outline-none focus:border-accent-blue`,children:[(0,A.jsx)(`option`,{value:``,children:g(`models.inheritProvider`)}),Te.map(e=>(0,A.jsx)(`option`,{value:e,children:Ee[e]},e))]})]}),(0,A.jsxs)(`label`,{className:`block`,children:[(0,A.jsx)(`span`,{className:`block text-badge text-dark-muted/70 mb-0.5`,children:g(`models.maxInputTokensLabel`)}),(0,A.jsx)(`input`,{type:`number`,min:1,inputMode:`numeric`,value:t.maxInput??``,onChange:t=>i(e,{maxInput:t.target.value}),placeholder:String(n),title:g(`models.maxInputTokensTitle`),className:`w-full px-2 py-1 text-xs bg-dark-bg border border-dark-border rounded focus:outline-none focus:border-accent-blue`})]}),(0,A.jsxs)(`label`,{className:`block`,children:[(0,A.jsx)(`span`,{className:`block text-badge text-dark-muted/70 mb-0.5`,children:g(`models.maxOutputTokensLabel`)}),(0,A.jsx)(`input`,{type:`number`,min:1,inputMode:`numeric`,value:t.maxOutput??``,onChange:t=>i(e,{maxOutput:t.target.value}),placeholder:String(r),title:g(`models.maxOutputTokensTitle`),className:`w-full px-2 py-1 text-xs bg-dark-bg border border-dark-border rounded focus:outline-none focus:border-accent-blue`})]})]})]},e)})})()}),(0,A.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:g(`models.contextBudgetHint`)})]}),(0,A.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,A.jsx)(`input`,{type:`checkbox`,checked:z.setDefault,onChange:e=>B(t=>({...t,setDefault:e.target.checked})),className:`accent-accent-blue`}),(0,A.jsx)(`span`,{className:`text-sm text-dark-muted`,children:g(`models.setDefaultProvider`)})]}),Ne&&(0,A.jsx)(`div`,{className:`text-sm text-accent-red`,children:Ne}),(0,A.jsxs)(`div`,{className:`flex justify-between gap-2 pt-2`,children:[(0,A.jsx)(`div`,{children:$&&N?.providers?.[$]?.hasApiKey&&(0,A.jsx)(`button`,{onClick:async()=>{if(await C({message:g(`models.deleteProviderConfirm`,{key:$}),variant:`danger`}))try{await T.config.provider.delete($),F(!1),I(`select`),R(null),H(``),await X(),await Z()}catch{}},className:`px-4 py-2 rounded border border-accent-red/30 text-accent-red hover:bg-accent-red/10 transition-colors text-sm`,children:g(`models.deleteProvider`)})}),(0,A.jsx)(`button`,{onClick:()=>{I(`select`),R(null),H(``),F(!1)},className:`px-4 py-2 rounded border border-dark-border hover:bg-dark-hover transition-colors text-sm`,children:g(`common.cancel`)}),(0,A.jsx)(S,{variant:`accent`,onClick:Lt,loading:je,children:g(`common.save`)})]})]})}),(0,A.jsx)(ne,{isOpen:ft,onClose:()=>pt(!1),title:(0,A.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,A.jsx)(c,{size:15,className:`text-accent-green`}),g(`models.catalogTitle`)]}),size:`2xl`,children:(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex gap-2`,children:[(0,A.jsxs)(`div`,{className:`relative flex-1`,children:[(0,A.jsx)(c,{size:14,className:`absolute start-3 top-1/2 -translate-y-1/2 text-dark-muted`}),(0,A.jsx)(`input`,{value:mt,onChange:e=>jt(e.target.value),className:`w-full ps-9 pe-3 py-2 bg-dark-bg border border-dark-border rounded text-sm focus:outline-none focus:border-accent-green`,placeholder:g(`models.catalogSearchPlaceholder`),autoFocus:!0})]}),(0,A.jsxs)(`label`,{className:`inline-flex items-center gap-1.5 text-xs text-dark-muted whitespace-nowrap cursor-pointer`,children:[(0,A.jsx)(`input`,{type:`checkbox`,checked:wt,onChange:e=>{let t=e.target.checked;Tt(t),Dt(mt,{reason:St,tool:t})},className:`accent-accent-green`}),g(`models.catalogOnlyToolCall`)]}),(0,A.jsxs)(`label`,{className:`inline-flex items-center gap-1.5 text-xs text-dark-muted whitespace-nowrap cursor-pointer`,children:[(0,A.jsx)(`input`,{type:`checkbox`,checked:St,onChange:e=>{let t=e.target.checked;Ct(t),Dt(mt,{reason:t,tool:wt})},className:`accent-accent-green`}),g(`models.catalogOnlyReasoning`)]})]}),bt&&(0,A.jsx)(`div`,{className:`text-xs text-accent-red bg-accent-red/10 p-2 rounded`,children:bt}),vt?(0,A.jsxs)(`div`,{className:`flex items-center justify-center py-10 text-dark-muted`,children:[(0,A.jsx)(m,{size:18,className:`animate-spin me-2`}),` `,g(`models.searching`)]}):(0,A.jsx)(`div`,{className:`max-h-96 overflow-y-auto custom-scrollbar border border-dark-border rounded-lg divide-y divide-dark-border`,children:gt.length===0?(0,A.jsx)(`div`,{className:`py-10 text-center text-dark-muted text-sm`,children:g(`models.catalogNoResults`)}):gt.map(e=>(0,A.jsxs)(`div`,{className:`flex items-center gap-3 px-3 py-2 hover:bg-dark-hover`,children:[(0,A.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,A.jsx)(`span`,{className:`text-sm font-medium text-dark-text truncate`,children:e.model.name||e.model.id}),(0,A.jsx)(`code`,{className:`text-badge px-1.5 py-0.5 bg-dark-bg border border-dark-border rounded text-dark-muted truncate`,children:e.model.id}),e.model.reasoning&&(0,A.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 bg-accent-yellow/10 text-accent-yellow rounded`,children:g(`models.badgeReasoning`)}),e.model.tool_call&&(0,A.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 bg-accent-blue/10 text-accent-blue rounded`,children:g(`models.badgeToolCall`)}),e.model.attachment&&(0,A.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 bg-accent-green/10 text-accent-green rounded`,children:g(`models.badgeMultimodal`)})]}),(0,A.jsxs)(`div`,{className:`text-meta text-dark-muted mt-0.5`,children:[e.providerName,e.model.limit?.context?` · ${g(`models.ctxLimit`,{k:(e.model.limit.context/1e3).toFixed(0)})}`:``,e.model.limit?.output?` · ${g(`models.outLimit`,{k:(e.model.limit.output/1e3).toFixed(0)})}`:``,e.model.cost?.input===void 0?``:` · $${e.model.cost.input}/M in / $${e.model.cost.output}/M out`]})]}),(0,A.jsxs)(`button`,{onClick:()=>Ot(e),className:`shrink-0 inline-flex items-center gap-1 px-2.5 py-1 text-xs border border-accent-green/30 text-accent-green rounded hover:bg-accent-green/10 whitespace-nowrap max-md:whitespace-normal`,title:g(`models.catalogAddTitle`),children:[(0,A.jsx)(u,{size:12}),` `,g(`models.add`)]})]},`${e.providerId}:${e.model.id}`))}),(0,A.jsx)(`div`,{className:`text-meta text-dark-muted/60`,children:g(`models.catalogSourceHint`)})]})})]})]})}function Ae({title:e,value:t,color:n}){return(0,A.jsxs)(`div`,{className:`${{green:`bg-accent-green/10 text-accent-green`,yellow:`bg-accent-yellow/10 text-accent-yellow`,red:`bg-accent-red/10 text-accent-red`,blue:`bg-accent-blue/10 text-accent-blue`}[n]} rounded-lg p-3`,children:[(0,A.jsx)(`div`,{className:`text-xs opacity-70`,children:e}),(0,A.jsx)(`div`,{className:`text-xl font-semibold`,children:t})]})}function U({label:e,value:t}){return(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`text-dark-muted`,children:e}),(0,A.jsx)(`div`,{children:t})]})}export{H as ModelsView,H as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{Dr as t,Er as n,Jn as r,Y as i,ft as a,g as o,it as s,kr as c,lt as l,n as u,ni as d,ut as ee,v as te}from"./icons-B8Ngx6rM.js";import{t as f}from"./useTranslation-gGKZZfux.js";import{t as ne}from"./Button-D-g7PgYh.js";import{r as p}from"./api-ZQf0Ys8y.js";import{I as m}from"./markdown-Cps-36Z5.js";import{n as re}from"./useConfirm-CQjBnYuP.js";import{f as ie}from"./common-CPZxdYLs.js";import{n as h,t as g}from"./Install-Cuelo0If.js";var _=e(d(),1),v=m();function ae(e){return(0,v.jsx)(`span`,{className:`px-1.5 py-0.5 rounded text-meta border ${e===`bundled`?`bg-accent-blue/15 text-accent-blue border-accent-blue`:e===`npm`?`bg-accent-purple/15 text-accent-purple border-accent-purple`:e===`local`?`bg-accent-blue/15 text-accent-blue border-accent-blue`:`bg-dark-hover text-dark-muted border-dark-border`}`,children:e})}function oe(e){return e?(0,v.jsx)(`span`,{className:`px-1.5 py-0.5 rounded text-meta border ${e===`builtin`?`bg-dark-hover text-dark-muted border-dark-border`:e===`openclaw`?`bg-accent-yellow/15 text-accent-yellow border-accent-yellow`:e===`deepseek-harness`?`bg-accent-green/15 text-accent-green border-accent-green`:`bg-dark-hover text-dark-muted border-dark-border`}`,children:e}):null}function se({plugin:e,job:t,error:n,onInstall:i,onDismiss:a}){let{t:o}=f(),s=t?.status===`running`,c=t&&s?h(t.stage,o):null,l=e.marketId??e.id;return(0,v.jsxs)(`div`,{"data-install-card":l,className:`rounded-lg border border-dark-border bg-dark-surface p-3`,children:[(0,v.jsxs)(`div`,{className:`flex items-center gap-2 max-md:flex-wrap max-md:gap-1 max-md:min-w-0`,children:[(0,v.jsx)(`span`,{className:`text-compact font-medium text-dark-text truncate`,children:e.name||e.id}),e.version&&(0,v.jsx)(`span`,{className:`text-meta text-dark-muted shrink-0`,children:e.version}),ae(e.source),oe(e.market),e.category&&(0,v.jsx)(`span`,{className:`px-1.5 py-0.5 rounded text-meta bg-dark-hover text-dark-muted border border-dark-border shrink-0`,children:e.category}),(0,v.jsx)(`div`,{className:`flex-1`}),(0,v.jsx)(`span`,{className:`text-meta text-dark-muted font-mono shrink-0 max-md:max-w-full max-md:truncate`,children:e.id})]}),e.description&&(0,v.jsx)(`p`,{className:`mt-1 text-xs text-dark-muted`,children:e.description}),(0,v.jsxs)(`div`,{className:`mt-2 flex items-center gap-1.5 max-md:flex-wrap`,children:[(0,v.jsxs)(`button`,{onClick:()=>i(l,!0),disabled:s,className:`flex items-center gap-1 px-2 py-1 rounded bg-accent-blue/20 border border-accent-blue/40 text-accent-blue text-meta hover:bg-accent-blue/30 disabled:opacity-50 transition-colors`,children:[s?(0,v.jsx)(r,{size:11,className:`animate-pulse`}):(0,v.jsx)(r,{size:11}),c??o(`plugins.installActivate`)]}),(0,v.jsxs)(`button`,{onClick:()=>i(l,!1),disabled:s,className:`flex items-center gap-1 px-2 py-1 rounded bg-dark-hover border border-dark-border text-dark-muted text-meta hover:text-dark-text disabled:opacity-50 transition-colors`,children:[(0,v.jsx)(r,{size:11}),` `,o(`plugins.installOnly`)]})]}),(t||n)&&(0,v.jsx)(g,{job:t??null,error:n??null,onClose:a,testId:`plugin-install-console`,diagnosis:{kind:`plugin`,targetId:e.marketId??e.id,label:e.name},onRetry:t?.status===`error`||!t&&n?()=>i(l,t?.activate??!0):void 0})]})}function ce({jobs:e,onSelect:t}){let{t:n}=f(),i=e.filter(e=>e.status===`running`);return i.length===0?null:(0,v.jsxs)(`div`,{"data-testid":`plugin-install-status-bar`,className:`shrink-0 mx-3 mt-2 rounded-lg border border-accent-blue/40 bg-accent-blue/10 px-2 py-1.5`,children:[(0,v.jsxs)(`div`,{className:`flex items-center gap-1.5 px-0.5 pb-1`,children:[(0,v.jsx)(r,{size:11,className:`shrink-0 text-accent-blue`}),(0,v.jsx)(`span`,{className:`text-meta tabular-nums text-dark-text`,children:i.length})]}),(0,v.jsx)(`ul`,{className:`space-y-0.5`,children:i.map(e=>{let r=Math.max(0,Math.min(100,e.progress));return(0,v.jsx)(`li`,{children:(0,v.jsxs)(`button`,{type:`button`,onClick:()=>t(e.marketId),className:`w-full flex items-center gap-1.5 rounded px-1 py-0.5 text-start hover:bg-dark-hover transition-colors max-md:flex-wrap`,children:[(0,v.jsx)(`span`,{className:`h-2.5 w-2.5 shrink-0 spin-slow rounded-full border-2 border-accent-blue border-t-transparent`}),(0,v.jsx)(`span`,{className:`shrink-0 max-w-[10rem] truncate font-mono text-meta text-dark-text`,children:e.marketId}),(0,v.jsx)(`span`,{className:`shrink-0 text-meta text-dark-muted max-md:max-w-[9rem] max-md:truncate`,children:e.alreadyInstalled?n(`plugins.installAlreadyInstalled`):h(e.stage,n)}),(0,v.jsx)(`span`,{className:`flex-1 h-1 rounded-full bg-dark-hover overflow-hidden max-md:w-full`,children:(0,v.jsx)(`span`,{className:`block h-full bg-accent-blue transition-[width] duration-300 ease-out`,style:{width:`${r}%`}})}),(0,v.jsxs)(`span`,{className:`shrink-0 text-meta tabular-nums text-dark-muted`,children:[r,`%`]})]})},e.marketId)})})]})}var y=700;function b(e,t){if(!(t in e))return e;let n={...e};return delete n[t],n}function le(){let[e,t]=(0,_.useState)({}),[n,r]=(0,_.useState)({}),[i,a]=(0,_.useState)(0),o=(0,_.useRef)(new Map),s=(0,_.useCallback)(e=>{let t=o.current.get(e);t!==void 0&&(window.clearTimeout(t),o.current.delete(e))},[]),c=(0,_.useCallback)((e,n)=>{s(e);let i=async()=>{let c=await p.get(`/api/plugins/install/${encodeURIComponent(n)}`);if(!c.success||!c.data){r(t=>({...t,[e]:c.error??`Lost install job`})),s(e),a(e=>e+1);return}let l=c.data;t(t=>({...t,[e]:l})),l.status===`running`?o.current.set(e,window.setTimeout(()=>void i(),y)):(o.current.delete(e),a(e=>e+1))};i()},[s]),l=(0,_.useCallback)(async(e,n)=>{s(e),r(t=>b(t,e)),t(t=>({...t,[e]:{jobId:`local:${e}:${Date.now()}`,marketId:e,activate:n,status:`running`,stage:`queued`,progress:0,logs:[],alreadyInstalled:!1,startedAt:Date.now()}}));let i=await p.post(`/api/plugins/install`,{id:e,activate:n});if(!i.success){let n=i.error??`Install request failed`;return t(t=>b(t,e)),r(t=>({...t,[e]:n})),{job:null,error:n}}if(!i.data?.jobId)return t(t=>b(t,e)),{job:null,error:null};let a=i.data;return t(t=>({...t,[e]:a})),c(e,a.jobId),{job:a,error:null}},[c,s]);return(0,_.useEffect)(()=>{let e=o.current;return()=>{for(let t of e.values())window.clearTimeout(t);e.clear()}},[]),{jobs:e,errors:n,settledCount:i,start:l,dismiss:(0,_.useCallback)(n=>{let i=e[n];i&&i.status===`running`||(t(e=>b(e,n)),r(e=>b(e,n)))},[e])}}var x=12,S=`other`,ue=[`all`,`builtin`,`openclaw`,`deepseek-harness`];function de(e){return e===`wired`?`bg-accent-green/15 text-accent-green border-accent-green`:e===`pending`||e===`pending_wiring`?`bg-accent-yellow/15 text-accent-yellow border-accent-yellow`:`bg-dark-hover text-dark-muted border-dark-border`}function C(e){return e.category?.trim()||S}function w(e){return e.trim().toLowerCase().replace(/[._\s]+/g,`-`)}function fe(e,t){let n=t.trim().toLowerCase();return!n||[e.id,e.name,e.description,e.category,...e.tags??[]].filter(e=>typeof e==`string`).join(` `).toLowerCase().includes(n)}function pe(){let{t:e}=f(),[r,d]=(0,_.useState)(`installed`),[m,h]=(0,_.useState)([]),[g,oe]=(0,_.useState)([]),[y,b]=(0,_.useState)([]),[S,pe]=(0,_.useState)(null),[T,me]=(0,_.useState)(!0),[E,he]=(0,_.useState)(null),[D,ge]=(0,_.useState)(null),[_e,ve]=(0,_.useState)(null),[O,k]=(0,_.useState)(null),[A,j]=(0,_.useState)(null),[ye,M]=(0,_.useState)(null),[N,P]=(0,_.useState)(``),[F,I]=(0,_.useState)(null),[L,R]=(0,_.useState)(null),[z,B]=(0,_.useState)(1),V=(0,_.useCallback)((e,t)=>{k({kind:e,text:t}),window.setTimeout(()=>k(null),4e3)},[]),H=(0,_.useCallback)(async()=>{me(!0),he(null);let[e,t]=await Promise.all([p.get(`/api/plugins`),p.get(`/api/plugins/market`)]);e.success&&e.data?(h(e.data.plugins),pe(e.data.schemaVersion??null),oe(e.data.issues??[])):he(e.error??`Failed to load plugins`),t.success&&t.data&&b(t.data.plugins),me(!1)},[]);(0,_.useEffect)(()=>{H()},[H]);let U=(0,_.useMemo)(()=>m.filter(e=>e.installable!==!0),[m]),W=(0,_.useMemo)(()=>{let e=new Set(m.filter(e=>e.installable===!0).map(e=>w(e.id))),t=new Set;for(let e of m)e.installable!==!0&&(t.add(w(e.id)),e.marketId&&t.add(w(e.marketId)));return[...m.filter(e=>e.installable===!0),...y.filter(n=>{let r=w(n.id);return!e.has(r)&&!t.has(r)})]},[m,y]),G=(0,_.useCallback)(e=>e.filter(e=>F&&C(e)!==F||L&&(e.market??null)!==L?!1:fe(e,N)),[F,N,L]),K=(0,_.useMemo)(()=>G(U),[G,U]),q=(0,_.useMemo)(()=>G(W),[G,W]),be=(0,_.useMemo)(()=>{let e=new Set;for(let t of W)e.add(C(t));return[`all`,...Array.from(e).sort()]},[W]),J=(0,_.useMemo)(()=>{let e=new Set;for(let t of W)t.market&&e.add(t.market);return ue.filter(t=>t===`all`||e.has(t))},[W]),xe=e=>Math.max(1,Math.ceil(e/x)),Se=(e,t)=>e.slice((t-1)*x,t*x),Y=xe(K.length),X=xe(q.length),Ce=(0,_.useMemo)(()=>Se(K,Math.min(z,Y)),[K,z,Y]),we=(0,_.useMemo)(()=>Se(q,Math.min(z,X)),[q,z,X]);(0,_.useEffect)(()=>{B(1)},[r,N,F,L]),(0,_.useEffect)(()=>{L!==null&&!J.includes(L)&&R(null)},[L,J]);let Te=N.trim().length>0||F!==null||L!==null,Z=(0,_.useCallback)(async(e,t,n)=>{ge(e),ve(t);try{let r=await n();r&&r.success===!1?V(`err`,String(r.error??`Request failed`)):(V(`ok`,`${t} ${e} ✓`),await H())}catch(e){V(`err`,e instanceof Error?e.message:String(e))}finally{ge(null),ve(null)}},[H,V]),Q=le(),Ee=async(e,t)=>{let{job:n,error:r}=await Q.start(e,t);if(!n){if(r)return V(`err`,r);V(`ok`,`installed ${e} ✓`),await H()}},De=Q.settledCount;(0,_.useEffect)(()=>{De>0&&H()},[De,H]);let Oe=(0,_.useMemo)(()=>Object.values(Q.jobs),[Q.jobs]),$=(0,_.useCallback)(e=>{d(`available`),P(``),I(null),R(null);let t=W.findIndex(t=>((`marketId`in t?t.marketId:void 0)??t.id)===e);t>=0&&B(Math.floor(t/x)+1),requestAnimationFrame(()=>{Array.from(document.querySelectorAll(`[data-install-card]`)).find(t=>t.getAttribute(`data-install-card`)===e)?.scrollIntoView({block:`center`,behavior:`smooth`})})},[W]),ke=(0,_.useCallback)(e=>{if(!e)return;let t=w(e.marketId??e.id),n=e=>w((`marketId`in e?e.marketId:void 0)??e.id);W.some(e=>n(e)===t)?$(e.marketId??e.id):U.some(e=>n(e)===t)?(d(`installed`),I(null),R(null),P(e.id)):d(`available`)},[W,U,$]),Ae=e=>Z(e,`enabled`,()=>p.post(`/api/plugins/${encodeURIComponent(e)}/enable`)),je=e=>Z(e,`disabled`,()=>p.post(`/api/plugins/${encodeURIComponent(e)}/disable`)),Me=e=>Z(e,`uninstalled`,()=>p.delete(`/api/plugins/${encodeURIComponent(e)}`)),Ne=async e=>{M(e);try{let t=await p.post(`/api/plugins/l2/provider/${encodeURIComponent(e)}`);t.success&&t.data?(V(`ok`,`Provider ${t.data.applied} applied to config ✓`),await H()):V(`err`,t.error??`Apply failed`)}catch(e){V(`err`,e instanceof Error?e.message:String(e))}finally{M(null)}},Pe=(r,i)=>i>1?(0,v.jsxs)(`div`,{className:`flex items-center justify-center gap-3 pt-3 pb-1 select-none max-md:flex-wrap max-md:gap-2`,children:[(0,v.jsxs)(`button`,{onClick:()=>B(e=>Math.max(1,e-1)),disabled:z<=1,className:`flex items-center gap-1 px-2 py-1 rounded border border-dark-border bg-dark-hover text-dark-muted text-meta hover:text-dark-text disabled:opacity-40 disabled:cursor-not-allowed transition-colors`,children:[(0,v.jsx)(t,{size:12}),` `,e(`plugins.prevPage`)]}),(0,v.jsx)(`span`,{className:`text-meta text-dark-muted`,children:e(`plugins.pageInfo`,{page:Math.min(z,i),pages:i,count:r})}),(0,v.jsxs)(`button`,{onClick:()=>B(e=>Math.min(i,e+1)),disabled:z>=i,className:`flex items-center gap-1 px-2 py-1 rounded border border-dark-border bg-dark-hover text-dark-muted text-meta hover:text-dark-text disabled:opacity-40 disabled:cursor-not-allowed transition-colors`,children:[e(`plugins.nextPage`),` `,(0,v.jsx)(n,{size:12})]})]}):null,Fe=t=>(0,v.jsx)(`div`,{className:`mt-8 text-center text-xs text-dark-muted`,children:Te?e(`plugins.noMatch`):t});return(0,v.jsxs)(`div`,{className:`h-full flex flex-col min-h-0 bg-dark-bg`,children:[(0,v.jsxs)(`div`,{className:`h-11 flex items-center gap-2 px-3 border-b border-dark-border bg-dark-bg shrink-0 select-none`,children:[(0,v.jsx)(a,{size:15,className:`text-accent-blue`}),(0,v.jsx)(`span`,{className:`truncate text-compact font-medium text-dark-text`,children:e(`nav.plugins`)}),S!==null&&(0,v.jsxs)(`span`,{className:`px-1.5 py-0.5 rounded text-badge bg-dark-hover text-dark-muted border border-dark-border`,children:[`schema v`,S]}),(0,v.jsx)(`div`,{className:`flex-1`}),(0,v.jsx)(`button`,{onClick:()=>void H(),className:`p-1.5 rounded hover:bg-dark-hover text-dark-muted hover:text-dark-text transition-colors`,title:`Refresh`,children:(0,v.jsx)(s,{size:14,className:T?`animate-spin`:``})})]}),g.length>0&&(0,v.jsxs)(`div`,{className:`shrink-0 mx-3 mt-2 rounded-lg border border-accent-yellow/40 bg-accent-yellow/10`,children:[(0,v.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5`,children:[(0,v.jsx)(o,{size:13,className:`shrink-0 text-accent-yellow`}),(0,v.jsx)(`span`,{className:`text-xs text-dark-text`,children:e(`plugins.issues.title`,{count:g.length})}),(0,v.jsx)(`div`,{className:`flex-1`}),(0,v.jsx)(ne,{variant:`ghost`,size:`sm`,onClick:()=>ke(g[0]),children:e(`plugins.issues.goMarket`)})]}),(0,v.jsx)(`ul`,{className:`max-h-28 space-y-1 overflow-y-auto px-3 pb-2`,children:g.map(t=>{let n=t.marketId??t.id,r=t.stage===`install`||t.stage===`restore`,i=r&&Q.jobs[n]?.status===`running`;return(0,v.jsxs)(`li`,{className:`flex items-baseline gap-1.5 text-meta`,children:[(0,v.jsx)(`span`,{className:`shrink-0 rounded border border-dark-border bg-dark-hover px-1 text-dark-muted`,children:e(`plugins.issues.stage.${t.stage}`)}),(0,v.jsx)(`span`,{className:`shrink-0 font-mono text-dark-text`,children:t.marketId??t.id}),t.channelType&&(0,v.jsx)(`span`,{className:`shrink-0 text-dark-muted`,children:e(`plugins.issues.channelType`,{type:t.channelType})}),t.message&&(0,v.jsx)(`span`,{className:`truncate text-dark-muted`,title:t.message,children:t.message}),r&&(0,v.jsx)(`button`,{onClick:()=>void Ee(n,!0),disabled:i,title:e(`plugins.installActivate`),className:`ms-auto shrink-0 rounded border border-accent-blue/40 px-1 text-accent-blue hover:bg-accent-blue/10 disabled:opacity-50 transition-colors`,children:e(`plugins.installRetry`)})]},`${t.stage}:${t.id}`)})})]}),(0,v.jsx)(`div`,{className:`flex items-center gap-1 px-3 pt-2 shrink-0`,children:[`installed`,`available`].map(t=>(0,v.jsx)(`button`,{onClick:()=>d(t),className:`px-3 py-1.5 rounded-t text-xs transition-colors ${r===t?`bg-dark-surface text-accent-blue border border-b-0 border-dark-border`:`text-dark-muted hover:text-dark-text`}`,children:t===`installed`?e(`plugins.installedTab`,{count:U.length}):e(`plugins.availableTab`,{count:W.length})},t))}),(0,v.jsx)(ce,{jobs:Oe,onSelect:$}),(0,v.jsxs)(`div`,{className:`shrink-0 px-3 pt-2 pb-1 space-y-2 bg-dark-bg`,children:[(0,v.jsxs)(`div`,{className:`relative`,children:[(0,v.jsx)(i,{size:13,className:`absolute start-2.5 top-1/2 -translate-y-1/2 text-dark-muted pointer-events-none`}),(0,v.jsx)(`input`,{value:N,onChange:e=>P(e.target.value),placeholder:e(`plugins.searchPlaceholder`),className:`w-full ps-8 pe-8 py-1.5 rounded bg-dark-hover border border-dark-border text-xs text-dark-text placeholder-dark-muted outline-none focus:border-accent-blue/50 transition-colors`}),N&&(0,v.jsx)(`button`,{onClick:()=>P(``),className:`absolute end-2 top-1/2 -translate-y-1/2 p-0.5 rounded text-dark-muted hover:text-dark-text transition-colors`,title:e(`plugins.clear`),children:(0,v.jsx)(u,{size:12})})]}),r===`available`&&be.length>2&&(0,v.jsx)(`div`,{className:`flex flex-wrap items-center gap-1.5`,children:be.map(t=>(0,v.jsx)(`button`,{onClick:()=>I(t===`all`?null:t),className:`px-2 py-0.5 rounded-full text-meta border transition-colors ${t===`all`&&F===null||F===t?`bg-accent-blue/20 text-accent-blue border-accent-blue/40`:`bg-dark-hover text-dark-muted border-dark-border hover:text-dark-text`}`,children:t===`all`?e(`plugins.allCategories`):t},t))}),r===`available`&&(0,v.jsx)(`div`,{className:`flex flex-wrap items-center gap-1.5`,children:J.map(t=>{let n=t===`all`?e(`plugins.marketFilterAll`):t===`builtin`?e(`plugins.marketFilterBuiltin`):t;return(0,v.jsx)(`button`,{onClick:()=>R(t===`all`?null:t),className:`px-2 py-0.5 rounded-full text-meta border transition-colors ${t===`all`&&L===null||L===t?`bg-accent-blue/20 text-accent-blue border-accent-blue/40`:`bg-dark-hover text-dark-muted border-dark-border hover:text-dark-text`}`,children:n},t)})})]}),(0,v.jsxs)(`div`,{className:`flex-1 min-h-0 overflow-y-auto px-3 pb-4`,children:[E&&(0,v.jsxs)(`div`,{className:`mt-3 flex items-center gap-2 px-3 py-2 rounded bg-accent-red/15 border border-accent-red text-accent-red text-xs`,children:[(0,v.jsx)(o,{size:14}),` `,E]}),T&&!E&&(0,v.jsx)(`div`,{className:`mt-8 px-4`,role:`status`,children:(0,v.jsx)(ie,{count:4})}),!T&&r===`installed`&&(0,v.jsxs)(`div`,{className:`mt-3 space-y-2`,children:[K.length===0&&Fe(e(`plugins.emptyInstalled`)),Ce.map(t=>{let n=t.l2??[],r=t,i=r.status===`active`,a=r.status===`disabled`||r.enabled===!1;return(0,v.jsxs)(`div`,{className:`rounded-lg border border-dark-border bg-dark-surface p-3`,children:[(0,v.jsxs)(`div`,{className:`flex items-center gap-2 max-md:flex-wrap max-md:gap-1 max-md:min-w-0`,children:[(0,v.jsx)(`span`,{className:`text-compact font-medium text-dark-text truncate`,children:t.name||t.id}),t.version&&(0,v.jsx)(`span`,{className:`text-meta text-dark-muted shrink-0`,children:t.version}),ae(t.source),(0,v.jsx)(`span`,{className:`px-1.5 py-0.5 rounded text-meta border shrink-0 ${i?`bg-accent-green/15 text-accent-green border-accent-green`:a?`bg-accent-yellow/10 text-accent-yellow border-accent-yellow/60`:`bg-dark-hover text-dark-muted border-dark-border`}`,children:i?`active`:a?`disabled`:`installed`}),t.httpMounted&&(0,v.jsx)(`span`,{className:`px-1.5 py-0.5 rounded text-meta bg-accent-green/15 text-accent-green border border-accent-green shrink-0`,children:`http mounted`}),(0,v.jsx)(`div`,{className:`flex-1`}),(0,v.jsx)(`span`,{className:`text-meta text-dark-muted font-mono shrink-0 max-md:max-w-full max-md:truncate`,children:t.id})]}),t.description&&(0,v.jsx)(`p`,{className:`mt-1 text-xs text-dark-muted`,children:t.description}),n.length>0&&(0,v.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-1.5`,children:[n.map(e=>(0,v.jsxs)(`span`,{title:e.note||e.id,className:`px-1.5 py-0.5 rounded text-meta border cursor-help ${de(e.status)}`,children:[e.kind,` · `,e.status,e.status===`wired`&&(0,v.jsx)(c,{size:10,className:`inline ms-0.5`})]},`${e.kind}-${e.id}`)),n.filter(e=>e.kind===`provider`&&e.status===`wired`).map(t=>(0,v.jsx)(`button`,{disabled:ye===t.id,onClick:()=>void Ne(t.id),className:`px-1.5 py-0.5 rounded text-meta border border-accent-blue/40 text-accent-blue hover:bg-accent-blue/10 disabled:opacity-50 transition-colors`,title:e(`plugins.applyProviderTitle`),children:ye===t.id?`applying…`:`apply provider`},`apply-${t.id}`))]}),(0,v.jsxs)(`div`,{className:`mt-2 flex items-center gap-1.5 max-md:flex-wrap`,children:[i?(0,v.jsxs)(`button`,{onClick:()=>void je(t.id),disabled:D===t.id,className:`flex items-center gap-1 px-2 py-1 rounded bg-accent-yellow/15 border border-accent-yellow text-accent-yellow text-meta hover:bg-accent-yellow/15 disabled:opacity-50 transition-colors`,children:[(0,v.jsx)(ee,{size:11}),` `,D===t.id?`${_e}…`:e(`plugins.deactivate`)]}):(0,v.jsxs)(`button`,{onClick:()=>void Ae(t.id),disabled:D===t.id,className:`flex items-center gap-1 px-2 py-1 rounded bg-accent-green/15 border border-accent-green text-accent-green text-meta hover:bg-accent-green/15 disabled:opacity-50 transition-colors`,children:[(0,v.jsx)(l,{size:11}),` `,D===t.id?`${_e}…`:e(`plugins.activate`)]}),(0,v.jsxs)(`button`,{onClick:()=>j(t.id),disabled:D===t.id,className:`flex items-center gap-1 px-2 py-1 rounded bg-dark-hover border border-dark-border text-dark-muted text-meta hover:text-accent-red hover:border-accent-red disabled:opacity-50 transition-colors`,children:[(0,v.jsx)(te,{size:11}),` `,e(`plugins.uninstall`)]})]})]},t.id)}),Pe(K.length,Y)]}),!T&&r===`available`&&(0,v.jsxs)(`div`,{className:`mt-3 space-y-2`,children:[q.length===0&&Fe(e(`plugins.emptyMarket`)),we.map(e=>{let t=(`marketId`in e?e.marketId:void 0)??e.id;return(0,v.jsx)(se,{plugin:e,job:Q.jobs[t],error:Q.errors[t]??null,onInstall:(e,t)=>void Ee(e,t),onDismiss:()=>Q.dismiss(t)},e.id)}),Pe(q.length,X)]})]}),O&&(0,v.jsxs)(`div`,{className:`fixed bottom-4 end-4 z-50 flex items-center gap-2 px-3 py-2 rounded-lg border text-xs shadow-lg ${O.kind===`ok`?`bg-accent-green/15 border-accent-green text-accent-green`:`bg-accent-red/15 border-accent-red text-accent-red`}`,children:[O.kind===`ok`?(0,v.jsx)(c,{size:13}):(0,v.jsx)(u,{size:13}),` `,O.text]}),(0,v.jsx)(re,{isOpen:A!==null,title:e(`plugins.uninstallTitle`),message:e(`plugins.uninstallConfirm`,{id:A??``}),onConfirm:()=>{A&&Me(A),j(null)},onClose:()=>j(null)})]})}export{pe as PluginsView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{Cn as t,Er as n,G as r,Or as i,Wn as a,Xr as o,Y as s,Zn as c,_t as l,br as u,dt as d,g as f,it as p,kr as m,n as h,ni as g,nr as _,qn as v,ut as y,vr as b,wn as x,zr as S}from"./icons-B8Ngx6rM.js";import{r as C}from"./react-vendor-CXI113IS.js";import{t as w}from"./useTranslation-gGKZZfux.js";import{u as T}from"./imageUrl-CrQM4gmf.js";import{i as E,r as D,t as O}from"./Button-D-g7PgYh.js";import{c as k}from"./threads-lr33dwqg.js";import"./src-BK8SoTFV.js";import{gt as ee,ht as A,l as j,mt as M,pt as N}from"./DiffPreview-D8tIj_aF.js";import{n as te,r as P,t as F}from"./InputArea-D5F91Uwk.js";import{t as ne}from"./api-ZQf0Ys8y.js";import{I}from"./markdown-Cps-36Z5.js";import{i as re,n as ie,r as L,s as ae}from"./FileContextMenu-C5WYeBNu.js";import{r as R,t as z}from"./useConfirm-CQjBnYuP.js";import"./common-CPZxdYLs.js";import{C as B,E as V,S as H,T as U,b as oe,f as W,w as se,x as G,y as K}from"./index-STsyoFCk.js";var ce=C(),q=e(g(),1);function le(e={}){let t=e.enabled!==!1,n=A(e=>e.projects),r=A(e=>e.total),i=A(e=>e.hidden),a=A(e=>e.detail),o=A(e=>e.detailLoading),s=A(e=>e.detailError),c=A(e=>e.query),l=A(e=>e.sort),u=A(e=>e.stale),d=A(e=>e.loading),f=A(e=>e.lastError),p=A(e=>e.disabled),m=A(e=>e.openProjectId),h=A(e=>e.refresh);(0,q.useEffect)(()=>{t&&A.getState().refresh()},[t]),(0,q.useEffect)(()=>{t&&u&&A.getState().scheduleRefresh()},[t,u]),(0,q.useEffect)(()=>{if(!t||typeof document>`u`)return;let e=()=>{document.visibilityState===`visible`&&A.getState().refresh()};return document.addEventListener(`visibilitychange`,e),()=>document.removeEventListener(`visibilitychange`,e)},[t]);let g=M(n,l),_=new Set(i),v=g.filter(e=>_.has(e.projectId));return{projects:g.filter(e=>!_.has(e.projectId)).filter(e=>e.rootExists),hiddenProjects:v,hiddenCount:v.length,total:r,detail:a,detailLoading:o,detailError:s,query:c,sort:l,stale:u,loading:d,lastError:f,disabled:p,openProjectId:m,setQuery:e=>A.getState().setQuery(e),setSort:e=>A.getState().setSort(e),openProject:e=>void A.getState().openProject(e),closeDetail:()=>A.getState().closeDetail(),enterProject:(e,t)=>A.getState().enterProject(e,t),backToProjectList:()=>A.getState().backToProjectList(),createProject:(e,t)=>A.getState().createProject(e,t),hideProject:e=>A.getState().hideProject(e),unhideProjects:e=>A.getState().unhideProjects(e),unhideAll:()=>A.getState().unhideAll(),probeEntry:()=>void A.getState().probeEntry(),refresh:()=>void h()}}var J=I();function ue({isOpen:e,onClose:t,projects:n,onRestore:r}){let{t:i}=w(),[a,o]=(0,q.useState)(()=>new Set),s=(0,q.useRef)(n);s.current=n,(0,q.useEffect)(()=>{e&&o(new Set(s.current.map(e=>e.projectId)))},[e]);let c=n.length>0&&a.size===n.length,l=e=>{o(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})};return(0,J.jsxs)(R,{isOpen:e,onClose:t,title:i(`projects.hiddenModalTitle`),size:`md`,bodyClassName:`p-0`,children:[(0,J.jsxs)(`div`,{"data-testid":`projects-hidden-modal`,children:[(0,J.jsx)(`p`,{className:`border-b border-dark-border px-6 py-3 text-meta leading-relaxed text-dark-muted max-md:px-4`,children:i(`projects.hiddenModalHint`)}),(0,J.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-dark-border/60 px-6 py-2 max-md:flex-wrap max-md:px-4`,children:[(0,J.jsx)(`button`,{type:`button`,onClick:()=>{o(c?new Set:new Set(n.map(e=>e.projectId)))},className:`text-meta text-dark-muted underline transition-colors hover:text-dark-text hover:no-underline`,"data-testid":`projects-hidden-toggle-all`,children:i(c?`projects.hiddenClearSelection`:`projects.hiddenSelectAll`)}),(0,J.jsx)(`span`,{className:`ms-auto text-meta tabular-nums text-dark-muted/70`,children:i(`projects.hiddenSelectedCount`,{count:a.size})})]}),(0,J.jsx)(`ul`,{className:`max-h-[50vh] overflow-y-auto custom-scrollbar`,"data-testid":`projects-hidden-list`,children:n.map(e=>{let t=a.has(e.projectId);return(0,J.jsx)(`li`,{children:(0,J.jsxs)(`label`,{className:D(`flex cursor-pointer items-center gap-2.5 border-b border-dark-border/40 px-6 py-2 transition-colors max-md:px-4`,t?`bg-dark-hover/60`:`hover:bg-dark-hover/40`),"data-testid":`projects-hidden-row-${e.projectId}`,children:[(0,J.jsx)(`input`,{type:`checkbox`,checked:t,onChange:()=>l(e.projectId),"data-testid":`projects-hidden-option-${e.projectId}`,className:`h-3.5 w-3.5 shrink-0 cursor-pointer`}),(0,J.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,J.jsxs)(`span`,{className:`flex items-center gap-1.5`,children:[(0,J.jsx)(`span`,{className:`truncate text-compact text-dark-text`,title:e.root,children:e.name}),!e.rootExists&&(0,J.jsx)(`span`,{className:`shrink-0 text-badge text-accent-yellow`,children:i(`projects.rootMissing`)})]}),(0,J.jsx)(`span`,{className:`mt-0.5 block truncate font-mono text-meta text-dark-muted/70`,title:e.root,children:e.root})]})]})},e.projectId)})})]}),(0,J.jsxs)(`div`,{className:`flex items-center justify-end gap-2 border-t border-dark-border px-6 py-3 max-md:px-4`,children:[(0,J.jsx)(O,{onClick:t,children:i(`common.cancel`)}),(0,J.jsx)(O,{variant:`accent`,disabled:a.size===0,onClick:()=>{let e=n.filter(e=>a.has(e.projectId)).map(e=>e.projectId);e.length!==0&&(r(e),t())},"data-testid":`projects-hidden-confirm`,children:i(`projects.hiddenRestoreSelected`,{count:a.size})})]})]})}var de={neutral:`border-dark-border bg-dark-hover/40 text-dark-muted`,ok:`border-accent-green/30 bg-accent-green/10 text-accent-green`,warn:`border-accent-yellow/40 bg-accent-yellow/10 text-accent-yellow`};function fe(e){return e.threads.waiting>0?{tone:`waiting`,live:!1}:e.threads.review>0?{tone:`review`,live:!1}:e.threads.working>0||e.sessions.running>0?{tone:`working`,live:!0}:{tone:`idle`,live:!1}}function Y({tone:e=`neutral`,testid:t,title:n,children:r}){return(0,J.jsx)(`span`,{"data-testid":t,title:n,className:D(`inline-flex shrink-0 items-center gap-0.5 rounded-full border px-1.5 py-px text-meta leading-4`,de[e]),children:r})}function X({icon:e,label:t,hint:n,disabled:r,testid:i,onClick:a}){let o=r?`${t} — ${n??``}`:t;return(0,J.jsx)(`button`,{type:`button`,"aria-label":o,title:o,"data-testid":i,"data-disabled":r?`true`:`false`,disabled:r,onClick:e=>{e.stopPropagation(),a()},className:`inline-flex h-6 w-6 items-center justify-center rounded-md text-dark-muted transition-colors hover:bg-dark-hover hover:text-dark-text disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:bg-transparent`,children:e})}var pe=(0,q.memo)(function({project:e,onOpen:t,onOpenFolder:n,onCopyRoot:r,onHide:i,now:o}){let{t:s}=w(),c=!e.rootExists,l=Object.values(e.threads).reduce((e,t)=>e+t,0),u=fe(e),d=j(e.lastActivityAt,o,s);return(0,J.jsxs)(`div`,{role:`button`,tabIndex:0,onClick:()=>t(e.projectId),onKeyDown:n=>{(n.key===`Enter`||n.key===` `)&&n.target===n.currentTarget&&(n.preventDefault(),t(e.projectId))},className:D(`group relative flex cursor-pointer items-center gap-2.5 rounded-lg border px-3 py-2 text-start transition-colors`,c?`border-dashed border-dark-border/60 opacity-70`:`border-dark-border hover:border-accent-blue/40 hover:bg-dark-hover/40`),"data-testid":`project-row-${e.projectId}`,"data-root-missing":c?`true`:`false`,"data-status":u.tone,children:[(0,J.jsx)(`span`,{"aria-hidden":`true`,className:`status-dot shrink-0`,"data-tone":u.tone,"data-live":u.live?`true`:`false`,"data-testid":`project-status-${e.projectId}`}),(0,J.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,J.jsxs)(`span`,{className:`flex items-center gap-1.5`,children:[(0,J.jsx)(`span`,{className:`truncate text-compact font-semibold text-dark-text`,title:e.root,children:e.name}),(0,J.jsx)(`span`,{className:`shrink-0 rounded border border-dark-border px-1 py-px text-badge leading-4 text-dark-muted`,children:s(`projects.visibility`)}),c&&(0,J.jsx)(`span`,{className:`shrink-0 text-badge text-accent-yellow`,children:s(`projects.rootMissing`)})]}),(0,J.jsx)(`span`,{className:`mt-0.5 flex items-center gap-2 text-meta leading-tight text-dark-muted/70`,children:(0,J.jsx)(`span`,{className:`min-w-0 flex-1 truncate font-mono`,title:e.root,children:e.root})})]}),(0,J.jsxs)(`span`,{className:`hidden shrink-0 items-center gap-1.5 md:flex`,children:[(0,J.jsxs)(Y,{testid:`project-sessions-${e.projectId}`,children:[s(`projects.sessionCount`,{count:e.sessions.total}),e.sessions.running>0&&(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`span`,{className:`text-dark-muted/40`,"aria-hidden":`true`,children:`·`}),(0,J.jsx)(`span`,{className:`inline-flex items-center gap-0.5 text-accent-blue`,"data-testid":`project-running`,children:s(`projects.runningCount`,{count:e.sessions.running})})]})]}),(0,J.jsx)(Y,{testid:`project-threads-${e.projectId}`,children:l>0?s(`projects.threadCount`,{count:l}):s(`projects.noThreads`)}),e.agentMd.present?(0,J.jsx)(Y,{tone:e.agentMd.truncated?`warn`:`ok`,testid:`project-agentmd-${e.projectId}`,title:e.agentMd.truncated?s(`projects.agentMdTruncated`,{bytes:e.agentMd.bytes??0}):s(`projects.agentMdBytes`,{bytes:e.agentMd.bytes??0}),children:e.agentMd.truncated?s(`projects.agentMdTruncatedShort`):s(`projects.agentMdReady`)}):(0,J.jsx)(Y,{testid:`project-agentmd-${e.projectId}`,children:s(`projects.agentMdAbsent`)}),c&&(0,J.jsx)(Y,{tone:`warn`,testid:`project-missing-${e.projectId}`,children:s(`projects.rootMissingChip`)})]}),d&&(0,J.jsx)(`span`,{className:`hidden shrink-0 font-mono text-meta tabular-nums text-dark-muted lg:block`,"data-testid":`project-activity-${e.projectId}`,children:d}),(0,J.jsxs)(`span`,{className:`flex shrink-0 items-center gap-0.5`,onClick:e=>e.stopPropagation(),children:[(0,J.jsx)(X,{icon:(0,J.jsx)(x,{size:13,"aria-hidden":`true`}),label:s(`projects.openFolder`),hint:c?s(`projects.openFolderDisabled`):void 0,disabled:c,testid:`project-open-folder-${e.projectId}`,onClick:()=>n(e.root)}),(0,J.jsx)(X,{icon:(0,J.jsx)(_,{size:13,"aria-hidden":`true`}),label:s(`projects.copyRoot`),testid:`project-copy-root-${e.projectId}`,onClick:()=>r(e.root)}),(0,J.jsx)(X,{icon:(0,J.jsx)(a,{size:13,"aria-hidden":`true`}),label:s(c?`projects.removeView`:`projects.hide`),hint:s(`projects.hideHint`),testid:`project-hide-${e.projectId}`,onClick:()=>i(e.projectId)})]})]})}),me=[`answer`,`thread`,`goal`,`handoff`,`approval`,`session`];function Z(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function Q(e){return typeof e==`string`&&e.trim()?e:void 0}function he(e){let t=Z(e);if(!t)return null;let n=t.kind;if(typeof n!=`string`||!me.includes(n))return null;let r={kind:n,reason:typeof t.reason==`string`?t.reason:``},i=Z(t.refs);if(i){let e={},t=Q(i.goalId);if(t&&(e.goalId=t),Array.isArray(i.threadIds)){let t=i.threadIds.filter(e=>typeof e==`string`&&!!e);t.length&&(e.threadIds=t)}let n=Q(i.projectKey);n&&(e.projectKey=n),Object.keys(e).length&&(r.refs=e)}let a=Z(t.suggest),o=a?Q(a.title):void 0;if(o){let e=a?Q(a.seed):void 0;r.suggest={title:o,...e?{seed:e}:{}}}return r}function ge(e){switch(e){case`thread`:return`green`;case`goal`:return`purple`;case`handoff`:return`brand`;case`approval`:return`yellow`;case`session`:return`brand`;default:return`neutral`}}var _e=(0,q.memo)(function({route:e,root:t,onOpenThread:n,onOpenSession:r}){let{t:i}=w(),a=N(e=>e.rows),o=N(e=>e.query),[s,c]=(0,q.useState)(!1),[l,u]=(0,q.useState)(null),[d,f]=(0,q.useState)(!1);if(e.kind===`session`&&!e.suggest?.title)return(0,J.jsx)(`span`,{className:`mt-0.5 block text-meta text-dark-text-secondary`,children:e.reason});let p=e.refs?.threadIds?.[0],m=e.refs?.goalId,h=e.refs?.projectKey,g=Object.keys(a).length>0,_=!!p&&o===``&&g&&!a[p],v=!!p&&!!n&&!_,y=async()=>{let n=e.suggest?.title;if(n&&!s){c(!0),f(!1);try{let i=await ne.sessions.create(n,t);if(i.success&&i.data){let a=e.suggest?.seed?.trim();a&&T.getState().setSessionInput(i.data.id,a),u(i.data.title||n),r?.(i.data.id,t,i.data.title||n)}else f(!0)}catch{f(!0)}finally{c(!1)}}};return(0,J.jsxs)(`span`,{className:`mt-1 block rounded-md border border-dark-border bg-dark-bg-tertiary/50 p-1.5`,"data-testid":`pm-route-card`,"data-route-kind":e.kind,children:[(0,J.jsxs)(`span`,{className:`flex items-center gap-1.5`,children:[(0,J.jsx)(`span`,{className:`status-pill`,"data-tone":ge(e.kind),"data-testid":`pm-route-kind`,children:i(`projects.pmRouteKind.${e.kind}`)}),(0,J.jsx)(`span`,{className:`text-badge text-dark-text-secondary`,children:i(`projects.pmRouteTo`)})]}),e.reason?(0,J.jsx)(`span`,{className:`mt-0.5 block text-meta text-dark-text-secondary`,children:e.reason}):null,v?(0,J.jsxs)(`button`,{type:`button`,onClick:()=>n?.(p),className:`mt-1 inline-flex items-center gap-1 rounded bg-dark-hover/50 px-1.5 py-0.5 text-meta text-dark-text-primary hover:bg-dark-hover`,"data-testid":`pm-route-open-thread`,children:[i(`projects.pmRouteOpenThread`),(0,J.jsx)(`span`,{className:`font-mono text-dark-text-secondary`,children:p})]}):_?null:m?(0,J.jsxs)(`span`,{className:`mt-1 block font-mono text-badge text-dark-text-secondary`,"data-testid":`pm-route-goal-ref`,children:[i(`projects.pmRouteGoalRef`),`: `,m]}):h?(0,J.jsxs)(`span`,{className:`mt-1 block font-mono text-badge text-dark-text-secondary`,"data-testid":`pm-route-project-ref`,children:[i(`projects.pmRouteProjectRef`),`: `,h]}):null,e.kind===`session`?l?(0,J.jsx)(`span`,{className:`mt-1 block text-meta text-accent-green`,"data-testid":`pm-route-session-created`,children:i(`projects.pmRouteSessionCreated`,{title:l})}):(0,J.jsxs)(`span`,{className:`mt-1 block`,children:[(0,J.jsx)(`button`,{type:`button`,onClick:()=>void y(),disabled:s,className:`inline-flex items-center gap-1 rounded bg-accent-green/15 px-2 py-0.5 text-meta text-accent-green hover:bg-accent-green/25 disabled:opacity-50`,"data-testid":`pm-route-create-session`,children:i(s?`projects.pmRouteSessionCreating`:`projects.pmRouteCreateSession`)}),d?(0,J.jsx)(`span`,{className:`ms-1.5 text-badge text-accent-red`,"data-testid":`pm-route-create-failed`,children:i(`projects.pmRouteCreateFailed`)}):null]}):null]})});function ve(e,t,n){let r=e.fields,i=e=>typeof r[e]==`string`?r[e]:``;switch(e.type){case`pm_started`:return(0,J.jsx)(`span`,{children:t(`projects.pmStarted`)});case`pm_stopped`:return(0,J.jsx)(`span`,{children:t(`projects.pmStopped`)});case`pm_wakeup`:{let e=i(`reason`),n=i(`summary`);return(0,J.jsxs)(`span`,{children:[t(`projects.pmWakeup`),e?(0,J.jsxs)(`span`,{className:`text-dark-text-secondary`,children:[` · `,e]}):null,n?(0,J.jsx)(`span`,{className:`block text-dark-text-secondary`,children:n}):null]})}case`pm_report`:{let e=i(`title`),a=i(`progressSummary`),o=i(`nextAction`),s=typeof r.approvalsPending==`number`?r.approvalsPending:0,c=he(r.route);return(0,J.jsxs)(`span`,{children:[e?(0,J.jsx)(`span`,{className:`font-medium`,children:e}):(0,J.jsx)(`span`,{children:t(`projects.pmReport`)}),a?(0,J.jsx)(`span`,{className:`block text-dark-text-secondary`,children:a}):null,o?(0,J.jsxs)(`span`,{className:`block text-dark-text-secondary`,children:[t(`projects.pmNextAction`),`: `,o]}):null,s>0?(0,J.jsxs)(`span`,{className:`mt-0.5 inline-flex items-center gap-1 text-accent-yellow`,children:[(0,J.jsx)(u,{size:12,"aria-hidden":`true`}),` `,s,` `,t(`projects.pmApprovalsPending`)]}):null,c?(0,J.jsx)(_e,{route:c,root:n.root,onOpenThread:n.onOpenThread,onOpenSession:n.onOpenSession}):null]})}case`pm_approval_requested`:return(0,J.jsx)(`span`,{children:t(`projects.pmApprovalRequested`)});case`pm_approval_resolved`:return(0,J.jsxs)(`span`,{children:[t(`projects.pmApprovalResolved`),i(`decision`)?(0,J.jsxs)(`span`,{className:`text-dark-text-secondary`,children:[` · `,i(`decision`)]}):null]});default:return(0,J.jsx)(`span`,{children:e.type})}}var ye=(0,q.memo)(function({root:e,onOpenThread:t,onOpenSession:r,children:a}){let{t:o}=w(),s=(0,q.useMemo)(()=>k(e)??``,[e]),c=V(e=>e.residentByProject[s]??!1),l=V(e=>e.activityByProject[s]??K),d=V(e=>e.approvals),f=(0,q.useMemo)(()=>B(d,s),[d,s]),p=V(e=>e.resolveApproval),[g,_]=(0,q.useState)(!1),[v,y]=(0,q.useState)(!1);(0,q.useEffect)(()=>{s&&H(s)},[s]);let x=async()=>{if(s&&!v){y(!0);try{await U(s,!c)}finally{y(!1)}}},C=l.slice(-20).reverse(),T=(0,q.useMemo)(()=>{if(g)return null;let e=l.slice(-20);for(let t=e.length-1;t>=0;t--){let n=e[t];if(!n||n.type!==`pm_report`)continue;let r=he(n.fields.route);if(r)return r}return null},[l,g]),E=(0,q.useMemo)(()=>({root:e,onOpenThread:t,onOpenSession:r}),[e,t,r]);return(0,J.jsxs)(`section`,{"aria-label":o(`projects.pmPanel`),className:`flex min-h-0 min-w-0 flex-1 flex-col border-b border-dark-border`,children:[(0,J.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2 overflow-hidden px-3 py-2 max-md:flex-wrap`,children:[(0,J.jsx)(S,{size:14,"aria-hidden":`true`,className:c?`text-accent-green`:`text-dark-text-secondary`}),(0,J.jsx)(`span`,{className:`min-w-0 shrink truncate text-xs font-medium`,children:o(`projects.pmPanel`)}),(0,J.jsxs)(`span`,{className:D(`inline-flex items-center gap-1 rounded-full px-1.5 py-0.5 text-badge`,c?`bg-accent-green/15 text-accent-green`:`bg-dark-bg-tertiary text-dark-text-secondary`),children:[(0,J.jsx)(`span`,{className:D(`h-1.5 w-1.5 rounded-full`,c?`bg-accent-green`:`bg-dark-text-secondary`),"aria-hidden":`true`}),o(c?`projects.pmResident`:`projects.pmOff`)]}),(0,J.jsxs)(`div`,{className:`ms-auto flex shrink-0 items-center gap-1 max-md:w-full max-md:justify-end`,children:[(0,J.jsx)(`button`,{type:`button`,onClick:x,disabled:v||!s,className:D(`rounded px-2 py-0.5 text-meta transition-colors`,c?`text-dark-text-secondary hover:bg-dark-bg-tertiary hover:text-dark-text-primary`:`bg-accent-green/15 text-accent-green hover:bg-accent-green/25`),children:o(c?`projects.pmStop`:`projects.pmStart`)}),(0,J.jsx)(`button`,{type:`button`,onClick:()=>_(e=>!e),"aria-expanded":g,"aria-label":o(`projects.pmToggleTimeline`),className:`rounded p-1 text-dark-text-secondary hover:bg-dark-bg-tertiary hover:text-dark-text-primary`,children:g?(0,J.jsx)(i,{size:14,"aria-hidden":`true`}):(0,J.jsx)(n,{size:14,"aria-hidden":`true`})})]})]}),f.length>0&&(0,J.jsx)(`ul`,{className:`space-y-1.5 px-3 pb-2`,children:f.map(e=>(0,J.jsx)(`li`,{className:`rounded-md border border-accent-yellow bg-accent-yellow/15 p-2`,children:(0,J.jsxs)(`div`,{className:`flex items-start gap-1.5`,children:[(0,J.jsx)(u,{size:13,"aria-hidden":`true`,className:`mt-0.5 shrink-0 text-accent-yellow`}),(0,J.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,J.jsx)(`p`,{className:`truncate text-xs font-medium text-dark-text-primary`,children:e.title||e.requestedAction||o(`projects.pmApprovalCard`)}),e.summary?(0,J.jsx)(`p`,{className:`mt-0.5 line-clamp-3 text-meta text-dark-text-secondary`,children:e.summary}):null,(0,J.jsxs)(`div`,{className:`mt-1.5 flex gap-1.5`,children:[(0,J.jsxs)(`button`,{type:`button`,onClick:()=>void p(e.escalationId,`approve`),className:`inline-flex items-center gap-1 rounded bg-accent-green/15 px-2 py-0.5 text-meta text-accent-green hover:bg-accent-green/25`,children:[(0,J.jsx)(m,{size:11,"aria-hidden":`true`}),` `,o(`projects.pmApprove`)]}),(0,J.jsxs)(`button`,{type:`button`,onClick:()=>void p(e.escalationId,`reject`),className:`inline-flex items-center gap-1 rounded bg-accent-red/15 px-2 py-0.5 text-meta text-accent-red hover:bg-accent-red/15`,children:[(0,J.jsx)(h,{size:11,"aria-hidden":`true`}),` `,o(`projects.pmReject`)]})]})]})]})},e.escalationId))}),T?(0,J.jsx)(`div`,{className:`px-3 pb-2`,children:(0,J.jsx)(_e,{route:T,root:E.root,onOpenThread:E.onOpenThread,onOpenSession:E.onOpenSession})}):null,a?(0,J.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col`,children:a}):null,g&&C.length>0&&(0,J.jsx)(`div`,{className:`px-3 pb-2`,children:(0,J.jsx)(`ul`,{className:`max-h-48 space-y-1.5 overflow-y-auto`,children:C.map(e=>(0,J.jsxs)(`li`,{className:`flex items-start gap-1.5 text-xs`,children:[e.type===`pm_report`?(0,J.jsx)(b,{size:12,"aria-hidden":`true`,className:`mt-0.5 shrink-0 text-accent-green`}):(0,J.jsx)(`span`,{className:`mt-1 h-1.5 w-1.5 shrink-0 rounded-full bg-dark-text-secondary`,"aria-hidden":`true`}),(0,J.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,J.jsx)(`div`,{className:`text-dark-text-primary`,children:ve(e,o,E)}),(0,J.jsx)(`div`,{className:`text-badge text-dark-text-secondary`,children:j(e.at)})]})]},e.id))})})]})}),be=[],xe={setActiveTab:()=>{},createNewSession:()=>{},setTheme:()=>{},setLogs:()=>{},setUnreadLogs:()=>{}},Se=(0,q.memo)(function({projectId:e,root:t,sessionId:n,onOpenThread:r,onOpenSession:i,onLoadSession:a,slashOptions:o,onStop:s,onPause:c,onResume:l}){let{t:u}=w(),d=V(e=>e.managers),f=V(e=>e.managersLoaded),p=V(e=>e.fetchManagers),m=V(t=>t.residentByProject[e]??!1),h=A(e=>e.setFocusedPmSession),g=A(e=>e.enterPmSession),_=A(e=>e.backToPmSessions);(0,q.useEffect)(()=>{p()},[p]);let v=(0,q.useMemo)(()=>d.find(t=>t.projectKey===e)?.managerSessionIds??[],[d,e]),y=v.includes(n)?n:f?v[0]??null:n;(0,q.useEffect)(()=>{f&&(y?y!==n&&g(y):_())},[f,y,n,g,_]),(0,q.useEffect)(()=>(h(y),()=>h(null)),[y,h]),(0,q.useEffect)(()=>{y&&a&&a(y)},[y,a]);let b=T(e=>y?e.messagesBySession[y]??be:be),x=T(e=>y?e.generatingSessions.includes(y):!1),S=(0,q.useCallback)(async t=>{let n=t.trim();n&&y&&(await se(e,n,y)?T.getState().addMessage(y,{id:`msg-${Date.now()}`,type:`user`,content:n,timestamp:Date.now()}):E.error(u(`projects.pmSendFailed`)))},[e,y,u]);return(0,J.jsx)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col`,"data-testid":`coordinator-pane`,children:(0,J.jsx)(ye,{root:t,onOpenThread:r,onOpenSession:i,children:y?(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(P,{messages:b,isGenerating:x,isPaused:!1,sessionId:y}),(0,J.jsx)(F,{sessionId:y,onSend:S,onStop:()=>s?.(y),onPause:()=>c?.(y),onResume:()=>l?.(y),slashOptions:o??xe,inputDisabled:!m,inputDisabledHint:u(`projects.pmInputDisabled`)})]}):(0,J.jsx)(`div`,{className:`flex flex-1 items-center justify-center px-6 text-center text-xs text-dark-muted max-md:px-4`,children:u(`projects.coordinatorHint`)})})})}),Ce=(0,q.memo)(function({projectName:e,projectRoot:t,missing:n,levelLabel:i,onBack:a,onBackToSessions:s,onOpenFolder:c,onNewSessionHere:l,settingsOpen:u,onToggleSettings:f,onOpenMore:p,moreItemsCount:m}){let{t:h}=w(),g=e=>{let t=e.currentTarget.getBoundingClientRect();p(t.left,t.bottom+4,ae(m))};return(0,J.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2 border-b border-dark-border px-3 py-2.5 max-md:flex-wrap max-md:gap-1.5`,children:[(0,J.jsx)(`button`,{type:`button`,onClick:a,className:`ui-icon-button`,title:h(`projects.back`),"aria-label":h(`projects.back`),"data-testid":`project-detail-back`,children:(0,J.jsx)(o,{size:15,"aria-hidden":`true`})}),(0,J.jsxs)(`nav`,{className:`min-w-0 flex items-baseline gap-1.5 text-sm max-md:w-full`,children:[(0,J.jsx)(`button`,{type:`button`,onClick:a,className:`shrink-0 text-dark-muted transition-colors hover:text-dark-text`,children:h(`projects.title`)}),(0,J.jsx)(`span`,{className:`shrink-0 text-dark-muted/50`,"aria-hidden":`true`,children:`›`}),(0,J.jsx)(`button`,{type:`button`,onClick:s,disabled:!s,className:D(`min-w-0 truncate transition-colors`,s?`text-dark-muted hover:text-dark-text`:`cursor-default text-dark-text`),"data-testid":`project-detail-name`,children:e}),(0,J.jsx)(`span`,{className:`shrink-0 text-dark-muted/50`,"aria-hidden":`true`,children:`›`}),(0,J.jsx)(`button`,{type:`button`,onClick:s,disabled:!s,className:D(`min-w-0 truncate transition-colors`,s?`text-dark-muted hover:text-dark-text`:`cursor-default font-medium text-dark-text`),"data-testid":`project-detail-level`,children:i})]}),(0,J.jsxs)(`div`,{className:`ms-auto flex items-center gap-2 max-md:w-full max-md:justify-end`,children:[t&&(0,J.jsx)(`span`,{className:`hidden min-w-0 max-w-[240px] truncate font-mono text-meta text-dark-muted lg:block`,title:t,"data-testid":`project-detail-root`,children:t}),(0,J.jsxs)(`button`,{type:`button`,onClick:c,disabled:n,className:`btn shrink-0 text-meta disabled:cursor-not-allowed disabled:opacity-50`,title:n?h(`projects.openFolderDisabled`):t,"data-testid":`project-detail-open-folder`,children:[(0,J.jsx)(x,{size:12,"aria-hidden":`true`}),h(`projects.openFolder`)]}),(0,J.jsxs)(`button`,{type:`button`,onClick:l,disabled:n,className:`btn shrink-0 text-meta disabled:cursor-not-allowed disabled:opacity-50`,title:h(n?`projects.newSessionDisabled`:`projects.newSessionHere`),"data-testid":`project-detail-new-session-btn`,children:[(0,J.jsx)(d,{size:12,"aria-hidden":`true`}),h(`projects.newSessionHere`)]}),(0,J.jsx)(`button`,{type:`button`,onClick:f,"aria-expanded":u,className:`ui-icon-button`,title:h(`projects.settings`),"aria-label":h(`projects.settings`),"data-testid":`project-detail-settings`,children:(0,J.jsx)(r,{size:14,"aria-hidden":`true`})}),(0,J.jsx)(`button`,{type:`button`,onClick:g,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),g(e))},className:`ui-icon-button`,title:h(`projects.moreActions`),"aria-label":h(`projects.moreActions`),"aria-haspopup":`menu`,"data-testid":`project-detail-more`,children:(0,J.jsx)(v,{size:14,"aria-hidden":`true`})})]})]})}),we=(0,q.memo)(function({projectId:e,onOpenSession:t}){let{t:r}=w(),i=V(e=>e.managers),a=V(e=>e.fetchManagers),o=V(t=>t.residentByProject[e]??!1),[s,l]=(0,q.useState)(!1),[u,f]=(0,q.useState)(!1),[p,m]=(0,q.useState)(null),[g,_]=z();(0,q.useEffect)(()=>{a()},[a]);let v=(0,q.useMemo)(()=>i.find(t=>t.projectKey===e)??null,[i,e]),y=V(e=>e.managersLoaded),b=v?.managerSessionIds??[],x=(0,q.useCallback)(async()=>{if(s)return;l(!0);let n=await G(e);await a(),l(!1),n?t(n):E.error(r(`projects.pmCreateFailed`),5e3)},[s,e,a,t,r]),C=(0,q.useCallback)(async()=>{if(u)return;f(!0);let t=await U(e,!0);await a(),f(!1),t?E.success(r(`projects.pmEnableDone`),3e3):E.error(r(`projects.pmEnableFailed`),5e3)},[u,e,a,r]),T=(0,q.useCallback)(async t=>{if(p||!await _({message:r(`projects.pmCloseSessionConfirm`),variant:`danger`}))return;m(t);let n=await oe(e,t);await a(),m(null),n?E.success(r(`projects.pmCloseSessionDone`),3e3):E.error(r(`projects.pmCloseSessionFailed`),5e3)},[p,_,e,a,r]);return(0,J.jsxs)(`section`,{className:`flex min-h-0 flex-1 flex-col`,"aria-label":r(`projects.pmSessionList`),"data-testid":`pm-session-list`,children:[g,(0,J.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2 px-3 py-2 max-md:flex-wrap max-md:gap-1.5`,children:[(0,J.jsx)(S,{size:14,className:D(`shrink-0`,o?`text-accent-green`:`text-dark-muted`),"aria-hidden":`true`}),(0,J.jsx)(`span`,{className:`text-xs font-medium text-dark-text`,children:r(`projects.pmSessionList`)}),(0,J.jsx)(`span`,{className:`rounded-full border border-dark-border bg-dark-hover/40 px-1.5 py-px text-badge leading-4 text-dark-muted`,"data-testid":`pm-session-count-pill`,children:r(`projects.pmSessionCount`,{count:b.length})}),!o&&(0,J.jsx)(`span`,{className:`inline-flex items-center gap-1 rounded-full bg-dark-hover/70 px-1.5 py-px text-badge text-dark-muted`,"data-testid":`pm-session-resident-pill`,children:r(`projects.pmOff`)}),(0,J.jsxs)(`div`,{className:`ms-auto flex items-center gap-1.5 max-md:w-full max-md:justify-end`,children:[!o&&(0,J.jsx)(`button`,{type:`button`,onClick:()=>void C(),disabled:u,className:`btn shrink-0 text-meta disabled:opacity-50`,"data-testid":`pm-session-enable`,children:r(`projects.pmEnable`)}),(0,J.jsxs)(`button`,{type:`button`,onClick:()=>void x(),disabled:s,className:`btn btn-primary shrink-0 text-meta disabled:opacity-50`,title:r(`projects.pmNewSession`),"data-testid":`pm-new-session`,children:[(0,J.jsx)(d,{size:12,"aria-hidden":`true`}),r(`projects.pmNewSession`)]})]})]}),(0,J.jsx)(`p`,{className:`shrink-0 px-3 pb-2 text-meta leading-relaxed text-dark-muted`,children:r(`projects.pmSessionListHint`)}),(0,J.jsx)(`div`,{className:`board-ground min-h-0 flex-1 overflow-y-auto px-3 pb-3 custom-scrollbar`,children:(0,J.jsxs)(`div`,{className:`mx-auto flex max-w-[980px] flex-col gap-1.5`,children:[y&&b.length===0?(0,J.jsxs)(`div`,{className:`rounded-lg border border-dark-border bg-dark-surface px-3 py-4 text-center`,"data-testid":`pm-session-empty`,children:[(0,J.jsx)(`p`,{className:`text-xs text-dark-text`,children:r(`projects.emptyPmSessions`)}),(0,J.jsx)(`p`,{className:`mt-1 text-meta leading-relaxed text-dark-muted`,children:r(`projects.emptyPmSessionsHint`)})]}):null,b.map((e,i)=>{let a=i===0,s=!a;return(0,J.jsxs)(`div`,{className:`group relative`,children:[(0,J.jsxs)(`button`,{type:`button`,onClick:()=>t(e),className:D(`flex w-full items-center gap-2.5 rounded-lg border border-dark-border bg-dark-surface px-3 py-2 text-start transition-colors hover:border-accent-blue/40 hover:bg-dark-hover/30`,s&&`pe-10`),"data-testid":`pm-session-row`,"data-session-id":e,children:[(0,J.jsx)(S,{size:13,"aria-hidden":`true`,className:D(`shrink-0`,o?`text-accent-green`:`text-dark-muted`)}),(0,J.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,J.jsxs)(`span`,{className:`flex items-center gap-1.5`,children:[(0,J.jsx)(`span`,{className:`truncate text-xs text-dark-text`,children:W(b,e,r)}),a&&v?.isDuty&&(0,J.jsx)(`span`,{className:`shrink-0`,title:r(`projects.managerBadgeDuty`),children:(0,J.jsx)(c,{size:11,"aria-hidden":`true`,className:`text-accent-yellow`})})]}),(0,J.jsx)(`span`,{className:`mt-0.5 block truncate font-mono text-meta text-dark-muted/60`,title:e,children:e})]}),!s&&(0,J.jsx)(n,{size:13,"aria-hidden":`true`,className:`shrink-0 text-dark-muted opacity-0 transition-opacity group-hover:opacity-70`})]}),s&&(0,J.jsx)(`button`,{type:`button`,onClick:()=>void T(e),disabled:p===e,"aria-label":r(`projects.pmCloseSession`),title:r(`projects.pmCloseSession`),className:D(`absolute end-2 top-1/2 -translate-y-1/2 rounded p-1 transition-opacity`,`text-dark-muted hover:text-accent-red disabled:opacity-50`,p===e?`opacity-100`:`opacity-0 focus-visible:opacity-100 group-hover:opacity-100`),"data-testid":`pm-close-session`,"data-session-id":e,children:(0,J.jsx)(h,{size:13,"aria-hidden":`true`})})]},e)})]})})]})}),Te=200;function Ee({isOpen:e,onClose:t,projectId:n,currentName:r}){let{t:i}=w(),a=A(e=>e.renameProject),[o,s]=(0,q.useState)(r),[c,l]=(0,q.useState)(!1);(0,q.useEffect)(()=>{e&&(s(r),l(!1))},[e,r]);let u=async()=>{let e=o.trim();if(e===r.trim()){t();return}l(!0);let s=await a(n,e===``?null:e);l(!1),s.ok?(E.success(i(`projects.renamed`),3e3),t()):E.error(s.error,6e3)};return(0,J.jsxs)(R,{isOpen:e,onClose:t,title:i(`projects.rename`),size:`sm`,children:[(0,J.jsx)(`label`,{className:`mb-1 block text-meta text-dark-text`,htmlFor:`project-rename-input`,children:i(`projects.renameLabel`)}),(0,J.jsx)(`input`,{id:`project-rename-input`,autoFocus:!0,value:o,maxLength:Te,placeholder:r,onChange:e=>s(e.target.value),onKeyDown:e=>{e.key===`Enter`&&!c&&u()},className:`w-full rounded-lg border border-dark-border bg-dark-bg px-3 py-2 font-mono text-meta text-dark-text outline-none focus:border-accent-blue`,"data-testid":`project-rename-input`}),(0,J.jsx)(`p`,{className:`mt-1.5 text-meta leading-relaxed text-dark-muted`,children:i(`projects.renameHint`)}),(0,J.jsxs)(`div`,{className:`mt-5 flex justify-end gap-3`,children:[(0,J.jsx)(O,{onClick:t,"data-testid":`project-rename-cancel`,children:i(`common.cancel`)}),(0,J.jsx)(O,{variant:`accent`,onClick:()=>void u(),loading:c,"data-testid":`project-rename-submit`,children:i(`common.confirm`)})]})]})}var De=(0,q.memo)(function({projectId:e,onBack:t,onOpenFolder:n,onCopyRoot:r,onNewSessionHere:i,onOpenSession:o,onLoadSession:s,pmSlashOptions:c,onStopSession:u,onPauseSession:p,onResumeSession:m,onHide:h}){let{t:g}=w(),[v,y]=(0,q.useState)(!1),[b,S]=(0,q.useState)(!1),{state:C,openAt:T,close:E}=L(),D=A(e=>e.detail),O=A(e=>e.openPmSessionId),k=A(e=>e.enterPmSession),ee=A(e=>e.backToPmSessions),j=V(e=>e.managers);(0,q.useEffect)(()=>{A.getState().openProject(e)},[e]),(0,q.useEffect)(()=>{y(!1),S(!1)},[e]);let M=D?.project??null,N=M?!M.rootExists:!1,te=!M||N,P=(0,q.useMemo)(()=>{if(!O)return g(`projects.pmSessionList`);let t=j.find(t=>t.projectKey===e)?.managerSessionIds??[];return W(t,O,g)},[O,j,e,g]),F=(0,q.useMemo)(()=>{if(!M)return[];let e=[{kind:`item`,id:`copy-root`,label:g(`projects.copyRoot`),icon:_,onSelect:()=>r(M.root)}];return h&&e.push({kind:`item`,id:`hide-view`,label:g(N?`projects.removeView`:`projects.hide`),icon:a,onSelect:()=>h(M.projectId)}),e},[M,N,r,h,g]);return(0,J.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,"data-testid":`project-detail`,children:[(0,J.jsx)(Ce,{projectName:M?.name??e,projectRoot:M?.root,missing:te,levelLabel:P,onBack:t,onBackToSessions:O?ee:void 0,onOpenFolder:()=>M&&n(M.root),onNewSessionHere:()=>M&&i(M.root),settingsOpen:v,onToggleSettings:()=>y(e=>!e),onOpenMore:(e,t,n)=>T(e,t,null,{height:n}),moreItemsCount:F.length}),N&&M&&(0,J.jsxs)(`div`,{className:`flex shrink-0 items-start gap-1.5 border-b border-accent-yellow/30 bg-accent-yellow/10 px-3 py-2 text-meta leading-relaxed text-accent-yellow`,"data-testid":`project-detail-missing`,children:[(0,J.jsx)(f,{size:12,className:`mt-[1px] shrink-0`,"aria-hidden":`true`}),(0,J.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,J.jsx)(`b`,{className:`font-semibold`,children:g(`projects.rootMissingTitle`)}),M&&(0,J.jsx)(`span`,{className:`mx-1 font-mono`,children:M.root}),(0,J.jsx)(`br`,{}),g(`projects.rootMissingBody`)]})]}),v&&M&&(0,J.jsxs)(`div`,{className:`shrink-0 space-y-1 border-b border-dark-border bg-dark-hover/20 px-3 py-2`,"data-testid":`project-settings`,children:[(0,J.jsx)($,{icon:(0,J.jsx)(x,{size:12,"aria-hidden":`true`}),label:g(`projects.openFolder`),hint:M.root,disabled:N,disabledHint:N?g(`projects.openFolderDisabled`):void 0,onClick:()=>n(M.root),testId:`project-settings-open-folder`}),(0,J.jsx)($,{icon:(0,J.jsx)(_,{size:12,"aria-hidden":`true`}),label:g(`projects.copyRoot`),hint:M.root,onClick:()=>r(M.root),testId:`project-settings-copy-root`}),(0,J.jsx)($,{icon:(0,J.jsx)(l,{size:12,"aria-hidden":`true`}),label:g(`projects.rename`),hint:M.name,onClick:()=>S(!0),testId:`project-settings-rename`}),(0,J.jsx)($,{icon:(0,J.jsx)(d,{size:12,"aria-hidden":`true`}),label:g(`projects.newSessionHere`),disabled:N,disabledHint:N?g(`projects.newSessionDisabled`):void 0,onClick:()=>M&&i(M.root),testId:`project-settings-new-session`})]}),(0,J.jsx)(`div`,{className:`flex min-h-0 min-w-0 flex-1`,children:(0,J.jsx)(`div`,{className:`mx-auto flex min-h-0 min-w-0 w-full max-w-[1040px] flex-1 flex-col`,"data-testid":`project-session-column`,children:O?(0,J.jsx)(Se,{projectId:e,root:M?.root??e,sessionId:O,onOpenSession:o,onLoadSession:s,slashOptions:c,onStop:u,onPause:p,onResume:m}):(0,J.jsx)(we,{projectId:e,onOpenSession:k})})}),(0,J.jsx)(re,{items:F,position:C?{x:C.x,y:C.y}:null,anchor:C?.anchor??null,onClose:E,ariaLabel:g(`projects.moreActions`)}),M&&(0,J.jsx)(Ee,{isOpen:b,onClose:()=>S(!1),projectId:M.projectId,currentName:M.name})]})});function $({icon:e,label:t,hint:n,disabled:r,disabledHint:i,onClick:a,testId:o}){return(0,J.jsxs)(`button`,{type:`button`,onClick:a,disabled:r,className:D(`flex w-full items-center gap-2 rounded px-1.5 py-1 text-start text-meta transition-colors`,r?`cursor-not-allowed text-dark-muted/60`:`text-dark-text hover:bg-dark-hover`),"data-testid":o,"data-disabled":r?`true`:`false`,title:r?i:n,children:[(0,J.jsx)(`span`,{className:`shrink-0`,children:e}),(0,J.jsx)(`span`,{className:`shrink-0`,children:t}),(0,J.jsx)(`span`,{className:`ms-auto min-w-0 truncate font-mono text-badge text-dark-muted/70`,children:r?i:n})]})}var Oe=250,ke=(0,q.memo)(function({workspaceDir:e,onNewSessionHere:n,onOpenSession:r,onLoadSession:i,pmSlashOptions:o,onStopSession:c,onPauseSession:l,onResumeSession:u}){let{t:d}=w(),{projects:m,hiddenProjects:g,hiddenCount:_,query:v,sort:b,loading:x,lastError:S,disabled:C,setQuery:T,setSort:O,openProjectId:k,enterProject:A,backToProjectList:j,createProject:M,hideProject:N,unhideProjects:P,refresh:F}=le(),[ne,I]=(0,q.useState)(!1),[re,L]=(0,q.useState)(!1),[ae,R]=(0,q.useState)(!1),[z,B]=(0,q.useState)(v),V=(0,q.useRef)(null);(0,q.useEffect)(()=>{B(v)},[v]),(0,q.useEffect)(()=>()=>{V.current&&clearTimeout(V.current)},[]);let H=e=>{B(e),V.current&&clearTimeout(V.current),V.current=setTimeout(()=>T(e),Oe)},[oe,W]=(0,q.useState)(()=>Date.now());(0,q.useEffect)(()=>{let e=setInterval(()=>W(Date.now()),3e4);return()=>clearInterval(e)},[]);let se=(0,q.useMemo)(()=>ee,[]),G=e=>{ie.openFolder(e).then(e=>{e.ok||E.error(e.error||d(`projects.openFolderFailed`),5e3)})},K=e=>{let t=navigator.clipboard?.writeText(e);t&&t.then(()=>E.success(d(`projects.copied`),2e3),()=>E.error(d(`projects.copyFailed`),4e3))};return C?(0,J.jsx)(`div`,{className:`flex h-full items-center justify-center p-6 max-md:p-3`,"data-testid":`projects-disabled`,children:(0,J.jsxs)(`div`,{className:`max-w-md rounded-xl border border-dark-border bg-dark-surface p-4 text-center`,children:[(0,J.jsx)(y,{size:18,className:`mx-auto text-dark-muted`,"aria-hidden":`true`}),(0,J.jsx)(`p`,{className:`mt-2 text-xs leading-relaxed text-dark-muted`,children:d(`projects.disabled`)})]})}):(0,J.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,"data-testid":`projects-view`,children:[k?(0,J.jsx)(De,{projectId:k,onBack:j,onOpenFolder:G,onCopyRoot:K,onNewSessionHere:n,onOpenSession:r,onLoadSession:i,pmSlashOptions:o,onStopSession:c,onPauseSession:l,onResumeSession:u,onHide:e=>{N(e),E.info(d(`projects.hiddenToast`),4e3),j()}}):(0,J.jsxs)(J.Fragment,{children:[(0,J.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2 border-b border-dark-border px-3 py-2.5 max-md:flex-wrap max-md:gap-1.5`,children:[(0,J.jsx)(`span`,{className:`text-sm font-medium text-dark-text`,children:d(`projects.title`)}),(0,J.jsx)(`span`,{className:`rounded-full border border-dark-border bg-dark-hover/40 px-1.5 py-px text-badge leading-4 text-dark-muted`,"data-testid":`projects-count-pill`,children:d(`projects.projectCount`,{count:m.length})}),(0,J.jsx)(`div`,{className:`ms-1 flex items-center rounded-md bg-dark-hover/60 p-0.5 max-md:ms-0`,role:`group`,children:se.map(e=>(0,J.jsx)(`button`,{type:`button`,onClick:()=>O(e),"aria-pressed":b===e,className:D(`shrink-0 rounded px-1.5 py-0.5 text-meta transition-colors`,b===e?`bg-dark-surface text-dark-text`:`text-dark-muted hover:text-dark-text`),"data-testid":`projects-sort-${e}`,children:d(`projects.sort.${e}`)},e))}),(0,J.jsxs)(`div`,{className:`ms-auto flex items-center gap-1 max-md:w-full max-md:justify-end`,children:[(0,J.jsx)(`button`,{type:`button`,onClick:F,disabled:x,className:`ui-icon-button disabled:opacity-50`,title:d(`common.refresh`),"aria-label":d(`common.refresh`),"data-testid":`projects-refresh`,children:(0,J.jsx)(p,{size:14,className:D(x&&`animate-spin`),"aria-hidden":`true`})}),(0,J.jsxs)(`button`,{type:`button`,onClick:()=>I(!0),disabled:ae,className:`btn btn-primary shrink-0 text-meta disabled:opacity-60`,title:d(`projects.newHint`),"data-testid":`projects-new`,children:[(0,J.jsx)(t,{size:13,"aria-hidden":`true`}),d(`projects.new`)]})]})]}),S&&(0,J.jsx)(`div`,{className:`shrink-0 px-3 pt-2`,"data-testid":`projects-status-banner`,children:(0,J.jsxs)(`div`,{className:`flex items-start gap-1.5 rounded-lg border border-accent-red/40 bg-accent-red/10 px-2 py-1.5 text-meta leading-relaxed text-accent-red`,children:[(0,J.jsx)(f,{size:12,className:`mt-[1px] shrink-0`,"aria-hidden":`true`}),(0,J.jsx)(`span`,{className:`min-w-0 flex-1`,children:d(`projects.loadFailed`,{message:S})}),(0,J.jsx)(`button`,{type:`button`,onClick:F,className:`shrink-0 underline hover:no-underline`,"data-testid":`projects-retry`,children:d(`projects.retry`)})]})}),_>0&&(0,J.jsx)(`div`,{className:`shrink-0 px-3 pt-2`,"data-testid":`projects-hidden-banner`,children:(0,J.jsxs)(`div`,{className:`flex items-center gap-1.5 rounded-lg border border-dark-border bg-dark-hover/40 px-2 py-1.5 text-meta text-dark-muted`,children:[(0,J.jsx)(a,{size:11,className:`shrink-0`,"aria-hidden":`true`}),(0,J.jsx)(`span`,{className:`min-w-0 flex-1`,children:d(`projects.hiddenCount`,{count:_})}),(0,J.jsx)(`button`,{type:`button`,onClick:()=>L(!0),className:`shrink-0 underline hover:no-underline`,"data-testid":`projects-unhide`,children:d(`projects.unhide`)})]})}),(0,J.jsx)(`div`,{className:`board-ground min-h-0 flex-1 overflow-y-auto px-3 py-3 custom-scrollbar`,children:(0,J.jsxs)(`div`,{className:`mx-auto flex max-w-[980px] flex-col`,children:[(0,J.jsx)(`h1`,{className:`text-lg font-semibold text-dark-text`,children:d(`projects.title`)}),(0,J.jsx)(`p`,{className:`mt-0.5 text-xs leading-relaxed text-dark-muted`,children:d(`projects.subtitle`)}),(0,J.jsxs)(`div`,{className:`mt-4 flex items-center gap-2 rounded-lg border border-dark-border bg-dark-surface px-2.5 py-1.5 transition-colors focus-within:border-accent-blue/50`,children:[(0,J.jsx)(s,{size:13,className:`shrink-0 text-dark-muted`,"aria-hidden":`true`}),(0,J.jsx)(`input`,{type:`text`,value:z,onChange:e=>H(e.target.value),placeholder:d(`projects.searchPlaceholder`),"aria-label":d(`projects.searchPlaceholder`),"data-testid":`projects-search`,className:`min-w-0 flex-1 bg-transparent text-xs text-dark-text placeholder:text-dark-muted focus:outline-none`}),z&&(0,J.jsx)(`button`,{type:`button`,onClick:()=>H(``),className:`shrink-0 rounded p-0.5 text-dark-muted transition-colors hover:text-dark-text`,"aria-label":d(`projects.searchClear`),"data-testid":`projects-search-clear`,children:(0,J.jsx)(h,{size:12,"aria-hidden":`true`})}),(0,J.jsx)(`span`,{className:`shrink-0 text-badge text-dark-muted/70`,children:d(`projects.serverFilterHint`)})]}),m.length===0?v.trim()?(0,J.jsxs)(`div`,{className:`mt-6 rounded-xl border border-dashed border-dark-border/60 py-8 text-center`,"data-testid":`projects-search-empty`,children:[(0,J.jsx)(`p`,{className:`text-xs text-dark-text`,children:d(`projects.searchEmpty`)}),(0,J.jsx)(`p`,{className:`mt-1 text-meta leading-relaxed text-dark-muted`,children:d(`projects.searchEmptyHint`,{q:v.trim()})})]}):(0,J.jsxs)(`div`,{className:`mt-6 rounded-xl border border-dashed border-dark-border/60 py-8 text-center`,"data-testid":`projects-empty`,children:[(0,J.jsx)(`p`,{className:`text-xs text-dark-text`,children:d(`projects.empty`)}),(0,J.jsx)(`p`,{className:`mt-1 text-meta leading-relaxed text-dark-muted`,children:d(`projects.emptyHint`)})]}):(0,J.jsxs)(J.Fragment,{children:[(0,J.jsxs)(`div`,{className:`mb-2 mt-5 flex items-center gap-2 text-badge font-semibold uppercase tracking-wide text-dark-muted/60`,children:[(0,J.jsx)(`span`,{className:`shrink-0`,children:d(`projects.yourProjects`)}),(0,J.jsx)(`span`,{className:`h-px flex-1 bg-dark-border/60`,"aria-hidden":`true`})]}),(0,J.jsx)(`div`,{className:`flex flex-col gap-1.5`,"data-testid":`projects-list`,children:m.map(e=>(0,J.jsx)(pe,{project:e,onOpen:A,onOpenFolder:G,onCopyRoot:K,onHide:e=>{N(e),E.info(d(`projects.hiddenToast`),4e3)},now:oe},e.projectId))})]})]})})]}),(0,ce.createPortal)((0,J.jsx)(ue,{isOpen:re,projects:g,onClose:()=>L(!1),onRestore:e=>{P(e),E.success(d(`projects.hiddenRestored`,{count:e.length}),3e3)}}),document.body),(0,ce.createPortal)((0,J.jsx)(te,{isOpen:ne,initial:e||``,onClose:()=>I(!1),onConfirm:e=>{I(!1),R(!0),M(e).then(async e=>{if(!e.ok){R(!1),E.error(e.error,6e3);return}e.projectId&&A(e.projectId);let t=e.projectId?await U(e.projectId,!0):!1;R(!1),t?E.success(d(`projects.created`),3e3):E.error(d(`projects.createdNoPm`),6e3)})}}),document.body)]})});export{ke as ProjectsView};
|