@kimiclaw/cli 1.0.42 → 1.0.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +17 -21
  2. package/bin/dscode.exe +4 -0
  3. package/install.cjs +15 -0
  4. package/package.json +9 -9
  5. package/web/dist/assets/AssistantsView-Y3nFezhd.js +1 -0
  6. package/web/dist/assets/AutomationView-bf7_zU_p.js +4 -0
  7. package/web/dist/assets/Button-B43HsIQ3.js +1 -0
  8. package/web/dist/assets/ChannelConfigView---Dwl3Fk.js +12 -0
  9. package/web/dist/assets/ChartsView-Dw6G-jf3.js +1 -0
  10. package/web/dist/assets/ConnectorsView-BWvdrpyK.js +2 -0
  11. package/web/dist/assets/{MessageBubble-CVGXupVH.js → DiffPreview-WQihq3bK.js} +65 -67
  12. package/web/dist/assets/FileContextMenu-CyjXlSHp.js +1 -0
  13. package/web/dist/assets/FileTreeView-Cafy33nT.js +1 -0
  14. package/web/dist/assets/HookConfigView-D-lASVju.js +2 -0
  15. package/web/dist/assets/InboxView-BWajw-Yx.js +1 -0
  16. package/web/dist/assets/InputArea-CSqaA55j.js +31 -0
  17. package/web/dist/assets/Install-ClEm4oGX.js +2 -0
  18. package/web/dist/assets/MemoryView-DLri75dm.js +1 -0
  19. package/web/dist/assets/ModelsView-BBLUMzR5.js +1 -0
  20. package/web/dist/assets/PluginsView-C-fnbDGZ.js +1 -0
  21. package/web/dist/assets/ProjectsView-BruI2W_l.js +1 -0
  22. package/web/dist/assets/SessionGrid-7GLpwn6d.js +4 -0
  23. package/web/dist/assets/SettingsModal-cc9Qu2QU.js +4 -0
  24. package/web/dist/assets/SkillsView-Bf-2-U_q.js +1 -0
  25. package/web/dist/assets/TemplatesTab-CKul8nbL.js +2 -0
  26. package/web/dist/assets/ToolsView-D_aluOsK.js +1 -0
  27. package/web/dist/assets/WorkspaceDirPicker-Z42YqE4a.js +5 -0
  28. package/web/dist/assets/{agentIconSet-B5GUQwel.js → agentIconSet-Cqhm4UOl.js} +1 -1
  29. package/web/dist/assets/api-BW4-5gtM.js +1 -0
  30. package/web/dist/assets/channelMeta-BO645sjD.js +1 -0
  31. package/web/dist/assets/chatStore-D8Zzr1hE.js +242 -0
  32. package/web/dist/assets/cn-CoHJgTJ5.js +1 -0
  33. package/web/dist/assets/common-CP2UB8TN.js +304 -0
  34. package/web/dist/assets/icons-CittejKL.js +1 -0
  35. package/web/dist/assets/imageUrl-BVgcEm7e.js +2 -0
  36. package/web/dist/assets/index-CEUbTcNL.css +1 -0
  37. package/web/dist/assets/index-CxrzleFg.js +122 -0
  38. package/web/dist/assets/installDiagnosis-ZYUVgJIJ.js +3 -0
  39. package/web/dist/assets/{markdown-N5__3T-w.js → markdown-DZQBOzWk.js} +1 -1
  40. package/web/dist/assets/{panels-CIPgN61N.js → panels-CuDz4aqU.js} +1 -1
  41. package/web/dist/assets/projectsStore-B7fdKRzl.js +1 -0
  42. package/web/dist/assets/{react-vendor-CB4cLN-6.js → react-vendor-BEA-EtI-.js} +1 -1
  43. package/web/dist/assets/sessionKind-CZ1kQQII.js +1 -0
  44. package/web/dist/assets/{settingsStore-Xqln0d91.js → settingsStore-DYqiXodu.js} +1 -1
  45. package/web/dist/assets/src-55YckF5W.js +2 -0
  46. package/web/dist/assets/{state-CSZ50keL.js → state-A4wJ8QgR.js} +1 -1
  47. package/web/dist/assets/statusAxesRefresh-BBqszCp-.js +1 -0
  48. package/web/dist/assets/sttLanguages-jnSk4aqg.js +6 -0
  49. package/web/dist/assets/threadStore-CQi4OzSe.js +1 -0
  50. package/web/dist/assets/{types-JssxRFJn.js → threads-lr33dwqg.js} +1 -1
  51. package/web/dist/assets/useConfirm-kTv3x0H6.js +1 -0
  52. package/web/dist/assets/{useTranslation-B-mfApCn.js → useTranslation-2BGEBvJE.js} +1 -1
  53. package/web/dist/assets/websocket-DCs7f54y.js +1 -0
  54. package/web/dist/assets/whatsNewStore-DoCQvcMq.js +1 -0
  55. package/web/dist/favicon.svg +31 -14
  56. package/web/dist/icons/icon-1024.png +0 -0
  57. package/web/dist/icons/icon-180.png +0 -0
  58. package/web/dist/icons/icon-192.png +0 -0
  59. package/web/dist/icons/icon-512.png +0 -0
  60. package/web/dist/icons/icon-maskable-512.png +0 -0
  61. package/web/dist/index.html +42 -35
  62. package/web/dist/logo.svg +42 -20
  63. package/web/dist/manifest.webmanifest +2 -2
  64. package/web/dist/assets/AssistantsView-Ct3BBpYf.js +0 -1
  65. package/web/dist/assets/AutomationView-CO-jVhee.js +0 -3
  66. package/web/dist/assets/ChannelConfigView-Ct1W584x.js +0 -8
  67. package/web/dist/assets/ChartsView-CAc37Sam.js +0 -1
  68. package/web/dist/assets/ConnectorsView-DP4bbh58.js +0 -1
  69. package/web/dist/assets/FileTreeView-DwsYfssO.js +0 -1
  70. package/web/dist/assets/HookConfigView-uFsqieii.js +0 -2
  71. package/web/dist/assets/InputArea-BY8quOiH.js +0 -14
  72. package/web/dist/assets/MemoryView-Bgd_lcTf.js +0 -1
  73. package/web/dist/assets/ModelsView-B271UV9L.js +0 -1
  74. package/web/dist/assets/PluginsView-Dz4fqQR1.js +0 -2
  75. package/web/dist/assets/ProjectsView-DF-YCV8y.js +0 -1
  76. package/web/dist/assets/SessionGrid-BIREstN2.js +0 -4
  77. package/web/dist/assets/SettingsModal-ZJeoZcCd.js +0 -4
  78. package/web/dist/assets/SkillsView-CH2ghYL2.js +0 -1
  79. package/web/dist/assets/TemplatesTab-BGe7_67s.js +0 -1
  80. package/web/dist/assets/ThreadsView-XditIHZ4.js +0 -2
  81. package/web/dist/assets/ToolsView-BBzsFdVZ.js +0 -1
  82. package/web/dist/assets/api-plEYhRn0.js +0 -1
  83. package/web/dist/assets/channelMeta-BGQXQxgj.js +0 -1
  84. package/web/dist/assets/common-Bbatsa0-.js +0 -192
  85. package/web/dist/assets/icons-CYDRRPKW.js +0 -1
  86. package/web/dist/assets/index-CTbLW314.js +0 -133
  87. package/web/dist/assets/index-DdzVrZye.css +0 -1
  88. package/web/dist/assets/src-49LUQhkG.js +0 -1
  89. package/web/dist/assets/sttLanguages-CSNMgUTz.js +0 -2
  90. package/web/dist/assets/ttsSettings-BwXYpDnk.js +0 -2
  91. package/web/dist/assets/useConfirm-Da8iQ_DZ.js +0 -1
  92. package/web/dist/assets/websocket-BnDwh01e.js +0 -1
  93. package/web/dist/assets/whatsNewStore-LpdLRLGl.js +0 -1
  94. package/web/dist/assets/workspaceSemantics-RaIRer76.js +0 -3
  95. /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,Ar as n,Dr as r,Kn as i,Or as a,Rr as o,Xn as s,Y as c,Zt as l,a as u,dt as d,ft as f,g as p,ii as m,it as h,n as g,o as _,on as v,v as y,xr as b,yt as x}from"./icons-CittejKL.js";import{t as ee}from"./useTranslation-2BGEBvJE.js";import{O as S,c as C}from"./chatStore-D8Zzr1hE.js";import{r as w,t as T}from"./Button-B43HsIQ3.js";import{t as E}from"./src-55YckF5W.js";import{t as D}from"./api-BW4-5gtM.js";import{I as te}from"./markdown-DZQBOzWk.js";import{t as O}from"./cn-CoHJgTJ5.js";import{d as ne,l as re,s as k,u as ie}from"./common-CP2UB8TN.js";import{r as ae,t as oe}from"./useConfirm-kTv3x0H6.js";import{dt as se,et as ce,nt as A,tt as j}from"./index-CxrzleFg.js";var M=e(m(),1),N=te();function P(e){return e==null?``:String(e)}function le({provider:e,modelId:t,current:n,catalog:r,onSaved:i,className:a}){let{t:o}=ee(),[s,c]=(0,M.useState)(!1),[l,u]=(0,M.useState)({input:P(n?.input),output:P(n?.output),cacheRead:P(n?.cacheRead),cacheWrite:P(n?.cacheWrite)}),d=(0,M.useRef)(!1),f=`${n?.input??``}|${n?.output??``}|${n?.cacheRead??``}|${n?.cacheWrite??``}`;(0,M.useEffect)(()=>{d.current||u({input:P(n?.input),output:P(n?.output),cacheRead:P(n?.cacheRead),cacheWrite:P(n?.cacheWrite)})},[f]);let p=(0,M.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){w.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 D.models.update(e,t,{model:{pricing:a?null:r}});if(n.success===!1)throw Error(n.error||o(`models.priceSaveFailed`));w.success(o(`models.priceSaved`,{model:t})),i?.()}catch(e){w.error(e instanceof Error?e.message:o(`models.priceSaveFailed`))}finally{c(!1),window.setTimeout(()=>{d.current=!1},0)}}};return(0,N.jsxs)(`div`,{className:O(`flex flex-wrap items-center gap-2 text-xs`,a),children:[(0,N.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,N.jsxs)(`label`,{className:`flex items-center gap-1`,children:[(0,N.jsx)(`span`,{className:`text-dark-tertiary whitespace-nowrap`,children:o(`models.price_${e}`)}),(0,N.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:O(`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,N.jsx)(`span`,{className:`text-badge text-dark-tertiary`,children:o(`models.pricePerMillion`)})]})}function ue(e){return e==null?``:String(e)}function F(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}=ee(),[s,c]=(0,M.useState)(!1),[l,u]=(0,M.useState)({maxInput:ue(n?.contextWindow),maxOutput:ue(n?.maxTokens)}),d=(0,M.useRef)(!1),f=`${n?.contextWindow??``}|${n?.maxTokens??``}`;(0,M.useEffect)(()=>{d.current||u({maxInput:ue(n?.contextWindow),maxOutput:ue(n?.maxTokens)})},[f]);let p=async()=>{let r=F(l.maxInput),a=F(l.maxOutput);if(r===`invalid`||a===`invalid`)w.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 D.models.update(e,t,{model:{contextWindow:r,maxTokens:a}});if(n.success===!1)throw Error(n.error||o(`models.budgetSaveFailed`));w.success(o(`models.budgetSaved`,{model:t})),i?.()}catch(e){w.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,N.jsxs)(`div`,{className:O(`flex flex-wrap items-center gap-2 text-xs`,a),children:[(0,N.jsx)(`span`,{className:`text-dark-muted whitespace-nowrap`,children:o(`models.budgetLabel`)}),m.map(e=>(0,N.jsxs)(`label`,{className:`flex items-center gap-1`,children:[(0,N.jsx)(`span`,{className:`text-dark-tertiary whitespace-nowrap`,children:e.label}),(0,N.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:O(`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,N.jsx)(`span`,{className:`text-badge text-dark-tertiary`,children:o(`models.budgetBlankHint`)})]})}function fe({modelId:e,provider:t,className:n}){let{t:r}=ee(),i=k(e=>e.kinds),a=k(e=>e.entries),o=k(e=>e.saving),s=k(e=>e.saveEntry),c=k(e=>e.load);if((0,M.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?w.success(r(`models.kindUnboundToast`,{kind:l(n),model:e})):c&&c!==e?w.success(r(`models.kindRebindToast`,{kind:l(n),from:c,to:e})):w.success(r(`models.kindBoundToast`,{kind:l(n),model:e})))};return(0,N.jsxs)(`div`,{className:O(`flex flex-wrap items-center gap-1.5 text-xs`,n),children:[(0,N.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,N.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:O(`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 I=46,L=140,pe=22,me=216,R=[{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`}],he={fill:`fill-dark-tertiary`,dot:`bg-dark-tertiary`},z={fill:`fill-dark-muted`,dot:`bg-dark-muted`},B={fill:`fill-accent-blue`,dot:`bg-accent-blue`};function V({points:e,showValueLabels:t=!1,showTokenLabels:n=!1}){let{t:r}=ee(),[i,a]=(0,M.useState)(null),o=(0,M.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,M.useMemo)(()=>{let e=new Map;return o.slice(0,R.length).forEach((t,n)=>{let r=R[n];r&&e.set(t,r)}),t=>{let n=t.models??[];if(n.length===0)return[{key:z.fill,label:r(`insights.chartModelUnknown`),tokens:t.totalTokens,costDollars:t.costDollars,requests:t.requests,color:z}];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:he},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:z}),i.sort((e,t)=>t.tokens-e.tokens)}},[o,r]);if(e.length===0)return(0,N.jsx)(`div`,{className:`flex h-32 items-center justify-center text-xs text-dark-muted`,children:r(`insights.noUsageData`)});let l=+!!n+ +!!t,u=L-(l===0?16:l===1?20:28)-pe,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*I,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*I+I/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,b=v>=0?v*I+I/2:0,x=Math.max(0,Math.min(b-me/2,Math.max(0,p-me))),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),D=(0,M.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,N.jsxs)(`div`,{className:`overflow-x-auto`,children:[(0,N.jsxs)(`div`,{className:`relative`,style:{width:p},children:[(0,N.jsxs)(`svg`,{width:p,height:L,role:`img`,"aria-label":r(`insights.usageTrend`),children:[e.map((e,r)=>{let o=r*I+I/2,l=m(e.totalTokens),u=e.day===i,d=l>0?c(e):[],f=118;return(0,N.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,N.jsx)(`rect`,{x:r*I,y:0,width:I,height:119,style:{fill:u&&l>0?`currentColor`:`transparent`,opacity:u&&l>0?.06:0,pointerEvents:l>0?`all`:`none`}}),(0,N.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,N.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:B.fill,fillOpacity:s?.85:.7},t.key)}),n&&e.totalTokens>0&&(0,N.jsx)(`text`,{"data-testid":`daily-tokens`,x:o,y:118-l-4,textAnchor:`middle`,className:`fill-dark-text`,style:{fontSize:9},children:j(e.totalTokens)}),t&&e.totalTokens>0&&(0,N.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?A(e.costDollars):`—`}),(0,N.jsx)(`text`,{x:o,y:131,textAnchor:`middle`,className:O(`fill-dark-muted`,u&&`fill-dark-text`),style:{fontSize:9},children:e.day.slice(5)})]},e.day)}),g.length>0&&(0,N.jsx)(`path`,{d:g.join(` `),fill:`none`,className:`stroke-accent-green`,strokeWidth:1.6,strokeLinejoin:`round`,strokeLinecap:`round`})]}),y&&y.totalTokens>0&&(0,N.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:x,width:me},children:[(0,N.jsxs)(`div`,{className:`mb-1 flex items-center justify-between gap-2`,children:[(0,N.jsx)(`span`,{className:`font-medium text-dark-text`,children:y.day}),(0,N.jsxs)(`span`,{className:`tabular-nums text-dark-muted`,children:[y.requests,`×`]})]}),(0,N.jsxs)(`div`,{className:`space-y-0.5`,children:[C.map(e=>(0,N.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,N.jsx)(`span`,{className:O(`inline-block h-2 w-2 shrink-0 rounded-sm`,e.color.dot)}),(0,N.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-dark-muted`,title:e.label,children:e.label}),(0,N.jsx)(`span`,{className:`shrink-0 tabular-nums text-dark-text`,children:j(e.tokens)}),(0,N.jsx)(`span`,{className:`w-14 shrink-0 text-end tabular-nums text-accent-yellow`,children:y.priced?A(e.costDollars):`—`})]},e.key)),T>0&&(0,N.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,N.jsx)(`span`,{className:`inline-block h-2 w-2 shrink-0 rounded-sm bg-dark-tertiary`}),(0,N.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-dark-muted`,children:`${r(`insights.chartModelRest`)} +${w.length}`}),(0,N.jsx)(`span`,{className:`shrink-0 tabular-nums text-dark-text`,children:j(T)}),(0,N.jsx)(`span`,{className:`w-14 shrink-0 text-end tabular-nums text-accent-yellow`,children:y.priced?A(E):`—`})]})]}),(0,N.jsxs)(`div`,{className:`mt-1 flex items-center justify-between gap-2 border-t border-dark-border/60 pt-1`,children:[(0,N.jsx)(`span`,{className:`text-dark-muted`,children:r(`insights.hoverTotal`)}),(0,N.jsxs)(`span`,{className:`tabular-nums text-dark-text`,children:[j(y.totalTokens),(0,N.jsx)(`span`,{className:`mx-1 opacity-50`,children:`·`}),y.priced?A(y.costDollars):r(`insights.costUnknown`)]})]})]})]}),(0,N.jsxs)(`div`,{className:`mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-badge text-dark-muted`,children:[s?D.map(e=>(0,N.jsxs)(`span`,{className:`flex items-center gap-1`,title:e.label,children:[(0,N.jsx)(`span`,{className:O(`inline-block h-2 w-2 rounded-sm`,e.color.dot)}),(0,N.jsx)(`span`,{className:`max-w-[9rem] truncate`,children:e.label}),(0,N.jsx)(`span`,{className:`tabular-nums text-dark-tertiary`,children:j(e.tokens)})]},e.key)):(0,N.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,N.jsx)(`span`,{className:`inline-block h-2 w-2 rounded-sm bg-accent-blue/70`}),r(`insights.legendTokens`)]}),(0,N.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,N.jsx)(`span`,{className:`inline-block h-0.5 w-3 bg-accent-green`}),r(`insights.legendCost`)]})]})]})}var H=8;function U(e){let t=new Date(e);if(Number.isNaN(t.getTime()))return`—`;let n=e=>String(e).padStart(2,`0`);return`${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}:${n(t.getSeconds())}`}function ge(e){return e.length>10?`${e.slice(0,8)}…`:e}var W=`grid grid-cols-[6.5rem_minmax(0,1fr)_7rem_4rem_4rem_4rem_5rem] items-center gap-2`;function _e({history:e,totalRequests:t,className:n}){let{t:r}=ee(),i=C(e=>e.activeSessionId??``),a=C(e=>e.sessions),o=C(e=>e.historySessions),[s,c]=(0,M.useState)(`all`),u=se(e=>e.usageDetailPending);(0,M.useEffect)(()=>{u&&i&&se.getState().consumeUsageDetail()&&c(`session`)},[u,i]);let[d,f]=(0,M.useState)(null),[p,m]=(0,M.useState)(void 0),[h,g]=(0,M.useState)(!1),[_,v]=(0,M.useState)(null),[y,b]=(0,M.useState)(!1),[x,S]=(0,M.useState)(null);(0,M.useEffect)(()=>{if(s!==`session`||!i)return;let e=!1;return g(!0),v(null),(async()=>{try{let t=await D.observability.costs(i);if(e)return;t.success&&t.data?(f(t.data.history??[]),m(t.data.byModel?.reduce((e,t)=>e+(t.requestCount??0),0))):v(t.error||r(`models.usageRequestsLoadFailed`))}catch(t){e||v(t instanceof Error?t.message:r(`models.usageRequestsLoadFailed`))}finally{e||g(!1)}})(),()=>{e=!0}},[s,i,e,r]);let w=(0,M.useMemo)(()=>{let e=new Map;for(let t of o)e.set(t.id,t.title);for(let t of a)e.has(t.id)||e.set(t.id,t.title);return e},[a,o]),T=s===`session`?d??[]:e,E=s===`session`?p:t,te=y?T:T.slice(0,H),ne=e=>e?w.get(e)??ge(e):r(`models.usageDetailNoSession`),k=(e,t,n)=>(0,N.jsx)(`span`,{className:O(`truncate text-end tabular-nums text-xs`,n??`text-dark-text`),title:t,children:e});return(0,N.jsxs)(`div`,{className:O(`border-t border-dark-border/60 pt-2`,n),"data-testid":`usage-requests`,children:[(0,N.jsxs)(`div`,{className:`mb-1 flex flex-wrap items-center justify-between gap-2`,children:[(0,N.jsxs)(`span`,{className:`inline-flex items-center gap-1 text-badge text-dark-muted`,children:[(0,N.jsx)(l,{size:11,className:`shrink-0`}),r(`models.usageRequestsTitle`)]}),(0,N.jsx)(`div`,{className:`inline-flex overflow-hidden rounded border border-dark-border`,role:`group`,children:[`all`,`session`].map(e=>{let t=e===`session`&&!i;return(0,N.jsx)(`button`,{type:`button`,onClick:()=>c(e),disabled:t,"aria-pressed":s===e,title:t?r(`models.usageRequestsNoSession`):void 0,"data-testid":`usage-requests-scope-${e}`,className:O(`px-2 py-0.5 text-xs transition-colors disabled:opacity-40`,s===e?`bg-dark-hover text-dark-text`:`text-dark-muted hover:text-dark-text`),children:r(e===`all`?`models.usageRequestsAll`:`models.usageRequestsSession`)},e)})})]}),_&&(0,N.jsx)(`div`,{className:`py-1 text-xs text-accent-red`,children:_}),!_&&(0,N.jsx)(N.Fragment,{children:T.length===0?(0,N.jsx)(`div`,{className:`py-3 text-center text-xs text-dark-muted`,children:r(h?`common.loading`:`models.usageRequestsEmpty`)}):(0,N.jsxs)(N.Fragment,{children:[(0,N.jsxs)(`div`,{className:O(W,`border-b border-dark-border/60 pb-1 text-badge text-dark-muted`),children:[(0,N.jsx)(`span`,{children:r(`models.usageColTime`)}),(0,N.jsx)(`span`,{children:r(`models.usageColModel`)}),(0,N.jsx)(`span`,{children:r(`models.usageColSession`)}),(0,N.jsx)(`span`,{className:`text-end`,children:r(`models.usageColInput`)}),(0,N.jsx)(`span`,{className:`text-end`,children:r(`models.usageColOutput`)}),(0,N.jsx)(`span`,{className:`text-end`,children:r(`models.usageColCache`)}),(0,N.jsx)(`span`,{className:`text-end`,children:r(`models.usageColCost`)})]}),(0,N.jsx)(`div`,{className:`divide-y divide-dark-border/40`,children:te.map((e,t)=>(0,N.jsxs)(`button`,{type:`button`,onClick:()=>S(e),title:r(`models.usageRequestsOpenDetail`),"data-testid":`usage-requests-row`,className:O(W,`w-full py-1 text-start transition-colors hover:bg-dark-hover`),children:[k(U(e.timestamp),e.timestamp,`text-dark-tertiary`),(0,N.jsx)(`span`,{className:`truncate text-xs text-dark-text`,title:e.modelId,children:e.modelId}),(0,N.jsx)(`span`,{className:`truncate text-xs text-dark-muted`,title:e.sessionId,children:ne(e.sessionId)}),k(j(e.inputTokens)),k(j(e.outputTokens)),k(e.cacheReadTokens===void 0?`—`:j(e.cacheReadTokens),void 0,`text-dark-muted`),k(A(e.costDollars),void 0,`text-accent-yellow`)]},`${e.timestamp}-${e.modelId}-${t}`))}),(0,N.jsxs)(`div`,{className:`mt-1 flex flex-wrap items-center justify-between gap-2 text-badge text-dark-muted`,children:[(0,N.jsx)(`span`,{className:`tabular-nums`,children:E!==void 0&&E>T.length?r(`models.usageRequestsWindow`,{count:T.length,total:E}):r(`models.usageRequestsCount`,{count:T.length})}),T.length>H&&(0,N.jsx)(`button`,{type:`button`,onClick:()=>b(e=>!e),"data-testid":`usage-requests-toggle-all`,className:`rounded border border-dark-border px-2 py-0.5 hover:text-dark-text`,children:y?r(`common.collapse`):r(`models.usageRequestsShowAll`,{count:T.length})})]})]})}),(0,N.jsx)(re,{isOpen:x!==null,onClose:()=>S(null),title:r(`models.usageDetailTitle`),size:`sm`,children:x&&(0,N.jsxs)(`div`,{className:`space-y-2 p-3`,"data-testid":`usage-requests-detail`,children:[(0,N.jsx)(G,{label:r(`models.usageDetailTime`),value:U(x.timestamp),mono:!0}),(0,N.jsx)(G,{label:r(`models.usageDetailModel`),value:x.modelId,mono:!0}),(0,N.jsx)(G,{label:r(`models.usageDetailProvider`),value:x.provider??`—`,mono:!0}),(0,N.jsx)(G,{label:r(`models.usageDetailSession`),value:ne(x.sessionId)}),(0,N.jsx)(G,{label:r(`models.usageDetailInput`),value:j(x.inputTokens),mono:!0}),(0,N.jsx)(G,{label:r(`models.usageDetailOutput`),value:j(x.outputTokens),mono:!0}),(0,N.jsx)(G,{label:r(`models.usageDetailTotal`),value:j(x.totalTokens??x.inputTokens+x.outputTokens),mono:!0}),(0,N.jsx)(G,{label:r(`models.usageDetailCacheRead`),value:x.cacheReadTokens===void 0?`—`:`${j(x.cacheReadTokens)} · ${ce(x.cacheReadTokens,x.inputTokens,0)}`,mono:!0}),(0,N.jsx)(G,{label:r(`models.usageDetailCacheWrite`),value:x.cacheWriteTokens===void 0?`—`:j(x.cacheWriteTokens),mono:!0}),(0,N.jsx)(G,{label:r(`models.usageDetailCost`),value:A(x.costDollars),mono:!0,strong:!0}),(0,N.jsx)(`div`,{className:`pt-1 text-badge text-dark-tertiary`,children:r(`models.usageDetailCostHint`)})]})})]})}function G({label:e,value:t,mono:n,strong:r}){return(0,N.jsxs)(`div`,{className:`flex items-baseline justify-between gap-3`,children:[(0,N.jsx)(`span`,{className:`shrink-0 text-xs text-dark-muted`,children:e}),(0,N.jsx)(`span`,{className:O(`min-w-0 truncate text-end text-xs`,n&&`font-mono tabular-nums`,r?`text-accent-yellow`:`text-dark-text`),title:t,children:t})]})}var ve=14,K=`dsc.models.usageCollapsed`;function ye(){try{return window.localStorage.getItem(K)===`1`}catch{return!1}}function be(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function xe(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 Se(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:xe(t.models)}}function Ce({className:e}){let{t}=ee(),[r,i]=(0,M.useState)(null),[o,s]=(0,M.useState)(!1),[c,l]=(0,M.useState)(null),[u,d]=(0,M.useState)(0),[f,p]=(0,M.useState)(ye),[m,g]=(0,M.useState)(!1),[_,v]=(0,M.useState)(!1);(0,M.useEffect)(()=>{if(!m)return;let e=window.setTimeout(()=>g(!1),4e3);return()=>window.clearTimeout(e)},[m]);let b=()=>{p(e=>{let t=!e;try{window.localStorage.setItem(K,t?`1`:`0`)}catch{}return t})};(0,M.useEffect)(()=>{let e=()=>d(e=>e+1);return window.addEventListener(`models-updated`,e),()=>window.removeEventListener(`models-updated`,e)},[]),(0,M.useEffect)(()=>{let e=!1;return s(!0),l(null),(async()=>{try{let n=await D.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 x=async()=>{if(!m)g(!0);else{g(!1),v(!0),l(null);try{let e=await D.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{v(!1)}}},S=(0,M.useMemo)(()=>{let e=new Map;for(let t of r?.daily??[]){let n=Se(t);n&&e.set(n.day,n)}let t=[],n=new Date;for(let r=13;r>=0;r--){let i=be(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,M.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,M.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]),T=!!(r&&(r.totalCostDollars>0||C.tokens>0||(r.byModel?.length??0)>0));return(0,N.jsxs)(`div`,{className:O(`rounded-lg border border-dark-border bg-dark-surface/40 p-3`,e),children:[(0,N.jsxs)(`div`,{className:`mb-2 flex items-center justify-between gap-2`,children:[(0,N.jsxs)(`button`,{type:`button`,onClick:b,"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,N.jsx)(a,{size:14,className:`shrink-0 text-dark-muted`}):(0,N.jsx)(n,{size:14,className:`shrink-0 text-dark-muted`}),(0,N.jsx)(`span`,{className:`truncate`,children:t(`models.usageTitle`)})]}),(0,N.jsxs)(`div`,{className:`flex items-center gap-2`,children:[f&&T&&(0,N.jsxs)(`span`,{className:`text-badge tabular-nums text-dark-muted`,children:[A(r.totalCostDollars),(0,N.jsx)(`span`,{className:`mx-1 opacity-60`,children:`·`}),j(C.tokens)]}),(0,N.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,N.jsx)(h,{size:11,className:o?`animate-spin`:void 0}),t(`models.usageRefresh`)]}),(0,N.jsxs)(`button`,{type:`button`,onClick:x,disabled:_||o,className:O(`inline-flex items-center gap-1 rounded border px-2 py-0.5 text-xs disabled:opacity-50`,m?`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,N.jsx)(y,{size:11,className:_?`animate-pulse`:void 0}),t(m?`models.usageResetConfirm`:_?`models.usageResetting`:`models.usageReset`)]})]})]}),c&&(0,N.jsx)(`div`,{className:`text-xs text-accent-red`,children:c}),!c&&!T&&!o&&(0,N.jsx)(`div`,{className:`py-6 text-center text-xs text-dark-muted`,children:t(`models.usageEmpty`)}),T&&!f&&(0,N.jsxs)(N.Fragment,{children:[(0,N.jsxs)(`div`,{className:`mb-3 grid grid-cols-2 gap-2 sm:grid-cols-4`,children:[(0,N.jsx)(q,{label:t(`models.usageTotalCost`),value:A(r.totalCostDollars),tone:`cost`}),(0,N.jsx)(q,{label:t(`models.usageWindowTokens`,{days:ve}),value:j(C.tokens)}),(0,N.jsx)(q,{label:t(`models.usageWindowRequests`,{days:ve}),value:String(C.requests)}),(0,N.jsx)(q,{label:t(`models.usageCacheHitRate`),value:ce(C.cacheReadTokens,C.inputTokens,0)})]}),(0,N.jsx)(`div`,{className:`mb-1 flex items-baseline justify-between`,children:(0,N.jsx)(`span`,{className:`text-badge text-dark-muted`,children:t(`models.usageDailyTitle`)})}),(0,N.jsx)(V,{points:S,showValueLabels:!0,showTokenLabels:!0}),w.rows.length>0&&(0,N.jsxs)(`div`,{className:`mt-3 border-t border-dark-border/60 pt-2`,children:[(0,N.jsx)(`div`,{className:`mb-1 text-badge text-dark-muted`,children:t(`models.usageTopModels`)}),(0,N.jsx)(`div`,{className:`space-y-1`,children:w.rows.map(e=>(0,N.jsxs)(`div`,{className:`flex items-center gap-2 text-xs`,children:[(0,N.jsx)(`span`,{className:`w-40 shrink-0 truncate text-dark-text max-md:w-20`,title:e.modelId,children:e.modelId}),(0,N.jsx)(`div`,{className:`h-2 flex-1 overflow-hidden rounded-full bg-dark-border/40`,children:(0,N.jsx)(`div`,{className:`h-full rounded-full bg-accent-purple/70`,style:{width:`${Math.max(1,e.totalCostDollars/w.maxCost*100)}%`}})}),(0,N.jsx)(`span`,{className:`w-20 shrink-0 text-end tabular-nums text-accent-yellow`,children:A(e.totalCostDollars)}),(0,N.jsx)(`span`,{className:`w-20 shrink-0 text-end tabular-nums text-dark-muted`,children:j(e.totalInputTokens+e.totalOutputTokens)}),(0,N.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,N.jsx)(`div`,{className:`mt-2 text-badge text-accent-yellow`,children:t(`models.usageCostUnknownHint`)}),(0,N.jsx)(_e,{history:r.history??[],totalRequests:r.totals?.requests,className:`mt-3`})]})]})}function q({label:e,value:t,tone:n}){return(0,N.jsxs)(`div`,{className:`rounded border border-dark-border/60 bg-dark-bg px-2 py-1.5`,children:[(0,N.jsx)(`div`,{className:`text-badge text-dark-muted truncate`,children:e}),(0,N.jsx)(`div`,{className:O(`text-sm font-semibold tabular-nums`,n===`cost`?`text-accent-yellow`:`text-dark-text`),children:t})]})}function we(){let[e,t]=(0,M.useState)([]),[n,r]=(0,M.useState)(`1.0`),[i,a]=(0,M.useState)(!0),[o,s]=(0,M.useState)(!0),[c,l]=(0,M.useState)(null),u=(0,M.useCallback)(async()=>{s(!0),l(null);try{let e=await D.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,M.useEffect)(()=>{u()},[u]),{presets:e,loading:o,error:c,version:n,customSupported:i,reload:u}}var Te=[{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 Ee(e){let t=Number((e??``).trim());return Number.isFinite(t)&&t>0?Math.floor(t):null}var De={providerKey:``,apiKeys:[],modelIds:``,baseUrl:``,apiType:``,fullPath:!1,imageUseCustom:!1,imageEndpoint:``,imageModel:``,imageApiKey:``,setDefault:!1,modelOverrides:{}},Oe=E,ke={"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 Ae(e){return e.trim().split(`|`)[0].trim()}function je(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 Me(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 Ne={"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 Pe(){let{presets:e,loading:n,reload:a}=we(),{t:l}=ee(),[m,C]=oe(),[E,te]=(0,M.useState)([]),[O,re]=(0,M.useState)(null),[k,se]=(0,M.useState)(!0),ce=(0,M.useRef)(!1),[A,j]=(0,M.useState)(null),[P,ue]=(0,M.useState)(null),[F,I]=(0,M.useState)(null),[L,pe]=(0,M.useState)([]),[me,R]=(0,M.useState)(!1),[he,z]=(0,M.useState)(`select`),[B,V]=(0,M.useState)(null),[H,U]=(0,M.useState)(De),[ge,W]=(0,M.useState)(``),[_e,G]=(0,M.useState)(!1),[ve,K]=(0,M.useState)(null),[ye,be]=(0,M.useState)(!1),[xe,Se]=(0,M.useState)(!1),[q,Pe]=(0,M.useState)(``),[Ie,Le]=(0,M.useState)(!1),[Y,Re]=(0,M.useState)([]),[ze,X]=(0,M.useState)(new Set),[Be,Ve]=(0,M.useState)(null),[He,Ue]=(0,M.useState)(``),[We,Ge]=(0,M.useState)(!1),[Ke,qe]=(0,M.useState)(!1),[Je,Ye]=(0,M.useState)(null),Xe=(0,M.useMemo)(()=>{let e=He.trim().toLowerCase();return e?Y.filter(t=>t.id.toLowerCase().includes(e)||t.name.toLowerCase().includes(e)):Y},[Y,He]),Ze=(0,M.useCallback)(async()=>{try{let e=await D.config.provider.get();e.success&&e.data&&(I(e.data),pe(Array.isArray(e.data.entries)?e.data.entries:[]))}catch{}},[]),Z=(0,M.useCallback)(async()=>{let e=!ce.current;e&&se(!0),j(null);try{let[e,t]=await Promise.all([D.models.list(),D.system.status()]);if(await Ze(),e.success&&e.data&&Array.isArray(e.data.models)&&te(e.data.models),t.success&&t.data){let e=t.data.models||{total:0,online:0,offline:0};re({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})}ce.current=!0}catch{e&&j(l(`models.loadFailed`))}finally{e&&se(!1)}},[Ze,l]);(0,M.useEffect)(()=>{Z()},[Z]),(0,M.useEffect)(()=>{let e=()=>{Z(),Ze()};return window.addEventListener(`models-updated`,e),()=>window.removeEventListener(`models-updated`,e)},[Z,Ze]);let Qe=(0,M.useCallback)(e=>`${e.provider}:${e.id}`,[]),Q=(0,M.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,M.useMemo)(()=>[...Q].sort((e,t)=>{if(e.isCustom)return-1;if(t.isCustom)return 1;let n=Ne[e.key],r=Ne[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,M.useMemo)(()=>{let e=q.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,q]),tt=(0,M.useMemo)(()=>{let e=F?.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`}},[F,Q]),$=B===`custom`?H.providerKey.trim():B||``,nt=(0,M.useMemo)(()=>$?E.filter(e=>e.provider===$):[],[E,$]),rt=(0,M.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 L)e.has(t.key)||e.set(t.key,[]);let t=[...e.keys()];return t.sort((e,t)=>{let n=Ne[e],r=Ne[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,L]),it=(0,M.useCallback)(e=>{let t=F?.providers?.[e.key],n=L.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;V(e.key),W(``),U({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:F?.defaultProvider!==e.key,modelOverrides:Me(n)}),z(`form`),R(!0),K(null),be(!1),Re([]),X(new Set),Ve(null),Ue(``)},[E,F,L]),at=(0,M.useCallback)(e=>{let t=F?.providers?.[e],n=L.find(t=>t.key===e),r=E.filter(t=>t.provider===e).map(e=>e.id).join(`, `);V(`custom`),W(e),U({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:F?.defaultProvider!==e,modelOverrides:Me(n)}),K(null),be(!1),Re([]),X(new Set),Ve(null),Ue(``)},[F,E,L]),ot=(0,M.useCallback)(()=>{V(`custom`),W(``),U({providerKey:``,apiKeys:[``],modelIds:``,baseUrl:``,apiType:``,fullPath:!1,imageUseCustom:!1,imageEndpoint:``,imageModel:``,imageApiKey:``,setDefault:!F?.configured,modelOverrides:{}}),z(`form`),R(!0),K(null),be(!1),Re([]),X(new Set),Ve(null),Ue(``)},[F]),st=(0,M.useCallback)(async()=>{let e=H.baseUrl;if(!e){Ve(l(`models.baseUrlRequired`));return}Le(!0),Ve(null),Re([]),X(new Set);let t=Q.find(e=>e.key===B)||null,n=!!t&&!t.isCustom&&(H.baseUrl||``)===t.baseUrl&&H.fullPath!==!0;try{let r=(H.apiKeys||[]).map(e=>e.trim()).filter(Boolean)[0]||``,i=r.replace(/[^\x00-\xFF]/g,``);i!==r&&w.warning(l(`models.apiKeySanitized`));let a=await D.models.fetch(e,i,H.fullPath===!0,n?t.key:void 0);if(a.success&&a.data?.models){let e=a.data.models;Re(e),Ge(!0);let t={};for(let n of e)n.protocol&&n.protocol!==H.apiType&&(t[n.id]={apiType:n.protocol});Object.keys(t).length>0&&U(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=H.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(X(new Set(i.map(e=>e.split(`|`)[0].trim()))),o.length>0){let e=o.map(e=>e.split(`|`)[0].trim());U(e=>({...e,modelIds:i.join(`, `)})),w.warning(l(`models.autoRemovedMissingModels`,{models:e.join(`, `)}))}w.success(l(`models.fetchedCount`,{n:e.length}))}else Ve(a.error||l(`models.fetchFailed`))}catch(e){Ve(e instanceof Error?e.message:l(`models.requestFailed`))}finally{Le(!1)}},[H.baseUrl,H.apiKeys,H.modelIds,H.apiType,H.fullPath,B,Q,l]),ct=(0,M.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:l(`models.${t}Label`),label:l(`models.${t}${i}`),hint:r===`supported`?``:l(`models.${t}Hint${i}`)}},[l]),lt=(0,M.useCallback)(async()=>{let e=H.baseUrl;if(!e){Ye({ok:!1,message:l(`models.baseUrlRequired`)});return}let t=Ae((H.modelIds||``).split(`,`)[0]||``);qe(!0),Ye(null);try{let n=(H.apiKeys||[]).map(e=>e.trim()).filter(Boolean)[0]||``,r=n.replace(/[^\x00-\xFF]/g,``);r!==n&&w.warning(l(`models.apiKeySanitized`));let i=await D.providers.testConnection(e,r,t);if(i.success&&i.data?.reachable){let e=i.data,t={};e.resolvedBaseUrl&&e.resolvedBaseUrl!==H.baseUrl&&(t.baseUrl=e.resolvedBaseUrl),e.detectedApiType&&H.apiType===``&&(t.apiType=e.detectedApiType),Object.keys(t).length>0&&U(e=>({...e,...t}));let n=[];t.baseUrl&&n.push(l(`models.baseUrlAutoCompleted`,{url:t.baseUrl})),t.apiType&&n.push(l(`models.apiTypeAutoSelected`,{type:ke[t.apiType]}));let r=e.message||l(`models.connectionSuccess`),a=[ct(`tools`,`toolProbe`,e.tools?.verdict),ct(`jsonMode`,`jsonProbe`,e.jsonMode?.verdict)].filter(e=>e!==void 0);Ye({ok:!0,message:n.length>0?l(`models.connectionSuccessWithHints`,{message:r,hints:n.join(l(`models.hintJoiner`))}):r,probes:a})}else Ye({ok:!1,message:i.data?.message||i.error||l(`models.connectionFailed`)})}catch(e){Ye({ok:!1,message:e instanceof Error?e.message:l(`models.requestFailed`)})}finally{qe(!1)}},[H.baseUrl,H.apiKeys,H.apiType,H.modelIds,ct,l]),ut=(0,M.useCallback)(e=>{let t=new Set(ze);t.has(e)?t.delete(e):t.add(e),X(t),U(e=>({...e,modelIds:Array.from(t).join(`, `)}))},[ze]),dt=(0,M.useCallback)(e=>{let t=H.modelIds.split(`,`).map(e=>e.trim()).filter(Boolean),n=t.some(t=>Ae(t)===e.id)?t.filter(t=>Ae(t)!==e.id):[...t,e.name&&e.name!==e.id?`${e.id}|${e.name}`:e.id];U(e=>({...e,modelIds:n.join(`, `)}));let r=new Set(Y.map(e=>e.id));X(new Set(n.map(Ae).filter(e=>r.has(e))))},[H.modelIds,Y]),[ft,pt]=(0,M.useState)(!1),[mt,ht]=(0,M.useState)(``),[gt,_t]=(0,M.useState)([]),[vt,yt]=(0,M.useState)(!1),[bt,xt]=(0,M.useState)(null),[St,Ct]=(0,M.useState)(!1),[wt,Tt]=(0,M.useState)(!0),Et=(0,M.useCallback)(()=>{ht(``),_t([]),xt(null),pt(!0),Dt(``,{reason:!1,tool:!0})},[]),Dt=(0,M.useCallback)(async(e,t)=>{yt(!0),xt(null);try{let n=await D.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||l(`models.catalogSearchFailed`)),_t([]))}catch(e){xt(e instanceof Error?e.message:l(`models.requestFailed`)),_t([])}finally{yt(!1)}},[l]),Ot=(0,M.useCallback)(e=>{U(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}}),w.success(l(`models.addedModel`,{id:e.model.id}))},[l]),[kt,At]=(0,M.useState)(null),jt=(0,M.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 D.models.toggle(t,n);if(e.success){await Z();return}let r=e.error||``;a(r)?w.error(l(`models.defaultModelDisableBlocked`,{name:i})):w.error(r||l(`models.operationFailed`))}catch(e){let t=e instanceof Error?e.message:``;a(t)?w.error(l(`models.defaultModelDisableBlocked`,{name:i})):w.error(t||l(`models.operationFailed`))}},Nt=async e=>{let t=Qe(e);ue(t);try{await D.models.test(e.id),await Z()}finally{ue(null)}},Pt=async(e,t)=>{if(await C({message:l(`models.deleteModelConfirm`,{id:t}),variant:`danger`}))try{(await D.models.delete(e,t)).success&&await Z()}catch{}},Ft=(0,M.useCallback)(e=>{let t=L.find(t=>t.key===e),n=Q.find(t=>t.key===e),r=!n||n.isCustom,i=F?.providers?.[e];V(r?`custom`:e),W(r?e:``),U({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:F?.defaultProvider!==e,modelOverrides:Me(t)}),z(`form`),R(!0),K(null),be(!1),Re([]),X(new Set),Ve(null),Ue(``)},[L,Q,F]),It=e=>{Ft(e.provider)},Lt=async()=>{let e=Q.find(e=>e.key===B)||null,t=B===`custom`?H.providerKey.trim():e?.key||``;if(!t){K(l(`models.providerNameRequired`));return}let n=(H.apiKeys||[]).map(e=>e.trim()).filter(Boolean),r=!!F?.providers?.[t]?.hasApiKey;if(n.length===0&&!r){K(l(`models.apiKeyRequired`));return}if(H.imageUseCustom===!0&&!H.imageEndpoint.trim()){K(l(`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=Y.length>0?new Set(Y.map(e=>e.id)):null,s=(H.modelIds||i.defaultModel||``).split(`,`).map(e=>e.trim()).filter(Boolean),c=o?s.filter(e=>o.has(e.split(`|`)[0].trim())):s,u=o?s.filter(e=>!o.has(e.split(`|`)[0].trim())):[];u.length>0&&w.warning(l(`models.autoSkippedMissingModels`,{models:u.map(e=>e.split(`|`)[0].trim()).join(`, `)}));let d=c.map(Ae).filter(Boolean),f=new Set;for(let e of E)e.provider!==t||d.includes(e.id)||(e.isGlobalDefault&&f.add(`global`),e.isGoalDefault&&f.add(`goal`));let p={provider:t,name:t,baseUrl:H.baseUrl||i.baseUrl,fullPath:H.fullPath===!0,apiType:H.apiType||je(H.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=H.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:Ee(a?.maxInput),maxTokens:Ee(a?.maxOutput)}}).filter(e=>e.id.length>0)};a.length>0&&(p.apiKeys=a);let m=H.imageUseCustom===!0;if(p.imageEndpoint=m?H.imageEndpoint.trim():``,p.imageModel=m?H.imageModel.trim():``,m){let e=H.imageApiKey.replace(/[^\x00-\xFF]/g,``).trim();e&&(p.imageApiKey=e)}(!F?.configured||H.setDefault)&&(p.setDefault=!0),G(!0),K(null);try{let e=await D.config.provider.save(p);if(e.success){if(f.size>0){let e=d[0]||``,n={};if(e){let r=`${t}:${e}`;for(let e of f)n[e]=r}else{let e=E.find(e=>e.provider!==t);for(let t of f)t===`goal`?n[t]=null:e&&(n[t]=`${e.provider}:${e.id}`)}Object.keys(n).length>0&&(await D.models.setDefaults(n)).success&&w.success(l(`models.defaultsAutoUpdated`))}R(!1),z(`select`),V(null),W(``),await Ze(),await Z()}else K(e.error||l(`models.saveFailed`))}catch(e){K(e instanceof Error?e.message:l(`models.unknownError`))}finally{G(!1)}},Rt=async e=>{if(await C({message:l(`models.removeConfirm`,{providerKey:e}),variant:`danger`}))try{await D.config.provider.delete(e),await Ze(),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,N.jsx)(u,{size:14});case`offline`:return(0,N.jsx)(_,{size:14});case`error`:return(0,N.jsx)(p,{size:14});default:return(0,N.jsx)(_,{size:14})}},Vt=(0,M.useMemo)(()=>Q.find(e=>e.key===B)||null,[B,Q]);return k?(0,N.jsx)(`div`,{className:`h-64 overflow-y-auto p-4`,role:`status`,"aria-label":l(`models.loading`),children:(0,N.jsx)(ne,{count:4})}):A?(0,N.jsx)(`div`,{className:`flex h-64 items-center justify-center text-accent-red`,children:A}):(0,N.jsxs)(`div`,{className:`ui-page flex-1 min-h-0`,children:[m,(0,N.jsxs)(`div`,{className:`ui-page-inner space-y-6`,children:[(0,N.jsx)(Ce,{}),(0,N.jsxs)(`div`,{children:[(0,N.jsxs)(`div`,{className:`flex items-center justify-between mb-3`,children:[(0,N.jsx)(`h2`,{className:`text-base font-semibold`,children:l(`models.providerConfig`)}),(0,N.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,N.jsxs)(`button`,{onClick:async()=>{try{await D.providers.refresh(),w.success(l(`models.providerListRefreshed`)),Se(!0),await a(),setTimeout(()=>{a()},3e3)}catch{w.error(l(`models.refreshFailed`))}},className:`btn btn-secondary px-3 py-2 text-xs`,title:l(`models.refreshListTitle`),children:[(0,N.jsx)(h,{size:12}),l(`models.refreshList`)]}),(0,N.jsxs)(`button`,{onClick:()=>{xe&&Pe(``),Se(e=>!e)},className:`btn btn-accent px-3 py-2 text-xs`,children:[xe?(0,N.jsx)(r,{size:12}):(0,N.jsx)(d,{size:12}),l(xe?`models.collapse`:`models.addProvider`)]})]})]}),xe&&(0,N.jsxs)(`div`,{children:[(0,N.jsxs)(`div`,{className:`relative mb-3 max-w-md`,children:[(0,N.jsx)(c,{size:13,className:`absolute start-2.5 top-1/2 -translate-y-1/2 text-dark-muted`}),(0,N.jsx)(`input`,{value:q,onChange:e=>Pe(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:l(`models.providerSearchPlaceholder`)}),q&&(0,N.jsx)(`button`,{onClick:()=>Pe(``),className:`absolute end-2 top-1/2 -translate-y-1/2 text-dark-muted hover:text-dark-text`,title:l(`models.clear`),"aria-label":l(`models.clearSearch`),children:(0,N.jsx)(g,{size:13})})]}),(0,N.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,N.jsxs)(`div`,{className:`ui-card p-4`,"aria-hidden":`true`,children:[(0,N.jsx)(ie,{variant:`text`,width:`45%`,height:16,className:`mb-2`}),(0,N.jsx)(ie,{variant:`text`,width:`85%`,height:11,className:`mb-1.5`}),(0,N.jsx)(ie,{variant:`text`,width:`70%`,height:11,className:`mb-1.5`}),(0,N.jsx)(ie,{variant:`text`,width:`55%`,height:11})]},`preset-skeleton-${t}`)):et.length===0?(0,N.jsxs)(`div`,{className:`col-span-full border border-accent-red/30 bg-accent-red/10 rounded-lg p-4 text-center`,children:[(0,N.jsx)(`div`,{className:`text-sm text-accent-red font-medium mb-1`,children:l(`models.noMatchingProviders`)}),(0,N.jsx)(`div`,{className:`text-xs text-dark-muted mb-3`,children:l(`models.noMatchingProvidersHint`,{query:q})}),(0,N.jsxs)(`div`,{className:`flex items-center justify-center gap-2`,children:[(0,N.jsxs)(`button`,{onClick:()=>Pe(``),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,N.jsx)(g,{size:12}),l(`models.clearSearch`)]}),(0,N.jsx)(T,{variant:`accent`,size:`sm`,leftIcon:(0,N.jsx)(d,{size:12}),onClick:ot,children:l(`models.addCustomProvider`)})]})]}):et.map(e=>{let t=e.key===`custom`,n=t?tt:F?.providers?.[e.key],r=n?.hasApiKey,i=t?!!F?.defaultProvider&&(tt?.keys||[]).includes(F.defaultProvider):F?.defaultProvider===e.key;return(0,N.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,N.jsxs)(`div`,{onClick:()=>e.key===`custom`?ot():it(e),className:`cursor-pointer`,children:[(0,N.jsxs)(`div`,{className:`flex items-center justify-between mb-1`,children:[(0,N.jsx)(`span`,{className:`text-sm font-medium`,children:e.name}),r&&(0,N.jsx)(b,{size:14,className:`text-accent-green`})]}),(0,N.jsxs)(`div`,{className:`text-badge text-dark-muted space-y-0.5`,children:[(0,N.jsx)(`div`,{className:`truncate`,children:t?n?.baseUrl||l(`models.customBaseUrl`):e.baseUrl||l(`models.customBaseUrl`)}),(0,N.jsx)(`div`,{className:`truncate`,children:t&&tt?`${tt.keys.join(`, `)}`:e.defaultModel||l(`models.noDefaultModel`)}),(0,N.jsxs)(`div`,{children:[n?l(`models.configuredCount`,{n:n.modelCount}):l(`models.availableCount`,{n:e.models?.length||0}),e.models&&e.models.length>0&&!n&&(0,N.jsx)(`span`,{className:`text-accent-blue`,children:` ✓`})]})]}),i&&(0,N.jsx)(`div`,{className:`mt-1 text-badge text-accent-red`,children:l(`models.defaultProviderBadge`)})]}),r&&e.key!==`custom`&&(0,N.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:l(`models.deleteProvider`),"aria-label":l(`models.deleteProviderNamed`,{name:e.name}),children:(0,N.jsx)(y,{size:13})})]},e.key)})})]})]}),O&&(0,N.jsxs)(`div`,{className:`grid grid-cols-4 gap-4 max-md:grid-cols-2`,children:[(0,N.jsx)(Fe,{title:l(`models.overallStatus`),value:O.totalInstances===0?l(`models.notConfigured`):O.overallStatus===`healthy`?l(`models.healthy`):O.overallStatus===`degraded`?l(`models.degraded`):l(`models.abnormal`),color:O.totalInstances===0?`blue`:O.overallStatus===`healthy`?`green`:O.overallStatus===`degraded`?`yellow`:`red`}),(0,N.jsx)(Fe,{title:l(`models.healthRate`),value:O.totalInstances===0?`N/A`:`${(O.healthRate*100).toFixed(0)}%`,color:O.totalInstances===0?`blue`:O.healthRate>.8?`green`:O.healthRate>.5?`yellow`:`red`}),(0,N.jsx)(Fe,{title:l(`models.onlineInstances`),value:O.totalInstances===0?l(`models.none`):`${O.healthyInstances}/${O.totalInstances}`,color:O.healthyInstances>0?`green`:`red`}),(0,N.jsx)(Fe,{title:l(`models.totalRequests`),value:O.totalRequests>0?O.totalRequests.toLocaleString():`0`,color:`blue`})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsxs)(`div`,{className:`flex items-center justify-between mb-3`,children:[(0,N.jsx)(`h3`,{className:`text-sm font-medium`,children:l(`models.configuredModels`)}),(0,N.jsx)(`span`,{className:`text-badge text-dark-muted`,title:l(`models.actIsGlobalHint`),children:l(`models.actIsGlobalHint`)})]}),(0,N.jsxs)(`div`,{className:`space-y-4 max-h-[640px] overflow-y-auto custom-scrollbar pe-1`,children:[rt.map(e=>{let t=L.find(t=>t.key===e.provider),n=F?.providers?.[e.provider];return(0,N.jsxs)(`div`,{className:`rounded-lg border border-dark-border overflow-hidden`,children:[(0,N.jsxs)(`div`,{className:`flex items-center justify-between gap-2 px-3 py-2 bg-dark-bg border-b border-dark-border`,children:[(0,N.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0 flex-wrap`,children:[(0,N.jsx)(`span`,{className:`text-xs font-semibold whitespace-nowrap text-accent-purple max-md:whitespace-normal`,children:e.provider}),F?.defaultProvider===e.provider&&(0,N.jsx)(`span`,{className:`text-avatar px-1.5 py-0.5 rounded bg-accent-red/20 text-accent-red whitespace-nowrap`,children:l(`models.defaultShort`)}),(0,N.jsx)(`span`,{className:`text-badge text-dark-muted truncate`,children:n?.baseUrl||t?.baseUrl||``}),(0,N.jsx)(`span`,{className:`text-badge text-dark-muted whitespace-nowrap`,children:t?.apiType||n?.apiType||``}),n?.hasApiKey||t?.hasApiKey?(0,N.jsx)(`span`,{className:`text-avatar px-1.5 py-0.5 rounded bg-accent-green/20 text-accent-green whitespace-nowrap`,children:l(`models.hasKey`)}):(0,N.jsx)(`span`,{className:`text-avatar px-1.5 py-0.5 rounded bg-accent-red/20 text-accent-red whitespace-nowrap`,children:l(`models.noKey`)})]}),(0,N.jsxs)(`div`,{className:`flex items-center gap-1 shrink-0`,children:[(0,N.jsx)(`button`,{onClick:()=>Ft(e.provider),className:`p-1.5 rounded hover:bg-accent-blue/10 text-dark-muted hover:text-accent-blue`,title:l(`models.editProviderNamed`,{name:e.provider}),children:(0,N.jsx)(x,{size:13})}),(0,N.jsx)(`button`,{onClick:()=>Rt(e.provider),className:`p-1.5 rounded hover:bg-accent-red/10 text-dark-muted hover:text-accent-red`,title:l(`models.deleteProviderNamed`,{name:e.provider}),children:(0,N.jsx)(y,{size:13})})]})]}),(0,N.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,N.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,N.jsxs)(`div`,{className:`flex items-start justify-between gap-4 max-md:flex-col max-md:gap-2`,children:[(0,N.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,N.jsxs)(`div`,{className:`flex items-center gap-2 mb-1 flex-wrap`,children:[(0,N.jsx)(`span`,{className:zt(n.status),children:Bt(n.status)}),(0,N.jsx)(`span`,{className:`font-medium text-sm text-accent-blue`,children:n.name}),(0,N.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,N.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:ke[n.apiType]||n.apiType}),i&&(0,N.jsx)(`span`,{className:`text-avatar px-1 py-0.5 rounded bg-accent-yellow/20 text-accent-yellow font-medium`,title:l(`models.overrideTitle`),children:l(`models.overrideBadge`)}),n.isGlobalDefault&&(0,N.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 rounded bg-accent-red/20 text-accent-red font-medium`,title:l(`models.globalDefaultUnsettable`),children:l(`chat.globalDefault`)}),n.isActDefault&&!n.isGlobalDefault&&(0,N.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 rounded bg-accent-yellow/20 text-accent-yellow font-medium`,children:l(`chat.actDefault`)}),n.isGoalDefault&&(0,N.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 rounded bg-accent-purple/20 text-accent-purple font-medium`,children:l(`chat.goalDefault`)})]}),(0,N.jsxs)(`div`,{className:`grid grid-cols-2 sm:grid-cols-3 md:grid-cols-6 gap-3 text-xs`,children:[(0,N.jsx)(J,{label:l(`models.loadLabel`),value:`${n.load}/${n.maxLoad}`}),(0,N.jsx)(J,{label:l(`models.tokenUsageLabel`),value:`${S(n.tokens)}/${S(n.maxTokens)}`}),(0,N.jsx)(J,{label:l(`models.inputPrice`),value:n.price.input===void 0?`—`:`$${n.price.input}/M`}),(0,N.jsx)(J,{label:l(`models.outputPrice`),value:n.price.output===void 0?`—`:`$${n.price.output}/M`}),(0,N.jsx)(J,{label:l(`models.cacheReadPrice`),value:n.price.cacheRead===void 0?`—`:`$${n.price.cacheRead}/M`}),(0,N.jsx)(J,{label:l(`models.cacheWritePrice`),value:n.price.cacheWrite===void 0?`—`:`$${n.price.cacheWrite}/M`})]}),(0,N.jsxs)(`div`,{className:`mt-3 grid grid-cols-2 sm:grid-cols-4 gap-3 text-xs`,children:[(0,N.jsx)(J,{label:l(`models.inputTokensLabel`),value:S(n.usage?.input??0)}),(0,N.jsx)(J,{label:l(`models.outputTokensLabel`),value:S(n.usage?.output??0)}),(0,N.jsx)(J,{label:l(`models.totalTokensLabel`),value:S(n.usage?.total??0)}),(0,N.jsx)(J,{label:l(`models.usageRequestsLabel`),value:String(n.usage?.requests??0)})]}),(0,N.jsx)(le,{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,N.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,N.jsx)(fe,{modelId:n.id,provider:e.provider,className:`mt-2`})]}),(0,N.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0`,children:[Te.map(e=>{let t=e.key===`global`?n.isGlobalDefault:n.isGoalDefault,r=e.key===`global`?l(`models.setGlobalDefaultTitle`):l(`models.setGoalDefaultTitle`),i=l(`models.unsetGoalDefaultTitle`),a=l(`models.unsetGoalDefaultFailed`),o=l(`models.setGoalDefaultFailed`);return t?e.key===`global`?(0,N.jsxs)(`span`,{className:`inline-flex items-center gap-1 px-2 py-1 rounded text-badge border ${e.bg} ${e.color} font-medium`,title:l(`chat.globalDefault`),children:[(0,N.jsx)(b,{size:11}),l(e.labelKey)]},e.key):(0,N.jsxs)(`button`,{onClick:async()=>{try{await D.models.setDefaults({[e.key]:null}),await Z()}catch(e){j(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,N.jsx)(b,{size:11}),l(e.labelKey)]},e.key):n.enabled===!1?null:(0,N.jsx)(`button`,{onClick:async()=>{try{await D.models.setDefaults({[e.key]:`${n.provider}:${n.id}`}),await Z()}catch(e){j(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:l(e.labelKey)},e.key)}),(0,N.jsx)(`button`,{onClick:()=>It(n),className:`p-1.5 rounded hover:bg-accent-blue/10 text-dark-muted hover:text-accent-blue`,title:l(`models.editModel`),children:(0,N.jsx)(x,{size:13})}),(0,N.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:l(`models.deleteModel`),children:(0,N.jsx)(y,{size:13})}),(0,N.jsx)(`button`,{onClick:()=>Nt(n),disabled:P===Qe(n),className:`p-1.5 rounded hover:bg-dark-hover disabled:opacity-50`,title:l(`models.refresh`),children:(0,N.jsx)(h,{size:13,className:P===Qe(n)?`animate-spin`:``})}),(0,N.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?l(`models.enable`):l(`models.disable`)})]})]})},Qe(n))}),e.models.length===0&&(0,N.jsx)(`div`,{className:`text-center text-meta text-dark-muted py-3`,children:l(`models.noModelsInProvider`)})]})]},e.provider)}),E.length===0&&L.length===0&&(0,N.jsxs)(`div`,{className:`text-center text-dark-muted py-6`,children:[(0,N.jsx)(o,{size:36,className:`mx-auto mb-2 opacity-40`}),(0,N.jsx)(`p`,{className:`text-sm`,children:l(`models.emptyHint`)})]})]})]}),(0,N.jsx)(ae,{isOpen:me,onClose:()=>{R(!1),z(`select`),V(null),W(``)},title:he===`select`?l(`chat.selectProvider`):Vt?.name||l(`models.providerConfig`),size:`xl`,children:he===`select`?(0,N.jsx)(`div`,{className:`space-y-4`,children:(0,N.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-3`,children:[$e.filter(e=>e.key!==`custom`).map(e=>(0,N.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,N.jsxs)(`div`,{className:`flex items-center gap-2 mb-1`,children:[(0,N.jsx)(b,{size:14,className:`text-accent-blue`}),(0,N.jsx)(`span`,{className:`text-sm font-medium`,children:e.name})]}),(0,N.jsx)(`div`,{className:`text-xs text-dark-muted`,children:e.defaultModel})]},e.key)),(0,N.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,N.jsxs)(`div`,{className:`flex items-center gap-2 mb-1`,children:[(0,N.jsx)(t,{size:14,className:`text-accent-blue`}),(0,N.jsx)(`span`,{className:`text-sm font-medium`,children:l(`models.customProvider`)})]}),(0,N.jsx)(`div`,{className:`text-xs text-dark-muted`,children:l(`models.customProviderDesc`)})]})]})}):(0,N.jsxs)(`div`,{className:`space-y-3`,children:[B===`custom`&&(0,N.jsxs)(`div`,{className:`space-y-3`,children:[tt&&tt.keys.length>0&&(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:l(`models.editExistingConfig`)}),(0,N.jsxs)(`select`,{value:ge,onChange:e=>{let t=e.target.value;t?at(t):(W(``),U(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,N.jsx)(`option`,{value:``,children:l(`models.newCustomProviderOption`)}),tt.keys.map(e=>(0,N.jsx)(`option`,{value:e,children:e},e))]}),(0,N.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:l(`models.editExistingConfigHint`)})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:l(`models.providerNameLabel`)}),(0,N.jsx)(`input`,{value:H.providerKey,onChange:e=>U(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:l(`models.providerNamePlaceholder`)})]})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsxs)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:[`API Keys`,F?.providers?.[B===`custom`?H.providerKey.trim():B||``]?.hasApiKey?``:` *`,(0,N.jsx)(`span`,{className:`text-dark-muted/60 text-xs`,children:F?.providers?.[B===`custom`?H.providerKey.trim():B||``]?.hasApiKey?l(`models.apiKeysHintConfigured`):l(`models.apiKeysHintNew`)})]}),(0,N.jsx)(`div`,{className:`space-y-1.5`,children:(H.apiKeys?.length?H.apiKeys:[``]).map((e,t)=>(0,N.jsxs)(`div`,{className:`flex gap-1.5 items-center`,children:[(0,N.jsxs)(`div`,{className:`relative flex-1`,children:[(0,N.jsx)(`input`,{type:ye?`text`:`password`,value:e,autoComplete:`off`,spellCheck:!1,onChange:e=>U(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:l(`models.apiKeyDefaultPlaceholder`)}),(0,N.jsx)(`button`,{type:`button`,onClick:()=>be(e=>!e),className:`absolute end-2 top-1/2 -translate-y-1/2 text-dark-muted hover:text-dark-text`,title:l(ye?`models.hideKeyTitle`:`models.showKeyTitle`),children:ye?(0,N.jsx)(i,{size:14}):(0,N.jsx)(v,{size:14})})]}),t===0?(0,N.jsxs)(`button`,{type:`button`,onClick:()=>U(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:l(`models.addApiKeyTitle`),children:[(0,N.jsx)(d,{size:14}),(0,N.jsx)(`span`,{className:`hidden sm:inline`,children:l(`models.addApiKey`)})]}):(0,N.jsx)(`button`,{type:`button`,onClick:()=>U(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:l(`models.removeApiKeyTitle`),children:(0,N.jsx)(g,{size:14})})]},t))})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:l(`models.modelIdLabel`)}),(0,N.jsxs)(`div`,{className:`flex gap-2`,children:[(0,N.jsx)(`input`,{value:H.modelIds,onChange:e=>{let t=e.target.value;U(e=>({...e,modelIds:t})),X(()=>{let e=new Set;for(let n of t.split(`,`)){let t=n.trim().split(`|`)[0].trim();t&&Y.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||l(`models.modelIdPlaceholder`)}),(0,N.jsxs)(`button`,{onClick:st,disabled:Ie||!H.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:l(`models.fetchModelsTitle`),children:[Ie?(0,N.jsx)(h,{size:13,className:`animate-spin`}):(0,N.jsx)(s,{size:13}),l(Ie?`models.fetchingModels`:`models.fetchModels`)]}),(0,N.jsxs)(`button`,{onClick:lt,disabled:Ke||!H.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:l(`models.testConnectionTitle`),children:[Ke?(0,N.jsx)(h,{size:13,className:`animate-spin`}):(0,N.jsx)(f,{size:13}),l(Ke?`models.testingConnection`:`models.testConnection`)]}),(0,N.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:l(`models.catalogSearchTitle`),children:[(0,N.jsx)(c,{size:13}),l(`models.catalogSearch`)]})]}),Je&&(0,N.jsxs)(`div`,{className:`mt-1 text-xs ${Je.ok?`text-accent-green`:`text-accent-red`}`,children:[Je.ok?`✓ `:`✗ `,Je.message,Je.probes?.map(e=>(0,N.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,N.jsxs)(`span`,{className:`opacity-70`,children:[` — `,e.hint]})]},e.id))]}),Be&&(0,N.jsx)(`div`,{className:`mt-1 text-xs text-accent-red`,children:Be}),Y.length===0&&nt.length>0&&(0,N.jsxs)(`div`,{className:`mt-2 border border-dark-border rounded-lg bg-dark-bg p-2`,children:[(0,N.jsx)(`div`,{className:`flex items-center justify-between mb-2`,children:(0,N.jsxs)(`span`,{className:`text-xs text-dark-muted`,children:[l(`models.configuredPanelPrefix`),(0,N.jsx)(`strong`,{className:`text-dark-text`,children:nt.length}),l(`models.configuredPanelSuffix`),(0,N.jsx)(`span`,{className:`text-accent-green/70`,children:l(`models.configuredPanelHint`)})]})}),(0,N.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=H.modelIds.split(`,`).map(Ae).filter(Boolean).includes(e.id);return(0,N.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,N.jsx)(`span`,{className:`shrink-0 mt-[3px]`,children:t?(0,N.jsx)(b,{size:10}):(0,N.jsx)(`div`,{className:`w-2.5 h-2.5 rounded border border-dark-border`})}),(0,N.jsx)(`span`,{className:`min-w-0 flex-1 break-words leading-snug`,children:e.name||e.id}),e.isGlobalDefault&&(0,N.jsx)(`span`,{className:`text-avatar px-1 rounded bg-accent-red/20 text-accent-red shrink-0`,children:l(`models.globalShort`)}),e.isActDefault&&!e.isGlobalDefault&&(0,N.jsx)(`span`,{className:`text-avatar px-1 rounded bg-accent-yellow/20 shrink-0`,children:`Act`}),e.isGoalDefault&&(0,N.jsx)(`span`,{className:`text-avatar px-1 rounded bg-accent-purple/20 shrink-0`,children:`Goal`})]},e.id)})})]}),Y.length>0&&(0,N.jsxs)(`div`,{className:`mt-2 border border-dark-border rounded-lg bg-dark-bg p-2`,children:[(0,N.jsxs)(`div`,{className:`flex items-center justify-between mb-2`,children:[(0,N.jsxs)(`span`,{className:`text-xs text-dark-muted`,children:[l(`models.fetchedPanelPrefix`),(0,N.jsx)(`strong`,{className:`text-dark-text`,children:Y.length}),l(`models.fetchedPanelMiddle`),(0,N.jsx)(`strong`,{className:`text-accent-blue`,children:ze.size}),l(`models.fetchedPanelSuffix`),(0,N.jsx)(`span`,{className:`text-accent-blue/70`,children:l(`models.fetchedPanelHint`)})]}),(0,N.jsx)(`button`,{onClick:()=>{Re([]),X(new Set)},className:`px-2 py-0.5 text-badge border border-dark-border rounded hover:bg-dark-hover`,children:l(`models.close`)})]}),(0,N.jsxs)(`div`,{className:`relative mb-2`,children:[(0,N.jsx)(c,{size:12,className:`absolute start-2 top-1/2 -translate-y-1/2 text-dark-muted`}),(0,N.jsx)(`input`,{value:He,onChange:e=>{let t=e.target.value;Ue(t),t.trim()&&Ge(!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:l(`models.modelSearchPlaceholder`)})]}),He.trim()!==``&&(0,N.jsxs)(`div`,{className:`mb-1 text-badge text-dark-muted`,children:[l(`models.searchMatchPrefix`),(0,N.jsx)(`strong`,{className:`text-accent-blue`,children:Xe.length}),l(`models.searchMatchSuffix`,{total:Y.length})]}),(0,N.jsx)(`div`,{className:`max-h-72 overflow-y-auto custom-scrollbar grid grid-cols-1 sm:grid-cols-2 gap-1`,children:Xe.map(e=>{let t=ze.has(e.id);return(0,N.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:`${We?`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,N.jsx)(`span`,{className:`shrink-0 mt-[3px]`,children:t?(0,N.jsx)(b,{size:10}):(0,N.jsx)(`div`,{className:`w-2.5 h-2.5 rounded border border-dark-border`})}),(0,N.jsx)(`span`,{className:`min-w-0 flex-1 break-all leading-snug`,children:e.id})]},e.id)})})]})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:`Base URL`}),(0,N.jsx)(`input`,{value:H.baseUrl,onChange:e=>{U(t=>({...t,baseUrl:e.target.value})),Ye(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,N.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer select-none mt-2`,children:[(0,N.jsx)(`button`,{type:`button`,role:`switch`,"aria-checked":H.fullPath,onClick:()=>{U(e=>({...e,fullPath:!e.fullPath})),Ye(null)},className:`relative w-9 h-5 rounded-full transition-colors shrink-0 ${H.fullPath?`bg-accent-green`:`bg-dark-border`}`,children:(0,N.jsx)(`span`,{className:`absolute top-0.5 left-0 w-4 h-4 rounded-full bg-white shadow transition-transform ${H.fullPath?`translate-x-[18px]`:`translate-x-0.5`}`})}),(0,N.jsx)(`span`,{className:`text-sm text-dark-muted`,children:l(`models.fullPathLabel`)})]}),(0,N.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:l(`models.fullPathHint`)})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:l(`models.apiTypeLabel`)}),(0,N.jsxs)(`select`,{value:H.apiType,onChange:e=>{U(t=>({...t,apiType:e.target.value})),Ye(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,N.jsx)(`option`,{value:``,children:l(`models.apiTypeAutoDetect`)}),Oe.map(e=>(0,N.jsx)(`option`,{value:e,children:ke[e]},e))]}),(0,N.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:l(`models.apiTypeHint`)})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer select-none`,children:[(0,N.jsx)(`button`,{type:`button`,role:`switch`,"aria-checked":H.imageUseCustom,onClick:()=>U(e=>({...e,imageUseCustom:!e.imageUseCustom})),className:`relative w-9 h-5 rounded-full transition-colors shrink-0 ${H.imageUseCustom?`bg-accent-green`:`bg-dark-border`}`,children:(0,N.jsx)(`span`,{className:`absolute top-0.5 left-0 w-4 h-4 rounded-full bg-white shadow transition-transform ${H.imageUseCustom?`translate-x-[18px]`:`translate-x-0.5`}`})}),(0,N.jsx)(`span`,{className:`text-sm text-dark-muted`,children:l(`models.imageGenerationLabel`)})]}),(0,N.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:l(`models.imageGenerationHint`)}),H.imageUseCustom&&(0,N.jsxs)(`div`,{className:`mt-2 space-y-2 border border-dark-border rounded-lg p-2.5`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{className:`block text-badge text-dark-muted/70 mb-0.5`,children:l(`models.imageEndpointLabel`)}),(0,N.jsx)(`input`,{value:H.imageEndpoint,onChange:e=>U(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,N.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:l(`models.imageEndpointHint`)})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{className:`block text-badge text-dark-muted/70 mb-0.5`,children:l(`models.imageModelLabel`)}),(0,N.jsx)(`input`,{value:H.imageModel,onChange:e=>U(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:l(`models.imageModelPlaceholder`)}),(0,N.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:l(`models.imageModelHint`)})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`label`,{className:`block text-badge text-dark-muted/70 mb-0.5`,children:l(`models.imageApiKeyLabel`)}),(0,N.jsx)(`input`,{type:`password`,value:H.imageApiKey,onChange:e=>U(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:L.find(e=>e.key===$)?.hasImageApiKey?l(`models.imageApiKeyKeep`):`sk-...`}),(0,N.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:l(`models.imageApiKeyHint`)})]})]})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsxs)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:[l(`models.modelApiTypeLabel`),(0,N.jsx)(`span`,{className:`text-dark-muted/60 text-xs`,children:l(`models.modelApiTypeHint`)})]}),(0,N.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=H.modelIds.split(`,`).map(Ae).filter(Boolean);if(e.length===0)return(0,N.jsx)(`div`,{className:`px-3 py-2 text-xs text-dark-muted`,children:l(`models.modelApiTypeEmpty`)});let t=L.find(e=>e.key===$),n=t?.contextWindow??2e5,r=t?.maxTokens??8e3,i=(e,t)=>U(n=>({...n,modelOverrides:{...n.modelOverrides,[e]:{...n.modelOverrides[e]||{},...t}}}));return e.map(e=>{let t=H.modelOverrides[e]||{};return(0,N.jsxs)(`div`,{className:`px-3 py-2 space-y-1.5`,children:[(0,N.jsx)(`div`,{className:`text-xs min-w-0 break-all leading-snug text-dark-text`,title:e,children:e}),(0,N.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-1.5`,children:[(0,N.jsxs)(`label`,{className:`block`,children:[(0,N.jsx)(`span`,{className:`block text-badge text-dark-muted/70 mb-0.5`,children:l(`models.apiTypeLabel`)}),(0,N.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,N.jsx)(`option`,{value:``,children:l(`models.inheritProvider`)}),Oe.map(e=>(0,N.jsx)(`option`,{value:e,children:ke[e]},e))]})]}),(0,N.jsxs)(`label`,{className:`block`,children:[(0,N.jsx)(`span`,{className:`block text-badge text-dark-muted/70 mb-0.5`,children:l(`models.maxInputTokensLabel`)}),(0,N.jsx)(`input`,{type:`number`,min:1,inputMode:`numeric`,value:t.maxInput??``,onChange:t=>i(e,{maxInput:t.target.value}),placeholder:String(n),title:l(`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,N.jsxs)(`label`,{className:`block`,children:[(0,N.jsx)(`span`,{className:`block text-badge text-dark-muted/70 mb-0.5`,children:l(`models.maxOutputTokensLabel`)}),(0,N.jsx)(`input`,{type:`number`,min:1,inputMode:`numeric`,value:t.maxOutput??``,onChange:t=>i(e,{maxOutput:t.target.value}),placeholder:String(r),title:l(`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,N.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:l(`models.contextBudgetHint`)})]}),(0,N.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,N.jsx)(`input`,{type:`checkbox`,checked:H.setDefault,onChange:e=>U(t=>({...t,setDefault:e.target.checked})),className:`accent-accent-blue`}),(0,N.jsx)(`span`,{className:`text-sm text-dark-muted`,children:l(`models.setDefaultProvider`)})]}),ve&&(0,N.jsx)(`div`,{className:`text-sm text-accent-red`,children:ve}),(0,N.jsxs)(`div`,{className:`flex justify-between gap-2 pt-2`,children:[(0,N.jsx)(`div`,{children:$&&F?.providers?.[$]?.hasApiKey&&(0,N.jsx)(`button`,{onClick:async()=>{if(await C({message:l(`models.deleteProviderConfirm`,{key:$}),variant:`danger`}))try{await D.config.provider.delete($),R(!1),z(`select`),V(null),W(``),await Ze(),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:l(`models.deleteProvider`)})}),(0,N.jsx)(`button`,{onClick:()=>{z(`select`),V(null),W(``),R(!1)},className:`px-4 py-2 rounded border border-dark-border hover:bg-dark-hover transition-colors text-sm`,children:l(`common.cancel`)}),(0,N.jsx)(T,{variant:`accent`,onClick:Lt,loading:_e,children:l(`common.save`)})]})]})}),(0,N.jsx)(ae,{isOpen:ft,onClose:()=>pt(!1),title:(0,N.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,N.jsx)(c,{size:15,className:`text-accent-green`}),l(`models.catalogTitle`)]}),size:`2xl`,children:(0,N.jsxs)(`div`,{className:`space-y-3`,children:[(0,N.jsxs)(`div`,{className:`flex gap-2`,children:[(0,N.jsxs)(`div`,{className:`relative flex-1`,children:[(0,N.jsx)(c,{size:14,className:`absolute start-3 top-1/2 -translate-y-1/2 text-dark-muted`}),(0,N.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:l(`models.catalogSearchPlaceholder`),autoFocus:!0})]}),(0,N.jsxs)(`label`,{className:`inline-flex items-center gap-1.5 text-xs text-dark-muted whitespace-nowrap cursor-pointer`,children:[(0,N.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`}),l(`models.catalogOnlyToolCall`)]}),(0,N.jsxs)(`label`,{className:`inline-flex items-center gap-1.5 text-xs text-dark-muted whitespace-nowrap cursor-pointer`,children:[(0,N.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`}),l(`models.catalogOnlyReasoning`)]})]}),bt&&(0,N.jsx)(`div`,{className:`text-xs text-accent-red bg-accent-red/10 p-2 rounded`,children:bt}),vt?(0,N.jsxs)(`div`,{className:`flex items-center justify-center py-10 text-dark-muted`,children:[(0,N.jsx)(h,{size:18,className:`animate-spin me-2`}),` `,l(`models.searching`)]}):(0,N.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,N.jsx)(`div`,{className:`py-10 text-center text-dark-muted text-sm`,children:l(`models.catalogNoResults`)}):gt.map(e=>(0,N.jsxs)(`div`,{className:`flex items-center gap-3 px-3 py-2 hover:bg-dark-hover`,children:[(0,N.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,N.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,N.jsx)(`span`,{className:`text-sm font-medium text-dark-text truncate`,children:e.model.name||e.model.id}),(0,N.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,N.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 bg-accent-yellow/10 text-accent-yellow rounded`,children:l(`models.badgeReasoning`)}),e.model.tool_call&&(0,N.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 bg-accent-blue/10 text-accent-blue rounded`,children:l(`models.badgeToolCall`)}),e.model.attachment&&(0,N.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 bg-accent-green/10 text-accent-green rounded`,children:l(`models.badgeMultimodal`)})]}),(0,N.jsxs)(`div`,{className:`text-meta text-dark-muted mt-0.5`,children:[e.providerName,e.model.limit?.context?` · ${l(`models.ctxLimit`,{k:(e.model.limit.context/1e3).toFixed(0)})}`:``,e.model.limit?.output?` · ${l(`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,N.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:l(`models.catalogAddTitle`),children:[(0,N.jsx)(d,{size:12}),` `,l(`models.add`)]})]},`${e.providerId}:${e.model.id}`))}),(0,N.jsx)(`div`,{className:`text-meta text-dark-muted/60`,children:l(`models.catalogSourceHint`)})]})})]})]})}function Fe({title:e,value:t,color:n}){return(0,N.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,N.jsx)(`div`,{className:`text-xs opacity-70`,children:e}),(0,N.jsx)(`div`,{className:`text-xl font-semibold`,children:t})]})}function J({label:e,value:t}){return(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`div`,{className:`text-dark-muted`,children:e}),(0,N.jsx)(`div`,{children:t})]})}export{Pe as ModelsView,Pe as default};
@@ -0,0 +1 @@
1
+ import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{Or as t,Xn as n,Y as r,ft as i,g as a,ii as o,it as s,jr as c,kr as l,lt as ee,n as te,ut as ne,v as re}from"./icons-CittejKL.js";import{t as u}from"./useTranslation-2BGEBvJE.js";import{t as ie}from"./Button-B43HsIQ3.js";import{r as d}from"./api-BW4-5gtM.js";import{I as f}from"./markdown-DZQBOzWk.js";import{d as ae}from"./common-CP2UB8TN.js";import{n as oe}from"./useConfirm-kTv3x0H6.js";import{n as p,t as m}from"./Install-ClEm4oGX.js";var h=e(o(),1),g=f();function se(e){return(0,g.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 ce(e){return e?(0,g.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 le({plugin:e,job:t,error:r,onInstall:i,onDismiss:a}){let{t:o}=u(),s=t?.status===`running`,c=t&&s?p(t.stage,o):null,l=e.marketId??e.id;return(0,g.jsxs)(`div`,{"data-install-card":l,className:`rounded-lg border border-dark-border bg-dark-surface p-3`,children:[(0,g.jsxs)(`div`,{className:`flex items-center gap-2 max-md:flex-wrap max-md:gap-1 max-md:min-w-0`,children:[(0,g.jsx)(`span`,{className:`text-compact font-medium text-dark-text truncate`,children:e.name||e.id}),e.version&&(0,g.jsx)(`span`,{className:`text-meta text-dark-muted shrink-0`,children:e.version}),se(e.source),ce(e.market),e.category&&(0,g.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,g.jsx)(`div`,{className:`flex-1`}),(0,g.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,g.jsx)(`p`,{className:`mt-1 text-xs text-dark-muted`,children:e.description}),(0,g.jsxs)(`div`,{className:`mt-2 flex items-center gap-1.5 max-md:flex-wrap`,children:[(0,g.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,g.jsx)(n,{size:11,className:`animate-pulse`}):(0,g.jsx)(n,{size:11}),c??o(`plugins.installActivate`)]}),(0,g.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,g.jsx)(n,{size:11}),` `,o(`plugins.installOnly`)]})]}),(t||r)&&(0,g.jsx)(m,{job:t??null,error:r??null,onClose:a,testId:`plugin-install-console`,diagnosis:{kind:`plugin`,targetId:e.marketId??e.id,label:e.name},onRetry:t?.status===`error`||!t&&r?()=>i(l,t?.activate??!0):void 0})]})}function ue({jobs:e,onSelect:t}){let{t:r}=u(),i=e.filter(e=>e.status===`running`);return i.length===0?null:(0,g.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,g.jsxs)(`div`,{className:`flex items-center gap-1.5 px-0.5 pb-1`,children:[(0,g.jsx)(n,{size:11,className:`shrink-0 text-accent-blue`}),(0,g.jsx)(`span`,{className:`text-meta tabular-nums text-dark-text`,children:i.length})]}),(0,g.jsx)(`ul`,{className:`space-y-0.5`,children:i.map(e=>{let n=Math.max(0,Math.min(100,e.progress));return(0,g.jsx)(`li`,{children:(0,g.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,g.jsx)(`span`,{className:`h-2.5 w-2.5 shrink-0 spin-slow rounded-full border-2 border-accent-blue border-t-transparent`}),(0,g.jsx)(`span`,{className:`shrink-0 max-w-[10rem] truncate font-mono text-meta text-dark-text`,children:e.marketId}),(0,g.jsx)(`span`,{className:`shrink-0 text-meta text-dark-muted max-md:max-w-[9rem] max-md:truncate`,children:e.alreadyInstalled?r(`plugins.installAlreadyInstalled`):p(e.stage,r)}),(0,g.jsx)(`span`,{className:`flex-1 h-1 rounded-full bg-dark-hover overflow-hidden max-md:w-full`,children:(0,g.jsx)(`span`,{className:`block h-full bg-accent-blue transition-[width] duration-300 ease-out`,style:{width:`${n}%`}})}),(0,g.jsxs)(`span`,{className:`shrink-0 text-meta tabular-nums text-dark-muted`,children:[n,`%`]})]})},e.marketId)})})]})}var _=700;function v(e,t){if(!(t in e))return e;let n={...e};return delete n[t],n}function de(){let[e,t]=(0,h.useState)({}),[n,r]=(0,h.useState)({}),[i,a]=(0,h.useState)(0),o=(0,h.useRef)(new Map),s=(0,h.useCallback)(e=>{let t=o.current.get(e);t!==void 0&&(window.clearTimeout(t),o.current.delete(e))},[]),c=(0,h.useCallback)((e,n)=>{s(e);let i=async()=>{let c=await d.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(),_)):(o.current.delete(e),a(e=>e+1))};i()},[s]),l=(0,h.useCallback)(async(e,n)=>{s(e),r(t=>v(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 d.post(`/api/plugins/install`,{id:e,activate:n});if(!i.success){let n=i.error??`Install request failed`;return t(t=>v(t,e)),r(t=>({...t,[e]:n})),{job:null,error:n}}if(!i.data?.jobId)return t(t=>v(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,h.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,h.useCallback)(n=>{let i=e[n];i&&i.status===`running`||(t(e=>v(e,n)),r(e=>v(e,n)))},[e])}}var y=12,b=`other`,fe=[`all`,`builtin`,`openclaw`,`deepseek-harness`];function pe(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 x(e){return e.category?.trim()||b}function S(e){return e.trim().toLowerCase().replace(/[._\s]+/g,`-`)}function me(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 C(){let{t:e}=u(),[n,o]=(0,h.useState)(`installed`),[f,p]=(0,h.useState)([]),[m,ce]=(0,h.useState)([]),[_,v]=(0,h.useState)([]),[b,C]=(0,h.useState)(null),[w,he]=(0,h.useState)(!0),[T,ge]=(0,h.useState)(null),[E,_e]=(0,h.useState)(null),[ve,ye]=(0,h.useState)(null),[D,O]=(0,h.useState)(null),[k,A]=(0,h.useState)(null),[j,M]=(0,h.useState)(null),[N,P]=(0,h.useState)(``),[F,I]=(0,h.useState)(null),[L,R]=(0,h.useState)(null),[z,B]=(0,h.useState)(1),V=(0,h.useCallback)((e,t)=>{O({kind:e,text:t}),window.setTimeout(()=>O(null),4e3)},[]),H=(0,h.useCallback)(async()=>{he(!0),ge(null);let[e,t]=await Promise.all([d.get(`/api/plugins`),d.get(`/api/plugins/market`)]);e.success&&e.data?(p(e.data.plugins),C(e.data.schemaVersion??null),ce(e.data.issues??[])):ge(e.error??`Failed to load plugins`),t.success&&t.data&&v(t.data.plugins),he(!1)},[]);(0,h.useEffect)(()=>{H()},[H]);let U=(0,h.useMemo)(()=>f.filter(e=>e.installable!==!0),[f]),W=(0,h.useMemo)(()=>{let e=new Set(f.filter(e=>e.installable===!0).map(e=>S(e.id))),t=new Set;for(let e of f)e.installable!==!0&&(t.add(S(e.id)),e.marketId&&t.add(S(e.marketId)));return[...f.filter(e=>e.installable===!0),..._.filter(n=>{let r=S(n.id);return!e.has(r)&&!t.has(r)})]},[f,_]),G=(0,h.useCallback)(e=>e.filter(e=>F&&x(e)!==F||L&&(e.market??null)!==L?!1:me(e,N)),[F,N,L]),K=(0,h.useMemo)(()=>G(U),[G,U]),q=(0,h.useMemo)(()=>G(W),[G,W]),be=(0,h.useMemo)(()=>{let e=new Set;for(let t of W)e.add(x(t));return[`all`,...Array.from(e).sort()]},[W]),J=(0,h.useMemo)(()=>{let e=new Set;for(let t of W)t.market&&e.add(t.market);return fe.filter(t=>t===`all`||e.has(t))},[W]),xe=e=>Math.max(1,Math.ceil(e/y)),Se=(e,t)=>e.slice((t-1)*y,t*y),Y=xe(K.length),X=xe(q.length),Ce=(0,h.useMemo)(()=>Se(K,Math.min(z,Y)),[K,z,Y]),we=(0,h.useMemo)(()=>Se(q,Math.min(z,X)),[q,z,X]);(0,h.useEffect)(()=>{B(1)},[n,N,F,L]),(0,h.useEffect)(()=>{L!==null&&!J.includes(L)&&R(null)},[L,J]);let Te=N.trim().length>0||F!==null||L!==null,Z=(0,h.useCallback)(async(e,t,n)=>{_e(e),ye(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{_e(null),ye(null)}},[H,V]),Q=de(),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,h.useEffect)(()=>{De>0&&H()},[De,H]);let Oe=(0,h.useMemo)(()=>Object.values(Q.jobs),[Q.jobs]),$=(0,h.useCallback)(e=>{o(`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/y)+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,h.useCallback)(e=>{if(!e)return;let t=S(e.marketId??e.id),n=e=>S((`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)?(o(`installed`),I(null),R(null),P(e.id)):o(`available`)},[W,U,$]),Ae=e=>Z(e,`enabled`,()=>d.post(`/api/plugins/${encodeURIComponent(e)}/enable`)),je=e=>Z(e,`disabled`,()=>d.post(`/api/plugins/${encodeURIComponent(e)}/disable`)),Me=e=>Z(e,`uninstalled`,()=>d.delete(`/api/plugins/${encodeURIComponent(e)}`)),Ne=async e=>{M(e);try{let t=await d.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=(n,r)=>r>1?(0,g.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,g.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,g.jsx)(l,{size:12}),` `,e(`plugins.prevPage`)]}),(0,g.jsx)(`span`,{className:`text-meta text-dark-muted`,children:e(`plugins.pageInfo`,{page:Math.min(z,r),pages:r,count:n})}),(0,g.jsxs)(`button`,{onClick:()=>B(e=>Math.min(r,e+1)),disabled:z>=r,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,g.jsx)(t,{size:12})]})]}):null,Fe=t=>(0,g.jsx)(`div`,{className:`mt-8 text-center text-xs text-dark-muted`,children:Te?e(`plugins.noMatch`):t});return(0,g.jsxs)(`div`,{className:`h-full flex flex-col min-h-0 bg-dark-bg`,children:[(0,g.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,g.jsx)(i,{size:15,className:`text-accent-blue`}),(0,g.jsx)(`span`,{className:`truncate text-compact font-medium text-dark-text`,children:e(`nav.plugins`)}),b!==null&&(0,g.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`,b]}),(0,g.jsx)(`div`,{className:`flex-1`}),(0,g.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,g.jsx)(s,{size:14,className:w?`animate-spin`:``})})]}),m.length>0&&(0,g.jsxs)(`div`,{className:`shrink-0 mx-3 mt-2 rounded-lg border border-accent-yellow/40 bg-accent-yellow/10`,children:[(0,g.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5`,children:[(0,g.jsx)(a,{size:13,className:`shrink-0 text-accent-yellow`}),(0,g.jsx)(`span`,{className:`text-xs text-dark-text`,children:e(`plugins.issues.title`,{count:m.length})}),(0,g.jsx)(`div`,{className:`flex-1`}),(0,g.jsx)(ie,{variant:`ghost`,size:`sm`,onClick:()=>ke(m[0]),children:e(`plugins.issues.goMarket`)})]}),(0,g.jsx)(`ul`,{className:`max-h-28 space-y-1 overflow-y-auto px-3 pb-2`,children:m.map(t=>{let n=t.marketId??t.id,r=t.stage===`install`||t.stage===`restore`,i=r&&Q.jobs[n]?.status===`running`;return(0,g.jsxs)(`li`,{className:`flex items-baseline gap-1.5 text-meta`,children:[(0,g.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,g.jsx)(`span`,{className:`shrink-0 font-mono text-dark-text`,children:t.marketId??t.id}),t.channelType&&(0,g.jsx)(`span`,{className:`shrink-0 text-dark-muted`,children:e(`plugins.issues.channelType`,{type:t.channelType})}),t.message&&(0,g.jsx)(`span`,{className:`truncate text-dark-muted`,title:t.message,children:t.message}),r&&(0,g.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,g.jsx)(`div`,{className:`flex items-center gap-1 px-3 pt-2 shrink-0`,children:[`installed`,`available`].map(t=>(0,g.jsx)(`button`,{onClick:()=>o(t),className:`px-3 py-1.5 rounded-t text-xs transition-colors ${n===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,g.jsx)(ue,{jobs:Oe,onSelect:$}),(0,g.jsxs)(`div`,{className:`shrink-0 px-3 pt-2 pb-1 space-y-2 bg-dark-bg`,children:[(0,g.jsxs)(`div`,{className:`relative`,children:[(0,g.jsx)(r,{size:13,className:`absolute start-2.5 top-1/2 -translate-y-1/2 text-dark-muted pointer-events-none`}),(0,g.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,g.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,g.jsx)(te,{size:12})})]}),n===`available`&&be.length>2&&(0,g.jsx)(`div`,{className:`flex flex-wrap items-center gap-1.5`,children:be.map(t=>(0,g.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))}),n===`available`&&(0,g.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,g.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,g.jsxs)(`div`,{className:`flex-1 min-h-0 overflow-y-auto px-3 pb-4`,children:[T&&(0,g.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,g.jsx)(a,{size:14}),` `,T]}),w&&!T&&(0,g.jsx)(`div`,{className:`mt-8 px-4`,role:`status`,children:(0,g.jsx)(ae,{count:4})}),!w&&n===`installed`&&(0,g.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,g.jsxs)(`div`,{className:`rounded-lg border border-dark-border bg-dark-surface p-3`,children:[(0,g.jsxs)(`div`,{className:`flex items-center gap-2 max-md:flex-wrap max-md:gap-1 max-md:min-w-0`,children:[(0,g.jsx)(`span`,{className:`text-compact font-medium text-dark-text truncate`,children:t.name||t.id}),t.version&&(0,g.jsx)(`span`,{className:`text-meta text-dark-muted shrink-0`,children:t.version}),se(t.source),(0,g.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,g.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,g.jsx)(`div`,{className:`flex-1`}),(0,g.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,g.jsx)(`p`,{className:`mt-1 text-xs text-dark-muted`,children:t.description}),n.length>0&&(0,g.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-1.5`,children:[n.map(e=>(0,g.jsxs)(`span`,{title:e.note||e.id,className:`px-1.5 py-0.5 rounded text-meta border cursor-help ${pe(e.status)}`,children:[e.kind,` · `,e.status,e.status===`wired`&&(0,g.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,g.jsx)(`button`,{disabled:j===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:j===t.id?`applying…`:`apply provider`},`apply-${t.id}`))]}),(0,g.jsxs)(`div`,{className:`mt-2 flex items-center gap-1.5 max-md:flex-wrap`,children:[i?(0,g.jsxs)(`button`,{onClick:()=>void je(t.id),disabled:E===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,g.jsx)(ne,{size:11}),` `,E===t.id?`${ve}…`:e(`plugins.deactivate`)]}):(0,g.jsxs)(`button`,{onClick:()=>void Ae(t.id),disabled:E===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,g.jsx)(ee,{size:11}),` `,E===t.id?`${ve}…`:e(`plugins.activate`)]}),(0,g.jsxs)(`button`,{onClick:()=>A(t.id),disabled:E===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,g.jsx)(re,{size:11}),` `,e(`plugins.uninstall`)]})]})]},t.id)}),Pe(K.length,Y)]}),!w&&n===`available`&&(0,g.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,g.jsx)(le,{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)]})]}),D&&(0,g.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 ${D.kind===`ok`?`bg-accent-green/15 border-accent-green text-accent-green`:`bg-accent-red/15 border-accent-red text-accent-red`}`,children:[D.kind===`ok`?(0,g.jsx)(c,{size:13}):(0,g.jsx)(te,{size:13}),` `,D.text]}),(0,g.jsx)(oe,{isOpen:k!==null,title:e(`plugins.uninstallTitle`),message:e(`plugins.uninstallConfirm`,{id:k??``}),onConfirm:()=>{k&&Me(k),A(null)},onClose:()=>A(null)})]})}export{C as PluginsView};
@@ -0,0 +1 @@
1
+ import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{$n as t,Ar as n,En as r,G as i,Kn as a,Or as o,Qr as s,Sr as c,Tn as l,Vr as u,Y as d,Yn as f,_t as p,br as m,dt as h,g,ii as _,ir as v,it as y,jr as b,n as x,ut as S,v as C}from"./icons-CittejKL.js";import{r as w}from"./react-vendor-BEA-EtI-.js";import{t as T}from"./useTranslation-2BGEBvJE.js";import{a as E}from"./chatStore-D8Zzr1hE.js";import{r as D,t as O}from"./Button-B43HsIQ3.js";import{c as k}from"./threads-lr33dwqg.js";import"./src-55YckF5W.js";import{l as A}from"./DiffPreview-WQihq3bK.js";import{n as j,t as M}from"./InputArea-CSqaA55j.js";import{n as N,r as P,t as F}from"./projectsStore-B7fdKRzl.js";import{t as I}from"./api-BW4-5gtM.js";import{I as L}from"./markdown-DZQBOzWk.js";import{n as R}from"./threadStore-CQi4OzSe.js";import{i as z,n as ee,r as te,s as B}from"./FileContextMenu-CyjXlSHp.js";import{t as V}from"./cn-CoHJgTJ5.js";import"./common-CP2UB8TN.js";import{r as H,t as U}from"./useConfirm-kTv3x0H6.js";import{t as ne}from"./WorkspaceDirPicker-Z42YqE4a.js";import{A as W,D as re,E as ie,M as G,O as ae,T as K,_ as q,j as J,k as oe,w as se}from"./index-CxrzleFg.js";var ce=w(),Y=e(_(),1);function le(e={}){let t=e.enabled!==!1,n=N(e=>e.projects),r=N(e=>e.total),i=N(e=>e.hidden),a=N(e=>e.detail),o=N(e=>e.detailLoading),s=N(e=>e.detailError),c=N(e=>e.query),l=N(e=>e.sort),u=N(e=>e.stale),d=N(e=>e.loading),f=N(e=>e.lastError),p=N(e=>e.disabled),m=N(e=>e.openProjectId),h=N(e=>e.refresh);(0,Y.useEffect)(()=>{t&&N.getState().refresh()},[t]),(0,Y.useEffect)(()=>{t&&u&&N.getState().scheduleRefresh()},[t,u]),(0,Y.useEffect)(()=>{if(!t||typeof document>`u`)return;let e=()=>{document.visibilityState===`visible`&&N.getState().refresh()};return document.addEventListener(`visibilitychange`,e),()=>document.removeEventListener(`visibilitychange`,e)},[t]);let g=F(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=>N.getState().setQuery(e),setSort:e=>N.getState().setSort(e),openProject:e=>void N.getState().openProject(e),closeDetail:()=>N.getState().closeDetail(),enterProject:(e,t)=>N.getState().enterProject(e,t),backToProjectList:()=>N.getState().backToProjectList(),createProject:(e,t)=>N.getState().createProject(e,t),hideProject:e=>N.getState().hideProject(e),unhideProjects:e=>N.getState().unhideProjects(e),unhideAll:()=>N.getState().unhideAll(),probeEntry:()=>void N.getState().probeEntry(),refresh:()=>void h()}}var X=L();function ue({isOpen:e,onClose:t,projects:n,onRestore:r}){let{t:i}=T(),[a,o]=(0,Y.useState)(()=>new Set),s=(0,Y.useRef)(n);s.current=n,(0,Y.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,X.jsxs)(H,{isOpen:e,onClose:t,title:i(`projects.hiddenModalTitle`),size:`md`,bodyClassName:`p-0`,children:[(0,X.jsxs)(`div`,{"data-testid":`projects-hidden-modal`,children:[(0,X.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,X.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,X.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,X.jsx)(`span`,{className:`ms-auto text-meta tabular-nums text-dark-muted/70`,children:i(`projects.hiddenSelectedCount`,{count:a.size})})]}),(0,X.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,X.jsx)(`li`,{children:(0,X.jsxs)(`label`,{className:V(`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,X.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,X.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,X.jsxs)(`span`,{className:`flex items-center gap-1.5`,children:[(0,X.jsx)(`span`,{className:`truncate text-compact text-dark-text`,title:e.root,children:e.name}),!e.rootExists&&(0,X.jsx)(`span`,{className:`shrink-0 text-badge text-accent-yellow`,children:i(`projects.rootMissing`)})]}),(0,X.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,X.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,X.jsx)(O,{onClick:t,children:i(`common.cancel`)}),(0,X.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 Z({tone:e=`neutral`,testid:t,title:n,children:r}){return(0,X.jsx)(`span`,{"data-testid":t,title:n,className:V(`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 pe({icon:e,label:t,hint:n,disabled:r,testid:i,onClick:a}){let o=r?`${t} — ${n??``}`:t;return(0,X.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 me=(0,Y.memo)(function({project:e,onOpen:t,onOpenFolder:n,onCopyRoot:i,onHide:o,now:s}){let{t:c}=T(),l=!e.rootExists,u=Object.values(e.threads).reduce((e,t)=>e+t,0),d=fe(e),f=A(e.lastActivityAt,s,c);return(0,X.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:V(`group relative flex cursor-pointer items-center gap-2.5 rounded-lg border px-3 py-2 text-start transition-colors`,l?`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":l?`true`:`false`,"data-status":d.tone,children:[(0,X.jsx)(`span`,{"aria-hidden":`true`,className:`status-dot shrink-0`,"data-tone":d.tone,"data-live":d.live?`true`:`false`,"data-testid":`project-status-${e.projectId}`}),(0,X.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,X.jsxs)(`span`,{className:`flex items-center gap-1.5`,children:[(0,X.jsx)(`span`,{className:`truncate text-compact font-semibold text-dark-text`,title:e.root,children:e.name}),(0,X.jsx)(`span`,{className:`shrink-0 rounded border border-dark-border px-1 py-px text-badge leading-4 text-dark-muted`,children:c(`projects.visibility`)}),l&&(0,X.jsx)(`span`,{className:`shrink-0 text-badge text-accent-yellow`,children:c(`projects.rootMissing`)})]}),(0,X.jsx)(`span`,{className:`mt-0.5 flex items-center gap-2 text-meta leading-tight text-dark-muted/70`,children:(0,X.jsx)(`span`,{className:`min-w-0 flex-1 truncate font-mono`,title:e.root,children:e.root})})]}),(0,X.jsxs)(`span`,{className:`hidden shrink-0 items-center gap-1.5 md:flex`,children:[(0,X.jsxs)(Z,{testid:`project-sessions-${e.projectId}`,children:[c(`projects.sessionCount`,{count:e.sessions.total}),e.sessions.running>0&&(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`span`,{className:`text-dark-muted/40`,"aria-hidden":`true`,children:`·`}),(0,X.jsx)(`span`,{className:`inline-flex items-center gap-0.5 text-accent-blue`,"data-testid":`project-running`,children:c(`projects.runningCount`,{count:e.sessions.running})})]})]}),(0,X.jsx)(Z,{testid:`project-threads-${e.projectId}`,children:u>0?c(`projects.threadCount`,{count:u}):c(`projects.noThreads`)}),e.agentMd.present?(0,X.jsx)(Z,{tone:e.agentMd.truncated?`warn`:`ok`,testid:`project-agentmd-${e.projectId}`,title:e.agentMd.truncated?c(`projects.agentMdTruncated`,{bytes:e.agentMd.bytes??0}):c(`projects.agentMdBytes`,{bytes:e.agentMd.bytes??0}),children:e.agentMd.truncated?c(`projects.agentMdTruncatedShort`):c(`projects.agentMdReady`)}):(0,X.jsx)(Z,{testid:`project-agentmd-${e.projectId}`,children:c(`projects.agentMdAbsent`)}),l&&(0,X.jsx)(Z,{tone:`warn`,testid:`project-missing-${e.projectId}`,children:c(`projects.rootMissingChip`)})]}),f&&(0,X.jsx)(`span`,{className:`hidden shrink-0 font-mono text-meta tabular-nums text-dark-muted lg:block`,"data-testid":`project-activity-${e.projectId}`,children:f}),(0,X.jsxs)(`span`,{className:`flex shrink-0 items-center gap-0.5`,onClick:e=>e.stopPropagation(),children:[(0,X.jsx)(pe,{icon:(0,X.jsx)(r,{size:13,"aria-hidden":`true`}),label:c(`projects.openFolder`),hint:l?c(`projects.openFolderDisabled`):void 0,disabled:l,testid:`project-open-folder-${e.projectId}`,onClick:()=>n(e.root)}),(0,X.jsx)(pe,{icon:(0,X.jsx)(v,{size:13,"aria-hidden":`true`}),label:c(`projects.copyRoot`),testid:`project-copy-root-${e.projectId}`,onClick:()=>i(e.root)}),(0,X.jsx)(pe,{icon:(0,X.jsx)(a,{size:13,"aria-hidden":`true`}),label:c(l?`projects.removeView`:`projects.hide`),hint:c(`projects.hideHint`),testid:`project-hide-${e.projectId}`,onClick:()=>o(e.projectId)})]})]})}),he=[`answer`,`thread`,`goal`,`handoff`,`approval`,`session`];function ge(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function Q(e){return typeof e==`string`&&e.trim()?e:void 0}function _e(e){let t=ge(e);if(!t)return null;let n=t.kind;if(typeof n!=`string`||!he.includes(n))return null;let r={kind:n,reason:typeof t.reason==`string`?t.reason:``},i=ge(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=ge(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 ve(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 ye=(0,Y.memo)(function({route:e,root:t,onOpenThread:n,onOpenSession:r}){let{t:i}=T(),a=R(e=>e.rows),o=R(e=>e.query),[s,c]=(0,Y.useState)(!1),[l,u]=(0,Y.useState)(null),[d,f]=(0,Y.useState)(!1);if(e.kind===`session`&&!e.suggest?.title)return(0,X.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 I.sessions.create(n,t);if(i.success&&i.data){let a=e.suggest?.seed?.trim();a&&E.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,X.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,X.jsxs)(`span`,{className:`flex items-center gap-1.5`,children:[(0,X.jsx)(`span`,{className:`status-pill`,"data-tone":ve(e.kind),"data-testid":`pm-route-kind`,children:i(`projects.pmRouteKind.${e.kind}`)}),(0,X.jsx)(`span`,{className:`text-badge text-dark-text-secondary`,children:i(`projects.pmRouteTo`)})]}),e.reason?(0,X.jsx)(`span`,{className:`mt-0.5 block text-meta text-dark-text-secondary`,children:e.reason}):null,v?(0,X.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,X.jsx)(`span`,{className:`font-mono text-dark-text-secondary`,children:p})]}):_?null:m?(0,X.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,X.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,X.jsx)(`span`,{className:`mt-1 block text-meta text-accent-green`,"data-testid":`pm-route-session-created`,children:i(`projects.pmRouteSessionCreated`,{title:l})}):(0,X.jsxs)(`span`,{className:`mt-1 block`,children:[(0,X.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,X.jsx)(`span`,{className:`ms-1.5 text-badge text-accent-red`,"data-testid":`pm-route-create-failed`,children:i(`projects.pmRouteCreateFailed`)}):null]}):null]})});function be(e,t,n){let r=e.fields,i=e=>typeof r[e]==`string`?r[e]:``;switch(e.type){case`pm_started`:return(0,X.jsx)(`span`,{children:t(`projects.pmStarted`)});case`pm_stopped`:return(0,X.jsx)(`span`,{children:t(`projects.pmStopped`)});case`pm_wakeup`:{let e=i(`reason`),n=i(`summary`);return(0,X.jsxs)(`span`,{children:[t(`projects.pmWakeup`),e?(0,X.jsxs)(`span`,{className:`text-dark-text-secondary`,children:[` · `,e]}):null,n?(0,X.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,l=_e(r.route);return(0,X.jsxs)(`span`,{children:[e?(0,X.jsx)(`span`,{className:`font-medium`,children:e}):(0,X.jsx)(`span`,{children:t(`projects.pmReport`)}),a?(0,X.jsx)(`span`,{className:`block text-dark-text-secondary`,children:a}):null,o?(0,X.jsxs)(`span`,{className:`block text-dark-text-secondary`,children:[t(`projects.pmNextAction`),`: `,o]}):null,s>0?(0,X.jsxs)(`span`,{className:`mt-0.5 inline-flex items-center gap-1 text-accent-yellow`,children:[(0,X.jsx)(c,{size:12,"aria-hidden":`true`}),` `,s,` `,t(`projects.pmApprovalsPending`)]}):null,l?(0,X.jsx)(ye,{route:l,root:n.root,onOpenThread:n.onOpenThread,onOpenSession:n.onOpenSession}):null]})}case`pm_approval_requested`:return(0,X.jsx)(`span`,{children:t(`projects.pmApprovalRequested`)});case`pm_approval_resolved`:return(0,X.jsxs)(`span`,{children:[t(`projects.pmApprovalResolved`),i(`decision`)?(0,X.jsxs)(`span`,{className:`text-dark-text-secondary`,children:[` · `,i(`decision`)]}):null]});default:return(0,X.jsx)(`span`,{children:e.type})}}var xe=(0,Y.memo)(function({root:e,onOpenThread:t,onOpenSession:r,children:i}){let{t:a}=T(),s=(0,Y.useMemo)(()=>k(e)??``,[e]),l=G(e=>e.residentByProject[s]??!1),d=G(e=>e.activityByProject[s]??se),f=G(e=>e.approvals),p=(0,Y.useMemo)(()=>oe(f,s),[f,s]),h=G(e=>e.resolveApproval),[g,_]=(0,Y.useState)(!1),[v,y]=(0,Y.useState)(!1);(0,Y.useEffect)(()=>{s&&re(s)},[s]);let S=async()=>{if(s&&!v){y(!0);try{await J(s,!l)}finally{y(!1)}}},C=d.slice(-20).reverse(),w=(0,Y.useMemo)(()=>{if(g)return null;let e=d.slice(-20);for(let t=e.length-1;t>=0;t--){let n=e[t];if(!n||n.type!==`pm_report`)continue;let r=_e(n.fields.route);if(r)return r}return null},[d,g]),E=(0,Y.useMemo)(()=>({root:e,onOpenThread:t,onOpenSession:r}),[e,t,r]);return(0,X.jsxs)(`section`,{"aria-label":a(`projects.pmPanel`),className:`flex min-h-0 min-w-0 flex-1 flex-col border-b border-dark-border`,children:[(0,X.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2 overflow-hidden px-3 py-2 max-md:flex-wrap`,children:[(0,X.jsx)(u,{size:14,"aria-hidden":`true`,className:l?`text-accent-green`:`text-dark-text-secondary`}),(0,X.jsx)(`span`,{className:`min-w-0 shrink truncate text-xs font-medium`,children:a(`projects.pmPanel`)}),(0,X.jsxs)(`span`,{className:V(`inline-flex items-center gap-1 rounded-full px-1.5 py-0.5 text-badge`,l?`bg-accent-green/15 text-accent-green`:`bg-dark-bg-tertiary text-dark-text-secondary`),children:[(0,X.jsx)(`span`,{className:V(`h-1.5 w-1.5 rounded-full`,l?`bg-accent-green`:`bg-dark-text-secondary`),"aria-hidden":`true`}),a(l?`projects.pmResident`:`projects.pmOff`)]}),(0,X.jsxs)(`div`,{className:`ms-auto flex shrink-0 items-center gap-1 max-md:w-full max-md:justify-end`,children:[(0,X.jsx)(`button`,{type:`button`,onClick:S,disabled:v||!s,className:V(`rounded px-2 py-0.5 text-meta transition-colors`,l?`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:a(l?`projects.pmStop`:`projects.pmStart`)}),(0,X.jsx)(`button`,{type:`button`,onClick:()=>_(e=>!e),"aria-expanded":g,"aria-label":a(`projects.pmToggleTimeline`),className:`rounded p-1 text-dark-text-secondary hover:bg-dark-bg-tertiary hover:text-dark-text-primary`,children:g?(0,X.jsx)(n,{size:14,"aria-hidden":`true`}):(0,X.jsx)(o,{size:14,"aria-hidden":`true`})})]})]}),p.length>0&&(0,X.jsx)(`ul`,{className:`space-y-1.5 px-3 pb-2`,children:p.map(e=>(0,X.jsx)(`li`,{className:`rounded-md border border-accent-yellow bg-accent-yellow/15 p-2`,children:(0,X.jsxs)(`div`,{className:`flex items-start gap-1.5`,children:[(0,X.jsx)(c,{size:13,"aria-hidden":`true`,className:`mt-0.5 shrink-0 text-accent-yellow`}),(0,X.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,X.jsx)(`p`,{className:`truncate text-xs font-medium text-dark-text-primary`,children:e.title||e.requestedAction||a(`projects.pmApprovalCard`)}),e.summary?(0,X.jsx)(`p`,{className:`mt-0.5 line-clamp-3 text-meta text-dark-text-secondary`,children:e.summary}):null,(0,X.jsxs)(`div`,{className:`mt-1.5 flex gap-1.5`,children:[(0,X.jsxs)(`button`,{type:`button`,onClick:()=>void h(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,X.jsx)(b,{size:11,"aria-hidden":`true`}),` `,a(`projects.pmApprove`)]}),(0,X.jsxs)(`button`,{type:`button`,onClick:()=>void h(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,X.jsx)(x,{size:11,"aria-hidden":`true`}),` `,a(`projects.pmReject`)]})]})]})]})},e.escalationId))}),w?(0,X.jsx)(`div`,{className:`px-3 pb-2`,children:(0,X.jsx)(ye,{route:w,root:E.root,onOpenThread:E.onOpenThread,onOpenSession:E.onOpenSession})}):null,i?(0,X.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col`,children:i}):null,g&&C.length>0&&(0,X.jsx)(`div`,{className:`px-3 pb-2`,children:(0,X.jsx)(`ul`,{className:`max-h-48 space-y-1.5 overflow-y-auto`,children:C.map(e=>(0,X.jsxs)(`li`,{className:`flex items-start gap-1.5 text-xs`,children:[e.type===`pm_report`?(0,X.jsx)(m,{size:12,"aria-hidden":`true`,className:`mt-0.5 shrink-0 text-accent-green`}):(0,X.jsx)(`span`,{className:`mt-1 h-1.5 w-1.5 shrink-0 rounded-full bg-dark-text-secondary`,"aria-hidden":`true`}),(0,X.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,X.jsx)(`div`,{className:`text-dark-text-primary`,children:be(e,a,E)}),(0,X.jsx)(`div`,{className:`text-badge text-dark-text-secondary`,children:A(e.at)})]})]},e.id))})})]})}),Se=[],Ce={setActiveTab:()=>{},createNewSession:()=>{},setTheme:()=>{},setLogs:()=>{},setUnreadLogs:()=>{}},we=(0,Y.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}=T(),d=G(e=>e.managers),f=G(e=>e.managersLoaded),p=G(e=>e.fetchManagers),m=G(t=>t.residentByProject[e]??!1),h=N(e=>e.setFocusedPmSession),g=N(e=>e.enterPmSession),_=N(e=>e.backToPmSessions);(0,Y.useEffect)(()=>{p()},[p]);let v=(0,Y.useMemo)(()=>d.find(t=>t.projectKey===e)?.managerSessionIds??[],[d,e]),y=v.includes(n)?n:f?v[0]??null:n;(0,Y.useEffect)(()=>{f&&(y?y!==n&&g(y):_())},[f,y,n,g,_]),(0,Y.useEffect)(()=>(h(y),()=>h(null)),[y,h]),(0,Y.useEffect)(()=>{y&&a&&a(y)},[y,a]);let b=E(e=>y?e.messagesBySession[y]??Se:Se),x=E(e=>y?e.generatingSessions.includes(y):!1),S=(0,Y.useCallback)(async t=>{let n=t.trim();n&&y&&(await W(e,n,y)?E.getState().addMessage(y,{id:`msg-${Date.now()}`,type:`user`,content:n,timestamp:Date.now()}):D.error(u(`projects.pmSendFailed`)))},[e,y,u]);return(0,X.jsx)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col`,"data-testid":`coordinator-pane`,children:(0,X.jsx)(xe,{root:t,onOpenThread:r,onOpenSession:i,children:y?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(j,{messages:b,isGenerating:x,isPaused:!1,sessionId:y}),(0,X.jsx)(M,{sessionId:y,onSend:S,onStop:()=>s?.(y),onPause:()=>c?.(y),onResume:()=>l?.(y),slashOptions:o??Ce,inputDisabled:!m,inputDisabledHint:u(`projects.pmInputDisabled`)})]}):(0,X.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`)})})})}),Te=(0,Y.memo)(function({projectName:e,projectRoot:t,missing:n,levelLabel:a,onBack:o,onBackToSessions:c,onOpenFolder:l,onNewSessionHere:u,settingsOpen:d,onToggleSettings:p,onOpenMore:m,moreItemsCount:g}){let{t:_}=T(),v=e=>{let t=e.currentTarget.getBoundingClientRect();m(t.left,t.bottom+4,B(g))};return(0,X.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,X.jsx)(`button`,{type:`button`,onClick:o,className:`ui-icon-button`,title:_(`projects.back`),"aria-label":_(`projects.back`),"data-testid":`project-detail-back`,children:(0,X.jsx)(s,{size:15,"aria-hidden":`true`})}),(0,X.jsxs)(`nav`,{className:`min-w-0 flex items-baseline gap-1.5 text-sm max-md:w-full`,children:[(0,X.jsx)(`button`,{type:`button`,onClick:o,className:`shrink-0 text-dark-muted transition-colors hover:text-dark-text`,children:_(`projects.title`)}),(0,X.jsx)(`span`,{className:`shrink-0 text-dark-muted/50`,"aria-hidden":`true`,children:`›`}),(0,X.jsx)(`button`,{type:`button`,onClick:c,disabled:!c,className:V(`min-w-0 truncate transition-colors`,c?`text-dark-muted hover:text-dark-text`:`cursor-default text-dark-text`),"data-testid":`project-detail-name`,children:e}),(0,X.jsx)(`span`,{className:`shrink-0 text-dark-muted/50`,"aria-hidden":`true`,children:`›`}),(0,X.jsx)(`button`,{type:`button`,onClick:c,disabled:!c,className:V(`min-w-0 truncate transition-colors`,c?`text-dark-muted hover:text-dark-text`:`cursor-default font-medium text-dark-text`),"data-testid":`project-detail-level`,children:a})]}),(0,X.jsxs)(`div`,{className:`ms-auto flex items-center gap-2 max-md:w-full max-md:justify-end`,children:[t&&(0,X.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,X.jsxs)(`button`,{type:`button`,onClick:l,disabled:n,className:`btn shrink-0 text-meta disabled:cursor-not-allowed disabled:opacity-50`,title:n?_(`projects.openFolderDisabled`):t,"data-testid":`project-detail-open-folder`,children:[(0,X.jsx)(r,{size:12,"aria-hidden":`true`}),_(`projects.openFolder`)]}),(0,X.jsxs)(`button`,{type:`button`,onClick:u,disabled:n,className:`btn shrink-0 text-meta disabled:cursor-not-allowed disabled:opacity-50`,title:_(n?`projects.newSessionDisabled`:`projects.newSessionHere`),"data-testid":`project-detail-new-session-btn`,children:[(0,X.jsx)(h,{size:12,"aria-hidden":`true`}),_(`projects.newSessionHere`)]}),(0,X.jsx)(`button`,{type:`button`,onClick:p,"aria-expanded":d,className:`ui-icon-button`,title:_(`projects.settings`),"aria-label":_(`projects.settings`),"data-testid":`project-detail-settings`,children:(0,X.jsx)(i,{size:14,"aria-hidden":`true`})}),(0,X.jsx)(`button`,{type:`button`,onClick:v,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),v(e))},className:`ui-icon-button`,title:_(`projects.moreActions`),"aria-label":_(`projects.moreActions`),"aria-haspopup":`menu`,"data-testid":`project-detail-more`,children:(0,X.jsx)(f,{size:14,"aria-hidden":`true`})})]})]})}),Ee=(0,Y.memo)(function({projectId:e,onOpenSession:n}){let{t:r}=T(),i=G(e=>e.managers),a=G(e=>e.fetchManagers),s=G(t=>t.residentByProject[e]??!1),[c,l]=(0,Y.useState)(!1),[d,f]=(0,Y.useState)(!1),[m,g]=(0,Y.useState)(null),[_,v]=(0,Y.useState)(``),[y,S]=(0,Y.useState)(null),[w,E]=U();(0,Y.useEffect)(()=>{a()},[a]);let O=(0,Y.useMemo)(()=>i.find(t=>t.projectKey===e)??null,[i,e]),k=G(e=>e.managersLoaded),A=O?.managerSessionIds??[],j=(0,Y.useCallback)(async()=>{if(c)return;l(!0);let t=await K(e);await a(),l(!1),t?n(t):D.error(r(`projects.pmCreateFailed`),5e3)},[c,e,a,n,r]),M=(0,Y.useCallback)(async()=>{if(d)return;f(!0);let t=await J(e,!0);await a(),f(!1),t?D.success(r(`projects.pmEnableDone`),3e3):D.error(r(`projects.pmEnableFailed`),5e3)},[d,e,a,r]),N=(0,Y.useCallback)(async(e,t)=>{g(null);let n=t.trim();n&&(await ae(e,n)?D.success(r(`projects.pmRenameDone`),2500):D.error(r(`projects.pmRenameFailed`),5e3))},[r]),P=(0,Y.useCallback)((e,t)=>{v(t??``),g(e)},[]),F=(0,Y.useCallback)(async t=>{if(y||!await E({message:r(`projects.pmDeleteConfirm`),variant:`danger`}))return;S(t);let n=await ie(e,t);S(null),n?D.success(r(`projects.pmDeleteDone`),3e3):D.error(r(`projects.pmDeleteFailed`),5e3)},[y,E,e,r]);return(0,X.jsxs)(`section`,{className:`flex min-h-0 flex-1 flex-col`,"aria-label":r(`projects.pmSessionList`),"data-testid":`pm-session-list`,children:[w,(0,X.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,X.jsx)(u,{size:14,className:V(`shrink-0`,s?`text-accent-green`:`text-dark-muted`),"aria-hidden":`true`}),(0,X.jsx)(`span`,{className:`text-xs font-medium text-dark-text`,children:r(`projects.pmSessionList`)}),(0,X.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:A.length})}),!s&&(0,X.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,X.jsxs)(`div`,{className:`ms-auto flex items-center gap-1.5 max-md:w-full max-md:justify-end`,children:[!s&&(0,X.jsx)(`button`,{type:`button`,onClick:()=>void M(),disabled:d,className:`btn shrink-0 text-meta disabled:opacity-50`,"data-testid":`pm-session-enable`,children:r(`projects.pmEnable`)}),(0,X.jsxs)(`button`,{type:`button`,onClick:()=>void j(),disabled:c,className:`btn btn-primary shrink-0 text-meta disabled:opacity-50`,title:r(`projects.pmNewSession`),"data-testid":`pm-new-session`,children:[(0,X.jsx)(h,{size:12,"aria-hidden":`true`}),r(`projects.pmNewSession`)]})]})]}),(0,X.jsx)(`p`,{className:`shrink-0 px-3 pb-2 text-meta leading-relaxed text-dark-muted`,children:r(`projects.pmSessionListHint`)}),(0,X.jsx)(`div`,{className:`board-ground min-h-0 flex-1 overflow-y-auto px-3 pb-3 custom-scrollbar`,children:(0,X.jsxs)(`div`,{className:`mx-auto flex max-w-[980px] flex-col gap-1.5`,children:[k&&A.length===0?(0,X.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,X.jsx)(`p`,{className:`text-xs text-dark-text`,children:r(`projects.emptyPmSessions`)}),(0,X.jsx)(`p`,{className:`mt-1 text-meta leading-relaxed text-dark-muted`,children:r(`projects.emptyPmSessionsHint`)})]}):null,A.map((e,i)=>{let a=i===0,c=!a,l=m===e,d=O?.sessionNames?.[e];return(0,X.jsx)(`div`,{className:`group relative`,children:l?(0,X.jsxs)(`div`,{className:`flex w-full items-center gap-2.5 rounded-lg border border-accent-blue/50 bg-dark-surface px-3 py-2`,children:[(0,X.jsx)(u,{size:13,"aria-hidden":`true`,className:V(`shrink-0`,s?`text-accent-green`:`text-dark-muted`)}),(0,X.jsx)(`input`,{autoFocus:!0,value:_,onChange:e=>v(e.target.value),onKeyDown:t=>{t.key===`Enter`?(t.preventDefault(),N(e,_)):t.key===`Escape`&&(t.preventDefault(),g(null))},maxLength:80,placeholder:q(A,e,r),"aria-label":r(`projects.pmRename`),className:`min-w-0 flex-1 rounded border border-dark-border bg-dark-bg px-1.5 py-0.5 text-xs text-dark-text outline-none placeholder:text-dark-muted/50 focus:border-accent-blue/60`,"data-testid":`pm-rename-input`,"data-session-id":e}),(0,X.jsx)(`button`,{type:`button`,onClick:()=>void N(e,_),"aria-label":r(`projects.pmRenameSave`),className:`rounded p-1 text-dark-muted hover:text-accent-green`,"data-testid":`pm-rename-save`,children:(0,X.jsx)(b,{size:13,"aria-hidden":`true`})}),(0,X.jsx)(`button`,{type:`button`,onClick:()=>g(null),"aria-label":r(`projects.pmRenameCancel`),className:`rounded p-1 text-dark-muted hover:text-dark-text`,"data-testid":`pm-rename-cancel`,children:(0,X.jsx)(x,{size:13,"aria-hidden":`true`})})]}):(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(`button`,{type:`button`,onClick:()=>n(e),className:V(`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`,c?`pe-16`:`pe-10`),"data-testid":`pm-session-row`,"data-session-id":e,children:[(0,X.jsx)(u,{size:13,"aria-hidden":`true`,className:V(`shrink-0`,s?`text-accent-green`:`text-dark-muted`)}),(0,X.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,X.jsxs)(`span`,{className:`flex items-center gap-1.5`,children:[(0,X.jsx)(`span`,{className:`truncate text-xs text-dark-text`,children:q(A,e,r,O?.sessionNames)}),a&&O?.isDuty&&(0,X.jsx)(`span`,{className:`shrink-0`,title:r(`projects.managerBadgeDuty`),children:(0,X.jsx)(t,{size:11,"aria-hidden":`true`,className:`text-accent-yellow`})})]}),(0,X.jsx)(`span`,{className:`mt-0.5 block truncate font-mono text-meta text-dark-muted/60`,title:e,children:e})]}),(0,X.jsx)(o,{size:13,"aria-hidden":`true`,className:`shrink-0 text-dark-muted opacity-40 transition-opacity group-hover:opacity-0`})]}),(0,X.jsxs)(`div`,{className:`absolute end-1.5 top-1/2 flex -translate-y-1/2 items-center gap-0.5 opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100`,children:[(0,X.jsx)(`button`,{type:`button`,onClick:()=>P(e,d),"aria-label":r(`projects.pmRename`),title:r(`projects.pmRename`),className:`rounded p-1 text-dark-muted transition-colors hover:bg-dark-hover/60 hover:text-dark-text`,"data-testid":`pm-rename-session`,"data-session-id":e,children:(0,X.jsx)(p,{size:12,"aria-hidden":`true`})}),c&&(0,X.jsx)(`button`,{type:`button`,onClick:()=>void F(e),disabled:y===e,"aria-label":r(`projects.pmDelete`),title:r(`projects.pmDelete`),className:V(`rounded p-1 text-dark-muted transition-colors hover:bg-dark-hover/60 hover:text-accent-red disabled:opacity-50`,y===e&&`opacity-100`),"data-testid":`pm-delete-session`,"data-session-id":e,children:(0,X.jsx)(C,{size:12,"aria-hidden":`true`})})]})]})},e)})]})})]})}),De=200;function Oe({isOpen:e,onClose:t,projectId:n,currentName:r}){let{t:i}=T(),a=N(e=>e.renameProject),[o,s]=(0,Y.useState)(r),[c,l]=(0,Y.useState)(!1);(0,Y.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?(D.success(i(`projects.renamed`),3e3),t()):D.error(s.error,6e3)};return(0,X.jsxs)(H,{isOpen:e,onClose:t,title:i(`projects.rename`),size:`sm`,children:[(0,X.jsx)(`label`,{className:`mb-1 block text-meta text-dark-text`,htmlFor:`project-rename-input`,children:i(`projects.renameLabel`)}),(0,X.jsx)(`input`,{id:`project-rename-input`,autoFocus:!0,value:o,maxLength:De,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,X.jsx)(`p`,{className:`mt-1.5 text-meta leading-relaxed text-dark-muted`,children:i(`projects.renameHint`)}),(0,X.jsxs)(`div`,{className:`mt-5 flex justify-end gap-3`,children:[(0,X.jsx)(O,{onClick:t,"data-testid":`project-rename-cancel`,children:i(`common.cancel`)}),(0,X.jsx)(O,{variant:`accent`,onClick:()=>void u(),loading:c,"data-testid":`project-rename-submit`,children:i(`common.confirm`)})]})]})}var ke=(0,Y.memo)(function({projectId:e,onBack:t,onOpenFolder:n,onCopyRoot:i,onNewSessionHere:o,onOpenSession:s,onLoadSession:c,pmSlashOptions:l,onStopSession:u,onPauseSession:d,onResumeSession:f,onHide:m}){let{t:_}=T(),[y,b]=(0,Y.useState)(!1),[x,S]=(0,Y.useState)(!1),{state:C,openAt:w,close:E}=te(),D=N(e=>e.detail),O=N(e=>e.openPmSessionId),k=N(e=>e.enterPmSession),A=N(e=>e.backToPmSessions),j=G(e=>e.managers);(0,Y.useEffect)(()=>{N.getState().openProject(e)},[e]),(0,Y.useEffect)(()=>{b(!1),S(!1)},[e]);let M=D?.project??null,P=M?!M.rootExists:!1,F=!M||P,I=(0,Y.useMemo)(()=>{if(!O)return _(`projects.pmSessionList`);let t=j.find(t=>t.projectKey===e);return q(t?.managerSessionIds??[],O,_,t?.sessionNames)},[O,j,e,_]),L=(0,Y.useMemo)(()=>{if(!M)return[];let e=[{kind:`item`,id:`copy-root`,label:_(`projects.copyRoot`),icon:v,onSelect:()=>i(M.root)}];return m&&e.push({kind:`item`,id:`hide-view`,label:_(P?`projects.removeView`:`projects.hide`),icon:a,onSelect:()=>m(M.projectId)}),e},[M,P,i,m,_]);return(0,X.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,"data-testid":`project-detail`,children:[(0,X.jsx)(Te,{projectName:M?.name??e,projectRoot:M?.root,missing:F,levelLabel:I,onBack:t,onBackToSessions:O?A:void 0,onOpenFolder:()=>M&&n(M.root),onNewSessionHere:()=>M&&o(M.root),settingsOpen:y,onToggleSettings:()=>b(e=>!e),onOpenMore:(e,t,n)=>w(e,t,null,{height:n}),moreItemsCount:L.length}),P&&M&&(0,X.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,X.jsx)(g,{size:12,className:`mt-[1px] shrink-0`,"aria-hidden":`true`}),(0,X.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,X.jsx)(`b`,{className:`font-semibold`,children:_(`projects.rootMissingTitle`)}),M&&(0,X.jsx)(`span`,{className:`mx-1 font-mono`,children:M.root}),(0,X.jsx)(`br`,{}),_(`projects.rootMissingBody`)]})]}),y&&M&&(0,X.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,X.jsx)($,{icon:(0,X.jsx)(r,{size:12,"aria-hidden":`true`}),label:_(`projects.openFolder`),hint:M.root,disabled:P,disabledHint:P?_(`projects.openFolderDisabled`):void 0,onClick:()=>n(M.root),testId:`project-settings-open-folder`}),(0,X.jsx)($,{icon:(0,X.jsx)(v,{size:12,"aria-hidden":`true`}),label:_(`projects.copyRoot`),hint:M.root,onClick:()=>i(M.root),testId:`project-settings-copy-root`}),(0,X.jsx)($,{icon:(0,X.jsx)(p,{size:12,"aria-hidden":`true`}),label:_(`projects.rename`),hint:M.name,onClick:()=>S(!0),testId:`project-settings-rename`}),(0,X.jsx)($,{icon:(0,X.jsx)(h,{size:12,"aria-hidden":`true`}),label:_(`projects.newSessionHere`),disabled:P,disabledHint:P?_(`projects.newSessionDisabled`):void 0,onClick:()=>M&&o(M.root),testId:`project-settings-new-session`})]}),(0,X.jsx)(`div`,{className:`flex min-h-0 min-w-0 flex-1`,children:(0,X.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,X.jsx)(we,{projectId:e,root:M?.root??e,sessionId:O,onOpenSession:s,onLoadSession:c,slashOptions:l,onStop:u,onPause:d,onResume:f}):(0,X.jsx)(Ee,{projectId:e,onOpenSession:k})})}),(0,X.jsx)(z,{items:L,position:C?{x:C.x,y:C.y}:null,anchor:C?.anchor??null,onClose:E,ariaLabel:_(`projects.moreActions`)}),M&&(0,X.jsx)(Oe,{isOpen:x,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,X.jsxs)(`button`,{type:`button`,onClick:a,disabled:r,className:V(`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,X.jsx)(`span`,{className:`shrink-0`,children:e}),(0,X.jsx)(`span`,{className:`shrink-0`,children:t}),(0,X.jsx)(`span`,{className:`ms-auto min-w-0 truncate font-mono text-badge text-dark-muted/70`,children:r?i:n})]})}var Ae=250,je=(0,Y.memo)(function({workspaceDir:e,onNewSessionHere:t,onOpenSession:n,onLoadSession:r,pmSlashOptions:i,onStopSession:o,onPauseSession:s,onResumeSession:c}){let{t:u}=T(),{projects:f,hiddenProjects:p,hiddenCount:m,query:h,sort:_,loading:v,lastError:b,disabled:C,setQuery:w,setSort:E,openProjectId:O,enterProject:k,backToProjectList:A,createProject:j,hideProject:M,unhideProjects:N,refresh:F}=le(),[I,L]=(0,Y.useState)(!1),[R,z]=(0,Y.useState)(!1),[te,B]=(0,Y.useState)(!1),[H,U]=(0,Y.useState)(h),W=(0,Y.useRef)(null);(0,Y.useEffect)(()=>{U(h)},[h]),(0,Y.useEffect)(()=>()=>{W.current&&clearTimeout(W.current)},[]);let re=e=>{U(e),W.current&&clearTimeout(W.current),W.current=setTimeout(()=>w(e),Ae)},[ie,G]=(0,Y.useState)(()=>Date.now());(0,Y.useEffect)(()=>{let e=setInterval(()=>G(Date.now()),3e4);return()=>clearInterval(e)},[]);let ae=(0,Y.useMemo)(()=>P,[]),K=e=>{ee.openFolder(e).then(e=>{e.ok||D.error(e.error||u(`projects.openFolderFailed`),5e3)})},q=e=>{let t=navigator.clipboard?.writeText(e);t&&t.then(()=>D.success(u(`projects.copied`),2e3),()=>D.error(u(`projects.copyFailed`),4e3))};return C?(0,X.jsx)(`div`,{className:`flex h-full items-center justify-center p-6 max-md:p-3`,"data-testid":`projects-disabled`,children:(0,X.jsxs)(`div`,{className:`max-w-md rounded-xl border border-dark-border bg-dark-surface p-4 text-center`,children:[(0,X.jsx)(S,{size:18,className:`mx-auto text-dark-muted`,"aria-hidden":`true`}),(0,X.jsx)(`p`,{className:`mt-2 text-xs leading-relaxed text-dark-muted`,children:u(`projects.disabled`)})]})}):(0,X.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,"data-testid":`projects-view`,children:[O?(0,X.jsx)(ke,{projectId:O,onBack:A,onOpenFolder:K,onCopyRoot:q,onNewSessionHere:t,onOpenSession:n,onLoadSession:r,pmSlashOptions:i,onStopSession:o,onPauseSession:s,onResumeSession:c,onHide:e=>{M(e),D.info(u(`projects.hiddenToast`),4e3),A()}}):(0,X.jsxs)(X.Fragment,{children:[(0,X.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,X.jsx)(`span`,{className:`text-sm font-medium text-dark-text`,children:u(`projects.title`)}),(0,X.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:u(`projects.projectCount`,{count:f.length})}),(0,X.jsx)(`div`,{className:`ms-1 flex items-center rounded-md bg-dark-hover/60 p-0.5 max-md:ms-0`,role:`group`,children:ae.map(e=>(0,X.jsx)(`button`,{type:`button`,onClick:()=>E(e),"aria-pressed":_===e,className:V(`shrink-0 rounded px-1.5 py-0.5 text-meta transition-colors`,_===e?`bg-dark-surface text-dark-text`:`text-dark-muted hover:text-dark-text`),"data-testid":`projects-sort-${e}`,children:u(`projects.sort.${e}`)},e))}),(0,X.jsxs)(`div`,{className:`ms-auto flex items-center gap-1 max-md:w-full max-md:justify-end`,children:[(0,X.jsx)(`button`,{type:`button`,onClick:F,disabled:v,className:`ui-icon-button disabled:opacity-50`,title:u(`common.refresh`),"aria-label":u(`common.refresh`),"data-testid":`projects-refresh`,children:(0,X.jsx)(y,{size:14,className:V(v&&`animate-spin`),"aria-hidden":`true`})}),(0,X.jsxs)(`button`,{type:`button`,onClick:()=>L(!0),disabled:te,className:`btn btn-primary shrink-0 text-meta disabled:opacity-60`,title:u(`projects.newHint`),"data-testid":`projects-new`,children:[(0,X.jsx)(l,{size:13,"aria-hidden":`true`}),u(`projects.new`)]})]})]}),b&&(0,X.jsx)(`div`,{className:`shrink-0 px-3 pt-2`,"data-testid":`projects-status-banner`,children:(0,X.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,X.jsx)(g,{size:12,className:`mt-[1px] shrink-0`,"aria-hidden":`true`}),(0,X.jsx)(`span`,{className:`min-w-0 flex-1`,children:u(`projects.loadFailed`,{message:b})}),(0,X.jsx)(`button`,{type:`button`,onClick:F,className:`shrink-0 underline hover:no-underline`,"data-testid":`projects-retry`,children:u(`projects.retry`)})]})}),m>0&&(0,X.jsx)(`div`,{className:`shrink-0 px-3 pt-2`,"data-testid":`projects-hidden-banner`,children:(0,X.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,X.jsx)(a,{size:11,className:`shrink-0`,"aria-hidden":`true`}),(0,X.jsx)(`span`,{className:`min-w-0 flex-1`,children:u(`projects.hiddenCount`,{count:m})}),(0,X.jsx)(`button`,{type:`button`,onClick:()=>z(!0),className:`shrink-0 underline hover:no-underline`,"data-testid":`projects-unhide`,children:u(`projects.unhide`)})]})}),(0,X.jsx)(`div`,{className:`board-ground min-h-0 flex-1 overflow-y-auto px-3 py-3 custom-scrollbar`,children:(0,X.jsxs)(`div`,{className:`mx-auto flex max-w-[980px] flex-col`,children:[(0,X.jsx)(`h1`,{className:`text-lg font-semibold text-dark-text`,children:u(`projects.title`)}),(0,X.jsx)(`p`,{className:`mt-0.5 text-xs leading-relaxed text-dark-muted`,children:u(`projects.subtitle`)}),(0,X.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,X.jsx)(d,{size:13,className:`shrink-0 text-dark-muted`,"aria-hidden":`true`}),(0,X.jsx)(`input`,{type:`text`,value:H,onChange:e=>re(e.target.value),placeholder:u(`projects.searchPlaceholder`),"aria-label":u(`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`}),H&&(0,X.jsx)(`button`,{type:`button`,onClick:()=>re(``),className:`shrink-0 rounded p-0.5 text-dark-muted transition-colors hover:text-dark-text`,"aria-label":u(`projects.searchClear`),"data-testid":`projects-search-clear`,children:(0,X.jsx)(x,{size:12,"aria-hidden":`true`})}),(0,X.jsx)(`span`,{className:`shrink-0 text-badge text-dark-muted/70`,children:u(`projects.serverFilterHint`)})]}),f.length===0?h.trim()?(0,X.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,X.jsx)(`p`,{className:`text-xs text-dark-text`,children:u(`projects.searchEmpty`)}),(0,X.jsx)(`p`,{className:`mt-1 text-meta leading-relaxed text-dark-muted`,children:u(`projects.searchEmptyHint`,{q:h.trim()})})]}):(0,X.jsxs)(`div`,{className:`mt-6 rounded-xl border border-dashed border-dark-border/60 py-8 text-center`,"data-testid":`projects-empty`,children:[(0,X.jsx)(`p`,{className:`text-xs text-dark-text`,children:u(`projects.empty`)}),(0,X.jsx)(`p`,{className:`mt-1 text-meta leading-relaxed text-dark-muted`,children:u(`projects.emptyHint`)})]}):(0,X.jsxs)(X.Fragment,{children:[(0,X.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,X.jsx)(`span`,{className:`shrink-0`,children:u(`projects.yourProjects`)}),(0,X.jsx)(`span`,{className:`h-px flex-1 bg-dark-border/60`,"aria-hidden":`true`})]}),(0,X.jsx)(`div`,{className:`flex flex-col gap-1.5`,"data-testid":`projects-list`,children:f.map(e=>(0,X.jsx)(me,{project:e,onOpen:k,onOpenFolder:K,onCopyRoot:q,onHide:e=>{M(e),D.info(u(`projects.hiddenToast`),4e3)},now:ie},e.projectId))})]})]})})]}),(0,ce.createPortal)((0,X.jsx)(ue,{isOpen:R,projects:p,onClose:()=>z(!1),onRestore:e=>{N(e),D.success(u(`projects.hiddenRestored`,{count:e.length}),3e3)}}),document.body),(0,ce.createPortal)((0,X.jsx)(ne,{isOpen:I,initial:e||``,onClose:()=>L(!1),onConfirm:e=>{L(!1),B(!0),j(e).then(async e=>{if(!e.ok){B(!1),D.error(e.error,6e3);return}e.projectId&&k(e.projectId);let t=e.projectId?await J(e.projectId,!0):!1;B(!1),t?D.success(u(`projects.created`),3e3):D.error(u(`projects.createdNoPm`),6e3)})}}),document.body)]})});export{je as ProjectsView};