@evandu/super-pi 0.1.113 → 0.1.115
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 +16 -0
- package/bin/super-pi.js +95 -3
- package/dist/client/.super-pi-client-sources.json +3 -3
- package/dist/client/assets/{CodeMirrorEditor-moFTk5SE.js → CodeMirrorEditor-DNLm2zT6.js} +2 -2
- package/dist/client/assets/{dist-DQjJMys5.js → dist-2zLLUXCo.js} +1 -1
- package/dist/client/assets/{dist-BsO40qxQ.js → dist-4qEFEbMF.js} +1 -1
- package/dist/client/assets/{dist-DuWhzonJ.js → dist-BLldidtK.js} +1 -1
- package/dist/client/assets/{dist-DrbUrVWB.js → dist-BO4YrDmO.js} +1 -1
- package/dist/client/assets/{dist-DIfmMr8s.js → dist-BTsfS8CA.js} +1 -1
- package/dist/client/assets/{dist-Dnr5BxAi.js → dist-BVCGM9Bd.js} +1 -1
- package/dist/client/assets/{dist-BR4s0dNg.js → dist-B_N2ELl5.js} +1 -1
- package/dist/client/assets/{dist-TgNJUr7p.js → dist-BoV9nE13.js} +1 -1
- package/dist/client/assets/{dist-DPDGd2jl.js → dist-CEJcHfEn.js} +1 -1
- package/dist/client/assets/{dist-D9m04q-s.js → dist-CW83qn3P.js} +1 -1
- package/dist/client/assets/{dist-CCYnr6ul.js → dist-CezTi1ET.js} +1 -1
- package/dist/client/assets/{dist-BUuPRG15.js → dist-DszqHTui.js} +1 -1
- package/dist/client/assets/{dist-rhPxFuD1.js → dist-DuHJr7vQ.js} +1 -1
- package/dist/client/assets/{dist-Bds_PUYK.js → dist-JI_7suRx.js} +1 -1
- package/dist/client/assets/{dist-CL65aMXY.js → dist-pJBZJJnA.js} +1 -1
- package/dist/client/assets/{dist-DPvy57Ph.js → dist-zwqOqWyp.js} +1 -1
- package/dist/client/assets/{index-BixdV7aQ.js → index-CLoO6IHy.js} +2 -2
- package/dist/client/index.html +1 -1
- package/dist/extension.js +1 -1
- package/dist/server/application/conversation-service.js +8 -0
- package/dist/server/index.js +14 -4
- package/dist/server/logging.d.ts +32 -0
- package/dist/server/logging.js +132 -0
- package/package.json +2 -1
|
@@ -44,7 +44,7 @@ https://github.com/highlightjs/highlight.js/issues/2277`),i=e,r=t),n===void 0&&(
|
|
|
44
44
|
`)))}return{node:{type:`list`,ordered:n,start:n?Number(r[2]):1,items:a},next:o}}function Ip(e){let t=e.trim();t.startsWith(`|`)&&(t=t.slice(1)),t.endsWith(`|`)&&!t.endsWith(`\\|`)&&(t=t.slice(0,-1));let n=[],r=``;for(let e=0;e<t.length;e+=1)t[e]===`\\`&&t[e+1]===`|`?(r+=`|`,e+=1):t[e]===`|`?(n.push(r.trim()),r=``):r+=t[e];return n.push(r.trim()),n}function Lp(e){let t=e.startsWith(`:`),n=e.endsWith(`:`);return t&&n?`center`:n?`right`:t?`left`:null}function Rp(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(``);return n}var zp={alpha:`α`,beta:`β`,gamma:`γ`,delta:`δ`,epsilon:`ε`,varepsilon:`ε`,zeta:`ζ`,eta:`η`,theta:`θ`,vartheta:`ϑ`,iota:`ι`,kappa:`κ`,lambda:`λ`,mu:`μ`,nu:`ν`,xi:`ξ`,pi:`π`,varpi:`ϖ`,rho:`ρ`,varrho:`ϱ`,sigma:`σ`,varsigma:`ς`,tau:`τ`,upsilon:`υ`,phi:`φ`,varphi:`ϕ`,chi:`χ`,psi:`ψ`,omega:`ω`,Gamma:`Γ`,Delta:`Δ`,Theta:`Θ`,Lambda:`Λ`,Xi:`Ξ`,Pi:`Π`,Sigma:`Σ`,Upsilon:`Υ`,Phi:`Φ`,Psi:`Ψ`,Omega:`Ω`},Bp={times:`×`,div:`÷`,pm:`±`,mp:`∓`,cdot:`·`,ast:`∗`,star:`⋆`,circ:`∘`,bullet:`∙`,leq:`≤`,le:`≤`,geq:`≥`,ge:`≥`,neq:`≠`,ne:`≠`,approx:`≈`,sim:`∼`,simeq:`≃`,equiv:`≡`,propto:`∝`,ll:`≪`,gg:`≫`,in:`∈`,notin:`∉`,ni:`∋`,subset:`⊂`,subseteq:`⊆`,supset:`⊃`,supseteq:`⊇`,cup:`∪`,cap:`∩`,setminus:`∖`,emptyset:`∅`,varnothing:`∅`,aleph:`ℵ`,hbar:`ℏ`,ell:`ℓ`,Re:`ℜ`,Im:`ℑ`,sum:`∑`,prod:`∏`,coprod:`∐`,int:`∫`,iint:`∬`,iiint:`∭`,oint:`∮`,bigcup:`⋃`,bigcap:`⋂`,to:`→`,rightarrow:`→`,leftarrow:`←`,gets:`←`,leftrightarrow:`↔`,Rightarrow:`⇒`,Leftarrow:`⇐`,Leftrightarrow:`⇔`,mapsto:`↦`,longrightarrow:`⟶`,longleftarrow:`⟵`,uparrow:`↑`,downarrow:`↓`,ldots:`…`,cdots:`⋯`,vdots:`⋮`,ddots:`⋱`,dots:`…`,therefore:`∴`,because:`∵`,angle:`∠`,triangle:`△`,perp:`⊥`,parallel:`∥`,degree:`°`,prime:`′`,lbrace:`{`,rbrace:`}`,lbrack:`[`,rbrack:`]`,langle:`⟨`,rangle:`⟩`,lfloor:`⌊`,rfloor:`⌋`,lceil:`⌈`,rceil:`⌉`,vert:`|`,Vert:`‖`,backslash:`\\`,oplus:`⊕`,ominus:`⊖`,otimes:`⊗`,oslash:`⊘`,odot:`⊙`,dagger:`†`,ddagger:`‡`,quad:` `,qquad:` `,thinspace:` `,enspace:` `,negthinspace:``},Vp=new Set(`arcsin.arccos.arctan.sinh.cosh.tanh.cot.sec.csc.sin.cos.tan.log.ln.lg.exp.lim.limsup.liminf.max.min.det.dim.ker.deg.gcd.hom.arg.Pr.sup.inf`.split(`.`)),Hp={C:`ℂ`,H:`ℍ`,N:`ℕ`,P:`ℙ`,Q:`ℚ`,R:`ℝ`,Z:`ℤ`},Up={B:`ℬ`,E:`ℰ`,F:`ℱ`,H:`ℋ`,I:`ℐ`,L:`ℒ`,M:`ℳ`,R:`ℛ`,e:`ℯ`,g:`ℊ`,o:`ℴ`},Wp={mathbb:e=>Hp[e]??e.toUpperCase(),mathcal:e=>Up[e]??e.toUpperCase(),mathscr:e=>Up[e]??e.toUpperCase()},Gp=new Set([`left`,`right`,`big`,`Big`,`bigg`,`Bigg`,`bigl`,`bigr`,`Bigl`,`Bigr`,`biggl`,`biggr`,`Biggl`,`Biggr`,`middle`,`displaystyle`,`textstyle`,`scriptstyle`,`limits`,`nolimits`,`nonumber`,`notag`,`label`]),Kp={hat:`^`,widehat:`^`,bar:`‾`,overline:`‾`,tilde:`~`,widetilde:`~`,vec:`→`,dot:`·`,ddot:`··`,check:`ˇ`,breve:`˘`,acute:`´`,grave:"`"},qp=new Set([`(`,`)`,`[`,`]`,`|`,`/`,`<`,`>`]),Jp=new Set([`pmatrix`,`bmatrix`,`Bmatrix`,`vmatrix`,`Vmatrix`,`matrix`,`array`,`cases`,`aligned`,`align`,`alignat`,`split`,`gather`,`gathered`,`equation`,`smallmatrix`,`dcases`,`subarray`]);function Yp(e){let t=[],n=``,r=()=>{n&&=(t.push(...$p(n)),``)},i=e=>{r(),t.push(e)};for(let a=0;a<e.length;){let o=e[a];if(o===`\\`){let t=a,r=/^\\([a-zA-Z]+|.)/.exec(e.slice(a));if(!r){n+=o,a+=1;continue}let s=r[1];if(a+=r[0].length,s===`\\`){i({type:`math-row-break`});continue}if(s===`{`||s===`}`){n+=s;continue}if(s===`,`||s===`;`||s===`:`||s===`!`||s===`&`)continue;if(s===`%`){for(;a<e.length&&e[a]!==`
|
|
45
45
|
`;)a+=1;continue}if(Gp.has(s))continue;if(s===`begin`){let n=up(e,a),r=n.content,o=`\\end{${r}}`,s=e.indexOf(o,n.next),c=s===-1?e.length:s+o.length;i({type:`math-unsupported`,value:e.slice(t,c),reason:`\\begin{${r}} 不支持`}),a=c;continue}if(s===`frac`||s===`dfrac`||s===`tfrac`||s===`cfrac`){let t=Zp(e,a),n=Zp(e,t.next);a=n.next,i({type:`math-fraction`,numerator:Yp(t.content),denominator:Yp(n.content)});continue}if(s===`sqrt`){let t,n=a;if(e[n]===`[`){let r=Xp(e,n);t=Yp(r.content),n=r.next}let r=Zp(e,n);a=r.next,i({type:`math-root`,...t?{index:t}:{},radicand:Yp(r.content)});continue}if(s===`text`||s===`mathrm`||s===`textrm`||s===`mathbf`||s===`mathit`||s===`mathsf`||s===`mathtt`||s===`operatorname`||s===`textbf`){let t=up(e,a);a=t.next,i({type:`math-text`,value:t.content});continue}if(s in Wp){let t=Zp(e,a);a=t.next;let n=Wp[s];i({type:`math-text`,value:[...t.content].map(n).join(``)});continue}if(s in Kp){let t=Zp(e,a);a=t.next,i({type:`math-text`,value:`${em(Yp(t.content))}${Kp[s]}`});continue}if(s in zp){i({type:`math-identifier`,value:zp[s]});continue}if(s in Bp){let e=Bp[s];/^\d/.test(e)?i({type:`math-number`,value:e}):/^[A-Za-z]/.test(e)?i({type:`math-text`,value:e}):i({type:`math-operator`,value:e});continue}if(Vp.has(s)){i({type:`math-function`,value:s});continue}if(Jp.has(s))continue;i({type:`math-unsupported`,value:`\\${s}`,reason:`\\${s} 不支持`})}else if(o===`{`){let n=up(e,a);t.push(...Yp(n.content)),a=n.next}else if(o===`}`||o===`&`||o===`$`)a+=1;else if(o===`^`||o===`_`){r();let n=Zp(e,a+1);a=n.next,Qp(t,o===`^`?`sup`:`sub`,Yp(n.content))}else qp.has(o)?(i({type:`math-text`,value:o}),a+=1):(n+=o,a+=1)}return r(),t}function Xp(e,t){let n=e.indexOf(`]`,t+1);return n===-1?{content:``,next:e.length}:{content:e.slice(t+1,n),next:n+1}}function Zp(e,t){let n=e[t];if(n===void 0)return{content:``,next:t};if(n===`{`)return up(e,t);let r=/^\\[a-zA-Z]+/.exec(e.slice(t));return r?{content:r[0],next:t+r[0].length}:{content:n,next:t+1}}function Qp(e,t,n){let r=e.pop();if(r){if(r.type===`math-script`)t===`sub`&&!r.sub?e.push({...r,sub:n}):t===`sup`&&!r.sup?e.push({...r,sup:n}):e.push(r);else if(r.type===`math-identifier`||r.type===`math-text`){let i=[...r.value],a=i.pop()??``;i.length&&e.push({type:r.type,value:i.join(``)}),e.push({type:`math-script`,base:[{type:`math-identifier`,value:a}],...t===`sub`?{sub:n}:{sup:n}})}else e.push({type:`math-script`,base:[r],...t===`sub`?{sub:n}:{sup:n}})}}function $p(e){let t=[],n=0;for(;n<e.length;){let r=e.slice(n),i=/^\d+(?:\.\d+)?/.exec(r);if(i){t.push({type:`math-number`,value:i[0]}),n+=i[0].length;continue}let a=/^[A-Za-z]+/.exec(r);if(a){t.push(Vp.has(a[0])?{type:`math-function`,value:a[0]}:{type:`math-identifier`,value:a[0]}),n+=a[0].length;continue}let o=/^[,;:!.'’|()\-+=<>/*]+/.exec(r);o?(t.push({type:`math-operator`,value:o[0]}),n+=o[0].length):(t.push({type:`math-text`,value:r[0]}),n+=1)}return t.reduce((e,t)=>{let n=e[e.length-1];return n?.type===`math-operator`&&t.type===`math-operator`?n.value+=t.value:e.push({...t}),e},[])}function em(e){return e.map(e=>{switch(e.type){case`math-text`:case`math-number`:case`math-identifier`:case`math-operator`:case`math-function`:return e.value;case`math-script`:return`${em(e.base)}${e.sub?`_{${em(e.sub)}}`:``}${e.sup?`^{${em(e.sup)}}`:``}`;case`math-fraction`:return`\\frac{${em(e.numerator)}}{${em(e.denominator)}}`;case`math-root`:return`\\sqrt{${em(e.radicand)}}`;case`math-row-break`:return`\\\\`;case`math-unsupported`:return e.value;default:return``}}).join(``)}function tm({source:e}){let t=(0,z.useMemo)(()=>Np(e),[e]);return(0,B.jsx)(`div`,{className:`md`,"data-md":`1`,children:t.map((e,t)=>im(e,t))})}function nm({source:e}){let t=(0,z.useMemo)(()=>xp(e),[e]);return(0,B.jsx)(`span`,{className:`md md-inline`,children:t.map((e,t)=>om(e,t))})}function rm(e){return np(e).map((e,t)=>e.kind===`plain`?(0,B.jsx)(`span`,{children:e.text},t):(0,B.jsx)(`span`,{className:`code-token-${e.kind}`,children:e.text},t))}function im(e,t){switch(e.type){case`paragraph`:return(0,B.jsx)(`p`,{className:`md-p`,children:e.children.map((e,t)=>om(e,t))},t);case`heading`:{let n=`h${Math.min(6,Math.max(1,e.level))}`;return(0,B.jsx)(n,{className:`md-h md-h${e.level}`,children:e.children.map((e,t)=>om(e,t))},t)}case`code-block`:return(0,B.jsx)(`pre`,{className:`md-pre`,"data-md-lang":e.lang||void 0,children:(0,B.jsx)(`code`,{className:`md-code`,children:rm(e.value)})},t);case`list`:{let n=e.items.map((e,t)=>(0,B.jsx)(`li`,{className:`md-li`,children:e.map((e,t)=>im(e,t))},t));return e.ordered?(0,B.jsx)(`ol`,{className:`md-ol`,start:e.start>1?e.start:void 0,children:n},t):(0,B.jsx)(`ul`,{className:`md-ul`,children:n},t)}case`blockquote`:return(0,B.jsx)(`blockquote`,{className:`md-quote`,children:e.children.map((e,t)=>im(e,t))},t);case`rule`:return(0,B.jsx)(`hr`,{className:`md-rule`},t);case`table`:return(0,B.jsx)(`div`,{className:`md-table-wrap`,children:(0,B.jsxs)(`table`,{className:`md-table`,children:[(0,B.jsx)(`thead`,{children:(0,B.jsx)(`tr`,{children:e.head.map((t,n)=>(0,B.jsx)(`th`,{style:am(e.align[n]),children:t.map((e,t)=>om(e,t))},n))})}),(0,B.jsx)(`tbody`,{children:e.rows.map((t,n)=>(0,B.jsx)(`tr`,{children:t.map((t,n)=>(0,B.jsx)(`td`,{style:am(e.align[n]),children:t.map((e,t)=>om(e,t))},n))},n))})]})},t);case`math-block`:return(0,B.jsx)(sm,{source:e.source},t);default:return null}}var am=e=>e?{textAlign:e}:void 0;function om(e,t){switch(e.type){case`text`:return(0,B.jsx)(z.Fragment,{children:e.value},t);case`code`:return(0,B.jsx)(`code`,{className:`md-code-inline`,children:e.value},t);case`strong`:return(0,B.jsx)(`strong`,{className:`md-strong`,children:e.children.map((e,t)=>om(e,t))},t);case`em`:return(0,B.jsx)(`em`,{className:`md-em`,children:e.children.map((e,t)=>om(e,t))},t);case`del`:return(0,B.jsx)(`del`,{className:`md-del`,children:e.children.map((e,t)=>om(e,t))},t);case`break`:return(0,B.jsx)(`br`,{className:`md-break`},t);case`math`:return(0,B.jsx)(cm,{source:e.source},t);case`link`:{let n=op(e.href);return n?(0,B.jsx)(`a`,{className:`md-link`,href:n,title:e.title,target:`_blank`,rel:`noopener noreferrer nofollow`,children:e.children.map((e,t)=>om(e,t))},t):(0,B.jsx)(z.Fragment,{children:e.children.map((e,t)=>om(e,t))},t)}default:return null}}function sm({source:e}){let t=(0,z.useMemo)(()=>Yp(e),[e]);return(0,B.jsx)(`div`,{className:`md-math md-math-block`,"data-md-math":`block`,"data-md-math-source":e,children:t.map((e,t)=>lm(e,t))})}function cm({source:e}){let t=(0,z.useMemo)(()=>Yp(e),[e]);return(0,B.jsx)(`span`,{className:`md-math md-math-inline`,"data-md-math":`inline`,"data-md-math-source":e,children:t.map((e,t)=>lm(e,t))})}function lm(e,t){switch(e.type){case`math-text`:return(0,B.jsx)(`span`,{className:`md-m-text`,children:e.value},t);case`math-number`:return(0,B.jsx)(`span`,{className:`md-m-number`,children:e.value},t);case`math-identifier`:return(0,B.jsx)(`i`,{className:`md-m-var`,children:e.value},t);case`math-operator`:return(0,B.jsx)(`span`,{className:`md-m-op`,children:e.value},t);case`math-function`:return(0,B.jsx)(`span`,{className:`md-m-fn`,children:e.value},t);case`math-row-break`:return(0,B.jsx)(`br`,{className:`md-m-rowbreak`},t);case`math-unsupported`:return(0,B.jsx)(`span`,{className:`md-m-unsupported`,"data-md-math-unsupported":`1`,title:e.reason,children:e.value},t);case`math-script`:return(0,B.jsxs)(`span`,{className:`md-m-script`,children:[(0,B.jsx)(`span`,{className:`md-m-base`,children:e.base.map((e,t)=>lm(e,t))}),e.sup&&(0,B.jsx)(`sup`,{className:`md-m-sup`,children:e.sup.map((e,t)=>lm(e,t))}),e.sub&&(0,B.jsx)(`sub`,{className:`md-m-sub`,children:e.sub.map((e,t)=>lm(e,t))})]},t);case`math-fraction`:return(0,B.jsxs)(`span`,{className:`md-m-frac`,children:[(0,B.jsx)(`span`,{className:`md-m-num`,children:e.numerator.map((e,t)=>lm(e,t))}),(0,B.jsx)(`span`,{className:`md-m-den`,children:e.denominator.map((e,t)=>lm(e,t))})]},t);case`math-root`:return(0,B.jsxs)(`span`,{className:`md-m-root`,children:[(0,B.jsx)(`span`,{className:`md-m-radical`,children:`√`}),e.index&&(0,B.jsx)(`sup`,{className:`md-m-index`,children:e.index.map((e,t)=>lm(e,t))}),(0,B.jsx)(`span`,{className:`md-m-body`,children:e.radicand.map((e,t)=>lm(e,t))})]},t);default:return null}}var um=[[`help`,`Show help`],[`model`,`Choose model`],[`settings`,`Open settings`],[`clear`,`Clear session`],[`compact`,`Compact context`],[`reload`,`Reload agents`],[`new`,`New session`],[`fork`,`Fork session`],[`resume`,`Resume session`],[`stop`,`Stop run`],[`skill`,`Workspace skill`]].map(([e,t])=>({id:e,label:`/${e} — ${t}`,description:t})),dm=e=>e.normalize(`NFKD`).replace(/\p{M}/gu,``).toLowerCase();function fm(e,t){let n=dm(t.trim());return e.examples?.find(t=>dm(t).includes(n)&&t!==e.id)??e.id}function pm(e,t){let n=dm(t.trim());return n?e.filter(e=>dm(e.id).includes(n)||dm(e.label).includes(n)||e.examples?.some(e=>dm(e).includes(n))):e}function mm({query:e,anchorRect:t,command:n,workspaceId:r,onSelect:i,onClose:a}){let[o,s]=(0,z.useState)(0),[c,l]=(0,z.useState)(um),u=(0,z.useRef)(null),d=(0,z.useRef)([]);(0,z.useEffect)(()=>{let e=!1,t=r?`/api/skills?workspaceId=${encodeURIComponent(r)}`:`/api/skills`;return fetch(t).then(e=>e.ok?e.json():void 0).then(t=>{if(e||!Array.isArray(t?.skills))return;let n=t.skills.map(e=>{let t=e.id?.startsWith(`skill:`)?e.id:`skill:${e.name}`,n=e.description?.trim()||(e.scope===`workspace`?`工作区技能`:`技能`);return{id:t,label:n,description:n,examples:[t]}});l([...um.filter(e=>e.id!==`skill`),...n])}).catch(()=>{}),()=>{e=!0}},[r]);let f=pm([{id:`start`,label:`start — 打开浏览器`,description:`在浏览器中打开 Super Pi 控制台`,action:()=>n({type:`super_pi.start`})},{id:`restart`,label:`restart — 重启 Super Pi 服务`,description:`停掉并重新启动服务,加载磁盘上的新代码`,action:()=>n({type:`super_pi.restart`})},{id:`update`,label:`update — 更新 Super Pi`,description:`运行 npm install -g @evandu/super-pi 然后重启`,action:()=>n({type:`super_pi.update`})},...c],e),p=f.length===0?-1:Math.min(Math.max(o,0),f.length-1),m=e=>s(t=>f.length?Math.min(Math.max(t+e,0),f.length-1):0);(0,z.useEffect)(()=>{let e=e=>{u.current?.contains(e.target)||a()};return window.addEventListener(`mousedown`,e),()=>window.removeEventListener(`mousedown`,e)},[a]),(0,z.useEffect)(()=>{s(0)},[e]),(0,z.useLayoutEffect)(()=>{p>=0&&d.current[p]?.scrollIntoView({block:`nearest`})},[p]);let h={position:`fixed`,left:Math.max(8,Math.min(t.left,window.innerWidth-360)),bottom:Math.max(8,window.innerHeight-t.top+6),zIndex:200};return(0,B.jsx)(`div`,{ref:u,className:`slash-menu`,style:h,role:`listbox`,"aria-label":`斜杠命令`,onKeyDown:e=>{if(e.key===`Escape`)e.preventDefault(),a();else if(e.key===`ArrowDown`)e.preventDefault(),m(1);else if(e.key===`ArrowUp`)e.preventDefault(),m(-1);else if(e.key===`Home`)e.preventDefault(),s(0);else if(e.key===`End`)e.preventDefault(),s(f.length-1);else if(e.key===`Enter`){e.preventDefault();let t=f[p];if(!t)return;t.action?(t.action(),a()):i(t)}},children:f.length===0?(0,B.jsxs)(`div`,{className:`slash-menu-empty`,children:[`没有匹配「`,e,`」的命令`]}):f.map((e,t)=>(0,B.jsxs)(`button`,{ref:e=>{d.current[t]=e},type:`button`,role:`option`,"aria-selected":t===p,className:`slash-menu-item${t===p?` selected`:``}`,"data-slash-command":e.id,onClick:()=>{e.action?(e.action(),a()):i(e)},onMouseEnter:()=>s(t),children:[(0,B.jsxs)(`span`,{className:`slash-menu-item-id`,children:[`/`,e.id]}),(0,B.jsx)(`span`,{className:`slash-menu-item-sep`,"aria-hidden":`true`,children:` — `}),(0,B.jsx)(`span`,{className:`slash-menu-item-label`,children:e.label}),e.examples?.length?(0,B.jsx)(`span`,{className:`slash-menu-item-examples`,children:e.examples.slice(0,2).join(` · `)}):null]},e.id))})}function hm(){}hm.prototype={diff:function(e,t){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},r=n.callback;typeof n==`function`&&(r=n,n={}),this.options=n;var i=this;function a(e){return r?(setTimeout(function(){r(void 0,e)},0),!0):e}e=this.castInput(e),t=this.castInput(t),e=this.removeEmpty(this.tokenize(e)),t=this.removeEmpty(this.tokenize(t));var o=t.length,s=e.length,c=1,l=o+s;n.maxEditLength&&(l=Math.min(l,n.maxEditLength));var u=n.timeout??1/0,d=Date.now()+u,f=[{oldPos:-1,lastComponent:void 0}],p=this.extractCommon(f[0],t,e,0);if(f[0].oldPos+1>=s&&p+1>=o)return a([{value:this.join(t),count:t.length}]);var m=-1/0,h=1/0;function g(){for(var n=Math.max(m,-c);n<=Math.min(h,c);n+=2){var r=void 0,l=f[n-1],u=f[n+1];l&&(f[n-1]=void 0);var d=!1;if(u){var g=u.oldPos-n;d=u&&0<=g&&g<o}var _=l&&l.oldPos+1<s;if(!d&&!_)f[n]=void 0;else{if(r=!_||d&&l.oldPos+1<u.oldPos?i.addToPath(u,!0,void 0,0):i.addToPath(l,void 0,!0,1),p=i.extractCommon(r,t,e,n),r.oldPos+1>=s&&p+1>=o)return a(gm(i,r.lastComponent,t,e,i.useLongestToken));f[n]=r,r.oldPos+1>=s&&(h=Math.min(h,n-1)),p+1>=o&&(m=Math.max(m,n+1))}}c++}if(r)(function e(){setTimeout(function(){if(c>l||Date.now()>d)return r();g()||e()},0)})();else for(;c<=l&&Date.now()<=d;){var _=g();if(_)return _}},addToPath:function(e,t,n,r){var i=e.lastComponent;return i&&i.added===t&&i.removed===n?{oldPos:e.oldPos+r,lastComponent:{count:i.count+1,added:t,removed:n,previousComponent:i.previousComponent}}:{oldPos:e.oldPos+r,lastComponent:{count:1,added:t,removed:n,previousComponent:i}}},extractCommon:function(e,t,n,r){for(var i=t.length,a=n.length,o=e.oldPos,s=o-r,c=0;s+1<i&&o+1<a&&this.equals(t[s+1],n[o+1]);)s++,o++,c++;return c&&(e.lastComponent={count:c,previousComponent:e.lastComponent}),e.oldPos=o,s},equals:function(e,t){return this.options.comparator?this.options.comparator(e,t):e===t||this.options.ignoreCase&&e.toLowerCase()===t.toLowerCase()},removeEmpty:function(e){for(var t=[],n=0;n<e.length;n++)e[n]&&t.push(e[n]);return t},castInput:function(e){return e},tokenize:function(e){return e.split(``)},join:function(e){return e.join(``)}};function gm(e,t,n,r,i){for(var a=[],o;t;)a.push(t),o=t.previousComponent,delete t.previousComponent,t=o;a.reverse();for(var s=0,c=a.length,l=0,u=0;s<c;s++){var d=a[s];if(!d.removed){if(!d.added&&i){var f=n.slice(l,l+d.count);f=f.map(function(e,t){var n=r[u+t];return n.length>e.length?n:e}),d.value=e.join(f)}else d.value=e.join(n.slice(l,l+d.count));l+=d.count,d.added||(u+=d.count)}else if(d.value=e.join(r.slice(u,u+d.count)),u+=d.count,s&&a[s-1].added){var p=a[s-1];a[s-1]=a[s],a[s]=p}}var m=a[c-1];return c>1&&typeof m.value==`string`&&(m.added||m.removed)&&e.equals(``,m.value)&&(a[c-2].value+=m.value,a.pop()),a}new hm;var _m=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,vm=/\S/,ym=new hm;ym.equals=function(e,t){return this.options.ignoreCase&&(e=e.toLowerCase(),t=t.toLowerCase()),e===t||this.options.ignoreWhitespace&&!vm.test(e)&&!vm.test(t)},ym.tokenize=function(e){for(var t=e.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/),n=0;n<t.length-1;n++)!t[n+1]&&t[n+2]&&_m.test(t[n])&&_m.test(t[n+2])&&(t[n]+=t[n+2],t.splice(n+1,2),n--);return t};var bm=new hm;bm.tokenize=function(e){this.options.stripTrailingCr&&(e=e.replace(/\r\n/g,`
|
|
46
46
|
`));var t=[],n=e.split(/(\n|\r\n)/);n[n.length-1]||n.pop();for(var r=0;r<n.length;r++){var i=n[r];r%2&&!this.options.newlineIsToken?t[t.length-1]+=i:(this.options.ignoreWhitespace&&(i=i.trim()),t.push(i))}return t};function xm(e,t,n){return bm.diff(e,t,n)}var Sm=new hm;Sm.tokenize=function(e){return e.split(/(\S.+?[.!?])(?=\s+|$)/)};var Cm=new hm;Cm.tokenize=function(e){return e.split(/([{}:;,]|\s+)/)};function wm(e){"@babel/helpers - typeof";return wm=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},wm(e)}var Tm=Object.prototype.toString,Em=new hm;Em.useLongestToken=!0,Em.tokenize=bm.tokenize,Em.castInput=function(e){var t=this.options,n=t.undefinedReplacement,r=t.stringifyReplacer,i=r===void 0?function(e,t){return t===void 0?n:t}:r;return typeof e==`string`?e:JSON.stringify(Dm(e,null,null,i),i,` `)},Em.equals=function(e,t){return hm.prototype.equals.call(Em,e.replace(/,([\r\n])/g,`$1`),t.replace(/,([\r\n])/g,`$1`))};function Dm(e,t,n,r,i){t||=[],n||=[],r&&(e=r(i,e));for(var a=0;a<t.length;a+=1)if(t[a]===e)return n[a];var o;if(Tm.call(e)===`[object Array]`){for(t.push(e),o=Array(e.length),n.push(o),a=0;a<e.length;a+=1)o[a]=Dm(e[a],t,n,r,i);return t.pop(),n.pop(),o}if(e&&e.toJSON&&(e=e.toJSON()),wm(e)===`object`&&e!==null){t.push(e),o={},n.push(o);var s=[],c;for(c in e)e.hasOwnProperty(c)&&s.push(c);for(s.sort(),a=0;a<s.length;a+=1)c=s[a],o[c]=Dm(e[c],t,n,r,c);t.pop(),n.pop()}else o=e;return o}var Om=new hm;Om.tokenize=function(e){return e.slice()},Om.join=Om.removeEmpty=function(e){return e};function km(e,t){let n=xm(e??``,t??``),r=[],i=0,a=0,o=1,s=1;for(let e of n){let t=e.value.split(`
|
|
47
|
-
`),n=t.length>0&&t[t.length-1]===``;n&&t.pop();for(let c=0;c<t.length;c+=1){let l=t[c],u=c===t.length-1&&!n;e.added?(r.push({kind:`added`,text:l,newLine:s,noNewline:u}),s+=1,i+=1):e.removed?(r.push({kind:`removed`,text:l,oldLine:o,noNewline:u}),o+=1,a+=1):(r.push({kind:`same`,text:l,oldLine:o,newLine:s,noNewline:u}),o+=1,s+=1)}}return{lines:r,added:i,removed:a,identical:i===0&&a===0}}function Am(e,t=3){let n=new Set;e.lines.forEach((r,i)=>{if(r.kind!==`same`)for(let r=-t;r<=t;r+=1){let t=i+r;t>=0&&t<e.lines.length&&n.add(t)}});let r=[],i=0,a=!1;return e.lines.forEach((e,t)=>{n.has(t)?(a&&=(r.push({kind:`fold`,text:`⋯ 省略未改动的行`}),!1),r.push(e)):a||(a=!0,i+=1)}),a&&r.push({kind:`fold`,text:`⋯ 省略未改动的行`}),{lines:r,folded:i}}function jm(e){return Array.isArray?Array.isArray(e):Vm(e)===`[object Array]`}function Mm(e){if(typeof e==`string`)return e;if(typeof e==`bigint`)return e.toString();let t=e+``;return t==`0`&&1/e==-1/0?`-0`:t}function Nm(e){return e==null?``:Mm(e)}function Pm(e){return typeof e==`string`}function Fm(e){return typeof e==`number`}function Im(e){return e===!0||e===!1||Rm(e)&&Vm(e)==`[object Boolean]`}function Lm(e){return typeof e==`object`}function Rm(e){return Lm(e)&&e!==null}function zm(e){return e!=null}function Bm(e){return!e.trim().length}function Vm(e){return e==null?e===void 0?`[object Undefined]`:`[object Null]`:Object.prototype.toString.call(e)}var Hm=`Incorrect 'index' type`,Um=`Invalid doc index: must be a non-negative integer within the bounds of the docs array`,Wm=e=>`Invalid value for key ${e}`,Gm=e=>`Pattern length exceeds max of ${e}.`,Km=e=>`Missing ${e} property in key`,qm=e=>`Property 'weight' in key '${e}' must be a positive integer`,Jm=`Fuse.match does not support useTokenSearch: token search requires corpus-level statistics (df, fieldCount) that a one-off string comparison does not have. Use new Fuse(...).search(...) instead.`,Ym=Object.prototype.hasOwnProperty,Xm=class{constructor(e){this._keys=[],this._keyMap={};let t=0;e.forEach(e=>{let n=Zm(e);this._keys.push(n),this._keyMap[n.id]=n,t+=n.weight}),this._keys.forEach(e=>{e.weight/=t})}get(e){return this._keyMap[e]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}};function Zm(e){let t=null,n=null,r=null,i=1,a=null;if(Pm(e)||jm(e))r=e,t=Qm(e),n=$m(e);else{if(!Ym.call(e,`name`))throw Error(Km(`name`));let o=e.name;if(r=o,Ym.call(e,`weight`)&&e.weight!==void 0&&(i=e.weight,i<=0))throw Error(qm($m(o)));t=Qm(o),n=$m(o),a=e.getFn??null}return{path:t,id:n,weight:i,src:r,getFn:a}}function Qm(e){return jm(e)?e:e.split(`.`)}function $m(e){return jm(e)?e.join(`.`):e}function eh(e,t){let n=[],r=!1,i=(e,t,a,o)=>{if(zm(e)){if(!t[a])n.push(o===void 0?e:{v:e,i:o});else{let s=e[t[a]];if(!zm(s))return;if(a===t.length-1&&(Pm(s)||Fm(s)||Im(s)||typeof s==`bigint`))n.push(o===void 0?Nm(s):{v:Nm(s),i:o});else if(jm(s)){r=!0;for(let e=0,n=s.length;e<n;e+=1)i(s[e],t,a+1,e)}else t.length&&i(s,t,a+1,o)}}};return i(e,Pm(t)?t.split(`.`):t,0),r?n:n[0]}var th={includeMatches:!1,findAllMatches:!1,minMatchCharLength:1},nh={isCaseSensitive:!1,ignoreDiacritics:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:(e,t)=>e.score===t.score?e.idx<t.idx?-1:1:e.score<t.score?-1:1},rh={location:0,threshold:.6,distance:100},ih={useExtendedSearch:!1,useTokenSearch:!1,tokenize:void 0,tokenMatch:`any`,getFn:eh,ignoreLocation:!1,ignoreFieldNorm:!1,fieldNormWeight:1},Y=Object.freeze({...nh,...th,...rh,...ih});function ah(e){return e>=9&&e<=13||e===32||e===160}function oh(e=1,t=3){let n=new Map,r=10**t;return{get(t){let i=0,a=!1;for(let e=0;e<t.length;e++)ah(t.charCodeAt(e))?a=!1:a||=(i++,!0);if(i===0&&(i=1),n.has(i))return n.get(i);let o=Math.round(r/i**(.5*e))/r;return n.set(i,o),o},clear(){n.clear()}}}var sh=class{constructor({getFn:e=Y.getFn,fieldNormWeight:t=Y.fieldNormWeight}={}){this.norm=oh(t,3),this.getFn=e,this.isCreated=!1,this.docs=[],this.keys=[],this._keysMap={},this.setIndexRecords()}setSources(e=[]){this.docs=e}setIndexRecords(e=[]){this.records=e}setKeys(e=[]){this.keys=e,this._keysMap={},e.forEach((e,t)=>{this._keysMap[e.id]=t})}create(){if(this.isCreated||!this.docs.length)return;this.isCreated=!0;let e=this.docs.length;this.records=Array(e);let t=0;if(Pm(this.docs[0]))for(let n=0;n<e;n++){let e=this._createStringRecord(this.docs[n],n);e&&(this.records[t++]=e)}else for(let n=0;n<e;n++)this.records[t++]=this._createObjectRecord(this.docs[n],n);this.records.length=t,this.norm.clear()}add(e,t){if(!Number.isInteger(t)||t<0)throw Error(Um);if(Pm(e)){let n=this._createStringRecord(e,t);return n&&this.records.push(n),n}let n=this._createObjectRecord(e,t);return this.records.push(n),n}removeAt(e){if(!Number.isInteger(e)||e<0)throw Error(Um);for(let t=0,n=this.records.length;t<n;t+=1)if(this.records[t].i===e){this.records.splice(t,1);break}for(let t=0,n=this.records.length;t<n;t+=1)this.records[t].i>e&&--this.records[t].i}removeAll(e){let t=new Set;for(let n of e)Number.isInteger(n)&&n>=0&&t.add(n);if(t.size===0)return;this.records=this.records.filter(e=>!t.has(e.i));let n=Array.from(t).sort((e,t)=>e-t);for(let e of this.records){let t=0,r=n.length;for(;t<r;){let i=t+r>>>1;n[i]<e.i?t=i+1:r=i}e.i-=t}}getValueForItemAtKeyId(e,t){return e[this._keysMap[t]]}size(){return this.records.length}_createStringRecord(e,t){return!zm(e)||Bm(e)?null:{v:e,i:t,n:this.norm.get(e)}}_createObjectRecord(e,t){let n={i:t,$:{}};for(let t=0,r=this.keys.length;t<r;t++){let r=this.keys[t],i=r.getFn?r.getFn(e):this.getFn(e,r.path);if(zm(i)){if(jm(i)){let e=[];for(let t=0,n=i.length;t<n;t+=1){let n=i[t];if(zm(n)){if(Pm(n)){if(!Bm(n)){let r={v:n,i:t,n:this.norm.get(n)};e.push(r)}}else if(zm(n.v)){let t=Pm(n.v)?n.v:Nm(n.v);if(!Bm(t)){let r={v:t,i:n.i,n:this.norm.get(t)};e.push(r)}}}}n.$[t]=e}else if(Pm(i)&&!Bm(i)){let e={v:i,n:this.norm.get(i)};n.$[t]=e}}}return n}toJSON(){return{keys:this.keys.map(({getFn:e,...t})=>t),records:this.records}}};function ch(e,t,{getFn:n=Y.getFn,fieldNormWeight:r=Y.fieldNormWeight}={}){let i=new sh({getFn:n,fieldNormWeight:r});return i.setKeys(e.map(Zm)),i.setSources(t),i.create(),i}function lh(e,{getFn:t=Y.getFn,fieldNormWeight:n=Y.fieldNormWeight}={}){let{keys:r,records:i}=e,a=new sh({getFn:t,fieldNormWeight:n});return a.setKeys(r),a.setIndexRecords(i),a}function uh(e=[],t=Y.minMatchCharLength){let n=[],r=-1,i=-1,a=0;for(let o=e.length;a<o;a+=1){let o=e[a];o&&r===-1?r=a:!o&&r!==-1&&(i=a-1,i-r+1>=t&&n.push([r,i]),r=-1)}return e[a-1]&&a-r>=t&&n.push([r,a-1]),n}function dh(e,t,n,{location:r=Y.location,distance:i=Y.distance,threshold:a=Y.threshold,findAllMatches:o=Y.findAllMatches,minMatchCharLength:s=Y.minMatchCharLength,includeMatches:c=Y.includeMatches,ignoreLocation:l=Y.ignoreLocation}={}){if(t.length>32)throw Error(Gm(32));let u=t.length,d=e.length,f=Math.max(0,Math.min(r,d)),p=a,m=f,h=(e,t)=>{let n=e/u;if(l)return n;let r=Math.abs(f-t);return i?n+r/i:r?1:n},g=s>1||c,_=g?Array(d):[],v;for(;(v=e.indexOf(t,m))>-1;){let e=h(0,v);if(p=Math.min(e,p),m=v+u,g){let e=0;for(;e<u;)_[v+e]=1,e+=1}}m=-1;let y=[],b=1,x=0,S=u+d,C=1<<u-1;for(let t=0;t<u;t+=1){let r=0,i=S;for(;r<i;)h(t,f+i)<=p?r=i:S=i,i=Math.floor((S-r)/2+r);S=i;let a=Math.max(1,f-i+1),s=o?d:Math.min(f+i,d)+u,c=Array(s+2);c[s+1]=(1<<t)-1;for(let r=s;r>=a;--r){let i=r-1,o=n[e[i]];if(c[r]=(c[r+1]<<1|1)&o,t&&(c[r]|=(y[r+1]|y[r])<<1|1|y[r+1]),c[r]&C&&(b=h(t,i),b<=p)){if(p=b,m=i,x=t,m<=f)break;a=Math.max(1,2*f-m)}}if(h(t+1,f)>p)break;y=c}if(g&&m>=0){let t=Math.min(d-1,m+u-1+x);for(let r=m;r<=t;r+=1)n[e[r]]&&(_[r]=1)}let w={isMatch:m>=0,score:Math.max(.001,b)};if(g){let e=uh(_,s);e.length?c&&(w.indices=e):w.isMatch=!1}return w}function fh(e){let t={};for(let n=0,r=e.length;n<r;n+=1){let i=e.charAt(n);t[i]=(t[i]||0)|1<<r-n-1}return t}function ph(e){if(e.length<=1)return e;e.sort((e,t)=>e[0]-t[0]||e[1]-t[1]);let t=[e[0]];for(let n=1,r=e.length;n<r;n+=1){let r=t[t.length-1],i=e[n];i[0]<=r[1]+1?r[1]=Math.max(r[1],i[1]):t.push(i)}return t}var mh={ł:`l`,Ł:`L`,đ:`d`,Đ:`D`,ø:`o`,Ø:`O`,ħ:`h`,Ħ:`H`,ŧ:`t`,Ŧ:`T`,ı:`i`,ß:`ss`},hh=RegExp(`[`+Object.keys(mh).join(``)+`]`,`g`),gh=typeof String.prototype.normalize==`function`?e=>e.normalize(`NFD`).replace(/[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D3-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09FE\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C04\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F]/g,``).replace(hh,e=>mh[e]):e=>e,_h=class{constructor(e,{location:t=Y.location,threshold:n=Y.threshold,distance:r=Y.distance,includeMatches:i=Y.includeMatches,findAllMatches:a=Y.findAllMatches,minMatchCharLength:o=Y.minMatchCharLength,isCaseSensitive:s=Y.isCaseSensitive,ignoreDiacritics:c=Y.ignoreDiacritics,ignoreLocation:l=Y.ignoreLocation}={}){if(this.options={location:t,threshold:n,distance:r,includeMatches:i,findAllMatches:a,minMatchCharLength:o,isCaseSensitive:s,ignoreDiacritics:c,ignoreLocation:l},e=s?e:e.toLowerCase(),e=c?gh(e):e,this.pattern=e,this.chunks=[],!this.pattern.length)return;let u=(e,t)=>{this.chunks.push({pattern:e,alphabet:fh(e),startIndex:t})},d=this.pattern.length;if(d>32){let e=0,t=d%32,n=d-t;for(;e<n;)u(this.pattern.substr(e,32),e),e+=32;if(t){let e=d-32;u(this.pattern.substr(e),e)}}else u(this.pattern,0)}searchIn(e){let{isCaseSensitive:t,ignoreDiacritics:n,includeMatches:r}=this.options;if(e=t?e:e.toLowerCase(),e=n?gh(e):e,this.pattern===e){if(e.length<this.options.minMatchCharLength)return{isMatch:!1,score:1};let t={isMatch:!0,score:0};return r&&(t.indices=[[0,e.length-1]]),t}let{location:i,distance:a,threshold:o,findAllMatches:s,minMatchCharLength:c,ignoreLocation:l}=this.options,u=[],d=0,f=!1;this.chunks.forEach(({pattern:t,alphabet:n,startIndex:p})=>{let{isMatch:m,score:h,indices:g}=dh(e,t,n,{location:i+p,distance:a,threshold:o,findAllMatches:s,minMatchCharLength:c,includeMatches:r,ignoreLocation:l});m&&(f=!0),d+=h,m&&g&&u.push(...g)});let p={isMatch:f,score:f?d/this.chunks.length:1};return f&&r&&(p.indices=ph(u)),p}},vh=new Set([`fuzzy`,`include`]);function yh(e){return e.startsWith(`inverse`)}var bh=[{type:`exact`,multiRegex:/^="(.*)"$/,singleRegex:/^=(.*)$/,create:e=>({type:`exact`,search(t){let n=t===e;return{isMatch:n,score:+!n,indices:[0,e.length-1]}}})},{type:`include`,multiRegex:/^'"(.*)"$/,singleRegex:/^'(.*)$/,create:e=>({type:`include`,search(t){let n=0,r,i=[],a=e.length;for(;(r=t.indexOf(e,n))>-1;)n=r+a,i.push([r,n-1]);let o=!!i.length;return{isMatch:o,score:+!o,indices:i}}})},{type:`prefix-exact`,multiRegex:/^\^"(.*)"$/,singleRegex:/^\^(.*)$/,create:e=>({type:`prefix-exact`,search(t){let n=t.startsWith(e);return{isMatch:n,score:+!n,indices:[0,e.length-1]}}})},{type:`inverse-prefix-exact`,multiRegex:/^!\^"(.*)"$/,singleRegex:/^!\^(.*)$/,create:e=>({type:`inverse-prefix-exact`,search(t){let n=!t.startsWith(e);return{isMatch:n,score:+!n,indices:[0,t.length-1]}}})},{type:`inverse-suffix-exact`,multiRegex:/^!"(.*)"\$$/,singleRegex:/^!(.*)\$$/,create:e=>({type:`inverse-suffix-exact`,search(t){let n=!t.endsWith(e);return{isMatch:n,score:+!n,indices:[0,t.length-1]}}})},{type:`suffix-exact`,multiRegex:/^"(.*)"\$$/,singleRegex:/^(.*)\$$/,create:e=>({type:`suffix-exact`,search(t){let n=t.endsWith(e);return{isMatch:n,score:+!n,indices:[t.length-e.length,t.length-1]}}})},{type:`inverse-exact`,multiRegex:/^!"(.*)"$/,singleRegex:/^!(.*)$/,create:e=>({type:`inverse-exact`,search(t){let n=t.indexOf(e)===-1;return{isMatch:n,score:+!n,indices:[0,t.length-1]}}})},{type:`fuzzy`,multiRegex:/^"(.*)"$/,singleRegex:/^(.*)$/,create:(e,t={})=>{let n=new _h(e,{location:t.location??Y.location,threshold:t.threshold??Y.threshold,distance:t.distance??Y.distance,includeMatches:t.includeMatches??Y.includeMatches,findAllMatches:t.findAllMatches??Y.findAllMatches,minMatchCharLength:t.minMatchCharLength??Y.minMatchCharLength,isCaseSensitive:t.isCaseSensitive??Y.isCaseSensitive,ignoreDiacritics:t.ignoreDiacritics??Y.ignoreDiacritics,ignoreLocation:t.ignoreLocation??Y.ignoreLocation});return{type:`fuzzy`,search(e){return n.searchIn(e)}}}}],xh=bh.length,Sh=`\0`,Ch=`|`;function wh(e){let t=[],n=e.length,r=0;for(;r<n;){for(;r<n&&e[r]===` `;)r++;if(r>=n)break;let i=r;for(;i<n&&e[i]!==` `&&e[i]!==`"`;)i++;if(i<n&&e[i]===`"`){for(i++;i<n;){if(e[i]===`"`){let t=i+1;if(t>=n||e[t]===` `){i++;break}if(e[t]===`$`&&(t+1>=n||e[t+1]===` `)){i+=2;break}}i++}t.push(e.substring(r,i)),r=i}else{for(;i<n&&e[i]!==` `;)i++;t.push(e.substring(r,i)),r=i}}return t}function Th(e,t){let n=e.match(t);return n?n[1]:null}function Eh(e,t={}){return e.replace(/\\\|/g,Sh).split(Ch).map(e=>{let n=wh(e.replace(/\u0000/g,`|`).trim()).filter(e=>e&&!!e.trim()),r=[];for(let e=0,i=n.length;e<i;e+=1){let i=n[e],a=!1,o=-1;for(;!a&&++o<xh;){let e=bh[o],n=Th(i,e.multiRegex);n&&(r.push(e.create(n,t)),a=!0)}if(!a)for(o=-1;++o<xh;){let e=bh[o],n=Th(i,e.singleRegex);if(n){r.push(e.create(n,t));break}}}return r})}var Dh=class{constructor(e,{isCaseSensitive:t=Y.isCaseSensitive,ignoreDiacritics:n=Y.ignoreDiacritics,includeMatches:r=Y.includeMatches,minMatchCharLength:i=Y.minMatchCharLength,ignoreLocation:a=Y.ignoreLocation,findAllMatches:o=Y.findAllMatches,location:s=Y.location,threshold:c=Y.threshold,distance:l=Y.distance}={}){this.query=null,this.options={isCaseSensitive:t,ignoreDiacritics:n,includeMatches:r,minMatchCharLength:i,findAllMatches:o,ignoreLocation:a,location:s,threshold:c,distance:l},e=t?e:e.toLowerCase(),e=n?gh(e):e,this.pattern=e,this.query=Eh(this.pattern,this.options)}static condition(e,t){return t.useExtendedSearch}searchIn(e){let t=this.query;if(!t)return{isMatch:!1,score:1};let{includeMatches:n,isCaseSensitive:r,ignoreDiacritics:i}=this.options;e=r?e:e.toLowerCase(),e=i?gh(e):e;let a=0,o=[],s=0,c=!1;for(let r=0,i=t.length;r<i;r+=1){let i=t[r];o.length=0,a=0,c=!1;for(let t=0,r=i.length;t<r;t+=1){let r=i[t],{isMatch:l,indices:u,score:d}=r.search(e);if(l)a+=1,s+=d,yh(r.type)&&(c=!0),n&&(vh.has(r.type)?o.push(...u):o.push(u));else{s=0,a=0,o.length=0,c=!1;break}}if(a){let e={isMatch:!0,score:s/a};return c&&(e.hasInverse=!0),n&&(e.indices=ph(o)),e}}return{isMatch:!1,score:1}}},Oh=[];function kh(...e){Oh.push(...e)}function Ah(e,t){for(let n=0,r=Oh.length;n<r;n+=1){let r=Oh[n];if(r.condition(e,t))return new r(e,t)}return new _h(e,t)}var jh={AND:`$and`,OR:`$or`},Mh={PATH:`$path`,PATTERN:`$val`},Nh=e=>!!(e[jh.AND]||e[jh.OR]),Ph=e=>!!e[Mh.PATH],Fh=e=>!jm(e)&&Lm(e)&&!Nh(e),Ih=e=>({[jh.AND]:Object.keys(e).map(t=>({[t]:e[t]}))});function Lh(e,t,{auto:n=!0}={}){let r=e=>{if(Pm(e)){let r={keyId:null,pattern:e};return n&&(r.searcher=Ah(e,t)),r}let i=Object.keys(e),a=Ph(e);if(!a&&i.length>1&&!Nh(e))return r(Ih(e));if(Fh(e)){let r=a?e[Mh.PATH]:i[0],o=a?e[Mh.PATTERN]:e[r];if(!Pm(o))throw Error(Wm(r));let s={keyId:$m(r),pattern:o};return n&&(s.searcher=Ah(o,t)),s}let o={children:[],operator:i[0]};return i.forEach(t=>{let n=e[t];jm(n)&&n.forEach(e=>{o.children.push(r(e))})}),o};return Nh(e)||(e=Ih(e)),r(e)}function Rh(e,{ignoreFieldNorm:t=Y.ignoreFieldNorm}){let n=1;return e.forEach(({key:e,norm:r,score:i})=>{let a=e?e.weight:null;n*=(i===0&&a?2**-52:i)**+((a||1)*(t?1:r))}),n}function zh(e,{ignoreFieldNorm:t=Y.ignoreFieldNorm}){e.forEach(e=>{e.score=Rh(e.matches,{ignoreFieldNorm:t})})}var Bh=class{constructor(e,t){this.limit=e,this.heap=[],this.comparator=t}get size(){return this.heap.length}insert(e){this.size<this.limit?(this.heap.push(e),this._bubbleUp(this.size-1)):this.comparator(e,this.heap[0])<0&&(this.heap[0]=e,this._sinkDown(0))}extractSorted(){return this.heap.sort(this.comparator)}_bubbleUp(e){let t=this.heap;for(;e>0;){let n=e-1>>1;if(this.comparator(t[e],t[n])<=0)break;let r=t[e];t[e]=t[n],t[n]=r,e=n}}_sinkDown(e){let t=this.heap,n=t.length,r=e;do{e=r;let i=2*e+1,a=2*e+2;if(i<n&&this.comparator(t[i],t[r])>0&&(r=i),a<n&&this.comparator(t[a],t[r])>0&&(r=a),r!==e){let n=t[e];t[e]=t[r],t[r]=n}}while(r!==e)}};function Vh(e){let t=[];return e.matches.forEach(e=>{if(!zm(e.indices)||!e.indices.length)return;let n={indices:e.indices,value:e.value};e.key&&(n.key=e.key.id),e.idx>-1&&(n.refIndex=e.idx),t.push(n)}),t}function Hh(e,t,{includeMatches:n=Y.includeMatches,includeScore:r=Y.includeScore}={}){return e.map(e=>{let{idx:i}=e,a={item:t[i],refIndex:i};return n&&(a.matches=Vh(e)),r&&(a.score=e.score),a})}var Uh=/[\p{L}\p{M}\p{N}_]+/gu,Wh=new WeakSet;function Gh(e){Wh.has(e)||(Wh.add(e),console.warn(`[Fuse] tokenize regex ${e} lacks the global flag; only the first match per text will be returned. Add the 'g' flag.`))}function Kh(e){if(typeof e==`function`){let t=!1;return n=>{let r=e(n);if(!t&&(t=!0,!Array.isArray(r)||r.some(e=>typeof e!=`string`)))throw Error(`[Fuse] tokenize function must return string[]; received ${Array.isArray(r)?`array containing non-strings`:typeof r}.`);return r}}return e instanceof RegExp?(e.global||Gh(e),t=>t.match(e)||[]):e=>e.match(Uh)||[]}function qh({isCaseSensitive:e=!1,ignoreDiacritics:t=!1,tokenize:n}={}){let r=Kh(n);return{tokenize(n){return e||(n=n.toLowerCase()),t&&(n=gh(n)),r(n)}}}var Jh=class{static condition(e,t){return t.useTokenSearch}constructor(e,t){this.options=t,this.analyzer=qh({isCaseSensitive:t.isCaseSensitive,ignoreDiacritics:t.ignoreDiacritics,tokenize:t.tokenize});let n=this.analyzer.tokenize(e),{df:r,fieldCount:i}=t._invertedIndex;this.termSearchers=[],this.idfWeights=[];for(let e of n){this.termSearchers.push(new _h(e,{location:t.location,threshold:t.threshold,distance:t.distance,includeMatches:t.includeMatches,findAllMatches:t.findAllMatches,minMatchCharLength:t.minMatchCharLength,isCaseSensitive:t.isCaseSensitive,ignoreDiacritics:t.ignoreDiacritics,ignoreLocation:!0}));let n=r.get(e)||0,a=Math.log(1+(i-n+.5)/(n+.5));this.idfWeights.push(a)}this.combineAll=t.tokenMatch===`all`,this.numTerms=this.termSearchers.length,this.useMask=this.numTerms<=31}searchIn(e){if(!this.termSearchers.length)return{isMatch:!1,score:1};let t=[],n=0,r=0,i=0,a=0,o=this.combineAll&&!this.useMask?new Set:null;for(let s=0;s<this.termSearchers.length;s++){let c=this.termSearchers[s].searchIn(e),l=this.idfWeights[s];r+=l,c.isMatch&&(i++,n+=l*(1-c.score),c.indices&&t.push(...c.indices),this.combineAll&&(this.useMask?a|=1<<s:o.add(s)))}if(i===0)return{isMatch:!1,score:1};let s=r>0?1-n/r:0,c={isMatch:!0,score:Math.max(.001,s)};return this.options.includeMatches&&t.length&&(c.indices=ph(t)),this.combineAll&&(this.useMask?c.matchedMask=a:c.matchedTerms=o,c.termCount=this.numTerms),c}};function Yh(e,t,n,r){let i=r.tokenize(t);if(!i.length)return;e.fieldCount++,e.docFieldCount.set(n,(e.docFieldCount.get(n)||0)+1);let a=new Set(i),o=e.docTermFieldHits.get(n);o||(o=new Map,e.docTermFieldHits.set(n,o));for(let t of a)o.set(t,(o.get(t)||0)+1),e.df.set(t,(e.df.get(t)||0)+1)}function Xh(e,t,n,r){let{i,v:a,$:o}=t;if(a!==void 0)Yh(e,a,i,r);else if(o)for(let t=0;t<n;t++){let n=o[t];if(n){if(Array.isArray(n))for(let t of n)Yh(e,t.v,i,r);else Yh(e,n.v,i,r)}}}function Zh(e,t,n){let r={fieldCount:0,df:new Map,docFieldCount:new Map,docTermFieldHits:new Map};for(let i of e)Xh(r,i,t,n);return r}function Qh(e,t,n,r){Xh(e,t,n,r)}function $h(e,t){let n=e.docFieldCount.get(t);if(n===void 0)return;e.fieldCount-=n,e.docFieldCount.delete(t);let r=e.docTermFieldHits.get(t);if(r){for(let[t,n]of r){let r=(e.df.get(t)||0)-n;r<=0?e.df.delete(t):e.df.set(t,r)}e.docTermFieldHits.delete(t)}}function eg(e,t){if(t.length===0)return;let n=Array.from(new Set(t)).sort((e,t)=>e-t);for(let t of n)$h(e,t);let r=e=>{let t=0,r=n.length;for(;t<r;){let i=t+r>>>1;n[i]<e?t=i+1:r=i}return e-t},i=n[0],a=new Map;for(let[t,n]of e.docFieldCount)a.set(t>i?r(t):t,n);e.docFieldCount=a;let o=new Map;for(let[t,n]of e.docTermFieldHits)o.set(t>i?r(t):t,n);e.docTermFieldHits=o}var tg=class{constructor(e,t,n){this.options={...Y,...t},this.options.useExtendedSearch,this.options.useTokenSearch,this._keyStore=new Xm(this.options.keys),this._docs=e,this._myIndex=null,this._invertedIndex=null,this.setCollection(e,n),this._lastQuery=null,this._lastSearcher=null}_getSearcher(e){if(this._lastQuery===e)return this._lastSearcher;let t=Ah(e,this._invertedIndex?{...this.options,_invertedIndex:this._invertedIndex}:this.options);return this._lastQuery=e,this._lastSearcher=t,t}setCollection(e,t){if(this._docs=e,t&&!(t instanceof sh))throw Error(Hm);if(this._myIndex=t||ch(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight}),this.options.useTokenSearch){let e=qh({isCaseSensitive:this.options.isCaseSensitive,ignoreDiacritics:this.options.ignoreDiacritics,tokenize:this.options.tokenize});this._invertedIndex=Zh(this._myIndex.records,this._myIndex.keys.length,e)}this._invalidateSearcherCache()}add(e){if(!zm(e))return;this._docs.push(e);let t=this._myIndex.add(e,this._docs.length-1);if(this._invertedIndex&&t){let e=qh({isCaseSensitive:this.options.isCaseSensitive,ignoreDiacritics:this.options.ignoreDiacritics,tokenize:this.options.tokenize});Qh(this._invertedIndex,t,this._myIndex.keys.length,e)}this._invalidateSearcherCache()}remove(e=()=>!1){let t=[],n=[];for(let r=0,i=this._docs.length;r<i;r+=1)e(this._docs[r],r)&&(t.push(this._docs[r]),n.push(r));if(n.length){this._invertedIndex&&eg(this._invertedIndex,n);let e=new Set(n);this._docs=this._docs.filter((t,n)=>!e.has(n)),this._myIndex.removeAll(n),this._invalidateSearcherCache()}return t}removeAt(e){if(!Number.isInteger(e)||e<0||e>=this._docs.length)throw Error(Um);this._invertedIndex&&eg(this._invertedIndex,[e]);let t=this._docs.splice(e,1)[0];return this._myIndex.removeAt(e),this._invalidateSearcherCache(),t}_invalidateSearcherCache(){this._lastQuery=null,this._lastSearcher=null}getIndex(){return this._myIndex}_normalizedKeys(){return this._myIndex.keys.map(e=>this._keyStore.get(e.id)||e)}search(e,t){let{limit:n=-1}=t||{},{includeMatches:r,includeScore:i,shouldSort:a,sortFn:o,ignoreFieldNorm:s}=this.options;if(Pm(e)&&!e.trim()){let e=this._docs.map((e,t)=>({item:e,refIndex:t}));return Fm(n)&&n>-1&&(e=e.slice(0,n)),e}let c=a&&Fm(n)&&n>0&&Pm(e),l=o,u=(e,t)=>l(e,t)||e.idx-t.idx,d;if(c){let t=new Bh(n,u);Pm(this._docs[0])?this._searchStringList(e,{heap:t,ignoreFieldNorm:s}):this._searchObjectList(e,{heap:t,ignoreFieldNorm:s}),d=t.extractSorted()}else d=Pm(e)?Pm(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e),zh(d,{ignoreFieldNorm:s}),a&&d.sort(Pm(e)?u:l),Fm(n)&&n>-1&&(d=d.slice(0,n));return Hh(d,this._docs,{includeMatches:r,includeScore:i})}_searchStringList(e,{heap:t,ignoreFieldNorm:n}={}){let r=this._getSearcher(e),i=this.options.useTokenSearch&&this.options.tokenMatch===`all`,{records:a}=this._myIndex,o=t?null:[];return a.forEach(({v:e,i:a,n:s})=>{if(!zm(e))return;let c=r.searchIn(e);if(c.isMatch){let r={score:c.score,value:e,norm:s,indices:c.indices};i&&(r.matchedMask=c.matchedMask,r.matchedTerms=c.matchedTerms,r.termCount=c.termCount);let l=[r];if(!i||this._coversAllTokens(l)){let r={item:e,idx:a,matches:l};t?(r.score=Rh(r.matches,{ignoreFieldNorm:n}),t.insert(r)):o.push(r)}}}),o}_searchLogical(e){let t=Lh(e,this.options),n=this._normalizedKeys(),r=(e,t,i)=>{if(!(`children`in e)){let{keyId:r,searcher:a}=e,o;return r===null?(o=[],n.forEach((e,n)=>{o.push(...this._findMatches({key:e,value:t[n],searcher:a}))})):o=this._findMatches({key:this._keyStore.get(r),value:this._myIndex.getValueForItemAtKeyId(t,r),searcher:a}),o&&o.length?[{idx:i,item:t,matches:o}]:[]}let{children:a,operator:o}=e,s=[];for(let e=0,n=a.length;e<n;e+=1){let n=a[e],c=r(n,t,i);if(c.length)s.push(...c);else if(o===jh.AND)return[]}return s},i=this._myIndex.records,a=new Map,o=[];return i.forEach(({$:e,i:n})=>{if(zm(e)){let i=r(t,e,n);i.length&&(a.has(n)||(a.set(n,{idx:n,item:e,matches:[]}),o.push(a.get(n))),i.forEach(({matches:e})=>{a.get(n).matches.push(...e)}))}}),o}_searchObjectList(e,{heap:t,ignoreFieldNorm:n}={}){let r=this._getSearcher(e),i=this.options.useTokenSearch&&this.options.tokenMatch===`all`,{records:a}=this._myIndex,o=this._normalizedKeys(),s=t?null:[];return a.forEach(({$:e,i:a})=>{if(!zm(e))return;let c=[],l=!1,u=!1;if(o.forEach((t,n)=>{let i=this._findMatches({key:t,value:e[n],searcher:r});i.length?(c.push(...i),i[0].hasInverse&&(u=!0)):l=!0}),!(u&&l)&&c.length&&(!i||this._coversAllTokens(c))){let r={idx:a,item:e,matches:c};t?(r.score=Rh(r.matches,{ignoreFieldNorm:n}),t.insert(r)):s.push(r)}}),s}_findMatches({key:e,value:t,searcher:n}){if(!zm(t))return[];let r=[];if(jm(t))t.forEach(({v:t,i,n:a})=>{if(!zm(t))return;let o=n.searchIn(t);if(o.isMatch){let n={score:o.score,key:e,value:t,idx:i,norm:a,indices:o.indices,hasInverse:o.hasInverse};o.termCount!==void 0&&(n.matchedMask=o.matchedMask,n.matchedTerms=o.matchedTerms,n.termCount=o.termCount),r.push(n)}});else{let{v:i,n:a}=t,o=n.searchIn(i);if(o.isMatch){let t={score:o.score,key:e,value:i,norm:a,indices:o.indices,hasInverse:o.hasInverse};o.termCount!==void 0&&(t.matchedMask=o.matchedMask,t.matchedTerms=o.matchedTerms,t.termCount=o.termCount),r.push(t)}}return r}_coversAllTokens(e){let t=e.length?e[0].termCount:void 0;if(t===void 0)return!0;if(t<=31){let n=0;for(let t=0;t<e.length;t++)n|=e[t].matchedMask||0;return n===2**t-1}let n=new Set;for(let t=0;t<e.length;t++){let r=e[t].matchedTerms;if(r)for(let e of r)n.add(e)}return n.size===t}};tg.version=`7.5.0`,tg.createIndex=ch,tg.parseIndex=lh,tg.config=Y,tg.match=function(e,t,n){if(n&&n.useTokenSearch)throw Error(Jm);return Ah(e,{...Y,...n}).searchIn(t)},tg.parseQuery=Lh,kh(Dh),kh(Jh),tg.use=function(...e){e.forEach(e=>kh(e))};var ng=tg;function rg(e){let t=e.slice(e.lastIndexOf(`/`)+1),n=t.lastIndexOf(`.`);return n<=0?``:t.slice(n+1).toLowerCase()}var ig={ts:`code`,tsx:`code`,js:`code`,jsx:`code`,mjs:`code`,cjs:`code`,mts:`code`,cts:`code`,py:`code`,rb:`code`,go:`code`,rs:`code`,java:`code`,kt:`code`,kts:`code`,scala:`code`,c:`code`,h:`code`,cc:`code`,cpp:`code`,hpp:`code`,cs:`code`,swift:`code`,m:`code`,mm:`code`,php:`code`,pl:`code`,pm:`code`,lua:`code`,r:`code`,jl:`code`,ex:`code`,exs:`code`,erl:`code`,hs:`code`,dart:`code`,nim:`code`,zig:`code`,vue:`code`,svelte:`code`,astro:`code`,sh:`code`,bash:`code`,zsh:`code`,fish:`code`,ps1:`code`,bat:`code`,cmd:`code`,sql:`code`,graphql:`code`,gql:`code`,proto:`code`,tf:`code`,tfvars:`code`,hcl:`code`,sol:`code`,md:`markup`,mdx:`markup`,markdown:`markup`,txt:`markup`,text:`markup`,rst:`markup`,adoc:`markup`,org:`markup`,yaml:`config`,yml:`config`,toml:`config`,ini:`config`,cfg:`config`,conf:`config`,xml:`config`,env:`config`,properties:`config`,gitignore:`config`,editorconfig:`config`,eslintrc:`config`,prettierrc:`config`,css:`style`,scss:`style`,sass:`style`,less:`style`,stylus:`style`,pcss:`style`,postcss:`style`,png:`image`,jpg:`image`,jpeg:`image`,gif:`image`,bmp:`image`,webp:`image`,avif:`image`,ico:`image`,svg:`image`,tif:`image`,tiff:`image`,heic:`image`,psd:`image`,ai:`image`,json:`data`,jsonc:`data`,json5:`data`,csv:`data`,tsv:`data`,parquet:`data`,db:`data`,sqlite:`data`,sqlite3:`data`,ndjson:`data`,zip:`archive`,tar:`archive`,gz:`archive`,tgz:`archive`,bz2:`archive`,xz:`archive`,"7z":`archive`,rar:`archive`,zst:`archive`,jar:`archive`,war:`archive`,whl:`archive`,woff:`font`,woff2:`font`,ttf:`font`,otf:`font`,eot:`font`,exe:`binary`,dll:`binary`,so:`binary`,dylib:`binary`,bin:`binary`,o:`binary`,obj:`binary`,a:`binary`,lib:`binary`,class:`binary`,node:`binary`,pyc:`binary`,pyo:`binary`,pack:`binary`,idx:`binary`,iso:`binary`,dmg:`binary`,msi:`binary`,apk:`binary`,deb:`binary`,rpm:`binary`,pdf:`binary`,doc:`binary`,docx:`binary`,xls:`binary`,xlsx:`binary`,ppt:`binary`,pptx:`binary`,odt:`binary`,ods:`binary`,odp:`binary`,wasm:`binary`},ag={dockerfile:`config`,containerfile:`config`,makefile:`code`,cmakelists:`code`,rakefile:`code`,gemfile:`config`,procfile:`config`,license:`markup`,licence:`markup`,notice:`markup`,readme:`markup`,changelog:`markup`,authors:`markup`,contributing:`markup`,".gitignore":`config`,".gitattributes":`config`,".gitmodules":`config`,".npmrc":`config`,".nvmrc":`config`,".env":`config`};function og(e){let t=ag[e.slice(e.lastIndexOf(`/`)+1).toLowerCase()];if(t)return t;let n=rg(e);return n?ig[n]??`generic`:`generic`}var sg={code:[`M6 4.5 2.5 8 6 11.5`,`M10 4.5 13.5 8 10 11.5`,`M9.2 3.5 6.8 12.5`],markup:[`M4 2.5h5l3 3v8a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-10a1 1 0 0 1 1-1z`,`M9 2.5v3h3`,`M5.5 8.5h5`,`M5.5 11h3.5`],config:[`M8 10.2a2.2 2.2 0 1 0 0-4.4 2.2 2.2 0 0 0 0 4.4z`,`M8 1.8v1.6`,`M8 12.6v1.6`,`M1.8 8h1.6`,`M12.6 8h1.6`,`M3.6 3.6l1.1 1.1`,`M11.3 11.3l1.1 1.1`,`M12.4 3.6l-1.1 1.1`,`M4.7 11.3l-1.1 1.1`],style:[`M8 13.5a5.5 5.5 0 1 1 0-11c3 0 5.5 2 5.5 4.5 0 1.4-1.1 2.2-2.3 2.2h-1c-.9 0-1.6.7-1.6 1.5 0 .4.2.7.4 1 .2.3.4.6.4 1a1.3 1.3 0 0 1-1.4.8z`,`M5.6 6.8h.01`,`M8.4 5.2h.01`,`M11 6.9h.01`],image:[`M2.5 4.5a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1h-9a1 1 0 0 1-1-1v-7z`,`M2.5 10.5 6 7.5l2.5 2 2-1.5 3 2.5`,`M5.8 6.4h.01`],data:[`M2.5 3.5h11v9h-11z`,`M2.5 8h11`,`M8 3.5v9`],archive:[`M2.5 5.5h11v8h-11z`,`M1.5 2.5h13v3h-13z`,`M6.8 8.5h2.4`],font:[`M3.5 13 8 3l4.5 10`,`M5.4 9.6h5.2`],binary:[`M2.5 4.5h11v7h-11z`,`M5 7h.01`,`M8 7h.01`,`M11 7h.01`,`M5 9.5h.01`,`M8 9.5h.01`],generic:[`M4 2.5h5l3 3v8a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-10a1 1 0 0 1 1-1z`,`M9 2.5v3h3`],folder:[`M2.5 4.5a1 1 0 0 1 1-1h3l1.5 2h4.5a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1h-9a1 1 0 0 1-1-1v-8z`],"folder-open":[`M2.5 12.5v-8a1 1 0 0 1 1-1h3l1.5 2h4.5a1 1 0 0 1 1 1v1`,`M2.5 12.5 4.6 6.8a1 1 0 0 1 .95-.7h8.1a.6.6 0 0 1 .55.85L12.9 12.5a1 1 0 0 1-.95.7H3.5a1 1 0 0 1-1-1z`]};function cg({path:e,category:t,size:n=14}){let r=t??og(e??``),i=sg[r]??sg.generic;return(0,B.jsx)(`svg`,{className:`file-icon file-icon-${r}`,"data-file-icon":r,width:n,height:n,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:1.5,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,focusable:`false`,children:i.map((e,t)=>(0,B.jsx)(`path`,{d:e},t))})}var lg=`modulepreload`,ug=function(e){return`/`+e},dg={},fg=function(e){return e.pathname.endsWith(`.css`)},pg=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},mg=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=o(t.map(t=>{t=ug(t,n);let r=s(t),i=fg(r);return pg(dg,r.href,()=>{if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((i?e.styles:e.all).has(r.href))return;let t=document.createElement(`link`);if(t.rel=i?`stylesheet`:lg,i||(t.as=`script`),t.crossOrigin=``,t.href=r.href,a&&t.setAttribute(`nonce`,a),document.head.appendChild(t),i)return new Promise((e,n)=>{t.addEventListener(`load`,e),t.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${r}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},hg=4e3,gg=(0,z.lazy)(()=>mg(()=>import(`./CodeMirrorEditor-moFTk5SE.js`).then(e=>({default:e.CodeMirrorEditor})),[])),_g=class extends Error{status;body;constructor(e,t){super(t.error||`HTTP ${e}`),this.status=e,this.body=t,this.name=`ApiError`}},vg=15e3,yg=e=>new _g(408,{error:`请求超时:${vg/1e3} 秒内服务端没有响应`,code:`timeout`,details:{path:e}});async function bg(e,t){let n=new AbortController,r=setTimeout(()=>n.abort(),vg);try{let r=await fetch(e,{...t,signal:n.signal}),i;try{i=await r.json()}catch{i=void 0}if(!r.ok)throw new _g(r.status,i??{error:`HTTP ${r.status}`});return i}catch(t){throw n.signal.aborted?yg(e):t}finally{clearTimeout(r)}}var xg=e=>e instanceof _g?e:new _g(0,{error:e instanceof Error?e.message:`读取失败`}),Sg=e=>encodeURIComponent(e),Cg=(e,t)=>`/api/files?workspaceId=${Sg(e)}&path=${Sg(t)}`,wg=(e,t)=>`/api/file?workspaceId=${Sg(e)}&path=${Sg(t)}`,Tg=(e,t)=>`/api/file?workspaceId=${Sg(e)}&path=${Sg(t)}&meta=1`,Eg=(e,t)=>`/api/files?workspaceId=${Sg(e)}&q=${Sg(t)}`,Dg=e=>e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`,Og=e=>{let t=new Date(e);return Number.isNaN(t.getTime())?``:new Date(e).toLocaleTimeString(`zh-CN`,{hour:`2-digit`,minute:`2-digit`})};function kg({workspaceId:e,entryPath:t,name:n,listings:r,expanded:i,toggle:a,loadDirectory:o,openPaths:s,changedDirs:c,changedPaths:l,onOpen:u,depth:d}){let f=r[t],p=i.has(t);return(0,z.useEffect)(()=>{p&&f===void 0&&o(t)},[p,t,f,o]),(0,B.jsxs)(`li`,{className:`file-node`,"data-file-dir":t,"data-file-dir-changed":c.has(t)?`1`:`0`,children:[(0,B.jsxs)(`button`,{type:`button`,className:`file-row file-row-dir`,"data-file-dir-toggle":t,"aria-expanded":p,style:{paddingLeft:`${8+d*13}px`},title:c.has(t)?`${t} 里有 agent 改过的文件`:t,onClick:()=>a(t),children:[(0,B.jsx)(`span`,{className:`file-caret`,"aria-hidden":`true`,children:p?`▾`:`▸`}),(0,B.jsx)(cg,{category:`folder`}),(0,B.jsx)(`span`,{className:`file-name`,children:n}),c.has(t)&&(0,B.jsx)(`span`,{className:`file-badge file-badge-changed`,"data-file-dir-changed-badge":t,title:`里面有 agent 改过的文件`,children:`✎`})]}),p&&(0,B.jsx)(`ul`,{className:`file-children`,children:f===void 0?(0,B.jsx)(`li`,{className:`file-row-loading`,"data-file-loading":t,children:`读取中…`}):`error`in f?(0,B.jsx)(`li`,{className:`file-row-error`,"data-file-error":t,children:f.error.message}):f.entries.length===0?(0,B.jsx)(`li`,{className:`file-row-empty`,"data-file-empty":t,children:`空目录`}):(0,B.jsxs)(B.Fragment,{children:[f.truncated&&(0,B.jsx)(`li`,{className:`file-row-empty`,"data-file-truncated":t,children:`条目过多,只显示前一部分`}),f.entries.map(t=>t.kind===`directory`?(0,B.jsx)(kg,{workspaceId:e,entryPath:t.path,name:t.name,listings:r,expanded:i,toggle:a,loadDirectory:o,openPaths:s,changedDirs:c,changedPaths:l,onOpen:u,depth:d+1},t.path):(0,B.jsx)(Ag,{entry:t,depth:d+1,openPaths:s,changedPaths:l,onOpen:u},t.path))]})})]})}function Ag({entry:e,depth:t,openPaths:n,changedPaths:r,onOpen:i}){if(e.kind===`symlink`)return(0,B.jsx)(`li`,{className:`file-node`,"data-file-entry":e.path,"data-file-outside":e.path,children:(0,B.jsxs)(`button`,{type:`button`,className:`file-row file-row-file`,disabled:!0,title:`${e.path} 是一个指向 workspace 之外的符号链接,不能打开`,style:{paddingLeft:`${8+t*13}px`},children:[(0,B.jsx)(`span`,{className:`file-caret`,"aria-hidden":`true`}),(0,B.jsx)(`span`,{className:`file-name`,children:e.name}),(0,B.jsx)(`span`,{className:`file-badge`,"data-file-outside-badge":`1`,children:`外部链接`})]})});let a=n.has(e.path),o=r.has(e.path);return(0,B.jsx)(`li`,{className:`file-node`,"data-file-entry":e.path,"data-file-row-open":a?`1`:`0`,"data-file-row-changed":o?`1`:`0`,children:(0,B.jsxs)(`button`,{type:`button`,className:`file-row file-row-file`,"data-file-open":e.path,disabled:!e.text,title:e.text?o?`${e.path}(agent 改过这个文件,点击查看改动)`:a?`${e.path}(已经打开,点击切换到它)`:e.path:`${e.name} 是二进制文件,无法以文本打开`,style:{paddingLeft:`${8+t*13}px`},onClick:()=>i(e),children:[(0,B.jsx)(`span`,{className:`file-caret`,"aria-hidden":`true`}),(0,B.jsx)(cg,{path:e.path}),(0,B.jsx)(`span`,{className:`file-name`,children:e.name}),a&&(0,B.jsx)(`span`,{className:`file-open-mark`,"data-file-open-mark":e.path,title:`已经打开`,"aria-label":`已经打开`,children:`●`}),o&&(0,B.jsx)(`span`,{className:`file-badge file-badge-changed`,"data-file-changed":e.path,title:`agent 改过这个文件`,children:`✎ 已改`}),!e.text&&(0,B.jsx)(`span`,{className:`file-badge`,"data-file-binary":`1`,"aria-label":`不支持的文件类型`,children:`不支持`})]})})}function jg({file:e,state:t,message:n,external:r,jumpToLine:i,onChange:a,onSave:o,onReload:s,onOverwrite:c}){let[l,u]=(0,z.useState)(!0),d=(0,z.useRef)(null);(0,z.useEffect)(()=>{i&&u(!1)},[e.path,i]),(0,z.useEffect)(()=>{let e=d.current;if(!i||!e)return;let t=Math.min(i.line,e.value.split(`
|
|
47
|
+
`),n=t.length>0&&t[t.length-1]===``;n&&t.pop();for(let c=0;c<t.length;c+=1){let l=t[c],u=c===t.length-1&&!n;e.added?(r.push({kind:`added`,text:l,newLine:s,noNewline:u}),s+=1,i+=1):e.removed?(r.push({kind:`removed`,text:l,oldLine:o,noNewline:u}),o+=1,a+=1):(r.push({kind:`same`,text:l,oldLine:o,newLine:s,noNewline:u}),o+=1,s+=1)}}return{lines:r,added:i,removed:a,identical:i===0&&a===0}}function Am(e,t=3){let n=new Set;e.lines.forEach((r,i)=>{if(r.kind!==`same`)for(let r=-t;r<=t;r+=1){let t=i+r;t>=0&&t<e.lines.length&&n.add(t)}});let r=[],i=0,a=!1;return e.lines.forEach((e,t)=>{n.has(t)?(a&&=(r.push({kind:`fold`,text:`⋯ 省略未改动的行`}),!1),r.push(e)):a||(a=!0,i+=1)}),a&&r.push({kind:`fold`,text:`⋯ 省略未改动的行`}),{lines:r,folded:i}}function jm(e){return Array.isArray?Array.isArray(e):Vm(e)===`[object Array]`}function Mm(e){if(typeof e==`string`)return e;if(typeof e==`bigint`)return e.toString();let t=e+``;return t==`0`&&1/e==-1/0?`-0`:t}function Nm(e){return e==null?``:Mm(e)}function Pm(e){return typeof e==`string`}function Fm(e){return typeof e==`number`}function Im(e){return e===!0||e===!1||Rm(e)&&Vm(e)==`[object Boolean]`}function Lm(e){return typeof e==`object`}function Rm(e){return Lm(e)&&e!==null}function zm(e){return e!=null}function Bm(e){return!e.trim().length}function Vm(e){return e==null?e===void 0?`[object Undefined]`:`[object Null]`:Object.prototype.toString.call(e)}var Hm=`Incorrect 'index' type`,Um=`Invalid doc index: must be a non-negative integer within the bounds of the docs array`,Wm=e=>`Invalid value for key ${e}`,Gm=e=>`Pattern length exceeds max of ${e}.`,Km=e=>`Missing ${e} property in key`,qm=e=>`Property 'weight' in key '${e}' must be a positive integer`,Jm=`Fuse.match does not support useTokenSearch: token search requires corpus-level statistics (df, fieldCount) that a one-off string comparison does not have. Use new Fuse(...).search(...) instead.`,Ym=Object.prototype.hasOwnProperty,Xm=class{constructor(e){this._keys=[],this._keyMap={};let t=0;e.forEach(e=>{let n=Zm(e);this._keys.push(n),this._keyMap[n.id]=n,t+=n.weight}),this._keys.forEach(e=>{e.weight/=t})}get(e){return this._keyMap[e]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}};function Zm(e){let t=null,n=null,r=null,i=1,a=null;if(Pm(e)||jm(e))r=e,t=Qm(e),n=$m(e);else{if(!Ym.call(e,`name`))throw Error(Km(`name`));let o=e.name;if(r=o,Ym.call(e,`weight`)&&e.weight!==void 0&&(i=e.weight,i<=0))throw Error(qm($m(o)));t=Qm(o),n=$m(o),a=e.getFn??null}return{path:t,id:n,weight:i,src:r,getFn:a}}function Qm(e){return jm(e)?e:e.split(`.`)}function $m(e){return jm(e)?e.join(`.`):e}function eh(e,t){let n=[],r=!1,i=(e,t,a,o)=>{if(zm(e)){if(!t[a])n.push(o===void 0?e:{v:e,i:o});else{let s=e[t[a]];if(!zm(s))return;if(a===t.length-1&&(Pm(s)||Fm(s)||Im(s)||typeof s==`bigint`))n.push(o===void 0?Nm(s):{v:Nm(s),i:o});else if(jm(s)){r=!0;for(let e=0,n=s.length;e<n;e+=1)i(s[e],t,a+1,e)}else t.length&&i(s,t,a+1,o)}}};return i(e,Pm(t)?t.split(`.`):t,0),r?n:n[0]}var th={includeMatches:!1,findAllMatches:!1,minMatchCharLength:1},nh={isCaseSensitive:!1,ignoreDiacritics:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:(e,t)=>e.score===t.score?e.idx<t.idx?-1:1:e.score<t.score?-1:1},rh={location:0,threshold:.6,distance:100},ih={useExtendedSearch:!1,useTokenSearch:!1,tokenize:void 0,tokenMatch:`any`,getFn:eh,ignoreLocation:!1,ignoreFieldNorm:!1,fieldNormWeight:1},Y=Object.freeze({...nh,...th,...rh,...ih});function ah(e){return e>=9&&e<=13||e===32||e===160}function oh(e=1,t=3){let n=new Map,r=10**t;return{get(t){let i=0,a=!1;for(let e=0;e<t.length;e++)ah(t.charCodeAt(e))?a=!1:a||=(i++,!0);if(i===0&&(i=1),n.has(i))return n.get(i);let o=Math.round(r/i**(.5*e))/r;return n.set(i,o),o},clear(){n.clear()}}}var sh=class{constructor({getFn:e=Y.getFn,fieldNormWeight:t=Y.fieldNormWeight}={}){this.norm=oh(t,3),this.getFn=e,this.isCreated=!1,this.docs=[],this.keys=[],this._keysMap={},this.setIndexRecords()}setSources(e=[]){this.docs=e}setIndexRecords(e=[]){this.records=e}setKeys(e=[]){this.keys=e,this._keysMap={},e.forEach((e,t)=>{this._keysMap[e.id]=t})}create(){if(this.isCreated||!this.docs.length)return;this.isCreated=!0;let e=this.docs.length;this.records=Array(e);let t=0;if(Pm(this.docs[0]))for(let n=0;n<e;n++){let e=this._createStringRecord(this.docs[n],n);e&&(this.records[t++]=e)}else for(let n=0;n<e;n++)this.records[t++]=this._createObjectRecord(this.docs[n],n);this.records.length=t,this.norm.clear()}add(e,t){if(!Number.isInteger(t)||t<0)throw Error(Um);if(Pm(e)){let n=this._createStringRecord(e,t);return n&&this.records.push(n),n}let n=this._createObjectRecord(e,t);return this.records.push(n),n}removeAt(e){if(!Number.isInteger(e)||e<0)throw Error(Um);for(let t=0,n=this.records.length;t<n;t+=1)if(this.records[t].i===e){this.records.splice(t,1);break}for(let t=0,n=this.records.length;t<n;t+=1)this.records[t].i>e&&--this.records[t].i}removeAll(e){let t=new Set;for(let n of e)Number.isInteger(n)&&n>=0&&t.add(n);if(t.size===0)return;this.records=this.records.filter(e=>!t.has(e.i));let n=Array.from(t).sort((e,t)=>e-t);for(let e of this.records){let t=0,r=n.length;for(;t<r;){let i=t+r>>>1;n[i]<e.i?t=i+1:r=i}e.i-=t}}getValueForItemAtKeyId(e,t){return e[this._keysMap[t]]}size(){return this.records.length}_createStringRecord(e,t){return!zm(e)||Bm(e)?null:{v:e,i:t,n:this.norm.get(e)}}_createObjectRecord(e,t){let n={i:t,$:{}};for(let t=0,r=this.keys.length;t<r;t++){let r=this.keys[t],i=r.getFn?r.getFn(e):this.getFn(e,r.path);if(zm(i)){if(jm(i)){let e=[];for(let t=0,n=i.length;t<n;t+=1){let n=i[t];if(zm(n)){if(Pm(n)){if(!Bm(n)){let r={v:n,i:t,n:this.norm.get(n)};e.push(r)}}else if(zm(n.v)){let t=Pm(n.v)?n.v:Nm(n.v);if(!Bm(t)){let r={v:t,i:n.i,n:this.norm.get(t)};e.push(r)}}}}n.$[t]=e}else if(Pm(i)&&!Bm(i)){let e={v:i,n:this.norm.get(i)};n.$[t]=e}}}return n}toJSON(){return{keys:this.keys.map(({getFn:e,...t})=>t),records:this.records}}};function ch(e,t,{getFn:n=Y.getFn,fieldNormWeight:r=Y.fieldNormWeight}={}){let i=new sh({getFn:n,fieldNormWeight:r});return i.setKeys(e.map(Zm)),i.setSources(t),i.create(),i}function lh(e,{getFn:t=Y.getFn,fieldNormWeight:n=Y.fieldNormWeight}={}){let{keys:r,records:i}=e,a=new sh({getFn:t,fieldNormWeight:n});return a.setKeys(r),a.setIndexRecords(i),a}function uh(e=[],t=Y.minMatchCharLength){let n=[],r=-1,i=-1,a=0;for(let o=e.length;a<o;a+=1){let o=e[a];o&&r===-1?r=a:!o&&r!==-1&&(i=a-1,i-r+1>=t&&n.push([r,i]),r=-1)}return e[a-1]&&a-r>=t&&n.push([r,a-1]),n}function dh(e,t,n,{location:r=Y.location,distance:i=Y.distance,threshold:a=Y.threshold,findAllMatches:o=Y.findAllMatches,minMatchCharLength:s=Y.minMatchCharLength,includeMatches:c=Y.includeMatches,ignoreLocation:l=Y.ignoreLocation}={}){if(t.length>32)throw Error(Gm(32));let u=t.length,d=e.length,f=Math.max(0,Math.min(r,d)),p=a,m=f,h=(e,t)=>{let n=e/u;if(l)return n;let r=Math.abs(f-t);return i?n+r/i:r?1:n},g=s>1||c,_=g?Array(d):[],v;for(;(v=e.indexOf(t,m))>-1;){let e=h(0,v);if(p=Math.min(e,p),m=v+u,g){let e=0;for(;e<u;)_[v+e]=1,e+=1}}m=-1;let y=[],b=1,x=0,S=u+d,C=1<<u-1;for(let t=0;t<u;t+=1){let r=0,i=S;for(;r<i;)h(t,f+i)<=p?r=i:S=i,i=Math.floor((S-r)/2+r);S=i;let a=Math.max(1,f-i+1),s=o?d:Math.min(f+i,d)+u,c=Array(s+2);c[s+1]=(1<<t)-1;for(let r=s;r>=a;--r){let i=r-1,o=n[e[i]];if(c[r]=(c[r+1]<<1|1)&o,t&&(c[r]|=(y[r+1]|y[r])<<1|1|y[r+1]),c[r]&C&&(b=h(t,i),b<=p)){if(p=b,m=i,x=t,m<=f)break;a=Math.max(1,2*f-m)}}if(h(t+1,f)>p)break;y=c}if(g&&m>=0){let t=Math.min(d-1,m+u-1+x);for(let r=m;r<=t;r+=1)n[e[r]]&&(_[r]=1)}let w={isMatch:m>=0,score:Math.max(.001,b)};if(g){let e=uh(_,s);e.length?c&&(w.indices=e):w.isMatch=!1}return w}function fh(e){let t={};for(let n=0,r=e.length;n<r;n+=1){let i=e.charAt(n);t[i]=(t[i]||0)|1<<r-n-1}return t}function ph(e){if(e.length<=1)return e;e.sort((e,t)=>e[0]-t[0]||e[1]-t[1]);let t=[e[0]];for(let n=1,r=e.length;n<r;n+=1){let r=t[t.length-1],i=e[n];i[0]<=r[1]+1?r[1]=Math.max(r[1],i[1]):t.push(i)}return t}var mh={ł:`l`,Ł:`L`,đ:`d`,Đ:`D`,ø:`o`,Ø:`O`,ħ:`h`,Ħ:`H`,ŧ:`t`,Ŧ:`T`,ı:`i`,ß:`ss`},hh=RegExp(`[`+Object.keys(mh).join(``)+`]`,`g`),gh=typeof String.prototype.normalize==`function`?e=>e.normalize(`NFD`).replace(/[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D3-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09FE\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C04\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F]/g,``).replace(hh,e=>mh[e]):e=>e,_h=class{constructor(e,{location:t=Y.location,threshold:n=Y.threshold,distance:r=Y.distance,includeMatches:i=Y.includeMatches,findAllMatches:a=Y.findAllMatches,minMatchCharLength:o=Y.minMatchCharLength,isCaseSensitive:s=Y.isCaseSensitive,ignoreDiacritics:c=Y.ignoreDiacritics,ignoreLocation:l=Y.ignoreLocation}={}){if(this.options={location:t,threshold:n,distance:r,includeMatches:i,findAllMatches:a,minMatchCharLength:o,isCaseSensitive:s,ignoreDiacritics:c,ignoreLocation:l},e=s?e:e.toLowerCase(),e=c?gh(e):e,this.pattern=e,this.chunks=[],!this.pattern.length)return;let u=(e,t)=>{this.chunks.push({pattern:e,alphabet:fh(e),startIndex:t})},d=this.pattern.length;if(d>32){let e=0,t=d%32,n=d-t;for(;e<n;)u(this.pattern.substr(e,32),e),e+=32;if(t){let e=d-32;u(this.pattern.substr(e),e)}}else u(this.pattern,0)}searchIn(e){let{isCaseSensitive:t,ignoreDiacritics:n,includeMatches:r}=this.options;if(e=t?e:e.toLowerCase(),e=n?gh(e):e,this.pattern===e){if(e.length<this.options.minMatchCharLength)return{isMatch:!1,score:1};let t={isMatch:!0,score:0};return r&&(t.indices=[[0,e.length-1]]),t}let{location:i,distance:a,threshold:o,findAllMatches:s,minMatchCharLength:c,ignoreLocation:l}=this.options,u=[],d=0,f=!1;this.chunks.forEach(({pattern:t,alphabet:n,startIndex:p})=>{let{isMatch:m,score:h,indices:g}=dh(e,t,n,{location:i+p,distance:a,threshold:o,findAllMatches:s,minMatchCharLength:c,includeMatches:r,ignoreLocation:l});m&&(f=!0),d+=h,m&&g&&u.push(...g)});let p={isMatch:f,score:f?d/this.chunks.length:1};return f&&r&&(p.indices=ph(u)),p}},vh=new Set([`fuzzy`,`include`]);function yh(e){return e.startsWith(`inverse`)}var bh=[{type:`exact`,multiRegex:/^="(.*)"$/,singleRegex:/^=(.*)$/,create:e=>({type:`exact`,search(t){let n=t===e;return{isMatch:n,score:+!n,indices:[0,e.length-1]}}})},{type:`include`,multiRegex:/^'"(.*)"$/,singleRegex:/^'(.*)$/,create:e=>({type:`include`,search(t){let n=0,r,i=[],a=e.length;for(;(r=t.indexOf(e,n))>-1;)n=r+a,i.push([r,n-1]);let o=!!i.length;return{isMatch:o,score:+!o,indices:i}}})},{type:`prefix-exact`,multiRegex:/^\^"(.*)"$/,singleRegex:/^\^(.*)$/,create:e=>({type:`prefix-exact`,search(t){let n=t.startsWith(e);return{isMatch:n,score:+!n,indices:[0,e.length-1]}}})},{type:`inverse-prefix-exact`,multiRegex:/^!\^"(.*)"$/,singleRegex:/^!\^(.*)$/,create:e=>({type:`inverse-prefix-exact`,search(t){let n=!t.startsWith(e);return{isMatch:n,score:+!n,indices:[0,t.length-1]}}})},{type:`inverse-suffix-exact`,multiRegex:/^!"(.*)"\$$/,singleRegex:/^!(.*)\$$/,create:e=>({type:`inverse-suffix-exact`,search(t){let n=!t.endsWith(e);return{isMatch:n,score:+!n,indices:[0,t.length-1]}}})},{type:`suffix-exact`,multiRegex:/^"(.*)"\$$/,singleRegex:/^(.*)\$$/,create:e=>({type:`suffix-exact`,search(t){let n=t.endsWith(e);return{isMatch:n,score:+!n,indices:[t.length-e.length,t.length-1]}}})},{type:`inverse-exact`,multiRegex:/^!"(.*)"$/,singleRegex:/^!(.*)$/,create:e=>({type:`inverse-exact`,search(t){let n=t.indexOf(e)===-1;return{isMatch:n,score:+!n,indices:[0,t.length-1]}}})},{type:`fuzzy`,multiRegex:/^"(.*)"$/,singleRegex:/^(.*)$/,create:(e,t={})=>{let n=new _h(e,{location:t.location??Y.location,threshold:t.threshold??Y.threshold,distance:t.distance??Y.distance,includeMatches:t.includeMatches??Y.includeMatches,findAllMatches:t.findAllMatches??Y.findAllMatches,minMatchCharLength:t.minMatchCharLength??Y.minMatchCharLength,isCaseSensitive:t.isCaseSensitive??Y.isCaseSensitive,ignoreDiacritics:t.ignoreDiacritics??Y.ignoreDiacritics,ignoreLocation:t.ignoreLocation??Y.ignoreLocation});return{type:`fuzzy`,search(e){return n.searchIn(e)}}}}],xh=bh.length,Sh=`\0`,Ch=`|`;function wh(e){let t=[],n=e.length,r=0;for(;r<n;){for(;r<n&&e[r]===` `;)r++;if(r>=n)break;let i=r;for(;i<n&&e[i]!==` `&&e[i]!==`"`;)i++;if(i<n&&e[i]===`"`){for(i++;i<n;){if(e[i]===`"`){let t=i+1;if(t>=n||e[t]===` `){i++;break}if(e[t]===`$`&&(t+1>=n||e[t+1]===` `)){i+=2;break}}i++}t.push(e.substring(r,i)),r=i}else{for(;i<n&&e[i]!==` `;)i++;t.push(e.substring(r,i)),r=i}}return t}function Th(e,t){let n=e.match(t);return n?n[1]:null}function Eh(e,t={}){return e.replace(/\\\|/g,Sh).split(Ch).map(e=>{let n=wh(e.replace(/\u0000/g,`|`).trim()).filter(e=>e&&!!e.trim()),r=[];for(let e=0,i=n.length;e<i;e+=1){let i=n[e],a=!1,o=-1;for(;!a&&++o<xh;){let e=bh[o],n=Th(i,e.multiRegex);n&&(r.push(e.create(n,t)),a=!0)}if(!a)for(o=-1;++o<xh;){let e=bh[o],n=Th(i,e.singleRegex);if(n){r.push(e.create(n,t));break}}}return r})}var Dh=class{constructor(e,{isCaseSensitive:t=Y.isCaseSensitive,ignoreDiacritics:n=Y.ignoreDiacritics,includeMatches:r=Y.includeMatches,minMatchCharLength:i=Y.minMatchCharLength,ignoreLocation:a=Y.ignoreLocation,findAllMatches:o=Y.findAllMatches,location:s=Y.location,threshold:c=Y.threshold,distance:l=Y.distance}={}){this.query=null,this.options={isCaseSensitive:t,ignoreDiacritics:n,includeMatches:r,minMatchCharLength:i,findAllMatches:o,ignoreLocation:a,location:s,threshold:c,distance:l},e=t?e:e.toLowerCase(),e=n?gh(e):e,this.pattern=e,this.query=Eh(this.pattern,this.options)}static condition(e,t){return t.useExtendedSearch}searchIn(e){let t=this.query;if(!t)return{isMatch:!1,score:1};let{includeMatches:n,isCaseSensitive:r,ignoreDiacritics:i}=this.options;e=r?e:e.toLowerCase(),e=i?gh(e):e;let a=0,o=[],s=0,c=!1;for(let r=0,i=t.length;r<i;r+=1){let i=t[r];o.length=0,a=0,c=!1;for(let t=0,r=i.length;t<r;t+=1){let r=i[t],{isMatch:l,indices:u,score:d}=r.search(e);if(l)a+=1,s+=d,yh(r.type)&&(c=!0),n&&(vh.has(r.type)?o.push(...u):o.push(u));else{s=0,a=0,o.length=0,c=!1;break}}if(a){let e={isMatch:!0,score:s/a};return c&&(e.hasInverse=!0),n&&(e.indices=ph(o)),e}}return{isMatch:!1,score:1}}},Oh=[];function kh(...e){Oh.push(...e)}function Ah(e,t){for(let n=0,r=Oh.length;n<r;n+=1){let r=Oh[n];if(r.condition(e,t))return new r(e,t)}return new _h(e,t)}var jh={AND:`$and`,OR:`$or`},Mh={PATH:`$path`,PATTERN:`$val`},Nh=e=>!!(e[jh.AND]||e[jh.OR]),Ph=e=>!!e[Mh.PATH],Fh=e=>!jm(e)&&Lm(e)&&!Nh(e),Ih=e=>({[jh.AND]:Object.keys(e).map(t=>({[t]:e[t]}))});function Lh(e,t,{auto:n=!0}={}){let r=e=>{if(Pm(e)){let r={keyId:null,pattern:e};return n&&(r.searcher=Ah(e,t)),r}let i=Object.keys(e),a=Ph(e);if(!a&&i.length>1&&!Nh(e))return r(Ih(e));if(Fh(e)){let r=a?e[Mh.PATH]:i[0],o=a?e[Mh.PATTERN]:e[r];if(!Pm(o))throw Error(Wm(r));let s={keyId:$m(r),pattern:o};return n&&(s.searcher=Ah(o,t)),s}let o={children:[],operator:i[0]};return i.forEach(t=>{let n=e[t];jm(n)&&n.forEach(e=>{o.children.push(r(e))})}),o};return Nh(e)||(e=Ih(e)),r(e)}function Rh(e,{ignoreFieldNorm:t=Y.ignoreFieldNorm}){let n=1;return e.forEach(({key:e,norm:r,score:i})=>{let a=e?e.weight:null;n*=(i===0&&a?2**-52:i)**+((a||1)*(t?1:r))}),n}function zh(e,{ignoreFieldNorm:t=Y.ignoreFieldNorm}){e.forEach(e=>{e.score=Rh(e.matches,{ignoreFieldNorm:t})})}var Bh=class{constructor(e,t){this.limit=e,this.heap=[],this.comparator=t}get size(){return this.heap.length}insert(e){this.size<this.limit?(this.heap.push(e),this._bubbleUp(this.size-1)):this.comparator(e,this.heap[0])<0&&(this.heap[0]=e,this._sinkDown(0))}extractSorted(){return this.heap.sort(this.comparator)}_bubbleUp(e){let t=this.heap;for(;e>0;){let n=e-1>>1;if(this.comparator(t[e],t[n])<=0)break;let r=t[e];t[e]=t[n],t[n]=r,e=n}}_sinkDown(e){let t=this.heap,n=t.length,r=e;do{e=r;let i=2*e+1,a=2*e+2;if(i<n&&this.comparator(t[i],t[r])>0&&(r=i),a<n&&this.comparator(t[a],t[r])>0&&(r=a),r!==e){let n=t[e];t[e]=t[r],t[r]=n}}while(r!==e)}};function Vh(e){let t=[];return e.matches.forEach(e=>{if(!zm(e.indices)||!e.indices.length)return;let n={indices:e.indices,value:e.value};e.key&&(n.key=e.key.id),e.idx>-1&&(n.refIndex=e.idx),t.push(n)}),t}function Hh(e,t,{includeMatches:n=Y.includeMatches,includeScore:r=Y.includeScore}={}){return e.map(e=>{let{idx:i}=e,a={item:t[i],refIndex:i};return n&&(a.matches=Vh(e)),r&&(a.score=e.score),a})}var Uh=/[\p{L}\p{M}\p{N}_]+/gu,Wh=new WeakSet;function Gh(e){Wh.has(e)||(Wh.add(e),console.warn(`[Fuse] tokenize regex ${e} lacks the global flag; only the first match per text will be returned. Add the 'g' flag.`))}function Kh(e){if(typeof e==`function`){let t=!1;return n=>{let r=e(n);if(!t&&(t=!0,!Array.isArray(r)||r.some(e=>typeof e!=`string`)))throw Error(`[Fuse] tokenize function must return string[]; received ${Array.isArray(r)?`array containing non-strings`:typeof r}.`);return r}}return e instanceof RegExp?(e.global||Gh(e),t=>t.match(e)||[]):e=>e.match(Uh)||[]}function qh({isCaseSensitive:e=!1,ignoreDiacritics:t=!1,tokenize:n}={}){let r=Kh(n);return{tokenize(n){return e||(n=n.toLowerCase()),t&&(n=gh(n)),r(n)}}}var Jh=class{static condition(e,t){return t.useTokenSearch}constructor(e,t){this.options=t,this.analyzer=qh({isCaseSensitive:t.isCaseSensitive,ignoreDiacritics:t.ignoreDiacritics,tokenize:t.tokenize});let n=this.analyzer.tokenize(e),{df:r,fieldCount:i}=t._invertedIndex;this.termSearchers=[],this.idfWeights=[];for(let e of n){this.termSearchers.push(new _h(e,{location:t.location,threshold:t.threshold,distance:t.distance,includeMatches:t.includeMatches,findAllMatches:t.findAllMatches,minMatchCharLength:t.minMatchCharLength,isCaseSensitive:t.isCaseSensitive,ignoreDiacritics:t.ignoreDiacritics,ignoreLocation:!0}));let n=r.get(e)||0,a=Math.log(1+(i-n+.5)/(n+.5));this.idfWeights.push(a)}this.combineAll=t.tokenMatch===`all`,this.numTerms=this.termSearchers.length,this.useMask=this.numTerms<=31}searchIn(e){if(!this.termSearchers.length)return{isMatch:!1,score:1};let t=[],n=0,r=0,i=0,a=0,o=this.combineAll&&!this.useMask?new Set:null;for(let s=0;s<this.termSearchers.length;s++){let c=this.termSearchers[s].searchIn(e),l=this.idfWeights[s];r+=l,c.isMatch&&(i++,n+=l*(1-c.score),c.indices&&t.push(...c.indices),this.combineAll&&(this.useMask?a|=1<<s:o.add(s)))}if(i===0)return{isMatch:!1,score:1};let s=r>0?1-n/r:0,c={isMatch:!0,score:Math.max(.001,s)};return this.options.includeMatches&&t.length&&(c.indices=ph(t)),this.combineAll&&(this.useMask?c.matchedMask=a:c.matchedTerms=o,c.termCount=this.numTerms),c}};function Yh(e,t,n,r){let i=r.tokenize(t);if(!i.length)return;e.fieldCount++,e.docFieldCount.set(n,(e.docFieldCount.get(n)||0)+1);let a=new Set(i),o=e.docTermFieldHits.get(n);o||(o=new Map,e.docTermFieldHits.set(n,o));for(let t of a)o.set(t,(o.get(t)||0)+1),e.df.set(t,(e.df.get(t)||0)+1)}function Xh(e,t,n,r){let{i,v:a,$:o}=t;if(a!==void 0)Yh(e,a,i,r);else if(o)for(let t=0;t<n;t++){let n=o[t];if(n){if(Array.isArray(n))for(let t of n)Yh(e,t.v,i,r);else Yh(e,n.v,i,r)}}}function Zh(e,t,n){let r={fieldCount:0,df:new Map,docFieldCount:new Map,docTermFieldHits:new Map};for(let i of e)Xh(r,i,t,n);return r}function Qh(e,t,n,r){Xh(e,t,n,r)}function $h(e,t){let n=e.docFieldCount.get(t);if(n===void 0)return;e.fieldCount-=n,e.docFieldCount.delete(t);let r=e.docTermFieldHits.get(t);if(r){for(let[t,n]of r){let r=(e.df.get(t)||0)-n;r<=0?e.df.delete(t):e.df.set(t,r)}e.docTermFieldHits.delete(t)}}function eg(e,t){if(t.length===0)return;let n=Array.from(new Set(t)).sort((e,t)=>e-t);for(let t of n)$h(e,t);let r=e=>{let t=0,r=n.length;for(;t<r;){let i=t+r>>>1;n[i]<e?t=i+1:r=i}return e-t},i=n[0],a=new Map;for(let[t,n]of e.docFieldCount)a.set(t>i?r(t):t,n);e.docFieldCount=a;let o=new Map;for(let[t,n]of e.docTermFieldHits)o.set(t>i?r(t):t,n);e.docTermFieldHits=o}var tg=class{constructor(e,t,n){this.options={...Y,...t},this.options.useExtendedSearch,this.options.useTokenSearch,this._keyStore=new Xm(this.options.keys),this._docs=e,this._myIndex=null,this._invertedIndex=null,this.setCollection(e,n),this._lastQuery=null,this._lastSearcher=null}_getSearcher(e){if(this._lastQuery===e)return this._lastSearcher;let t=Ah(e,this._invertedIndex?{...this.options,_invertedIndex:this._invertedIndex}:this.options);return this._lastQuery=e,this._lastSearcher=t,t}setCollection(e,t){if(this._docs=e,t&&!(t instanceof sh))throw Error(Hm);if(this._myIndex=t||ch(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight}),this.options.useTokenSearch){let e=qh({isCaseSensitive:this.options.isCaseSensitive,ignoreDiacritics:this.options.ignoreDiacritics,tokenize:this.options.tokenize});this._invertedIndex=Zh(this._myIndex.records,this._myIndex.keys.length,e)}this._invalidateSearcherCache()}add(e){if(!zm(e))return;this._docs.push(e);let t=this._myIndex.add(e,this._docs.length-1);if(this._invertedIndex&&t){let e=qh({isCaseSensitive:this.options.isCaseSensitive,ignoreDiacritics:this.options.ignoreDiacritics,tokenize:this.options.tokenize});Qh(this._invertedIndex,t,this._myIndex.keys.length,e)}this._invalidateSearcherCache()}remove(e=()=>!1){let t=[],n=[];for(let r=0,i=this._docs.length;r<i;r+=1)e(this._docs[r],r)&&(t.push(this._docs[r]),n.push(r));if(n.length){this._invertedIndex&&eg(this._invertedIndex,n);let e=new Set(n);this._docs=this._docs.filter((t,n)=>!e.has(n)),this._myIndex.removeAll(n),this._invalidateSearcherCache()}return t}removeAt(e){if(!Number.isInteger(e)||e<0||e>=this._docs.length)throw Error(Um);this._invertedIndex&&eg(this._invertedIndex,[e]);let t=this._docs.splice(e,1)[0];return this._myIndex.removeAt(e),this._invalidateSearcherCache(),t}_invalidateSearcherCache(){this._lastQuery=null,this._lastSearcher=null}getIndex(){return this._myIndex}_normalizedKeys(){return this._myIndex.keys.map(e=>this._keyStore.get(e.id)||e)}search(e,t){let{limit:n=-1}=t||{},{includeMatches:r,includeScore:i,shouldSort:a,sortFn:o,ignoreFieldNorm:s}=this.options;if(Pm(e)&&!e.trim()){let e=this._docs.map((e,t)=>({item:e,refIndex:t}));return Fm(n)&&n>-1&&(e=e.slice(0,n)),e}let c=a&&Fm(n)&&n>0&&Pm(e),l=o,u=(e,t)=>l(e,t)||e.idx-t.idx,d;if(c){let t=new Bh(n,u);Pm(this._docs[0])?this._searchStringList(e,{heap:t,ignoreFieldNorm:s}):this._searchObjectList(e,{heap:t,ignoreFieldNorm:s}),d=t.extractSorted()}else d=Pm(e)?Pm(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e),zh(d,{ignoreFieldNorm:s}),a&&d.sort(Pm(e)?u:l),Fm(n)&&n>-1&&(d=d.slice(0,n));return Hh(d,this._docs,{includeMatches:r,includeScore:i})}_searchStringList(e,{heap:t,ignoreFieldNorm:n}={}){let r=this._getSearcher(e),i=this.options.useTokenSearch&&this.options.tokenMatch===`all`,{records:a}=this._myIndex,o=t?null:[];return a.forEach(({v:e,i:a,n:s})=>{if(!zm(e))return;let c=r.searchIn(e);if(c.isMatch){let r={score:c.score,value:e,norm:s,indices:c.indices};i&&(r.matchedMask=c.matchedMask,r.matchedTerms=c.matchedTerms,r.termCount=c.termCount);let l=[r];if(!i||this._coversAllTokens(l)){let r={item:e,idx:a,matches:l};t?(r.score=Rh(r.matches,{ignoreFieldNorm:n}),t.insert(r)):o.push(r)}}}),o}_searchLogical(e){let t=Lh(e,this.options),n=this._normalizedKeys(),r=(e,t,i)=>{if(!(`children`in e)){let{keyId:r,searcher:a}=e,o;return r===null?(o=[],n.forEach((e,n)=>{o.push(...this._findMatches({key:e,value:t[n],searcher:a}))})):o=this._findMatches({key:this._keyStore.get(r),value:this._myIndex.getValueForItemAtKeyId(t,r),searcher:a}),o&&o.length?[{idx:i,item:t,matches:o}]:[]}let{children:a,operator:o}=e,s=[];for(let e=0,n=a.length;e<n;e+=1){let n=a[e],c=r(n,t,i);if(c.length)s.push(...c);else if(o===jh.AND)return[]}return s},i=this._myIndex.records,a=new Map,o=[];return i.forEach(({$:e,i:n})=>{if(zm(e)){let i=r(t,e,n);i.length&&(a.has(n)||(a.set(n,{idx:n,item:e,matches:[]}),o.push(a.get(n))),i.forEach(({matches:e})=>{a.get(n).matches.push(...e)}))}}),o}_searchObjectList(e,{heap:t,ignoreFieldNorm:n}={}){let r=this._getSearcher(e),i=this.options.useTokenSearch&&this.options.tokenMatch===`all`,{records:a}=this._myIndex,o=this._normalizedKeys(),s=t?null:[];return a.forEach(({$:e,i:a})=>{if(!zm(e))return;let c=[],l=!1,u=!1;if(o.forEach((t,n)=>{let i=this._findMatches({key:t,value:e[n],searcher:r});i.length?(c.push(...i),i[0].hasInverse&&(u=!0)):l=!0}),!(u&&l)&&c.length&&(!i||this._coversAllTokens(c))){let r={idx:a,item:e,matches:c};t?(r.score=Rh(r.matches,{ignoreFieldNorm:n}),t.insert(r)):s.push(r)}}),s}_findMatches({key:e,value:t,searcher:n}){if(!zm(t))return[];let r=[];if(jm(t))t.forEach(({v:t,i,n:a})=>{if(!zm(t))return;let o=n.searchIn(t);if(o.isMatch){let n={score:o.score,key:e,value:t,idx:i,norm:a,indices:o.indices,hasInverse:o.hasInverse};o.termCount!==void 0&&(n.matchedMask=o.matchedMask,n.matchedTerms=o.matchedTerms,n.termCount=o.termCount),r.push(n)}});else{let{v:i,n:a}=t,o=n.searchIn(i);if(o.isMatch){let t={score:o.score,key:e,value:i,norm:a,indices:o.indices,hasInverse:o.hasInverse};o.termCount!==void 0&&(t.matchedMask=o.matchedMask,t.matchedTerms=o.matchedTerms,t.termCount=o.termCount),r.push(t)}}return r}_coversAllTokens(e){let t=e.length?e[0].termCount:void 0;if(t===void 0)return!0;if(t<=31){let n=0;for(let t=0;t<e.length;t++)n|=e[t].matchedMask||0;return n===2**t-1}let n=new Set;for(let t=0;t<e.length;t++){let r=e[t].matchedTerms;if(r)for(let e of r)n.add(e)}return n.size===t}};tg.version=`7.5.0`,tg.createIndex=ch,tg.parseIndex=lh,tg.config=Y,tg.match=function(e,t,n){if(n&&n.useTokenSearch)throw Error(Jm);return Ah(e,{...Y,...n}).searchIn(t)},tg.parseQuery=Lh,kh(Dh),kh(Jh),tg.use=function(...e){e.forEach(e=>kh(e))};var ng=tg;function rg(e){let t=e.slice(e.lastIndexOf(`/`)+1),n=t.lastIndexOf(`.`);return n<=0?``:t.slice(n+1).toLowerCase()}var ig={ts:`code`,tsx:`code`,js:`code`,jsx:`code`,mjs:`code`,cjs:`code`,mts:`code`,cts:`code`,py:`code`,rb:`code`,go:`code`,rs:`code`,java:`code`,kt:`code`,kts:`code`,scala:`code`,c:`code`,h:`code`,cc:`code`,cpp:`code`,hpp:`code`,cs:`code`,swift:`code`,m:`code`,mm:`code`,php:`code`,pl:`code`,pm:`code`,lua:`code`,r:`code`,jl:`code`,ex:`code`,exs:`code`,erl:`code`,hs:`code`,dart:`code`,nim:`code`,zig:`code`,vue:`code`,svelte:`code`,astro:`code`,sh:`code`,bash:`code`,zsh:`code`,fish:`code`,ps1:`code`,bat:`code`,cmd:`code`,sql:`code`,graphql:`code`,gql:`code`,proto:`code`,tf:`code`,tfvars:`code`,hcl:`code`,sol:`code`,md:`markup`,mdx:`markup`,markdown:`markup`,txt:`markup`,text:`markup`,rst:`markup`,adoc:`markup`,org:`markup`,yaml:`config`,yml:`config`,toml:`config`,ini:`config`,cfg:`config`,conf:`config`,xml:`config`,env:`config`,properties:`config`,gitignore:`config`,editorconfig:`config`,eslintrc:`config`,prettierrc:`config`,css:`style`,scss:`style`,sass:`style`,less:`style`,stylus:`style`,pcss:`style`,postcss:`style`,png:`image`,jpg:`image`,jpeg:`image`,gif:`image`,bmp:`image`,webp:`image`,avif:`image`,ico:`image`,svg:`image`,tif:`image`,tiff:`image`,heic:`image`,psd:`image`,ai:`image`,json:`data`,jsonc:`data`,json5:`data`,csv:`data`,tsv:`data`,parquet:`data`,db:`data`,sqlite:`data`,sqlite3:`data`,ndjson:`data`,zip:`archive`,tar:`archive`,gz:`archive`,tgz:`archive`,bz2:`archive`,xz:`archive`,"7z":`archive`,rar:`archive`,zst:`archive`,jar:`archive`,war:`archive`,whl:`archive`,woff:`font`,woff2:`font`,ttf:`font`,otf:`font`,eot:`font`,exe:`binary`,dll:`binary`,so:`binary`,dylib:`binary`,bin:`binary`,o:`binary`,obj:`binary`,a:`binary`,lib:`binary`,class:`binary`,node:`binary`,pyc:`binary`,pyo:`binary`,pack:`binary`,idx:`binary`,iso:`binary`,dmg:`binary`,msi:`binary`,apk:`binary`,deb:`binary`,rpm:`binary`,pdf:`binary`,doc:`binary`,docx:`binary`,xls:`binary`,xlsx:`binary`,ppt:`binary`,pptx:`binary`,odt:`binary`,ods:`binary`,odp:`binary`,wasm:`binary`},ag={dockerfile:`config`,containerfile:`config`,makefile:`code`,cmakelists:`code`,rakefile:`code`,gemfile:`config`,procfile:`config`,license:`markup`,licence:`markup`,notice:`markup`,readme:`markup`,changelog:`markup`,authors:`markup`,contributing:`markup`,".gitignore":`config`,".gitattributes":`config`,".gitmodules":`config`,".npmrc":`config`,".nvmrc":`config`,".env":`config`};function og(e){let t=ag[e.slice(e.lastIndexOf(`/`)+1).toLowerCase()];if(t)return t;let n=rg(e);return n?ig[n]??`generic`:`generic`}var sg={code:[`M6 4.5 2.5 8 6 11.5`,`M10 4.5 13.5 8 10 11.5`,`M9.2 3.5 6.8 12.5`],markup:[`M4 2.5h5l3 3v8a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-10a1 1 0 0 1 1-1z`,`M9 2.5v3h3`,`M5.5 8.5h5`,`M5.5 11h3.5`],config:[`M8 10.2a2.2 2.2 0 1 0 0-4.4 2.2 2.2 0 0 0 0 4.4z`,`M8 1.8v1.6`,`M8 12.6v1.6`,`M1.8 8h1.6`,`M12.6 8h1.6`,`M3.6 3.6l1.1 1.1`,`M11.3 11.3l1.1 1.1`,`M12.4 3.6l-1.1 1.1`,`M4.7 11.3l-1.1 1.1`],style:[`M8 13.5a5.5 5.5 0 1 1 0-11c3 0 5.5 2 5.5 4.5 0 1.4-1.1 2.2-2.3 2.2h-1c-.9 0-1.6.7-1.6 1.5 0 .4.2.7.4 1 .2.3.4.6.4 1a1.3 1.3 0 0 1-1.4.8z`,`M5.6 6.8h.01`,`M8.4 5.2h.01`,`M11 6.9h.01`],image:[`M2.5 4.5a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v7a1 1 0 0 1-1 1h-9a1 1 0 0 1-1-1v-7z`,`M2.5 10.5 6 7.5l2.5 2 2-1.5 3 2.5`,`M5.8 6.4h.01`],data:[`M2.5 3.5h11v9h-11z`,`M2.5 8h11`,`M8 3.5v9`],archive:[`M2.5 5.5h11v8h-11z`,`M1.5 2.5h13v3h-13z`,`M6.8 8.5h2.4`],font:[`M3.5 13 8 3l4.5 10`,`M5.4 9.6h5.2`],binary:[`M2.5 4.5h11v7h-11z`,`M5 7h.01`,`M8 7h.01`,`M11 7h.01`,`M5 9.5h.01`,`M8 9.5h.01`],generic:[`M4 2.5h5l3 3v8a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-10a1 1 0 0 1 1-1z`,`M9 2.5v3h3`],folder:[`M2.5 4.5a1 1 0 0 1 1-1h3l1.5 2h4.5a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1h-9a1 1 0 0 1-1-1v-8z`],"folder-open":[`M2.5 12.5v-8a1 1 0 0 1 1-1h3l1.5 2h4.5a1 1 0 0 1 1 1v1`,`M2.5 12.5 4.6 6.8a1 1 0 0 1 .95-.7h8.1a.6.6 0 0 1 .55.85L12.9 12.5a1 1 0 0 1-.95.7H3.5a1 1 0 0 1-1-1z`]};function cg({path:e,category:t,size:n=14}){let r=t??og(e??``),i=sg[r]??sg.generic;return(0,B.jsx)(`svg`,{className:`file-icon file-icon-${r}`,"data-file-icon":r,width:n,height:n,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:1.5,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,focusable:`false`,children:i.map((e,t)=>(0,B.jsx)(`path`,{d:e},t))})}var lg=`modulepreload`,ug=function(e){return`/`+e},dg={},fg=function(e){return e.pathname.endsWith(`.css`)},pg=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},mg=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=o(t.map(t=>{t=ug(t,n);let r=s(t),i=fg(r);return pg(dg,r.href,()=>{if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((i?e.styles:e.all).has(r.href))return;let t=document.createElement(`link`);if(t.rel=i?`stylesheet`:lg,i||(t.as=`script`),t.crossOrigin=``,t.href=r.href,a&&t.setAttribute(`nonce`,a),document.head.appendChild(t),i)return new Promise((e,n)=>{t.addEventListener(`load`,e),t.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${r}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},hg=4e3,gg=(0,z.lazy)(()=>mg(()=>import(`./CodeMirrorEditor-DNLm2zT6.js`).then(e=>({default:e.CodeMirrorEditor})),[])),_g=class extends Error{status;body;constructor(e,t){super(t.error||`HTTP ${e}`),this.status=e,this.body=t,this.name=`ApiError`}},vg=15e3,yg=e=>new _g(408,{error:`请求超时:${vg/1e3} 秒内服务端没有响应`,code:`timeout`,details:{path:e}});async function bg(e,t){let n=new AbortController,r=setTimeout(()=>n.abort(),vg);try{let r=await fetch(e,{...t,signal:n.signal}),i;try{i=await r.json()}catch{i=void 0}if(!r.ok)throw new _g(r.status,i??{error:`HTTP ${r.status}`});return i}catch(t){throw n.signal.aborted?yg(e):t}finally{clearTimeout(r)}}var xg=e=>e instanceof _g?e:new _g(0,{error:e instanceof Error?e.message:`读取失败`}),Sg=e=>encodeURIComponent(e),Cg=(e,t)=>`/api/files?workspaceId=${Sg(e)}&path=${Sg(t)}`,wg=(e,t)=>`/api/file?workspaceId=${Sg(e)}&path=${Sg(t)}`,Tg=(e,t)=>`/api/file?workspaceId=${Sg(e)}&path=${Sg(t)}&meta=1`,Eg=(e,t)=>`/api/files?workspaceId=${Sg(e)}&q=${Sg(t)}`,Dg=e=>e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`,Og=e=>{let t=new Date(e);return Number.isNaN(t.getTime())?``:new Date(e).toLocaleTimeString(`zh-CN`,{hour:`2-digit`,minute:`2-digit`})};function kg({workspaceId:e,entryPath:t,name:n,listings:r,expanded:i,toggle:a,loadDirectory:o,openPaths:s,changedDirs:c,changedPaths:l,onOpen:u,depth:d}){let f=r[t],p=i.has(t);return(0,z.useEffect)(()=>{p&&f===void 0&&o(t)},[p,t,f,o]),(0,B.jsxs)(`li`,{className:`file-node`,"data-file-dir":t,"data-file-dir-changed":c.has(t)?`1`:`0`,children:[(0,B.jsxs)(`button`,{type:`button`,className:`file-row file-row-dir`,"data-file-dir-toggle":t,"aria-expanded":p,style:{paddingLeft:`${8+d*13}px`},title:c.has(t)?`${t} 里有 agent 改过的文件`:t,onClick:()=>a(t),children:[(0,B.jsx)(`span`,{className:`file-caret`,"aria-hidden":`true`,children:p?`▾`:`▸`}),(0,B.jsx)(cg,{category:`folder`}),(0,B.jsx)(`span`,{className:`file-name`,children:n}),c.has(t)&&(0,B.jsx)(`span`,{className:`file-badge file-badge-changed`,"data-file-dir-changed-badge":t,title:`里面有 agent 改过的文件`,children:`✎`})]}),p&&(0,B.jsx)(`ul`,{className:`file-children`,children:f===void 0?(0,B.jsx)(`li`,{className:`file-row-loading`,"data-file-loading":t,children:`读取中…`}):`error`in f?(0,B.jsx)(`li`,{className:`file-row-error`,"data-file-error":t,children:f.error.message}):f.entries.length===0?(0,B.jsx)(`li`,{className:`file-row-empty`,"data-file-empty":t,children:`空目录`}):(0,B.jsxs)(B.Fragment,{children:[f.truncated&&(0,B.jsx)(`li`,{className:`file-row-empty`,"data-file-truncated":t,children:`条目过多,只显示前一部分`}),f.entries.map(t=>t.kind===`directory`?(0,B.jsx)(kg,{workspaceId:e,entryPath:t.path,name:t.name,listings:r,expanded:i,toggle:a,loadDirectory:o,openPaths:s,changedDirs:c,changedPaths:l,onOpen:u,depth:d+1},t.path):(0,B.jsx)(Ag,{entry:t,depth:d+1,openPaths:s,changedPaths:l,onOpen:u},t.path))]})})]})}function Ag({entry:e,depth:t,openPaths:n,changedPaths:r,onOpen:i}){if(e.kind===`symlink`)return(0,B.jsx)(`li`,{className:`file-node`,"data-file-entry":e.path,"data-file-outside":e.path,children:(0,B.jsxs)(`button`,{type:`button`,className:`file-row file-row-file`,disabled:!0,title:`${e.path} 是一个指向 workspace 之外的符号链接,不能打开`,style:{paddingLeft:`${8+t*13}px`},children:[(0,B.jsx)(`span`,{className:`file-caret`,"aria-hidden":`true`}),(0,B.jsx)(`span`,{className:`file-name`,children:e.name}),(0,B.jsx)(`span`,{className:`file-badge`,"data-file-outside-badge":`1`,children:`外部链接`})]})});let a=n.has(e.path),o=r.has(e.path);return(0,B.jsx)(`li`,{className:`file-node`,"data-file-entry":e.path,"data-file-row-open":a?`1`:`0`,"data-file-row-changed":o?`1`:`0`,children:(0,B.jsxs)(`button`,{type:`button`,className:`file-row file-row-file`,"data-file-open":e.path,disabled:!e.text,title:e.text?o?`${e.path}(agent 改过这个文件,点击查看改动)`:a?`${e.path}(已经打开,点击切换到它)`:e.path:`${e.name} 是二进制文件,无法以文本打开`,style:{paddingLeft:`${8+t*13}px`},onClick:()=>i(e),children:[(0,B.jsx)(`span`,{className:`file-caret`,"aria-hidden":`true`}),(0,B.jsx)(cg,{path:e.path}),(0,B.jsx)(`span`,{className:`file-name`,children:e.name}),a&&(0,B.jsx)(`span`,{className:`file-open-mark`,"data-file-open-mark":e.path,title:`已经打开`,"aria-label":`已经打开`,children:`●`}),o&&(0,B.jsx)(`span`,{className:`file-badge file-badge-changed`,"data-file-changed":e.path,title:`agent 改过这个文件`,children:`✎ 已改`}),!e.text&&(0,B.jsx)(`span`,{className:`file-badge`,"data-file-binary":`1`,"aria-label":`不支持的文件类型`,children:`不支持`})]})})}function jg({file:e,state:t,message:n,external:r,jumpToLine:i,onChange:a,onSave:o,onReload:s,onOverwrite:c}){let[l,u]=(0,z.useState)(!0),d=(0,z.useRef)(null);(0,z.useEffect)(()=>{i&&u(!1)},[e.path,i]),(0,z.useEffect)(()=>{let e=d.current;if(!i||!e)return;let t=Math.min(i.line,e.value.split(`
|
|
48
48
|
`).length),n=e.value.split(`
|
|
49
49
|
`),r=n.slice(0,t-1).reduce((e,t)=>e+t.length+1,0);e.focus(),e.setSelectionRange(r,r+n[t-1].length);let a=parseFloat(getComputedStyle(e).lineHeight);e.scrollTop=Math.max(0,(t-1)*a-e.clientHeight/2),e.scrollLeft=0;let o=e.previousElementSibling;o instanceof HTMLElement&&(o.scrollTop=e.scrollTop,o.scrollLeft=0)},[e.path,i,l]);let f=/\.md$/i.test(e.path);return(0,B.jsxs)(`div`,{className:`file-editor`,"data-file-editor":e.path,"data-save-state":t,children:[(0,B.jsxs)(`div`,{className:`file-editor-head`,children:[(0,B.jsx)(`span`,{className:`file-editor-path`,title:e.path,children:e.path}),(0,B.jsxs)(`span`,{className:`file-editor-flags`,children:[f&&(0,B.jsx)(`button`,{type:`button`,className:`file-preview-toggle`,onClick:()=>u(e=>!e),children:l?`原文`:`预览`}),e.dirty&&(0,B.jsx)(`span`,{className:`file-dirty`,"data-file-dirty":`1`,children:`未保存`}),(0,B.jsx)(`button`,{type:`button`,className:`file-save`,"data-file-save":e.path,onClick:o,disabled:t===`saving`,children:t===`saving`?`保存中…`:`保存`})]})]}),r&&t!==`conflict`&&(0,B.jsxs)(`div`,{className:`file-conflict`,"data-file-external":e.path,role:`alert`,children:[(0,B.jsx)(`p`,{children:`这个文件在磁盘上已经被改过了,你的修改还没有覆盖它。`}),(0,B.jsxs)(`div`,{className:`file-conflict-actions`,children:[(0,B.jsx)(`button`,{type:`button`,"data-file-reload":e.path,onClick:s,children:`丢掉我的修改,读磁盘版本`}),(0,B.jsx)(`button`,{type:`button`,"data-file-overwrite":e.path,onClick:c,children:`仍然覆盖磁盘`})]})]}),t===`conflict`&&(0,B.jsxs)(`div`,{className:`file-conflict`,"data-file-conflict":e.path,role:`alert`,children:[(0,B.jsx)(`p`,{children:`保存被拒绝:这个文件在磁盘上已经被改过了,覆盖会丢掉对方的改动。`}),(0,B.jsxs)(`div`,{className:`file-conflict-actions`,children:[(0,B.jsx)(`button`,{type:`button`,"data-file-reload":e.path,onClick:s,children:`丢掉我的修改,读磁盘版本`}),(0,B.jsx)(`button`,{type:`button`,"data-file-overwrite":e.path,onClick:c,children:`仍然覆盖磁盘`})]})]}),n&&t!==`conflict`&&!r&&(0,B.jsx)(`p`,{className:`file-editor-message file-message-${t}`,"data-file-message":t,role:`status`,children:n}),f&&l?(0,B.jsx)(`div`,{className:`file-markdown-preview`,"data-file-preview":`markdown`,children:(0,B.jsx)(tm,{source:e.content})}):(0,B.jsx)(z.Suspense,{fallback:(0,B.jsx)(`div`,{className:`file-cm-wrap`,"data-file-text":e.path,"data-file-content":e.content,"data-file-selection":`0,0`,"data-file-editor-ready":`0`,children:(0,B.jsx)(`span`,{className:`file-cm-status`,"data-file-editor-loading":`1`,children:`⌛ 正在加载编辑器…`})}),children:(0,B.jsx)(gg,{path:e.path,value:e.content,onChange:a,jumpToLine:i,onSave:o})})]})}function Mg({line:e}){if(e.kind===`fold`)return(0,B.jsx)(`div`,{className:`file-diff-line file-diff-fold`,"data-diff-kind":`fold`,children:e.text});let t=e.kind===`added`?`+`:e.kind===`removed`?`-`:` `;return(0,B.jsxs)(`div`,{className:`file-diff-line file-diff-${e.kind}`,"data-diff-kind":e.kind,"data-diff-no-newline":e.noNewline?`1`:void 0,children:[(0,B.jsx)(`span`,{className:`file-diff-mark`,"aria-hidden":`true`,children:t}),(0,B.jsx)(`span`,{className:`file-diff-number`,"aria-hidden":`true`,children:e.oldLine??``}),(0,B.jsx)(`span`,{className:`file-diff-number`,"aria-hidden":`true`,children:e.newLine??``}),(0,B.jsx)(`span`,{className:`file-diff-text`,children:e.text}),e.noNewline&&(0,B.jsx)(`span`,{className:`file-diff-no-newline`,title:`这个版本的末尾没有换行`,children:`(末尾无换行)`})]})}function Ng({diff:e,loading:t,error:n,bufferContent:r,mode:i,onMode:a}){if(t)return(0,B.jsx)(`div`,{className:`file-diff`,"data-file-diff-state":`loading`,children:(0,B.jsx)(`p`,{className:`rail-empty`,"data-file-diff-loading":`1`,children:`正在读取差异…`})});if(n)return(0,B.jsx)(`div`,{className:`file-diff`,"data-file-diff-state":`error`,children:(0,B.jsx)(`p`,{className:`rail-empty`,"data-file-diff-error":`1`,children:n})});if(!e)return(0,B.jsx)(`div`,{className:`file-diff`,"data-file-diff-state":`empty`,children:(0,B.jsx)(`p`,{className:`rail-empty`,"data-file-diff-empty":`1`,children:`没有选中的差异。`})});let o=typeof r==`string`,s=i===`buffer`&&o,c=s?e.after:e.before,l=s?r:e.after,u=s?`我未保存的修改`:e.label,d=s?`buffer`:e.baseline,f=o&&e.baseline!==`none`?(0,B.jsxs)(`span`,{className:`file-diff-switch`,"data-file-diff-switch":`1`,children:[(0,B.jsx)(`button`,{type:`button`,className:`file-diff-switch-btn${s?``:` file-diff-switch-active`}`,"data-file-diff-base":`server`,"aria-pressed":!s,onClick:()=>a(`server`),children:`agent 的改动`}),(0,B.jsx)(`button`,{type:`button`,className:`file-diff-switch-btn${s?` file-diff-switch-active`:``}`,"data-file-diff-base":`buffer`,"aria-pressed":s,onClick:()=>a(`buffer`),children:`我的修改`})]}):null;if(d===`none`)return(0,B.jsxs)(`div`,{className:`file-diff`,"data-file-diff-state":`none`,"data-file-diff-baseline":d,children:[(0,B.jsxs)(`div`,{className:`file-editor-head`,children:[(0,B.jsx)(`span`,{className:`file-editor-path`,title:e.path,children:e.path}),(0,B.jsx)(`span`,{className:`file-editor-flags`,children:f})]}),(0,B.jsx)(`p`,{className:`file-diff-nobaseline`,"data-file-diff-nobaseline":`1`,children:u})]});let p=km(c,l),m=Am(p);return(0,B.jsxs)(`div`,{className:`file-diff`,"data-file-diff-state":`ready`,"data-file-diff-baseline":d,"data-file-diff-added":p.added,"data-file-diff-removed":p.removed,children:[(0,B.jsxs)(`div`,{className:`file-editor-head`,children:[(0,B.jsx)(`span`,{className:`file-editor-path`,title:e.path,children:e.path}),(0,B.jsxs)(`span`,{className:`file-editor-flags`,children:[f,(0,B.jsx)(`span`,{className:`file-diff-baseline`,"data-file-diff-label":`1`,children:u}),(0,B.jsxs)(`span`,{className:`file-diff-count`,"data-file-diff-count":`1`,children:[`+`,p.added,` / -`,p.removed]})]})]}),e.beforeUnknown&&!s&&(0,B.jsx)(`p`,{className:`file-diff-warning`,"data-file-diff-before-unknown":`1`,role:`status`,children:`读不到改动前的版本(文件太大或无法读取),这里只显示现在的内容。`}),e.before===null&&!e.beforeUnknown&&!s&&(0,B.jsx)(`p`,{className:`file-diff-warning`,"data-file-diff-is-new":`1`,role:`status`,children:`这个文件是新建的,下面是它的全部内容。`}),p.identical?(0,B.jsx)(`p`,{className:`file-diff-nobaseline`,"data-file-diff-identical":`1`,children:`两个版本没有区别。`}):(0,B.jsx)(`div`,{className:`file-diff-body`,"data-file-diff-body":`1`,children:m.lines.map((e,t)=>(0,B.jsx)(Mg,{line:e},t))})]})}function Pg({error:e}){let t=e.body.code,n=typeof e.body.details?.path==`string`?e.body.details.path:``,r=t===`workspace_missing`?`missing`:t===`timeout`?`timeout`:`failed`;return(0,B.jsxs)(`div`,{className:`rail-empty file-problem`,"data-file-root-error":`1`,"data-file-error-kind":r,role:`alert`,children:[r===`missing`&&(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`p`,{className:`file-problem-title`,"data-file-error-title":`1`,children:`工作区路径不存在,无法读取文件。`}),(0,B.jsx)(`p`,{className:`file-problem-hint`,children:`请确认这个路径是写错了,还是目录被移动或删除了:`}),(0,B.jsx)(`code`,{className:`file-problem-path`,"data-file-error-path":`1`,children:n||e.message})]}),r===`timeout`&&(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`p`,{className:`file-problem-title`,"data-file-error-title":`1`,children:`读取超时,服务端没有回应。`}),(0,B.jsxs)(`p`,{className:`file-problem-hint`,children:[`已经等了 `,vg/1e3,` 秒。如果这个工作区在网络盘上,请检查它是否已连接,然后点上面的 ↻ 重试。`]})]}),r===`failed`&&(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`p`,{className:`file-problem-title`,"data-file-error-title":`1`,children:`读取失败。`}),(0,B.jsx)(`p`,{className:`file-problem-hint`,children:e.message})]})]})}function Fg(e){let[t,n]=(0,z.useState)([]),[r,i]=(0,z.useState)(),[a,o]=(0,z.useState)(``),[s,c]=(0,z.useState)({}),[l,u]=(0,z.useState)({}),[d,f]=(0,z.useState)({}),[p,m]=(0,z.useState)(()=>new Set),[h,g]=(0,z.useState)(``),[_,v]=(0,z.useState)(null),[y,b]=(0,z.useState)(!1),[x,S]=(0,z.useState)([]),[C,w]=(0,z.useState)(!1),[T,E]=(0,z.useState)([]),D=(0,z.useCallback)((e,t)=>S(n=>{let r=new Map(n.map(e=>[e.path,e]));for(let t of e)r.set(t.path,t);for(let e of t)r.delete(e);return[...r.values()]}),[]),O=(0,z.useCallback)((e,t)=>{w(e),E(t)},[]);(0,z.useEffect)(()=>{if(S([]),w(!1),E([]),!e)return;let t=!0;return fetch(`/api/files/index?workspaceId=${encodeURIComponent(e)}`).then(e=>e.json()).then(e=>{t&&(D(e.changed??[],e.removed??[]),w(e.complete===!0),E(e.skipped??[]))}).catch(()=>void 0),()=>{t=!1}},[e,D]);let[k,A]=(0,z.useState)({});(0,z.useEffect)(()=>{if(n([]),i(void 0),o(``),c({}),u({}),f({}),m(new Set),v(null),g(``),b(!1),!e)return;let t=!0;return bg(Cg(e,``)).then(e=>{t&&f({"":e})}).catch(e=>{t&&f({"":{error:xg(e)}})}),()=>{t=!1}},[e]);let ee=(0,z.useRef)(void 0),[j,M]=(0,z.useState)(void 0);(0,z.useEffect)(()=>{if(!e||ee.current===e)return;ee.current=e;let t=Lg()[e];t&&(t.expanded.length&&m(new Set(t.expanded)),t.open.length&&(async()=>{for(let e of t.open)await re({path:e,name:e.split(`/`).pop()??e,text:!0});t.active&&(i(t.active),M(t.active))})())},[e]),(0,z.useEffect)(()=>{if(!e)return;let n=setTimeout(()=>{let n=Lg();n[e]={open:t.map(e=>e.path),expanded:[...p],...r?{active:r}:{}},Rg(n)},400);return()=>{clearTimeout(n)}},[e,t,p,r]);let N=(0,z.useCallback)(t=>{e&&bg(Cg(e,t)).then(e=>{f(n=>({...n,[t]:e}))}).catch(e=>{f(n=>({...n,[t]:{error:xg(e)}}))})},[e]),te=(0,z.useCallback)(e=>{m(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),ne=(0,z.useCallback)(()=>{e&&(f({}),m(new Set),bg(Cg(e,``)).then(e=>{f({"":e})}).catch(e=>{f({"":{error:xg(e)}})}))},[e]);(0,z.useEffect)(()=>{let t=h.trim();if(!e||!t){v(null),b(!1);return}let n=!0;b(!0);let r=setTimeout(()=>{bg(Eg(e,t)).then(e=>{n&&(v(e),b(!1))}).catch(e=>{n&&(v({mode:`search`,query:t,hits:[],total:0,indexed:!1}),b(!1),o(`搜索失败:${e instanceof Error?e.message:`未知错误`}`))})},80);return()=>{n=!1,clearTimeout(r)}},[h,e]);let re=(0,z.useCallback)(async r=>{if(e){if(r.text===!1)o(`「${r.name}」不支持以文本打开(二进制文件)。`);else if(t.some(e=>e.path===r.path))i(r.path);else{o(``);try{let t=await bg(wg(e,r.path));n(e=>e.some(e=>e.path===r.path)?e:[...e,{path:t.path,name:r.name,content:t.content,etag:t.meta.etag,dirty:!1}]),i(t.path),u(e=>({...e,[t.path]:!1}))}catch(e){o(`打不开「${r.name}」:${e instanceof Error?e.message:`未知错误`}`)}}}},[e,t]),ie=(0,z.useCallback)(e=>{n(t=>{let n=t.find(t=>t.path===e);if(n?.dirty&&!window.confirm(`「${n.name}」有未保存的修改,关掉就丢了。仍然关闭?`))return t;let a=t.findIndex(t=>t.path===e),o=t.filter(t=>t.path!==e);return e===r&&i(o.length===0?void 0:o[Math.min(a,o.length-1)]?.path),o})},[r]),ae=(0,z.useCallback)((e,t)=>{n(n=>n.map(n=>n.path===e?{...n,content:t,dirty:!0}:n))},[]);(0,z.useEffect)(()=>{if(!e||t.length===0)return;let n=!0,r=t.map(e=>e.path),i=setInterval(()=>{for(let i of r)bg(Tg(e,i)).then(e=>{if(!n)return;let r=t.find(e=>e.path===i);r&&e.etag!==r.etag&&u(e=>({...e,[i]:!0}))}).catch(()=>{})},hg);return()=>{n=!1,clearInterval(i)}},[e,t]);let oe=(0,z.useCallback)(async(r,i)=>{if(!e)return;let a=t.find(e=>e.path===r);if(!a)return;c(e=>({...e,[r]:{state:`saving`,message:``}}));let o=a.etag;if(i)try{o=(await bg(Tg(e,r))).etag}catch(e){c(t=>({...t,[r]:{state:`error`,message:`无法读取磁盘上的最新版本:${e instanceof Error?e.message:`未知错误`}`}}));return}try{let t=await bg(wg(e,r),{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({path:r,content:a.content,baseEtag:o})});n(e=>e.map(e=>e.path===r?{...e,etag:t.meta.etag,dirty:!1}:e)),u(e=>({...e,[r]:!1})),c(e=>({...e,[r]:{state:`saved`,message:`已保存 ${Og(t.meta.modifiedAt)}`}}))}catch(e){let t=e instanceof _g&&e.body.code===`stale`;c(n=>({...n,[r]:{state:t?`conflict`:`error`,message:e instanceof Error?e.message:`保存失败`}})),t&&u(e=>({...e,[r]:!0}))}},[e,t]),se=(0,z.useCallback)(async t=>{if(e)try{let r=await bg(wg(e,t));n(e=>e.map(e=>e.path===t?{...e,content:r.content,etag:r.meta.etag,dirty:!1}:e)),u(e=>({...e,[t]:!1})),c(e=>({...e,[t]:{state:`saved`,message:`已重新载入磁盘版本`}}))}catch(e){c(n=>({...n,[t]:{state:`error`,message:e instanceof Error?e.message:`重新载入失败`}}))}},[e]),ce=t.find(e=>e.path===r),le=(0,z.useMemo)(()=>t.map(e=>({id:e.path,label:e.name,title:e.path,closable:!0,badge:e.dirty?(0,B.jsx)(`span`,{className:`file-tab-badge`,"data-file-tab-dirty":e.path,"aria-label":`未保存`,children:`●`}):void 0})),[t]),ue=(0,z.useMemo)(()=>new Set(t.map(e=>e.path)),[t]),de=(0,z.useCallback)((e,t,n)=>{A(r=>({...r,[e]:{changes:t,dropped:n}}))},[]),fe=e?k[e]:void 0,pe=fe?.changes??[],me=fe?.dropped??0;return{open:t,activePath:r,active:ce,tabItems:le,openPaths:ue,notice:a,setNotice:o,saves:s,external:l,openFile:re,setActivePath:i,closeFile:ie,updateBuffer:ae,save:oe,reload:se,listings:d,expanded:p,toggleDirectory:te,loadDirectory:N,refreshTree:ne,query:h,setQuery:g,hits:_,searching:y,changed:pe,changedPaths:(0,z.useMemo)(()=>new Set(pe.map(e=>e.path)),[pe]),changedDirs:(0,z.useMemo)(()=>{let e=new Set;for(let t of pe){let n=t.path.split(`/`);for(let t=1;t<n.length;t++)e.add(n.slice(0,t).join(`/`))}return e},[pe]),changedDropped:me,setChangedFor:de,index:x,indexComplete:C,indexSkipped:T,setIndex:D,setIndexStatus:O,restoredActive:j}}var Ig=`super-pi.file-workbench.v1`;function Lg(){try{if(typeof window>`u`)return{};let e=JSON.parse(window.localStorage.getItem(`super-pi.file-workbench.v1`)??`null`);if(!e||typeof e!=`object`)return{};let t={};for(let[n,r]of Object.entries(e)){if(!r||typeof r!=`object`)continue;let e=r;t[n]={open:Array.isArray(e.open)?e.open.filter(e=>typeof e==`string`):[],expanded:Array.isArray(e.expanded)?e.expanded.filter(e=>typeof e==`string`):[],...typeof e.active==`string`?{active:e.active}:{}}}return t}catch{return{}}}function Rg(e){try{typeof window<`u`&&window.localStorage.setItem(Ig,JSON.stringify(e))}catch{}}function zg({workspaceId:e,files:t,onOpenFile:n,onOpenChanged:r}){let{open:i,openPaths:a,notice:o,setNotice:s,openFile:c,listings:l,expanded:u,toggleDirectory:d,loadDirectory:f,refreshTree:p,query:m,setQuery:h,hits:g,searching:_,changed:v,changedPaths:y,changedDirs:b,changedDropped:x}=t,S=(0,z.useCallback)(e=>{n?n(e):c(e)},[n,c]),C=l[``],w=m.trim(),T=(0,z.useRef)(null),E=(0,z.useCallback)(e=>{let t=T.current;if(!t)return;let n=e.target?.closest(`.file-row`);if(!n)return;let r=[...t.querySelectorAll(`.file-row`)],i=r.indexOf(n);if(i<0)return;let a=e=>{let t=Math.max(0,Math.min(r.length-1,e));r[t]?.focus()};if(e.key===`ArrowDown`)e.preventDefault(),a(i+1);else if(e.key===`ArrowUp`)e.preventDefault(),a(i-1);else if(e.key===`Home`)e.preventDefault(),a(0);else if(e.key===`End`)e.preventDefault(),a(r.length-1);else if(e.key===`ArrowRight`){let t=n.getAttribute(`data-file-dir-toggle`);t&&n.getAttribute(`aria-expanded`)===`false`&&(e.preventDefault(),d(t))}else if(e.key===`ArrowLeft`){let r=n.getAttribute(`data-file-dir-toggle`);if(r&&n.getAttribute(`aria-expanded`)===`true`){e.preventDefault(),d(r);return}let i=n.getAttribute(`data-file-open`)??n.getAttribute(`data-file-hit`);if(i){e.preventDefault();let n=i.lastIndexOf(`/`),r=n<0?``:i.slice(0,n);(r?t.querySelector(`[data-file-dir-toggle="${CSS.escape(r)}"]`):null)?.focus()}}},[d]),[D,O]=(0,z.useState)(200);(0,z.useEffect)(()=>{O(200)},[w,e]);let k=(0,z.useRef)(null);(0,z.useEffect)(()=>{if(w===``)return;let e=k.current;if(!e||typeof IntersectionObserver>`u`)return;let t=new IntersectionObserver(e=>{e.some(e=>e.isIntersecting)&&O(e=>e>=(g?.hits.length??0)?e:e+200)},{rootMargin:`200px`});return t.observe(e),()=>t.disconnect()},[w,g]);let A=(0,z.useMemo)(()=>{if(w){if(_||!g)return(0,B.jsx)(`p`,{className:`rail-empty`,"data-file-searching":`1`,children:`搜索中…`});if(g.hits.length===0)return(0,B.jsxs)(`p`,{className:`rail-empty`,"data-file-search-empty":`1`,children:[`没有匹配「`,w,`」的文件。`]});let e=g.hits.slice(0,D),t=[],n=new Map;for(let r of e){let e=n.get(r.directory);if(e)e.push(r);else{let e=[r];n.set(r.directory,e),t.push({directory:r.directory,hits:e})}}return(0,B.jsxs)(B.Fragment,{children:[t.map(e=>(0,B.jsxs)(`section`,{className:`file-group`,"data-file-search-group":e.directory,children:[(0,B.jsxs)(`h3`,{className:`file-group-head`,"data-file-search-group-head":e.directory,children:[(0,B.jsx)(`span`,{className:`file-group-name`,children:e.directory||`/`}),(0,B.jsx)(`span`,{className:`file-group-count`,children:e.hits.length})]}),(0,B.jsx)(`ul`,{className:`file-list`,children:e.hits.map(e=>(0,B.jsx)(`li`,{children:(0,B.jsxs)(`button`,{type:`button`,className:`file-row file-row-file`,"data-file-hit":e.path,"data-file-hit-open":a.has(e.path)?`1`:`0`,onClick:()=>S({path:e.path,name:e.name,text:!0}),children:[(0,B.jsx)(`span`,{className:`file-caret`,"aria-hidden":`true`}),(0,B.jsx)(cg,{path:e.path}),(0,B.jsx)(`span`,{className:`file-name`,children:e.name}),a.has(e.path)&&(0,B.jsx)(`span`,{className:`file-open-mark`,"data-file-open-mark":e.path,title:`已经打开`,"aria-label":`已经打开`,children:`●`})]})},e.path))})]},e.directory||`/`)),e.length<g.hits.length&&(0,B.jsx)(`div`,{ref:k,className:`file-sentinel`,"data-file-search-more":`1`,children:`正在载入更多…`})]})}return e?C===void 0?(0,B.jsx)(`p`,{className:`rail-empty`,"data-file-root-loading":`1`,children:`读取工作区…`}):`error`in C?(0,B.jsx)(Pg,{error:C.error}):(0,B.jsxs)(B.Fragment,{children:[C.truncated&&(0,B.jsx)(`p`,{className:`file-search-note`,"data-file-truncated-root":`1`,children:`条目过多,只显示前一部分。`}),C.entries.length===0?(0,B.jsx)(`p`,{className:`rail-empty`,"data-file-root-empty":`1`,children:`这个工作区是空的,没有文件也没有子目录。`}):(0,B.jsx)(`ul`,{className:`file-list`,children:C.entries.map(t=>t.kind===`directory`?(0,B.jsx)(kg,{workspaceId:e,entryPath:t.path,name:t.name,listings:l,expanded:u,toggle:d,loadDirectory:f,openPaths:a,changedDirs:b,changedPaths:y,onOpen:e=>S(e),depth:0},t.path):(0,B.jsx)(Ag,{entry:t,depth:0,openPaths:a,changedPaths:y,onOpen:e=>S(e)},t.path))})]}):(0,B.jsx)(`p`,{className:`rail-empty`,"data-file-no-workspace":`1`,children:`先在左侧选一个工作区,这里会显示它的文件。`})},[w,_,g,D,e,C,l,u,d,f,S,a,b,y]);return(0,B.jsxs)(`div`,{className:`files-panel`,"data-files-panel":`1`,"data-files-open-count":i.length,"data-files-changed-count":v.length,ref:T,onKeyDown:E,children:[(0,B.jsxs)(`div`,{className:`files-search`,children:[(0,B.jsx)(`span`,{className:`files-search-icon`,"aria-hidden":`true`,children:(0,B.jsxs)(`svg`,{viewBox:`0 0 16 16`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,strokeWidth:1.6,strokeLinecap:`round`,children:[(0,B.jsx)(`circle`,{cx:`7`,cy:`7`,r:`4.6`}),(0,B.jsx)(`path`,{d:`M10.4 10.4 14 14`})]})}),(0,B.jsx)(`input`,{type:`search`,className:`files-search-input`,"data-file-search-input":`1`,value:m,placeholder:`按文件名搜索…`,"aria-label":`按文件名搜索`,onKeyDown:e=>{e.key===`Escape`&&(e.preventDefault(),h(``))},onChange:e=>h(e.target.value)}),(0,B.jsx)(`button`,{type:`button`,className:`files-refresh`,"data-file-refresh":`1`,title:`重新读取目录`,"aria-label":`重新读取目录`,disabled:!e,onClick:()=>p(),children:`↻`})]}),w&&g&&!_&&(0,B.jsxs)(`p`,{className:`files-count`,"data-file-search-count":`1`,role:`status`,children:[(0,B.jsx)(`b`,{children:g.total.toLocaleString(`zh-CN`)}),` 个结果`,g.indexed===!1&&(0,B.jsx)(`span`,{className:`files-count-note`,"data-file-search-indexing":`1`,children:`正在建立索引…`})]}),v.length>0&&(0,B.jsxs)(`div`,{className:`files-changed`,"data-file-changed-list":`1`,children:[(0,B.jsxs)(`p`,{className:`files-changed-head`,"data-file-changed-head":`1`,children:[`agent 改了 `,v.length,` 个文件`]}),x>0&&(0,B.jsxs)(`p`,{className:`file-search-note`,"data-file-changed-dropped":`1`,children:[`还有 `,x,` 个改动没有记录(超过保留上限)。`]}),(0,B.jsx)(`ul`,{className:`file-list`,children:v.map(e=>(0,B.jsx)(`li`,{children:(0,B.jsxs)(`button`,{type:`button`,className:`file-row file-row-file`,"data-file-changed-open":e.path,title:`${e.path}(点击查看改动)`,onClick:()=>r?.(e.path),children:[(0,B.jsx)(`span`,{className:`file-caret`,"aria-hidden":`true`}),(0,B.jsx)(cg,{path:e.path}),(0,B.jsx)(`span`,{className:`file-name`,children:e.path.split(`/`).pop()}),(0,B.jsx)(`span`,{className:`file-badge-path`,children:e.path.split(`/`).slice(0,-1).join(`/`)||`/`}),(0,B.jsx)(`span`,{className:`file-badge file-badge-changed`,"data-file-changed-kind":e.path,children:e.baseline===null&&!e.baselineUnknown?`新建`:`已改`})]})},e.path))})]}),o&&(0,B.jsx)(`p`,{className:`rail-empty`,"data-file-notice":`1`,children:o}),(0,B.jsx)(`div`,{className:`files-tree`,"data-file-tree":w?`search`:`browse`,children:A}),i.length===0&&(0,B.jsx)(`p`,{className:`rail-empty`,"data-file-none-open":`1`,children:`点一个文本文件,它会在上面的标签栏开一个标签,正文显示在中间主画面。`}),i.length>0&&(0,B.jsxs)(`p`,{className:`files-hint`,"data-file-open-hint":`1`,children:[`已打开 `,i.length,` 个文件,正文显示在中间主画面;点上面的标签切换,点这里的行切换。`]}),(0,B.jsxs)(`p`,{className:`files-footnote`,"data-files-footnote":`1`,children:[`只支持纯文本(md / 代码),二进制文件不会打开。写入只允许覆盖已存在的文件,不新建,不删除。`,i.length>0&&` 当前打开 ${i.length} 个文件,占 ${Dg(i.reduce((e,t)=>e+t.content.length,0))}。`]})]})}function Bg({workspaceId:e,onOpen:t,onClose:n}){let[r,i]=(0,z.useState)(``),[a,o]=(0,z.useState)(null),[s,c]=(0,z.useState)(``),[l,u]=(0,z.useState)(!1),[d,f]=(0,z.useState)(0),p=(0,z.useRef)(null),m=(0,z.useRef)(null);(0,z.useEffect)(()=>{p.current?.focus()},[]),(0,z.useEffect)(()=>{m.current?.scrollIntoView({block:`nearest`})},[d]),(0,z.useEffect)(()=>{let t=r.trim();if(o(null),c(``),f(0),!e||!t){u(!1);return}let n=!0;u(!0);let i=setTimeout(()=>{bg(`/api/files/search?workspaceId=${Sg(e)}&q=${Sg(t)}`).then(e=>{n&&(o(e),u(!1))}).catch(e=>{n&&(c(e instanceof Error?e.message:`未知错误`),u(!1))})},220);return()=>{n=!1,clearTimeout(i)}},[r,e]);let h=e=>{e&&(t(e),n())},g=a?.truncated||a?.complete===!1,_={index:`索引未完整`,size:`文件超过 512KB`,depth:`目录超过 12 层`,time:`搜索超过 10 秒`,results:`达到 500 条上限`,output:`SDK 输出达到上限`,line:`长行已截断`,unreadable:`部分文件无法读取`};return(0,B.jsx)(`div`,{className:`quick-open-backdrop`,"data-content-search":`1`,role:`presentation`,onMouseDown:n,children:(0,B.jsxs)(`div`,{className:`quick-open content-search`,role:`dialog`,"aria-modal":`true`,"aria-label":`内容搜索`,onMouseDown:e=>e.stopPropagation(),children:[(0,B.jsx)(`input`,{ref:p,className:`quick-open-input`,"data-content-search-input":`1`,value:r,maxLength:256,placeholder:`内容搜索(区分大小写,按字面匹配)`,"aria-label":`内容搜索`,onChange:e=>i(e.target.value),onKeyDown:e=>{e.key===`Escape`?(e.preventDefault(),n()):e.key===`ArrowDown`?(e.preventDefault(),f(e=>Math.min(e+1,Math.max(0,(a?.hits.length??0)-1)))):e.key===`ArrowUp`?(e.preventDefault(),f(e=>Math.max(0,e-1))):e.key===`Enter`&&(e.preventDefault(),h(a?.hits[d]))}}),(0,B.jsxs)(`p`,{className:`quick-open-status`,role:`status`,"data-content-search-status":s?`error`:l?`searching`:g?`partial`:`complete`,children:[s?`✕ 搜索失败:`+s:l?`… 搜索中`:e?g?`⚠ 结果不完整`:a?`✓ 搜索完成`:`○ 输入要搜索的内容`:`○ 请先选择工作区`,a?` · ${a.hits.length} 条命中`:``,` · Esc 关闭`]}),g&&(0,B.jsxs)(`p`,{className:`quick-open-status`,"data-content-search-partial":`1`,children:[`⚠ 结果不完整:`,a?.reasons.map(e=>_[e]??e).join(`;`)]}),a&&a.skipped.length>0&&(0,B.jsxs)(`details`,{className:`quick-open-status`,"data-content-search-skipped":`1`,children:[(0,B.jsxs)(`summary`,{children:[`↷ 已跳过 `,a.skipped.length,` 个文件或目录`]}),(0,B.jsx)(`p`,{className:`content-search-skipped-paths`,children:a.skipped.join(`
|
|
50
50
|
`)})]}),a&&!l&&a.hits.length===0&&(0,B.jsx)(`p`,{className:`quick-open-status`,"data-content-search-empty":`1`,children:`○ 没有匹配的行`}),(0,B.jsx)(`ul`,{className:`quick-open-results content-search-results`,role:`listbox`,children:a?.hits.map((e,t)=>(0,B.jsx)(`li`,{children:(0,B.jsxs)(`button`,{ref:t===d?m:void 0,type:`button`,"data-content-search-result":`${e.path}:${e.line}`,className:`quick-open-result content-search-result${d===t?` quick-open-result-active`:``}`,"aria-selected":d===t,onMouseEnter:()=>f(t),onClick:()=>h(e),children:[(0,B.jsxs)(`span`,{children:[e.path,`:`,e.line]}),(0,B.jsx)(`small`,{title:e.text,children:e.text})]})},`${e.path}:${e.line}`))})]})})}function Vg({entries:e,complete:t,skipped:n,onOpen:r,onClose:i}){let[a,o]=(0,z.useState)(``),[s,c]=(0,z.useState)(0),l=(0,z.useRef)(null),u=(0,z.useMemo)(()=>e.filter(e=>e.kind===`file`&&e.text!==!1),[e]),d=(0,z.useMemo)(()=>a.trim()?new ng(u,{keys:[`path`],threshold:.38,ignoreLocation:!0}).search(a).slice(0,20).map(e=>e.item):u.slice(0,20),[u,a]);(0,z.useEffect)(()=>{l.current?.focus(),c(0)},[a]);let f=(0,z.useCallback)(e=>{e&&(r({path:e.path,name:e.path.split(`/`).pop()??e.path,text:e.text}),i())},[r,i]);return(0,B.jsx)(`div`,{className:`quick-open-backdrop`,"data-quick-open":`1`,role:`presentation`,onMouseDown:i,children:(0,B.jsxs)(`div`,{className:`quick-open`,role:`dialog`,"aria-modal":`true`,"aria-label":`Quick Open`,onMouseDown:e=>e.stopPropagation(),children:[(0,B.jsx)(`input`,{ref:l,className:`quick-open-input`,"data-quick-open-input":`1`,value:a,placeholder:`Quick Open: type a file path`,"aria-label":`Quick Open file path`,onChange:e=>o(e.target.value),onKeyDown:e=>{e.key===`Escape`?(e.preventDefault(),i()):e.key===`ArrowDown`?(e.preventDefault(),c(e=>Math.min(e+1,Math.max(0,d.length-1)))):e.key===`ArrowUp`?(e.preventDefault(),c(e=>Math.max(e-1,0))):e.key===`Enter`&&(e.preventDefault(),f(d[s]))}}),(0,B.jsxs)(`p`,{className:`quick-open-status`,"data-quick-open-status":t?`complete`:`partial`,children:[t?`✓ 索引完整`:`⚠ 索引不完整`,` · `,u.length,` 个文件 · Esc 关闭`]}),n.length>0&&(0,B.jsxs)(`p`,{className:`quick-open-status`,"data-quick-open-skipped":`1`,title:n.join(`, `),children:[`↷ 已跳过:`,n.join(`, `)]}),(0,B.jsx)(`ul`,{className:`quick-open-results`,role:`listbox`,children:d.map((e,t)=>(0,B.jsx)(`li`,{children:(0,B.jsxs)(`button`,{type:`button`,"data-quick-open-result":e.path,className:t===s?`quick-open-result quick-open-result-active`:`quick-open-result`,"aria-selected":t===s,onMouseEnter:()=>c(t),onClick:()=>f(e),children:[(0,B.jsx)(`span`,{children:e.path.split(`/`).pop()}),(0,B.jsx)(`small`,{children:e.path})]})},e.path))})]})})}function Hg(e,t,n=88,r=200){let i=Math.max(0,Math.floor(e));if(!Number.isFinite(t)||t<=0)return{perRow:Math.max(1,i),width:n};if(i===0)return{perRow:1,width:n};if(i===1)return{perRow:1,width:Math.min(r,t)};let a=t/i;if(a>=n)return{perRow:i,width:Math.min(a,r)};for(let e=2;e<=i;e+=1){let a=Math.ceil(i/e),o=t/a;if(o>=n)return{perRow:a,width:Math.min(o,r)}}return{perRow:1,width:n}}function Ug(e,t){let n=Math.max(1,Math.floor(t)),r=[];for(let t=0;t<e.length;t+=n)r.push(e.slice(t,t+n));return r}function Wg(e,t,n=88,r=200){let[i,a]=(0,z.useState)(()=>Hg(e,0,n,r)),[o,s]=(0,z.useState)(null),c=(0,z.useCallback)(()=>{let i=Hg(e,t,n,r);s({count:e,containerWidth:t}),a(e=>e.perRow===i.perRow&&e.width===i.width?e:i)},[e,t,n,r]),l=(0,z.useRef)(t);(0,z.useEffect)(()=>{t<=0||l.current!==t&&(l.current=t,c())},[t,c]);let u=(0,z.useRef)(null);return(0,z.useEffect)(()=>{let t=u.current;u.current=e,t!==null&&e>t&&c()},[e,c]),{layout:i,frozen:o!==null&&o.count!==e,recompute:c}}function Gg({tabs:e,activeId:t,onSelect:n,onClose:r,ariaLabel:i,minWidth:a=88,maxWidth:o=200,prefix:s=`workspace-tab`,idPrefix:c=s,className:l}){let u=(0,z.useRef)(null),[d,f]=(0,z.useState)(0),{layout:p,frozen:m,recompute:h}=Wg(e.length,d,a,o);(0,z.useLayoutEffect)(()=>{let e=u.current;if(!e||typeof ResizeObserver>`u`)return;let t=()=>{let t=e.clientWidth;t>0&&f(t)};t();let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[]);let g=Ug(e,p.perRow),_=(e,t)=>t===void 0?{}:{[`data-${s}-${e}`]:t},v=e.filter(e=>e.kind===`file`).length,y=e.filter(e=>e.kind===`session`||!e.kind).length,b=t=>({[`data-${t}-strip`]:`1`,...m?{[`data-${t}-frozen`]:`1`}:{},[`data-${t}-count`]:t===`file-tab`?v:t===`session-tab`?y:e.length,[`data-${t}-min`]:a,[`data-${t}-max`]:o,[`data-${t}-per-row`]:p.perRow,[`data-${t}-width`]:Math.round(p.width*100)/100}),x=e=>{let t=e.relatedTarget;(!t||t.isConnected)&&h()},S=e=>{let t=e.relatedTarget;(!t||t.isConnected)&&h()};(0,z.useEffect)(()=>{if(!m)return;let e=u.current;if(!e)return;let t=t=>{let n=e.getBoundingClientRect();t.clientX>=n.left&&t.clientX<=n.right&&t.clientY>=n.top&&t.clientY<=n.bottom||h()};return document.addEventListener(`mousemove`,t,!0),()=>document.removeEventListener(`mousemove`,t,!0)},[m,h]);let C=[`${s}-strip`,`workspace-tab-strip`,`session-tab-strip`,`file-tab-strip`,l].filter(Boolean).join(` `);return(0,B.jsx)(`div`,{ref:u,className:C,role:`tablist`,"aria-label":i??`工作区标签页`,..._(`strip`,`1`),...b(`workspace-tab`),...b(`session-tab`),...b(`file-tab`),style:{"--tab-w":`${p.width}px`},onMouseEnter:x,onMouseLeave:S,children:g.map((i,a)=>(0,B.jsx)(`div`,{className:`${s}-row workspace-tab-row session-tab-row file-tab-row`,role:`presentation`,..._(`row`,a),children:i.map(i=>{let a=i.id===t||i.rawId!==void 0&&i.rawId===t,o=i.title??i.label,l=i.kind,u=i.rawId??i.id,d=e.findIndex(e=>e.id===i.id),f=[s,a?`${s}-active`:``,`workspace-tab`,a?`workspace-tab-active`:``,l?`${l}-tab`:``,l&&a?`${l}-tab-active`:``].filter(Boolean).join(` `);return(0,B.jsxs)(`div`,{role:`tab`,id:`${c}-${i.id}`,"aria-selected":a,"aria-controls":`${c}-panel-${i.id}`,tabIndex:a?0:-1,className:f,..._(`id`,u),..._(`index`,d),...a?_(`active`,`1`):{},..._(`closable`,i.closable===!1?`0`:`1`),...l?{"data-tab-kind":l}:{},...l===`session`||!l?{"data-session-tab-id":u,"data-session-tab-index":d,...a?{"data-session-tab-active":`1`}:{},"data-session-tab-closable":i.closable===!1?`0`:`1`}:{},...l===`file`?{"data-file-tab-id":u,"data-file-tab-index":d,...a?{"data-file-tab-active":`1`}:{},"data-file-tab-closable":i.closable===!1?`0`:`1`}:{},title:o,style:{width:p.width,boxSizing:`border-box`},onClick:()=>n?.(i.id),onAuxClick:e=>{e.button===1&&(e.preventDefault(),e.stopPropagation(),i.closable!==!1&&r&&r(i.id))},onMouseDown:e=>{e.button===1&&e.preventDefault()},onKeyDown:t=>{if(t.key!==`ArrowLeft`&&t.key!==`ArrowRight`)return;t.preventDefault();let r=t.key===`ArrowRight`?1:-1,a=e[(e.findIndex(e=>e.id===i.id)+r+e.length)%e.length];a&&n?.(a.id)},children:[i.icon&&(0,B.jsx)(`span`,{className:`${s}-icon workspace-tab-icon`,children:i.icon}),i.badge,(0,B.jsx)(`span`,{className:`${s}-label workspace-tab-label ${l?`${l}-tab-label`:``}`,..._(`label`,u),...l===`session`||!l?{"data-session-tab-label":u}:{},...l===`file`?{"data-file-tab-label":u}:{},children:i.label}),i.closable!==!1&&r&&(0,B.jsx)(`button`,{type:`button`,className:`${s}-close workspace-tab-close ${l?`${l}-tab-close`:``}`,..._(`close`,u),...l===`session`||!l?{"data-session-tab-close":u}:{},...l===`file`?{"data-file-tab-close":u}:{},onClick:e=>{e.stopPropagation(),r(i.id)},title:`关闭 ${o}`,"aria-label":`关闭 ${o}`,children:`×`})]},i.id)})},`row_${a}`))})}var Kg={pending:`未开始`,running:`运行中`,completed:`已完成`,failed:`失败`,skipped:`已跳过`,stopped:`已停止`},qg={running:`运行中`,completed:`全部完成`,failed:`中途失败`,stopped:`已停止`},Jg={pending:`○`,running:`◐`,completed:`✓`,failed:`✕`,skipped:`→`,stopped:`■`},Yg={stop:`失败即停`,skip:`失败跳过`,"retry:1":`失败重试 1 次`,"retry:2":`失败重试 2 次`,"retry:3":`失败重试 3 次`};function Xg(e){let t=Math.max(0,Math.round(e/1e3)),n=t%60,r=Math.floor(t/60)%60,i=Math.floor(t/3600),a=e=>String(e).padStart(2,`0`);return i>0?`${i}h ${a(r)}:${a(n)}`:`${r}:${a(n)}`}function Zg(e){let t=e.status===`running`,[n,r]=(0,z.useState)(0);(0,z.useEffect)(()=>{if(!t)return;r(Date.now());let e=window.setInterval(()=>r(Date.now()),200);return()=>window.clearInterval(e)},[t,e.startedAt]);let i=Date.parse(e.startedAt);if(Number.isFinite(i)){if(!t){let t=Date.parse(e.finishedAt??``);return Number.isFinite(t)?t-i:void 0}return n>0?n-i:void 0}}function Qg({step:e,names:t}){let n=e.attempts.length,r=e.attempts[n-1],i=t.get(e.agentId)||e.agentId,a=e.label?.trim()||i;return(0,B.jsxs)(`li`,{className:`workflow-step workflow-step-${e.status}`,"data-workflow-step":e.index+1,"data-workflow-step-status":e.status,"data-workflow-step-agent":e.agentId,"data-workflow-step-attempts":n,children:[(0,B.jsx)(`span`,{className:`workflow-step-mark`,"aria-hidden":`true`,children:Jg[e.status]}),(0,B.jsxs)(`span`,{className:`workflow-step-n`,"data-workflow-step-n":e.index+1,children:[`第 `,e.index+1,` 步`]}),(0,B.jsx)(`strong`,{className:`workflow-step-name`,"data-workflow-step-name":e.index+1,children:a}),(0,B.jsx)(`span`,{className:`workflow-step-agent`,"data-workflow-step-agent-name":e.index+1,children:i}),n>1&&(0,B.jsxs)(`span`,{className:`workflow-step-tries`,"data-workflow-step-retried":e.index+1,children:[`尝试 `,n,` 次`]}),(0,B.jsx)(`span`,{className:`workflow-step-status`,"data-workflow-step-status-text":e.index+1,children:Kg[e.status]}),e.status===`failed`&&r?.error&&(0,B.jsx)(`span`,{className:`workflow-step-why`,"data-workflow-step-error":e.index+1,children:r.error})]})}function $g({workflow:e,names:t,onStop:n,stopping:r}){let i=e.status===`running`,a=Zg(e),o=e.steps.filter(e=>e.status===`completed`||e.status===`skipped`).length;return(0,B.jsxs)(`article`,{className:`workflow-card workflow-${e.status}`,"data-workflow-card":e.id,"data-workflow-status":e.status,"data-workflow-steps":e.steps.length,"data-workflow-current":e.currentIndex+1,children:[(0,B.jsxs)(`div`,{className:`workflow-head`,children:[(0,B.jsx)(`span`,{className:`workflow-badge`,children:`编排`}),(0,B.jsx)(`strong`,{className:`workflow-summary`,"data-workflow-summary":e.id,children:e.summary}),(0,B.jsxs)(`span`,{className:`workflow-progress`,"data-workflow-progress":e.id,children:[o,`/`,e.steps.length]}),(0,B.jsx)(`span`,{className:`workflow-status`,"data-workflow-status-text":e.id,children:qg[e.status]??e.status}),(0,B.jsx)(`span`,{className:`workflow-policy`,"data-workflow-policy":e.onFailure,children:Yg[e.onFailure]??e.onFailure}),a!==void 0&&(0,B.jsxs)(`span`,{className:`workflow-clock`,"data-workflow-elapsed":e.id,children:[i?`已运行 `:`用时 `,Xg(a)]}),i&&(0,B.jsx)(`button`,{type:`button`,className:`workflow-stop`,"data-workflow-stop":e.id,disabled:r,onClick:n,children:`停止`})]}),(0,B.jsx)(`ol`,{className:`workflow-steps`,"data-workflow-step-count":e.steps.length,children:e.steps.map(e=>(0,B.jsx)(Qg,{step:e,names:t},e.index))})]})}var e_=[{id:`agents`,label:`智能体与创建`,icon:`🤖`,title:`Agent 智能体系统与创建指南`,description:`了解 Super Pi 的角色设定机制,以及如何一步步创建你自己的自定义 Agent。`},{id:`workspace`,label:`工作区与会话`,icon:`🗂️`,title:`工作区与多会话管理`,description:`高效管理本地代码仓库、独立会话标签页与多模态图文输入。`},{id:`subagents`,label:`子任务与编排`,icon:`⚡`,title:`子智能体委托与顺序编排使用指南`,description:`让主 Agent 安排分工、交接结果,并查看进度、处理失败与停止任务。`},{id:`model-policy`,label:`模型使用规则`,icon:`🔒`,title:`模型过滤规则(按工作区限制可用模型)`,description:`用正则规则限定哪些工作区只能用哪些模型,防止敏感代码被发到不该用的模型上。`},{id:`memory`,label:`主动记忆`,icon:`🧠`,title:`主动记忆与技能经验`,description:`让 Super Pi 在得到明确证据后保存长期事实、用户偏好和可复用工作方法。`},{id:`knowledge`,label:`知识库`,icon:`📚`,title:`工作区知识库`,description:`导入规范与设计文档,让 Agent 检索原文作答,而不是凭记忆编造。`},{id:`tools`,label:`侧边栏工具`,icon:`🧩`,title:`全局工具:开发、导出与导入`,description:`让 Agent 写一个工具,用一个文件分享给别人,导入前先看清它会做什么。`},{id:`cli`,label:`指令与快捷键`,icon:`⌨️`,title:`Pi 终端命令与键盘快捷操作`,description:`利用 Pi 终端斜杠指令控制服务生命周期,掌握常用快捷键提升效率。`},{id:`themes`,label:`外观与主题`,icon:`🎨`,title:`界面主题与个性化显示`,description:`内置 4 款专业高对比度主题,针对不同环境提供舒适体验。`}];function t_({onClose:e}){let[t,n]=(0,z.useState)(`agents`);(0,z.useEffect)(()=>{let t=t=>{t.key===`Escape`&&!t.defaultPrevented&&e()};return window.addEventListener(`keydown`,t),()=>window.removeEventListener(`keydown`,t)},[e]);let r=e_.find(e=>e.id===t)??e_[0];return(0,B.jsx)(`div`,{className:`overlay`,onClick:e,children:(0,B.jsxs)(`div`,{className:`picker settings-window help-window`,"data-help-window":`1`,onClick:e=>e.stopPropagation(),role:`dialog`,"aria-modal":`true`,"aria-labelledby":`help-window-title`,children:[(0,B.jsxs)(`div`,{className:`settings-window-head help-window-head`,children:[(0,B.jsxs)(`div`,{className:`help-head-title`,children:[(0,B.jsx)(`h2`,{id:`help-window-title`,children:`使用指南与帮助`}),(0,B.jsx)(`span`,{className:`help-badge`,children:`v0.1.x`})]}),(0,B.jsx)(`button`,{type:`button`,className:`help-close-button`,"aria-label":`关闭指南`,onClick:e,children:`✕`})]}),(0,B.jsxs)(`div`,{className:`settings-window-body help-window-body`,children:[(0,B.jsxs)(`nav`,{className:`settings-nav help-nav`,role:`tablist`,"aria-orientation":`vertical`,"aria-label":`使用指南分类`,children:[(0,B.jsx)(`div`,{className:`settings-nav-label`,children:`目录`}),e_.map(e=>(0,B.jsxs)(`button`,{type:`button`,id:`help-tab-${e.id}`,className:`settings-category help-category`,role:`tab`,"aria-selected":e.id===r.id,"aria-controls":`help-panel`,tabIndex:e.id===r.id?0:-1,onClick:()=>n(e.id),children:[(0,B.jsx)(`span`,{className:`help-tab-icon`,"aria-hidden":`true`,children:e.icon}),(0,B.jsx)(`span`,{children:e.label})]},e.id))]}),(0,B.jsxs)(`div`,{id:`help-panel`,className:`settings-panel help-panel`,role:`tabpanel`,"aria-labelledby":`help-tab-${r.id}`,children:[(0,B.jsxs)(`div`,{className:`help-panel-header`,children:[(0,B.jsx)(`h3`,{className:`help-panel-title`,children:r.title}),(0,B.jsx)(`p`,{className:`help-panel-desc`,children:r.description})]}),(0,B.jsxs)(`div`,{className:`help-panel-content`,children:[r.id===`agents`&&(0,B.jsx)(i_,{}),r.id===`workspace`&&(0,B.jsx)(a_,{}),r.id===`subagents`&&(0,B.jsx)(s_,{}),r.id===`model-policy`&&(0,B.jsx)(o_,{}),r.id===`memory`&&(0,B.jsx)(n_,{}),r.id===`knowledge`&&(0,B.jsx)(r_,{}),r.id===`tools`&&(0,B.jsx)(c_,{}),r.id===`cli`&&(0,B.jsx)(l_,{}),r.id===`themes`&&(0,B.jsx)(u_,{})]}),(0,B.jsx)(`div`,{className:`picker-actions help-actions`,children:(0,B.jsx)(`button`,{type:`button`,className:`picker-cancel`,onClick:e,children:`关闭`})})]})]})]})})}function n_(){return(0,B.jsxs)(`div`,{className:`help-section-group`,children:[(0,B.jsxs)(`div`,{className:`help-card highlight`,children:[(0,B.jsx)(`h4`,{children:`🧠 它会记住什么?`}),(0,B.jsx)(`p`,{children:`用户档案保存跨工作区的长期偏好;工作区事实保存环境与项目约定;技能保存已经验证过的步骤、命令和坑。临时结果、秘密和未验证的失败不会保存。`})]}),(0,B.jsxs)(`div`,{className:`help-card`,children:[(0,B.jsx)(`h4`,{children:`主动保存与后台复盘`}),(0,B.jsxs)(`ul`,{className:`help-list`,children:[(0,B.jsxs)(`li`,{children:[`主 Agent 可以使用 `,(0,B.jsx)(`code`,{children:`memory`}),` 和 `,(0,B.jsx)(`code`,{children:`skill_manage`}),` 工具主动保存;说“记住了”本身不会写入。`]}),(0,B.jsx)(`li`,{children:`每隔若干回合,系统会在独立会话中复盘最近证据。复盘不能读写工作区文件、执行命令或派发任务。`}),(0,B.jsx)(`li`,{children:`读取记忆和历史只返回带来源的参考数据,不能把记忆中的文字当作新的指令。`})]})]}),(0,B.jsxs)(`div`,{className:`help-card`,children:[(0,B.jsx)(`h4`,{children:`权限与审批`}),(0,B.jsxs)(`ul`,{className:`help-list`,children:[(0,B.jsx)(`li`,{children:`子 Agent 可以读取相关记忆,但没有写入权限。`}),(0,B.jsx)(`li`,{children:`后台复盘新增记忆可以直接保存;修改或删除旧条目会进入设置中的待审批列表。`}),(0,B.jsx)(`li`,{children:`在“设置 → 主动记忆”可以开关功能、调整复盘间隔、编辑条目和批准提案。`})]})]})]})}function r_(){return(0,B.jsxs)(`div`,{className:`help-section-group`,children:[(0,B.jsxs)(`div`,{className:`help-card highlight`,children:[(0,B.jsx)(`h4`,{children:`📚 它解决什么问题?`}),(0,B.jsx)(`p`,{children:`Agent 默认靠训练时的记忆回答项目里的问题。知识库让你把规范、设计稿、会议纪要导入工作区,Agent 在回答前检索这些文档的原文片段,而不是凭印象编造。它与“主动记忆”不同:记忆是 Agent 自己沉淀的事实和技能,知识库只有你能写入。`})]}),(0,B.jsxs)(`div`,{className:`help-card`,children:[(0,B.jsx)(`h4`,{children:`怎么用`}),(0,B.jsxs)(`ul`,{className:`help-list`,children:[(0,B.jsx)(`li`,{children:`在“设置 → 知识库”里点“浏览工作区文件…”,在弹出的浏览器里挑一个 Markdown 或文本文件,挑完即导入。也可以直接粘贴正文,或手动填写相对路径。`}),(0,B.jsx)(`li`,{children:`同一个文件内容改了再导入就是更新,不会留下旧版本;同样的内容换个标题再导入也不会变成两篇。`}),(0,B.jsx)(`li`,{children:`面板里的“试检索”会用和 Agent 相同的检索器回答,方便你在交给 Agent 之前先确认它找得到。`}),(0,B.jsxs)(`li`,{children:[`从下一条消息开始生效。Agent 使用 `,(0,B.jsx)(`code`,{children:`knowledge_search`}),` 检索,只拿得到片段和来源,拿不到整篇文档。`]})]})]}),(0,B.jsxs)(`div`,{className:`help-card`,children:[(0,B.jsx)(`h4`,{children:`语义检索是内置的`}),(0,B.jsxs)(`ul`,{className:`help-list`,children:[(0,B.jsxs)(`li`,{children:[`关键词检索始终可用。语义检索让“撤销购买”也能找到写着“取消订单”的段落,它靠一个`,(0,B.jsx)(`strong`,{children:`随安装包一起分发`}),`的中文模型在本机运行,不需要额外下载、不需要联网、也不会把文档发到任何服务。`]}),(0,B.jsxs)(`li`,{children:[`第一次检索时加载模型(约一秒),之后一直可用。设 `,(0,B.jsx)(`code`,{children:`SUPER_PI_KNOWLEDGE_EMBEDDINGS=0`}),` 可以彻底关闭语义检索,只保留关键词检索。`]})]})]}),(0,B.jsxs)(`div`,{className:`help-card`,children:[(0,B.jsx)(`h4`,{children:`它不知道的事`}),(0,B.jsxs)(`ul`,{className:`help-list`,children:[(0,B.jsx)(`li`,{children:`知识库只会检索它有的东西。文档里没写的,它检索出来也不会有——所以导入什么,直接决定它能回答什么。`}),(0,B.jsx)(`li`,{children:`语义检索总会返回“最接近的那一段”,即使这一段其实并不回答问题。检索结果带一个分数,低分意味着这可能只是最像的一条,Agent 会被要求先核对再使用。`}),(0,B.jsx)(`li`,{children:`Agent 对知识库只读,不能写入或删除;导入和删除只有你能做。`})]})]})]})}function i_(){return(0,B.jsxs)(`div`,{className:`help-section-group`,children:[(0,B.jsxs)(`div`,{className:`help-card highlight`,children:[(0,B.jsx)(`h4`,{children:`💡 Agent 是什么?`}),(0,B.jsxs)(`p`,{children:[`在 Super Pi 中,`,(0,B.jsx)(`strong`,{children:`Agent(智能体)`}),` 是一套独立的「角色提示词设定与能力配置」。 通过切换 Agent,模型将扮演专精工程师、系统架构师、代码审查员或规划专家等不同角色,遵循指定的原则来协助你完成任务。`]})]}),(0,B.jsxs)(`div`,{className:`help-card`,children:[(0,B.jsx)(`h4`,{children:`📁 Agent 文件存放在哪里?`}),(0,B.jsxs)(`ul`,{className:`help-list`,children:[(0,B.jsxs)(`li`,{children:[(0,B.jsx)(`strong`,{children:`内置 Agent 目录:`}),`项目根目录下的 `,(0,B.jsx)(`code`,{children:`agents/`}),` 文件夹,例如 `,(0,B.jsx)(`code`,{children:`agents/coder.md`}),`、`,(0,B.jsx)(`code`,{children:`agents/planner.md`}),`、`,(0,B.jsx)(`code`,{children:`agents/reviewer.md`}),` 等。`]}),(0,B.jsxs)(`li`,{children:[(0,B.jsx)(`strong`,{children:`用户自定义持久化目录:`}),`用户主目录下的 `,(0,B.jsx)(`code`,{children:`~/.super-pi/agents/`}),`,放入此目录的文件在所有项目和更新中均持久有效。`]})]})]}),(0,B.jsxs)(`div`,{className:`help-card`,children:[(0,B.jsx)(`h4`,{children:`🚀 如何创建一个全新的自定义 Agent?`}),(0,B.jsxs)(`div`,{className:`help-steps`,children:[(0,B.jsxs)(`div`,{className:`help-step`,children:[(0,B.jsx)(`span`,{className:`step-num`,children:`1`}),(0,B.jsxs)(`div`,{className:`step-body`,children:[(0,B.jsx)(`strong`,{children:`创建 Markdown 文件`}),(0,B.jsxs)(`p`,{children:[`在 `,(0,B.jsx)(`code`,{children:`agents/`}),` 或 `,(0,B.jsx)(`code`,{children:`~/.super-pi/agents/`}),` 目录下新建文件,例如 `,(0,B.jsx)(`code`,{children:`architect.md`}),`。`]})]})]}),(0,B.jsxs)(`div`,{className:`help-step`,children:[(0,B.jsx)(`span`,{className:`step-num`,children:`2`}),(0,B.jsxs)(`div`,{className:`step-body`,children:[(0,B.jsx)(`strong`,{children:`编写元数据与系统提示词`}),(0,B.jsx)(`p`,{children:`文件开头使用 YAML Frontmatter 声明名称和描述,正文编写设定提示词:`}),(0,B.jsx)(`pre`,{className:`help-code-block`,children:(0,B.jsx)(`code`,{children:`---
|
|
@@ -94,6 +94,6 @@ WARNING: This link could potentially be dangerous`)){let e=window.open();if(e){t
|
|
|
94
94
|
|
|
95
95
|
工具不属于当前 workspace;通过内置 tool_register 一次性提交完整文件(index.html、JS/CSS,必要时 .py),Super Pi 会保存为全局工具并自动出现在每个 workspace 的工具 Tab。
|
|
96
96
|
|
|
97
|
-
如需本地计算,声明 script: { path, timeoutMs, parameters }。脚本必须是 Python,参数以 JSON 从 stdin 传入,stdout 必须只输出一个 JSON 对象。在 index.html 中加载 <script src="./super-pi-tool.js"><\/script>,然后调用 SuperPiTool.run(params)、SuperPiTool.get(runId)、SuperPiTool.wait(runId) 或 SuperPiTool.cancel(runId)。这些都是已绑定本工具身份的相对接口;不要调用 /api/exec,不要猜测 toolId,也不要传 shell 命令、任意文件路径或未声明参数。页面必须实际执行一次示例任务并显示运行状态、日志和结构化结果。第三方包写进 environment.requires(必须钉死成 pkg==version),首次运行时会装进这个工具自己的虚拟环境。需要模型能力(摘要、改写、抽取、分类)时调用 SuperPiTool.llm({ prompt, system }),不要自己写模型客户端或保管密钥,并在注册时声明 permissions: { llm: true }——否则服务端会拒绝,导入页面也会提示用户。最后返回注册 id、访问地址、文件清单和验证结果。`);f(e),window.setTimeout(()=>f(!1),1800)};(0,z.useEffect)(()=>{let e=e=>{e.key===`Escape`&&i()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[i]);let N=n.map(e=>e.slug).filter(e=>typeof e==`string`),te=e=>{m(void 0),g(void 0),A(void 0),O({tool:e,name:TE({slug:e.slug??`tool`})})},ne=async(e,t)=>{m(void 0),g(void 0),A(void 0);let n=EE(t);if(!n.ok)A(n.reason);else try{let t=await fetch(`/api/tools/export?id=${encodeURIComponent(e.id)}`),r=await t.json();if(!t.ok||!r.bundle)throw Error(r.error??`HTTP ${t.status}`);let i=new Blob([JSON.stringify(r.bundle,null,2)],{type:`application/json`}),a=URL.createObjectURL(i),o=document.createElement(`a`);o.href=a,o.download=n.name,document.body.appendChild(o),o.click(),o.remove(),URL.revokeObjectURL(a),g(r.skipped?.length?`已导出「${e.name}」,但有 ${r.skipped.length} 个文件没有包含:${r.skipped.join(`、`)}。`:`已导出「${e.name}」。`)}catch(e){m(`导出失败:${e instanceof Error?e.message:String(e)}`)}finally{O(void 0)}},re=async e=>{let t=e.target.files?.[0];if(e.target.value=``,!t)return;m(void 0),g(void 0),S(void 0);let n=SE(await t.text(),t.name);n.ok?(v({filename:t.name,bundle:n.bundle,unnamedFormat:n.unnamedFormat}),b(N.includes(n.bundle.slug)?wE(n.bundle.slug,N):n.bundle.slug),w(n.bundle.files[0]?.path)):m(n.reason)},ie=()=>{v(void 0),b(``),S(void 0),w(void 0)},ae=async()=>{if(!_)return;S(void 0);let e=CE(y);if(!e.ok)S(e.reason);else if(N.includes(e.slug))S(`本机已经有 slug「${e.slug}」的工具,换一个名字再导入。`);else{E(!0);try{let t=await fetch(`/api/tools`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(jE(_.bundle,e.slug))}),n=await t.json();if(!t.ok||!n.id)throw Error(n.error??`HTTP ${t.status}`);await r(),g(`已导入「${_.bundle.name}」,它现在出现在工具栏里,所有工作区都能用。`),ie()}catch(e){m(`导入失败:${e instanceof Error?e.message:String(e)}`)}finally{E(!1)}}};return(0,z.useEffect)(()=>{D&&j.current?.scrollIntoView({block:`center`})},[D]),(0,la.createPortal)((0,B.jsx)(`div`,{className:`tool-overlay`,"data-tool-settings-overlay":`1`,onClick:e=>{e.target===e.currentTarget&&i()},children:(0,B.jsxs)(`div`,{className:`tool-dialog`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`tool-settings-title`,"data-tool-settings":`1`,children:[(0,B.jsxs)(`div`,{className:`tool-dialog-head`,children:[(0,B.jsx)(`h2`,{className:`tool-dialog-title`,id:`tool-settings-title`,children:`⚙ 工具设置`}),(0,B.jsx)(`button`,{type:`button`,className:`tool-dialog-close`,"data-tool-settings-close":`1`,title:`关闭(Esc)`,"aria-label":`关闭工具设置`,onClick:i,children:`✕`})]}),(0,B.jsx)(`div`,{className:`tool-dialog-body`,children:_?(0,B.jsx)(WD,{pending:_,slugDraft:y,slugError:x,preview:C,busy:T,onSlugChange:e=>{b(e),S(void 0)},onPreviewChange:w,onCancel:ie,onConfirm:()=>void ae()}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(`div`,{className:`tool-prompt-card`,children:[(0,B.jsx)(`strong`,{children:`给 Agent 开发新工具`}),(0,B.jsx)(`p`,{className:`tool-hint`,children:`工具会挂载到 Super Pi 的统一 HTTP 服务,不需要再启动独立服务器。`}),(0,B.jsx)(`button`,{type:`button`,className:`tool-link-copy-prompt`,"data-tool-development-prompt":`1`,onClick:()=>void M(),children:d?`已复制`:`复制工具开发 Prompt`})]}),(0,B.jsx)(`div`,{className:`rail-section-head`,children:(0,B.jsx)(`h2`,{className:`rail-section-title`,children:`从预置列表添加`})}),(0,B.jsx)(`div`,{className:`tool-presets`,"data-tool-presets":m_.length,children:m_.map(n=>{let r=e.some(e=>e.kind===n.kind);return(0,B.jsxs)(`div`,{className:`tool-preset`,"data-tool-preset":n.kind,children:[(0,B.jsx)(`span`,{className:`tool-preset-glyph`,"aria-hidden":`true`,children:n.glyph}),(0,B.jsxs)(`span`,{className:`tool-preset-text`,children:[(0,B.jsx)(`strong`,{children:n.name}),(0,B.jsx)(`small`,{children:n.blurb})]}),(0,B.jsx)(`button`,{type:`button`,className:`tool-preset-add`,"data-tool-add-preset":n.kind,disabled:r,title:r?`${n.name}已经在工具栏里了`:`添加${n.name}`,"aria-label":r?`${n.name}已添加`:`添加${n.name}`,onClick:()=>t(T_(e,n.kind)),children:r?`已添加`:`添加`})]},n.kind)})}),(0,B.jsx)(`div`,{className:`rail-section-head`,children:(0,B.jsx)(`h2`,{className:`rail-section-title`,children:`添加网址工具`})}),(0,B.jsx)(`p`,{className:`tool-hint`,children:`填一个网址,它会变成一个图标;点开后在弹窗里用按钮在新标签页打开。网址只接受 http / https / mailto。`}),(0,B.jsx)(`input`,{className:`tool-input`,"data-tool-url-input":`1`,value:a,maxLength:2048,placeholder:`https://example.com/工具`,"aria-label":`工具网址`,onChange:e=>{o(e.target.value),u(void 0)}}),(0,B.jsx)(`input`,{className:`tool-input`,"data-tool-url-name":`1`,value:s,maxLength:40,placeholder:`名称(可留空,默认用域名)`,"aria-label":`工具名称(可选)`,onChange:e=>c(e.target.value)}),(0,B.jsx)(`button`,{type:`button`,className:`tool-url-add`,"data-tool-url-add":`1`,disabled:!a.trim(),onClick:()=>{let n=b_(a);n.ok?e.length>=32?u(`工具最多 32 个,先删掉一个再加。`):(t([...e,{id:w_(`link`,e.map(e=>e.id)),kind:`link`,name:s.trim()||GD(n.url),glyph:`↗`,url:n.url}]),o(``),c(``),u(void 0)):u(n.reason)},children:`添加网址工具`}),l&&(0,B.jsx)(`p`,{className:`tool-error`,"data-tool-error":`1`,role:`alert`,children:l}),(0,B.jsxs)(`p`,{className:`tool-hint`,"data-tool-scope-note":`1`,children:[`能自定义到哪:从上面挑预置工具,或自己填一个网址。`,(0,B.jsx)(`b`,{children:`没有开放「写一段脚本来执行」这一档`}),`——它在浏览器里等同于任意代码执行,会拿着本应用的权限跑。计算器是手写的算术解析器,不含 eval,也认不出变量名。`]}),(0,B.jsx)(`div`,{className:`rail-section-head`,children:(0,B.jsxs)(`h2`,{className:`rail-section-title`,children:[`已安装的全局工具(`,n.length,`)`]})}),n.length===0?(0,B.jsx)(`p`,{className:`tool-hint`,"data-tool-mounted-empty":`1`,children:`还没有通过 tool_register 注册的工具。上面复制那段 Prompt,让 Agent 写一个。`}):(0,B.jsx)(`div`,{className:`tool-presets`,"data-tool-mounted-list":n.length,children:n.map(e=>{let t=kE(e.environmentState);return(0,B.jsxs)(`div`,{className:`tool-share-row`,"data-tool-share-row":e.id,children:[(0,B.jsx)(`span`,{className:`tool-preset-glyph`,"aria-hidden":`true`,children:`🧩`}),(0,B.jsxs)(`span`,{className:`tool-preset-text`,children:[(0,B.jsx)(`strong`,{children:e.name}),(0,B.jsx)(`small`,{"data-tool-env":e.environmentState?.state??`unknown`,children:t?`${t.warn?`⚠ `:``}${t.text}${e.environmentState?.detail?` · ${e.environmentState.detail}`:``}`:`环境未知`}),e.permissions?.llm&&(0,B.jsx)(`small`,{"data-tool-model":`1`,children:`⚠ 会调用模型`})]}),(0,B.jsx)(`button`,{type:`button`,className:`tool-preset-add`,"data-tool-export":e.id,title:`导出${e.name},得到一个可以发给别人导入的文件`,"aria-label":`导出${e.name}`,onClick:()=>te(e),children:`导出`})]},e.id)})}),D&&(0,B.jsxs)(`div`,{className:`tool-share-review`,ref:j,"data-tool-export-name":`1`,children:[(0,B.jsxs)(`h3`,{className:`tool-share-title`,children:[`导出「`,D.tool.name,`」`]}),(0,B.jsxs)(`label`,{className:`tool-hint`,children:[`文件名(发给别人的就是这个文件)`,(0,B.jsx)(`input`,{className:`tool-input`,value:D.name,"aria-label":`导出文件名`,"data-tool-export-input":`1`,onChange:e=>O({...D,name:e.target.value})})]}),k&&(0,B.jsx)(`p`,{className:`tool-error`,role:`alert`,"data-tool-export-name-error":`1`,children:k}),(0,B.jsxs)(`div`,{className:`tool-share-actions`,children:[(0,B.jsx)(`button`,{type:`button`,className:`tool-preset-add`,"data-tool-export-cancel":`1`,onClick:()=>{O(void 0),A(void 0)},children:`取消`}),(0,B.jsx)(`button`,{type:`button`,className:`tool-url-add`,"data-tool-export-confirm":`1`,onClick:()=>void ne(D.tool,D.name),children:`导出`})]})]}),h&&(0,B.jsx)(`p`,{className:`tool-hint`,"data-tool-share-notice":`1`,children:h}),p&&(0,B.jsx)(`p`,{className:`tool-error`,"data-tool-share-error":`1`,role:`alert`,children:p}),(0,B.jsx)(`div`,{className:`rail-section-head`,children:(0,B.jsx)(`h2`,{className:`rail-section-title`,children:`从文件导入`})}),(0,B.jsxs)(`p`,{className:`tool-hint`,children:[`收到别人分享的工具文件(`,(0,B.jsx)(`code`,{children:vE}),`)?导入后它出现在工具栏里,所有工作区都能用。`,(0,B.jsx)(`b`,{children:`导入前会先给你看这个包里有什么。`})]}),(0,B.jsx)(`button`,{type:`button`,className:`tool-url-add`,"data-tool-import-pick":`1`,onClick:()=>ee.current?.click(),children:`选择文件…`}),(0,B.jsx)(`input`,{ref:ee,type:`file`,accept:`.json,application/json`,style:{display:`none`},"data-tool-import-input":`1`,onChange:e=>void re(e)})]})})]})}),document.body)}function WD({pending:e,slugDraft:t,slugError:n,preview:r,busy:i,onSlugChange:a,onPreviewChange:o,onCancel:s,onConfirm:c}){let l=e.bundle,u=l.files.reduce((e,t)=>e+new TextEncoder().encode(t.content).length,0),d=OE(l),f=DE(l),p=l.files.find(e=>e.path===r)??l.files[0];return(0,B.jsxs)(`div`,{className:`tool-share-review`,"data-tool-import-review":`1`,children:[(0,B.jsx)(`h3`,{className:`tool-share-title`,"data-tool-import-name":`1`,children:l.name}),l.description&&(0,B.jsx)(`p`,{className:`tool-hint`,"data-tool-import-desc":`1`,children:l.description}),e.unnamedFormat&&(0,B.jsx)(`p`,{className:`tool-import-note`,"data-tool-import-unbranded":`1`,children:`这个文件没有 Super Pi 的工具标记,已按内容形状读取——粘出来的 tool_register 参数也认。`}),(0,B.jsxs)(`p`,{className:`tool-hint`,"data-tool-import-files":`1`,children:[l.files.length,` 个文件 · 共 `,AE(u)]}),(0,B.jsx)(`p`,{className:`tool-hint`,"data-tool-import-paths":`1`,children:l.files.map(e=>e.path).join(` · `)}),l.script&&(0,B.jsxs)(`p`,{className:`tool-import-warn`,"data-tool-import-script":l.script.path,children:[(0,B.jsxs)(`b`,{children:[`⚠ 含 Python 脚本 `,l.script.path]}),(0,B.jsx)(`br`,{}),`导入后运行这个工具时,这段代码会在本机上执行,权限和你自己的 Python 一样(能读你的文件、能联网)。 可以先展开下面的文件列表把它读完。`]}),(0,B.jsxs)(`p`,{className:d.tone===`warn`?`tool-import-warn`:`tool-import-note`,"data-tool-import-env":d.tone,children:[(0,B.jsxs)(`b`,{children:[d.tone===`warn`?`⚠ `:`✓ `,d.text]}),l.environment?.fingerprint?.python&&(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`br`,{}),`导出方环境:Python `,l.environment.fingerprint.python,` / `,l.environment.fingerprint.platform,`。版本对不上时会标出来,但不会拦住你运行。`]})]}),f&&(0,B.jsxs)(`p`,{className:`tool-import-warn`,"data-tool-import-model":`1`,children:[(0,B.jsx)(`b`,{children:`⚠ 这个工具可以调用模型`}),(0,B.jsx)(`br`,{}),f.text,`。模型由 Super Pi 通过 Pi 调用(凭据和模型选择都在 Super Pi 这边),工具只拿到文字。`]}),(0,B.jsxs)(`details`,{className:`tool-import-files`,"data-tool-import-filebox":l.files.length,children:[(0,B.jsxs)(`summary`,{children:[`查看文件(`,l.files.length,`)`]}),(0,B.jsx)(`div`,{className:`tool-share-tabs`,children:l.files.map(e=>(0,B.jsx)(`button`,{type:`button`,className:`tool-share-tab`,"aria-pressed":e.path===p?.path,"data-tool-import-file":e.path,onClick:()=>o(e.path),children:e.path},e.path))}),(0,B.jsx)(`pre`,{className:`tool-import-code`,"data-tool-import-code":p?.path,children:p?.content??``})]}),(0,B.jsxs)(`label`,{className:`tool-hint`,"data-tool-import-slug":`1`,children:[`导入后的 slug(工具的短名字,也是它在磁盘上的目录名)`,(0,B.jsx)(`input`,{className:`tool-input`,value:t,"aria-label":`导入后的 slug`,onChange:e=>a(e.target.value)})]}),n&&(0,B.jsx)(`p`,{className:`tool-error`,role:`alert`,"data-tool-import-slug-error":`1`,children:n}),(0,B.jsxs)(`div`,{className:`tool-share-actions`,children:[(0,B.jsx)(`button`,{type:`button`,className:`tool-preset-add`,"data-tool-import-cancel":`1`,onClick:s,children:`取消`}),(0,B.jsx)(`button`,{type:`button`,className:`tool-url-add`,"data-tool-import-confirm":`1`,disabled:i,onClick:c,children:i?`导入中…`:`导入`})]})]})}function GD(e){let t=e.replace(/^[./]+/,``).slice(0,30).trim();if(!/^[a-z][a-z0-9+.-]*:/i.test(e))return t||e.slice(0,30);try{return new URL(e,typeof window>`u`?`http://localhost`:window.location.href).hostname||t||e.slice(0,30)}catch{return e.slice(0,30)}}function KD({tool:e,onClose:t}){return(0,z.useEffect)(()=>{let e=e=>{e.key===`Escape`&&t()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[t]),(0,la.createPortal)((0,B.jsx)(`div`,{className:`tool-overlay`,"data-tool-overlay":e.id,onClick:e=>{e.target===e.currentTarget&&t()},children:(0,B.jsxs)(`div`,{className:`tool-dialog`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`tool-dialog-title`,"data-tool-dialog":e.id,children:[(0,B.jsxs)(`div`,{className:`tool-dialog-head`,children:[(0,B.jsxs)(`h2`,{className:`tool-dialog-title`,id:`tool-dialog-title`,children:[(0,B.jsx)(`span`,{className:`tool-dialog-glyph`,"aria-hidden":`true`,children:e.glyph}),e.name]}),(0,B.jsx)(`button`,{type:`button`,className:`tool-dialog-close`,"data-tool-close":`1`,title:`关闭(Esc)`,"aria-label":`关闭${e.name}`,onClick:t,children:`✕`})]}),(0,B.jsxs)(`div`,{className:`tool-dialog-body`,children:[e.kind===`calculator`&&(0,B.jsx)(JD,{}),e.kind===`timestamp`&&(0,B.jsx)(YD,{}),e.kind===`link`&&(0,B.jsx)(XD,{tool:e})]})]})}),document.body)}function qD({image:e,onClose:t}){return(0,z.useEffect)(()=>{let e=e=>{e.key===`Escape`&&t()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[t]),(0,la.createPortal)((0,B.jsx)(`div`,{className:`lightbox-overlay`,"data-lightbox-overlay":`1`,onClick:e=>{e.target===e.currentTarget&&t()},children:(0,B.jsxs)(`div`,{className:`lightbox-dialog`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`lightbox-title`,"data-lightbox-dialog":`1`,children:[(0,B.jsxs)(`div`,{className:`lightbox-head`,children:[(0,B.jsx)(`h2`,{className:`lightbox-title`,id:`lightbox-title`,children:e.name||`图片大图`}),(0,B.jsx)(`button`,{type:`button`,className:`lightbox-close`,"data-lightbox-close":`1`,title:`关闭(Esc)`,"aria-label":`关闭大图`,onClick:t,children:`✕`})]}),(0,B.jsx)(`div`,{className:`lightbox-body`,children:(0,B.jsx)(`img`,{src:e.url,alt:e.name||`图片大图`,className:`lightbox-image`})})]})}),document.body)}function JD(){let[e,t]=(0,z.useState)(`12 * (3 + 4)`),n=z_(e),r=e=>{t(t=>t+e)};return(0,B.jsxs)(`div`,{className:`tool-calc`,"data-tool-calc":`1`,children:[(0,B.jsx)(`input`,{className:`tool-input tool-calc-input`,"data-calc-input":`1`,value:e,maxLength:200,"aria-label":`算式`,spellCheck:!1,autoComplete:`off`,placeholder:`例如 (12 + 8) / 4`,onChange:e=>{t(e.target.value)},onKeyDown:e=>{e.key===`Enter`&&e.preventDefault()}}),(0,B.jsx)(`div`,{className:`tool-calc-keys`,"data-calc-keys":`1`,children:[[`7`,`7`],[`8`,`8`],[`9`,`9`],[`÷`,`/`],[`(`,`(`],[`)`,`)`],[`4`,`4`],[`5`,`5`],[`6`,`6`],[`×`,`*`],[`^`,`^`],[`%`,`%`],[`1`,`1`],[`2`,`2`],[`3`,`3`],[`-`,`-`],[`←`,`back`],[`C`,`clear`],[`0`,`0`],[`.`,`.`],[`+`,`+`]].map(([e,n])=>(0,B.jsx)(`button`,{type:`button`,className:`tool-calc-key`,"data-calc-key":n,"aria-label":e===`C`?`清空`:e===`←`?`退格`:`输入 ${e}`,onClick:()=>{n===`clear`?t(``):n===`back`?t(e=>e.slice(0,-1)):r(n)},children:e},e))}),n.ok?(0,B.jsx)(`p`,{className:`tool-calc-result`,"data-calc-result":`1`,"data-calc-value":String(n.value),children:B_(n.value)}):(0,B.jsx)(`p`,{className:`tool-calc-error`,"data-calc-error":`1`,role:`alert`,children:n.reason})]})}function YD(){let[e,t]=(0,z.useState)(``),n=V_(e),r=n.ok?U_(n.ms):null;return(0,B.jsxs)(`div`,{className:`tool-stamp`,"data-tool-stamp":`1`,children:[(0,B.jsx)(`input`,{className:`tool-input`,"data-stamp-input":`1`,value:e,maxLength:64,spellCheck:!1,"aria-label":`时间戳或日期`,placeholder:`1757000000 或 2026-10-08T09:00:00`,onChange:e=>t(e.target.value)}),r?(0,B.jsxs)(`dl`,{className:`tool-stamp-out`,"data-stamp-result":`1`,children:[(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`本地时间`}),(0,B.jsx)(`dd`,{"data-stamp-local":`1`,children:r.local})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`ISO(UTC)`}),(0,B.jsx)(`dd`,{"data-stamp-iso":`1`,children:r.iso})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`秒`}),(0,B.jsx)(`dd`,{"data-stamp-seconds":`1`,children:r.seconds})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`毫秒`}),(0,B.jsx)(`dd`,{"data-stamp-ms":`1`,children:r.milliseconds})]})]}):(0,B.jsx)(`p`,{className:`tool-stamp-error`,"data-stamp-error":`1`,role:`alert`,children:n.ok?`这个日期无法显示。`:n.reason})]})}function XD({tool:e}){let[t,n]=(0,z.useState)(!1),r=async()=>{let e=await JE(`请为 Super Pi 开发一个全局右侧栏工具并自动挂载。不要启动独立 HTTP 服务器。通过内置 tool_register 提交完整的 HTML/JS/CSS 文件;工具将被 Super Pi 保存并在所有 workspace 可用。如需计算,注册一个 Python 脚本(不接受 shell 命令),参数经 JSON stdin 传入,stdout 只输出 JSON 结果。在页面里加载 ./super-pi-tool.js,使用 SuperPiTool.run(params)、wait(runId)、get(runId) 和 cancel(runId) 执行、等待、查看和取消任务。它们会自动绑定当前工具;不要调用 /api/exec,也不要猜测 toolId。`);n(e),window.setTimeout(()=>n(!1),1800)};return(0,B.jsxs)(`div`,{className:`tool-link`,"data-tool-link":e.id,children:[(0,B.jsx)(`p`,{className:`tool-hint`,children:`这是旧版外部网页链接;新工具由 Super Pi 统一托管,并可选绑定受控 Python 脚本。`}),(0,B.jsx)(`code`,{className:`tool-link-url`,"data-tool-link-url":e.id,children:e.url}),(0,B.jsxs)(`div`,{className:`tool-link-actions`,children:[(0,B.jsx)(`a`,{className:`tool-link-open`,"data-tool-link-open":e.id,href:e.url,target:`_blank`,rel:`noopener noreferrer`,title:e.url,children:`在新标签页打开 ↗`}),(0,B.jsx)(`button`,{type:`button`,className:`tool-link-copy-prompt`,"data-tool-copy-prompt":e.id,onClick:()=>void r(),children:t?`已复制`:`复制开发 Prompt`})]}),/^https?:\/\//i.test(e.url??``)&&(0,B.jsx)(`iframe`,{className:`tool-link-frame`,"data-tool-frame":e.id,src:e.url,title:e.name,sandbox:`allow-forms allow-modals allow-pointer-lock allow-popups allow-same-origin allow-scripts`,referrerPolicy:`no-referrer`})]})}var ZD=`(max-width: 1100px)`,QD=(e,t,n)=>Math.min(Math.max(e,t),Math.max(t,n));function $D({tool:e,onClose:t}){return(0,z.useEffect)(()=>{let e=e=>{e.key===`Escape`&&t()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[t]),(0,la.createPortal)((0,B.jsx)(`div`,{className:`tool-overlay`,"data-mounted-tool-overlay":e.id,onClick:e=>{e.target===e.currentTarget&&t()},children:(0,B.jsxs)(`div`,{className:`tool-dialog`,"data-mounted-tool-dialog":e.id,role:`dialog`,"aria-modal":`true`,children:[(0,B.jsxs)(`div`,{className:`tool-dialog-head`,children:[(0,B.jsxs)(`h2`,{className:`tool-dialog-title`,children:[`🧩 `,e.name]}),(0,B.jsx)(`button`,{type:`button`,className:`tool-dialog-close`,onClick:t,children:`✕`})]}),(0,B.jsx)(`div`,{className:`tool-dialog-body`,children:(0,B.jsx)(`iframe`,{className:`tool-link-frame`,src:`/tools/${encodeURIComponent(e.id)}/`,title:e.name,sandbox:`allow-forms allow-modals allow-popups allow-scripts`,referrerPolicy:`no-referrer`})})]})}),document.body)}function eO(e,t,n){let r=Math.max(0,Math.round(n)-480),i=QD(520,180,Math.max(180,r-240)),a=QD(Math.round(e),180,i),o=QD(640,240,Math.max(240,r-a));return{sidebar:a,rail:QD(Math.round(t),240,o),sidebarMin:180,sidebarMax:i,railMin:240,railMax:o,sumCap:r}}var tO=`super-pi.rail-widths.v1`,nO=`super-pi.reader-state.v1`,rO=32,iO=48,aO=e=>{e.dataset.programmaticScroll=`true`,window.setTimeout(()=>{delete e.dataset.programmaticScroll},0)};function oO(){try{if(typeof window>`u`)return{conversations:{}};let e=JSON.parse(window.localStorage.getItem(`super-pi.reader-state.v1`)??`null`);if(!e||typeof e!=`object`)return{conversations:{}};let t={};if(e.conversations&&typeof e.conversations==`object`)for(let[n,r]of Object.entries(e.conversations)){let e=r;typeof e.followTail==`boolean`&&(t[n]={followTail:e.followTail,scrollTop:Number.isFinite(e.scrollTop)?Math.max(0,Number(e.scrollTop)):0,...typeof e.anchorKey==`string`?{anchorKey:e.anchorKey}:{},...Number.isFinite(e.anchorOffset)?{anchorOffset:Number(e.anchorOffset)}:{}})}let n={};if(e.readAt&&typeof e.readAt==`object`)for(let[t,r]of Object.entries(e.readAt))typeof r==`string`&&(n[t]=r);return{activeId:typeof e.activeId==`string`?e.activeId:void 0,workspaceId:typeof e.workspaceId==`string`?e.workspaceId:void 0,conversations:t,readAt:n}}catch{return{conversations:{}}}}function sO(e){try{typeof window<`u`&&window.localStorage.setItem(nO,JSON.stringify(e))}catch{}}var cO=`super-pi.session-tabs.v1`;function lO(){try{if(typeof window>`u`)return{ids:[]};let e=JSON.parse(window.sessionStorage.getItem(`super-pi.session-tabs.v1`)??`null`);if(!e||typeof e!=`object`)return{ids:[]};let t=e,n=Array.isArray(t.ids)?[...new Set(t.ids.filter(e=>typeof e==`string`))]:[];return{ids:n,activeId:typeof t.activeId==`string`&&n.includes(t.activeId)?t.activeId:void 0}}catch{return{ids:[]}}}function uO(e,t){try{typeof window<`u`&&window.sessionStorage.setItem(cO,JSON.stringify({ids:e,...t&&e.includes(t)?{activeId:t}:{}}))}catch{}}function dO(){try{if(typeof window>`u`)return{};let e=window.localStorage.getItem(tO);if(e===null)return{};let t=JSON.parse(e),n=e=>typeof e==`number`&&Number.isFinite(e)&&e>0?Math.round(e):void 0;return{sidebar:n(t.sidebar),rail:n(t.rail)}}catch{return{}}}function fO(e){try{if(typeof window>`u`)return;window.localStorage.setItem(tO,JSON.stringify(e))}catch{}}function pO({side:e,width:t,min:n,max:r,label:i,onWidth:a}){let[o,s]=(0,z.useState)(!1),c=e=>e.shiftKey?64:16;return(0,B.jsx)(`div`,{className:`rail-resizer rail-resizer-${e}${o?` rail-resizer-dragging`:``}`,"data-rail-resizer":e,"data-rail-resizer-dragging":o?`true`:`false`,"data-rail-resizer-width":t,role:`separator`,"aria-orientation":`vertical`,"aria-label":i,"aria-valuenow":t,"aria-valuemin":n,"aria-valuemax":r,tabIndex:0,onMouseDown:i=>{i.preventDefault(),i.currentTarget.focus();let o=i.clientX,c=t;s(!0);let l=document.body,u=l.style.cursor,d=l.style.userSelect;l.style.cursor=`col-resize`,l.style.userSelect=`none`;let f=t=>{let i=e===`left`?t.clientX-o:o-t.clientX;a(QD(c+i,n,r))},p=()=>{l.style.cursor=u,l.style.userSelect=d,s(!1),window.removeEventListener(`mousemove`,f),window.removeEventListener(`mouseup`,p)};window.addEventListener(`mousemove`,f),window.addEventListener(`mouseup`,p)},onKeyDown:i=>{let o=c(i);i.key===`ArrowLeft`?(i.preventDefault(),a(QD(e===`left`?t-o:t+o,n,r))):i.key===`ArrowRight`?(i.preventDefault(),a(QD(e===`left`?t+o:t-o,n,r))):i.key===`Home`?(i.preventDefault(),a(n)):i.key===`End`&&(i.preventDefault(),a(r))}})}var mO=`super-pi.composer-height.v1`,hO=148,gO=.55,_O=()=>Math.max(hO,Math.round((typeof window>`u`?800:window.innerHeight)*gO)),vO=e=>{let t=Number.isFinite(e)?e:hO;return Math.round(Math.min(_O(),Math.max(hO,t)))},yO=()=>{try{let e=window.localStorage.getItem(mO);return e===null?hO:vO(Number(e))}catch{return hO}};function bO({height:e,onHeight:t}){let[n,r]=(0,z.useState)(!1),i=e=>e.shiftKey?64:16,a=_O();return(0,B.jsx)(`div`,{className:`composer-resize${n?` composer-resize-dragging`:``}`,"data-composer-resize":`1`,"data-composer-resize-dragging":n?`true`:`false`,"data-composer-height":e,role:`separator`,"aria-orientation":`horizontal`,"aria-label":`调整消息编辑区高度`,"aria-valuenow":e,"aria-valuemin":hO,"aria-valuemax":a,tabIndex:0,onMouseDown:n=>{n.preventDefault(),n.currentTarget.focus();let i=n.clientY,a=e;r(!0);let o=document.documentElement,s=document.body.style.userSelect;document.body.style.cursor=`ns-resize`,document.body.style.userSelect=`none`;let c=e=>{let t=vO(a+(i-e.clientY));o.style.setProperty(`--composer-height`,`${t}px`)},l=()=>{document.body.style.cursor=``,document.body.style.userSelect=s;let n=Number.parseFloat(o.style.getPropertyValue(`--composer-height`));r(!1),window.removeEventListener(`mousemove`,c),window.removeEventListener(`mouseup`,l),t(Number.isFinite(n)?n:e)};window.addEventListener(`mousemove`,c),window.addEventListener(`mouseup`,l)},onKeyDown:n=>{let r=i(n);n.key===`ArrowUp`?(n.preventDefault(),t(vO(e+r))):n.key===`ArrowDown`?(n.preventDefault(),t(vO(e-r))):n.key===`Home`?(n.preventDefault(),t(hO)):n.key===`End`?(n.preventDefault(),t(a)):n.key===`PageUp`?(n.preventDefault(),t(vO(e+96))):n.key===`PageDown`&&(n.preventDefault(),t(vO(e-96)))}})}function xO(){let[e,t]=(0,z.useState)(ME),[n,r]=(0,z.useState)([]),i=(0,z.useRef)([]),a=(0,z.useRef)(null);a.current||=oO();let o=(0,z.useRef)(null);o.current||=lO();let s=n.reduce((e,t)=>t.apply(e),e),[c,l]=(0,z.useState)(o.current.activeId??a.current.activeId),[u,d]=(0,z.useState)(!1),[f,p]=(0,z.useState)(),[m,h]=(0,z.useState)({}),[g,_]=(0,z.useState)(a.current.workspaceId),[v,y]=(0,z.useState)(o.current.ids),[b,x]=(0,z.useState)(!1),[S,C]=(0,z.useState)(!1),w=(0,z.useRef)(void 0),T=(0,z.useRef)(a.current.conversations),E=(0,z.useRef)(v);E.current=v;let D=(0,z.useRef)(a.current.readAt??{}),[O,k]=(0,z.useState)(0),A=(0,z.useRef)(null),ee=(0,z.useRef)(null),j=(0,z.useRef)(void 0),M=(0,z.useRef)(a.current.activeId),[N,te]=(0,z.useState)({followTail:!0,scrollTop:0}),ne=(0,z.useRef)(!1),re=(0,z.useRef)(new Map),ie=(0,z.useRef)(void 0),ae=(0,z.useRef)([]),oe=(0,z.useRef)(void 0),se=(0,z.useCallback)(()=>{if(oe.current!==void 0&&(cancelAnimationFrame(oe.current),oe.current=void 0),!ae.current.length)return;let e=ae.current;ae.current=[];let n=new Map;for(let t of e){let e=`${t.conversationId}\u0000${t.messageId}`,r=n.get(e)??[];r.push(t),n.set(e,r)}t(e=>({...e,conversations:e.conversations.map(e=>{let t=e.messages.map(t=>{let r=n.get(`${e.id}\u0000${t.id}`);if(!r)return t;let i={...t};for(let e of r){if(e.type===`message.delta`){i.content+=e.delta;continue}if(i.thinkingActive=e.active,!e.delta)continue;let t=e.at??i.content.length,n=[...i.thinkingBlocks??[]],r=n.at(-1);r&&r.at===t&&(e.blockIndex===void 0||e.blockIndex===n.length-1)?n[n.length-1]={...r,text:r.text+e.delta}:n.push({at:t,text:e.delta}),i={...i,thinking:(i.thinking??``)+e.delta,thinkingBlocks:n}}return i});return t.every((t,n)=>t===e.messages[n])?e:{...e,messages:t}})}))},[]),ce=(0,z.useCallback)(e=>{let t=ae.current,n=t.at(-1);n&&n.type===e.type&&n.conversationId===e.conversationId&&n.messageId===e.messageId&&(e.type!==`message.thinking`||n.type===`message.thinking`&&n.at===e.at&&n.active===e.active&&n.blockIndex===e.blockIndex)?t[t.length-1]={...e,delta:n.delta+e.delta}:t.push(e),oe.current===void 0&&(oe.current=requestAnimationFrame(se))},[se]),le=(0,z.useCallback)(e=>{ie.current=e},[]),[ue,de]=(0,z.useState)({}),[fe,pe]=(0,z.useState)(()=>{if(typeof window>`u`)return``;try{return window.localStorage.getItem(`super-pi.user-nickname`)??``}catch{return``}}),me=e=>{let t=e.slice(0,24);pe(t);try{window.localStorage.setItem(`super-pi.user-nickname`,t)}catch{}},he=fe.trim()||`你`,[ge,P]=(0,z.useState)([]),[_e,ve]=(0,z.useState)([]),[ye,be]=(0,z.useState)(new Map),[xe,Se]=(0,z.useState)(new Map),[Ce,we]=(0,z.useState)(),[Te,Ee]=(0,z.useState)(),[De,Oe]=(0,z.useState)(),[ke,Ae]=(0,z.useState)([]),[je,Me]=(0,z.useState)([]),[Ne,Pe]=(0,z.useState)(),[Fe,Ie]=(0,z.useState)(),[Le,Re]=(0,z.useState)(),[ze,Be]=(0,z.useState)(`idle`),[Ve,He]=(0,z.useState)(()=>typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(max-width: 1100px)`).matches),[Ue,We]=(0,z.useState)(`chat`),[Ge,Ke]=(0,z.useState)(()=>typeof window>`u`?1440:window.innerWidth);(0,z.useEffect)(()=>{let e=()=>Ke(window.innerWidth);return window.addEventListener(`resize`,e),e(),()=>window.removeEventListener(`resize`,e)},[]);let[qe,Je]=(0,z.useState)(dO),Ye=eO(qe.sidebar??270,qe.rail??320,Ge);(0,z.useEffect)(()=>{fO({sidebar:Ye.sidebar,rail:Ye.rail})},[Ye.sidebar,Ye.rail]);let Xe=e=>Je(t=>({...t,sidebar:e})),Ze=e=>Je(t=>({...t,rail:e})),[Qe,$e]=(0,z.useState)(null);(0,z.useEffect)(()=>{$e(yO())},[]),(0,z.useEffect)(()=>{Qe!==null&&document.documentElement.style.setProperty(`--composer-height`,`${Qe}px`)},[Qe]);let et=e=>{let t=vO(e);$e(t);try{window.localStorage.setItem(mO,String(t))}catch{}};(0,z.useEffect)(()=>{if(typeof window>`u`||typeof window.matchMedia!=`function`)return;let e=window.matchMedia(ZD),t=e=>{e.matches&&He(!0)};return e.addEventListener(`change`,t),e.matches&&He(!0),()=>e.removeEventListener(`change`,t)},[]);let[tt,nt]=(0,z.useState)({}),[rt,it]=(0,z.useState)({}),[at,ot]=(0,z.useState)({}),[st,ct]=(0,z.useState)(),[lt,ut]=(0,z.useState)(),[dt,ft]=(0,z.useState)(),pt=(0,z.useRef)(new Map),[mt,ht]=(0,z.useState)({}),gt=(0,z.useRef)(new Set),[_t,vt]=(0,z.useState)([]),[yt,bt]=(0,z.useState)([]),[xt,St]=(0,z.useState)(),[Ct,wt]=(0,z.useState)(!1),Tt=(0,z.useRef)(null),Et=(0,z.useRef)(!1),Dt=(0,z.useRef)(0),Ot=(0,z.useRef)([]),kt=(0,z.useRef)(void 0),At=(0,z.useRef)(!1),jt=(0,z.useRef)(new Set),Mt=(0,z.useRef)(new Map),Nt=(0,z.useRef)(new Map),[Pt,Ft]=(0,z.useState)(()=>Date.now());(0,z.useEffect)(()=>{let e=window.setInterval(()=>Ft(Date.now()),3e4);return()=>window.clearInterval(e)},[]);let It=(0,z.useMemo)(()=>s.conversations.filter(e=>!e.archivedAt),[s.conversations]),F=(0,z.useMemo)(()=>It.find(e=>e.id===c)??It.find(e=>e.workspaceId===g)??(g&&s.workspaces.some(e=>e.id===g)?void 0:It[0]),[c,It,g,s.workspaces]);(0,z.useEffect)(()=>{p(void 0)},[c,g]);let Lt=(0,z.useMemo)(()=>s.workspaces.find(e=>e.id===g)??s.workspaces[0],[s.workspaces,g]),Rt=(0,z.useRef)(g);Rt.current=g,(0,z.useEffect)(()=>{F&&_(F.workspaceId)},[F?.id]),(0,z.useEffect)(()=>{kt.current=c},[c]),(0,z.useEffect)(()=>{j.current=F?.id},[F?.id]),(0,z.useEffect)(()=>{let e=F?.id;if(!e)return;let t=s.conversations.find(t=>t.id===e);if(!t)return;let n=D.current[e];D.current[e]=t.updatedAt,n!==t.updatedAt&&k(e=>e+1),sO({activeId:kt.current,workspaceId:F?.workspaceId??g,conversations:T.current,readAt:D.current})},[F?.id,s.conversations]),(0,z.useEffect)(()=>{u&&c&&sO({activeId:c,workspaceId:F?.workspaceId??g,conversations:T.current})},[c,F?.workspaceId,u,g]),(0,z.useEffect)(()=>{let e=A.current;if(!e||!F?.id)return;let t=F.id;ne.current=!1;let n=T.current[t]??{followTail:!0,scrollTop:0};te(n),requestAnimationFrame(()=>{if(A.current===e){if(n.followTail)aO(e),e.scrollTop=e.scrollHeight;else{let t=n.anchorKey?e.querySelector(`[data-transcript-key="${CSS.escape(n.anchorKey)}"]`):null;e.scrollTop=t?Math.max(0,e.scrollTop+t.getBoundingClientRect().top-(n.anchorOffset??0)-e.getBoundingClientRect().top):n.scrollTop}}}),M.current=void 0},[F?.id]);let zt=(0,z.useCallback)((e,t=!1,n=!1)=>{let r=j.current;if(!r)return;let i=e.scrollHeight-e.clientHeight-e.scrollTop,a=T.current[r]??{followTail:!0,scrollTop:0},o=t?!1:n?!0:a.followTail?i<=iO:i<=rO,s,c;if(!o){let t=e.getBoundingClientRect().top,n=[...e.querySelectorAll(`[data-transcript-key]`)].find(e=>e.getBoundingClientRect().bottom>t);s=n?.dataset.transcriptKey,c=n?n.getBoundingClientRect().top-t:void 0}let l={followTail:o,scrollTop:e.scrollTop,...s?{anchorKey:s,anchorOffset:c}:{}};ne.current=!o,T.current[r]=l,te(l),sO({activeId:r,workspaceId:Rt.current,conversations:T.current})},[]),Bt=mt[F?.id??``]??{text:``,images:[],attachments:[],uploading:0},Vt=Bt.text,Ht=Bt.images,Ut=Bt.attachments,Wt=Bt.uploading,Gt=(e,t)=>ht(n=>({...n,[e]:t(n[e]??{text:``,images:[],attachments:[],uploading:0})})),Kt=e=>Gt(F?.id??``,t=>({...t,text:e})),qt=e=>Gt(F?.id??``,t=>({...t,attachments:t.attachments.some(t=>t.kind===e.kind&&t.id===e.id)?t.attachments:[...t.attachments,e]})),Jt=(e,t)=>Gt(F?.id??``,n=>({...n,attachments:n.attachments.filter(n=>n.kind!==e||n.id!==t)})),[Yt,Xt]=(0,z.useState)({visible:!1,query:``,rect:null}),Zt=e=>Gt(F?.id??``,t=>({...t,images:typeof e==`function`?e(t.images):e})),Qt=v.length>0?v:F?[F.id]:[],$t=(0,z.useMemo)(()=>Qt.map(e=>It.find(t=>t.id===e)).filter(e=>e!==void 0),[Qt,It]);(0,z.useEffect)(()=>{if(!b)return;let e=new Set(It.map(e=>e.id));y(t=>{let n=t.filter(t=>e.has(t));return n.length===t.length?t:n})},[b,It]),(0,z.useEffect)(()=>{uO(v,c)},[c,v]);let en=(0,z.useCallback)(e=>{l(e);let t=It.find(t=>t.id===e)?.workspaceId;t&&_(t),yn(`session`),y(t=>t.includes(e)?t:t.length>0?[...t,e]:[...F?.id&&F.id!==e?[F.id]:[],e])},[F]),tn=(0,z.useCallback)(e=>{let t=v.indexOf(e);if(t<0)return;let n=v.filter(t=>t!==e);if(y(n),F?.id!==e)return;let r=n[Math.min(t,n.length-1)];r&&l(r)},[v,F]),I=Fg(g),nn=(0,z.useRef)(I.setChangedFor),rn=(0,z.useRef)(I.setIndex),an=(0,z.useRef)(I.setIndexStatus);(0,z.useEffect)(()=>{nn.current=I.setChangedFor},[I.setChangedFor]),(0,z.useEffect)(()=>{rn.current=I.setIndex},[I.setIndex]),(0,z.useEffect)(()=>{an.current=I.setIndexStatus},[I.setIndexStatus]);let[on,sn]=(0,z.useState)(OD[0].id),[cn,ln]=(0,z.useState)({}),un=(F?.id?cn[F.id]:void 0)??on,dn=(0,z.useCallback)(e=>{sn(e),F?.id&&ln(t=>({...t,[F.id]:e}))},[F?.id]),[fn,pn]=(0,z.useState)(!1),[mn,hn]=(0,z.useState)(!1),[gn,_n]=(0,z.useState)(),[vn,yn]=(0,z.useState)(`session`),[bn,xn]=(0,z.useState)();(0,z.useEffect)(()=>{vn===`file`&&!I.active&&yn(`session`)},[vn,I.active]),(0,z.useEffect)(()=>{vn===`diff`&&!bn&&yn(`session`)},[vn,bn]),(0,z.useEffect)(()=>{I.restoredActive&&yn(`file`)},[I.restoredActive]);let Sn=(0,z.useCallback)(e=>{xn(e),yn(`diff`),sn(`files`)},[]),[Cn,wn]=(0,z.useState)({diff:null,loading:!1,error:``}),[Tn,En]=(0,z.useState)(`server`);(0,z.useEffect)(()=>{if(vn!==`diff`||!bn||!g)return;let e=!0;return wn({diff:null,loading:!0,error:``}),fetch(`/api/files/diff?workspaceId=${encodeURIComponent(g)}&path=${encodeURIComponent(bn)}`).then(async e=>{let t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error??`HTTP ${e.status}`);return t}).then(t=>{e&&wn({diff:t,loading:!1,error:``})}).catch(t=>{e&&wn({diff:null,loading:!1,error:t instanceof Error?t.message:`读取差异失败`})}),()=>{e=!1}},[vn,bn,g]);let Dn=(0,z.useMemo)(()=>{if(!bn)return;let e=I.open.find(e=>e.path===bn);return e&&e.dirty?e.content:void 0},[bn,I.open]),On=(0,z.useCallback)(e=>{I.setActivePath(e),yn(`file`),sn(`files`)},[I.setActivePath]),kn=(0,z.useCallback)(async(e,t)=>{_n(t?{workspaceId:g,path:e.path,line:t,request:Date.now()}:void 0),await I.openFile(e),yn(`file`)},[I.openFile,g]);(0,z.useEffect)(()=>{let e=e=>{(e.ctrlKey||e.metaKey)&&e.shiftKey&&e.key.toLowerCase()===`f`?(e.preventDefault(),hn(!0)):(e.ctrlKey||e.metaKey)&&e.key.toLowerCase()===`p`&&(e.preventDefault(),pn(!0))};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[]);let An=(0,z.useMemo)(()=>$t.map(e=>({id:`session:${e.id}`,rawId:e.id,kind:`session`,label:e.title,title:e.title,closable:$t.length>1||I.open.length>0,badge:(0,B.jsx)(MD,{state:jD(e,ge.some(t=>t.conversationId===e.id),D.current[e.id])})})),[$t,I.open.length,ge,s.conversations,O]),jn=(0,z.useMemo)(()=>I.open.map(e=>({id:`file:${e.path}`,rawId:e.path,kind:`file`,label:e.name,title:e.path,closable:!0,badge:e.dirty?(0,B.jsx)(`span`,{className:`file-tab-badge`,"data-file-tab-dirty":e.path,"aria-label":`未保存`,children:`●`}):void 0})),[I.open]),Mn=(0,z.useMemo)(()=>[...An,...jn],[An,jn]),Nn=vn===`file`&&I.activePath?`file:${I.activePath}`:F?.id?`session:${F.id}`:void 0,Pn=(0,z.useCallback)(e=>{if(e.startsWith(`file:`)){let t=e.slice(5);On(t)}else if(e.startsWith(`session:`)){let t=e.slice(8);en(t)}},[On,en]),Fn=(0,z.useCallback)(e=>{if(e.startsWith(`file:`)){let t=e.slice(5);I.closeFile(t),I.activePath===t&&I.open.length<=1&&yn(`session`)}else if(e.startsWith(`session:`)){let t=e.slice(8);tn(t)}},[I,tn]),In=I.active,Ln=F?.id;(0,z.useEffect)(()=>{Ln&&!Ln.startsWith(`pending:`)&&Hn({type:`conversation.select`,conversationId:Ln})},[Ln]);let L=(e,t=`info`)=>{if(!e)return;let n=++Dt.current;ve(r=>[...r,{key:n,text:e,kind:t}]),Ot.current.push(window.setTimeout(()=>ve(e=>e.filter(e=>e.key!==n)),7e3))},Rn=(e,t)=>{let n=e.findIndex(e=>e.id===t.id);if(n<0)return[t,...e];let r=[...e];return r[n]=t,r},zn=(e,t)=>{let n=e.findIndex(e=>e.id===t.id);if(n<0)return[t,...e];let r=[...e];return r[n]=t,r},Bn=(e,t)=>{if(t.blocking)P(n=>[...n.filter(n=>n.conversationId!==e||n.request.requestId!==t.requestId),{conversationId:e,request:t}]);else if(t.method===`notify`)L(t.message||t.title,t.notifyType??`info`);else if(t.method===`setStatus`){let e=t.statusKey??``;be(n=>{let r=new Map(n);return t.statusText===void 0?r.delete(e):r.set(e,t.statusText),r})}else if(t.method===`setWidget`){let e=t.widgetKey??``;Se(n=>{let r=new Map(n);return t.widgetLines===void 0?r.delete(e):r.set(e,{lines:t.widgetLines,placement:t.widgetPlacement??`aboveEditor`}),r})}else t.method===`setTitle`?we(t.title):t.method===`set_editor_text`&&e===kt.current&&Kt(t.text??``)},Vn=(e,t,n)=>{P(n=>n.filter(n=>n.conversationId!==e||n.request.requestId!==t));let r=aD[n];r&&L(r,`warning`)};(0,z.useEffect)(()=>{let e=!1,n=0,o,s=()=>{if(e)return;let c=location.protocol===`https:`?`wss`:`ws`,u=new WebSocket(`${c}://${location.host}/ws`);w.current=u,u.onopen=()=>{if(!e){n=0,d(!0),u.send(JSON.stringify({type:`stream.configure`,coalesce:!0})),u.send(JSON.stringify({type:`catalog.fetch`,conversationId:kt.current})),u.send(JSON.stringify({type:`catalog.fetchAll`})),u.send(JSON.stringify({type:`agent.catalog.fetch`})),u.send(JSON.stringify({type:`subagent.catalog.fetch`}));for(let e of i.current)e.retry&&e.command&&u.send(JSON.stringify({...e.command,operationRequestId:e.id}))}},u.onclose=()=>{if(e)return;At.current=!1;let t=_E(i.current);for(let e of t.failed)e.onFailure?.();i.current=t.retry,r(t.retry),d(!1),o=window.setTimeout(s,Math.min(qE,KE*2**n++))},u.onmessage=({data:n})=>{if(e)return;let o=JSON.parse(n);if(o.type!==`message.delta`&&o.type!==`message.thinking`&&se(),o.type===`exec.output`){let e=re.current.get(o.sessionId)??``;re.current.set(o.sessionId,(e+o.data).slice(-512e3)),re.current.size>64&&re.current.delete(re.current.keys().next().value),window.dispatchEvent(new CustomEvent(`super-pi-exec-output`,{detail:o}))}else if(o.type===`exec.exit`)re.current.delete(o.sessionId);else if(o.type.startsWith(`terminal.`))ie.current?.(o);else if(o.type===`conversation.autoRename.result`){let e=pt.current.get(o.conversationId);e&&(pt.current.delete(o.conversationId),o.ok?e.resolve(o.title):e.reject(Error(o.error)))}else if(o.type===`message.thinking`)ce(o);else if(o.type===`state`){se(),At.current=!1;let e=kt.current,n=!!(e&&jt.current.has(e)),s=!(!e||o.state.conversations.some(t=>t.id===e)),c=n&&s&&e&&Mt.current.has(e)?{...o.state,conversations:[Mt.current.get(e),...o.state.conversations]}:o.state;e&&!s&&(jt.current.delete(e),Mt.current.delete(e)),i.current=i.current.filter(e=>!e.accepted?.(c)),r(i.current),t(c),x(!0),d(!0),l(e=>{let t=c.conversations.filter(e=>!e.archivedAt),n=a.current?.activeId,r=!!(e&&t.some(t=>t.id===e)),o=!!(e&&i.current.some(t=>t.temporaryId===e));return r||o?e:n&&t.some(e=>e.id===n)?n:t.find(e=>e.workspaceId===Rt.current)?.id}),_(e=>{let t=a.current?.workspaceId;return t&&c.workspaces.some(e=>e.id===t)?t:e&&(c.workspaces.some(t=>t.id===e)||i.current.some(t=>t.temporaryId===e))?e:c.workspaces[0]?.id})}else if(o.type===`message.delta`)ce(o);else if(o.type===`message.revert.result`)ci(void 0),ct(void 0),o.ok||p(o.message);else if(o.type===`operation.result`){let e=i.current.find(e=>e.id===o.requestId);if(i.current=i.current.filter(e=>e.id!==o.requestId),r(i.current),e?.temporaryId){let t=e.temporaryId;if(o.ok&&o.entityId){let e=Nt.current.get(t);e&&Mt.current.set(o.entityId,{...e,id:o.entityId}),jt.current.add(o.entityId)}l(n=>n===t?o.ok?o.entityId:e.previousActiveId:n),y(e=>e.flatMap(e=>e===t?o.ok&&o.entityId?[o.entityId]:[]:[e])),_(e=>e===t?o.ok?o.entityId:void 0:e)}o.ok||(e?.onFailure?.(o.message),p(o.message??`操作失败`))}else o.type===`tools.updated`?window.dispatchEvent(new Event(`super-pi-tools-updated`)):o.type===`files.changed`?nn.current(o.workspaceId,o.changes,o.dropped):o.type===`files.index`?o.workspaceId===Rt.current&&(rn.current(o.changed,o.removed),an.current(o.complete,o.skipped)):o.type===`error`?(p(o.message),At.current&&(At.current=!1,L(`重命名失败:${o.message}`,`error`))):o.type===`extension.ui`?Bn(o.conversationId,o.request):o.type===`extension.ui.closed`?Vn(o.conversationId,o.requestId,o.reason):o.type===`model.catalog`?(!o.conversationId||o.conversationId===kt.current)&&Ee(o.catalog):o.type===`model.catalog.all`?Oe(o.catalog):o.type===`providers.list`?(Ae(o.providers),Me(o.apis)):o.type===`agent.catalog`?Pe(o.catalog):o.type===`subagent.catalog`?Ie(o.catalog):o.type===`server.version`?(Re(o.version),o.version.needsRestart&&L(`检测到 Super Pi 代码已更新(v${o.version.runningVersion} → v${o.version.diskVersion}),请执行 /super_pi restart 重启服务生效`,`warning`)):o.type===`subagent.event`?t(e=>({...e,subagentRuns:Rn(e.subagentRuns??[],o.run)})):o.type===`workflow.event`?t(e=>({...e,workflows:zn(e.workflows??[],o.workflow)})):o.type===`message.tools`?t(e=>({...e,conversations:e.conversations.map(e=>e.id===o.conversationId?{...e,messages:e.messages.map(e=>e.id===o.messageId?{...e,toolCalls:o.toolCalls}:e)}:e)})):o.type===`conversation.fork.result`&&(hi(e=>e===o.conversationId?void 0:e),L(o.ok?`已从「${o.title}」分叉出新会话,放在侧边栏最上面;没有切换过去。${o.messagesCopied?`复制了 ${o.messagesCopied} 条消息。`:`原会话还没有消息,只复制了会话本身。`}`:`分叉失败:${o.message}`,o.ok?`info`:`error`))}};return s(),()=>{e=!0,se(),window.clearTimeout(o);for(let e of Ot.current)window.clearTimeout(e);w.current?.close()}},[ce,se]);let Hn=(0,z.useCallback)(e=>w.current?.readyState===WebSocket.OPEN&&(w.current.send(JSON.stringify(e)),!0),[]),Un=(e,t,n,a,o,s)=>{let c=w.current?.readyState===WebSocket.OPEN,l=gE(e);if(i.current.some(e=>e.key===t)||!c&&!l)return!1;let u=C_(),d={id:u,key:t,apply:n,temporaryId:a,previousActiveId:kt.current,onFailure:o,accepted:s,...l?{retry:!0,command:e}:{}};return i.current=[...i.current,d],r(i.current),c&&w.current.send(JSON.stringify({...e,operationRequestId:u})),!0},Wn=(e,t)=>n=>({...n,conversations:n.conversations.map(n=>n.id===e?{...n,...t}:n)}),Gn=(e,t)=>n=>({...n,workspaces:n.workspaces.map(n=>n.id===e?{...n,...t}:n)}),Kn=n.some(e=>e.key===`send:${F?.id}`||e.key===`configuration:${F?.id}`||e.temporaryId===F?.id||e.key===`archive:${F?.id}`),qn=(e,t,n,r,i)=>{e&&w.current?.send(JSON.stringify({type:`question.answer`,conversationId:e,messageId:t,callIndex:n,answers:r,cancelled:i}))},Jn=(e,t,n)=>Un({type:`extension.ui.answer`,conversationId:e,requestId:t,...n},`answer:${e}:${t}`,e=>e),Yn=F?.model??Te?.defaultModel,Xn=F?.thinkingLevel??Te?.defaultThinkingLevel,Zn=Te?.source===`pi`,Qn=!!Te?.models.find(e=>e.provider===Yn?.provider&&e.modelId===Yn?.modelId)?.imageInput,$n=(e,t)=>!e||!t?e:{...e,models:e.models.filter(e=>(s.modelFilterRules??[]).every(n=>{try{return!new RegExp(n.workspacePattern,`i`).test(t.name)||new RegExp(n.modelPattern,`i`).test(e.label)||new RegExp(n.modelPattern,`i`).test(`${e.provider}/${e.modelId}`)}catch{return!0}}))},er=($n(Te,s.workspaces.find(e=>e.id===F?.workspaceId))?.models??[]).map(e=>({key:`${e.provider}/${e.modelId}`,label:e.label,detail:e.detail,badge:tD(e),selected:Yn?.provider===e.provider&&Yn.modelId===e.modelId})),tr=(Te?.levels??[]).map(e=>({key:e,label:e,selected:e===Xn})),nr=e=>{if(!F)return;let[t,n]=e.split(`/`);t&&n&&Un({type:`conversation.model`,conversationId:F.id,provider:t,modelId:n},`configuration:${F.id}`,Wn(F.id,{model:Te?.models.find(e=>e.provider===t&&e.modelId===n)??{provider:t,modelId:n,label:n}}))},rr=e=>{F&&Un({type:`conversation.thinking`,conversationId:F.id,level:e},`configuration:${F.id}`,Wn(F.id,{thinkingLevel:e}))},ir=Ne?.agents.find(e=>e.id===F?.agentId),ar=[{key:ED,label:`跟随 Pi 默认`,detail:`不使用任何 agent 角色`,selected:!F?.agentId},...(Ne?.agents??[]).map(e=>({key:e.id,label:e.name,detail:e.toolSummary,color:e.color,selected:F?.agentId===e.id}))],or=ir?.model,sr=!!(or&&F?.model&&F.model.provider===or.provider&&F.model.modelId===or.modelId);ir?.thinkingLevel&&(F?.thinkingLevel,ir.thinkingLevel);let cr=e=>{if(F){let t=Ne?.agents.find(t=>t.id===e);Un({type:`conversation.agent`,conversationId:F.id,agentId:e===ED?null:e},`configuration:${F.id}`,Wn(F.id,{agentId:t?.id,...t?.model?{model:{...t.model,label:t.model.modelId}}:{},...t?.thinkingLevel?{thinkingLevel:t.thinkingLevel}:{}}))}},lr=ge.filter(e=>e.conversationId===F?.id),ur=(0,z.useMemo)(()=>(s.subagentRuns??[]).filter(e=>e.conversationId===F?.id),[s.subagentRuns,F?.id]),dr=(0,z.useMemo)(()=>(s.workflows??[]).filter(e=>e.conversationId===F?.id),[s.workflows,F?.id]),fr=(0,z.useMemo)(()=>new Map(dr.map(e=>[e.id,e])),[dr]),pr=(0,z.useMemo)(()=>new Map((Fe?.agents??[]).map(e=>[e.id,e.name])),[Fe]),mr=(0,z.useMemo)(()=>new Map((F?.messages??[]).map(e=>[e.id,e])),[F?.messages]),hr=(0,z.useMemo)(()=>new Map(ur.map(e=>[e.id,e])),[ur]),gr=(0,z.useMemo)(()=>{let e=new Map;for(let t of ur)t.originMessageId!==void 0&&t.originCallRow!==void 0&&e.set(`${t.originMessageId}:${t.originCallRow}`,t);return e},[ur]),_r=(0,z.useMemo)(()=>{if(!F)return[];let e=st?.conversationId===F.id?(()=>{let e=F.messages.find(e=>e.id===st.messageId);if(e)return{index:F.messages.indexOf(e),at:Date.parse(e.createdAt)||0,...st.kind===`withdraw`?{inclusive:!0}:{inclusive:!1}}})():void 0,t=[];return F.messages.forEach((n,r)=>{e&&(r>e.index||e.inclusive&&r===e.index)||n.delivery||t.push({at:Date.parse(n.createdAt)||0,seq:r,key:`m:${n.id}`})}),ur.forEach((n,r)=>{n.originMessageId&&n.originCallRow!==void 0&&F?.messages.some(e=>e.id===n.originMessageId&&e.toolCalls?.[n.originCallRow])||e&&(Date.parse(n.startedAt)||0)>e.at||t.push({at:Date.parse(n.startedAt)||0,seq:t.length+r,key:`r:${n.id}`})}),dr.forEach((n,r)=>{e&&(Date.parse(n.startedAt)||0)>e.at||t.push({at:Date.parse(n.startedAt)||0,seq:t.length+r,key:`w:${n.id}`})}),t.sort((e,t)=>e.at-t.at||e.seq-t.seq).map(e=>e.key)},[F,ur,dr,st]);(0,z.useEffect)(()=>{let e=A.current;if(!e||!F?.id)return;let t=()=>{!ne.current&&T.current[F.id]?.followTail&&(aO(e),e.scrollTop=e.scrollHeight)};if(t(),typeof ResizeObserver>`u`)return;let n=new ResizeObserver(t);n.observe(e);for(let t of e.children)n.observe(t);return()=>n.disconnect()},[F?.id,F?.messages,ur,dr,_r]);let vr=e=>nt(t=>({...t,[e]:!t[e]})),yr=(e,t)=>it(n=>({...n,[`${e}:${t}`]:!n[`${e}:${t}`]})),br=(e,t)=>ot(n=>({...n,[`${e}:${t}`]:n[`${e}:${t}`]!==!1})),[xr,Sr]=(0,z.useState)({}),Cr=e=>Sr(t=>({...t,[e]:t[e]!==!0})),wr=e=>{Un({type:`subagent.stop`,runId:e},`stop:${e}`,e=>e)||L(`连接断开,无法停止子智能体,请重试`,`error`)},Tr=e=>{Un({type:`workflow.stop`,workflowId:e},`stop:${e}`,e=>e)||L(`连接断开,无法停止编排,请重试`,`error`)},Er=e=>[...xe].filter(([,t])=>t.placement===e).map(([e,t])=>{let n=t.lines;return(0,B.jsxs)(`div`,{className:`extui-widget`,"data-widget-key":e,"data-widget-lines":n.length,children:[n.slice(0,oD).map((e,t)=>(0,B.jsx)(`div`,{children:e},`${t}:${e}`)),n.length>oD&&(0,B.jsx)(`div`,{children:`… (widget truncated)`})]},e)}),Dr=(e,t)=>{let n=`pending:${C_()}`,r={id:n,name:e,path:t,updatedAt:new Date().toISOString()};Un({type:`workspace.create`,name:e,path:t},`create-workspace`,e=>({...e,workspaces:[...e.workspaces,r]}),n)&&(_(n),l(void 0),C(!1))},[Or,kr]=(0,z.useState)(),Ar=(e,t)=>kr(n=>n?.kind===e&&n.id===t?n:{kind:e,id:t}),jr=()=>kr(void 0),Mr=(e,t)=>Or?.kind===e&&Or.id===t,Nr=(e,t,n)=>t.startsWith(`pending:`)?!1:Un(e===`workspace`?{type:`workspace.rename`,workspaceId:t,name:n}:{type:`conversation.rename`,conversationId:t,name:n},`rename:${t}`,e===`workspace`?Gn(t,{name:n}):Wn(t,{title:n}))?(At.current=!0,jr(),!0):(L(`连接断开,改名未保存,请重试`,`error`),!1),Pr=async e=>{if(e.startsWith(`pending:`)){L(`这个会话还在创建中,稍后再试`,`warning`);return}if(pt.current.has(e))return;L(`正在根据对话内容生成标题…`,`info`);let t=new Promise((t,n)=>{pt.current.set(e,{resolve:t,reject:n}),window.setTimeout(()=>{pt.current.delete(e)&&n(Error(`模型在 30 秒内没有返回标题`))},32e3)});if(!Hn({type:`conversation.autoRename`,conversationId:e}))pt.current.delete(e),L(`连接断开,无法生成标题`,`error`);else try{let n=await t;Nr(`conversation`,e,n),L(`已重命名为「${n}」`,`info`)}catch(e){L(`重命名失败:${e instanceof Error?e.message:String(e)}`,`error`)}},Fr=e=>{if(e.id.startsWith(`pending:`))return;let t=s.conversations.filter(t=>t.workspaceId===e.id).length;window.confirm(`删除工作区「${e.name}」?${t?`其中 ${t} 条会话将一并删除,`:``}此操作不可撤销。`)&&Un({type:`workspace.delete`,workspaceId:e.id},`delete:${e.id}`,t=>({...t,workspaces:t.workspaces.filter(t=>t.id!==e.id),conversations:t.conversations.filter(t=>t.workspaceId!==e.id)}))},[Ir,Lr]=(0,z.useState)(),Rr=Ir?s.workspaces.find(e=>e.id===Ir):void 0,{theme:zr,setTheme:Br}=Z_(),[Vr,Hr]=(0,z.useState)(!1),[Ur,Wr]=(0,z.useState)(!1),Gr=(e,t,n,r)=>{e.startsWith(`pending:`)||(Un({type:`workspace.settings`,workspaceId:e,model:n?{provider:n.provider,modelId:n.modelId}:null,thinkingLevel:r??null,agentId:t??null},`defaults:${e}`,Gn(e,{defaultModel:n,defaultThinkingLevel:r,defaultAgentId:t}))?Lr(void 0):L(`连接断开,设置未保存,请重试`,`error`))},Kr=e=>{if(e.startsWith(`pending:`)||i.current.some(t=>t.key===`defaults:${e}`))return;let t=`pending:${C_()}`,n={id:t,workspaceId:e,title:`新会话`,status:`idle`,updatedAt:new Date().toISOString(),messages:[]};Nt.current.set(t,n),Un({type:`conversation.create`,workspaceId:e},`create-session:${e}`,e=>({...e,conversations:[n,...e.conversations]}),t)&&(_(e),l(t),yn(`session`),y(e=>[...e.filter(e=>e!==t),t]))},qr=e=>{e.startsWith(`pending:`)||Un({type:`conversation.archive`,conversationId:e},`archive:${e}`,Wn(e,{archivedAt:new Date().toISOString()}))},Jr=e=>Un({type:`conversation.unarchive`,conversationId:e},`archive:${e}`,Wn(e,{archivedAt:void 0})),Yr=async e=>{if(!F){L(`请先选择或创建会话`,`error`);return}if(!Qn){L(`当前模型不支持图片输入`,`error`);return}let t=[`image/png`,`image/jpeg`,`image/gif`,`image/webp`],n=e.filter(e=>t.includes(e.type)?e.size>5242880?(L(`图片「${e.name}」超过 5MB 上限`,`error`),!1):!0:(L(`不支持的文件格式「${e.name}」,仅支持 PNG/JPEG/GIF/WebP`,`error`),!1));if(n.length===0)return;let r=F.id;Gt(r,e=>({...e,uploading:e.uploading+n.length}));let i=n.map(e=>({id:C_(),conversationId:r,name:e.name,url:URL.createObjectURL(e)}));bt(e=>[...e,...i]);for(let[e,t]of n.entries()){let n=i[e];try{let e=await new Promise((e,n)=>{let r=new FileReader;r.onload=()=>{let t=r.result,n=t.indexOf(`,`);e(n>=0?t.slice(n+1):t)},r.onerror=n,r.readAsDataURL(t)}),i=await fetch(`/api/upload`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({conversationId:r,name:t.name,mimeType:t.type,data:e})});if(!(i.headers.get(`content-type`)??``).includes(`application/json`)){L(`服务器未返回 JSON 响应,请刷新或重启服务`,`error`);continue}if(i.ok){let e=await i.json();if(gt.current.has(n.id))continue;bt(e=>e.filter(e=>e.id!==n.id)),URL.revokeObjectURL(n.url),Gt(r,t=>({...t,images:[...t.images,{id:e.id,name:e.name,mimeType:e.mimeType,bytes:e.bytes}]}))}else{let e=await i.json().catch(()=>({error:`上传失败`}));L(e.error||`上传失败: ${i.status}`,`error`)}}catch(e){L(`上传错误: ${e instanceof Error?e.message:`网络错误`}`,`error`)}finally{bt(e=>e.map(e=>e.id===n.id?{...e,failed:!0}:e)),Gt(r,e=>({...e,uploading:Math.max(0,e.uploading-1)}))}}},Xr=e=>{let t=e.clipboardData?.items;if(!t)return;let n=[];for(let e=0;e<t.length;e++){let r=t[e];if(r.type.startsWith(`image/`)){let e=r.getAsFile();e&&n.push(e)}}if(n.length>0){if(!Qn){L(`当前模型不支持图片输入`,`error`);return}e.preventDefault(),Yr(n)}},Zr=e=>{e.dataTransfer?.types?.includes(`Files`)&&(e.preventDefault(),wt(!0))},Qr=e=>{e.currentTarget.contains(e.relatedTarget)||wt(!1)},$r=e=>{wt(!1);let t=Array.from(e.dataTransfer?.files??[]).filter(e=>e.type.startsWith(`image/`));if(t.length>0){if(e.preventDefault(),!Qn){L(`当前模型不支持图片输入`,`error`);return}Yr(t)}},ei=e=>{if(e.preventDefault(),!F||Kn||!Vt.trim()&&Ht.length===0)return;if(Ht.length>0&&!Qn){L(`当前模型不支持图片输入,请移除图片或切换至支持图文的模型`,`error`);return}if(Wt>0){L(`图片正在上传中,请稍候…`,`info`);return}let t=`message_${C_()}`,n=F.id,r=Vt,i=Ht;Un({type:`message.send`,conversationId:n,content:Vt,clientId:t,...Ht.length>0?{images:Ht}:{},...Ut.length>0?{attachments:Ut}:{}},`send:${n}`,e=>{let a=e.conversations.find(e=>e.id===n);if(!a||a.messages.some(e=>e.id===t))return e;let o=a.status===`running`,s=new Date().toISOString();return{...e,conversations:e.conversations.map(e=>e.id===n?{...e,...o?{}:{status:`waiting`,updatedAt:s},messages:[...e.messages,{id:t,role:`user`,content:r,...i.length>0?{images:i}:{},...Ut.length>0?{attachments:Ut}:{},...o?{delivery:`waiting`}:{},createdAt:s}]}:e)}},t,e=>{vt(a=>[...a,{id:t,conversationId:n,content:r,images:i,reason:e}]),Gt(n,e=>e.text||e.images.length?e:{...e,text:r,images:i})},e=>!!e.conversations.find(e=>e.id===n)?.messages.some(e=>e.id===t))?Gt(F.id,e=>({...e,text:``,images:[]})):L(`这条消息已经在发送队列中,请稍候`,`info`)},ti=(0,z.useMemo)(()=>(F?.messages??[]).filter(e=>(e.role===`user`||e.role===`tool`)&&e.delivery),[F?.messages]),ni=e=>{Un({type:`message.cancel`,conversationId:F?.id??``,messageId:e},`queue:${e}`,t=>({...t,conversations:t.conversations.map(t=>t.id===F?.id?{...t,messages:t.messages.filter(t=>t.id!==e)}:t)}))||L(`连接断开,撤回没有生效,请重试`,`error`)},ri=e=>{Un({type:`message.steer`,conversationId:F?.id??``,messageId:e},`queue:${e}`,t=>({...t,conversations:t.conversations.map(t=>t.id===F?.id?{...t,messages:PE(t.messages,e,0)}:t)}),void 0,void 0,t=>t.conversations.find(e=>e.id===F?.id)?.messages.find(t=>t.id===e)?.delivery===`sending`)||L(`连接断开,插到最前没有生效,请重试`,`error`)},ii=e=>{Un({type:`message.interrupt`,conversationId:F?.id??``,messageId:e},`interrupt:${F?.id}:${e}`,e=>e,void 0,void 0,t=>{let n=t.conversations.find(e=>e.id===F?.id);return n?.status===`running`&&!n.messages.find(t=>t.id===e)?.delivery})||L(`请求正在处理,请稍候`,`info`)},ai=e=>{Un({type:`message.sendQueued`,conversationId:F?.id??``,messageId:e},`send-queued:${e}`,e=>e,void 0,void 0,t=>!t.conversations.find(e=>e.id===F?.id)?.messages.find(t=>t.id===e)?.delivery)||L(`连接断开,发送没有生效,请重试`,`error`)},oi=(e,t)=>{Un({type:`message.edit`,conversationId:F?.id??``,messageId:e,content:t},`edit:${e}`,n=>({...n,conversations:n.conversations.map(n=>n.id===F?.id?{...n,messages:n.messages.map(n=>n.id===e?{...n,content:t}:n)}:n)}))||L(`连接断开,修改没有生效,请重试`,`error`)},[si,ci]=(0,z.useState)(),li=(e,t=!1)=>{if(!F||si)return;let n=F.messages.find(t=>t.id===e);n&&(n&&ht(e=>{let t=e[F.id]??{text:``,images:[],uploading:0};return t.text.trim()||t.images.length?e:{...e,[F.id]:{...t,text:n.content,images:n.images??[]}}}),ct({conversationId:F.id,messageId:e,kind:t?`withdraw`:`revert`})),Hn({type:`message.revert`,conversationId:F.id,messageId:e,withdraw:t})?ci(e):(ct(void 0),L(`连接断开,回退未执行,请重试`,`error`))},[ui,di]=(0,z.useState)(),fi=(0,z.useRef)(void 0),pi=async(e,t)=>{fi.current&&clearTimeout(fi.current);let n=await JE(t);di({id:e,kind:n?`copied`:`error`}),n||L(`复制失败:浏览器拒绝了剪贴板写入,可以手动选中这条消息的文字复制`,`error`),fi.current=setTimeout(()=>di(void 0),2e3)};(0,z.useEffect)(()=>()=>{fi.current&&clearTimeout(fi.current)},[]);let[mi,hi]=(0,z.useState)(),gi=e=>{mi||e.startsWith(`pending:`)||(Hn({type:`conversation.fork`,conversationId:e})?hi(e):L(`连接断开,分叉没有执行,请重试`,`error`))};return(0,B.jsxs)(`main`,{className:`shell${Ve?` shell-rail-collapsed`:``} mobile-panel-${Ue}`,"data-rail-collapsed":Ve,"data-selected-workspace":g??``,style:{"--sidebar-width":`${Ye.sidebar}px`,"--rail-col":Ve?void 0:`${Ye.rail}px`},children:[(0,B.jsxs)(`aside`,{children:[(0,B.jsxs)(`div`,{className:`brand`,children:[(0,B.jsx)(`span`,{children:`π`}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`strong`,{children:`SUPER PI`}),(0,B.jsx)(`small`,{children:`agent workspace`})]})]}),(0,B.jsx)(`div`,{className:`sidebar-actions`,children:(0,B.jsx)(`button`,{className:`workspace-new`,onClick:()=>C(!0),children:`+ 工作区`})}),(0,B.jsx)(`div`,{className:`label`,children:`工作区`}),(0,B.jsx)(`nav`,{children:s.workspaces.map(e=>{let t=s.conversations.filter(t=>t.workspaceId===e.id),n=t.filter(e=>!e.archivedAt).sort(UE),r=t.filter(e=>e.archivedAt).sort(WE),i=m[e.id]??!1,a=ue[e.id]??!0;return(0,B.jsxs)(`section`,{className:`workspace-group`,children:[(0,B.jsx)(`div`,{className:`workspace-header`,children:Mr(`workspace`,e.id)?(0,B.jsx)(wD,{initial:e.name,label:`重命名工作区 ${e.name}`,onCommit:t=>Nr(`workspace`,e.id,t),onClose:jr}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(`button`,{className:`workspace-toggle`,"aria-expanded":!i,title:e.path,onContextMenu:t=>{t.preventDefault();let n=t.currentTarget.getBoundingClientRect();ut({workspace:e,x:t.clientX||n.left+24,y:t.clientY||n.top+n.height})},onClick:()=>{_(e.id),l(It.find(t=>t.workspaceId===e.id)?.id),h(t=>({...t,[e.id]:!i}))},children:[(0,B.jsx)(`span`,{className:`chevron chevron-folder`,"aria-hidden":`true`,children:i?`📁`:`📂`}),(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`strong`,{onDoubleClick:()=>Ar(`workspace`,e.id),children:e.name}),(0,B.jsx)(`small`,{children:e.path})]})]}),(0,B.jsx)(`button`,{className:`workspace-add`,title:`在此工作区新建会话`,onClick:()=>Kr(e.id),children:`+`}),(0,B.jsx)(`button`,{className:`workspace-settings`,title:`工作区设置(默认智能体 / 模型 / 思考强度)`,"aria-label":`工作区设置 ${e.name}`,onClick:()=>Lr(e.id),children:`⚙`}),(0,B.jsx)(`button`,{className:`workspace-delete`,title:`删除工作区`,onClick:()=>Fr(e),children:`×`})]})}),!i&&(n.length?n.map(t=>(0,B.jsx)(`div`,{className:`conversation-row`,children:Mr(`conversation`,t.id)?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(wD,{initial:t.title,label:`重命名会话 ${t.title}`,onCommit:e=>Nr(`conversation`,t.id,e),onClose:jr}),(0,B.jsx)(`small`,{className:`conversation-time`,children:HE(t.updatedAt,Pt)})]}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(`button`,{className:`conversation ${F?.id===t.id?`selected`:``}`,"data-conversation":t.id,title:t.title,"aria-label":`打开会话 ${t.title}`,onContextMenu:e=>{e.preventDefault();let n=e.currentTarget.getBoundingClientRect();ft({conversation:t,x:e.clientX||n.left+24,y:e.clientY||n.top+n.height})},onClick:()=>{en(t.id),_(e.id)},children:[(0,B.jsx)(`i`,{className:`conversation-mark`,children:(0,B.jsx)(MD,{state:jD(t,ge.some(e=>e.conversationId===t.id),D.current[t.id])})}),(0,B.jsx)(`span`,{"data-conversation-title":t.id,onDoubleClick:()=>Ar(`conversation`,t.id),children:t.title}),(0,B.jsx)(`small`,{children:HE(t.updatedAt,Pt)})]}),(0,B.jsx)(`button`,{type:`button`,className:`conversation-fork`,"data-fork-conversation":t.id,"data-fork-state":mi===t.id?`pending`:`idle`,disabled:!!mi,title:`从此会话分叉出一个新会话`,"aria-label":`从会话 ${t.title} 分叉出一个新会话`,onClick:()=>gi(t.id),children:`⑂`}),(0,B.jsx)(`button`,{className:`conversation-archive`,title:`归档会话`,"aria-label":`归档会话 ${t.title}`,onClick:()=>qr(t.id),children:`×`})]})},t.id)):(0,B.jsx)(`div`,{className:`conversation-empty`,children:`暂无会话`})),!i&&r.length>0&&(0,B.jsxs)(`div`,{className:`archived-group`,"data-archived-count":r.length,children:[(0,B.jsxs)(`button`,{className:`archived-toggle`,title:a?`展开已归档会话`:`收起已归档会话`,"aria-expanded":!a,onClick:()=>de(t=>({...t,[e.id]:!a})),children:[(0,B.jsx)(`span`,{className:`chevron`,"aria-hidden":`true`,children:a?`▸`:`▾`}),(0,B.jsxs)(`span`,{className:`archived-label`,children:[`Archived (`,r.length,`)`]})]}),!a&&r.map(e=>(0,B.jsx)(`div`,{className:`conversation-archived`,"data-archived-at":e.archivedAt,children:Mr(`conversation`,e.id)?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(wD,{initial:e.title,label:`重命名已归档会话 ${e.title}`,onCommit:t=>Nr(`conversation`,e.id,t),onClose:jr}),(0,B.jsx)(`small`,{children:GE(e.archivedAt)})]}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`i`,{className:`conversation-mark`,"aria-hidden":`true`}),(0,B.jsx)(`span`,{"data-archived-title":e.id,onDoubleClick:()=>Ar(`conversation`,e.id),children:e.title}),(0,B.jsx)(`small`,{children:GE(e.archivedAt)}),(0,B.jsx)(`button`,{type:`button`,className:`conversation-fork`,"data-fork-conversation":e.id,"data-fork-state":mi===e.id?`pending`:`idle`,disabled:!!mi,title:`从此会话分叉出一个新会话`,"aria-label":`从已归档会话 ${e.title} 分叉出一个新会话`,onClick:()=>gi(e.id),children:`⑂`}),(0,B.jsx)(`button`,{className:`conversation-restore`,title:`恢复为正常会话`,"aria-label":`恢复会话 ${e.title}`,onClick:()=>Jr(e.id),children:`↑`})]})},e.id))]})]},e.id)})}),(0,B.jsxs)(`footer`,{children:[(0,B.jsxs)(`div`,{className:`footer-status`,children:[(0,B.jsx)(`i`,{className:u?`online`:`offline`}),u?`已连接`:`正在连接`,(0,B.jsx)(`span`,{children:`本地持久化`})]}),(0,B.jsxs)(`div`,{className:`footer-version`,"data-super-pi-version":Le?.runningVersion??``,children:[`Super Pi v`,Le?.runningVersion??`…`]}),(0,B.jsxs)(`button`,{type:`button`,className:`theme-settings-trigger`,"data-theme-open":`1`,"aria-haspopup":`dialog`,"aria-expanded":Vr,onClick:()=>{Hr(!0),Hn({type:`catalog.fetchAll`}),Hn({type:`providers.fetch`})},children:[(0,B.jsx)(`span`,{"aria-hidden":`true`,children:`⚙`}),`设置`]}),(0,B.jsxs)(`button`,{type:`button`,className:`theme-settings-trigger`,"data-help-open":`1`,"aria-haspopup":`dialog`,"aria-expanded":Ur,onClick:()=>Wr(!0),children:[(0,B.jsx)(`span`,{"aria-hidden":`true`,children:`📖`}),`使用指南`]}),(0,B.jsxs)(`button`,{type:`button`,className:`theme-settings-trigger restart-needed-trigger`,title:`检查 Super Pi 更新`,onClick:async()=>{Be(`updating`);try{let e=await fetch(`/api/update-check`);if(!e.ok)throw Error(`check failed`);let t=await e.json();if(t.needsRestart)L(`当前代码已更新,正在重启服务…`,`info`);else if(t.updateAvailable){if(!window.confirm(`发现新版本 v${t.latestVersion??``},是否立即更新并重启 Super Pi?`))L(`已取消更新`,`info`);else{if(!(await fetch(`/api/update`,{method:`POST`})).ok)throw Error(`update failed`);L(`正在更新到 v${t.latestVersion} 并重启…`,`info`)}}else L(`当前已是最新版本`,`info`)}catch{L(`检查更新失败,请检查网络或服务日志`,`error`)}finally{Be(`idle`)}},children:[(0,B.jsx)(`span`,{"aria-hidden":`true`,children:ze===`updating`?`⟳`:`↻`}),ze===`updating`?`正在检查更新…`:`检查更新`]}),Le?.needsRestart&&(0,B.jsxs)(`button`,{type:`button`,className:`theme-settings-trigger restart-needed-trigger`,title:`代码已更新:当前运行 v${Le.runningVersion},磁盘版本 v${Le.diskVersion}。点击复制重启命令 /super_pi restart`,onClick:async()=>{Be(`updating`);try{if(!(await fetch(`/api/update`,{method:`POST`})).ok)throw Error(`update failed`);L(`正在更新 Super Pi,服务即将重启…`,`info`)}catch{Be(`idle`),L(`更新启动失败,请检查服务日志`,`error`)}},children:[(0,B.jsx)(`span`,{"aria-hidden":`true`,children:ze===`updating`?`⟳`:`⚠️`}),ze===`updating`?`正在更新并重启…`:`更新并重启服务`]})]})]}),(0,B.jsx)(pO,{side:`left`,width:Ye.sidebar,min:Ye.sidebarMin,max:Ye.sidebarMax,label:`调整左侧栏宽度`,onWidth:Xe}),(0,B.jsxs)(`section`,{className:`chat`,"data-main-view":vn,"data-main-view-kind":vn,children:[Mn.length>0&&(0,B.jsx)(`div`,{className:`chat-tab-strip`,"data-chat-tab-strip":`1`,"data-session-count":$t.length,"data-file-count":I.open.length,children:(0,B.jsx)(Gg,{tabs:Mn,prefix:`workspace-tab`,ariaLabel:`工作区标签页`,activeId:Nn,onSelect:Pn,onClose:Fn,minWidth:120,maxWidth:320})}),(0,B.jsxs)(`header`,{children:[(0,B.jsxs)(`div`,{className:`chat-head`,children:[(0,B.jsx)(`h1`,{children:F?.title??`准备开始`}),ye.size>0?[...ye].map(([e,t])=>(0,B.jsx)(`p`,{"data-role":`run-status`,"data-status-key":e,children:`扩展状态:${e?`${e} · `:``}${t}`},e)):(0,B.jsx)(`p`,{"data-role":`run-status`,children:F?.status===`running`?`Agent 正在工作`:`Pi runtime · Web 控制台`})]}),(0,B.jsxs)(`span`,{className:`chat-view chat-view-${vn}`,"data-main-view-indicator":vn,"data-main-view-kind":vn,title:vn===`file`?`中间主画面正在显示文件 ${I.active?.path??``}`:vn===`diff`?`中间主画面正在显示 ${bn??``} 的改动`:`中间主画面正在显示这个会话的消息流`,children:[(0,B.jsx)(`span`,{className:`chat-view-label`,children:`主区显示`}),(0,B.jsx)(`span`,{className:`chat-view-kind`,children:vn===`file`?`文件`:vn===`diff`?`改动`:`会话`}),vn===`file`&&I.active&&(0,B.jsx)(`span`,{className:`chat-view-name`,"data-main-view-name":I.active.name,children:I.active.name}),vn===`diff`&&bn&&(0,B.jsx)(`span`,{className:`chat-view-name`,"data-main-view-name":bn,children:bn})]}),(0,B.jsx)(`div`,{className:`badge`,children:F?.status??`idle`})]}),f&&(0,B.jsxs)(`div`,{className:`error`,role:`alert`,"data-global-error":!0,children:[(0,B.jsx)(`span`,{children:f}),(0,B.jsx)(`button`,{type:`button`,"aria-label":`关闭错误提示`,title:`关闭错误提示`,onClick:()=>p(void 0),children:`×`})]}),F?.error&&(0,B.jsx)(`div`,{className:`error`,"data-role":`conversation-error`,children:F.error}),Ce&&(0,B.jsxs)(`div`,{className:`extui-title-note`,children:[`扩展建议标题:`,Ce]}),_e.length>0&&(0,B.jsx)(`div`,{className:`toasts`,role:`status`,"aria-live":`polite`,"data-toast-count":_e.length,children:_e.map(e=>(0,B.jsx)(`div`,{className:`toast toast-${e.kind}`,"data-toast-kind":e.kind,children:e.text},e.key))}),vn===`file`?(0,B.jsx)(`div`,{className:`chat-file-view`,"data-main-file-view":In?.path,"data-file-view-kind":`editor`,children:In?(0,B.jsx)(jg,{file:In,state:I.saves[In.path]?.state??`idle`,message:I.saves[In.path]?.message??``,external:I.external[In.path]===!0,jumpToLine:gn&&gn.workspaceId===g&&gn.path===In.path?gn:void 0,onChange:e=>I.updateBuffer(In.path,e),onSave:()=>void I.save(In.path,!1),onReload:()=>void I.reload(In.path),onOverwrite:()=>void I.save(In.path,!0)}):(0,B.jsx)(`p`,{className:`rail-empty`,"data-main-file-empty":`1`,children:`没有选中的文件。`})}):vn===`diff`?(0,B.jsx)(`div`,{className:`chat-file-view`,"data-main-diff-view":bn??``,"data-file-view-kind":`diff`,children:(0,B.jsx)(Ng,{diff:Cn.diff,loading:Cn.loading,error:Cn.error,bufferContent:Dn,mode:Tn,onMode:En})}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(`div`,{className:`messages`,ref:A,"data-message-scroll-container":F?.id??``,onWheel:e=>{e.deltaY<0&&T.current[F?.id??``]?.followTail&&(ne.current=!0,zt(e.currentTarget,!0))},onScroll:e=>{let t=e.currentTarget;t.dataset.programmaticScroll===`true`?delete t.dataset.programmaticScroll:zt(t)},children:[!F&&(0,B.jsxs)(`div`,{className:`empty`,children:[(0,B.jsx)(`div`,{className:`orb`,children:`π`}),(0,B.jsx)(`h2`,{children:`开始一个新会话`}),s.workspaces.length===0?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`p`,{children:`先创建一个工作区,再开始会话。`}),(0,B.jsx)(`button`,{onClick:()=>C(!0),children:`+ 新建工作区`})]}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`p`,{children:s.workspaces.length===1&&Lt?`在「${Lt.name}」中创建会话,即可向 Super Pi 发送任务。`:`选择工作区即可开始会话,向 Super Pi 发送任务。`}),s.workspaces.length>1&&(0,B.jsxs)(`div`,{className:`empty-workspace-select`,children:[(0,B.jsx)(`label`,{htmlFor:`empty-workspace-choice`,children:`工作区:`}),(0,B.jsxs)(`select`,{id:`empty-workspace-choice`,"aria-label":`选择工作区`,value:Lt?.id,onChange:e=>{e.target.value===`__new__`?C(!0):_(e.target.value)},children:[s.workspaces.map(e=>(0,B.jsx)(`option`,{value:e.id,children:e.name},e.id)),(0,B.jsx)(`option`,{value:`__new__`,children:`+ 新建工作区…`})]})]}),Lt&&(0,B.jsx)(`button`,{onClick:()=>Kr(Lt.id),children:`新建会话`}),(0,B.jsx)(`span`,{className:`empty-secondary-action`,role:`button`,tabIndex:0,onClick:()=>C(!0),onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),C(!0))},children:`+ 新建工作区`})]})]}),_r.map(e=>{if(e.startsWith(`m:`)){let t=mr.get(e.slice(2));if(!t)return null;let r=!F?.messages.some(n=>n.id!==t.id&&n.role===`user`&&_r.indexOf(`m:${n.id}`)>_r.indexOf(e)),i=t.role===`user`&&F?.status!==`running`&&F?.status!==`waiting`&&si!==t.id,a=i&&r&&!t.id.startsWith(`pending:`),o=i&&!r&&!!t.piEntryId,s=t.content?(0,B.jsx)(tm,{source:t.content}):(0,B.jsx)(`span`,{className:`typing`,children:`正在思考`}),c=t.toolCalls??[];if(t.role===`user`){let n=ui?.id===t.id?ui.kind:void 0,r=t.content||(t.images?.length?`[图片]`:``);return(0,B.jsxs)(`article`,{className:`message user`,"data-transcript-key":e,children:[(0,B.jsxs)(`div`,{className:`message-body`,children:[(0,B.jsxs)(`div`,{className:`bubble`,children:[(0,B.jsxs)(`div`,{className:`meta`,children:[he,(0,B.jsx)(`time`,{children:FE(t.createdAt)})]}),t.images&&t.images.length>0&&(0,B.jsx)(`div`,{className:`message-images`,"data-message-images":`1`,children:t.images.map(e=>(0,B.jsx)(`button`,{type:`button`,className:`message-image-btn`,"data-message-image-id":e.id,onClick:()=>St({url:`/api/upload/${encodeURIComponent(F?.id??``)}/${encodeURIComponent(e.id)}`,name:e.name,bytes:e.bytes}),title:e.name?`查看大图:${e.name}`:`查看大图`,children:(0,B.jsx)(`img`,{src:`/api/upload/${encodeURIComponent(F?.id??``)}/${encodeURIComponent(e.id)}`,alt:e.name||`图片`,className:`message-image-thumb`,loading:`lazy`})},e.id))}),(0,B.jsx)(`div`,{className:`content`,children:s})]}),t.attachments&&t.attachments.length>0&&(0,B.jsx)(`div`,{className:`message-attachments`,"data-message-attachments":`1`,children:t.attachments.map(e=>{let n=`att:${t.id}:${e.kind}:${e.id}`,r=rt[n]??!1;return(0,B.jsxs)(`div`,{className:`message-attachment`,"data-message-attachment":e.kind,children:[(0,B.jsxs)(`button`,{type:`button`,className:`message-attachment-head`,"data-message-attachment-toggle":e.id,"aria-expanded":r,onClick:()=>it(e=>({...e,[n]:!r})),children:[(0,B.jsx)(`span`,{className:`message-attachment-glyph`,"aria-hidden":`true`,children:`▤`}),(0,B.jsx)(`span`,{className:`message-attachment-label`,children:`技能`}),(0,B.jsx)(`span`,{className:`message-attachment-name`,title:e.name,children:e.name}),(0,B.jsx)(`span`,{className:`message-attachment-chevron`,"aria-hidden":`true`,children:r?`▾`:`▸`})]}),r&&(0,B.jsx)(`pre`,{className:`message-attachment-body`,"data-message-attachment-body":e.id,children:e.content})]},n)})}),(0,B.jsxs)(`div`,{className:`message-actions`,children:[(0,B.jsx)(`button`,{type:`button`,className:`message-copy`,"data-copy-message":t.id,"data-copy-state":n,"aria-label":`复制这条消息:${r}`,onClick:()=>pi(t.id,r),children:n===`copied`?`已复制`:n===`error`?`复制失败`:`复制`}),a&&(0,B.jsx)(`button`,{type:`button`,className:`message-revert`,"data-withdraw-message":t.id,title:`撤回并编辑:删除这条消息并将文字恢复到输入框继续编辑`,onClick:()=>li(t.id,!0),children:`撤回`}),o&&(0,B.jsx)(`button`,{type:`button`,className:`message-revert`,"data-revert-message":t.id,title:`回退到这里:删除后续全部内容(Pi 的记录和这里的历史一起清掉,不会新建会话,也不动任何代码文件)`,onClick:()=>li(t.id),children:`回退`})]})]}),(0,B.jsx)(`div`,{className:`avatar`,title:he,children:he})]},e)}if(t.role===`tool`){let n=(()=>{let e=/<summary>([\s\S]*?)<\/summary>/.exec(t.content);return e?e[1].trim():`后台回传`})(),r=(()=>{let e=/<task id="[^"]+" state="([^"]+)"/.exec(t.content);return e?e[1]:`completed`})(),i=(()=>{let e=/<task_(?:result|error)>\n?([\s\S]*?)\n?<\/(?:task_result|task_error)>/.exec(t.content);return e?e[1]:t.content})(),a=`tool:${t.id}`,o=rt[a]??!1;return(0,B.jsx)(`article`,{className:`message tool`,"data-transcript-key":e,"data-tool-state":r,children:(0,B.jsxs)(`div`,{className:`message-body`,children:[(0,B.jsx)(`div`,{className:`bg-result-head`,"data-bg-result-head":t.id,children:(0,B.jsxs)(`button`,{type:`button`,className:`bg-result-toggle`,"data-bg-result-toggle":t.id,"aria-expanded":o,title:o?`折叠后台回传`:`展开后台回传`,onClick:()=>it(e=>({...e,[a]:!o})),children:[(0,B.jsx)(`span`,{className:`bg-result-glyph`,"aria-hidden":`true`,children:r===`error`?`✕`:`↩`}),(0,B.jsx)(`span`,{className:`bg-result-label`,children:`后台回传`}),(0,B.jsx)(`span`,{className:`bg-result-summary`,title:n,children:n}),!o&&(0,B.jsx)(`span`,{className:`bg-result-preview`,"data-bg-result-preview":t.id,title:`展开查看完整输出`,children:i.split(`
|
|
97
|
+
如需本地计算,声明 script: { path, timeoutMs, parameters }。脚本必须是 Python,参数以 JSON 从 stdin 传入,stdout 必须只输出一个 JSON 对象。在 index.html 中加载 <script src="./super-pi-tool.js"><\/script>,然后调用 SuperPiTool.run(params)、SuperPiTool.get(runId)、SuperPiTool.wait(runId) 或 SuperPiTool.cancel(runId)。这些都是已绑定本工具身份的相对接口;不要调用 /api/exec,不要猜测 toolId,也不要传 shell 命令、任意文件路径或未声明参数。页面必须实际执行一次示例任务并显示运行状态、日志和结构化结果。第三方包写进 environment.requires(必须钉死成 pkg==version),首次运行时会装进这个工具自己的虚拟环境。需要模型能力(摘要、改写、抽取、分类)时调用 SuperPiTool.llm({ prompt, system }),不要自己写模型客户端或保管密钥,并在注册时声明 permissions: { llm: true }——否则服务端会拒绝,导入页面也会提示用户。最后返回注册 id、访问地址、文件清单和验证结果。`);f(e),window.setTimeout(()=>f(!1),1800)};(0,z.useEffect)(()=>{let e=e=>{e.key===`Escape`&&i()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[i]);let N=n.map(e=>e.slug).filter(e=>typeof e==`string`),te=e=>{m(void 0),g(void 0),A(void 0),O({tool:e,name:TE({slug:e.slug??`tool`})})},ne=async(e,t)=>{m(void 0),g(void 0),A(void 0);let n=EE(t);if(!n.ok)A(n.reason);else try{let t=await fetch(`/api/tools/export?id=${encodeURIComponent(e.id)}`),r=await t.json();if(!t.ok||!r.bundle)throw Error(r.error??`HTTP ${t.status}`);let i=new Blob([JSON.stringify(r.bundle,null,2)],{type:`application/json`}),a=URL.createObjectURL(i),o=document.createElement(`a`);o.href=a,o.download=n.name,document.body.appendChild(o),o.click(),o.remove(),URL.revokeObjectURL(a),g(r.skipped?.length?`已导出「${e.name}」,但有 ${r.skipped.length} 个文件没有包含:${r.skipped.join(`、`)}。`:`已导出「${e.name}」。`)}catch(e){m(`导出失败:${e instanceof Error?e.message:String(e)}`)}finally{O(void 0)}},re=async e=>{let t=e.target.files?.[0];if(e.target.value=``,!t)return;m(void 0),g(void 0),S(void 0);let n=SE(await t.text(),t.name);n.ok?(v({filename:t.name,bundle:n.bundle,unnamedFormat:n.unnamedFormat}),b(N.includes(n.bundle.slug)?wE(n.bundle.slug,N):n.bundle.slug),w(n.bundle.files[0]?.path)):m(n.reason)},ie=()=>{v(void 0),b(``),S(void 0),w(void 0)},ae=async()=>{if(!_)return;S(void 0);let e=CE(y);if(!e.ok)S(e.reason);else if(N.includes(e.slug))S(`本机已经有 slug「${e.slug}」的工具,换一个名字再导入。`);else{E(!0);try{let t=await fetch(`/api/tools`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(jE(_.bundle,e.slug))}),n=await t.json();if(!t.ok||!n.id)throw Error(n.error??`HTTP ${t.status}`);await r(),g(`已导入「${_.bundle.name}」,它现在出现在工具栏里,所有工作区都能用。`),ie()}catch(e){m(`导入失败:${e instanceof Error?e.message:String(e)}`)}finally{E(!1)}}};return(0,z.useEffect)(()=>{D&&j.current?.scrollIntoView({block:`center`})},[D]),(0,la.createPortal)((0,B.jsx)(`div`,{className:`tool-overlay`,"data-tool-settings-overlay":`1`,onClick:e=>{e.target===e.currentTarget&&i()},children:(0,B.jsxs)(`div`,{className:`tool-dialog`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`tool-settings-title`,"data-tool-settings":`1`,children:[(0,B.jsxs)(`div`,{className:`tool-dialog-head`,children:[(0,B.jsx)(`h2`,{className:`tool-dialog-title`,id:`tool-settings-title`,children:`⚙ 工具设置`}),(0,B.jsx)(`button`,{type:`button`,className:`tool-dialog-close`,"data-tool-settings-close":`1`,title:`关闭(Esc)`,"aria-label":`关闭工具设置`,onClick:i,children:`✕`})]}),(0,B.jsx)(`div`,{className:`tool-dialog-body`,children:_?(0,B.jsx)(WD,{pending:_,slugDraft:y,slugError:x,preview:C,busy:T,onSlugChange:e=>{b(e),S(void 0)},onPreviewChange:w,onCancel:ie,onConfirm:()=>void ae()}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(`div`,{className:`tool-prompt-card`,children:[(0,B.jsx)(`strong`,{children:`给 Agent 开发新工具`}),(0,B.jsx)(`p`,{className:`tool-hint`,children:`工具会挂载到 Super Pi 的统一 HTTP 服务,不需要再启动独立服务器。`}),(0,B.jsx)(`button`,{type:`button`,className:`tool-link-copy-prompt`,"data-tool-development-prompt":`1`,onClick:()=>void M(),children:d?`已复制`:`复制工具开发 Prompt`})]}),(0,B.jsx)(`div`,{className:`rail-section-head`,children:(0,B.jsx)(`h2`,{className:`rail-section-title`,children:`从预置列表添加`})}),(0,B.jsx)(`div`,{className:`tool-presets`,"data-tool-presets":m_.length,children:m_.map(n=>{let r=e.some(e=>e.kind===n.kind);return(0,B.jsxs)(`div`,{className:`tool-preset`,"data-tool-preset":n.kind,children:[(0,B.jsx)(`span`,{className:`tool-preset-glyph`,"aria-hidden":`true`,children:n.glyph}),(0,B.jsxs)(`span`,{className:`tool-preset-text`,children:[(0,B.jsx)(`strong`,{children:n.name}),(0,B.jsx)(`small`,{children:n.blurb})]}),(0,B.jsx)(`button`,{type:`button`,className:`tool-preset-add`,"data-tool-add-preset":n.kind,disabled:r,title:r?`${n.name}已经在工具栏里了`:`添加${n.name}`,"aria-label":r?`${n.name}已添加`:`添加${n.name}`,onClick:()=>t(T_(e,n.kind)),children:r?`已添加`:`添加`})]},n.kind)})}),(0,B.jsx)(`div`,{className:`rail-section-head`,children:(0,B.jsx)(`h2`,{className:`rail-section-title`,children:`添加网址工具`})}),(0,B.jsx)(`p`,{className:`tool-hint`,children:`填一个网址,它会变成一个图标;点开后在弹窗里用按钮在新标签页打开。网址只接受 http / https / mailto。`}),(0,B.jsx)(`input`,{className:`tool-input`,"data-tool-url-input":`1`,value:a,maxLength:2048,placeholder:`https://example.com/工具`,"aria-label":`工具网址`,onChange:e=>{o(e.target.value),u(void 0)}}),(0,B.jsx)(`input`,{className:`tool-input`,"data-tool-url-name":`1`,value:s,maxLength:40,placeholder:`名称(可留空,默认用域名)`,"aria-label":`工具名称(可选)`,onChange:e=>c(e.target.value)}),(0,B.jsx)(`button`,{type:`button`,className:`tool-url-add`,"data-tool-url-add":`1`,disabled:!a.trim(),onClick:()=>{let n=b_(a);n.ok?e.length>=32?u(`工具最多 32 个,先删掉一个再加。`):(t([...e,{id:w_(`link`,e.map(e=>e.id)),kind:`link`,name:s.trim()||GD(n.url),glyph:`↗`,url:n.url}]),o(``),c(``),u(void 0)):u(n.reason)},children:`添加网址工具`}),l&&(0,B.jsx)(`p`,{className:`tool-error`,"data-tool-error":`1`,role:`alert`,children:l}),(0,B.jsxs)(`p`,{className:`tool-hint`,"data-tool-scope-note":`1`,children:[`能自定义到哪:从上面挑预置工具,或自己填一个网址。`,(0,B.jsx)(`b`,{children:`没有开放「写一段脚本来执行」这一档`}),`——它在浏览器里等同于任意代码执行,会拿着本应用的权限跑。计算器是手写的算术解析器,不含 eval,也认不出变量名。`]}),(0,B.jsx)(`div`,{className:`rail-section-head`,children:(0,B.jsxs)(`h2`,{className:`rail-section-title`,children:[`已安装的全局工具(`,n.length,`)`]})}),n.length===0?(0,B.jsx)(`p`,{className:`tool-hint`,"data-tool-mounted-empty":`1`,children:`还没有通过 tool_register 注册的工具。上面复制那段 Prompt,让 Agent 写一个。`}):(0,B.jsx)(`div`,{className:`tool-presets`,"data-tool-mounted-list":n.length,children:n.map(e=>{let t=kE(e.environmentState);return(0,B.jsxs)(`div`,{className:`tool-share-row`,"data-tool-share-row":e.id,children:[(0,B.jsx)(`span`,{className:`tool-preset-glyph`,"aria-hidden":`true`,children:`🧩`}),(0,B.jsxs)(`span`,{className:`tool-preset-text`,children:[(0,B.jsx)(`strong`,{children:e.name}),(0,B.jsx)(`small`,{"data-tool-env":e.environmentState?.state??`unknown`,children:t?`${t.warn?`⚠ `:``}${t.text}${e.environmentState?.detail?` · ${e.environmentState.detail}`:``}`:`环境未知`}),e.permissions?.llm&&(0,B.jsx)(`small`,{"data-tool-model":`1`,children:`⚠ 会调用模型`})]}),(0,B.jsx)(`button`,{type:`button`,className:`tool-preset-add`,"data-tool-export":e.id,title:`导出${e.name},得到一个可以发给别人导入的文件`,"aria-label":`导出${e.name}`,onClick:()=>te(e),children:`导出`})]},e.id)})}),D&&(0,B.jsxs)(`div`,{className:`tool-share-review`,ref:j,"data-tool-export-name":`1`,children:[(0,B.jsxs)(`h3`,{className:`tool-share-title`,children:[`导出「`,D.tool.name,`」`]}),(0,B.jsxs)(`label`,{className:`tool-hint`,children:[`文件名(发给别人的就是这个文件)`,(0,B.jsx)(`input`,{className:`tool-input`,value:D.name,"aria-label":`导出文件名`,"data-tool-export-input":`1`,onChange:e=>O({...D,name:e.target.value})})]}),k&&(0,B.jsx)(`p`,{className:`tool-error`,role:`alert`,"data-tool-export-name-error":`1`,children:k}),(0,B.jsxs)(`div`,{className:`tool-share-actions`,children:[(0,B.jsx)(`button`,{type:`button`,className:`tool-preset-add`,"data-tool-export-cancel":`1`,onClick:()=>{O(void 0),A(void 0)},children:`取消`}),(0,B.jsx)(`button`,{type:`button`,className:`tool-url-add`,"data-tool-export-confirm":`1`,onClick:()=>void ne(D.tool,D.name),children:`导出`})]})]}),h&&(0,B.jsx)(`p`,{className:`tool-hint`,"data-tool-share-notice":`1`,children:h}),p&&(0,B.jsx)(`p`,{className:`tool-error`,"data-tool-share-error":`1`,role:`alert`,children:p}),(0,B.jsx)(`div`,{className:`rail-section-head`,children:(0,B.jsx)(`h2`,{className:`rail-section-title`,children:`从文件导入`})}),(0,B.jsxs)(`p`,{className:`tool-hint`,children:[`收到别人分享的工具文件(`,(0,B.jsx)(`code`,{children:vE}),`)?导入后它出现在工具栏里,所有工作区都能用。`,(0,B.jsx)(`b`,{children:`导入前会先给你看这个包里有什么。`})]}),(0,B.jsx)(`button`,{type:`button`,className:`tool-url-add`,"data-tool-import-pick":`1`,onClick:()=>ee.current?.click(),children:`选择文件…`}),(0,B.jsx)(`input`,{ref:ee,type:`file`,accept:`.json,application/json`,style:{display:`none`},"data-tool-import-input":`1`,onChange:e=>void re(e)})]})})]})}),document.body)}function WD({pending:e,slugDraft:t,slugError:n,preview:r,busy:i,onSlugChange:a,onPreviewChange:o,onCancel:s,onConfirm:c}){let l=e.bundle,u=l.files.reduce((e,t)=>e+new TextEncoder().encode(t.content).length,0),d=OE(l),f=DE(l),p=l.files.find(e=>e.path===r)??l.files[0];return(0,B.jsxs)(`div`,{className:`tool-share-review`,"data-tool-import-review":`1`,children:[(0,B.jsx)(`h3`,{className:`tool-share-title`,"data-tool-import-name":`1`,children:l.name}),l.description&&(0,B.jsx)(`p`,{className:`tool-hint`,"data-tool-import-desc":`1`,children:l.description}),e.unnamedFormat&&(0,B.jsx)(`p`,{className:`tool-import-note`,"data-tool-import-unbranded":`1`,children:`这个文件没有 Super Pi 的工具标记,已按内容形状读取——粘出来的 tool_register 参数也认。`}),(0,B.jsxs)(`p`,{className:`tool-hint`,"data-tool-import-files":`1`,children:[l.files.length,` 个文件 · 共 `,AE(u)]}),(0,B.jsx)(`p`,{className:`tool-hint`,"data-tool-import-paths":`1`,children:l.files.map(e=>e.path).join(` · `)}),l.script&&(0,B.jsxs)(`p`,{className:`tool-import-warn`,"data-tool-import-script":l.script.path,children:[(0,B.jsxs)(`b`,{children:[`⚠ 含 Python 脚本 `,l.script.path]}),(0,B.jsx)(`br`,{}),`导入后运行这个工具时,这段代码会在本机上执行,权限和你自己的 Python 一样(能读你的文件、能联网)。 可以先展开下面的文件列表把它读完。`]}),(0,B.jsxs)(`p`,{className:d.tone===`warn`?`tool-import-warn`:`tool-import-note`,"data-tool-import-env":d.tone,children:[(0,B.jsxs)(`b`,{children:[d.tone===`warn`?`⚠ `:`✓ `,d.text]}),l.environment?.fingerprint?.python&&(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`br`,{}),`导出方环境:Python `,l.environment.fingerprint.python,` / `,l.environment.fingerprint.platform,`。版本对不上时会标出来,但不会拦住你运行。`]})]}),f&&(0,B.jsxs)(`p`,{className:`tool-import-warn`,"data-tool-import-model":`1`,children:[(0,B.jsx)(`b`,{children:`⚠ 这个工具可以调用模型`}),(0,B.jsx)(`br`,{}),f.text,`。模型由 Super Pi 通过 Pi 调用(凭据和模型选择都在 Super Pi 这边),工具只拿到文字。`]}),(0,B.jsxs)(`details`,{className:`tool-import-files`,"data-tool-import-filebox":l.files.length,children:[(0,B.jsxs)(`summary`,{children:[`查看文件(`,l.files.length,`)`]}),(0,B.jsx)(`div`,{className:`tool-share-tabs`,children:l.files.map(e=>(0,B.jsx)(`button`,{type:`button`,className:`tool-share-tab`,"aria-pressed":e.path===p?.path,"data-tool-import-file":e.path,onClick:()=>o(e.path),children:e.path},e.path))}),(0,B.jsx)(`pre`,{className:`tool-import-code`,"data-tool-import-code":p?.path,children:p?.content??``})]}),(0,B.jsxs)(`label`,{className:`tool-hint`,"data-tool-import-slug":`1`,children:[`导入后的 slug(工具的短名字,也是它在磁盘上的目录名)`,(0,B.jsx)(`input`,{className:`tool-input`,value:t,"aria-label":`导入后的 slug`,onChange:e=>a(e.target.value)})]}),n&&(0,B.jsx)(`p`,{className:`tool-error`,role:`alert`,"data-tool-import-slug-error":`1`,children:n}),(0,B.jsxs)(`div`,{className:`tool-share-actions`,children:[(0,B.jsx)(`button`,{type:`button`,className:`tool-preset-add`,"data-tool-import-cancel":`1`,onClick:s,children:`取消`}),(0,B.jsx)(`button`,{type:`button`,className:`tool-url-add`,"data-tool-import-confirm":`1`,disabled:i,onClick:c,children:i?`导入中…`:`导入`})]})]})}function GD(e){let t=e.replace(/^[./]+/,``).slice(0,30).trim();if(!/^[a-z][a-z0-9+.-]*:/i.test(e))return t||e.slice(0,30);try{return new URL(e,typeof window>`u`?`http://localhost`:window.location.href).hostname||t||e.slice(0,30)}catch{return e.slice(0,30)}}function KD({tool:e,onClose:t}){return(0,z.useEffect)(()=>{let e=e=>{e.key===`Escape`&&t()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[t]),(0,la.createPortal)((0,B.jsx)(`div`,{className:`tool-overlay`,"data-tool-overlay":e.id,onClick:e=>{e.target===e.currentTarget&&t()},children:(0,B.jsxs)(`div`,{className:`tool-dialog`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`tool-dialog-title`,"data-tool-dialog":e.id,children:[(0,B.jsxs)(`div`,{className:`tool-dialog-head`,children:[(0,B.jsxs)(`h2`,{className:`tool-dialog-title`,id:`tool-dialog-title`,children:[(0,B.jsx)(`span`,{className:`tool-dialog-glyph`,"aria-hidden":`true`,children:e.glyph}),e.name]}),(0,B.jsx)(`button`,{type:`button`,className:`tool-dialog-close`,"data-tool-close":`1`,title:`关闭(Esc)`,"aria-label":`关闭${e.name}`,onClick:t,children:`✕`})]}),(0,B.jsxs)(`div`,{className:`tool-dialog-body`,children:[e.kind===`calculator`&&(0,B.jsx)(JD,{}),e.kind===`timestamp`&&(0,B.jsx)(YD,{}),e.kind===`link`&&(0,B.jsx)(XD,{tool:e})]})]})}),document.body)}function qD({image:e,onClose:t}){return(0,z.useEffect)(()=>{let e=e=>{e.key===`Escape`&&t()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[t]),(0,la.createPortal)((0,B.jsx)(`div`,{className:`lightbox-overlay`,"data-lightbox-overlay":`1`,onClick:e=>{e.target===e.currentTarget&&t()},children:(0,B.jsxs)(`div`,{className:`lightbox-dialog`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`lightbox-title`,"data-lightbox-dialog":`1`,children:[(0,B.jsxs)(`div`,{className:`lightbox-head`,children:[(0,B.jsx)(`h2`,{className:`lightbox-title`,id:`lightbox-title`,children:e.name||`图片大图`}),(0,B.jsx)(`button`,{type:`button`,className:`lightbox-close`,"data-lightbox-close":`1`,title:`关闭(Esc)`,"aria-label":`关闭大图`,onClick:t,children:`✕`})]}),(0,B.jsx)(`div`,{className:`lightbox-body`,children:(0,B.jsx)(`img`,{src:e.url,alt:e.name||`图片大图`,className:`lightbox-image`})})]})}),document.body)}function JD(){let[e,t]=(0,z.useState)(`12 * (3 + 4)`),n=z_(e),r=e=>{t(t=>t+e)};return(0,B.jsxs)(`div`,{className:`tool-calc`,"data-tool-calc":`1`,children:[(0,B.jsx)(`input`,{className:`tool-input tool-calc-input`,"data-calc-input":`1`,value:e,maxLength:200,"aria-label":`算式`,spellCheck:!1,autoComplete:`off`,placeholder:`例如 (12 + 8) / 4`,onChange:e=>{t(e.target.value)},onKeyDown:e=>{e.key===`Enter`&&e.preventDefault()}}),(0,B.jsx)(`div`,{className:`tool-calc-keys`,"data-calc-keys":`1`,children:[[`7`,`7`],[`8`,`8`],[`9`,`9`],[`÷`,`/`],[`(`,`(`],[`)`,`)`],[`4`,`4`],[`5`,`5`],[`6`,`6`],[`×`,`*`],[`^`,`^`],[`%`,`%`],[`1`,`1`],[`2`,`2`],[`3`,`3`],[`-`,`-`],[`←`,`back`],[`C`,`clear`],[`0`,`0`],[`.`,`.`],[`+`,`+`]].map(([e,n])=>(0,B.jsx)(`button`,{type:`button`,className:`tool-calc-key`,"data-calc-key":n,"aria-label":e===`C`?`清空`:e===`←`?`退格`:`输入 ${e}`,onClick:()=>{n===`clear`?t(``):n===`back`?t(e=>e.slice(0,-1)):r(n)},children:e},e))}),n.ok?(0,B.jsx)(`p`,{className:`tool-calc-result`,"data-calc-result":`1`,"data-calc-value":String(n.value),children:B_(n.value)}):(0,B.jsx)(`p`,{className:`tool-calc-error`,"data-calc-error":`1`,role:`alert`,children:n.reason})]})}function YD(){let[e,t]=(0,z.useState)(``),n=V_(e),r=n.ok?U_(n.ms):null;return(0,B.jsxs)(`div`,{className:`tool-stamp`,"data-tool-stamp":`1`,children:[(0,B.jsx)(`input`,{className:`tool-input`,"data-stamp-input":`1`,value:e,maxLength:64,spellCheck:!1,"aria-label":`时间戳或日期`,placeholder:`1757000000 或 2026-10-08T09:00:00`,onChange:e=>t(e.target.value)}),r?(0,B.jsxs)(`dl`,{className:`tool-stamp-out`,"data-stamp-result":`1`,children:[(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`本地时间`}),(0,B.jsx)(`dd`,{"data-stamp-local":`1`,children:r.local})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`ISO(UTC)`}),(0,B.jsx)(`dd`,{"data-stamp-iso":`1`,children:r.iso})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`秒`}),(0,B.jsx)(`dd`,{"data-stamp-seconds":`1`,children:r.seconds})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`毫秒`}),(0,B.jsx)(`dd`,{"data-stamp-ms":`1`,children:r.milliseconds})]})]}):(0,B.jsx)(`p`,{className:`tool-stamp-error`,"data-stamp-error":`1`,role:`alert`,children:n.ok?`这个日期无法显示。`:n.reason})]})}function XD({tool:e}){let[t,n]=(0,z.useState)(!1),r=async()=>{let e=await JE(`请为 Super Pi 开发一个全局右侧栏工具并自动挂载。不要启动独立 HTTP 服务器。通过内置 tool_register 提交完整的 HTML/JS/CSS 文件;工具将被 Super Pi 保存并在所有 workspace 可用。如需计算,注册一个 Python 脚本(不接受 shell 命令),参数经 JSON stdin 传入,stdout 只输出 JSON 结果。在页面里加载 ./super-pi-tool.js,使用 SuperPiTool.run(params)、wait(runId)、get(runId) 和 cancel(runId) 执行、等待、查看和取消任务。它们会自动绑定当前工具;不要调用 /api/exec,也不要猜测 toolId。`);n(e),window.setTimeout(()=>n(!1),1800)};return(0,B.jsxs)(`div`,{className:`tool-link`,"data-tool-link":e.id,children:[(0,B.jsx)(`p`,{className:`tool-hint`,children:`这是旧版外部网页链接;新工具由 Super Pi 统一托管,并可选绑定受控 Python 脚本。`}),(0,B.jsx)(`code`,{className:`tool-link-url`,"data-tool-link-url":e.id,children:e.url}),(0,B.jsxs)(`div`,{className:`tool-link-actions`,children:[(0,B.jsx)(`a`,{className:`tool-link-open`,"data-tool-link-open":e.id,href:e.url,target:`_blank`,rel:`noopener noreferrer`,title:e.url,children:`在新标签页打开 ↗`}),(0,B.jsx)(`button`,{type:`button`,className:`tool-link-copy-prompt`,"data-tool-copy-prompt":e.id,onClick:()=>void r(),children:t?`已复制`:`复制开发 Prompt`})]}),/^https?:\/\//i.test(e.url??``)&&(0,B.jsx)(`iframe`,{className:`tool-link-frame`,"data-tool-frame":e.id,src:e.url,title:e.name,sandbox:`allow-forms allow-modals allow-pointer-lock allow-popups allow-same-origin allow-scripts`,referrerPolicy:`no-referrer`})]})}var ZD=`(max-width: 1100px)`,QD=(e,t,n)=>Math.min(Math.max(e,t),Math.max(t,n));function $D({tool:e,onClose:t}){return(0,z.useEffect)(()=>{let e=e=>{e.key===`Escape`&&t()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[t]),(0,la.createPortal)((0,B.jsx)(`div`,{className:`tool-overlay`,"data-mounted-tool-overlay":e.id,onClick:e=>{e.target===e.currentTarget&&t()},children:(0,B.jsxs)(`div`,{className:`tool-dialog`,"data-mounted-tool-dialog":e.id,role:`dialog`,"aria-modal":`true`,children:[(0,B.jsxs)(`div`,{className:`tool-dialog-head`,children:[(0,B.jsxs)(`h2`,{className:`tool-dialog-title`,children:[`🧩 `,e.name]}),(0,B.jsx)(`button`,{type:`button`,className:`tool-dialog-close`,onClick:t,children:`✕`})]}),(0,B.jsx)(`div`,{className:`tool-dialog-body`,children:(0,B.jsx)(`iframe`,{className:`tool-link-frame`,src:`/tools/${encodeURIComponent(e.id)}/`,title:e.name,sandbox:`allow-forms allow-modals allow-popups allow-scripts`,referrerPolicy:`no-referrer`})})]})}),document.body)}function eO(e,t,n){let r=Math.max(0,Math.round(n)-480),i=QD(520,180,Math.max(180,r-240)),a=QD(Math.round(e),180,i),o=QD(640,240,Math.max(240,r-a));return{sidebar:a,rail:QD(Math.round(t),240,o),sidebarMin:180,sidebarMax:i,railMin:240,railMax:o,sumCap:r}}var tO=`super-pi.rail-widths.v1`,nO=`super-pi.reader-state.v1`,rO=32,iO=48,aO=e=>{e.dataset.programmaticScroll=`true`,window.setTimeout(()=>{delete e.dataset.programmaticScroll},0)};function oO(){try{if(typeof window>`u`)return{conversations:{}};let e=JSON.parse(window.localStorage.getItem(`super-pi.reader-state.v1`)??`null`);if(!e||typeof e!=`object`)return{conversations:{}};let t={};if(e.conversations&&typeof e.conversations==`object`)for(let[n,r]of Object.entries(e.conversations)){let e=r;typeof e.followTail==`boolean`&&(t[n]={followTail:e.followTail,scrollTop:Number.isFinite(e.scrollTop)?Math.max(0,Number(e.scrollTop)):0,...typeof e.anchorKey==`string`?{anchorKey:e.anchorKey}:{},...Number.isFinite(e.anchorOffset)?{anchorOffset:Number(e.anchorOffset)}:{}})}let n={};if(e.readAt&&typeof e.readAt==`object`)for(let[t,r]of Object.entries(e.readAt))typeof r==`string`&&(n[t]=r);return{activeId:typeof e.activeId==`string`?e.activeId:void 0,workspaceId:typeof e.workspaceId==`string`?e.workspaceId:void 0,conversations:t,readAt:n}}catch{return{conversations:{}}}}function sO(e){try{typeof window<`u`&&window.localStorage.setItem(nO,JSON.stringify(e))}catch{}}var cO=`super-pi.session-tabs.v1`;function lO(){try{if(typeof window>`u`)return{ids:[]};let e=JSON.parse(window.sessionStorage.getItem(`super-pi.session-tabs.v1`)??`null`);if(!e||typeof e!=`object`)return{ids:[]};let t=e,n=Array.isArray(t.ids)?[...new Set(t.ids.filter(e=>typeof e==`string`))]:[];return{ids:n,activeId:typeof t.activeId==`string`&&n.includes(t.activeId)?t.activeId:void 0}}catch{return{ids:[]}}}function uO(e,t){try{typeof window<`u`&&window.sessionStorage.setItem(cO,JSON.stringify({ids:e,...t&&e.includes(t)?{activeId:t}:{}}))}catch{}}function dO(){try{if(typeof window>`u`)return{};let e=window.localStorage.getItem(tO);if(e===null)return{};let t=JSON.parse(e),n=e=>typeof e==`number`&&Number.isFinite(e)&&e>0?Math.round(e):void 0;return{sidebar:n(t.sidebar),rail:n(t.rail)}}catch{return{}}}function fO(e){try{if(typeof window>`u`)return;window.localStorage.setItem(tO,JSON.stringify(e))}catch{}}function pO({side:e,width:t,min:n,max:r,label:i,onWidth:a}){let[o,s]=(0,z.useState)(!1),c=e=>e.shiftKey?64:16;return(0,B.jsx)(`div`,{className:`rail-resizer rail-resizer-${e}${o?` rail-resizer-dragging`:``}`,"data-rail-resizer":e,"data-rail-resizer-dragging":o?`true`:`false`,"data-rail-resizer-width":t,role:`separator`,"aria-orientation":`vertical`,"aria-label":i,"aria-valuenow":t,"aria-valuemin":n,"aria-valuemax":r,tabIndex:0,onMouseDown:i=>{i.preventDefault(),i.currentTarget.focus();let o=i.clientX,c=t;s(!0);let l=document.body,u=l.style.cursor,d=l.style.userSelect;l.style.cursor=`col-resize`,l.style.userSelect=`none`;let f=t=>{let i=e===`left`?t.clientX-o:o-t.clientX;a(QD(c+i,n,r))},p=()=>{l.style.cursor=u,l.style.userSelect=d,s(!1),window.removeEventListener(`mousemove`,f),window.removeEventListener(`mouseup`,p)};window.addEventListener(`mousemove`,f),window.addEventListener(`mouseup`,p)},onKeyDown:i=>{let o=c(i);i.key===`ArrowLeft`?(i.preventDefault(),a(QD(e===`left`?t-o:t+o,n,r))):i.key===`ArrowRight`?(i.preventDefault(),a(QD(e===`left`?t+o:t-o,n,r))):i.key===`Home`?(i.preventDefault(),a(n)):i.key===`End`&&(i.preventDefault(),a(r))}})}var mO=`super-pi.composer-height.v1`,hO=148,gO=.55,_O=()=>Math.max(hO,Math.round((typeof window>`u`?800:window.innerHeight)*gO)),vO=e=>{let t=Number.isFinite(e)?e:hO;return Math.round(Math.min(_O(),Math.max(hO,t)))},yO=()=>{try{let e=window.localStorage.getItem(mO);return e===null?hO:vO(Number(e))}catch{return hO}};function bO({height:e,onHeight:t}){let[n,r]=(0,z.useState)(!1),i=e=>e.shiftKey?64:16,a=_O();return(0,B.jsx)(`div`,{className:`composer-resize${n?` composer-resize-dragging`:``}`,"data-composer-resize":`1`,"data-composer-resize-dragging":n?`true`:`false`,"data-composer-height":e,role:`separator`,"aria-orientation":`horizontal`,"aria-label":`调整消息编辑区高度`,"aria-valuenow":e,"aria-valuemin":hO,"aria-valuemax":a,tabIndex:0,onMouseDown:n=>{n.preventDefault(),n.currentTarget.focus();let i=n.clientY,a=e;r(!0);let o=document.documentElement,s=document.body.style.userSelect;document.body.style.cursor=`ns-resize`,document.body.style.userSelect=`none`;let c=e=>{let t=vO(a+(i-e.clientY));o.style.setProperty(`--composer-height`,`${t}px`)},l=()=>{document.body.style.cursor=``,document.body.style.userSelect=s;let n=Number.parseFloat(o.style.getPropertyValue(`--composer-height`));r(!1),window.removeEventListener(`mousemove`,c),window.removeEventListener(`mouseup`,l),t(Number.isFinite(n)?n:e)};window.addEventListener(`mousemove`,c),window.addEventListener(`mouseup`,l)},onKeyDown:n=>{let r=i(n);n.key===`ArrowUp`?(n.preventDefault(),t(vO(e+r))):n.key===`ArrowDown`?(n.preventDefault(),t(vO(e-r))):n.key===`Home`?(n.preventDefault(),t(hO)):n.key===`End`?(n.preventDefault(),t(a)):n.key===`PageUp`?(n.preventDefault(),t(vO(e+96))):n.key===`PageDown`&&(n.preventDefault(),t(vO(e-96)))}})}function xO(){let[e,t]=(0,z.useState)(ME),[n,r]=(0,z.useState)([]),i=(0,z.useRef)([]),a=(0,z.useRef)(null);a.current||=oO();let o=(0,z.useRef)(null);o.current||=lO();let s=n.reduce((e,t)=>t.apply(e),e),[c,l]=(0,z.useState)(o.current.activeId??a.current.activeId),[u,d]=(0,z.useState)(!1),[f,p]=(0,z.useState)(),[m,h]=(0,z.useState)({}),[g,_]=(0,z.useState)(a.current.workspaceId),[v,y]=(0,z.useState)(o.current.ids),[b,x]=(0,z.useState)(!1),[S,C]=(0,z.useState)(!1),w=(0,z.useRef)(void 0),T=(0,z.useRef)(a.current.conversations),E=(0,z.useRef)(v);E.current=v;let D=(0,z.useRef)(a.current.readAt??{}),[O,k]=(0,z.useState)(0),A=(0,z.useRef)(null),ee=(0,z.useRef)(null),j=(0,z.useRef)(void 0),M=(0,z.useRef)(a.current.activeId),[N,te]=(0,z.useState)({followTail:!0,scrollTop:0}),ne=(0,z.useRef)(!1),re=(0,z.useRef)(new Map),ie=(0,z.useRef)(void 0),ae=(0,z.useRef)([]),oe=(0,z.useRef)(void 0),se=(0,z.useCallback)(()=>{if(oe.current!==void 0&&(cancelAnimationFrame(oe.current),oe.current=void 0),!ae.current.length)return;let e=ae.current;ae.current=[];let n=new Map;for(let t of e){let e=`${t.conversationId}\u0000${t.messageId}`,r=n.get(e)??[];r.push(t),n.set(e,r)}t(e=>({...e,conversations:e.conversations.map(e=>{let t=e.messages.map(t=>{let r=n.get(`${e.id}\u0000${t.id}`);if(!r)return t;let i={...t};for(let e of r){if(e.type===`message.delta`){i.content+=e.delta;continue}if(i.thinkingActive=e.active,!e.delta)continue;let t=e.at??i.content.length,n=[...i.thinkingBlocks??[]],r=n.at(-1);r&&r.at===t&&(e.blockIndex===void 0||e.blockIndex===n.length-1)?n[n.length-1]={...r,text:r.text+e.delta}:n.push({at:t,text:e.delta}),i={...i,thinking:(i.thinking??``)+e.delta,thinkingBlocks:n}}return i});return t.every((t,n)=>t===e.messages[n])?e:{...e,messages:t}})}))},[]),ce=(0,z.useCallback)(e=>{let t=ae.current,n=t.at(-1);n&&n.type===e.type&&n.conversationId===e.conversationId&&n.messageId===e.messageId&&(e.type!==`message.thinking`||n.type===`message.thinking`&&n.at===e.at&&n.active===e.active&&n.blockIndex===e.blockIndex)?t[t.length-1]={...e,delta:n.delta+e.delta}:t.push(e),oe.current===void 0&&(oe.current=requestAnimationFrame(se))},[se]),le=(0,z.useCallback)(e=>{ie.current=e},[]),[ue,de]=(0,z.useState)({}),[fe,pe]=(0,z.useState)(()=>{if(typeof window>`u`)return``;try{return window.localStorage.getItem(`super-pi.user-nickname`)??``}catch{return``}}),me=e=>{let t=e.slice(0,24);pe(t);try{window.localStorage.setItem(`super-pi.user-nickname`,t)}catch{}},he=fe.trim()||`你`,[ge,P]=(0,z.useState)([]),[_e,ve]=(0,z.useState)([]),[ye,be]=(0,z.useState)(new Map),[xe,Se]=(0,z.useState)(new Map),[Ce,we]=(0,z.useState)(),[Te,Ee]=(0,z.useState)(),[De,Oe]=(0,z.useState)(),[ke,Ae]=(0,z.useState)([]),[je,Me]=(0,z.useState)([]),[Ne,Pe]=(0,z.useState)(),[Fe,Ie]=(0,z.useState)(),[Le,Re]=(0,z.useState)(),[ze,Be]=(0,z.useState)(`idle`),[Ve,He]=(0,z.useState)(()=>typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(max-width: 1100px)`).matches),[Ue,We]=(0,z.useState)(`chat`),[Ge,Ke]=(0,z.useState)(()=>typeof window>`u`?1440:window.innerWidth);(0,z.useEffect)(()=>{let e=()=>Ke(window.innerWidth);return window.addEventListener(`resize`,e),e(),()=>window.removeEventListener(`resize`,e)},[]);let[qe,Je]=(0,z.useState)(dO),Ye=eO(qe.sidebar??270,qe.rail??320,Ge);(0,z.useEffect)(()=>{fO({sidebar:Ye.sidebar,rail:Ye.rail})},[Ye.sidebar,Ye.rail]);let Xe=e=>Je(t=>({...t,sidebar:e})),Ze=e=>Je(t=>({...t,rail:e})),[Qe,$e]=(0,z.useState)(null);(0,z.useEffect)(()=>{$e(yO())},[]),(0,z.useEffect)(()=>{Qe!==null&&document.documentElement.style.setProperty(`--composer-height`,`${Qe}px`)},[Qe]);let et=e=>{let t=vO(e);$e(t);try{window.localStorage.setItem(mO,String(t))}catch{}};(0,z.useEffect)(()=>{if(typeof window>`u`||typeof window.matchMedia!=`function`)return;let e=window.matchMedia(ZD),t=e=>{e.matches&&He(!0)};return e.addEventListener(`change`,t),e.matches&&He(!0),()=>e.removeEventListener(`change`,t)},[]);let[tt,nt]=(0,z.useState)({}),[rt,it]=(0,z.useState)({}),[at,ot]=(0,z.useState)({}),[st,ct]=(0,z.useState)(),[lt,ut]=(0,z.useState)(),[dt,ft]=(0,z.useState)(),pt=(0,z.useRef)(new Map),[mt,ht]=(0,z.useState)({}),gt=(0,z.useRef)(new Set),[_t,vt]=(0,z.useState)([]),[yt,bt]=(0,z.useState)([]),[xt,St]=(0,z.useState)(),[Ct,wt]=(0,z.useState)(!1),Tt=(0,z.useRef)(null),Et=(0,z.useRef)(!1),Dt=(0,z.useRef)(0),Ot=(0,z.useRef)([]),kt=(0,z.useRef)(void 0),At=(0,z.useRef)(!1),jt=(0,z.useRef)(new Set),Mt=(0,z.useRef)(new Map),Nt=(0,z.useRef)(new Map),[Pt,Ft]=(0,z.useState)(()=>Date.now());(0,z.useEffect)(()=>{let e=window.setInterval(()=>Ft(Date.now()),3e4);return()=>window.clearInterval(e)},[]);let It=(0,z.useMemo)(()=>s.conversations.filter(e=>!e.archivedAt),[s.conversations]),F=(0,z.useMemo)(()=>It.find(e=>e.id===c)??It.find(e=>e.workspaceId===g)??(g&&s.workspaces.some(e=>e.id===g)?void 0:It[0]),[c,It,g,s.workspaces]);(0,z.useEffect)(()=>{p(void 0)},[c,g]);let Lt=(0,z.useMemo)(()=>s.workspaces.find(e=>e.id===g)??s.workspaces[0],[s.workspaces,g]),Rt=(0,z.useRef)(g);Rt.current=g,(0,z.useEffect)(()=>{F&&_(F.workspaceId)},[F?.id]),(0,z.useEffect)(()=>{kt.current=c},[c]),(0,z.useEffect)(()=>{j.current=F?.id},[F?.id]),(0,z.useEffect)(()=>{let e=F?.id;if(!e)return;let t=s.conversations.find(t=>t.id===e);if(!t)return;let n=D.current[e];D.current[e]=t.updatedAt,n!==t.updatedAt&&k(e=>e+1),sO({activeId:kt.current,workspaceId:F?.workspaceId??g,conversations:T.current,readAt:D.current})},[F?.id,s.conversations]),(0,z.useEffect)(()=>{u&&c&&sO({activeId:c,workspaceId:F?.workspaceId??g,conversations:T.current})},[c,F?.workspaceId,u,g]),(0,z.useEffect)(()=>{let e=A.current;if(!e||!F?.id)return;let t=F.id;ne.current=!1;let n=T.current[t]??{followTail:!0,scrollTop:0};te(n),requestAnimationFrame(()=>{if(A.current===e){if(n.followTail)aO(e),e.scrollTop=e.scrollHeight;else{let t=n.anchorKey?e.querySelector(`[data-transcript-key="${CSS.escape(n.anchorKey)}"]`):null;e.scrollTop=t?Math.max(0,e.scrollTop+t.getBoundingClientRect().top-(n.anchorOffset??0)-e.getBoundingClientRect().top):n.scrollTop}}}),M.current=void 0},[F?.id]);let zt=(0,z.useCallback)((e,t=!1,n=!1)=>{let r=j.current;if(!r)return;let i=e.scrollHeight-e.clientHeight-e.scrollTop,a=T.current[r]??{followTail:!0,scrollTop:0},o=t?!1:n?!0:a.followTail?i<=iO:i<=rO,s,c;if(!o){let t=e.getBoundingClientRect().top,n=[...e.querySelectorAll(`[data-transcript-key]`)].find(e=>e.getBoundingClientRect().bottom>t);s=n?.dataset.transcriptKey,c=n?n.getBoundingClientRect().top-t:void 0}let l={followTail:o,scrollTop:e.scrollTop,...s?{anchorKey:s,anchorOffset:c}:{}};ne.current=!o,T.current[r]=l,te(l),sO({activeId:r,workspaceId:Rt.current,conversations:T.current})},[]),Bt=mt[F?.id??``]??{text:``,images:[],attachments:[],uploading:0},Vt=Bt.text,Ht=Bt.images,Ut=Bt.attachments,Wt=Bt.uploading,Gt=(e,t)=>ht(n=>({...n,[e]:t(n[e]??{text:``,images:[],attachments:[],uploading:0})})),Kt=e=>Gt(F?.id??``,t=>({...t,text:e})),qt=e=>Gt(F?.id??``,t=>({...t,attachments:t.attachments.some(t=>t.kind===e.kind&&t.id===e.id)?t.attachments:[...t.attachments,e]})),Jt=(e,t)=>Gt(F?.id??``,n=>({...n,attachments:n.attachments.filter(n=>n.kind!==e||n.id!==t)})),[Yt,Xt]=(0,z.useState)({visible:!1,query:``,rect:null}),Zt=e=>Gt(F?.id??``,t=>({...t,images:typeof e==`function`?e(t.images):e})),Qt=v.length>0?v:F?[F.id]:[],$t=(0,z.useMemo)(()=>Qt.map(e=>It.find(t=>t.id===e)).filter(e=>e!==void 0),[Qt,It]);(0,z.useEffect)(()=>{if(!b)return;let e=new Set(It.map(e=>e.id));y(t=>{let n=t.filter(t=>e.has(t));return n.length===t.length?t:n})},[b,It]),(0,z.useEffect)(()=>{uO(v,c)},[c,v]);let en=(0,z.useCallback)(e=>{l(e);let t=It.find(t=>t.id===e)?.workspaceId;t&&_(t),yn(`session`),y(t=>t.includes(e)?t:t.length>0?[...t,e]:[...F?.id&&F.id!==e?[F.id]:[],e])},[F]),tn=(0,z.useCallback)(e=>{let t=v.indexOf(e);if(t<0)return;let n=v.filter(t=>t!==e);if(y(n),F?.id!==e)return;let r=n[Math.min(t,n.length-1)];r&&l(r)},[v,F]),I=Fg(g),nn=(0,z.useRef)(I.setChangedFor),rn=(0,z.useRef)(I.setIndex),an=(0,z.useRef)(I.setIndexStatus);(0,z.useEffect)(()=>{nn.current=I.setChangedFor},[I.setChangedFor]),(0,z.useEffect)(()=>{rn.current=I.setIndex},[I.setIndex]),(0,z.useEffect)(()=>{an.current=I.setIndexStatus},[I.setIndexStatus]);let[on,sn]=(0,z.useState)(OD[0].id),[cn,ln]=(0,z.useState)({}),un=(F?.id?cn[F.id]:void 0)??on,dn=(0,z.useCallback)(e=>{sn(e),F?.id&&ln(t=>({...t,[F.id]:e}))},[F?.id]),[fn,pn]=(0,z.useState)(!1),[mn,hn]=(0,z.useState)(!1),[gn,_n]=(0,z.useState)(),[vn,yn]=(0,z.useState)(`session`),[bn,xn]=(0,z.useState)();(0,z.useEffect)(()=>{vn===`file`&&!I.active&&yn(`session`)},[vn,I.active]),(0,z.useEffect)(()=>{vn===`diff`&&!bn&&yn(`session`)},[vn,bn]),(0,z.useEffect)(()=>{I.restoredActive&&yn(`file`)},[I.restoredActive]);let Sn=(0,z.useCallback)(e=>{xn(e),yn(`diff`),sn(`files`)},[]),[Cn,wn]=(0,z.useState)({diff:null,loading:!1,error:``}),[Tn,En]=(0,z.useState)(`server`);(0,z.useEffect)(()=>{if(vn!==`diff`||!bn||!g)return;let e=!0;return wn({diff:null,loading:!0,error:``}),fetch(`/api/files/diff?workspaceId=${encodeURIComponent(g)}&path=${encodeURIComponent(bn)}`).then(async e=>{let t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error??`HTTP ${e.status}`);return t}).then(t=>{e&&wn({diff:t,loading:!1,error:``})}).catch(t=>{e&&wn({diff:null,loading:!1,error:t instanceof Error?t.message:`读取差异失败`})}),()=>{e=!1}},[vn,bn,g]);let Dn=(0,z.useMemo)(()=>{if(!bn)return;let e=I.open.find(e=>e.path===bn);return e&&e.dirty?e.content:void 0},[bn,I.open]),On=(0,z.useCallback)(e=>{I.setActivePath(e),yn(`file`),sn(`files`)},[I.setActivePath]),kn=(0,z.useCallback)(async(e,t)=>{_n(t?{workspaceId:g,path:e.path,line:t,request:Date.now()}:void 0),await I.openFile(e),yn(`file`)},[I.openFile,g]);(0,z.useEffect)(()=>{let e=e=>{(e.ctrlKey||e.metaKey)&&e.shiftKey&&e.key.toLowerCase()===`f`?(e.preventDefault(),hn(!0)):(e.ctrlKey||e.metaKey)&&e.key.toLowerCase()===`p`&&(e.preventDefault(),pn(!0))};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[]);let An=(0,z.useMemo)(()=>$t.map(e=>({id:`session:${e.id}`,rawId:e.id,kind:`session`,label:e.title,title:e.title,closable:$t.length>1||I.open.length>0,badge:(0,B.jsx)(MD,{state:jD(e,ge.some(t=>t.conversationId===e.id),D.current[e.id])})})),[$t,I.open.length,ge,s.conversations,O]),jn=(0,z.useMemo)(()=>I.open.map(e=>({id:`file:${e.path}`,rawId:e.path,kind:`file`,label:e.name,title:e.path,closable:!0,badge:e.dirty?(0,B.jsx)(`span`,{className:`file-tab-badge`,"data-file-tab-dirty":e.path,"aria-label":`未保存`,children:`●`}):void 0})),[I.open]),Mn=(0,z.useMemo)(()=>[...An,...jn],[An,jn]),Nn=vn===`file`&&I.activePath?`file:${I.activePath}`:F?.id?`session:${F.id}`:void 0,Pn=(0,z.useCallback)(e=>{if(e.startsWith(`file:`)){let t=e.slice(5);On(t)}else if(e.startsWith(`session:`)){let t=e.slice(8);en(t)}},[On,en]),Fn=(0,z.useCallback)(e=>{if(e.startsWith(`file:`)){let t=e.slice(5);I.closeFile(t),I.activePath===t&&I.open.length<=1&&yn(`session`)}else if(e.startsWith(`session:`)){let t=e.slice(8);tn(t)}},[I,tn]),In=I.active,Ln=F?.id;(0,z.useEffect)(()=>{Ln&&!Ln.startsWith(`pending:`)&&Hn({type:`conversation.select`,conversationId:Ln})},[Ln]);let L=(e,t=`info`)=>{if(!e)return;let n=++Dt.current;ve(r=>[...r,{key:n,text:e,kind:t}]),Ot.current.push(window.setTimeout(()=>ve(e=>e.filter(e=>e.key!==n)),7e3))},Rn=(e,t)=>{let n=e.findIndex(e=>e.id===t.id);if(n<0)return[t,...e];let r=[...e];return r[n]=t,r},zn=(e,t)=>{let n=e.findIndex(e=>e.id===t.id);if(n<0)return[t,...e];let r=[...e];return r[n]=t,r},Bn=(e,t)=>{if(t.blocking)P(n=>[...n.filter(n=>n.conversationId!==e||n.request.requestId!==t.requestId),{conversationId:e,request:t}]);else if(t.method===`notify`)L(t.message||t.title,t.notifyType??`info`);else if(t.method===`setStatus`){let e=t.statusKey??``;be(n=>{let r=new Map(n);return t.statusText===void 0?r.delete(e):r.set(e,t.statusText),r})}else if(t.method===`setWidget`){let e=t.widgetKey??``;Se(n=>{let r=new Map(n);return t.widgetLines===void 0?r.delete(e):r.set(e,{lines:t.widgetLines,placement:t.widgetPlacement??`aboveEditor`}),r})}else t.method===`setTitle`?we(t.title):t.method===`set_editor_text`&&e===kt.current&&Kt(t.text??``)},Vn=(e,t,n)=>{P(n=>n.filter(n=>n.conversationId!==e||n.request.requestId!==t));let r=aD[n];r&&L(r,`warning`)};(0,z.useEffect)(()=>{let e=!1,n=0,o,s=()=>{if(e)return;let c=location.protocol===`https:`?`wss`:`ws`,u=new WebSocket(`${c}://${location.host}/ws`);w.current=u,u.onopen=()=>{if(!e){n=0,d(!0),u.send(JSON.stringify({type:`stream.configure`,coalesce:!0})),u.send(JSON.stringify({type:`catalog.fetch`,conversationId:kt.current})),u.send(JSON.stringify({type:`catalog.fetchAll`})),u.send(JSON.stringify({type:`agent.catalog.fetch`})),u.send(JSON.stringify({type:`subagent.catalog.fetch`}));for(let e of i.current)e.retry&&e.command&&u.send(JSON.stringify({...e.command,operationRequestId:e.id}))}},u.onclose=()=>{if(e)return;At.current=!1;let t=_E(i.current);for(let e of t.failed)e.onFailure?.();i.current=t.retry,r(t.retry),d(!1),o=window.setTimeout(s,Math.min(qE,KE*2**n++))},u.onmessage=({data:n})=>{if(e)return;let o=JSON.parse(n);if(o.type!==`message.delta`&&o.type!==`message.thinking`&&se(),o.type===`exec.output`){let e=re.current.get(o.sessionId)??``;re.current.set(o.sessionId,(e+o.data).slice(-512e3)),re.current.size>64&&re.current.delete(re.current.keys().next().value),window.dispatchEvent(new CustomEvent(`super-pi-exec-output`,{detail:o}))}else if(o.type===`exec.exit`)re.current.delete(o.sessionId);else if(o.type.startsWith(`terminal.`))ie.current?.(o);else if(o.type===`conversation.autoRename.result`){let e=pt.current.get(o.conversationId);e&&(pt.current.delete(o.conversationId),o.ok?e.resolve(o.title):e.reject(Error(o.error)))}else if(o.type===`message.thinking`)ce(o);else if(o.type===`state`){se(),At.current=!1;let e=kt.current,n=!!(e&&jt.current.has(e)),s=!(!e||o.state.conversations.some(t=>t.id===e)),c=n&&s&&e&&Mt.current.has(e)?{...o.state,conversations:[Mt.current.get(e),...o.state.conversations]}:o.state;e&&!s&&(jt.current.delete(e),Mt.current.delete(e)),i.current=i.current.filter(e=>!e.accepted?.(c)),r(i.current),t(c),x(!0),d(!0),l(e=>{let t=c.conversations.filter(e=>!e.archivedAt),n=a.current?.activeId,r=!!(e&&t.some(t=>t.id===e)),o=!!(e&&i.current.some(t=>t.temporaryId===e));return r||o?e:n&&t.some(e=>e.id===n)?n:t.find(e=>e.workspaceId===Rt.current)?.id}),_(e=>{let t=a.current?.workspaceId;return t&&c.workspaces.some(e=>e.id===t)?t:e&&(c.workspaces.some(t=>t.id===e)||i.current.some(t=>t.temporaryId===e))?e:c.workspaces[0]?.id})}else if(o.type===`message.delta`)ce(o);else if(o.type===`message.revert.result`)ci(void 0),ct(void 0),o.ok||p(o.message);else if(o.type===`operation.result`){let e=i.current.find(e=>e.id===o.requestId);if(i.current=i.current.filter(e=>e.id!==o.requestId),r(i.current),e?.temporaryId){let t=e.temporaryId;if(o.ok&&o.entityId){let e=Nt.current.get(t);e&&Mt.current.set(o.entityId,{...e,id:o.entityId}),jt.current.add(o.entityId)}l(n=>n===t?o.ok?o.entityId:e.previousActiveId:n),y(e=>e.flatMap(e=>e===t?o.ok&&o.entityId?[o.entityId]:[]:[e])),_(e=>e===t?o.ok?o.entityId:void 0:e)}o.ok||(e?.onFailure?.(o.message),p(o.message??`操作失败`))}else o.type===`tools.updated`?window.dispatchEvent(new Event(`super-pi-tools-updated`)):o.type===`files.changed`?nn.current(o.workspaceId,o.changes,o.dropped):o.type===`files.index`?o.workspaceId===Rt.current&&(rn.current(o.changed,o.removed),an.current(o.complete,o.skipped)):o.type===`error`?(p(o.message),At.current&&(At.current=!1,L(`重命名失败:${o.message}`,`error`))):o.type===`extension.ui`?Bn(o.conversationId,o.request):o.type===`extension.ui.closed`?Vn(o.conversationId,o.requestId,o.reason):o.type===`model.catalog`?(!o.conversationId||o.conversationId===kt.current)&&Ee(o.catalog):o.type===`model.catalog.all`?Oe(o.catalog):o.type===`providers.list`?(Ae(o.providers),Me(o.apis)):o.type===`agent.catalog`?Pe(o.catalog):o.type===`subagent.catalog`?Ie(o.catalog):o.type===`server.version`?(Re(o.version),o.version.needsRestart&&L(`检测到 Super Pi 代码已更新(v${o.version.runningVersion} → v${o.version.diskVersion}),请执行 /super_pi restart 重启服务生效`,`warning`)):o.type===`subagent.event`?t(e=>({...e,subagentRuns:Rn(e.subagentRuns??[],o.run)})):o.type===`workflow.event`?t(e=>({...e,workflows:zn(e.workflows??[],o.workflow)})):o.type===`message.tools`?t(e=>({...e,conversations:e.conversations.map(e=>e.id===o.conversationId?{...e,messages:e.messages.map(e=>e.id===o.messageId?{...e,toolCalls:o.toolCalls}:e)}:e)})):o.type===`conversation.fork.result`&&(hi(e=>e===o.conversationId?void 0:e),L(o.ok?`已从「${o.title}」分叉出新会话,放在侧边栏最上面;没有切换过去。${o.messagesCopied?`复制了 ${o.messagesCopied} 条消息。`:`原会话还没有消息,只复制了会话本身。`}`:`分叉失败:${o.message}`,o.ok?`info`:`error`))}};return s(),()=>{e=!0,se(),window.clearTimeout(o);for(let e of Ot.current)window.clearTimeout(e);w.current?.close()}},[ce,se]);let Hn=(0,z.useCallback)(e=>w.current?.readyState===WebSocket.OPEN&&(w.current.send(JSON.stringify(e)),!0),[]),Un=(e,t,n,a,o,s)=>{let c=w.current?.readyState===WebSocket.OPEN,l=gE(e);if(i.current.some(e=>e.key===t)||!c&&!l)return!1;let u=C_(),d={id:u,key:t,apply:n,temporaryId:a,previousActiveId:kt.current,onFailure:o,accepted:s,...l?{retry:!0,command:e}:{}};return i.current=[...i.current,d],r(i.current),c&&w.current.send(JSON.stringify({...e,operationRequestId:u})),!0},Wn=(e,t)=>n=>({...n,conversations:n.conversations.map(n=>n.id===e?{...n,...t}:n)}),Gn=(e,t)=>n=>({...n,workspaces:n.workspaces.map(n=>n.id===e?{...n,...t}:n)}),Kn=n.some(e=>e.key===`send:${F?.id}`||e.key===`configuration:${F?.id}`||e.temporaryId===F?.id||e.key===`archive:${F?.id}`),qn=(e,t,n,r,i)=>{e&&w.current?.send(JSON.stringify({type:`question.answer`,conversationId:e,messageId:t,callIndex:n,answers:r,cancelled:i}))},Jn=(e,t,n)=>Un({type:`extension.ui.answer`,conversationId:e,requestId:t,...n},`answer:${e}:${t}`,e=>e),Yn=F?.model??Te?.defaultModel,Xn=F?.thinkingLevel??Te?.defaultThinkingLevel,Zn=Te?.source===`pi`,Qn=!!Te?.models.find(e=>e.provider===Yn?.provider&&e.modelId===Yn?.modelId)?.imageInput,$n=(e,t)=>!e||!t?e:{...e,models:e.models.filter(e=>(s.modelFilterRules??[]).every(n=>{try{return!new RegExp(n.workspacePattern,`i`).test(t.name)||new RegExp(n.modelPattern,`i`).test(e.label)||new RegExp(n.modelPattern,`i`).test(`${e.provider}/${e.modelId}`)}catch{return!0}}))},er=($n(Te,s.workspaces.find(e=>e.id===F?.workspaceId))?.models??[]).map(e=>({key:`${e.provider}/${e.modelId}`,label:e.label,detail:e.detail,badge:tD(e),selected:Yn?.provider===e.provider&&Yn.modelId===e.modelId})),tr=(Te?.levels??[]).map(e=>({key:e,label:e,selected:e===Xn})),nr=e=>{if(!F)return;let[t,n]=e.split(`/`);t&&n&&Un({type:`conversation.model`,conversationId:F.id,provider:t,modelId:n},`configuration:${F.id}`,Wn(F.id,{model:Te?.models.find(e=>e.provider===t&&e.modelId===n)??{provider:t,modelId:n,label:n}}))},rr=e=>{F&&Un({type:`conversation.thinking`,conversationId:F.id,level:e},`configuration:${F.id}`,Wn(F.id,{thinkingLevel:e}))},ir=Ne?.agents.find(e=>e.id===F?.agentId),ar=[{key:ED,label:`跟随 Pi 默认`,detail:`不使用任何 agent 角色`,selected:!F?.agentId},...(Ne?.agents??[]).map(e=>({key:e.id,label:e.name,detail:e.toolSummary,color:e.color,selected:F?.agentId===e.id}))],or=ir?.model,sr=!!(or&&F?.model&&F.model.provider===or.provider&&F.model.modelId===or.modelId);ir?.thinkingLevel&&(F?.thinkingLevel,ir.thinkingLevel);let cr=e=>{if(F){let t=Ne?.agents.find(t=>t.id===e);Un({type:`conversation.agent`,conversationId:F.id,agentId:e===ED?null:e},`configuration:${F.id}`,Wn(F.id,{agentId:t?.id,...t?.model?{model:{...t.model,label:t.model.modelId}}:{},...t?.thinkingLevel?{thinkingLevel:t.thinkingLevel}:{}}))}},lr=ge.filter(e=>e.conversationId===F?.id),ur=(0,z.useMemo)(()=>(s.subagentRuns??[]).filter(e=>e.conversationId===F?.id),[s.subagentRuns,F?.id]),dr=(0,z.useMemo)(()=>(s.workflows??[]).filter(e=>e.conversationId===F?.id),[s.workflows,F?.id]),fr=(0,z.useMemo)(()=>new Map(dr.map(e=>[e.id,e])),[dr]),pr=(0,z.useMemo)(()=>new Map((Fe?.agents??[]).map(e=>[e.id,e.name])),[Fe]),mr=(0,z.useMemo)(()=>new Map((F?.messages??[]).map(e=>[e.id,e])),[F?.messages]),hr=(0,z.useMemo)(()=>new Map(ur.map(e=>[e.id,e])),[ur]),gr=(0,z.useMemo)(()=>{let e=new Map;for(let t of ur)t.originMessageId!==void 0&&t.originCallRow!==void 0&&e.set(`${t.originMessageId}:${t.originCallRow}`,t);return e},[ur]),_r=(0,z.useMemo)(()=>{if(!F)return[];let e=st?.conversationId===F.id?(()=>{let e=F.messages.find(e=>e.id===st.messageId);if(e)return{index:F.messages.indexOf(e),at:Date.parse(e.createdAt)||0,...st.kind===`withdraw`?{inclusive:!0}:{inclusive:!1}}})():void 0,t=[];return F.messages.forEach((n,r)=>{e&&(r>e.index||e.inclusive&&r===e.index)||n.delivery||t.push({at:Date.parse(n.createdAt)||0,seq:r,key:`m:${n.id}`})}),ur.forEach((n,r)=>{n.originMessageId&&n.originCallRow!==void 0&&F?.messages.some(e=>e.id===n.originMessageId&&e.toolCalls?.[n.originCallRow])||e&&(Date.parse(n.startedAt)||0)>e.at||t.push({at:Date.parse(n.startedAt)||0,seq:t.length+r,key:`r:${n.id}`})}),dr.forEach((n,r)=>{e&&(Date.parse(n.startedAt)||0)>e.at||t.push({at:Date.parse(n.startedAt)||0,seq:t.length+r,key:`w:${n.id}`})}),t.sort((e,t)=>e.at-t.at||e.seq-t.seq).map(e=>e.key)},[F,ur,dr,st]);(0,z.useEffect)(()=>{let e=A.current;if(!e||!F?.id)return;let t=()=>{!ne.current&&T.current[F.id]?.followTail&&(aO(e),e.scrollTop=e.scrollHeight)};if(t(),typeof ResizeObserver>`u`)return;let n=new ResizeObserver(t);n.observe(e);for(let t of e.children)n.observe(t);return()=>n.disconnect()},[F?.id,F?.messages,ur,dr,_r]);let vr=e=>nt(t=>({...t,[e]:!t[e]})),yr=(e,t)=>it(n=>({...n,[`${e}:${t}`]:!n[`${e}:${t}`]})),br=(e,t)=>ot(n=>({...n,[`${e}:${t}`]:n[`${e}:${t}`]!==!1})),[xr,Sr]=(0,z.useState)({}),Cr=e=>Sr(t=>({...t,[e]:t[e]!==!0})),wr=e=>{Un({type:`subagent.stop`,runId:e},`stop:${e}`,e=>e)||L(`连接断开,无法停止子智能体,请重试`,`error`)},Tr=e=>{Un({type:`workflow.stop`,workflowId:e},`stop:${e}`,e=>e)||L(`连接断开,无法停止编排,请重试`,`error`)},Er=e=>[...xe].filter(([,t])=>t.placement===e).map(([e,t])=>{let n=t.lines;return(0,B.jsxs)(`div`,{className:`extui-widget`,"data-widget-key":e,"data-widget-lines":n.length,children:[n.slice(0,oD).map((e,t)=>(0,B.jsx)(`div`,{children:e},`${t}:${e}`)),n.length>oD&&(0,B.jsx)(`div`,{children:`… (widget truncated)`})]},e)}),Dr=(e,t)=>{let n=`pending:${C_()}`,r={id:n,name:e,path:t,updatedAt:new Date().toISOString()};Un({type:`workspace.create`,name:e,path:t},`create-workspace`,e=>({...e,workspaces:[...e.workspaces,r]}),n)&&(_(n),l(void 0),C(!1))},[Or,kr]=(0,z.useState)(),Ar=(e,t)=>kr(n=>n?.kind===e&&n.id===t?n:{kind:e,id:t}),jr=()=>kr(void 0),Mr=(e,t)=>Or?.kind===e&&Or.id===t,Nr=(e,t,n)=>t.startsWith(`pending:`)?!1:Un(e===`workspace`?{type:`workspace.rename`,workspaceId:t,name:n}:{type:`conversation.rename`,conversationId:t,name:n},`rename:${t}`,e===`workspace`?Gn(t,{name:n}):Wn(t,{title:n}))?(At.current=!0,jr(),!0):(L(`连接断开,改名未保存,请重试`,`error`),!1),Pr=async e=>{if(e.startsWith(`pending:`)){L(`这个会话还在创建中,稍后再试`,`warning`);return}if(pt.current.has(e))return;L(`正在根据对话内容生成标题…`,`info`);let t=new Promise((t,n)=>{pt.current.set(e,{resolve:t,reject:n}),window.setTimeout(()=>{pt.current.delete(e)&&n(Error(`模型在 30 秒内没有返回标题`))},32e3)});if(!Hn({type:`conversation.autoRename`,conversationId:e}))pt.current.delete(e),L(`连接断开,无法生成标题`,`error`);else try{let n=await t;Nr(`conversation`,e,n),L(`已重命名为「${n}」`,`info`)}catch(e){L(`重命名失败:${e instanceof Error?e.message:String(e)}`,`error`)}},Fr=e=>{if(e.id.startsWith(`pending:`))return;let t=s.conversations.filter(t=>t.workspaceId===e.id).length;window.confirm(`删除工作区「${e.name}」?${t?`其中 ${t} 条会话将一并删除,`:``}此操作不可撤销。`)&&Un({type:`workspace.delete`,workspaceId:e.id},`delete:${e.id}`,t=>({...t,workspaces:t.workspaces.filter(t=>t.id!==e.id),conversations:t.conversations.filter(t=>t.workspaceId!==e.id)}))},[Ir,Lr]=(0,z.useState)(),Rr=Ir?s.workspaces.find(e=>e.id===Ir):void 0,{theme:zr,setTheme:Br}=Z_(),[Vr,Hr]=(0,z.useState)(!1),[Ur,Wr]=(0,z.useState)(!1),Gr=(e,t,n,r)=>{e.startsWith(`pending:`)||(Un({type:`workspace.settings`,workspaceId:e,model:n?{provider:n.provider,modelId:n.modelId}:null,thinkingLevel:r??null,agentId:t??null},`defaults:${e}`,Gn(e,{defaultModel:n,defaultThinkingLevel:r,defaultAgentId:t}))?Lr(void 0):L(`连接断开,设置未保存,请重试`,`error`))},Kr=e=>{if(e.startsWith(`pending:`)||i.current.some(t=>t.key===`defaults:${e}`))return;let t=`pending:${C_()}`,n={id:t,workspaceId:e,title:`新会话`,status:`idle`,updatedAt:new Date().toISOString(),messages:[]};Nt.current.set(t,n),Un({type:`conversation.create`,workspaceId:e},`create-session:${e}`,e=>({...e,conversations:[n,...e.conversations]}),t)&&(_(e),l(t),yn(`session`),y(e=>[...e.filter(e=>e!==t),t]))},qr=e=>{e.startsWith(`pending:`)||Un({type:`conversation.archive`,conversationId:e},`archive:${e}`,Wn(e,{archivedAt:new Date().toISOString()}))},Jr=e=>Un({type:`conversation.unarchive`,conversationId:e},`archive:${e}`,Wn(e,{archivedAt:void 0})),Yr=async e=>{if(!F){L(`请先选择或创建会话`,`error`);return}if(!Qn){L(`当前模型不支持图片输入`,`error`);return}let t=[`image/png`,`image/jpeg`,`image/gif`,`image/webp`],n=e.filter(e=>t.includes(e.type)?e.size>5242880?(L(`图片「${e.name}」超过 5MB 上限`,`error`),!1):!0:(L(`不支持的文件格式「${e.name}」,仅支持 PNG/JPEG/GIF/WebP`,`error`),!1));if(n.length===0)return;let r=F.id;Gt(r,e=>({...e,uploading:e.uploading+n.length}));let i=n.map(e=>({id:C_(),conversationId:r,name:e.name,url:URL.createObjectURL(e)}));bt(e=>[...e,...i]);for(let[e,t]of n.entries()){let n=i[e];try{let e=await new Promise((e,n)=>{let r=new FileReader;r.onload=()=>{let t=r.result,n=t.indexOf(`,`);e(n>=0?t.slice(n+1):t)},r.onerror=n,r.readAsDataURL(t)}),i=await fetch(`/api/upload`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({conversationId:r,name:t.name,mimeType:t.type,data:e})});if(!(i.headers.get(`content-type`)??``).includes(`application/json`)){L(`服务器未返回 JSON 响应,请刷新或重启服务`,`error`);continue}if(i.ok){let e=await i.json();if(gt.current.has(n.id))continue;bt(e=>e.filter(e=>e.id!==n.id)),URL.revokeObjectURL(n.url),Gt(r,t=>({...t,images:[...t.images,{id:e.id,name:e.name,mimeType:e.mimeType,bytes:e.bytes}]}))}else{let e=await i.json().catch(()=>({error:`上传失败`}));L(e.error||`上传失败: ${i.status}`,`error`)}}catch(e){L(`上传错误: ${e instanceof Error?e.message:`网络错误`}`,`error`)}finally{bt(e=>e.map(e=>e.id===n.id?{...e,failed:!0}:e)),Gt(r,e=>({...e,uploading:Math.max(0,e.uploading-1)}))}}},Xr=e=>{let t=e.clipboardData?.items;if(!t)return;let n=[];for(let e=0;e<t.length;e++){let r=t[e];if(r.type.startsWith(`image/`)){let e=r.getAsFile();e&&n.push(e)}}if(n.length>0){if(!Qn){L(`当前模型不支持图片输入`,`error`);return}e.preventDefault(),Yr(n)}},Zr=e=>{e.dataTransfer?.types?.includes(`Files`)&&(e.preventDefault(),wt(!0))},Qr=e=>{e.currentTarget.contains(e.relatedTarget)||wt(!1)},$r=e=>{wt(!1);let t=Array.from(e.dataTransfer?.files??[]).filter(e=>e.type.startsWith(`image/`));if(t.length>0){if(e.preventDefault(),!Qn){L(`当前模型不支持图片输入`,`error`);return}Yr(t)}},ei=e=>{if(e.preventDefault(),!F||Kn||!Vt.trim()&&Ht.length===0)return;if(Ht.length>0&&!Qn){L(`当前模型不支持图片输入,请移除图片或切换至支持图文的模型`,`error`);return}if(Wt>0){L(`图片正在上传中,请稍候…`,`info`);return}let t=`message_${C_()}`,n=F.id,r=Vt,i=Ht;Un({type:`message.send`,conversationId:n,content:Vt,clientId:t,...Ht.length>0?{images:Ht}:{},...Ut.length>0?{attachments:Ut}:{}},`send:${n}`,e=>{let a=e.conversations.find(e=>e.id===n);if(!a||a.messages.some(e=>e.id===t))return e;let o=a.status===`running`,s=new Date().toISOString();return{...e,conversations:e.conversations.map(e=>e.id===n?{...e,...o?{}:{status:`waiting`,updatedAt:s},messages:[...e.messages,{id:t,role:`user`,content:r,...i.length>0?{images:i}:{},...Ut.length>0?{attachments:Ut}:{},...o?{delivery:`waiting`}:{},createdAt:s}]}:e)}},t,e=>{vt(a=>[...a,{id:t,conversationId:n,content:r,images:i,reason:e}]),Gt(n,e=>e.text||e.images.length?e:{...e,text:r,images:i})},e=>!!e.conversations.find(e=>e.id===n)?.messages.some(e=>e.id===t))?Gt(F.id,e=>({...e,text:``,images:[]})):L(`这条消息已经在发送队列中,请稍候`,`info`)},ti=(0,z.useMemo)(()=>(F?.messages??[]).filter(e=>(e.role===`user`||e.role===`tool`)&&e.delivery),[F?.messages]),ni=e=>{Un({type:`message.cancel`,conversationId:F?.id??``,messageId:e},`queue:${e}`,t=>({...t,conversations:t.conversations.map(t=>t.id===F?.id?{...t,messages:t.messages.filter(t=>t.id!==e)}:t)}))||L(`连接断开,撤回没有生效,请重试`,`error`)},ri=e=>{Un({type:`message.steer`,conversationId:F?.id??``,messageId:e},`queue:${e}`,t=>({...t,conversations:t.conversations.map(t=>t.id===F?.id?{...t,messages:PE(t.messages,e,0)}:t)}),void 0,void 0,t=>t.conversations.find(e=>e.id===F?.id)?.messages.find(t=>t.id===e)?.delivery===`sending`)||L(`连接断开,插到最前没有生效,请重试`,`error`)},ii=e=>{Un({type:`message.interrupt`,conversationId:F?.id??``,messageId:e},`interrupt:${F?.id}:${e}`,e=>e,void 0,void 0,t=>{let n=t.conversations.find(e=>e.id===F?.id);return n?.status===`running`&&!n.messages.find(t=>t.id===e)?.delivery})||L(`请求正在处理,请稍候`,`info`)},ai=e=>{Un({type:`message.sendQueued`,conversationId:F?.id??``,messageId:e},`send-queued:${e}`,e=>e,void 0,void 0,t=>!t.conversations.find(e=>e.id===F?.id)?.messages.find(t=>t.id===e)?.delivery)||L(`连接断开,发送没有生效,请重试`,`error`)},oi=(e,t)=>{Un({type:`message.edit`,conversationId:F?.id??``,messageId:e,content:t},`edit:${e}`,n=>({...n,conversations:n.conversations.map(n=>n.id===F?.id?{...n,messages:n.messages.map(n=>n.id===e?{...n,content:t}:n)}:n)}))||L(`连接断开,修改没有生效,请重试`,`error`)},[si,ci]=(0,z.useState)(),li=(e,t=!1)=>{if(!F||si)return;let n=F.messages.find(t=>t.id===e);n&&(n&&ht(e=>{let t=e[F.id]??{text:``,images:[],uploading:0};return t.text.trim()||t.images.length?e:{...e,[F.id]:{...t,text:n.content,images:n.images??[]}}}),ct({conversationId:F.id,messageId:e,kind:t?`withdraw`:`revert`})),Hn({type:`message.revert`,conversationId:F.id,messageId:e,withdraw:t})?ci(e):(ct(void 0),L(`连接断开,回退未执行,请重试`,`error`))},[ui,di]=(0,z.useState)(),fi=(0,z.useRef)(void 0),pi=async(e,t)=>{fi.current&&clearTimeout(fi.current);let n=await JE(t);di({id:e,kind:n?`copied`:`error`}),n||L(`复制失败:浏览器拒绝了剪贴板写入,可以手动选中这条消息的文字复制`,`error`),fi.current=setTimeout(()=>di(void 0),2e3)};(0,z.useEffect)(()=>()=>{fi.current&&clearTimeout(fi.current)},[]);let[mi,hi]=(0,z.useState)(),gi=e=>{mi||e.startsWith(`pending:`)||(Hn({type:`conversation.fork`,conversationId:e})?hi(e):L(`连接断开,分叉没有执行,请重试`,`error`))};return(0,B.jsxs)(`main`,{className:`shell${Ve?` shell-rail-collapsed`:``} mobile-panel-${Ue}`,"data-rail-collapsed":Ve,"data-selected-workspace":g??``,style:{"--sidebar-width":`${Ye.sidebar}px`,"--rail-col":Ve?void 0:`${Ye.rail}px`},children:[(0,B.jsxs)(`aside`,{children:[(0,B.jsxs)(`div`,{className:`brand`,children:[(0,B.jsx)(`span`,{children:`π`}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`strong`,{children:`SUPER PI`}),(0,B.jsx)(`small`,{children:`agent workspace`})]})]}),(0,B.jsx)(`div`,{className:`sidebar-actions`,children:(0,B.jsx)(`button`,{className:`workspace-new`,onClick:()=>C(!0),children:`+ 工作区`})}),(0,B.jsx)(`div`,{className:`label`,children:`工作区`}),(0,B.jsx)(`nav`,{children:s.workspaces.map(e=>{let t=s.conversations.filter(t=>t.workspaceId===e.id),n=t.filter(e=>!e.archivedAt).sort(UE),r=t.filter(e=>e.archivedAt).sort(WE),i=m[e.id]??!1,a=ue[e.id]??!0;return(0,B.jsxs)(`section`,{className:`workspace-group`,children:[(0,B.jsx)(`div`,{className:`workspace-header`,children:Mr(`workspace`,e.id)?(0,B.jsx)(wD,{initial:e.name,label:`重命名工作区 ${e.name}`,onCommit:t=>Nr(`workspace`,e.id,t),onClose:jr}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(`button`,{className:`workspace-toggle`,"aria-expanded":!i,title:e.path,onContextMenu:t=>{t.preventDefault();let n=t.currentTarget.getBoundingClientRect();ut({workspace:e,x:t.clientX||n.left+24,y:t.clientY||n.top+n.height})},onClick:()=>{_(e.id),l(It.find(t=>t.workspaceId===e.id)?.id),h(t=>({...t,[e.id]:!i}))},children:[(0,B.jsx)(`span`,{className:`chevron chevron-folder`,"aria-hidden":`true`,children:i?`📁`:`📂`}),(0,B.jsxs)(`span`,{children:[(0,B.jsx)(`strong`,{onDoubleClick:()=>Ar(`workspace`,e.id),children:e.name}),(0,B.jsx)(`small`,{children:e.path})]})]}),(0,B.jsx)(`button`,{className:`workspace-add`,title:`在此工作区新建会话`,onClick:()=>Kr(e.id),children:`+`}),(0,B.jsx)(`button`,{className:`workspace-settings`,title:`工作区设置(默认智能体 / 模型 / 思考强度)`,"aria-label":`工作区设置 ${e.name}`,onClick:()=>Lr(e.id),children:`⚙`}),(0,B.jsx)(`button`,{className:`workspace-delete`,title:`删除工作区`,onClick:()=>Fr(e),children:`×`})]})}),!i&&(n.length?n.map(t=>(0,B.jsx)(`div`,{className:`conversation-row`,children:Mr(`conversation`,t.id)?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(wD,{initial:t.title,label:`重命名会话 ${t.title}`,onCommit:e=>Nr(`conversation`,t.id,e),onClose:jr}),(0,B.jsx)(`small`,{className:`conversation-time`,children:HE(t.updatedAt,Pt)})]}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(`button`,{className:`conversation ${F?.id===t.id?`selected`:``}`,"data-conversation":t.id,title:t.title,"aria-label":`打开会话 ${t.title}`,onContextMenu:e=>{e.preventDefault();let n=e.currentTarget.getBoundingClientRect();ft({conversation:t,x:e.clientX||n.left+24,y:e.clientY||n.top+n.height})},onClick:()=>{en(t.id),_(e.id)},children:[(0,B.jsx)(`i`,{className:`conversation-mark`,children:(0,B.jsx)(MD,{state:jD(t,ge.some(e=>e.conversationId===t.id),D.current[t.id])})}),(0,B.jsx)(`span`,{"data-conversation-title":t.id,onDoubleClick:()=>Ar(`conversation`,t.id),children:t.title}),(0,B.jsx)(`small`,{children:HE(t.updatedAt,Pt)})]}),(0,B.jsx)(`button`,{type:`button`,className:`conversation-fork`,"data-fork-conversation":t.id,"data-fork-state":mi===t.id?`pending`:`idle`,disabled:!!mi,title:`从此会话分叉出一个新会话`,"aria-label":`从会话 ${t.title} 分叉出一个新会话`,onClick:()=>gi(t.id),children:`⑂`}),(0,B.jsx)(`button`,{className:`conversation-archive`,title:`归档会话`,"aria-label":`归档会话 ${t.title}`,onClick:()=>qr(t.id),children:`×`})]})},t.id)):(0,B.jsx)(`div`,{className:`conversation-empty`,children:`暂无会话`})),!i&&r.length>0&&(0,B.jsxs)(`div`,{className:`archived-group`,"data-archived-count":r.length,children:[(0,B.jsxs)(`button`,{className:`archived-toggle`,title:a?`展开已归档会话`:`收起已归档会话`,"aria-expanded":!a,onClick:()=>de(t=>({...t,[e.id]:!a})),children:[(0,B.jsx)(`span`,{className:`chevron`,"aria-hidden":`true`,children:a?`▸`:`▾`}),(0,B.jsxs)(`span`,{className:`archived-label`,children:[`Archived (`,r.length,`)`]})]}),!a&&r.map(e=>(0,B.jsxs)(`div`,{className:`conversation-archived`,"data-archived-at":e.archivedAt,children:[(0,B.jsx)(`i`,{className:`conversation-mark`,"aria-hidden":`true`}),(0,B.jsx)(`span`,{"data-archived-title":e.id,children:e.title}),(0,B.jsx)(`small`,{children:GE(e.archivedAt)}),(0,B.jsx)(`button`,{className:`conversation-restore`,title:`恢复为正常会话`,"aria-label":`恢复会话 ${e.title}`,onClick:()=>Jr(e.id),children:`↑`})]},e.id))]})]},e.id)})}),(0,B.jsxs)(`footer`,{children:[(0,B.jsxs)(`div`,{className:`footer-status`,children:[(0,B.jsx)(`i`,{className:u?`online`:`offline`}),u?`已连接`:`正在连接`,(0,B.jsx)(`span`,{children:`本地持久化`})]}),(0,B.jsxs)(`div`,{className:`footer-version`,"data-super-pi-version":Le?.runningVersion??``,children:[`Super Pi v`,Le?.runningVersion??`…`]}),(0,B.jsxs)(`button`,{type:`button`,className:`theme-settings-trigger`,"data-theme-open":`1`,"aria-haspopup":`dialog`,"aria-expanded":Vr,onClick:()=>{Hr(!0),Hn({type:`catalog.fetchAll`}),Hn({type:`providers.fetch`})},children:[(0,B.jsx)(`span`,{"aria-hidden":`true`,children:`⚙`}),`设置`]}),(0,B.jsxs)(`button`,{type:`button`,className:`theme-settings-trigger`,"data-help-open":`1`,"aria-haspopup":`dialog`,"aria-expanded":Ur,onClick:()=>Wr(!0),children:[(0,B.jsx)(`span`,{"aria-hidden":`true`,children:`📖`}),`使用指南`]}),(0,B.jsxs)(`button`,{type:`button`,className:`theme-settings-trigger restart-needed-trigger`,title:`检查 Super Pi 更新`,onClick:async()=>{Be(`updating`);try{let e=await fetch(`/api/update-check`);if(!e.ok)throw Error(`check failed`);let t=await e.json();if(t.needsRestart)L(`当前代码已更新,正在重启服务…`,`info`);else if(t.updateAvailable){if(!window.confirm(`发现新版本 v${t.latestVersion??``},是否立即更新并重启 Super Pi?`))L(`已取消更新`,`info`);else{if(!(await fetch(`/api/update`,{method:`POST`})).ok)throw Error(`update failed`);L(`正在更新到 v${t.latestVersion} 并重启…`,`info`)}}else L(`当前已是最新版本`,`info`)}catch{L(`检查更新失败,请检查网络或服务日志`,`error`)}finally{Be(`idle`)}},children:[(0,B.jsx)(`span`,{"aria-hidden":`true`,children:ze===`updating`?`⟳`:`↻`}),ze===`updating`?`正在检查更新…`:`检查更新`]}),Le?.needsRestart&&(0,B.jsxs)(`button`,{type:`button`,className:`theme-settings-trigger restart-needed-trigger`,title:`代码已更新:当前运行 v${Le.runningVersion},磁盘版本 v${Le.diskVersion}。点击复制重启命令 /super_pi restart`,onClick:async()=>{Be(`updating`);try{if(!(await fetch(`/api/update`,{method:`POST`})).ok)throw Error(`update failed`);L(`正在更新 Super Pi,服务即将重启…`,`info`)}catch{Be(`idle`),L(`更新启动失败,请检查服务日志`,`error`)}},children:[(0,B.jsx)(`span`,{"aria-hidden":`true`,children:ze===`updating`?`⟳`:`⚠️`}),ze===`updating`?`正在更新并重启…`:`更新并重启服务`]})]})]}),(0,B.jsx)(pO,{side:`left`,width:Ye.sidebar,min:Ye.sidebarMin,max:Ye.sidebarMax,label:`调整左侧栏宽度`,onWidth:Xe}),(0,B.jsxs)(`section`,{className:`chat`,"data-main-view":vn,"data-main-view-kind":vn,children:[Mn.length>0&&(0,B.jsx)(`div`,{className:`chat-tab-strip`,"data-chat-tab-strip":`1`,"data-session-count":$t.length,"data-file-count":I.open.length,children:(0,B.jsx)(Gg,{tabs:Mn,prefix:`workspace-tab`,ariaLabel:`工作区标签页`,activeId:Nn,onSelect:Pn,onClose:Fn,minWidth:120,maxWidth:320})}),(0,B.jsxs)(`header`,{children:[(0,B.jsxs)(`div`,{className:`chat-head`,children:[(0,B.jsx)(`h1`,{children:F?.title??`准备开始`}),ye.size>0?[...ye].map(([e,t])=>(0,B.jsx)(`p`,{"data-role":`run-status`,"data-status-key":e,children:`扩展状态:${e?`${e} · `:``}${t}`},e)):(0,B.jsx)(`p`,{"data-role":`run-status`,children:F?.status===`running`?`Agent 正在工作`:`Pi runtime · Web 控制台`})]}),(0,B.jsxs)(`span`,{className:`chat-view chat-view-${vn}`,"data-main-view-indicator":vn,"data-main-view-kind":vn,title:vn===`file`?`中间主画面正在显示文件 ${I.active?.path??``}`:vn===`diff`?`中间主画面正在显示 ${bn??``} 的改动`:`中间主画面正在显示这个会话的消息流`,children:[(0,B.jsx)(`span`,{className:`chat-view-label`,children:`主区显示`}),(0,B.jsx)(`span`,{className:`chat-view-kind`,children:vn===`file`?`文件`:vn===`diff`?`改动`:`会话`}),vn===`file`&&I.active&&(0,B.jsx)(`span`,{className:`chat-view-name`,"data-main-view-name":I.active.name,children:I.active.name}),vn===`diff`&&bn&&(0,B.jsx)(`span`,{className:`chat-view-name`,"data-main-view-name":bn,children:bn})]}),(0,B.jsx)(`div`,{className:`badge`,children:F?.status??`idle`})]}),f&&(0,B.jsxs)(`div`,{className:`error`,role:`alert`,"data-global-error":!0,children:[(0,B.jsx)(`span`,{children:f}),(0,B.jsx)(`button`,{type:`button`,"aria-label":`关闭错误提示`,title:`关闭错误提示`,onClick:()=>p(void 0),children:`×`})]}),F?.error&&(0,B.jsx)(`div`,{className:`error`,"data-role":`conversation-error`,children:F.error}),Ce&&(0,B.jsxs)(`div`,{className:`extui-title-note`,children:[`扩展建议标题:`,Ce]}),_e.length>0&&(0,B.jsx)(`div`,{className:`toasts`,role:`status`,"aria-live":`polite`,"data-toast-count":_e.length,children:_e.map(e=>(0,B.jsx)(`div`,{className:`toast toast-${e.kind}`,"data-toast-kind":e.kind,children:e.text},e.key))}),vn===`file`?(0,B.jsx)(`div`,{className:`chat-file-view`,"data-main-file-view":In?.path,"data-file-view-kind":`editor`,children:In?(0,B.jsx)(jg,{file:In,state:I.saves[In.path]?.state??`idle`,message:I.saves[In.path]?.message??``,external:I.external[In.path]===!0,jumpToLine:gn&&gn.workspaceId===g&&gn.path===In.path?gn:void 0,onChange:e=>I.updateBuffer(In.path,e),onSave:()=>void I.save(In.path,!1),onReload:()=>void I.reload(In.path),onOverwrite:()=>void I.save(In.path,!0)}):(0,B.jsx)(`p`,{className:`rail-empty`,"data-main-file-empty":`1`,children:`没有选中的文件。`})}):vn===`diff`?(0,B.jsx)(`div`,{className:`chat-file-view`,"data-main-diff-view":bn??``,"data-file-view-kind":`diff`,children:(0,B.jsx)(Ng,{diff:Cn.diff,loading:Cn.loading,error:Cn.error,bufferContent:Dn,mode:Tn,onMode:En})}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(`div`,{className:`messages`,ref:A,"data-message-scroll-container":F?.id??``,onWheel:e=>{e.deltaY<0&&T.current[F?.id??``]?.followTail&&(ne.current=!0,zt(e.currentTarget,!0))},onScroll:e=>{let t=e.currentTarget;t.dataset.programmaticScroll===`true`?delete t.dataset.programmaticScroll:zt(t)},children:[!F&&(0,B.jsxs)(`div`,{className:`empty`,children:[(0,B.jsx)(`div`,{className:`orb`,children:`π`}),(0,B.jsx)(`h2`,{children:`开始一个新会话`}),s.workspaces.length===0?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`p`,{children:`先创建一个工作区,再开始会话。`}),(0,B.jsx)(`button`,{onClick:()=>C(!0),children:`+ 新建工作区`})]}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`p`,{children:s.workspaces.length===1&&Lt?`在「${Lt.name}」中创建会话,即可向 Super Pi 发送任务。`:`选择工作区即可开始会话,向 Super Pi 发送任务。`}),s.workspaces.length>1&&(0,B.jsxs)(`div`,{className:`empty-workspace-select`,children:[(0,B.jsx)(`label`,{htmlFor:`empty-workspace-choice`,children:`工作区:`}),(0,B.jsxs)(`select`,{id:`empty-workspace-choice`,"aria-label":`选择工作区`,value:Lt?.id,onChange:e=>{e.target.value===`__new__`?C(!0):_(e.target.value)},children:[s.workspaces.map(e=>(0,B.jsx)(`option`,{value:e.id,children:e.name},e.id)),(0,B.jsx)(`option`,{value:`__new__`,children:`+ 新建工作区…`})]})]}),Lt&&(0,B.jsx)(`button`,{onClick:()=>Kr(Lt.id),children:`新建会话`}),(0,B.jsx)(`span`,{className:`empty-secondary-action`,role:`button`,tabIndex:0,onClick:()=>C(!0),onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),C(!0))},children:`+ 新建工作区`})]})]}),_r.map(e=>{if(e.startsWith(`m:`)){let t=mr.get(e.slice(2));if(!t)return null;let r=!F?.messages.some(n=>n.id!==t.id&&n.role===`user`&&_r.indexOf(`m:${n.id}`)>_r.indexOf(e)),i=t.role===`user`&&F?.status!==`running`&&F?.status!==`waiting`&&si!==t.id,a=i&&r&&!t.id.startsWith(`pending:`),o=i&&!r&&!!t.piEntryId,s=t.content?(0,B.jsx)(tm,{source:t.content}):(0,B.jsx)(`span`,{className:`typing`,children:`正在思考`}),c=t.toolCalls??[];if(t.role===`user`){let n=ui?.id===t.id?ui.kind:void 0,r=t.content||(t.images?.length?`[图片]`:``);return(0,B.jsxs)(`article`,{className:`message user`,"data-transcript-key":e,children:[(0,B.jsxs)(`div`,{className:`message-body`,children:[(0,B.jsxs)(`div`,{className:`bubble`,children:[(0,B.jsxs)(`div`,{className:`meta`,children:[he,(0,B.jsx)(`time`,{children:FE(t.createdAt)})]}),t.images&&t.images.length>0&&(0,B.jsx)(`div`,{className:`message-images`,"data-message-images":`1`,children:t.images.map(e=>(0,B.jsx)(`button`,{type:`button`,className:`message-image-btn`,"data-message-image-id":e.id,onClick:()=>St({url:`/api/upload/${encodeURIComponent(F?.id??``)}/${encodeURIComponent(e.id)}`,name:e.name,bytes:e.bytes}),title:e.name?`查看大图:${e.name}`:`查看大图`,children:(0,B.jsx)(`img`,{src:`/api/upload/${encodeURIComponent(F?.id??``)}/${encodeURIComponent(e.id)}`,alt:e.name||`图片`,className:`message-image-thumb`,loading:`lazy`})},e.id))}),(0,B.jsx)(`div`,{className:`content`,children:s})]}),t.attachments&&t.attachments.length>0&&(0,B.jsx)(`div`,{className:`message-attachments`,"data-message-attachments":`1`,children:t.attachments.map(e=>{let n=`att:${t.id}:${e.kind}:${e.id}`,r=rt[n]??!1;return(0,B.jsxs)(`div`,{className:`message-attachment`,"data-message-attachment":e.kind,children:[(0,B.jsxs)(`button`,{type:`button`,className:`message-attachment-head`,"data-message-attachment-toggle":e.id,"aria-expanded":r,onClick:()=>it(e=>({...e,[n]:!r})),children:[(0,B.jsx)(`span`,{className:`message-attachment-glyph`,"aria-hidden":`true`,children:`▤`}),(0,B.jsx)(`span`,{className:`message-attachment-label`,children:`技能`}),(0,B.jsx)(`span`,{className:`message-attachment-name`,title:e.name,children:e.name}),(0,B.jsx)(`span`,{className:`message-attachment-chevron`,"aria-hidden":`true`,children:r?`▾`:`▸`})]}),r&&(0,B.jsx)(`pre`,{className:`message-attachment-body`,"data-message-attachment-body":e.id,children:e.content})]},n)})}),(0,B.jsxs)(`div`,{className:`message-actions`,children:[(0,B.jsx)(`button`,{type:`button`,className:`message-copy`,"data-copy-message":t.id,"data-copy-state":n,"aria-label":`复制这条消息:${r}`,onClick:()=>pi(t.id,r),children:n===`copied`?`已复制`:n===`error`?`复制失败`:`复制`}),a&&(0,B.jsx)(`button`,{type:`button`,className:`message-revert`,"data-withdraw-message":t.id,title:`撤回并编辑:删除这条消息并将文字恢复到输入框继续编辑`,onClick:()=>li(t.id,!0),children:`撤回`}),o&&(0,B.jsx)(`button`,{type:`button`,className:`message-revert`,"data-revert-message":t.id,title:`回退到这里:删除后续全部内容(Pi 的记录和这里的历史一起清掉,不会新建会话,也不动任何代码文件)`,onClick:()=>li(t.id),children:`回退`})]})]}),(0,B.jsx)(`div`,{className:`avatar`,title:he,children:he})]},e)}if(t.role===`tool`){let n=(()=>{let e=/<summary>([\s\S]*?)<\/summary>/.exec(t.content);return e?e[1].trim():`后台回传`})(),r=(()=>{let e=/<task id="[^"]+" state="([^"]+)"/.exec(t.content);return e?e[1]:`completed`})(),i=(()=>{let e=/<task_(?:result|error)>\n?([\s\S]*?)\n?<\/(?:task_result|task_error)>/.exec(t.content);return e?e[1]:t.content})(),a=`tool:${t.id}`,o=rt[a]??!1;return(0,B.jsx)(`article`,{className:`message tool`,"data-transcript-key":e,"data-tool-state":r,children:(0,B.jsxs)(`div`,{className:`message-body`,children:[(0,B.jsx)(`div`,{className:`bg-result-head`,"data-bg-result-head":t.id,children:(0,B.jsxs)(`button`,{type:`button`,className:`bg-result-toggle`,"data-bg-result-toggle":t.id,"aria-expanded":o,title:o?`折叠后台回传`:`展开后台回传`,onClick:()=>it(e=>({...e,[a]:!o})),children:[(0,B.jsx)(`span`,{className:`bg-result-glyph`,"aria-hidden":`true`,children:r===`error`?`✕`:`↩`}),(0,B.jsx)(`span`,{className:`bg-result-label`,children:`后台回传`}),(0,B.jsx)(`span`,{className:`bg-result-summary`,title:n,children:n}),!o&&(0,B.jsx)(`span`,{className:`bg-result-preview`,"data-bg-result-preview":t.id,title:`展开查看完整输出`,children:i.split(`
|
|
98
98
|
`).slice(-1)[0]}),(0,B.jsx)(`span`,{className:`bg-result-chevron`,"aria-hidden":`true`,children:o?`▾`:`▸`})]})}),o&&(0,B.jsx)(`div`,{className:`bg-result-body`,"data-bg-result-body":t.id,children:(0,B.jsx)(`pre`,{className:`bg-result-pre`,"data-bg-result-pre":t.id,children:i})})]})},e)}let l=t.thinking?.trim()?t.thinking:``,u=t.thinkingBlocks?.length?t.thinkingBlocks:l?[{at:0,text:l}]:[],d=(e,n)=>{let r=typeof e.at==`number`&&Number.isFinite(e.at)?e.at:n;return Math.max(0,Math.min(r,t.content.length))},f=e=>e.thinkingBlock===void 0?typeof e.thinkingAt!=`number`||!(e.thinkingAt<l.length||t.thinkingActive)?-1:u.findIndex((t,n)=>(e.at??0)>=t.at&&(u[n+1]===void 0||(e.at??0)<u[n+1].at)):e.thinkingBlock??-1,p=e=>c.map((e,t)=>({call:e,index:t})).filter(({call:t})=>f(t)===e),m=[],h=[...u.map((e,t)=>({at:e.at,order:u.slice(0,t).reduce((e,t)=>e+t.text.length,0)*2+1,segment:{blockIndex:t}})),...c.map((e,t)=>({at:d(e,t),order:(e.thinkingAt??0)*2,segment:{call:e,index:t}})).filter(({segment:e})=>`call`in e&&f(e.call)<0)].sort((e,t)=>e.at-t.at||e.order-t.order),g=0;for(let e of h){let n=Math.max(g,Math.min(e.at,t.content.length));n>g&&m.push({text:t.content.slice(g,n)}),m.push(e.segment),g=n}g<t.content.length&&m.push({text:t.content.slice(g)});let _=e=>{let t=gr.get(e);if(t)return(0,B.jsx)(`div`,{className:`call-anchored-run`,"data-call-anchored-run":t.id,"data-call-anchored-site":e,children:(0,B.jsx)(gD,{run:t,name:pr.get(t.agentId)??``,expanded:!!tt[t.id],onToggle:()=>vr(t.id),onStop:()=>wr(t.id),stopping:n.some(e=>e.key===`stop:${t.id}`)})})},v=e=>e.call.question?(0,B.jsx)(`div`,{className:`call-blocks`,"data-call-block-index":e.index,children:(0,B.jsx)(xD,{question:e.call.question,index:e.index,expanded:`${t.id}:${e.index}`in at?!!at[`${t.id}:${e.index}`]:!0,onToggle:()=>br(t.id,e.index),onAnswer:(n,r)=>qn(F?.id??``,t.id,e.index,n,r)})},`c${e.index}`):(0,B.jsx)(`div`,{className:`call-blocks`,"data-call-block-index":e.index,children:(0,B.jsx)(pD,{call:e.call,index:e.index,expanded:`${t.id}:${e.index}`in rt&&!!rt[`${t.id}:${e.index}`],onToggle:()=>yr(t.id,e.index),backgroundOutput:e.call.backgroundTask&&(0,B.jsx)(fD,{task:e.call.backgroundTask,initialOutput:re.current.get(e.call.backgroundTask.id)??``,expanded:`${t.id}:${e.index}`in rt&&!!rt[`${t.id}:${e.index}`]}),runCard:_(`${t.id}:${e.index}`)})},`c${e.index}`),y=e=>{let n=u[e],r=u.slice(0,e).reduce((e,t)=>e+t.text.length,0),i=0,a=[];for(let{call:t,index:o}of p(e).sort((e,t)=>(e.call.thinkingAt??r)-(t.call.thinkingAt??r)||e.index-t.index)){let e=Math.max(i,Math.min(n.text.length,(t.thinkingAt??r)-r));e>i&&a.push((0,B.jsx)(`div`,{className:`content thinking-text`,children:(0,B.jsx)(tm,{source:n.text.slice(i,e)})},`t${o}`)),a.push(v({call:t,index:o})),i=e}i<n.text.length&&a.push((0,B.jsx)(`div`,{className:`content thinking-text`,children:(0,B.jsx)(tm,{source:n.text.slice(i)})},`tail`));let o=p(e).filter(e=>e.call.status===void 0);return(0,B.jsx)(hD,{liveCall:o.at(-1)?.call.label,liveExtra:o.length>1?o.length-1:void 0,messageId:`${t.id}:${e}`,nestedCount:p(e).length,preview:n.text.split(`
|
|
99
99
|
`).map(e=>e.trim()).find(Boolean)??``,expanded:xr[`${t.id}:${e}`]===!0,onToggle:()=>Cr(`${t.id}:${e}`),children:a},`${t.id}:thinking:${e}`)};return(0,B.jsxs)(`article`,{className:`message assistant`,"data-transcript-key":e,children:[(0,B.jsx)(`div`,{className:`avatar`,children:`π`}),(0,B.jsxs)(`div`,{className:`message-body`,children:[(0,B.jsxs)(`div`,{className:`meta`,children:[t.agentIdentity?.name??`Super Pi`,(0,B.jsx)(`time`,{children:FE(t.createdAt)})]}),m.map((e,t)=>`blockIndex`in e?y(e.blockIndex):`text`in e?e.text?(0,B.jsx)(`div`,{className:`content`,children:(0,B.jsx)(tm,{source:e.text})},`t${t}`):null:v(e))]})]},e)}if(e.startsWith(`w:`)){let t=fr.get(e.slice(2));return t?(0,B.jsxs)(`div`,{"data-transcript-key":e,children:[n.some(e=>e.key===`stop:${t.id}`)&&(0,B.jsx)(`span`,{children:`停止中…`}),(0,B.jsx)($g,{workflow:t,names:pr,stopping:n.some(e=>e.key===`stop:${t.id}`),onStop:()=>Tr(t.id)},e)]},e):null}let t=hr.get(e.slice(2));return t?(0,B.jsxs)(`div`,{"data-transcript-key":e,children:[n.some(e=>e.key===`stop:${t.id}`)&&(0,B.jsx)(`span`,{children:`停止中…`}),(0,B.jsx)(gD,{run:t,stopping:n.some(e=>e.key===`stop:${t.id}`),name:pr.get(t.agentId)??``,expanded:!!tt[t.id],onToggle:()=>vr(t.id),onStop:()=>wr(t.id)},e)]},e):null})]}),(0,B.jsx)(_D,{messages:ti,running:F?.status===`running`,onSteer:ri,onInterrupt:ii,onSend:ai,onCancel:ni,onEdit:oi}),(0,B.jsxs)(`div`,{className:`stream-tail`,"data-stream-tail":`1`,"data-follow-tail":N.followTail?`true`:`false`,children:[Qe!==null&&(0,B.jsx)(bO,{height:Qe,onHeight:et}),(0,B.jsx)(`span`,{className:`stream-tail-status`,"data-run-status":F?.status??`idle`,"data-stream-state":u?F?.status===`waiting`?`waiting`:F?.status===`running`?`streaming`:ti.length?`waiting`:F?.status===`failed`?`failed`:`ready`:`waiting`,children:u?F?.status===`waiting`?`等待 LLM 返回`:F?.status===`running`?`Streaming · 正在生成`:ti.length?`Waiting · 消息排队中`:F?.status===`failed`?`运行失败`:F?.status===`stopped`?`已停止`:`就绪`:`连接中 / 等待连接`}),!N.followTail&&(0,B.jsx)(`button`,{type:`button`,className:`stream-tail-jump`,"data-jump-to-bottom":`1`,onClick:()=>{let e=A.current;e&&(aO(e),e.scrollTop=e.scrollHeight,zt(e,!1,!0))},children:`↓ 跳到底部`}),(0,B.jsx)(`span`,{className:`stream-tail-mode`,"data-follow-tail":N.followTail?`true`:`false`,children:N.followTail?`贴底`:`自由浏览`})]}),(lr.length>0||[...xe.values()].some(e=>e.placement===`aboveEditor`))&&(0,B.jsxs)(`div`,{className:`extui`,"data-extui-count":lr.length,children:[lr.map(e=>(0,B.jsx)(CD,{request:e.request,pending:n.some(t=>t.key===`answer:${e.conversationId}:${e.request.requestId}`),onAnswer:t=>Jn(e.conversationId,e.request.requestId,t)},e.request.requestId)),Er(`aboveEditor`)]}),(0,B.jsxs)(`form`,{onSubmit:ei,onPaste:Xr,onDragOver:Zr,onDragLeave:Qr,onDrop:$r,className:Ct?`composer-dropzone-active`:void 0,children:[(0,B.jsx)(`textarea`,{ref:ee,value:Vt,onCompositionStart:()=>{Et.current=!0},onCompositionEnd:()=>{Et.current=!1},onChange:e=>{Kt(e.target.value);let t=e.target.value,n=e.target.selectionStart??t.length,r=t.slice(0,n),i=r.lastIndexOf(`/`),a=r.slice(i+1),o=i>0?r[i-1]:``;i>=0&&(i===0||/\s/.test(o))&&/^[\w:-]*$/u.test(a)?Xt({visible:!0,query:a,rect:e.currentTarget.getBoundingClientRect()}):Xt({visible:!1,query:``,rect:null})},placeholder:F?Qn?`描述你要完成的任务(支持粘贴/拖放图片)…`:`描述你要完成的任务…`:`先创建会话`,disabled:!F,onKeyDown:e=>{if(!(Et.current||NE(e))){if(Yt.visible){if(e.key===`Escape`){e.preventDefault(),Xt({visible:!1,query:``,rect:null});return}if([`ArrowDown`,`ArrowUp`,`Enter`].includes(e.key)){e.preventDefault();return}}e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),e.currentTarget.form?.requestSubmit())}}}),Yt.visible&&Yt.rect&&(0,B.jsx)(mm,{query:Yt.query,anchorRect:Yt.rect,workspaceId:F?.workspaceId,command:Hn,onSelect:e=>{if(e.id.startsWith(`skill:`)){let t=e.id.slice(6),n=document.querySelector(`[data-selected-workspace]`)?.dataset.selectedWorkspace??F?.workspaceId,r=new URLSearchParams({name:t,...n?{workspaceId:n}:{}});fetch(`/api/skills/read?${r.toString()}`).then(async n=>{if(!n.ok){L(`读取技能失败`,`error`);return}let r=await n.json();typeof r.content==`string`&&qt({kind:`skill`,id:r.id??e.id,name:r.name??t,content:r.content})}).catch(()=>L(`读取技能失败`,`error`))}let t=ee.current?.selectionStart??Vt.length,n=Vt.slice(0,t),r=n.lastIndexOf(`/`),i=fm(e,Yt.query),a=`${n.slice(0,r)}/${i} ${Vt.slice(t)}`;Kt(a),Xt({visible:!1,query:``,rect:null})},onClose:()=>Xt({visible:!1,query:``,rect:null})}),_t.filter(e=>e.conversationId===F?.id).map(e=>(0,B.jsxs)(`div`,{className:`composer-notice`,"data-failed-send":e.id,role:`alert`,children:[(0,B.jsx)(`span`,{className:`composer-notice-mark`,"aria-hidden":`true`,children:`!`}),(0,B.jsxs)(`div`,{className:`composer-notice-body`,children:[(0,B.jsx)(`p`,{className:`composer-notice-title`,"data-failed-send-reason":`1`,children:e.reason?.trim()||`服务端没有接受这条消息。`}),(0,B.jsx)(`p`,{className:`composer-notice-text`,title:e.content,children:e.content})]}),(0,B.jsxs)(`div`,{className:`composer-notice-actions`,children:[(0,B.jsx)(`button`,{type:`button`,className:`composer-notice-action`,"data-failed-send-restore":`1`,disabled:!!(Vt||Ht.length),title:Vt||Ht.length?`输入框里已经有内容,先把这条留在下面`:`放回输入框,改完再发`,onClick:()=>{Gt(e.conversationId,t=>({...t,text:e.content,images:e.images})),vt(t=>t.filter(t=>t.id!==e.id))},children:`放回输入框`}),(0,B.jsx)(`button`,{type:`button`,className:`composer-notice-dismiss`,"data-failed-send-dismiss":`1`,onClick:()=>vt(t=>t.filter(t=>t.id!==e.id)),children:`丢弃`})]})]},e.id)),yt.filter(e=>e.conversationId===F?.id).map(e=>(0,B.jsxs)(`div`,{"data-upload-preview":e.id,children:[(0,B.jsx)(`img`,{src:e.url,alt:e.name,width:48,height:48}),(0,B.jsx)(`span`,{children:e.failed?`上传失败`:`上传中…`}),(0,B.jsx)(`button`,{type:`button`,onClick:()=>{gt.current.add(e.id),URL.revokeObjectURL(e.url),bt(t=>t.filter(t=>t.id!==e.id))},children:`移除`})]},e.id)),(Ht.length>0||Wt>0)&&(0,B.jsxs)(`div`,{className:`composer-attachments`,"data-composer-attachments":`1`,children:[Ht.map((e,t)=>(0,B.jsxs)(`div`,{className:`composer-attachment-item`,"data-composer-attachment-id":e.id,children:[(0,B.jsx)(`img`,{src:`/api/upload/${encodeURIComponent(F?.id??``)}/${encodeURIComponent(e.id)}`,alt:e.name||`已附图片`,className:`composer-attachment-thumb`,onClick:()=>St({url:`/api/upload/${encodeURIComponent(F?.id??``)}/${encodeURIComponent(e.id)}`,name:e.name,bytes:e.bytes}),title:`点击查看大图`}),(0,B.jsx)(`span`,{className:`composer-attachment-name`,title:e.name,children:e.name||`图片`}),(0,B.jsx)(`button`,{type:`button`,className:`composer-attachment-remove`,"data-composer-attachment-remove":e.id,onClick:()=>Zt(e=>e.filter((e,n)=>n!==t)),"aria-label":`移除 ${e.name||`图片`}`,title:`移除图片`,children:`✕`})]},e.id)),Wt>0&&(0,B.jsx)(`div`,{className:`composer-attachment-item composer-attachment-uploading`,children:(0,B.jsxs)(`span`,{children:[`图片上传中 (`,Wt,`)…`]})}),Ut.map(e=>(0,B.jsxs)(`div`,{className:`composer-attachment-item composer-attachment-skill`,"data-composer-skill-id":e.id,children:[(0,B.jsx)(`span`,{className:`composer-attachment-glyph`,"aria-hidden":`true`,children:`▤`}),(0,B.jsx)(`span`,{className:`composer-attachment-name`,title:e.name,children:e.name}),(0,B.jsx)(`button`,{type:`button`,className:`composer-attachment-remove`,"data-composer-skill-remove":e.id,onClick:()=>Jt(e.kind,e.id),"aria-label":`移除 ${e.name}`,title:`移除技能`,children:`✕`})]},`${e.kind}:${e.id}`))]}),(0,B.jsxs)(`div`,{className:`composer`,children:[(0,B.jsxs)(`div`,{className:`session-picker`,"data-session-picker":`1`,children:[(0,B.jsx)(TD,{kind:`agent`,label:ir?.name??`跟随 Pi 默认`,value:F?.agentId??ED,options:ar,disabled:!Ne||Ne.source===`unavailable`||Kn,note:cD(Ne),onChoose:cr}),(0,B.jsx)(TD,{kind:`model`,label:Yn?.label??(Te?`Pi 默认`:`读取中…`),value:Yn?`${Yn.provider}/${Yn.modelId}`:void 0,detail:sr?`来自 ${ir?.name}`:Yn&&Te?.source===`pi`&&!F?.model?`Pi 默认模型`:Yn?`${Yn.provider}/${Yn.modelId}`:void 0,options:er,disabled:!Zn||Kn,note:sD(`模型`,Te),onChoose:nr}),(0,B.jsx)(TD,{kind:`thinking`,label:Xn??(Te?`Pi 默认`:`读取中…`),value:Xn,options:tr,disabled:!Zn||Kn,note:sD(`思考等级`,Te),onChoose:rr})]}),(0,B.jsxs)(`div`,{className:`composer-hints`,children:[(0,B.jsxs)(`button`,{type:`button`,className:`composer-attach-btn`,"data-composer-attach":`1`,onClick:()=>Tt.current?.click(),disabled:!F||!Qn||Wt>0,title:F?Qn?`添加图片(支持剪贴板粘贴与拖拽)`:`当前模型不支持图片输入`:`请先创建或选择会话`,"aria-label":`添加图片`,children:[(0,B.jsx)(`span`,{"aria-hidden":`true`,children:`+`}),` 图片`]}),(0,B.jsx)(`input`,{ref:Tt,type:`file`,accept:`image/png,image/jpeg,image/gif,image/webp`,multiple:!0,style:{display:`none`},onChange:e=>{e.target.files?.length&&(Yr(Array.from(e.target.files)),e.target.value=``)}}),(0,B.jsx)(`span`,{children:`Enter 发送 · Shift + Enter 换行`})]}),(0,B.jsxs)(`div`,{className:`composer-actions`,children:[F?.status===`running`&&(0,B.jsx)(`button`,{type:`button`,className:`stop`,"data-stop-run":F.id,disabled:n.some(e=>e.key===`stop:${F.id}`),onClick:()=>Un({type:`run.stop`,conversationId:F.id},`stop:${F.id}`,e=>e),children:n.some(e=>e.key===`stop:${F.id}`)?`停止中…`:`停止`}),(0,B.jsx)(`button`,{className:`send ${F?.status===`running`?`send-queued`:``}`,"data-send-mode":F?.status===`running`?`queued`:`direct`,disabled:!Vt.trim()&&Ht.length===0||!F||Wt>0||!!si||Kn,title:F?si?`正在撤回:Pi 的历史还没截断完成,撤回结束后即可发送`:!Vt.trim()&&Ht.length===0?`请输入消息或添加图片后发送`:Wt>0?`图片上传中…`:F.status===`running`?`这一轮结束后发送(发送后可在上面的排队区取消或插队)`:void 0:`请先创建或选择会话`,children:si?`撤回中…`:F?.status===`running`?`排队发送 ↑`:`发送 ↑`})]})]})]}),Er(`belowEditor`)]})]}),(0,B.jsx)(pO,{side:`right`,width:Ve?30:Ye.rail,min:Ye.railMin,max:Ye.railMax,label:`调整右侧栏宽度`,onWidth:Ze}),fn&&(0,B.jsx)(Vg,{entries:I.index,complete:I.indexComplete,skipped:I.indexSkipped,onOpen:e=>{kn(e)},onClose:()=>pn(!1)}),mn&&(0,B.jsx)(Bg,{workspaceId:g,onOpen:e=>{kn({path:e.path,name:e.name,text:!0},e.line)},onClose:()=>hn(!1)},g),(0,B.jsxs)(`nav`,{className:`mobile-nav`,"aria-label":`移动端主导航`,children:[(0,B.jsxs)(`button`,{type:`button`,"data-mobile-nav":`workspaces`,className:Ue===`workspaces`?`active`:``,onClick:()=>We(`workspaces`),children:[`☰`,(0,B.jsx)(`span`,{children:`工作区`})]}),(0,B.jsxs)(`button`,{type:`button`,"data-mobile-nav":`chat`,className:Ue===`chat`?`active`:``,onClick:()=>We(`chat`),children:[`◉`,(0,B.jsx)(`span`,{children:`对话`})]}),(0,B.jsxs)(`button`,{type:`button`,"data-mobile-nav":`rail`,className:Ue===`rail`?`active`:``,onClick:()=>{We(`rail`),He(!1)},children:[`▣`,(0,B.jsx)(`span`,{children:`工具`})]})]}),` `,lt&&(0,B.jsx)(YE,{workspace:lt.workspace,x:lt.x,y:lt.y,notify:L,onClose:()=>ut(void 0)}),dt&&(0,B.jsx)(XE,{conversation:dt.conversation,x:dt.x,y:dt.y,notify:L,onRename:()=>void Pr(dt.conversation.id),onClose:()=>ft(void 0)}),S&&(0,B.jsx)(iD,{onClose:()=>C(!1),onCreate:Dr}),Vr&&(0,B.jsx)(sv,{workspaceId:g,theme:zr,onChooseTheme:e=>Br(e),onClose:()=>Hr(!1),agentCatalog:Ne,subagentCatalog:Fe,modelFilterRules:s.modelFilterRules??[],pendingSettings:n.some(e=>e.key===`model-rules`||e.key===`agent-directories`||e.key===`default-model`),onSetModelRules:e=>Un({type:`model.rules.set`,rules:e},`model-rules`,t=>({...t,modelFilterRules:e})),defaultModel:s.defaultModel,modelCatalog:De,onSetDefaultModel:e=>Un({type:`settings.defaultModel`,model:e?{provider:e.provider,modelId:e.modelId}:null},`default-model`,t=>{let n={...t};return e?n.defaultModel=e:delete n.defaultModel,n}),providers:ke,providerApis:je,onSetProvider:e=>{Hn({type:`providers.set`,provider:e})},onRemoveProvider:e=>{Hn({type:`providers.remove`,providerId:e})},onRemoveProviderModel:(e,t)=>{Hn({type:`providers.removeModel`,providerId:e,modelId:t})},customAgentDirs:s.customAgentDirs??[],onSetCustomAgentDirs:e=>Un({type:`agents.setCustomDirs`,dirs:e},`agent-directories`,t=>({...t,customAgentDirs:e})),onRescanAgents:()=>Hn({type:`agents.rescan`}),userNickname:fe,onSetUserNickname:me}),Ur&&(0,B.jsx)(t_,{onClose:()=>Wr(!1)}),Rr&&(0,B.jsx)(DD,{workspace:Rr,catalog:$n(Te,Rr),agents:Ne,onClose:()=>Lr(void 0),onRename:()=>{let e=Rr.id;Lr(void 0),Ar(`workspace`,e)},onSave:(e,t,n)=>Gr(Rr.id,e,t,n)}),xt&&(0,B.jsx)(qD,{image:xt,onClose:()=>St(void 0)}),(0,B.jsx)(zD,{todos:s.todosByConversation?.[F?.id??``]??[],tasks:(s.backgroundTasks??[]).filter(e=>e.conversationId===F?.id),collapsed:Ve,onToggle:()=>He(e=>!e),workspaceId:g,workspaceLabel:s.workspaces.find(e=>e.id===g)?.path,conversationId:F?.id,connected:u,files:I,onOpenFile:e=>void kn(e),onOpenChanged:Sn,activeTab:un,onSelectTab:dn,sendCommand:Hn,registerTerminalSink:le})]})}X_(Y_()),(0,ua.createRoot)(document.getElementById(`root`)).render((0,B.jsx)(z.StrictMode,{children:(0,B.jsx)(xO,{})}));export{l as a,s as i,y as n,d as r,mg as t};
|