@mydot/cli 1.0.41 → 1.0.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -17
- package/package.json +9 -9
- package/web/dist/assets/AssistantsView-Ct3BBpYf.js +1 -0
- package/web/dist/assets/AutomationView-CO-jVhee.js +3 -0
- package/web/dist/assets/ChannelConfigView-Ct1W584x.js +8 -0
- package/web/dist/assets/ChartsView-CAc37Sam.js +1 -0
- package/web/dist/assets/ConnectorsView-DP4bbh58.js +1 -0
- package/web/dist/assets/FileTreeView-DwsYfssO.js +1 -0
- package/web/dist/assets/HookConfigView-uFsqieii.js +2 -0
- package/web/dist/assets/InputArea-BY8quOiH.js +14 -0
- package/web/dist/assets/MemoryView-Bgd_lcTf.js +1 -0
- package/web/dist/assets/{MessageBubble-CV16DZMG.js → MessageBubble-CVGXupVH.js} +20 -20
- package/web/dist/assets/ModelsView-B271UV9L.js +1 -0
- package/web/dist/assets/PluginsView-Dz4fqQR1.js +2 -0
- package/web/dist/assets/ProjectsView-DF-YCV8y.js +1 -0
- package/web/dist/assets/SessionGrid-BIREstN2.js +4 -0
- package/web/dist/assets/SettingsModal-ZJeoZcCd.js +4 -0
- package/web/dist/assets/SkillsView-CH2ghYL2.js +1 -0
- package/web/dist/assets/TemplatesTab-BGe7_67s.js +1 -0
- package/web/dist/assets/ThreadsView-XditIHZ4.js +2 -0
- package/web/dist/assets/ToolsView-BBzsFdVZ.js +1 -0
- package/web/dist/assets/{agentIconSet-Btsb_SC4.js → agentIconSet-B5GUQwel.js} +1 -1
- package/web/dist/assets/{api-CCt9DRQm.js → api-plEYhRn0.js} +1 -1
- package/web/dist/assets/common-Bbatsa0-.js +192 -0
- package/web/dist/assets/{icons-BvYhTENi.js → icons-CYDRRPKW.js} +1 -1
- package/web/dist/assets/index-CTbLW314.js +133 -0
- package/web/dist/assets/index-DdzVrZye.css +1 -0
- package/web/dist/assets/{markdown-DAQZeY5V.js → markdown-N5__3T-w.js} +1 -1
- package/web/dist/assets/{panels-DYiQiVWh.js → panels-CIPgN61N.js} +1 -1
- package/web/dist/assets/{react-vendor-BlngCquv.js → react-vendor-CB4cLN-6.js} +1 -1
- package/web/dist/assets/settingsStore-Xqln0d91.js +1 -0
- package/web/dist/assets/{state-_ZfNVAsd.js → state-CSZ50keL.js} +1 -1
- package/web/dist/assets/sttLanguages-CSNMgUTz.js +2 -0
- package/web/dist/assets/ttsSettings-BwXYpDnk.js +2 -0
- package/web/dist/assets/useConfirm-Da8iQ_DZ.js +1 -0
- package/web/dist/assets/{useTranslation-BGmCDuQI.js → useTranslation-B-mfApCn.js} +1 -1
- package/web/dist/assets/{websocket-C9e3h7VU.js → websocket-BnDwh01e.js} +1 -1
- package/web/dist/assets/whatsNewStore-LpdLRLGl.js +1 -0
- package/web/dist/index.html +18 -18
- package/web/dist/vendor/MANIFEST.json +24 -0
- package/web/dist/vendor/d3.min.js +2 -0
- package/web/dist/vendor/echarts.min.js +45 -0
- package/web/dist/assets/AssistantsView-dhdYVIy0.js +0 -1
- package/web/dist/assets/AutomationView-D1dU5ZV7.js +0 -1
- package/web/dist/assets/ChannelConfigView-CEPVZntU.js +0 -8
- package/web/dist/assets/ChartsView-DdN-beHW.js +0 -1
- package/web/dist/assets/ConnectorsView-CseCss9C.js +0 -1
- package/web/dist/assets/FileTreeView-Dnc3-gRF.js +0 -1
- package/web/dist/assets/HookConfigView-DA2h4HdJ.js +0 -1
- package/web/dist/assets/InputArea-DAgOOjOc.js +0 -14
- package/web/dist/assets/MemoryView-D6OUBi4-.js +0 -1
- package/web/dist/assets/ModelsView-BuqD9vWl.js +0 -1
- package/web/dist/assets/PluginsView-CIziDHFJ.js +0 -2
- package/web/dist/assets/ProjectsView-c6faWy32.js +0 -1
- package/web/dist/assets/SessionGrid-BZJHcklh.js +0 -4
- package/web/dist/assets/SettingsModal-BqdGEGW-.js +0 -4
- package/web/dist/assets/SkillsView-CB6CKkmb.js +0 -1
- package/web/dist/assets/TemplatesTab-B8efVwVZ.js +0 -1
- package/web/dist/assets/ThreadsView-CDoM0aNb.js +0 -2
- package/web/dist/assets/ToolsView-BG-xsWsO.js +0 -1
- package/web/dist/assets/cn-rx4uumOJ.js +0 -1
- package/web/dist/assets/common-BHXgEvgk.js +0 -192
- package/web/dist/assets/index-BNI6CNsY.css +0 -1
- package/web/dist/assets/index-BX-d2OBW.js +0 -130
- package/web/dist/assets/settingsStore-RLUAWgIk.js +0 -1
- package/web/dist/assets/sttLanguages-aqoVC79g.js +0 -2
- package/web/dist/assets/ttsSettings-DHo3OsOq.js +0 -15
- package/web/dist/assets/whatsNewStore-Bf_7lW8o.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{Bn as t,Cr as n,Kr as r,Wn as i,_ as a,_t as o,a as s,br as c,h as l,jr as u,k as d,lt as f,mr as p,n as m,nt as h,o as g,q as _,tn as ee,ut as te,xr as v}from"./icons-CYDRRPKW.js";import{t as y}from"./useTranslation-B-mfApCn.js";import{a as ne,c as b,r as re,s as x,t as ie}from"./useConfirm-Da8iQ_DZ.js";import{t as ae}from"./src-49LUQhkG.js";import{l as oe}from"./workspaceSemantics-RaIRer76.js";import{t as S}from"./api-plEYhRn0.js";import{I as C}from"./markdown-N5__3T-w.js";import{c as se,d as ce,f as le}from"./common-Bbatsa0-.js";import{d as w,f as T,u as ue}from"./index-CTbLW314.js";var E=e(r(),1),D=C();function O(e){return e==null?``:String(e)}function de({provider:e,modelId:t,current:n,catalog:r,onSaved:i,className:a}){let{t:o}=y(),[s,c]=(0,E.useState)(!1),[l,u]=(0,E.useState)({input:O(n?.input),output:O(n?.output),cacheRead:O(n?.cacheRead),cacheWrite:O(n?.cacheWrite)}),d=(0,E.useRef)(!1),f=`${n?.input??``}|${n?.output??``}|${n?.cacheRead??``}|${n?.cacheWrite??``}`;(0,E.useEffect)(()=>{d.current||u({input:O(n?.input),output:O(n?.output),cacheRead:O(n?.cacheRead),cacheWrite:O(n?.cacheWrite)})},[f]);let p=(0,E.useMemo)(()=>(r.input??0)>0||(r.output??0)>0?{input:String(r.input),output:String(r.output),cacheRead:String(r.cacheRead||r.input),cacheWrite:String(r.cacheWrite||r.input)}:{input:`—`,output:`—`,cacheRead:`—`,cacheWrite:`—`},[r.input,r.output,r.cacheRead,r.cacheWrite]),m=async()=>{let r={};for(let e of[`input`,`output`,`cacheRead`,`cacheWrite`]){let t=l[e].trim();if(t===``)continue;let n=Number(t);if(!Number.isFinite(n)||n<0){b.error(o(`models.priceInvalid`,{field:o(`models.price_${e}`)}));return}r[e]=n}let a=Object.keys(r).length===0;if((n?.input??void 0)!==r.input||(n?.output??void 0)!==r.output||(n?.cacheRead??void 0)!==r.cacheRead||(n?.cacheWrite??void 0)!==r.cacheWrite){c(!0),d.current=!0;try{await S.models.update(e,t,{model:{pricing:a?null:r}}),b.success(o(`models.priceSaved`,{model:t})),i?.()}catch(e){b.error(e instanceof Error?e.message:o(`models.priceSaveFailed`))}finally{c(!1),window.setTimeout(()=>{d.current=!1},0)}}};return(0,D.jsxs)(`div`,{className:x(`flex flex-wrap items-center gap-2 text-xs`,a),children:[(0,D.jsx)(`span`,{className:`text-dark-muted whitespace-nowrap`,title:o(`models.priceHint`),children:o(`models.priceOverride`)}),[`input`,`output`,`cacheRead`,`cacheWrite`].map(e=>(0,D.jsxs)(`label`,{className:`flex items-center gap-1`,children:[(0,D.jsx)(`span`,{className:`text-dark-tertiary whitespace-nowrap`,children:o(`models.price_${e}`)}),(0,D.jsx)(`input`,{type:`number`,min:0,step:`0.001`,inputMode:`decimal`,value:l[e],placeholder:p[e],disabled:s,onChange:t=>u(n=>({...n,[e]:t.target.value})),onBlur:()=>void m(),onKeyDown:e=>{e.key===`Enter`&&m()},className:x(`w-20 rounded border bg-dark-bg px-1.5 py-0.5 text-xs text-dark-text disabled:opacity-50`,l[e].trim()===``?`border-dark-border`:`border-accent-yellow`),title:`${o(`models.price_${e}`)} · ${o(`models.pricePerMillion`)}`})]},e)),(0,D.jsx)(`span`,{className:`text-badge text-dark-tertiary`,children:o(`models.pricePerMillion`)})]})}function k(e){return e==null?``:String(e)}function A(e){let t=e.trim();if(t===``)return null;let n=Number(t);return!Number.isFinite(n)||n<=0?`invalid`:Math.floor(n)}function fe({provider:e,modelId:t,current:n,defaults:r,onSaved:i,className:a}){let{t:o}=y(),[s,c]=(0,E.useState)(!1),[l,u]=(0,E.useState)({maxInput:k(n?.contextWindow),maxOutput:k(n?.maxTokens)}),d=(0,E.useRef)(!1),f=`${n?.contextWindow??``}|${n?.maxTokens??``}`;(0,E.useEffect)(()=>{d.current||u({maxInput:k(n?.contextWindow),maxOutput:k(n?.maxTokens)})},[f]);let p=async()=>{let r=A(l.maxInput),a=A(l.maxOutput);if(r===`invalid`||a===`invalid`)b.error(o(`models.budgetInvalid`,{field:o(r===`invalid`?`models.maxInputTokensLabel`:`models.maxOutputTokensLabel`)}));else if((n?.contextWindow??null)!==r||(n?.maxTokens??null)!==a){c(!0),d.current=!0;try{await S.models.update(e,t,{model:{contextWindow:r,maxTokens:a}}),b.success(o(`models.budgetSaved`,{model:t})),i?.()}catch(e){b.error(e instanceof Error?e.message:o(`models.budgetSaveFailed`))}finally{c(!1),window.setTimeout(()=>{d.current=!1},0)}}},m=[{key:`maxInput`,label:o(`models.maxInputTokensLabel`),title:o(`models.maxInputTokensTitle`),placeholder:String(r.input)},{key:`maxOutput`,label:o(`models.maxOutputTokensLabel`),title:o(`models.maxOutputTokensTitle`),placeholder:String(r.output)}];return(0,D.jsxs)(`div`,{className:x(`flex flex-wrap items-center gap-2 text-xs`,a),children:[(0,D.jsx)(`span`,{className:`text-dark-muted whitespace-nowrap`,children:o(`models.budgetLabel`)}),m.map(e=>(0,D.jsxs)(`label`,{className:`flex items-center gap-1`,children:[(0,D.jsx)(`span`,{className:`text-dark-tertiary whitespace-nowrap`,children:e.label}),(0,D.jsx)(`input`,{type:`number`,min:1,step:`1`,inputMode:`numeric`,value:l[e.key],placeholder:e.placeholder,disabled:s,onChange:t=>u(n=>({...n,[e.key]:t.target.value})),onBlur:()=>void p(),onKeyDown:e=>{e.key===`Enter`&&p()},className:x(`w-24 rounded border bg-dark-bg px-1.5 py-0.5 text-xs text-dark-text disabled:opacity-50`,l[e.key].trim()===``?`border-dark-border`:`border-accent-yellow`),title:`${e.title} ${o(`models.budgetBlankHint`)}`})]},e.key)),(0,D.jsx)(`span`,{className:`text-badge text-dark-tertiary`,children:o(`models.budgetBlankHint`)})]})}function pe({modelId:e,className:t}){let{t:n}=y(),r=se(e=>e.kinds),i=se(e=>e.entries),a=se(e=>e.saving),o=se(e=>e.saveEntry),s=se(e=>e.load);if((0,E.useEffect)(()=>{s()},[s]),r.length===0)return null;let c=e=>{let t=r.find(t=>t.id===e);return t?.labelKey?n(t.labelKey):e},l=async t=>{let r=i[t],a=r?.model===e,s=r?.model,l={...r??{}};a?(delete l.model,delete l.provider):l.model=e;let u=Object.values(l).some(e=>e!==void 0);await o(t,u?l:null)&&(a?b.success(n(`models.kindUnboundToast`,{kind:c(t),model:e})):s&&s!==e?b.success(n(`models.kindRebindToast`,{kind:c(t),from:s,to:e})):b.success(n(`models.kindBoundToast`,{kind:c(t),model:e})))};return(0,D.jsxs)(`div`,{className:x(`flex flex-wrap items-center gap-1.5 text-xs`,t),children:[(0,D.jsx)(`span`,{className:`text-dark-muted whitespace-nowrap`,title:n(`models.kindTagsHint`),children:n(`models.kindTags`)}),r.map(t=>{let r=i[t.id]?.model,o=r===e,s=!o&&r?r:null;return(0,D.jsx)(`button`,{type:`button`,disabled:a,onClick:()=>void l(t.id),title:s?n(`models.kindTakenHint`,{kind:c(t.id),model:s}):n(`models.kindTagsHint`),className:x(`px-1.5 py-0.5 rounded border transition-colors disabled:opacity-50`,o?`bg-accent-blue/20 border-accent-blue text-accent-blue font-medium`:s?`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:c(t.id)},t.id)})]})}var j=46,me=132;function M({points:e,showValueLabels:t=!1}){let{t:n}=y();if(e.length===0)return(0,D.jsx)(`div`,{className:`flex h-32 items-center justify-center text-xs text-dark-muted`,children:n(`insights.noUsageData`)});let r=Math.max(...e.map(e=>e.totalTokens),1),i=Math.max(...e.filter(e=>e.priced).map(e=>e.costDollars),0),a=e.length*j,o=e=>e<=0?0:Math.max(2,e/r*94),s=e=>i<=0?110:110-e/i*94,c=[],l=!1;return e.forEach((e,t)=>{let n=t*j+j/2;if(!e.priced){l=!1;return}let r=s(e.costDollars);c.push(`${l?`L`:`M`} ${n.toFixed(1)} ${r.toFixed(1)}`),l=!0}),(0,D.jsxs)(`div`,{className:`overflow-x-auto`,children:[(0,D.jsxs)(`svg`,{width:a,height:me,className:`min-w-full`,role:`img`,"aria-label":n(`insights.usageTrend`),children:[e.map((e,r)=>{let i=r*j+j/2,a=o(e.totalTokens);return(0,D.jsxs)(`g`,{children:[(0,D.jsx)(`rect`,{x:i-11,y:110,width:22,height:1,className:`fill-dark-border`}),a>0&&(0,D.jsx)(`rect`,{"data-testid":`daily-bar`,"data-day":e.day,x:i-11,y:110-a,width:22,height:a,rx:2,className:`fill-accent-blue/70`,children:(0,D.jsx)(`title`,{children:`${e.day} · ${w(e.totalTokens)} token · ${e.priced?T(e.costDollars):n(`insights.costUnknown`)}`})}),t&&e.totalTokens>0&&(0,D.jsx)(`text`,{"data-testid":`daily-value`,x:i,y:110-a-4,textAnchor:`middle`,className:e.priced?`fill-dark-text`:`fill-dark-muted`,style:{fontSize:9},children:e.priced?T(e.costDollars):`—`}),(0,D.jsx)(`text`,{x:i,y:123,textAnchor:`middle`,className:`fill-dark-muted`,style:{fontSize:9},children:e.day.slice(5)})]},e.day)}),c.length>0&&(0,D.jsx)(`path`,{d:c.join(` `),fill:`none`,className:`stroke-accent-green`,strokeWidth:1.6,strokeLinejoin:`round`,strokeLinecap:`round`})]}),(0,D.jsxs)(`div`,{className:`mt-1 flex items-center gap-3 text-badge text-dark-muted`,children:[(0,D.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,D.jsx)(`span`,{className:`inline-block h-2 w-2 rounded-sm bg-accent-blue/70`}),n(`insights.legendTokens`)]}),(0,D.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,D.jsx)(`span`,{className:`inline-block h-0.5 w-3 bg-accent-green`}),n(`insights.legendCost`)]})]})]})}var he=14,N=`dsc.models.usageCollapsed`;function ge(){try{return window.localStorage.getItem(N)===`1`}catch{return!1}}function _e(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function P(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}}function ve({className:e}){let{t}=y(),[r,i]=(0,E.useState)(null),[a,o]=(0,E.useState)(!1),[s,c]=(0,E.useState)(null),[l,u]=(0,E.useState)(0),[d,f]=(0,E.useState)(ge),p=()=>{f(e=>{let t=!e;try{window.localStorage.setItem(N,t?`1`:`0`)}catch{}return t})};(0,E.useEffect)(()=>{let e=()=>u(e=>e+1);return window.addEventListener(`models-updated`,e),()=>window.removeEventListener(`models-updated`,e)},[]),(0,E.useEffect)(()=>{let e=!1;return o(!0),c(null),(async()=>{try{let n=await S.observability.costs();if(e)return;n.success&&n.data?i(n.data):c(n.error||t(`models.usageLoadFailed`))}catch(n){e||c(n instanceof Error?n.message:t(`models.usageLoadFailed`))}finally{e||o(!1)}})(),()=>{e=!0}},[l]);let m=(0,E.useMemo)(()=>{let e=new Map;for(let t of r?.daily??[]){let n=P(t);n&&e.set(n.day,n)}let t=[],n=new Date;for(let r=13;r>=0;r--){let i=_e(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]),g=(0,E.useMemo)(()=>{let e=0,t=0,n=0,r=0;for(let i of m)e+=i.totalTokens,t+=i.requests,n+=i.cacheReadTokens,r+=i.inputTokens;return{tokens:e,requests:t,inputTokens:r,cacheReadTokens:n}},[m]),_=(0,E.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]),ee=!!(r&&(r.totalCostDollars>0||g.tokens>0||(r.byModel?.length??0)>0));return(0,D.jsxs)(`div`,{className:x(`rounded-lg border border-dark-border bg-dark-surface/40 p-3`,e),children:[(0,D.jsxs)(`div`,{className:`mb-2 flex items-center justify-between gap-2`,children:[(0,D.jsxs)(`button`,{type:`button`,onClick:p,"aria-expanded":!d,className:`inline-flex min-w-0 items-center gap-1.5 text-sm font-medium hover:text-accent-blue`,title:t(d?`common.expand`:`common.collapse`),children:[d?(0,D.jsx)(v,{size:14,className:`shrink-0 text-dark-muted`}):(0,D.jsx)(n,{size:14,className:`shrink-0 text-dark-muted`}),(0,D.jsx)(`span`,{className:`truncate`,children:t(`models.usageTitle`)})]}),(0,D.jsxs)(`div`,{className:`flex items-center gap-2`,children:[d&&ee&&(0,D.jsxs)(`span`,{className:`text-badge tabular-nums text-dark-muted`,children:[T(r.totalCostDollars),(0,D.jsx)(`span`,{className:`mx-1 opacity-60`,children:`·`}),w(g.tokens)]}),(0,D.jsxs)(`button`,{type:`button`,onClick:()=>u(e=>e+1),disabled:a,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,D.jsx)(h,{size:11,className:a?`animate-spin`:void 0}),t(`models.usageRefresh`)]})]})]}),s&&(0,D.jsx)(`div`,{className:`text-xs text-accent-red`,children:s}),!s&&!ee&&!a&&(0,D.jsx)(`div`,{className:`py-6 text-center text-xs text-dark-muted`,children:t(`models.usageEmpty`)}),ee&&!d&&(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)(`div`,{className:`mb-3 grid grid-cols-2 gap-2 sm:grid-cols-4`,children:[(0,D.jsx)(ye,{label:t(`models.usageTotalCost`),value:T(r.totalCostDollars),tone:`cost`}),(0,D.jsx)(ye,{label:t(`models.usageWindowTokens`,{days:he}),value:w(g.tokens)}),(0,D.jsx)(ye,{label:t(`models.usageWindowRequests`,{days:he}),value:String(g.requests)}),(0,D.jsx)(ye,{label:t(`models.usageCacheHitRate`),value:ue(g.cacheReadTokens,g.inputTokens,0)})]}),(0,D.jsx)(`div`,{className:`mb-1 flex items-baseline justify-between`,children:(0,D.jsx)(`span`,{className:`text-badge text-dark-muted`,children:t(`models.usageDailyTitle`)})}),(0,D.jsx)(M,{points:m,showValueLabels:!0}),_.rows.length>0&&(0,D.jsxs)(`div`,{className:`mt-3 border-t border-dark-border/60 pt-2`,children:[(0,D.jsx)(`div`,{className:`mb-1 text-badge text-dark-muted`,children:t(`models.usageTopModels`)}),(0,D.jsx)(`div`,{className:`space-y-1`,children:_.rows.map(e=>(0,D.jsxs)(`div`,{className:`flex items-center gap-2 text-xs`,children:[(0,D.jsx)(`span`,{className:`w-40 shrink-0 truncate text-dark-text`,title:e.modelId,children:e.modelId}),(0,D.jsx)(`div`,{className:`h-2 flex-1 overflow-hidden rounded-full bg-dark-border/40`,children:(0,D.jsx)(`div`,{className:`h-full rounded-full bg-accent-purple/70`,style:{width:`${Math.max(1,e.totalCostDollars/_.maxCost*100)}%`}})}),(0,D.jsx)(`span`,{className:`w-20 shrink-0 text-end tabular-nums text-accent-yellow`,children:T(e.totalCostDollars)}),(0,D.jsx)(`span`,{className:`w-20 shrink-0 text-end tabular-nums text-dark-muted`,children:w(e.totalInputTokens+e.totalOutputTokens)}),(0,D.jsxs)(`span`,{className:`w-16 shrink-0 text-end tabular-nums text-dark-tertiary`,children:[e.requestCount,`×`]})]},e.modelId))})]}),m.some(e=>!e.priced&&!e.empty)&&(0,D.jsx)(`div`,{className:`mt-2 text-badge text-accent-yellow`,children:t(`models.usageCostUnknownHint`)})]})]})}function ye({label:e,value:t,tone:n}){return(0,D.jsxs)(`div`,{className:`rounded border border-dark-border/60 bg-dark-bg px-2 py-1.5`,children:[(0,D.jsx)(`div`,{className:`text-badge text-dark-muted truncate`,children:e}),(0,D.jsx)(`div`,{className:x(`text-sm font-semibold tabular-nums`,n===`cost`?`text-accent-yellow`:`text-dark-text`),children:t})]})}function be(){let[e,t]=(0,E.useState)([]),[n,r]=(0,E.useState)(`1.0`),[i,a]=(0,E.useState)(!0),[o,s]=(0,E.useState)(!0),[c,l]=(0,E.useState)(null),u=(0,E.useCallback)(async()=>{s(!0),l(null);try{let e=await S.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,E.useEffect)(()=>{u()},[u]),{presets:e,loading:o,error:c,version:n,customSupported:i,reload:u}}var xe=[{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 Se(e){let t=Number((e??``).trim());return Number.isFinite(t)&&t>0?Math.floor(t):null}var Ce={providerKey:``,apiKeys:[],modelIds:``,baseUrl:``,apiType:``,fullPath:!1,setDefault:!1,modelOverrides:{}},we=ae,Te={"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 F(e){return e.trim().split(`|`)[0].trim()}function Ee(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 De(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 Oe={"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 I(){let{presets:e,loading:n,reload:r}=be(),{t:v}=y(),[x,ae]=ie(),[C,se]=(0,E.useState)([]),[w,T]=(0,E.useState)(null),[ue,O]=(0,E.useState)(!0),[k,A]=(0,E.useState)(null),[j,me]=(0,E.useState)(null),[M,he]=(0,E.useState)(null),[N,ge]=(0,E.useState)([]),[_e,P]=(0,E.useState)(!1),[ye,I]=(0,E.useState)(`select`),[R,z]=(0,E.useState)(null),[B,V]=(0,E.useState)(Ce),[Ae,H]=(0,E.useState)(``),[je,Me]=(0,E.useState)(!1),[Ne,U]=(0,E.useState)(null),[Pe,Fe]=(0,E.useState)(!1),[Ie,Le]=(0,E.useState)(!1),[Re,ze]=(0,E.useState)(``),[Be,Ve]=(0,E.useState)(!1),[W,G]=(0,E.useState)([]),[He,K]=(0,E.useState)(new Set),[Ue,q]=(0,E.useState)(null),[We,Ge]=(0,E.useState)(``),[Ke,qe]=(0,E.useState)(!1),[Je,Ye]=(0,E.useState)(!1),[Xe,J]=(0,E.useState)(null),Ze=(0,E.useMemo)(()=>{let e=We.trim().toLowerCase();return e?W.filter(t=>t.id.toLowerCase().includes(e)||t.name.toLowerCase().includes(e)):W},[W,We]),Y=(0,E.useCallback)(async()=>{try{let e=await S.config.provider.get();e.success&&e.data&&(he(e.data),ge(Array.isArray(e.data.entries)?e.data.entries:[]))}catch{}},[]),X=(0,E.useCallback)(async()=>{O(!0),A(null);try{let[e,t]=await Promise.all([S.models.list(),S.system.status()]);if(await Y(),e.success&&e.data&&Array.isArray(e.data.models)&&se(e.data.models),t.success&&t.data){let e=t.data.models||{total:0,online:0,offline:0};T({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})}}catch{A(v(`models.loadFailed`))}finally{O(!1)}},[Y,v]);(0,E.useEffect)(()=>{X()},[X]),(0,E.useEffect)(()=>{let e=()=>{X(),Y()};return window.addEventListener(`models-updated`,e),()=>window.removeEventListener(`models-updated`,e)},[X,Y]);let Qe=(0,E.useCallback)(e=>`${e.provider}:${e.id}`,[]),Z=(0,E.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,E.useMemo)(()=>[...Z].sort((e,t)=>{if(e.isCustom)return-1;if(t.isCustom)return 1;let n=Oe[e.key],r=Oe[t.key];return n!==void 0&&r!==void 0?n-r:n===void 0?r===void 0?e.name.localeCompare(t.name):1:-1}),[Z]),et=(0,E.useMemo)(()=>{let e=Re.trim().toLowerCase();return e?$e.filter(t=>t.name.toLowerCase().includes(e)||t.key.toLowerCase().includes(e)||(t.defaultModel||``).toLowerCase().includes(e)||(t.baseUrl||``).toLowerCase().includes(e)||(t.models||[]).some(t=>String(t).toLowerCase().includes(e))):$e},[$e,Re]),Q=(0,E.useMemo)(()=>{let e=M?.providers||{},t=new Set(Z.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`}},[M,Z]),$=R===`custom`?B.providerKey.trim():R||``,tt=(0,E.useMemo)(()=>$?C.filter(e=>e.provider===$):[],[C,$]),nt=(0,E.useMemo)(()=>{let e=new Map;for(let t of C)e.has(t.provider)||e.set(t.provider,[]),e.get(t.provider).push(t);for(let t of N)e.has(t.key)||e.set(t.key,[]);let t=[...e.keys()];return t.sort((e,t)=>{let n=Oe[e],r=Oe[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)||[]}))},[C,N]),rt=(0,E.useCallback)(e=>{let t=M?.providers?.[e.key],n=N.find(t=>t.key===e.key),r=C.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;z(e.key),H(``),V({providerKey:e.key,apiKeys:[``],modelIds:a,baseUrl:t?.baseUrl||e.baseUrl,apiType:t?.apiType||e.apiType,fullPath:t?.fullPath===!0,setDefault:M?.defaultProvider!==e.key,modelOverrides:De(n)}),I(`form`),P(!0),U(null),Fe(!1),G([]),K(new Set),q(null),Ge(``)},[C,M,N]),it=(0,E.useCallback)(e=>{let t=M?.providers?.[e],n=N.find(t=>t.key===e),r=C.filter(t=>t.provider===e).map(e=>e.id).join(`, `);z(`custom`),H(e),V({providerKey:e,apiKeys:[``],modelIds:r,baseUrl:t?.baseUrl||``,apiType:t?.apiType||``,fullPath:t?.fullPath===!0,setDefault:M?.defaultProvider!==e,modelOverrides:De(n)}),U(null),Fe(!1),G([]),K(new Set),q(null),Ge(``)},[M,C,N]),at=(0,E.useCallback)(()=>{z(`custom`),H(``),V({providerKey:``,apiKeys:[``],modelIds:``,baseUrl:``,apiType:``,fullPath:!1,setDefault:!M?.configured,modelOverrides:{}}),I(`form`),P(!0),U(null),Fe(!1),G([]),K(new Set),q(null),Ge(``)},[M]),ot=(0,E.useCallback)(async()=>{let e=B.baseUrl;if(!e){q(v(`models.baseUrlRequired`));return}Ve(!0),q(null),G([]),K(new Set);let t=Z.find(e=>e.key===R)||null,n=!!t&&!t.isCustom&&(B.baseUrl||``)===t.baseUrl&&B.fullPath!==!0;try{let r=(B.apiKeys||[]).map(e=>e.trim()).filter(Boolean)[0]||``,i=r.replace(/[^\x00-\xFF]/g,``);i!==r&&b.warning(v(`models.apiKeySanitized`));let a=await S.models.fetch(e,i,B.fullPath===!0,n?t.key:void 0);if(a.success&&a.data?.models){let e=a.data.models;G(e),qe(!0);let t={};for(let n of e)n.protocol&&n.protocol!==B.apiType&&(t[n.id]={apiType:n.protocol});Object.keys(t).length>0&&V(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=B.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(K(new Set(i.map(e=>e.split(`|`)[0].trim()))),o.length>0){let e=o.map(e=>e.split(`|`)[0].trim());V(e=>({...e,modelIds:i.join(`, `)})),b.warning(v(`models.autoRemovedMissingModels`,{models:e.join(`, `)}))}b.success(v(`models.fetchedCount`,{n:e.length}))}else q(a.error||v(`models.fetchFailed`))}catch(e){q(e instanceof Error?e.message:v(`models.requestFailed`))}finally{Ve(!1)}},[B.baseUrl,B.apiKeys,B.modelIds,B.apiType,B.fullPath,R,Z,v]),st=(0,E.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:v(`models.${t}Label`),label:v(`models.${t}${i}`),hint:r===`supported`?``:v(`models.${t}Hint${i}`)}},[v]),ct=(0,E.useCallback)(async()=>{let e=B.baseUrl;if(!e){J({ok:!1,message:v(`models.baseUrlRequired`)});return}let t=F((B.modelIds||``).split(`,`)[0]||``);Ye(!0),J(null);try{let n=(B.apiKeys||[]).map(e=>e.trim()).filter(Boolean)[0]||``,r=n.replace(/[^\x00-\xFF]/g,``);r!==n&&b.warning(v(`models.apiKeySanitized`));let i=await S.providers.testConnection(e,r,t);if(i.success&&i.data?.reachable){let e=i.data,t={};e.resolvedBaseUrl&&e.resolvedBaseUrl!==B.baseUrl&&(t.baseUrl=e.resolvedBaseUrl),e.detectedApiType&&B.apiType===``&&(t.apiType=e.detectedApiType),Object.keys(t).length>0&&V(e=>({...e,...t}));let n=[];t.baseUrl&&n.push(v(`models.baseUrlAutoCompleted`,{url:t.baseUrl})),t.apiType&&n.push(v(`models.apiTypeAutoSelected`,{type:Te[t.apiType]}));let r=e.message||v(`models.connectionSuccess`),a=[st(`tools`,`toolProbe`,e.tools?.verdict),st(`jsonMode`,`jsonProbe`,e.jsonMode?.verdict)].filter(e=>e!==void 0);J({ok:!0,message:n.length>0?v(`models.connectionSuccessWithHints`,{message:r,hints:n.join(v(`models.hintJoiner`))}):r,probes:a})}else J({ok:!1,message:i.data?.message||i.error||v(`models.connectionFailed`)})}catch(e){J({ok:!1,message:e instanceof Error?e.message:v(`models.requestFailed`)})}finally{Ye(!1)}},[B.baseUrl,B.apiKeys,B.apiType,B.modelIds,st,v]),lt=(0,E.useCallback)(e=>{let t=new Set(He);t.has(e)?t.delete(e):t.add(e),K(t),V(e=>({...e,modelIds:Array.from(t).join(`, `)}))},[He]),ut=(0,E.useCallback)(e=>{let t=B.modelIds.split(`,`).map(e=>e.trim()).filter(Boolean),n=t.some(t=>F(t)===e.id)?t.filter(t=>F(t)!==e.id):[...t,e.name&&e.name!==e.id?`${e.id}|${e.name}`:e.id];V(e=>({...e,modelIds:n.join(`, `)}));let r=new Set(W.map(e=>e.id));K(new Set(n.map(F).filter(e=>r.has(e))))},[B.modelIds,W]),[dt,ft]=(0,E.useState)(!1),[pt,mt]=(0,E.useState)(``),[ht,gt]=(0,E.useState)([]),[_t,vt]=(0,E.useState)(!1),[yt,bt]=(0,E.useState)(null),[xt,St]=(0,E.useState)(!1),[Ct,wt]=(0,E.useState)(!0),Tt=(0,E.useCallback)(()=>{mt(``),gt([]),bt(null),ft(!0),Et(``,{reason:!1,tool:!0})},[]),Et=(0,E.useCallback)(async(e,t)=>{vt(!0),bt(null);try{let n=await S.models.catalogSearch({q:e,reasoning:t?.reason??!1,toolCall:t?.tool??!0,limit:30});n.success&&n.data?gt(n.data.hits||[]):(bt(n.error||v(`models.catalogSearchFailed`)),gt([]))}catch(e){bt(e instanceof Error?e.message:v(`models.requestFailed`)),gt([])}finally{vt(!1)}},[v]),Dt=(0,E.useCallback)(e=>{V(t=>{let n=t.modelIds.split(`,`).map(e=>e.trim()).filter(Boolean);if(n.includes(e.model.id))return t;let r=e.model.limit?.context,i=e.model.limit?.output,a={...t.modelOverrides[e.model.id]||{},...typeof r==`number`&&r>0?{maxInput:String(r)}:{},...typeof i==`number`&&i>0?{maxOutput:String(i)}:{}};return{...t,modelIds:[...n,e.model.id].join(`, `),modelOverrides:Object.keys(a).length>0?{...t.modelOverrides,[e.model.id]:a}:t.modelOverrides}}),b.success(v(`models.addedModel`,{id:e.model.id}))},[v]),[Ot,kt]=(0,E.useState)(null),At=(0,E.useCallback)(e=>{mt(e),Ot&&clearTimeout(Ot),kt(setTimeout(()=>{Et(e,{reason:xt,tool:Ct})},300))},[Ot,xt,Ct,Et]),jt=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 S.models.toggle(t,n);if(e.success){await X();return}let r=e.error||``;a(r)?b.error(v(`models.defaultModelDisableBlocked`,{name:i})):b.error(r||v(`models.operationFailed`))}catch(e){let t=e instanceof Error?e.message:``;a(t)?b.error(v(`models.defaultModelDisableBlocked`,{name:i})):b.error(t||v(`models.operationFailed`))}},Mt=async e=>{let t=Qe(e);me(t);try{await S.models.test(e.id),await X()}finally{me(null)}},Nt=async(e,t)=>{if(await ae({message:v(`models.deleteModelConfirm`,{id:t}),variant:`danger`}))try{(await S.models.delete(e,t)).success&&await X()}catch{}},Pt=(0,E.useCallback)(e=>{let t=N.find(t=>t.key===e),n=Z.find(t=>t.key===e),r=!n||n.isCustom,i=M?.providers?.[e];z(r?`custom`:e),H(r?e:``),V({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,setDefault:M?.defaultProvider!==e,modelOverrides:De(t)}),I(`form`),P(!0),U(null),Fe(!1),G([]),K(new Set),q(null),Ge(``)},[N,Z,M]),Ft=e=>{Pt(e.provider)},It=async()=>{let e=Z.find(e=>e.key===R)||null,t=R===`custom`?B.providerKey.trim():e?.key||``;if(!t){U(v(`models.providerNameRequired`));return}let n=(B.apiKeys||[]).map(e=>e.trim()).filter(Boolean),r=!!M?.providers?.[t]?.hasApiKey;if(n.length===0&&!r){U(v(`models.apiKeyRequired`));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=W.length>0?new Set(W.map(e=>e.id)):null,s=(B.modelIds||i.defaultModel||``).split(`,`).map(e=>e.trim()).filter(Boolean),c=o?s.filter(e=>o.has(e.split(`|`)[0].trim())):s,l=o?s.filter(e=>!o.has(e.split(`|`)[0].trim())):[];l.length>0&&b.warning(v(`models.autoSkippedMissingModels`,{models:l.map(e=>e.split(`|`)[0].trim()).join(`, `)}));let u=c.map(F).filter(Boolean),d=new Set;for(let e of C)e.provider!==t||u.includes(e.id)||(e.isGlobalDefault&&d.add(`global`),e.isGoalDefault&&d.add(`goal`));let f={provider:t,name:t,baseUrl:B.baseUrl||i.baseUrl,fullPath:B.fullPath===!0,apiType:B.apiType||Ee(B.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=B.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:Se(a?.maxInput),maxTokens:Se(a?.maxOutput)}}).filter(e=>e.id.length>0)};a.length>0&&(f.apiKeys=a),(!M?.configured||B.setDefault)&&(f.setDefault=!0),Me(!0),U(null);try{let e=await S.config.provider.save(f);if(e.success){if(d.size>0){let e=u[0]||``,n={};if(e){let r=`${t}:${e}`;for(let e of d)n[e]=r}else{let e=C.find(e=>e.provider!==t);for(let t of d)t===`goal`?n[t]=null:e&&(n[t]=`${e.provider}:${e.id}`)}Object.keys(n).length>0&&(await S.models.setDefaults(n)).success&&b.success(v(`models.defaultsAutoUpdated`))}P(!1),I(`select`),z(null),H(``),await Y(),await X()}else U(e.error||v(`models.saveFailed`))}catch(e){U(e instanceof Error?e.message:v(`models.unknownError`))}finally{Me(!1)}},Lt=async e=>{if(await ae({message:v(`models.removeConfirm`,{providerKey:e}),variant:`danger`}))try{await S.config.provider.delete(e),await Y(),await X()}catch{}},Rt=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`}},zt=e=>{switch(e){case`online`:return(0,D.jsx)(s,{size:14});case`offline`:return(0,D.jsx)(g,{size:14});case`error`:return(0,D.jsx)(l,{size:14});default:return(0,D.jsx)(g,{size:14})}},Bt=(0,E.useMemo)(()=>Z.find(e=>e.key===R)||null,[R,Z]);return ue?(0,D.jsx)(`div`,{className:`h-64 overflow-y-auto p-4`,role:`status`,"aria-label":v(`models.loading`),children:(0,D.jsx)(le,{count:4})}):k?(0,D.jsx)(`div`,{className:`flex h-64 items-center justify-center text-accent-red`,children:k}):(0,D.jsxs)(`div`,{className:`ui-page flex-1 min-h-0`,children:[x,(0,D.jsxs)(`div`,{className:`ui-page-inner space-y-6`,children:[(0,D.jsx)(ve,{}),(0,D.jsxs)(`div`,{children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between mb-3`,children:[(0,D.jsx)(`h2`,{className:`text-base font-semibold`,children:v(`models.providerConfig`)}),(0,D.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,D.jsxs)(`button`,{onClick:async()=>{try{await S.providers.refresh(),b.success(v(`models.providerListRefreshed`)),Le(!0),await r(),setTimeout(()=>{r()},3e3)}catch{b.error(v(`models.refreshFailed`))}},className:`btn btn-secondary px-3 py-2 text-xs`,title:v(`models.refreshListTitle`),children:[(0,D.jsx)(h,{size:12}),v(`models.refreshList`)]}),(0,D.jsxs)(`button`,{onClick:()=>{Ie&&ze(``),Le(e=>!e)},className:`btn btn-accent px-3 py-2 text-xs`,children:[Ie?(0,D.jsx)(c,{size:12}):(0,D.jsx)(f,{size:12}),v(Ie?`models.collapse`:`models.addProvider`)]})]})]}),Ie&&(0,D.jsxs)(`div`,{children:[(0,D.jsxs)(`div`,{className:`relative mb-3 max-w-md`,children:[(0,D.jsx)(_,{size:13,className:`absolute start-2.5 top-1/2 -translate-y-1/2 text-dark-muted`}),(0,D.jsx)(`input`,{value:Re,onChange:e=>ze(e.target.value),className:`w-full ps-8 pe-8 py-1.5 text-xs bg-dark-bg border border-dark-border rounded focus:outline-none focus:border-accent-blue`,placeholder:v(`models.providerSearchPlaceholder`)}),Re&&(0,D.jsx)(`button`,{onClick:()=>ze(``),className:`absolute end-2 top-1/2 -translate-y-1/2 text-dark-muted hover:text-dark-text`,title:v(`models.clear`),"aria-label":v(`models.clearSearch`),children:(0,D.jsx)(m,{size:13})})]}),(0,D.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,D.jsxs)(`div`,{className:`ui-card p-4`,"aria-hidden":`true`,children:[(0,D.jsx)(ce,{variant:`text`,width:`45%`,height:16,className:`mb-2`}),(0,D.jsx)(ce,{variant:`text`,width:`85%`,height:11,className:`mb-1.5`}),(0,D.jsx)(ce,{variant:`text`,width:`70%`,height:11,className:`mb-1.5`}),(0,D.jsx)(ce,{variant:`text`,width:`55%`,height:11})]},`preset-skeleton-${t}`)):et.length===0?(0,D.jsxs)(`div`,{className:`col-span-full border border-accent-red/30 bg-accent-red/10 rounded-lg p-4 text-center`,children:[(0,D.jsx)(`div`,{className:`text-sm text-accent-red font-medium mb-1`,children:v(`models.noMatchingProviders`)}),(0,D.jsx)(`div`,{className:`text-xs text-dark-muted mb-3`,children:v(`models.noMatchingProvidersHint`,{query:Re})}),(0,D.jsxs)(`div`,{className:`flex items-center justify-center gap-2`,children:[(0,D.jsxs)(`button`,{onClick:()=>ze(``),className:`inline-flex items-center gap-1 px-2.5 py-1 text-xs border border-dark-border rounded hover:bg-dark-hover`,children:[(0,D.jsx)(m,{size:12}),v(`models.clearSearch`)]}),(0,D.jsx)(ne,{variant:`accent`,size:`sm`,leftIcon:(0,D.jsx)(f,{size:12}),onClick:at,children:v(`models.addCustomProvider`)})]})]}):et.map(e=>{let t=e.key===`custom`,n=t?Q:M?.providers?.[e.key],r=n?.hasApiKey,i=t?!!M?.defaultProvider&&(Q?.keys||[]).includes(M.defaultProvider):M?.defaultProvider===e.key;return(0,D.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,D.jsxs)(`div`,{onClick:()=>e.key===`custom`?at():rt(e),className:`cursor-pointer`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between mb-1`,children:[(0,D.jsx)(`span`,{className:`text-sm font-medium`,children:e.name}),r&&(0,D.jsx)(p,{size:14,className:`text-accent-green`})]}),(0,D.jsxs)(`div`,{className:`text-badge text-dark-muted space-y-0.5`,children:[(0,D.jsx)(`div`,{className:`truncate`,children:t?n?.baseUrl||v(`models.customBaseUrl`):e.baseUrl||v(`models.customBaseUrl`)}),(0,D.jsx)(`div`,{className:`truncate`,children:t&&Q?`${Q.keys.join(`, `)}`:e.defaultModel||v(`models.noDefaultModel`)}),(0,D.jsxs)(`div`,{children:[n?v(`models.configuredCount`,{n:n.modelCount}):v(`models.availableCount`,{n:e.models?.length||0}),e.models&&e.models.length>0&&!n&&(0,D.jsx)(`span`,{className:`text-accent-blue`,children:` ✓`})]})]}),i&&(0,D.jsx)(`div`,{className:`mt-1 text-badge text-accent-red`,children:v(`models.defaultProviderBadge`)})]}),r&&e.key!==`custom`&&(0,D.jsx)(`button`,{onClick:t=>{t.stopPropagation(),Lt(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:v(`models.deleteProvider`),"aria-label":v(`models.deleteProviderNamed`,{name:e.name}),children:(0,D.jsx)(a,{size:13})})]},e.key)})})]})]}),w&&(0,D.jsxs)(`div`,{className:`grid grid-cols-4 gap-4`,children:[(0,D.jsx)(ke,{title:v(`models.overallStatus`),value:w.totalInstances===0?v(`models.notConfigured`):w.overallStatus===`healthy`?v(`models.healthy`):w.overallStatus===`degraded`?v(`models.degraded`):v(`models.abnormal`),color:w.totalInstances===0?`blue`:w.overallStatus===`healthy`?`green`:w.overallStatus===`degraded`?`yellow`:`red`}),(0,D.jsx)(ke,{title:v(`models.healthRate`),value:w.totalInstances===0?`N/A`:`${(w.healthRate*100).toFixed(0)}%`,color:w.totalInstances===0?`blue`:w.healthRate>.8?`green`:w.healthRate>.5?`yellow`:`red`}),(0,D.jsx)(ke,{title:v(`models.onlineInstances`),value:w.totalInstances===0?v(`models.none`):`${w.healthyInstances}/${w.totalInstances}`,color:w.healthyInstances>0?`green`:`red`}),(0,D.jsx)(ke,{title:v(`models.totalRequests`),value:w.totalRequests>0?w.totalRequests.toLocaleString():`0`,color:`blue`})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between mb-3`,children:[(0,D.jsx)(`h3`,{className:`text-sm font-medium`,children:v(`models.configuredModels`)}),(0,D.jsx)(`span`,{className:`text-badge text-dark-muted`,title:v(`models.actIsGlobalHint`),children:v(`models.actIsGlobalHint`)})]}),(0,D.jsxs)(`div`,{className:`space-y-4 max-h-[640px] overflow-y-auto custom-scrollbar pe-1`,children:[nt.map(e=>{let t=N.find(t=>t.key===e.provider),n=M?.providers?.[e.provider];return(0,D.jsxs)(`div`,{className:`rounded-lg border border-dark-border overflow-hidden`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between gap-2 px-3 py-2 bg-dark-bg border-b border-dark-border`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0 flex-wrap`,children:[(0,D.jsx)(`span`,{className:`text-xs font-semibold whitespace-nowrap text-accent-purple`,children:e.provider}),M?.defaultProvider===e.provider&&(0,D.jsx)(`span`,{className:`text-avatar px-1.5 py-0.5 rounded bg-accent-red/20 text-accent-red whitespace-nowrap`,children:v(`models.defaultShort`)}),(0,D.jsx)(`span`,{className:`text-badge text-dark-muted truncate`,children:n?.baseUrl||t?.baseUrl||``}),(0,D.jsx)(`span`,{className:`text-badge text-dark-muted whitespace-nowrap`,children:t?.apiType||n?.apiType||``}),n?.hasApiKey||t?.hasApiKey?(0,D.jsx)(`span`,{className:`text-avatar px-1.5 py-0.5 rounded bg-accent-green/20 text-accent-green whitespace-nowrap`,children:v(`models.hasKey`)}):(0,D.jsx)(`span`,{className:`text-avatar px-1.5 py-0.5 rounded bg-accent-red/20 text-accent-red whitespace-nowrap`,children:v(`models.noKey`)})]}),(0,D.jsxs)(`div`,{className:`flex items-center gap-1 shrink-0`,children:[(0,D.jsx)(`button`,{onClick:()=>Pt(e.provider),className:`p-1.5 rounded hover:bg-accent-blue/10 text-dark-muted hover:text-accent-blue`,title:v(`models.editProviderNamed`,{name:e.provider}),children:(0,D.jsx)(o,{size:13})}),(0,D.jsx)(`button`,{onClick:()=>Lt(e.provider),className:`p-1.5 rounded hover:bg-accent-red/10 text-dark-muted hover:text-accent-red`,title:v(`models.deleteProviderNamed`,{name:e.provider}),children:(0,D.jsx)(a,{size:13})})]})]}),(0,D.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,D.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,D.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,D.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2 mb-1 flex-wrap`,children:[(0,D.jsx)(`span`,{className:Rt(n.status),children:zt(n.status)}),(0,D.jsx)(`span`,{className:`font-medium text-sm text-accent-blue`,children:n.name}),(0,D.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,D.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:Te[n.apiType]||n.apiType}),i&&(0,D.jsx)(`span`,{className:`text-avatar px-1 py-0.5 rounded bg-accent-yellow/20 text-accent-yellow font-medium`,title:v(`models.overrideTitle`),children:v(`models.overrideBadge`)}),n.isGlobalDefault&&(0,D.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 rounded bg-accent-red/20 text-accent-red font-medium`,title:v(`models.globalDefaultUnsettable`),children:v(`chat.globalDefault`)}),n.isActDefault&&!n.isGlobalDefault&&(0,D.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 rounded bg-accent-yellow/20 text-accent-yellow font-medium`,children:v(`chat.actDefault`)}),n.isGoalDefault&&(0,D.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 rounded bg-accent-purple/20 text-accent-purple font-medium`,children:v(`chat.goalDefault`)})]}),(0,D.jsxs)(`div`,{className:`grid grid-cols-2 sm:grid-cols-3 md:grid-cols-6 gap-3 text-xs`,children:[(0,D.jsx)(L,{label:v(`models.loadLabel`),value:`${n.load}/${n.maxLoad}`}),(0,D.jsx)(L,{label:v(`models.tokenUsageLabel`),value:`${oe(n.tokens)}/${oe(n.maxTokens)}`}),(0,D.jsx)(L,{label:v(`models.inputPrice`),value:n.price.input===void 0?`—`:`$${n.price.input}/M`}),(0,D.jsx)(L,{label:v(`models.outputPrice`),value:n.price.output===void 0?`—`:`$${n.price.output}/M`}),(0,D.jsx)(L,{label:v(`models.cacheReadPrice`),value:n.price.cacheRead===void 0?`—`:`$${n.price.cacheRead}/M`}),(0,D.jsx)(L,{label:v(`models.cacheWritePrice`),value:n.price.cacheWrite===void 0?`—`:`$${n.price.cacheWrite}/M`})]}),(0,D.jsxs)(`div`,{className:`mt-3 grid grid-cols-2 sm:grid-cols-4 gap-3 text-xs`,children:[(0,D.jsx)(L,{label:v(`models.inputTokensLabel`),value:oe(n.usage?.input??0)}),(0,D.jsx)(L,{label:v(`models.outputTokensLabel`),value:oe(n.usage?.output??0)}),(0,D.jsx)(L,{label:v(`models.totalTokensLabel`),value:oe(n.usage?.total??0)}),(0,D.jsx)(L,{label:v(`models.usageRequestsLabel`),value:String(n.usage?.requests??0)})]}),(0,D.jsx)(de,{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:X}),(0,D.jsx)(fe,{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:X}),(0,D.jsx)(pe,{modelId:n.id,className:`mt-2`})]}),(0,D.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0`,children:[xe.map(e=>{let t=e.key===`global`?n.isGlobalDefault:n.isGoalDefault,r=e.key===`global`?v(`models.setGlobalDefaultTitle`):v(`models.setGoalDefaultTitle`),i=v(`models.unsetGoalDefaultTitle`),a=v(`models.unsetGoalDefaultFailed`),o=v(`models.setGoalDefaultFailed`);return t?e.key===`global`?(0,D.jsxs)(`span`,{className:`inline-flex items-center gap-1 px-2 py-1 rounded text-badge border ${e.bg} ${e.color} font-medium`,title:v(`chat.globalDefault`),children:[(0,D.jsx)(p,{size:11}),v(e.labelKey)]},e.key):(0,D.jsxs)(`button`,{onClick:async()=>{try{await S.models.setDefaults({[e.key]:null}),await X()}catch(e){A(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,D.jsx)(p,{size:11}),v(e.labelKey)]},e.key):n.enabled===!1?null:(0,D.jsx)(`button`,{onClick:async()=>{try{await S.models.setDefaults({[e.key]:`${n.provider}:${n.id}`}),await X()}catch(e){A(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:v(e.labelKey)},e.key)}),(0,D.jsx)(`button`,{onClick:()=>Ft(n),className:`p-1.5 rounded hover:bg-accent-blue/10 text-dark-muted hover:text-accent-blue`,title:v(`models.editModel`),children:(0,D.jsx)(o,{size:13})}),(0,D.jsx)(`button`,{onClick:()=>Nt(n.provider,n.id),className:`p-1.5 rounded hover:bg-accent-red/10 text-dark-muted hover:text-accent-red`,title:v(`models.deleteModel`),children:(0,D.jsx)(a,{size:13})}),(0,D.jsx)(`button`,{onClick:()=>Mt(n),disabled:j===Qe(n),className:`p-1.5 rounded hover:bg-dark-hover disabled:opacity-50`,title:v(`models.refresh`),children:(0,D.jsx)(h,{size:13,className:j===Qe(n)?`animate-spin`:``})}),(0,D.jsx)(`button`,{onClick:()=>jt(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?v(`models.enable`):v(`models.disable`)})]})]})},Qe(n))}),e.models.length===0&&(0,D.jsx)(`div`,{className:`text-center text-meta text-dark-muted py-3`,children:v(`models.noModelsInProvider`)})]})]},e.provider)}),C.length===0&&N.length===0&&(0,D.jsxs)(`div`,{className:`text-center text-dark-muted py-6`,children:[(0,D.jsx)(u,{size:36,className:`mx-auto mb-2 opacity-40`}),(0,D.jsx)(`p`,{className:`text-sm`,children:v(`models.emptyHint`)})]})]})]}),(0,D.jsx)(re,{isOpen:_e,onClose:()=>{P(!1),I(`select`),z(null),H(``)},title:ye===`select`?v(`chat.selectProvider`):Bt?.name||v(`models.providerConfig`),size:`xl`,children:ye===`select`?(0,D.jsx)(`div`,{className:`space-y-4`,children:(0,D.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-3`,children:[$e.filter(e=>e.key!==`custom`).map(e=>(0,D.jsxs)(`button`,{onClick:()=>rt(e),className:`text-start p-3 rounded-lg border border-dark-border bg-dark-bg hover:border-accent-blue transition-colors`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2 mb-1`,children:[(0,D.jsx)(p,{size:14,className:`text-accent-blue`}),(0,D.jsx)(`span`,{className:`text-sm font-medium`,children:e.name})]}),(0,D.jsx)(`div`,{className:`text-xs text-dark-muted`,children:e.defaultModel})]},e.key)),(0,D.jsxs)(`button`,{onClick:at,className:`text-start p-3 rounded-lg border border-dashed border-dark-border bg-dark-bg hover:border-accent-blue transition-colors`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2 mb-1`,children:[(0,D.jsx)(d,{size:14,className:`text-accent-blue`}),(0,D.jsx)(`span`,{className:`text-sm font-medium`,children:v(`models.customProvider`)})]}),(0,D.jsx)(`div`,{className:`text-xs text-dark-muted`,children:v(`models.customProviderDesc`)})]})]})}):(0,D.jsxs)(`div`,{className:`space-y-3`,children:[R===`custom`&&(0,D.jsxs)(`div`,{className:`space-y-3`,children:[Q&&Q.keys.length>0&&(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:v(`models.editExistingConfig`)}),(0,D.jsxs)(`select`,{value:Ae,onChange:e=>{let t=e.target.value;t?it(t):(H(``),V(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,D.jsx)(`option`,{value:``,children:v(`models.newCustomProviderOption`)}),Q.keys.map(e=>(0,D.jsx)(`option`,{value:e,children:e},e))]}),(0,D.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:v(`models.editExistingConfigHint`)})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:v(`models.providerNameLabel`)}),(0,D.jsx)(`input`,{value:B.providerKey,onChange:e=>V(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:v(`models.providerNamePlaceholder`)})]})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsxs)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:[`API Keys`,M?.providers?.[R===`custom`?B.providerKey.trim():R||``]?.hasApiKey?``:` *`,(0,D.jsx)(`span`,{className:`text-dark-muted/60 text-xs`,children:M?.providers?.[R===`custom`?B.providerKey.trim():R||``]?.hasApiKey?v(`models.apiKeysHintConfigured`):v(`models.apiKeysHintNew`)})]}),(0,D.jsx)(`div`,{className:`space-y-1.5`,children:(B.apiKeys?.length?B.apiKeys:[``]).map((e,n)=>(0,D.jsxs)(`div`,{className:`flex gap-1.5 items-center`,children:[(0,D.jsxs)(`div`,{className:`relative flex-1`,children:[(0,D.jsx)(`input`,{type:Pe?`text`:`password`,value:e,autoComplete:`off`,spellCheck:!1,onChange:e=>V(t=>({...t,apiKeys:t.apiKeys.map((t,r)=>r===n?e.target.value:t)})),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:v(`models.apiKeyDefaultPlaceholder`)}),(0,D.jsx)(`button`,{type:`button`,onClick:()=>Fe(e=>!e),className:`absolute end-2 top-1/2 -translate-y-1/2 text-dark-muted hover:text-dark-text`,title:v(Pe?`models.hideKeyTitle`:`models.showKeyTitle`),children:Pe?(0,D.jsx)(t,{size:14}):(0,D.jsx)(ee,{size:14})})]}),n===0?(0,D.jsxs)(`button`,{type:`button`,onClick:()=>V(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:v(`models.addApiKeyTitle`),children:[(0,D.jsx)(f,{size:14}),(0,D.jsx)(`span`,{className:`hidden sm:inline`,children:v(`models.addApiKey`)})]}):(0,D.jsx)(`button`,{type:`button`,onClick:()=>V(e=>({...e,apiKeys:e.apiKeys.filter((e,t)=>t!==n)})),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:v(`models.removeApiKeyTitle`),children:(0,D.jsx)(m,{size:14})})]},n))})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:v(`models.modelIdLabel`)}),(0,D.jsxs)(`div`,{className:`flex gap-2`,children:[(0,D.jsx)(`input`,{value:B.modelIds,onChange:e=>{let t=e.target.value;V(e=>({...e,modelIds:t})),K(()=>{let e=new Set;for(let n of t.split(`,`)){let t=n.trim().split(`|`)[0].trim();t&&W.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:Bt?.defaultModel||v(`models.modelIdPlaceholder`)}),(0,D.jsxs)(`button`,{onClick:ot,disabled:Be||!B.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`,title:v(`models.fetchModelsTitle`),children:[Be?(0,D.jsx)(h,{size:13,className:`animate-spin`}):(0,D.jsx)(i,{size:13}),v(Be?`models.fetchingModels`:`models.fetchModels`)]}),(0,D.jsxs)(`button`,{onClick:ct,disabled:Je||!B.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`,title:v(`models.testConnectionTitle`),children:[Je?(0,D.jsx)(h,{size:13,className:`animate-spin`}):(0,D.jsx)(te,{size:13}),v(Je?`models.testingConnection`:`models.testConnection`)]}),(0,D.jsxs)(`button`,{onClick:Tt,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`,title:v(`models.catalogSearchTitle`),children:[(0,D.jsx)(_,{size:13}),v(`models.catalogSearch`)]})]}),Xe&&(0,D.jsxs)(`div`,{className:`mt-1 text-xs ${Xe.ok?`text-accent-green`:`text-accent-red`}`,children:[Xe.ok?`✓ `:`✗ `,Xe.message,Xe.probes?.map(e=>(0,D.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,D.jsxs)(`span`,{className:`opacity-70`,children:[` — `,e.hint]})]},e.id))]}),Ue&&(0,D.jsx)(`div`,{className:`mt-1 text-xs text-accent-red`,children:Ue}),W.length===0&&tt.length>0&&(0,D.jsxs)(`div`,{className:`mt-2 border border-dark-border rounded-lg bg-dark-bg p-2`,children:[(0,D.jsx)(`div`,{className:`flex items-center justify-between mb-2`,children:(0,D.jsxs)(`span`,{className:`text-xs text-dark-muted`,children:[v(`models.configuredPanelPrefix`),(0,D.jsx)(`strong`,{className:`text-dark-text`,children:tt.length}),v(`models.configuredPanelSuffix`),(0,D.jsx)(`span`,{className:`text-accent-green/70`,children:v(`models.configuredPanelHint`)})]})}),(0,D.jsx)(`div`,{className:`max-h-48 overflow-y-auto custom-scrollbar grid grid-cols-2 sm:grid-cols-3 gap-1`,children:tt.map(e=>{let t=B.modelIds.split(`,`).map(F).filter(Boolean).includes(e.id);return(0,D.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:()=>ut(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,D.jsx)(`span`,{className:`shrink-0 mt-[3px]`,children:t?(0,D.jsx)(p,{size:10}):(0,D.jsx)(`div`,{className:`w-2.5 h-2.5 rounded border border-dark-border`})}),(0,D.jsx)(`span`,{className:`min-w-0 flex-1 break-words leading-snug`,children:e.name||e.id}),e.isGlobalDefault&&(0,D.jsx)(`span`,{className:`text-avatar px-1 rounded bg-accent-red/20 text-accent-red shrink-0`,children:v(`models.globalShort`)}),e.isActDefault&&!e.isGlobalDefault&&(0,D.jsx)(`span`,{className:`text-avatar px-1 rounded bg-accent-yellow/20 shrink-0`,children:`Act`}),e.isGoalDefault&&(0,D.jsx)(`span`,{className:`text-avatar px-1 rounded bg-accent-purple/20 shrink-0`,children:`Goal`})]},e.id)})})]}),W.length>0&&(0,D.jsxs)(`div`,{className:`mt-2 border border-dark-border rounded-lg bg-dark-bg p-2`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between mb-2`,children:[(0,D.jsxs)(`span`,{className:`text-xs text-dark-muted`,children:[v(`models.fetchedPanelPrefix`),(0,D.jsx)(`strong`,{className:`text-dark-text`,children:W.length}),v(`models.fetchedPanelMiddle`),(0,D.jsx)(`strong`,{className:`text-accent-blue`,children:He.size}),v(`models.fetchedPanelSuffix`),(0,D.jsx)(`span`,{className:`text-accent-blue/70`,children:v(`models.fetchedPanelHint`)})]}),(0,D.jsx)(`button`,{onClick:()=>{G([]),K(new Set)},className:`px-2 py-0.5 text-badge border border-dark-border rounded hover:bg-dark-hover`,children:v(`models.close`)})]}),(0,D.jsxs)(`div`,{className:`relative mb-2`,children:[(0,D.jsx)(_,{size:12,className:`absolute start-2 top-1/2 -translate-y-1/2 text-dark-muted`}),(0,D.jsx)(`input`,{value:We,onChange:e=>{let t=e.target.value;Ge(t),t.trim()&&qe(!1)},className:`w-full ps-7 pe-2 py-1 text-xs bg-dark-bg border border-dark-border rounded focus:outline-none focus:border-accent-blue`,placeholder:v(`models.modelSearchPlaceholder`)})]}),We.trim()!==``&&(0,D.jsxs)(`div`,{className:`mb-1 text-badge text-dark-muted`,children:[v(`models.searchMatchPrefix`),(0,D.jsx)(`strong`,{className:`text-accent-blue`,children:Ze.length}),v(`models.searchMatchSuffix`,{total:W.length})]}),(0,D.jsx)(`div`,{className:`max-h-72 overflow-y-auto custom-scrollbar grid grid-cols-1 sm:grid-cols-2 gap-1`,children:Ze.map(e=>{let t=He.has(e.id);return(0,D.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:()=>lt(e.id),className:`${Ke?`reveal-on-scroll `:``}flex items-start gap-1.5 px-2 py-1 rounded cursor-pointer text-xs transition-colors select-none ${t?`bg-accent-blue/20 text-accent-blue border border-accent-blue/30`:`hover:bg-dark-hover border border-transparent`}`,children:[(0,D.jsx)(`span`,{className:`shrink-0 mt-[3px]`,children:t?(0,D.jsx)(p,{size:10}):(0,D.jsx)(`div`,{className:`w-2.5 h-2.5 rounded border border-dark-border`})}),(0,D.jsx)(`span`,{className:`min-w-0 flex-1 break-all leading-snug`,children:e.id})]},e.id)})})]})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:`Base URL`}),(0,D.jsx)(`input`,{value:B.baseUrl,onChange:e=>{V(t=>({...t,baseUrl:e.target.value})),J(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,D.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer select-none mt-2`,children:[(0,D.jsx)(`button`,{type:`button`,role:`switch`,"aria-checked":B.fullPath,onClick:()=>{V(e=>({...e,fullPath:!e.fullPath})),J(null)},className:`relative w-9 h-5 rounded-full transition-colors shrink-0 ${B.fullPath?`bg-accent-green`:`bg-dark-border`}`,children:(0,D.jsx)(`span`,{className:`absolute top-0.5 left-0 w-4 h-4 rounded-full bg-white shadow transition-transform ${B.fullPath?`translate-x-[18px]`:`translate-x-0.5`}`})}),(0,D.jsx)(`span`,{className:`text-sm text-dark-muted`,children:v(`models.fullPathLabel`)})]}),(0,D.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:v(`models.fullPathHint`)})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:v(`models.apiTypeLabel`)}),(0,D.jsxs)(`select`,{value:B.apiType,onChange:e=>{V(t=>({...t,apiType:e.target.value})),J(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,D.jsx)(`option`,{value:``,children:v(`models.apiTypeAutoDetect`)}),we.map(e=>(0,D.jsx)(`option`,{value:e,children:Te[e]},e))]}),(0,D.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:v(`models.apiTypeHint`)})]}),(0,D.jsxs)(`div`,{children:[(0,D.jsxs)(`label`,{className:`block text-sm text-dark-muted mb-1`,children:[v(`models.modelApiTypeLabel`),(0,D.jsx)(`span`,{className:`text-dark-muted/60 text-xs`,children:v(`models.modelApiTypeHint`)})]}),(0,D.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=B.modelIds.split(`,`).map(F).filter(Boolean);if(e.length===0)return(0,D.jsx)(`div`,{className:`px-3 py-2 text-xs text-dark-muted`,children:v(`models.modelApiTypeEmpty`)});let t=N.find(e=>e.key===$),n=t?.contextWindow??2e5,r=t?.maxTokens??8e3,i=(e,t)=>V(n=>({...n,modelOverrides:{...n.modelOverrides,[e]:{...n.modelOverrides[e]||{},...t}}}));return e.map(e=>{let t=B.modelOverrides[e]||{};return(0,D.jsxs)(`div`,{className:`px-3 py-2 space-y-1.5`,children:[(0,D.jsx)(`div`,{className:`text-xs min-w-0 break-all leading-snug text-dark-text`,title:e,children:e}),(0,D.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-1.5`,children:[(0,D.jsxs)(`label`,{className:`block`,children:[(0,D.jsx)(`span`,{className:`block text-badge text-dark-muted/70 mb-0.5`,children:v(`models.apiTypeLabel`)}),(0,D.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,D.jsx)(`option`,{value:``,children:v(`models.inheritProvider`)}),we.map(e=>(0,D.jsx)(`option`,{value:e,children:Te[e]},e))]})]}),(0,D.jsxs)(`label`,{className:`block`,children:[(0,D.jsx)(`span`,{className:`block text-badge text-dark-muted/70 mb-0.5`,children:v(`models.maxInputTokensLabel`)}),(0,D.jsx)(`input`,{type:`number`,min:1,inputMode:`numeric`,value:t.maxInput??``,onChange:t=>i(e,{maxInput:t.target.value}),placeholder:String(n),title:v(`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,D.jsxs)(`label`,{className:`block`,children:[(0,D.jsx)(`span`,{className:`block text-badge text-dark-muted/70 mb-0.5`,children:v(`models.maxOutputTokensLabel`)}),(0,D.jsx)(`input`,{type:`number`,min:1,inputMode:`numeric`,value:t.maxOutput??``,onChange:t=>i(e,{maxOutput:t.target.value}),placeholder:String(r),title:v(`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,D.jsx)(`div`,{className:`text-meta text-dark-muted/60 mt-1`,children:v(`models.contextBudgetHint`)})]}),(0,D.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:B.setDefault,onChange:e=>V(t=>({...t,setDefault:e.target.checked})),className:`accent-accent-blue`}),(0,D.jsx)(`span`,{className:`text-sm text-dark-muted`,children:v(`models.setDefaultProvider`)})]}),Ne&&(0,D.jsx)(`div`,{className:`text-sm text-accent-red`,children:Ne}),(0,D.jsxs)(`div`,{className:`flex justify-between gap-2 pt-2`,children:[(0,D.jsx)(`div`,{children:$&&M?.providers?.[$]?.hasApiKey&&(0,D.jsx)(`button`,{onClick:async()=>{if(await ae({message:v(`models.deleteProviderConfirm`,{key:$}),variant:`danger`}))try{await S.config.provider.delete($),P(!1),I(`select`),z(null),H(``),await Y(),await X()}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:v(`models.deleteProvider`)})}),(0,D.jsx)(`button`,{onClick:()=>{I(`select`),z(null),H(``),P(!1)},className:`px-4 py-2 rounded border border-dark-border hover:bg-dark-hover transition-colors text-sm`,children:v(`common.cancel`)}),(0,D.jsx)(ne,{variant:`accent`,onClick:It,loading:je,children:v(`common.save`)})]})]})}),(0,D.jsx)(re,{isOpen:dt,onClose:()=>ft(!1),title:(0,D.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,D.jsx)(_,{size:15,className:`text-accent-green`}),v(`models.catalogTitle`)]}),size:`2xl`,children:(0,D.jsxs)(`div`,{className:`space-y-3`,children:[(0,D.jsxs)(`div`,{className:`flex gap-2`,children:[(0,D.jsxs)(`div`,{className:`relative flex-1`,children:[(0,D.jsx)(_,{size:14,className:`absolute start-3 top-1/2 -translate-y-1/2 text-dark-muted`}),(0,D.jsx)(`input`,{value:pt,onChange:e=>At(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:v(`models.catalogSearchPlaceholder`),autoFocus:!0})]}),(0,D.jsxs)(`label`,{className:`inline-flex items-center gap-1.5 text-xs text-dark-muted whitespace-nowrap cursor-pointer`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:Ct,onChange:e=>{let t=e.target.checked;wt(t),Et(pt,{reason:xt,tool:t})},className:`accent-accent-green`}),v(`models.catalogOnlyToolCall`)]}),(0,D.jsxs)(`label`,{className:`inline-flex items-center gap-1.5 text-xs text-dark-muted whitespace-nowrap cursor-pointer`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:xt,onChange:e=>{let t=e.target.checked;St(t),Et(pt,{reason:t,tool:Ct})},className:`accent-accent-green`}),v(`models.catalogOnlyReasoning`)]})]}),yt&&(0,D.jsx)(`div`,{className:`text-xs text-accent-red bg-accent-red/10 p-2 rounded`,children:yt}),_t?(0,D.jsxs)(`div`,{className:`flex items-center justify-center py-10 text-dark-muted`,children:[(0,D.jsx)(h,{size:18,className:`animate-spin me-2`}),` `,v(`models.searching`)]}):(0,D.jsx)(`div`,{className:`max-h-96 overflow-y-auto custom-scrollbar border border-dark-border rounded-lg divide-y divide-dark-border`,children:ht.length===0?(0,D.jsx)(`div`,{className:`py-10 text-center text-dark-muted text-sm`,children:v(`models.catalogNoResults`)}):ht.map(e=>(0,D.jsxs)(`div`,{className:`flex items-center gap-3 px-3 py-2 hover:bg-dark-hover`,children:[(0,D.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,D.jsx)(`span`,{className:`text-sm font-medium text-dark-text truncate`,children:e.model.name||e.model.id}),(0,D.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,D.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 bg-accent-yellow/10 text-accent-yellow rounded`,children:v(`models.badgeReasoning`)}),e.model.tool_call&&(0,D.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 bg-accent-blue/10 text-accent-blue rounded`,children:v(`models.badgeToolCall`)}),e.model.attachment&&(0,D.jsx)(`span`,{className:`text-badge px-1.5 py-0.5 bg-accent-green/10 text-accent-green rounded`,children:v(`models.badgeMultimodal`)})]}),(0,D.jsxs)(`div`,{className:`text-meta text-dark-muted mt-0.5`,children:[e.providerName,e.model.limit?.context?` · ${v(`models.ctxLimit`,{k:(e.model.limit.context/1e3).toFixed(0)})}`:``,e.model.limit?.output?` · ${v(`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,D.jsxs)(`button`,{onClick:()=>Dt(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`,title:v(`models.catalogAddTitle`),children:[(0,D.jsx)(f,{size:12}),` `,v(`models.add`)]})]},`${e.providerId}:${e.model.id}`))}),(0,D.jsx)(`div`,{className:`text-meta text-dark-muted/60`,children:v(`models.catalogSourceHint`)})]})})]})]})}function ke({title:e,value:t,color:n}){return(0,D.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,D.jsx)(`div`,{className:`text-xs opacity-70`,children:e}),(0,D.jsx)(`div`,{className:`text-xl font-semibold`,children:t})]})}function L({label:e,value:t}){return(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`div`,{className:`text-dark-muted`,children:e}),(0,D.jsx)(`div`,{children:t})]})}export{I as ModelsView,I as default};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{Kr as t,Sr as n,Wn as r,_ as i,ct as a,h as o,n as s,nt as c,q as l,st as u,ut as ee,wr as d,x as f,xr as p}from"./icons-CYDRRPKW.js";import{t as m}from"./useTranslation-B-mfApCn.js";import{a as te,n as ne}from"./useConfirm-Da8iQ_DZ.js";import{r as h}from"./api-plEYhRn0.js";import{I as re}from"./markdown-N5__3T-w.js";import{f as ie}from"./common-Bbatsa0-.js";var g=e(t(),1),_=re();function v(e){return(0,_.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 y(e){return e?(0,_.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}var ae={queued:`queued`,resolve:`resolve`,fetch:`fetch`,verify:`verify`,load:`load`,register:`register`,activate:`activate`,done:`done`,error:`error`},b={queued:`Queued`,resolve:`Resolving market entry`,fetch:`Downloading package`,verify:`Verifying manifest`,load:`Loading plugin`,register:`Registering`,activate:`Activating`,done:`Done`,error:`Failed`};function x(e,t){let n=`plugins.installStages.${ae[e]}`,r=t(n);return r===n?b[e]:r}function S({job:e,error:t,onClose:n,onRetry:r}){let{t:i}=m(),a=(0,g.useRef)(null),c=e?.status===`running`,l=e?.status===`error`||!!t,u=Math.max(0,Math.min(100,e?.progress??0)),ee=e?.stage??`error`,p=e?.logs??[];(0,g.useEffect)(()=>{let e=a.current;e&&(e.scrollTop=e.scrollHeight)},[p.length]);let te=l?`bg-accent-red`:e?.status===`done`?`bg-accent-green`:`bg-accent-blue`;return(0,_.jsxs)(`div`,{"data-testid":`plugin-install-console`,className:`mt-2 rounded-md border border-dark-border bg-dark-bg px-2 py-1.5`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[l?(0,_.jsx)(o,{size:12,className:`shrink-0 text-accent-red`}):e?.status===`done`?(0,_.jsx)(d,{size:12,className:`shrink-0 text-accent-green`}):(0,_.jsx)(`div`,{className:`h-3 w-3 shrink-0 animate-spin rounded-full border-2 border-accent-blue border-t-transparent`}),(0,_.jsx)(`span`,{className:`text-meta text-dark-text truncate`,children:e?.alreadyInstalled&&c?i(`plugins.installAlreadyInstalled`):x(ee,i)}),(0,_.jsx)(`div`,{className:`flex-1`}),e&&(0,_.jsxs)(`span`,{className:`text-meta tabular-nums text-dark-muted shrink-0`,children:[u,`%`]}),r&&l&&(0,_.jsx)(`button`,{type:`button`,onClick:r,className:`px-1.5 py-0.5 rounded border border-dark-border bg-dark-hover text-meta text-dark-muted hover:text-dark-text transition-colors`,children:i(`plugins.installRetry`)}),(0,_.jsx)(`button`,{type:`button`,onClick:n,title:i(`plugins.installClose`),className:`p-0.5 rounded text-dark-muted hover:text-dark-text transition-colors`,children:(0,_.jsx)(s,{size:12})})]}),e&&(0,_.jsx)(`div`,{className:`mt-1 h-1 rounded-full bg-dark-hover overflow-hidden`,children:(0,_.jsx)(`div`,{className:`h-full ${te} transition-[width] duration-300 ease-out`,style:{width:`${u}%`}})}),(e?.error||t)&&(0,_.jsx)(`div`,{className:`mt-1 rounded border border-accent-red bg-accent-red/15 px-1.5 py-1 text-meta text-accent-red break-words`,children:e?.error||t}),e&&(0,_.jsxs)(`details`,{open:!0,className:`mt-1 group`,children:[(0,_.jsxs)(`summary`,{className:`flex items-center gap-1 cursor-pointer select-none text-meta text-dark-muted hover:text-dark-text transition-colors`,children:[(0,_.jsx)(f,{size:11}),i(`plugins.installLogs`,{count:p.length})]}),(0,_.jsx)(`pre`,{ref:a,className:`mt-1 max-h-32 overflow-auto rounded border border-dark-border bg-dark-surface px-1.5 py-1 font-mono text-meta text-dark-muted whitespace-pre-wrap break-all`,children:p.length?p.join(`
|
|
2
|
+
`):i(`plugins.installLogsEmpty`)})]})]})}function oe({plugin:e,job:t,error:n,onInstall:i,onDismiss:a}){let{t:o}=m(),s=t?.status===`running`,c=t&&s?x(t.stage,o):null,l=e.marketId??e.id;return(0,_.jsxs)(`div`,{"data-install-card":l,className:`rounded-lg border border-dark-border bg-dark-surface p-3`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,_.jsx)(`span`,{className:`text-compact font-medium text-dark-text truncate`,children:e.name||e.id}),e.version&&(0,_.jsx)(`span`,{className:`text-meta text-dark-muted shrink-0`,children:e.version}),v(e.source),y(e.market),e.category&&(0,_.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,_.jsx)(`div`,{className:`flex-1`}),(0,_.jsx)(`span`,{className:`text-meta text-dark-muted font-mono shrink-0`,children:e.id})]}),e.description&&(0,_.jsx)(`p`,{className:`mt-1 text-xs text-dark-muted`,children:e.description}),(0,_.jsxs)(`div`,{className:`mt-2 flex items-center gap-1.5`,children:[(0,_.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,_.jsx)(r,{size:11,className:`animate-pulse`}):(0,_.jsx)(r,{size:11}),c??o(`plugins.installActivate`)]}),(0,_.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,_.jsx)(r,{size:11}),` `,o(`plugins.installOnly`)]})]}),(t||n)&&(0,_.jsx)(S,{job:t??null,error:n??null,onClose:a,onRetry:t?.status===`error`||!t&&n?()=>i(l,t?.activate??!0):void 0})]})}function se({jobs:e,onSelect:t}){let{t:n}=m(),i=e.filter(e=>e.status===`running`);return i.length===0?null:(0,_.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,_.jsxs)(`div`,{className:`flex items-center gap-1.5 px-0.5 pb-1`,children:[(0,_.jsx)(r,{size:11,className:`shrink-0 text-accent-blue`}),(0,_.jsx)(`span`,{className:`text-meta tabular-nums text-dark-text`,children:i.length})]}),(0,_.jsx)(`ul`,{className:`space-y-0.5`,children:i.map(e=>{let r=Math.max(0,Math.min(100,e.progress));return(0,_.jsx)(`li`,{children:(0,_.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`,children:[(0,_.jsx)(`span`,{className:`h-2.5 w-2.5 shrink-0 animate-spin rounded-full border-2 border-accent-blue border-t-transparent`}),(0,_.jsx)(`span`,{className:`shrink-0 max-w-[10rem] truncate font-mono text-meta text-dark-text`,children:e.marketId}),(0,_.jsx)(`span`,{className:`shrink-0 text-meta text-dark-muted`,children:e.alreadyInstalled?n(`plugins.installAlreadyInstalled`):x(e.stage,n)}),(0,_.jsx)(`span`,{className:`flex-1 h-1 rounded-full bg-dark-hover overflow-hidden`,children:(0,_.jsx)(`span`,{className:`block h-full bg-accent-blue transition-[width] duration-300 ease-out`,style:{width:`${r}%`}})}),(0,_.jsxs)(`span`,{className:`shrink-0 text-meta tabular-nums text-dark-muted`,children:[r,`%`]})]})},e.marketId)})})]})}var C=700;function w(e,t){if(!(t in e))return e;let n={...e};return delete n[t],n}function ce(){let[e,t]=(0,g.useState)({}),[n,r]=(0,g.useState)({}),[i,a]=(0,g.useState)(0),o=(0,g.useRef)(new Map),s=(0,g.useCallback)(e=>{let t=o.current.get(e);t!==void 0&&(window.clearTimeout(t),o.current.delete(e))},[]),c=(0,g.useCallback)((e,n)=>{s(e);let i=async()=>{let c=await h.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(),C)):(o.current.delete(e),a(e=>e+1))};i()},[s]),l=(0,g.useCallback)(async(e,n)=>{s(e),r(t=>w(t,e));let i=await h.post(`/api/plugins/install`,{id:e,activate:n});if(!i.success){let t=i.error??`Install request failed`;return r(n=>({...n,[e]:t})),{job:null,error:t}}if(!i.data?.jobId)return{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,g.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,g.useCallback)(n=>{let i=e[n];i&&i.status===`running`||(t(e=>w(e,n)),r(e=>w(e,n)))},[e])}}var T=12,E=`other`,le=[`all`,`builtin`,`openclaw`,`deepseek-harness`];function ue(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 de(e){return e.category?.trim()||E}function fe(e,t){let n=t.trim().toLowerCase();return!n||[e.id,e.name,e.description,e.category,...e.tags??[]].filter(e=>typeof e==`string`).join(` `).toLowerCase().includes(n)}function D(){let{t:e}=m(),[t,r]=(0,g.useState)(`installed`),[f,re]=(0,g.useState)([]),[y,ae]=(0,g.useState)([]),[b,x]=(0,g.useState)([]),[S,C]=(0,g.useState)(null),[w,E]=(0,g.useState)(!0),[D,pe]=(0,g.useState)(null),[O,me]=(0,g.useState)(null),[he,ge]=(0,g.useState)(null),[k,_e]=(0,g.useState)(null),[A,j]=(0,g.useState)(null),[ve,M]=(0,g.useState)(null),[N,P]=(0,g.useState)(``),[F,I]=(0,g.useState)(null),[L,R]=(0,g.useState)(null),[z,B]=(0,g.useState)(1),V=(0,g.useCallback)((e,t)=>{_e({kind:e,text:t}),window.setTimeout(()=>_e(null),4e3)},[]),H=(0,g.useCallback)(async()=>{E(!0),pe(null);let[e,t]=await Promise.all([h.get(`/api/plugins`),h.get(`/api/plugins/market`)]);e.success&&e.data?(re(e.data.plugins),C(e.data.schemaVersion??null),ae(e.data.issues??[])):pe(e.error??`Failed to load plugins`),t.success&&t.data&&x(t.data.plugins),E(!1)},[]);(0,g.useEffect)(()=>{H()},[H]);let U=(0,g.useMemo)(()=>f.filter(e=>e.installable!==!0),[f]),W=(0,g.useMemo)(()=>[...f.filter(e=>e.installable===!0),...b.filter(e=>!f.some(t=>t.id===e.id||t.marketId===e.id))],[f,b]),G=(0,g.useCallback)(e=>e.filter(e=>F&&de(e)!==F||L&&(e.market??null)!==L?!1:fe(e,N)),[F,N,L]),K=(0,g.useMemo)(()=>G(U),[G,U]),q=(0,g.useMemo)(()=>G(W),[G,W]),ye=(0,g.useMemo)(()=>{let e=new Set;for(let t of W)e.add(de(t));return[`all`,...Array.from(e).sort()]},[W]),J=(0,g.useMemo)(()=>{let e=new Set;for(let t of W)t.market&&e.add(t.market);return le.filter(t=>t===`all`||e.has(t))},[W]),be=e=>Math.max(1,Math.ceil(e/T)),xe=(e,t)=>e.slice((t-1)*T,t*T),Y=be(K.length),X=be(q.length),Se=(0,g.useMemo)(()=>xe(K,Math.min(z,Y)),[K,z,Y]),Ce=(0,g.useMemo)(()=>xe(q,Math.min(z,X)),[q,z,X]);(0,g.useEffect)(()=>{B(1)},[t,N,F,L]),(0,g.useEffect)(()=>{L!==null&&!J.includes(L)&&R(null)},[L,J]);let we=N.trim().length>0||F!==null||L!==null,Z=(0,g.useCallback)(async(e,t,n)=>{me(e),ge(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{me(null),ge(null)}},[H,V]),Q=ce(),Te=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()}},Ee=Q.settledCount;(0,g.useEffect)(()=>{Ee>0&&H()},[Ee,H]);let De=(0,g.useMemo)(()=>Object.values(Q.jobs),[Q.jobs]),Oe=(0,g.useCallback)(e=>{r(`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/T)+1),requestAnimationFrame(()=>{Array.from(document.querySelectorAll(`[data-install-card]`)).find(t=>t.getAttribute(`data-install-card`)===e)?.scrollIntoView({block:`center`,behavior:`smooth`})})},[W]),ke=e=>Z(e,`enabled`,()=>h.post(`/api/plugins/${encodeURIComponent(e)}/enable`)),Ae=e=>Z(e,`disabled`,()=>h.post(`/api/plugins/${encodeURIComponent(e)}/disable`)),je=e=>Z(e,`uninstalled`,()=>h.delete(`/api/plugins/${encodeURIComponent(e)}`)),Me=async e=>{M(e);try{let t=await h.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)}},Ne=(t,r)=>r>1?(0,_.jsxs)(`div`,{className:`flex items-center justify-center gap-3 pt-3 pb-1 select-none`,children:[(0,_.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,_.jsx)(n,{size:12}),` `,e(`plugins.prevPage`)]}),(0,_.jsx)(`span`,{className:`text-meta text-dark-muted`,children:e(`plugins.pageInfo`,{page:Math.min(z,r),pages:r,count:t})}),(0,_.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,_.jsx)(p,{size:12})]})]}):null,$=t=>(0,_.jsx)(`div`,{className:`mt-8 text-center text-xs text-dark-muted`,children:we?e(`plugins.noMatch`):t});return(0,_.jsxs)(`div`,{className:`h-full flex flex-col min-h-0 bg-dark-bg`,children:[(0,_.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,_.jsx)(ee,{size:15,className:`text-accent-blue`}),(0,_.jsx)(`span`,{className:`truncate text-compact font-medium text-dark-text`,children:e(`nav.plugins`)}),S!==null&&(0,_.jsxs)(`span`,{className:`px-1.5 py-0.5 rounded text-badge bg-dark-hover text-dark-muted border border-dark-border`,children:[`schema v`,S]}),(0,_.jsx)(`div`,{className:`flex-1`}),(0,_.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,_.jsx)(c,{size:14,className:w?`animate-spin`:``})})]}),y.length>0&&(0,_.jsxs)(`div`,{className:`shrink-0 mx-3 mt-2 rounded-lg border border-accent-yellow/40 bg-accent-yellow/10`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5`,children:[(0,_.jsx)(o,{size:13,className:`shrink-0 text-accent-yellow`}),(0,_.jsx)(`span`,{className:`text-xs text-dark-text`,children:e(`plugins.issues.title`,{count:y.length})}),(0,_.jsx)(`div`,{className:`flex-1`}),(0,_.jsx)(te,{variant:`ghost`,size:`sm`,onClick:()=>r(`available`),children:e(`plugins.issues.goMarket`)})]}),(0,_.jsx)(`ul`,{className:`max-h-28 space-y-1 overflow-y-auto px-3 pb-2`,children:y.map(t=>(0,_.jsxs)(`li`,{className:`flex items-baseline gap-1.5 text-meta`,children:[(0,_.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,_.jsx)(`span`,{className:`shrink-0 font-mono text-dark-text`,children:t.marketId??t.id}),t.channelType&&(0,_.jsx)(`span`,{className:`shrink-0 text-dark-muted`,children:e(`plugins.issues.channelType`,{type:t.channelType})}),t.message&&(0,_.jsx)(`span`,{className:`truncate text-dark-muted`,title:t.message,children:t.message})]},`${t.stage}:${t.id}`))})]}),(0,_.jsx)(`div`,{className:`flex items-center gap-1 px-3 pt-2 shrink-0`,children:[`installed`,`available`].map(n=>(0,_.jsx)(`button`,{onClick:()=>r(n),className:`px-3 py-1.5 rounded-t text-xs transition-colors ${t===n?`bg-dark-surface text-accent-blue border border-b-0 border-dark-border`:`text-dark-muted hover:text-dark-text`}`,children:n===`installed`?e(`plugins.installedTab`,{count:U.length}):e(`plugins.availableTab`,{count:W.length})},n))}),(0,_.jsx)(se,{jobs:De,onSelect:Oe}),(0,_.jsxs)(`div`,{className:`shrink-0 px-3 pt-2 pb-1 space-y-2 bg-dark-bg`,children:[(0,_.jsxs)(`div`,{className:`relative`,children:[(0,_.jsx)(l,{size:13,className:`absolute start-2.5 top-1/2 -translate-y-1/2 text-dark-muted pointer-events-none`}),(0,_.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,_.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,_.jsx)(s,{size:12})})]}),t===`available`&&ye.length>2&&(0,_.jsx)(`div`,{className:`flex flex-wrap items-center gap-1.5`,children:ye.map(t=>(0,_.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))}),t===`available`&&(0,_.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,_.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,_.jsxs)(`div`,{className:`flex-1 min-h-0 overflow-y-auto px-3 pb-4`,children:[D&&(0,_.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,_.jsx)(o,{size:14}),` `,D]}),w&&!D&&(0,_.jsx)(`div`,{className:`mt-8 px-4`,role:`status`,children:(0,_.jsx)(ie,{count:4})}),!w&&t===`installed`&&(0,_.jsxs)(`div`,{className:`mt-3 space-y-2`,children:[K.length===0&&$(e(`plugins.emptyInstalled`)),Se.map(t=>{let n=t.l2??[],r=t,o=r.status===`active`,s=r.status===`disabled`||r.enabled===!1;return(0,_.jsxs)(`div`,{className:`rounded-lg border border-dark-border bg-dark-surface p-3`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,_.jsx)(`span`,{className:`text-compact font-medium text-dark-text truncate`,children:t.name||t.id}),t.version&&(0,_.jsx)(`span`,{className:`text-meta text-dark-muted shrink-0`,children:t.version}),v(t.source),(0,_.jsx)(`span`,{className:`px-1.5 py-0.5 rounded text-meta border shrink-0 ${o?`bg-accent-green/15 text-accent-green border-accent-green`:s?`bg-accent-yellow/10 text-accent-yellow border-accent-yellow/60`:`bg-dark-hover text-dark-muted border-dark-border`}`,children:o?`active`:s?`disabled`:`installed`}),t.httpMounted&&(0,_.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,_.jsx)(`div`,{className:`flex-1`}),(0,_.jsx)(`span`,{className:`text-meta text-dark-muted font-mono shrink-0`,children:t.id})]}),t.description&&(0,_.jsx)(`p`,{className:`mt-1 text-xs text-dark-muted`,children:t.description}),n.length>0&&(0,_.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-1.5`,children:[n.map(e=>(0,_.jsxs)(`span`,{title:e.note||e.id,className:`px-1.5 py-0.5 rounded text-meta border cursor-help ${ue(e.status)}`,children:[e.kind,` · `,e.status,e.status===`wired`&&(0,_.jsx)(d,{size:10,className:`inline ms-0.5`})]},`${e.kind}-${e.id}`)),n.filter(e=>e.kind===`provider`&&e.status===`wired`).map(t=>(0,_.jsx)(`button`,{disabled:ve===t.id,onClick:()=>void Me(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:ve===t.id?`applying…`:`apply provider`},`apply-${t.id}`))]}),(0,_.jsxs)(`div`,{className:`mt-2 flex items-center gap-1.5`,children:[o?(0,_.jsxs)(`button`,{onClick:()=>void Ae(t.id),disabled:O===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,_.jsx)(a,{size:11}),` `,O===t.id?`${he}…`:e(`plugins.deactivate`)]}):(0,_.jsxs)(`button`,{onClick:()=>void ke(t.id),disabled:O===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,_.jsx)(u,{size:11}),` `,O===t.id?`${he}…`:e(`plugins.activate`)]}),(0,_.jsxs)(`button`,{onClick:()=>j(t.id),disabled:O===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,_.jsx)(i,{size:11}),` `,e(`plugins.uninstall`)]})]})]},t.id)}),Ne(K.length,Y)]}),!w&&t===`available`&&(0,_.jsxs)(`div`,{className:`mt-3 space-y-2`,children:[q.length===0&&$(e(`plugins.emptyMarket`)),Ce.map(e=>{let t=(`marketId`in e?e.marketId:void 0)??e.id;return(0,_.jsx)(oe,{plugin:e,job:Q.jobs[t],error:Q.errors[t]??null,onInstall:(e,t)=>void Te(e,t),onDismiss:()=>Q.dismiss(t)},e.id)}),Ne(q.length,X)]})]}),k&&(0,_.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 ${k.kind===`ok`?`bg-accent-green/15 border-accent-green text-accent-green`:`bg-accent-red/15 border-accent-red text-accent-red`}`,children:[k.kind===`ok`?(0,_.jsx)(d,{size:13}):(0,_.jsx)(s,{size:13}),` `,k.text]}),(0,_.jsx)(ne,{isOpen:A!==null,title:e(`plugins.uninstallTitle`),message:e(`plugins.uninstallConfirm`,{id:A??``}),onConfirm:()=>{A&&je(A),j(null)},onClose:()=>j(null)})]})}export{D as PluginsView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{Bn as t,Cr as n,Gt as r,Hr as i,Kr as a,Ln as o,Mr as s,Qn as c,Un as l,W as u,bn as d,ct as f,h as p,hr as m,ht as h,lt as g,n as _,nt as v,pr as y,q as b,qn as x,wr as S,xn as C,xr as w}from"./icons-CYDRRPKW.js";import{r as T}from"./react-vendor-CB4cLN-6.js";import{t as E}from"./useTranslation-B-mfApCn.js";import{d as D}from"./ttsSettings-BwXYpDnk.js";import{a as O,c as k,i as A,r as j,s as M,t as N}from"./useConfirm-Da8iQ_DZ.js";import{v as P,x as F,y as I}from"./src-49LUQhkG.js";import{C as L,ht as R}from"./MessageBubble-CVGXupVH.js";import{n as ee,r as te,t as z}from"./InputArea-BY8quOiH.js";import{t as ne}from"./api-plEYhRn0.js";import{I as B}from"./markdown-N5__3T-w.js";import{_ as V,g as re,h as ie,u as H,v as U}from"./common-Bbatsa0-.js";import{n as ae,s as oe,u as se}from"./ThreadsView-XditIHZ4.js";import{C as W,K as ce,S as G,T as K,U as le,W as q,_ as ue,b as de,v as fe,w as J,x as pe,y as me}from"./index-CTbLW314.js";var he=T(),Y=e(a(),1);function ge(e={}){let t=e.enabled!==!1,n=q(e=>e.projects),r=q(e=>e.total),i=q(e=>e.hidden),a=q(e=>e.detail),o=q(e=>e.detailLoading),s=q(e=>e.detailError),c=q(e=>e.query),l=q(e=>e.sort),u=q(e=>e.stale),d=q(e=>e.loading),f=q(e=>e.lastError),p=q(e=>e.disabled),m=q(e=>e.openProjectId),h=q(e=>e.refresh);(0,Y.useEffect)(()=>{t&&q.getState().refresh()},[t]),(0,Y.useEffect)(()=>{t&&u&&q.getState().scheduleRefresh()},[t,u]),(0,Y.useEffect)(()=>{if(!t||typeof document>`u`)return;let e=()=>{document.visibilityState===`visible`&&q.getState().refresh()};return document.addEventListener(`visibilitychange`,e),()=>document.removeEventListener(`visibilitychange`,e)},[t]);let g=le(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=>q.getState().setQuery(e),setSort:e=>q.getState().setSort(e),openProject:e=>void q.getState().openProject(e),closeDetail:()=>q.getState().closeDetail(),enterProject:(e,t)=>q.getState().enterProject(e,t),backToProjectList:()=>q.getState().backToProjectList(),createProject:(e,t)=>q.getState().createProject(e,t),hideProject:e=>q.getState().hideProject(e),unhideProjects:e=>q.getState().unhideProjects(e),unhideAll:()=>q.getState().unhideAll(),probeEntry:()=>void q.getState().probeEntry(),refresh:()=>void h()}}var X=B();function _e({isOpen:e,onClose:t,projects:n,onRestore:r}){let{t:i}=E(),[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)(j,{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`,children:i(`projects.hiddenModalHint`)}),(0,X.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-dark-border/60 px-6 py-2`,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:M(`flex cursor-pointer items-center gap-2.5 border-b border-dark-border/40 px-6 py-2 transition-colors`,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`,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 ve={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 ye(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:M(`inline-flex shrink-0 items-center gap-0.5 rounded-full border px-1.5 py-px text-meta leading-4`,ve[e]),children:r})}function be({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 xe=(0,Y.memo)(function({project:e,onOpen:n,onOpenFolder:r,onCopyRoot:i,onHide:a,now:o}){let{t:s}=E(),l=!e.rootExists,u=Object.values(e.threads).reduce((e,t)=>e+t,0),d=ye(e),f=L(e.lastActivityAt,o,s);return(0,X.jsxs)(`div`,{role:`button`,tabIndex:0,onClick:()=>n(e.projectId),onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&t.target===t.currentTarget&&(t.preventDefault(),n(e.projectId))},className:M(`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:s(`projects.visibility`)}),l&&(0,X.jsx)(`span`,{className:`shrink-0 text-badge text-accent-yellow`,children:s(`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:[s(`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:s(`projects.runningCount`,{count:e.sessions.running})})]})]}),(0,X.jsx)(Z,{testid:`project-threads-${e.projectId}`,children:u>0?s(`projects.threadCount`,{count:u}):s(`projects.noThreads`)}),e.agentMd.present?(0,X.jsx)(Z,{tone:e.agentMd.truncated?`warn`:`ok`,testid:`project-agentmd-${e.projectId}`,title:e.agentMd.truncated?s(`projects.agentMdTruncated`,{bytes:e.agentMd.bytes??0}):s(`projects.agentMdBytes`,{bytes:e.agentMd.bytes??0}),children:e.agentMd.truncated?s(`projects.agentMdTruncatedShort`):s(`projects.agentMdReady`)}):(0,X.jsx)(Z,{testid:`project-agentmd-${e.projectId}`,children:s(`projects.agentMdAbsent`)}),l&&(0,X.jsx)(Z,{tone:`warn`,testid:`project-missing-${e.projectId}`,children:s(`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)(be,{icon:(0,X.jsx)(C,{size:13,"aria-hidden":`true`}),label:s(`projects.openFolder`),hint:l?s(`projects.openFolderDisabled`):void 0,disabled:l,testid:`project-open-folder-${e.projectId}`,onClick:()=>r(e.root)}),(0,X.jsx)(be,{icon:(0,X.jsx)(c,{size:13,"aria-hidden":`true`}),label:s(`projects.copyRoot`),testid:`project-copy-root-${e.projectId}`,onClick:()=>i(e.root)}),(0,X.jsx)(be,{icon:(0,X.jsx)(t,{size:13,"aria-hidden":`true`}),label:s(l?`projects.removeView`:`projects.hide`),hint:s(`projects.hideHint`),testid:`project-hide-${e.projectId}`,onClick:()=>a(e.projectId)})]})]})}),Se=[`answer`,`thread`,`goal`,`handoff`,`approval`,`session`];function Ce(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function Q(e){return typeof e==`string`&&e.trim()?e:void 0}function we(e){let t=Ce(e);if(!t)return null;let n=t.kind;if(typeof n!=`string`||!Se.includes(n))return null;let r={kind:n,reason:typeof t.reason==`string`?t.reason:``},i=Ce(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=Ce(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 Te(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 Ee=(0,Y.memo)(function({route:e,root:t,onOpenThread:n,onOpenSession:r}){let{t:i}=E(),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 ne.sessions.create(n,t);if(i.success&&i.data){let a=e.suggest?.seed?.trim();a&&D.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":Te(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 De(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,c=we(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)(m,{size:12,"aria-hidden":`true`}),` `,s,` `,t(`projects.pmApprovalsPending`)]}):null,c?(0,X.jsx)(Ee,{route:c,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 Oe=(0,Y.memo)(function({root:e,onOpenThread:t,onOpenSession:r,children:i}){let{t:a}=E(),o=(0,Y.useMemo)(()=>F(e)??``,[e]),c=K(e=>e.residentByProject[o]??!1),l=K(e=>e.activityByProject[o]??fe),u=K(e=>e.approvals),d=(0,Y.useMemo)(()=>G(u,o),[u,o]),f=K(e=>e.resolveApproval),[p,h]=(0,Y.useState)(!1),[g,v]=(0,Y.useState)(!1);(0,Y.useEffect)(()=>{o&&pe(o)},[o]);let b=async()=>{if(o&&!g){v(!0);try{await J(o,!c)}finally{v(!1)}}},x=l.slice(-20).reverse(),C=(0,Y.useMemo)(()=>{if(p)return null;let e=l.slice(-20);for(let t=e.length-1;t>=0;t--){let n=e[t];if(!n||n.type!==`pm_report`)continue;let r=we(n.fields.route);if(r)return r}return null},[l,p]),T=(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`,children:[(0,X.jsx)(s,{size:14,"aria-hidden":`true`,className:c?`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:M(`inline-flex items-center gap-1 rounded-full px-1.5 py-0.5 text-badge`,c?`bg-accent-green/15 text-accent-green`:`bg-dark-bg-tertiary text-dark-text-secondary`),children:[(0,X.jsx)(`span`,{className:M(`h-1.5 w-1.5 rounded-full`,c?`bg-accent-green`:`bg-dark-text-secondary`),"aria-hidden":`true`}),a(c?`projects.pmResident`:`projects.pmOff`)]}),(0,X.jsxs)(`div`,{className:`ms-auto flex shrink-0 items-center gap-1`,children:[(0,X.jsx)(`button`,{type:`button`,onClick:b,disabled:g||!o,className:M(`rounded px-2 py-0.5 text-meta transition-colors`,c?`text-dark-text-secondary hover:bg-dark-bg-tertiary hover:text-dark-text-primary`:`bg-accent-green/15 text-accent-green hover:bg-accent-green/25`),children:a(c?`projects.pmStop`:`projects.pmStart`)}),(0,X.jsx)(`button`,{type:`button`,onClick:()=>h(e=>!e),"aria-expanded":p,"aria-label":a(`projects.pmToggleTimeline`),className:`rounded p-1 text-dark-text-secondary hover:bg-dark-bg-tertiary hover:text-dark-text-primary`,children:p?(0,X.jsx)(n,{size:14,"aria-hidden":`true`}):(0,X.jsx)(w,{size:14,"aria-hidden":`true`})})]})]}),d.length>0&&(0,X.jsx)(`ul`,{className:`space-y-1.5 px-3 pb-2`,children:d.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)(m,{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 f(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)(S,{size:11,"aria-hidden":`true`}),` `,a(`projects.pmApprove`)]}),(0,X.jsxs)(`button`,{type:`button`,onClick:()=>void f(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)(_,{size:11,"aria-hidden":`true`}),` `,a(`projects.pmReject`)]})]})]})]})},e.escalationId))}),C?(0,X.jsx)(`div`,{className:`px-3 pb-2`,children:(0,X.jsx)(Ee,{route:C,root:T.root,onOpenThread:T.onOpenThread,onOpenSession:T.onOpenSession})}):null,i?(0,X.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col`,children:i}):null,p&&x.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:x.map(e=>(0,X.jsxs)(`li`,{className:`flex items-start gap-1.5 text-xs`,children:[e.type===`pm_report`?(0,X.jsx)(y,{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:De(e,a,T)}),(0,X.jsx)(`div`,{className:`text-badge text-dark-text-secondary`,children:L(e.at)})]})]},e.id))})})]})}),ke=[],Ae={setActiveTab:()=>{},createNewSession:()=>{},clearMessages:()=>{},setTheme:()=>{},setLogs:()=>{},setUnreadLogs:()=>{}},je=(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}=E(),d=K(e=>e.managers),f=K(e=>e.managersLoaded),p=K(e=>e.fetchManagers),m=K(t=>t.residentByProject[e]??!1),h=q(e=>e.setFocusedPmSession),g=q(e=>e.enterPmSession),_=q(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=D(e=>y?e.messagesBySession[y]??ke:ke),x=D(e=>y?e.generatingSessions.includes(y):!1),S=(0,Y.useCallback)(async t=>{let n=t.trim();n&&y&&(await W(e,n,y)?D.getState().addMessage(y,{id:`msg-${Date.now()}`,type:`user`,content:n,timestamp:Date.now()}):k.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)(Oe,{root:t,onOpenThread:r,onOpenSession:i,children:y?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(te,{messages:b,isGenerating:x,isPaused:!1,sessionId:y}),(0,X.jsx)(z,{sessionId:y,onSend:S,onStop:()=>s?.(y),onPause:()=>c?.(y),onResume:()=>l?.(y),slashOptions:o??Ae,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`,children:u(`projects.coordinatorHint`)})})})}),Me=(0,Y.memo)(function({projectName:e,projectRoot:t,missing:n,levelLabel:a,onBack:o,onBackToSessions:s,onOpenFolder:c,onNewSessionHere:d,threadsOpen:f,onToggleThreads:p,settingsOpen:m,onToggleSettings:h,onOpenMore:_,moreItemsCount:v}){let{t:y}=E(),b=e=>{let t=e.currentTarget.getBoundingClientRect();_(t.left,t.bottom+4,U(v))};return(0,X.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2 border-b border-dark-border px-3 py-2.5`,children:[(0,X.jsx)(`button`,{type:`button`,onClick:o,className:`ui-icon-button`,title:y(`projects.back`),"aria-label":y(`projects.back`),"data-testid":`project-detail-back`,children:(0,X.jsx)(i,{size:15,"aria-hidden":`true`})}),(0,X.jsxs)(`nav`,{className:`min-w-0 flex items-baseline gap-1.5 text-sm`,children:[(0,X.jsx)(`button`,{type:`button`,onClick:o,className:`shrink-0 text-dark-muted transition-colors hover:text-dark-text`,children:y(`projects.title`)}),(0,X.jsx)(`span`,{className:`shrink-0 text-dark-muted/50`,"aria-hidden":`true`,children:`›`}),(0,X.jsx)(`button`,{type:`button`,onClick:s,disabled:!s,className:M(`min-w-0 truncate transition-colors`,s?`text-dark-muted hover:text-dark-text`:`cursor-default text-dark-text`),"data-testid":`project-detail-name`,children:e}),(0,X.jsx)(`span`,{className:`shrink-0 text-dark-muted/50`,"aria-hidden":`true`,children:`›`}),(0,X.jsx)(`button`,{type:`button`,onClick:s,disabled:!s,className:M(`min-w-0 truncate transition-colors`,s?`text-dark-muted hover:text-dark-text`:`cursor-default font-medium text-dark-text`),"data-testid":`project-detail-level`,children:a})]}),(0,X.jsxs)(`div`,{className:`ms-auto flex items-center gap-2`,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:c,disabled:n,className:`btn shrink-0 text-meta disabled:cursor-not-allowed disabled:opacity-50`,title:n?y(`projects.openFolderDisabled`):t,"data-testid":`project-detail-open-folder`,children:[(0,X.jsx)(C,{size:12,"aria-hidden":`true`}),y(`projects.openFolder`)]}),(0,X.jsxs)(`button`,{type:`button`,onClick:d,disabled:n,className:`btn shrink-0 text-meta disabled:cursor-not-allowed disabled:opacity-50`,title:y(n?`projects.newSessionDisabled`:`projects.newSessionHere`),"data-testid":`project-detail-new-session-btn`,children:[(0,X.jsx)(g,{size:12,"aria-hidden":`true`}),y(`projects.newSessionHere`)]}),(0,X.jsx)(`button`,{type:`button`,onClick:p,"aria-expanded":f,className:M(`ui-icon-button`,f&&`bg-accent-blue/10 text-accent-blue`),title:y(`projects.railTabs`),"aria-label":y(`projects.railTabs`),"data-testid":`project-detail-threads`,children:(0,X.jsx)(r,{size:14,"aria-hidden":`true`})}),(0,X.jsx)(`button`,{type:`button`,onClick:h,"aria-expanded":m,className:`ui-icon-button`,title:y(`projects.settings`),"aria-label":y(`projects.settings`),"data-testid":`project-detail-settings`,children:(0,X.jsx)(u,{size:14,"aria-hidden":`true`})}),(0,X.jsx)(`button`,{type:`button`,onClick:b,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),b(e))},className:`ui-icon-button`,title:y(`projects.moreActions`),"aria-label":y(`projects.moreActions`),"aria-haspopup":`menu`,"data-testid":`project-detail-more`,children:(0,X.jsx)(l,{size:14,"aria-hidden":`true`})})]})]})}),Ne=(0,Y.memo)(function({projectId:e,onOpenSession:t}){let{t:n}=E(),r=K(e=>e.managers),i=K(e=>e.fetchManagers),a=K(t=>t.residentByProject[e]??!1),[o,c]=(0,Y.useState)(!1),[l,u]=(0,Y.useState)(!1),[d,f]=(0,Y.useState)(null),[p,m]=N();(0,Y.useEffect)(()=>{i()},[i]);let h=(0,Y.useMemo)(()=>r.find(t=>t.projectKey===e)??null,[r,e]),v=K(e=>e.managersLoaded),y=h?.managerSessionIds??[],b=(0,Y.useCallback)(async()=>{if(o)return;c(!0);let r=await de(e);await i(),c(!1),r?t(r):k.error(n(`projects.pmCreateFailed`),5e3)},[o,e,i,t,n]),S=(0,Y.useCallback)(async()=>{if(l)return;u(!0);let t=await J(e,!0);await i(),u(!1),t?k.success(n(`projects.pmEnableDone`),3e3):k.error(n(`projects.pmEnableFailed`),5e3)},[l,e,i,n]),C=(0,Y.useCallback)(async t=>{if(d||!await m({message:n(`projects.pmCloseSessionConfirm`),variant:`danger`}))return;f(t);let r=await me(e,t);await i(),f(null),r?k.success(n(`projects.pmCloseSessionDone`),3e3):k.error(n(`projects.pmCloseSessionFailed`),5e3)},[d,m,e,i,n]);return(0,X.jsxs)(`section`,{className:`flex min-h-0 flex-1 flex-col`,"aria-label":n(`projects.pmSessionList`),"data-testid":`pm-session-list`,children:[p,(0,X.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2 px-3 py-2`,children:[(0,X.jsx)(s,{size:14,className:M(`shrink-0`,a?`text-accent-green`:`text-dark-muted`),"aria-hidden":`true`}),(0,X.jsx)(`span`,{className:`text-xs font-medium text-dark-text`,children:n(`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:n(`projects.pmSessionCount`,{count:y.length})}),!a&&(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:n(`projects.pmOff`)}),(0,X.jsxs)(`div`,{className:`ms-auto flex items-center gap-1.5`,children:[!a&&(0,X.jsx)(`button`,{type:`button`,onClick:()=>void S(),disabled:l,className:`btn shrink-0 text-meta disabled:opacity-50`,"data-testid":`pm-session-enable`,children:n(`projects.pmEnable`)}),(0,X.jsxs)(`button`,{type:`button`,onClick:()=>void b(),disabled:o,className:`btn btn-primary shrink-0 text-meta disabled:opacity-50`,title:n(`projects.pmNewSession`),"data-testid":`pm-new-session`,children:[(0,X.jsx)(g,{size:12,"aria-hidden":`true`}),n(`projects.pmNewSession`)]})]})]}),(0,X.jsx)(`p`,{className:`shrink-0 px-3 pb-2 text-meta leading-relaxed text-dark-muted`,children:n(`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:[v&&y.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:n(`projects.emptyPmSessions`)}),(0,X.jsx)(`p`,{className:`mt-1 text-meta leading-relaxed text-dark-muted`,children:n(`projects.emptyPmSessionsHint`)})]}):null,y.map((e,r)=>{let i=r===0,o=!i;return(0,X.jsxs)(`div`,{className:`group relative`,children:[(0,X.jsxs)(`button`,{type:`button`,onClick:()=>t(e),className:M(`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`,o&&`pe-10`),"data-testid":`pm-session-row`,"data-session-id":e,children:[(0,X.jsx)(s,{size:13,"aria-hidden":`true`,className:M(`shrink-0`,a?`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:ue(y,e,n)}),i&&h?.isDuty&&(0,X.jsx)(`span`,{className:`shrink-0`,title:n(`projects.managerBadgeDuty`),children:(0,X.jsx)(x,{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})]}),!o&&(0,X.jsx)(w,{size:13,"aria-hidden":`true`,className:`shrink-0 text-dark-muted opacity-0 transition-opacity group-hover:opacity-70`})]}),o&&(0,X.jsx)(`button`,{type:`button`,onClick:()=>void C(e),disabled:d===e,"aria-label":n(`projects.pmCloseSession`),title:n(`projects.pmCloseSession`),className:M(`absolute end-2 top-1/2 -translate-y-1/2 rounded p-1 transition-opacity`,`text-dark-muted hover:text-accent-red disabled:opacity-50`,d===e?`opacity-100`:`opacity-0 focus-visible:opacity-100 group-hover:opacity-100`),"data-testid":`pm-close-session`,"data-session-id":e,children:(0,X.jsx)(_,{size:13,"aria-hidden":`true`})})]},e)})]})})]})}),Pe=200;function Fe({isOpen:e,onClose:t,projectId:n,currentName:r}){let{t:i}=E(),a=q(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?(k.success(i(`projects.renamed`),3e3),t()):k.error(s.error,6e3)};return(0,X.jsxs)(j,{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:Pe,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 Ie=(0,Y.memo)(function({projectId:e,onOpenThread:t}){let{t:n}=E(),r=q(e=>e.library),i=q(e=>e.libraryLoading),a=q(e=>e.libraryError),s=q(e=>e.openLibrary);(0,Y.useEffect)(()=>{s(e)},[e,s]);let c=(0,Y.useMemo)(()=>{if(!r)return[];let e=new Map;for(let t of r.items){let n=e.get(t.producerThreadId);n?n.push(t):e.set(t.producerThreadId,[t])}return[...e.entries()].map(([e,t])=>({threadId:e,thread:r.threads.find(t=>t.threadId===e),logicalGroups:I(t).sort((e,t)=>Re(t)-Re(e))}))},[r]),l=r?r.threads.length-c.length:0;return(0,X.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,"data-testid":`project-library`,children:[(0,X.jsxs)(`header`,{className:`flex shrink-0 items-center gap-2 border-b border-dark-border px-3 py-2`,children:[(0,X.jsx)(o,{size:13,className:`shrink-0 text-dark-muted`,"aria-hidden":`true`}),(0,X.jsx)(`span`,{className:`text-meta font-medium text-dark-text`,children:n(`projects.library`)}),r&&(0,X.jsx)(`span`,{className:`ms-auto shrink-0 font-mono text-badge text-dark-muted`,"data-testid":`project-library-counts`,children:n(`projects.libraryCounts`,{items:r.items.length,threads:c.length})})]}),(0,X.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-3 py-2`,children:[a&&(0,X.jsxs)(`div`,{className:`flex items-start gap-1.5 rounded-lg border border-accent-red/30 bg-accent-red/10 px-2 py-1.5 text-meta text-accent-red`,"data-testid":`project-library-error`,children:[(0,X.jsx)(p,{size:12,className:`mt-[1px] shrink-0`,"aria-hidden":`true`}),(0,X.jsx)(`span`,{className:`min-w-0 flex-1`,children:n(`projects.libraryFailed`,{message:a})}),(0,X.jsx)(`button`,{type:`button`,onClick:()=>void s(e),className:`shrink-0 underline-offset-2 hover:underline`,children:n(`projects.libraryRetry`)})]}),!a&&i&&!r&&(0,X.jsx)(`p`,{className:`text-meta text-dark-muted`,"data-testid":`project-library-loading`,children:n(`projects.libraryLoading`)}),!a&&r&&r.items.length===0&&(0,X.jsxs)(`div`,{"data-testid":`project-library-empty`,children:[(0,X.jsx)(`p`,{className:`text-meta font-medium text-dark-text`,children:n(`projects.libraryEmptyTitle`)}),(0,X.jsx)(`p`,{className:`mt-1 text-meta leading-relaxed text-dark-muted`,children:n(`projects.libraryEmptyBody`)})]}),(0,X.jsx)(`ul`,{className:`space-y-2`,children:c.map(({threadId:e,thread:r,logicalGroups:i})=>(0,X.jsxs)(`li`,{className:`rounded-lg border border-dark-border`,"data-testid":`project-library-group`,children:[(0,X.jsxs)(`button`,{type:`button`,onClick:()=>t(e),className:`flex w-full items-center gap-2 px-2 py-1.5 text-start transition-colors hover:bg-dark-hover`,title:n(`projects.libraryOpenThread`),children:[(0,X.jsx)(`span`,{className:`shrink-0 font-mono text-meta text-accent-blue`,children:r?.alias??e}),r?.title&&(0,X.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-meta text-dark-muted`,children:r.title}),r?.delivery&&(0,X.jsx)(`span`,{className:`ms-auto shrink-0 font-mono text-badge text-dark-muted/80`,children:se(r.delivery).join(` · `)})]}),(0,X.jsx)(`ul`,{className:`space-y-1 border-t border-dark-border px-2 py-1.5`,children:i.map(e=>(0,X.jsx)(Le,{versions:e},e[0].logicalId))})]},e))}),l>0&&(0,X.jsx)(`p`,{className:`mt-2 text-meta text-dark-muted/70`,"data-testid":`project-library-empty-threads`,children:n(`projects.libraryEmptyThreads`,{count:l})})]})]})});function Le({versions:e}){let{t}=E(),n=e[0],r=P(n.createdAt);return(0,X.jsxs)(`li`,{className:`text-meta`,"data-testid":`project-library-item`,children:[(0,X.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,X.jsx)(`span`,{className:`min-w-0 flex-1 truncate font-mono text-dark-text`,title:n.logicalId,children:n.logicalId}),(0,X.jsxs)(`span`,{className:`shrink-0 font-mono text-dark-muted`,children:[`v`,n.version]}),r&&(0,X.jsx)(`span`,{className:`shrink-0 font-mono text-badge text-dark-muted/70`,children:r})]}),(0,X.jsxs)(`div`,{className:`mt-0.5 flex flex-wrap items-center gap-x-2 text-badge text-dark-muted`,children:[(0,X.jsx)(`span`,{children:n.type}),(0,X.jsx)(`span`,{children:n.status}),n.reviewRequired&&(0,X.jsxs)(`span`,{children:[`review: `,n.reviewState]}),e.length>1&&(0,X.jsx)(`span`,{children:t(`threads.artifactVersions`,{count:e.length})})]}),n.path&&(0,X.jsx)(`div`,{className:`mt-0.5 truncate font-mono text-badge text-dark-muted/80`,title:n.path,children:n.path})]})}function Re(e){let t=0;for(let n of e){let e=Date.parse(n.createdAt??``);Number.isFinite(e)&&e>t&&(t=e)}return t}var ze=(0,Y.memo)(function({projectId:e,isOpen:t,onClose:n,selectedThreadId:i,onSelectThread:a,onOpenThreadSession:s}){let{t:c}=E(),[l,u]=(0,Y.useState)(`threads`);(0,Y.useEffect)(()=>{i&&u(`threads`)},[i]);let[d,f]=(0,Y.useState)(()=>typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(max-width: 767px)`).matches);(0,Y.useEffect)(()=>{if(typeof window.matchMedia!=`function`)return;let e=window.matchMedia(`(max-width: 767px)`),t=()=>f(e.matches);return e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[]),A({isOpen:t&&!d,onClose:n,lockScroll:!1});let p=(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(`div`,{role:`tablist`,"aria-label":c(`projects.railTabs`),className:`flex shrink-0 items-center gap-1 border-b border-dark-border px-2 py-1.5`,"data-testid":`project-rail-tabs`,children:[(0,X.jsx)(Be,{active:l===`threads`,onClick:()=>u(`threads`),icon:(0,X.jsx)(r,{size:12,"aria-hidden":`true`}),label:c(`threads.title`),testId:`project-rail-tab-threads`}),(0,X.jsx)(Be,{active:l===`library`,onClick:()=>u(`library`),icon:(0,X.jsx)(o,{size:12,"aria-hidden":`true`}),label:c(`projects.library`),testId:`project-rail-tab-library`})]}),(0,X.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col`,children:l===`library`?(0,X.jsx)(Ie,{projectId:e,onOpenThread:e=>a(e)}):i?(0,X.jsx)(ae,{threadId:i,onBack:()=>a(null),onOpenSession:s}):(0,X.jsx)(oe,{workspaceId:e,onOpenThread:a})})]});return d?(0,X.jsx)(H,{isOpen:t,onClose:n,title:c(`projects.railTabs`),size:`lg`,children:p}):t?(0,X.jsx)(`aside`,{className:`canvas-plane flex min-h-0 w-[360px] shrink-0 flex-col border-s border-dark-border bg-dark-bg lg:w-[440px]`,"data-testid":`project-rail`,"aria-label":c(`projects.railTabs`),children:p}):null});function Be({active:e,onClick:t,icon:n,label:r,testId:i}){return(0,X.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":e,onClick:t,className:M(`flex items-center gap-1.5 rounded px-2 py-1 text-meta transition-colors`,e?`bg-accent-blue/10 text-accent-blue`:`text-dark-muted hover:bg-dark-hover hover:text-dark-text`),"data-testid":i,children:[n,(0,X.jsx)(`span`,{children:r})]})}function Ve(){return typeof window>`u`||typeof window.matchMedia!=`function`||!window.matchMedia(`(max-width: 767px)`).matches}var He=(0,Y.memo)(function({projectId:e,onBack:n,onOpenFolder:r,onCopyRoot:i,onNewSessionHere:a,onOpenThreadSession:o,onOpenSession:s,onLoadSession:l,pmSlashOptions:u,onStopSession:d,onPauseSession:f,onResumeSession:m,onHide:_}){let{t:v}=E(),[y,b]=(0,Y.useState)(!1),[x,S]=(0,Y.useState)(!1),[w,T]=(0,Y.useState)(null),[D,O]=(0,Y.useState)(Ve),{state:k,openAt:A,close:j}=re(),M=q(e=>e.detail),N=q(e=>e.openPmSessionId),P=q(e=>e.enterPmSession),F=q(e=>e.backToPmSessions),I=K(e=>e.managers);(0,Y.useEffect)(()=>{q.getState().openProject(e)},[e]),(0,Y.useEffect)(()=>{T(null),b(!1),S(!1)},[e]);let L=M?.project??null,R=L?!L.rootExists:!1,ee=!L||R,te=(0,Y.useMemo)(()=>{if(!N)return v(`projects.pmSessionList`);let t=I.find(t=>t.projectKey===e)?.managerSessionIds??[];return ue(t,N,v)},[N,I,e,v]),z=(0,Y.useMemo)(()=>{if(!L)return[];let e=[{kind:`item`,id:`copy-root`,label:v(`projects.copyRoot`),icon:c,onSelect:()=>i(L.root)}];return _&&e.push({kind:`item`,id:`hide-view`,label:v(R?`projects.removeView`:`projects.hide`),icon:t,onSelect:()=>_(L.projectId)}),e},[L,R,i,_,v]);return(0,X.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,"data-testid":`project-detail`,children:[(0,X.jsx)(Me,{projectName:L?.name??e,projectRoot:L?.root,missing:ee,levelLabel:te,onBack:n,onBackToSessions:N?F:void 0,onOpenFolder:()=>L&&r(L.root),onNewSessionHere:()=>L&&a(L.root),threadsOpen:D,onToggleThreads:()=>O(e=>!e),settingsOpen:y,onToggleSettings:()=>b(e=>!e),onOpenMore:(e,t,n)=>A(e,t,null,{height:n}),moreItemsCount:z.length}),R&&L&&(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)(p,{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:v(`projects.rootMissingTitle`)}),L&&(0,X.jsx)(`span`,{className:`mx-1 font-mono`,children:L.root}),(0,X.jsx)(`br`,{}),v(`projects.rootMissingBody`)]})]}),y&&L&&(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)(C,{size:12,"aria-hidden":`true`}),label:v(`projects.openFolder`),hint:L.root,disabled:R,disabledHint:R?v(`projects.openFolderDisabled`):void 0,onClick:()=>r(L.root),testId:`project-settings-open-folder`}),(0,X.jsx)($,{icon:(0,X.jsx)(c,{size:12,"aria-hidden":`true`}),label:v(`projects.copyRoot`),hint:L.root,onClick:()=>i(L.root),testId:`project-settings-copy-root`}),(0,X.jsx)($,{icon:(0,X.jsx)(h,{size:12,"aria-hidden":`true`}),label:v(`projects.rename`),hint:L.name,onClick:()=>S(!0),testId:`project-settings-rename`}),(0,X.jsx)($,{icon:(0,X.jsx)(g,{size:12,"aria-hidden":`true`}),label:v(`projects.newSessionHere`),disabled:R,disabledHint:R?v(`projects.newSessionDisabled`):void 0,onClick:()=>L&&a(L.root),testId:`project-settings-new-session`})]}),(0,X.jsxs)(`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:N?(0,X.jsx)(je,{projectId:e,root:L?.root??e,sessionId:N,onOpenThread:e=>{O(!0),T(e)},onOpenSession:s,onLoadSession:l,slashOptions:u,onStop:d,onPause:f,onResume:m}):(0,X.jsx)(Ne,{projectId:e,onOpenSession:P})}),(0,X.jsx)(ze,{projectId:e,isOpen:D,onClose:()=>O(!1),selectedThreadId:w,onSelectThread:T,onOpenThreadSession:o})]}),(0,X.jsx)(V,{items:z,position:k?{x:k.x,y:k.y}:null,onClose:j,ariaLabel:v(`projects.moreActions`)}),L&&(0,X.jsx)(Fe,{isOpen:x,onClose:()=>S(!1),projectId:L.projectId,currentName:L.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:M(`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 Ue=250,We=(0,Y.memo)(function({workspaceDir:e,onNewSessionHere:n,onOpenThreadSession:r,onOpenSession:i,onLoadSession:a,pmSlashOptions:o,onStopSession:s,onPauseSession:c,onResumeSession:l}){let{t:u}=E(),{projects:m,hiddenProjects:h,hiddenCount:g,query:y,sort:x,loading:S,lastError:C,disabled:w,setQuery:T,setSort:D,openProjectId:O,enterProject:A,backToProjectList:j,createProject:N,hideProject:P,unhideProjects:F,refresh:I}=ge(),[L,R]=(0,Y.useState)(!1),[te,z]=(0,Y.useState)(!1),[ne,B]=(0,Y.useState)(!1),[V,re]=(0,Y.useState)(y),H=(0,Y.useRef)(null);(0,Y.useEffect)(()=>{re(y)},[y]),(0,Y.useEffect)(()=>()=>{H.current&&clearTimeout(H.current)},[]);let U=e=>{re(e),H.current&&clearTimeout(H.current),H.current=setTimeout(()=>T(e),Ue)},[ae,oe]=(0,Y.useState)(()=>Date.now());(0,Y.useEffect)(()=>{let e=setInterval(()=>oe(Date.now()),3e4);return()=>clearInterval(e)},[]);let se=(0,Y.useMemo)(()=>ce,[]),W=e=>{ie.openFolder(e).then(e=>{e.ok||k.error(e.error||u(`projects.openFolderFailed`),5e3)})},G=e=>{let t=navigator.clipboard?.writeText(e);t&&t.then(()=>k.success(u(`projects.copied`),2e3),()=>k.error(u(`projects.copyFailed`),4e3))};return w?(0,X.jsx)(`div`,{className:`flex h-full items-center justify-center p-6`,"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)(f,{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)(He,{projectId:O,onBack:j,onOpenFolder:W,onCopyRoot:G,onNewSessionHere:n,onOpenThreadSession:r,onOpenSession:i,onLoadSession:a,pmSlashOptions:o,onStopSession:s,onPauseSession:c,onResumeSession:l,onHide:e=>{P(e),k.info(u(`projects.hiddenToast`),4e3),j()}}):(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`,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:m.length})}),(0,X.jsx)(`div`,{className:`ms-1 flex items-center rounded-md bg-dark-hover/60 p-0.5`,role:`group`,children:se.map(e=>(0,X.jsx)(`button`,{type:`button`,onClick:()=>D(e),"aria-pressed":x===e,className:M(`shrink-0 rounded px-1.5 py-0.5 text-meta transition-colors`,x===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`,children:[(0,X.jsx)(`button`,{type:`button`,onClick:I,disabled:S,className:`ui-icon-button disabled:opacity-50`,title:u(`common.refresh`),"aria-label":u(`common.refresh`),"data-testid":`projects-refresh`,children:(0,X.jsx)(v,{size:14,className:M(S&&`animate-spin`),"aria-hidden":`true`})}),(0,X.jsxs)(`button`,{type:`button`,onClick:()=>R(!0),disabled:ne,className:`btn btn-primary shrink-0 text-meta disabled:opacity-60`,title:u(`projects.newHint`),"data-testid":`projects-new`,children:[(0,X.jsx)(d,{size:13,"aria-hidden":`true`}),u(`projects.new`)]})]})]}),C&&(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)(p,{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:C})}),(0,X.jsx)(`button`,{type:`button`,onClick:I,className:`shrink-0 underline hover:no-underline`,"data-testid":`projects-retry`,children:u(`projects.retry`)})]})}),g>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)(t,{size:11,className:`shrink-0`,"aria-hidden":`true`}),(0,X.jsx)(`span`,{className:`min-w-0 flex-1`,children:u(`projects.hiddenCount`,{count:g})}),(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)(b,{size:13,className:`shrink-0 text-dark-muted`,"aria-hidden":`true`}),(0,X.jsx)(`input`,{type:`text`,value:V,onChange:e=>U(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`}),V&&(0,X.jsx)(`button`,{type:`button`,onClick:()=>U(``),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)(_,{size:12,"aria-hidden":`true`})}),(0,X.jsx)(`span`,{className:`shrink-0 text-badge text-dark-muted/70`,children:u(`projects.serverFilterHint`)})]}),m.length===0?y.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:y.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:m.map(e=>(0,X.jsx)(xe,{project:e,onOpen:A,onOpenFolder:W,onCopyRoot:G,onHide:e=>{P(e),k.info(u(`projects.hiddenToast`),4e3)},now:ae},e.projectId))})]})]})})]}),(0,he.createPortal)((0,X.jsx)(_e,{isOpen:te,projects:h,onClose:()=>z(!1),onRestore:e=>{F(e),k.success(u(`projects.hiddenRestored`,{count:e.length}),3e3)}}),document.body),(0,he.createPortal)((0,X.jsx)(ee,{isOpen:L,initial:e||``,onClose:()=>R(!1),onConfirm:e=>{R(!1),B(!0),N(e).then(async e=>{if(!e.ok){B(!1),k.error(e.error,6e3);return}e.projectId&&A(e.projectId);let t=e.projectId?await J(e.projectId,!0):!1;B(!1),t?k.success(u(`projects.created`),3e3):k.error(u(`projects.createdNoPm`),6e3)})}}),document.body)]})});export{We as ProjectsView};
|