@evandu/super-pi 0.1.130 → 0.1.131
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/agents/super-pi-documents/index.ts +92 -0
- package/agents/super-pi-knowledge/index.ts +32 -1
- package/agents/super-pi-task/core.ts +40 -0
- package/agents/super-pi-task/index.ts +15 -1
- package/agents/super-pi-web/index.ts +32 -0
- package/assets/fonts/LICENSE +92 -0
- package/assets/fonts/NotoSansSC-Bold.otf +0 -0
- package/assets/fonts/NotoSansSC-Regular.otf +0 -0
- package/dist/.super-pi-check-inputs.json +2 -2
- package/dist/client/.super-pi-client-sources.json +5 -5
- package/dist/client/assets/{CodeMirrorEditor-BNVBZZSS.js → CodeMirrorEditor-BlQhH3vs.js} +2 -2
- package/dist/client/assets/{dist-DmAOqr0M.js → dist-B1_1Ui9E.js} +1 -1
- package/dist/client/assets/{dist-GkIV1LTX.js → dist-B448EWTM.js} +1 -1
- package/dist/client/assets/{dist-CiSGSVBZ.js → dist-B68Q8uXX.js} +1 -1
- package/dist/client/assets/{dist-DB5M5fZG.js → dist-BFlq-kiF.js} +1 -1
- package/dist/client/assets/{dist-BykVFExd.js → dist-BXVFgriA.js} +1 -1
- package/dist/client/assets/{dist-CZ9I2JCd.js → dist-BcE6tJvc.js} +1 -1
- package/dist/client/assets/{dist-BhJGK8-b.js → dist-ByIqsb5-.js} +1 -1
- package/dist/client/assets/{dist-DZnUERoW.js → dist-C6qSkkeN.js} +1 -1
- package/dist/client/assets/{dist-BKp4AWEJ.js → dist-C9AkgNbt.js} +1 -1
- package/dist/client/assets/{dist-CRzRB9k3.js → dist-COp25nhe.js} +1 -1
- package/dist/client/assets/{dist-CMnvChDX.js → dist-CpuexUlh.js} +1 -1
- package/dist/client/assets/{dist-ChszWGDv.js → dist-CtdlYgGc.js} +1 -1
- package/dist/client/assets/{dist-Dq4-QFAJ.js → dist-Cybsoapc.js} +1 -1
- package/dist/client/assets/{dist-Ur37340K.js → dist-D6PoSxR5.js} +1 -1
- package/dist/client/assets/{dist-C90MPTnk.js → dist-D7bj81KQ.js} +1 -1
- package/dist/client/assets/{dist-BBW2SE_R.js → dist-DP2ygAFF.js} +1 -1
- package/dist/client/assets/{dist-B61RSa-K.js → dist-DXNDtyHP.js} +1 -1
- package/dist/client/assets/{dist-CWYRjnj-.js → dist-DxoWS5MH.js} +1 -1
- package/dist/client/assets/{dist-Cxerc7Bb.js → dist-Fhkmvjdx.js} +1 -1
- package/dist/client/assets/{dist-BDygQgZD.js → dist-hfpd-aWa.js} +1 -1
- package/dist/client/assets/{dist-B2nPVdKh.js → dist-lQWWWxh9.js} +1 -1
- package/dist/client/assets/{dist-HdeIBl2J.js → dist-r5Af94tH.js} +1 -1
- package/dist/client/assets/{index-D_c-CYAr.js → index-BApJ3Zbq.js} +3 -3
- package/dist/client/index.html +1 -1
- package/dist/server/application/document-service.d.ts +68 -0
- package/dist/server/application/document-service.js +120 -0
- package/dist/server/application/run-service.js +49 -7
- package/dist/server/documents.d.ts +152 -0
- package/dist/server/documents.js +998 -0
- package/dist/server/file-changes.js +6 -4
- package/dist/server/files.d.ts +32 -0
- package/dist/server/files.js +28 -0
- package/dist/server/http-server.js +113 -2
- package/dist/server/index.js +13 -1
- package/dist/server/inline-thinking.d.ts +90 -0
- package/dist/server/inline-thinking.js +181 -0
- package/dist/server/knowledge.d.ts +24 -14
- package/dist/server/knowledge.js +47 -32
- package/dist/server/pi-session-pool.js +2 -1
- package/dist/server/pi-session.d.ts +4 -0
- package/dist/server/pi-session.js +11 -0
- package/dist/server/presentations/schema.d.ts +120 -0
- package/dist/server/presentations/schema.js +128 -0
- package/dist/server/runtime.d.ts +46 -0
- package/dist/server/runtime.js +150 -16
- package/dist/server/server-context.d.ts +3 -0
- package/dist/server/subagents.js +33 -6
- package/dist/server/web.d.ts +24 -0
- package/dist/server/web.js +180 -0
- package/package.json +31 -5
- package/skills/presentation/SKILL.md +30 -0
- package/skills/presentation/references/data.md +10 -0
- package/skills/presentation/references/quality.md +12 -0
- package/skills/presentation/references/story.md +12 -0
- package/skills/presentation/references/templates-and-editing.md +11 -0
- package/skills/presentation/references/visual-system.md +10 -0
|
@@ -44,10 +44,10 @@ 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 Zp(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 Qp(e){let t=e.startsWith(`:`),n=e.endsWith(`:`);return t&&n?`center`:n?`right`:t?`left`:null}function $p(e,t){let n=e.slice(0,t);for(;n.length<t;)n.push(``);return n}var em={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:`Ω`},tm={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:``},nm=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(`.`)),rm={C:`ℂ`,H:`ℍ`,N:`ℕ`,P:`ℙ`,Q:`ℚ`,R:`ℝ`,Z:`ℤ`},im={B:`ℬ`,E:`ℰ`,F:`ℱ`,H:`ℋ`,I:`ℐ`,L:`ℒ`,M:`ℳ`,R:`ℛ`,e:`ℯ`,g:`ℊ`,o:`ℴ`},am={mathbb:e=>rm[e]??e.toUpperCase(),mathcal:e=>im[e]??e.toUpperCase(),mathscr:e=>im[e]??e.toUpperCase()},om=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`]),sm={hat:`^`,widehat:`^`,bar:`‾`,overline:`‾`,tilde:`~`,widetilde:`~`,vec:`→`,dot:`·`,ddot:`··`,check:`ˇ`,breve:`˘`,acute:`´`,grave:"`"},cm=new Set([`(`,`)`,`[`,`]`,`|`,`/`,`<`,`>`]),lm=new Set([`pmatrix`,`bmatrix`,`Bmatrix`,`vmatrix`,`Vmatrix`,`matrix`,`array`,`cases`,`aligned`,`align`,`alignat`,`split`,`gather`,`gathered`,`equation`,`smallmatrix`,`dcases`,`subarray`]);function um(e){let t=[],n=``,r=()=>{n&&=(t.push(...mm(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(om.has(s))continue;if(s===`begin`){let n=Tp(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=fm(e,a),n=fm(e,t.next);a=n.next,i({type:`math-fraction`,numerator:um(t.content),denominator:um(n.content)});continue}if(s===`sqrt`){let t,n=a;if(e[n]===`[`){let r=dm(e,n);t=um(r.content),n=r.next}let r=fm(e,n);a=r.next,i({type:`math-root`,...t?{index:t}:{},radicand:um(r.content)});continue}if(s===`text`||s===`mathrm`||s===`textrm`||s===`mathbf`||s===`mathit`||s===`mathsf`||s===`mathtt`||s===`operatorname`||s===`textbf`){let t=Tp(e,a);a=t.next,i({type:`math-text`,value:t.content});continue}if(s in am){let t=fm(e,a);a=t.next;let n=am[s];i({type:`math-text`,value:[...t.content].map(n).join(``)});continue}if(s in sm){let t=fm(e,a);a=t.next,i({type:`math-text`,value:`${hm(um(t.content))}${sm[s]}`});continue}if(s in em){i({type:`math-identifier`,value:em[s]});continue}if(s in tm){let e=tm[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(nm.has(s)){i({type:`math-function`,value:s});continue}if(lm.has(s))continue;i({type:`math-unsupported`,value:`\\${s}`,reason:`\\${s} 不支持`})}else if(o===`{`){let n=Tp(e,a);t.push(...um(n.content)),a=n.next}else if(o===`}`||o===`&`||o===`$`)a+=1;else if(o===`^`||o===`_`){r();let n=fm(e,a+1);a=n.next,pm(t,o===`^`?`sup`:`sub`,um(n.content))}else cm.has(o)?(i({type:`math-text`,value:o}),a+=1):(n+=o,a+=1)}return r(),t}function dm(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 fm(e,t){let n=e[t];if(n===void 0)return{content:``,next:t};if(n===`{`)return Tp(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 pm(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 mm(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(nm.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 hm(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`${hm(e.base)}${e.sub?`_{${hm(e.sub)}}`:``}${e.sup?`^{${hm(e.sup)}}`:``}`;case`math-fraction`:return`\\frac{${hm(e.numerator)}}{${hm(e.denominator)}}`;case`math-root`:return`\\sqrt{${hm(e.radicand)}}`;case`math-row-break`:return`\\\\`;case`math-unsupported`:return e.value;default:return``}}).join(``)}function gm({source:e}){let t=(0,B.useMemo)(()=>Jp(e),[e]);return(0,V.jsx)(`div`,{className:`md`,"data-md":`1`,children:t.map((e,t)=>ym(e,t))})}function _m({source:e}){let t=(0,B.useMemo)(()=>Ip(e),[e]);return(0,V.jsx)(`span`,{className:`md md-inline`,children:t.map((e,t)=>xm(e,t))})}function vm(e){return _p(e).map((e,t)=>e.kind===`plain`?(0,V.jsx)(`span`,{children:e.text},t):(0,V.jsx)(`span`,{className:`code-token-${e.kind}`,children:e.text},t))}function ym(e,t){switch(e.type){case`paragraph`:return(0,V.jsx)(`p`,{className:`md-p`,children:e.children.map((e,t)=>xm(e,t))},t);case`heading`:{let n=`h${Math.min(6,Math.max(1,e.level))}`;return(0,V.jsx)(n,{className:`md-h md-h${e.level}`,children:e.children.map((e,t)=>xm(e,t))},t)}case`code-block`:return(0,V.jsx)(`pre`,{className:`md-pre`,"data-md-lang":e.lang||void 0,children:(0,V.jsx)(`code`,{className:`md-code`,children:vm(e.value)})},t);case`list`:{let n=e.items.map((e,t)=>(0,V.jsx)(`li`,{className:`md-li`,children:e.map((e,t)=>ym(e,t))},t));return e.ordered?(0,V.jsx)(`ol`,{className:`md-ol`,start:e.start>1?e.start:void 0,children:n},t):(0,V.jsx)(`ul`,{className:`md-ul`,children:n},t)}case`blockquote`:return(0,V.jsx)(`blockquote`,{className:`md-quote`,children:e.children.map((e,t)=>ym(e,t))},t);case`rule`:return(0,V.jsx)(`hr`,{className:`md-rule`},t);case`table`:return(0,V.jsx)(`div`,{className:`md-table-wrap`,children:(0,V.jsxs)(`table`,{className:`md-table`,children:[(0,V.jsx)(`thead`,{children:(0,V.jsx)(`tr`,{children:e.head.map((t,n)=>(0,V.jsx)(`th`,{style:bm(e.align[n]),children:t.map((e,t)=>xm(e,t))},n))})}),(0,V.jsx)(`tbody`,{children:e.rows.map((t,n)=>(0,V.jsx)(`tr`,{children:t.map((t,n)=>(0,V.jsx)(`td`,{style:bm(e.align[n]),children:t.map((e,t)=>xm(e,t))},n))},n))})]})},t);case`math-block`:return(0,V.jsx)(Sm,{source:e.source},t);default:return null}}var bm=e=>e?{textAlign:e}:void 0;function xm(e,t){switch(e.type){case`text`:return(0,V.jsx)(B.Fragment,{children:e.value},t);case`code`:return(0,V.jsx)(`code`,{className:`md-code-inline`,children:e.value},t);case`strong`:return(0,V.jsx)(`strong`,{className:`md-strong`,children:e.children.map((e,t)=>xm(e,t))},t);case`em`:return(0,V.jsx)(`em`,{className:`md-em`,children:e.children.map((e,t)=>xm(e,t))},t);case`del`:return(0,V.jsx)(`del`,{className:`md-del`,children:e.children.map((e,t)=>xm(e,t))},t);case`break`:return(0,V.jsx)(`br`,{className:`md-break`},t);case`math`:return(0,V.jsx)(Cm,{source:e.source},t);case`link`:{let n=xp(e.href);return n?(0,V.jsx)(`a`,{className:`md-link`,href:n,title:e.title,target:`_blank`,rel:`noopener noreferrer nofollow`,children:e.children.map((e,t)=>xm(e,t))},t):(0,V.jsx)(B.Fragment,{children:e.children.map((e,t)=>xm(e,t))},t)}default:return null}}function Sm({source:e}){let t=(0,B.useMemo)(()=>um(e),[e]);return(0,V.jsx)(`div`,{className:`md-math md-math-block`,"data-md-math":`block`,"data-md-math-source":e,children:t.map((e,t)=>wm(e,t))})}function Cm({source:e}){let t=(0,B.useMemo)(()=>um(e),[e]);return(0,V.jsx)(`span`,{className:`md-math md-math-inline`,"data-md-math":`inline`,"data-md-math-source":e,children:t.map((e,t)=>wm(e,t))})}function wm(e,t){switch(e.type){case`math-text`:return(0,V.jsx)(`span`,{className:`md-m-text`,children:e.value},t);case`math-number`:return(0,V.jsx)(`span`,{className:`md-m-number`,children:e.value},t);case`math-identifier`:return(0,V.jsx)(`i`,{className:`md-m-var`,children:e.value},t);case`math-operator`:return(0,V.jsx)(`span`,{className:`md-m-op`,children:e.value},t);case`math-function`:return(0,V.jsx)(`span`,{className:`md-m-fn`,children:e.value},t);case`math-row-break`:return(0,V.jsx)(`br`,{className:`md-m-rowbreak`},t);case`math-unsupported`:return(0,V.jsx)(`span`,{className:`md-m-unsupported`,"data-md-math-unsupported":`1`,title:e.reason,children:e.value},t);case`math-script`:return(0,V.jsxs)(`span`,{className:`md-m-script`,children:[(0,V.jsx)(`span`,{className:`md-m-base`,children:e.base.map((e,t)=>wm(e,t))}),e.sup&&(0,V.jsx)(`sup`,{className:`md-m-sup`,children:e.sup.map((e,t)=>wm(e,t))}),e.sub&&(0,V.jsx)(`sub`,{className:`md-m-sub`,children:e.sub.map((e,t)=>wm(e,t))})]},t);case`math-fraction`:return(0,V.jsxs)(`span`,{className:`md-m-frac`,children:[(0,V.jsx)(`span`,{className:`md-m-num`,children:e.numerator.map((e,t)=>wm(e,t))}),(0,V.jsx)(`span`,{className:`md-m-den`,children:e.denominator.map((e,t)=>wm(e,t))})]},t);case`math-root`:return(0,V.jsxs)(`span`,{className:`md-m-root`,children:[(0,V.jsx)(`span`,{className:`md-m-radical`,children:`√`}),e.index&&(0,V.jsx)(`sup`,{className:`md-m-index`,children:e.index.map((e,t)=>wm(e,t))}),(0,V.jsx)(`span`,{className:`md-m-body`,children:e.radicand.map((e,t)=>wm(e,t))})]},t);default:return null}}var Tm=[[`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:t,description:t,scope:`builtin`})),Em=e=>e.normalize(`NFKD`).replace(/\p{M}/gu,``).toLowerCase();function Dm(e,t){let n=Em(t.trim());return e.examples?.find(t=>Em(t).includes(n)&&t!==e.id)??e.id}function Om(e,t){let n=Em(t.trim());return n?e.filter(e=>Em(e.id).includes(n)||Em(e.label).includes(n)||Em(e.description).includes(n)||e.examples?.some(e=>Em(e).includes(n))):e}function km({query:e,anchorRect:t,command:n,workspaceId:r,promptCatalog:i,onSelect:a,onClose:o}){let[s,c]=(0,B.useState)(0),[l,u]=(0,B.useState)(Tm),d=(0,B.useRef)(null),f=(0,B.useRef)([]);(0,B.useEffect)(()=>{r&&n({type:`prompt.catalog.fetch`,workspaceId:r})},[r,n]),(0,B.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]}});u([...Tm.filter(e=>e.id!==`skill`),...n])}).catch(()=>{}),()=>{e=!0}},[r]);let p=[{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`})}],m=(i&&i.workspaceId===r?i.prompts:[]).map(e=>({id:e.name,label:e.description,description:e.description,argumentHint:e.argumentHint,scope:e.scope,shadowed:[...p,...l].some(t=>t.id===e.name)})),h=Om([...p,...l,...m],e),g=h.length===0?-1:Math.min(Math.max(s,0),h.length-1),_=e=>c(t=>h.length?Math.min(Math.max(t+e,0),h.length-1):0);(0,B.useEffect)(()=>{let e=e=>{d.current?.contains(e.target)||o()};return window.addEventListener(`mousedown`,e),()=>window.removeEventListener(`mousedown`,e)},[o]),(0,B.useEffect)(()=>{c(0)},[e]),(0,B.useLayoutEffect)(()=>{g>=0&&f.current[g]?.scrollIntoView({block:`nearest`})},[g]);let v={position:`fixed`,left:Math.max(8,Math.min(t.left,window.innerWidth-360)),bottom:Math.max(8,window.innerHeight-t.top+6),zIndex:200},y=e=>{if(e.key===`Escape`)e.preventDefault(),o();else if(e.key===`ArrowDown`)e.preventDefault(),_(1);else if(e.key===`ArrowUp`)e.preventDefault(),_(-1);else if(e.key===`Home`)e.preventDefault(),c(0);else if(e.key===`End`)e.preventDefault(),c(h.length-1);else if(e.key===`Enter`){e.preventDefault();let t=h[g];if(!t)return;t.action?(t.action(),o()):a(t)}};return(0,B.useEffect)(()=>(window.addEventListener(`keydown`,y),()=>window.removeEventListener(`keydown`,y))),(0,V.jsx)(`div`,{ref:d,className:`slash-menu`,style:v,role:`listbox`,"aria-label":`斜杠命令`,children:h.length===0?(0,V.jsxs)(`div`,{className:`slash-menu-empty`,children:[`没有匹配「`,e,`」的命令`]}):h.map((e,t)=>(0,V.jsxs)(`button`,{ref:e=>{f.current[t]=e},type:`button`,role:`option`,"aria-selected":t===g,className:`slash-menu-item${t===g?` selected`:``}`,"data-slash-command":e.id,onClick:()=>{e.action?(e.action(),o()):a(e)},onMouseEnter:()=>c(t),children:[(0,V.jsxs)(`span`,{className:`slash-menu-item-id`,children:[`/`,e.id,e.argumentHint?` `+e.argumentHint:``]}),(0,V.jsx)(`span`,{className:`slash-menu-item-sep`,"aria-hidden":`true`,children:` — `}),(0,V.jsx)(`span`,{className:`slash-menu-item-label`,children:e.label}),(0,V.jsx)(`span`,{className:`slash-menu-item-scope`,"data-slash-command-scope":e.scope??`builtin`,children:e.shadowed?`Built-in command wins`:e.scope===`project`?`Project prompt`:e.scope===`user`?`User prompt`:`Pi built-in`}),e.examples?.length?(0,V.jsx)(`span`,{className:`slash-menu-item-examples`,children:e.examples.slice(0,2).join(` · `)}):null]},e.id))})}var Am=class extends B.Component{state={error:null};static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){console.error(`[SuperPi ErrorBoundary captured error]:`,e,t)}reset=()=>{this.setState({error:null})};render(){let{error:e}=this.state;return e?this.props.fallback?this.props.fallback(e,this.reset):(0,V.jsxs)(`div`,{className:`error-boundary-card`,"data-error-boundary":`1`,children:[(0,V.jsxs)(`div`,{className:`error-boundary-head`,children:[(0,V.jsx)(`span`,{className:`error-boundary-icon`,"aria-hidden":`true`,children:`⚠️`}),(0,V.jsx)(`strong`,{children:`视图渲染遇到异常`})]}),(0,V.jsx)(`p`,{className:`error-boundary-msg`,children:e.message||`未知组件错误`}),(0,V.jsx)(`button`,{type:`button`,className:`error-boundary-retry`,onClick:this.reset,children:`重试`})]}):this.props.children}};function jm(){}jm.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(Mm(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 Mm(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 jm;var Nm=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,Pm=/\S/,Fm=new jm;Fm.equals=function(e,t){return this.options.ignoreCase&&(e=e.toLowerCase(),t=t.toLowerCase()),e===t||this.options.ignoreWhitespace&&!Pm.test(e)&&!Pm.test(t)},Fm.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]&&Nm.test(t[n])&&Nm.test(t[n+2])&&(t[n]+=t[n+2],t.splice(n+1,2),n--);return t};var Im=new jm;Im.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 Lm(e,t,n){return Im.diff(e,t,n)}var Rm=new jm;Rm.tokenize=function(e){return e.split(/(\S.+?[.!?])(?=\s+|$)/)};var zm=new jm;zm.tokenize=function(e){return e.split(/([{}:;,]|\s+)/)};function Bm(e){"@babel/helpers - typeof";return Bm=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},Bm(e)}var Vm=Object.prototype.toString,Hm=new jm;Hm.useLongestToken=!0,Hm.tokenize=Im.tokenize,Hm.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(Um(e,null,null,i),i,` `)},Hm.equals=function(e,t){return jm.prototype.equals.call(Hm,e.replace(/,([\r\n])/g,`$1`),t.replace(/,([\r\n])/g,`$1`))};function Um(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(Vm.call(e)===`[object Array]`){for(t.push(e),o=Array(e.length),n.push(o),a=0;a<e.length;a+=1)o[a]=Um(e[a],t,n,r,i);return t.pop(),n.pop(),o}if(e&&e.toJSON&&(e=e.toJSON()),Bm(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]=Um(e[c],t,n,r,c);t.pop(),n.pop()}else o=e;return o}var Wm=new jm;Wm.tokenize=function(e){return e.slice()},Wm.join=Wm.removeEmpty=function(e){return e};function Gm(e,t){let n=Lm(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 Km(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 qm(e){return Array.isArray?Array.isArray(e):rh(e)===`[object Array]`}function Jm(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 Ym(e){return e==null?``:Jm(e)}function Xm(e){return typeof e==`string`}function Zm(e){return typeof e==`number`}function Qm(e){return e===!0||e===!1||eh(e)&&rh(e)==`[object Boolean]`}function $m(e){return typeof e==`object`}function eh(e){return $m(e)&&e!==null}function th(e){return e!=null}function nh(e){return!e.trim().length}function rh(e){return e==null?e===void 0?`[object Undefined]`:`[object Null]`:Object.prototype.toString.call(e)}var ih=`Incorrect 'index' type`,ah=`Invalid doc index: must be a non-negative integer within the bounds of the docs array`,oh=e=>`Invalid value for key ${e}`,sh=e=>`Pattern length exceeds max of ${e}.`,ch=e=>`Missing ${e} property in key`,lh=e=>`Property 'weight' in key '${e}' must be a positive integer`,uh=`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.`,dh=Object.prototype.hasOwnProperty,fh=class{constructor(e){this._keys=[],this._keyMap={};let t=0;e.forEach(e=>{let n=ph(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 ph(e){let t=null,n=null,r=null,i=1,a=null;if(Xm(e)||qm(e))r=e,t=mh(e),n=hh(e);else{if(!dh.call(e,`name`))throw Error(ch(`name`));let o=e.name;if(r=o,dh.call(e,`weight`)&&e.weight!==void 0&&(i=e.weight,i<=0))throw Error(lh(hh(o)));t=mh(o),n=hh(o),a=e.getFn??null}return{path:t,id:n,weight:i,src:r,getFn:a}}function mh(e){return qm(e)?e:e.split(`.`)}function hh(e){return qm(e)?e.join(`.`):e}function gh(e,t){let n=[],r=!1,i=(e,t,a,o)=>{if(th(e)){if(!t[a])n.push(o===void 0?e:{v:e,i:o});else{let s=e[t[a]];if(!th(s))return;if(a===t.length-1&&(Xm(s)||Zm(s)||Qm(s)||typeof s==`bigint`))n.push(o===void 0?Ym(s):{v:Ym(s),i:o});else if(qm(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,Xm(t)?t.split(`.`):t,0),r?n:n[0]}var _h={includeMatches:!1,findAllMatches:!1,minMatchCharLength:1},vh={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},yh={location:0,threshold:.6,distance:100},bh={useExtendedSearch:!1,useTokenSearch:!1,tokenize:void 0,tokenMatch:`any`,getFn:gh,ignoreLocation:!1,ignoreFieldNorm:!1,fieldNormWeight:1},Y=Object.freeze({...vh,..._h,...yh,...bh});function xh(e){return e>=9&&e<=13||e===32||e===160}function Sh(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++)xh(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 Ch=class{constructor({getFn:e=Y.getFn,fieldNormWeight:t=Y.fieldNormWeight}={}){this.norm=Sh(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(Xm(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(ah);if(Xm(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(ah);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!th(e)||nh(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(th(i)){if(qm(i)){let e=[];for(let t=0,n=i.length;t<n;t+=1){let n=i[t];if(th(n)){if(Xm(n)){if(!nh(n)){let r={v:n,i:t,n:this.norm.get(n)};e.push(r)}}else if(th(n.v)){let t=Xm(n.v)?n.v:Ym(n.v);if(!nh(t)){let r={v:t,i:n.i,n:this.norm.get(t)};e.push(r)}}}}n.$[t]=e}else if(Xm(i)&&!nh(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 wh(e,t,{getFn:n=Y.getFn,fieldNormWeight:r=Y.fieldNormWeight}={}){let i=new Ch({getFn:n,fieldNormWeight:r});return i.setKeys(e.map(ph)),i.setSources(t),i.create(),i}function Th(e,{getFn:t=Y.getFn,fieldNormWeight:n=Y.fieldNormWeight}={}){let{keys:r,records:i}=e,a=new Ch({getFn:t,fieldNormWeight:n});return a.setKeys(r),a.setIndexRecords(i),a}function Eh(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(sh(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=Eh(_,s);e.length?c&&(w.indices=e):w.isMatch=!1}return w}function Oh(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 kh(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 Ah={ł:`l`,Ł:`L`,đ:`d`,Đ:`D`,ø:`o`,Ø:`O`,ħ:`h`,Ħ:`H`,ŧ:`t`,Ŧ:`T`,ı:`i`,ß:`ss`},jh=RegExp(`[`+Object.keys(Ah).join(``)+`]`,`g`),Mh=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(jh,e=>Ah[e]):e=>e,Nh=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?Mh(e):e,this.pattern=e,this.chunks=[],!this.pattern.length)return;let u=(e,t)=>{this.chunks.push({pattern:e,alphabet:Oh(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?Mh(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=kh(u)),p}},Ph=new Set([`fuzzy`,`include`]);function Fh(e){return e.startsWith(`inverse`)}var Ih=[{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 Nh(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)}}}}],Lh=Ih.length,Rh=`\0`,zh=`|`;function Bh(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 Vh(e,t){let n=e.match(t);return n?n[1]:null}function Hh(e,t={}){return e.replace(/\\\|/g,Rh).split(zh).map(e=>{let n=Bh(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<Lh;){let e=Ih[o],n=Vh(i,e.multiRegex);n&&(r.push(e.create(n,t)),a=!0)}if(!a)for(o=-1;++o<Lh;){let e=Ih[o],n=Vh(i,e.singleRegex);if(n){r.push(e.create(n,t));break}}}return r})}var Uh=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?Mh(e):e,this.pattern=e,this.query=Hh(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?Mh(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,Fh(r.type)&&(c=!0),n&&(Ph.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=kh(o)),e}}return{isMatch:!1,score:1}}},Wh=[];function Gh(...e){Wh.push(...e)}function Kh(e,t){for(let n=0,r=Wh.length;n<r;n+=1){let r=Wh[n];if(r.condition(e,t))return new r(e,t)}return new Nh(e,t)}var qh={AND:`$and`,OR:`$or`},Jh={PATH:`$path`,PATTERN:`$val`},Yh=e=>!!(e[qh.AND]||e[qh.OR]),Xh=e=>!!e[Jh.PATH],Zh=e=>!qm(e)&&$m(e)&&!Yh(e),Qh=e=>({[qh.AND]:Object.keys(e).map(t=>({[t]:e[t]}))});function $h(e,t,{auto:n=!0}={}){let r=e=>{if(Xm(e)){let r={keyId:null,pattern:e};return n&&(r.searcher=Kh(e,t)),r}let i=Object.keys(e),a=Xh(e);if(!a&&i.length>1&&!Yh(e))return r(Qh(e));if(Zh(e)){let r=a?e[Jh.PATH]:i[0],o=a?e[Jh.PATTERN]:e[r];if(!Xm(o))throw Error(oh(r));let s={keyId:hh(r),pattern:o};return n&&(s.searcher=Kh(o,t)),s}let o={children:[],operator:i[0]};return i.forEach(t=>{let n=e[t];qm(n)&&n.forEach(e=>{o.children.push(r(e))})}),o};return Yh(e)||(e=Qh(e)),r(e)}function eg(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 tg(e,{ignoreFieldNorm:t=Y.ignoreFieldNorm}){e.forEach(e=>{e.score=eg(e.matches,{ignoreFieldNorm:t})})}var ng=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 rg(e){let t=[];return e.matches.forEach(e=>{if(!th(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 ig(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=rg(e)),r&&(a.score=e.score),a})}var ag=/[\p{L}\p{M}\p{N}_]+/gu,og=new WeakSet;function sg(e){og.has(e)||(og.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 cg(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||sg(e),t=>t.match(e)||[]):e=>e.match(ag)||[]}function lg({isCaseSensitive:e=!1,ignoreDiacritics:t=!1,tokenize:n}={}){let r=cg(n);return{tokenize(n){return e||(n=n.toLowerCase()),t&&(n=Mh(n)),r(n)}}}var ug=class{static condition(e,t){return t.useTokenSearch}constructor(e,t){this.options=t,this.analyzer=lg({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 Nh(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=kh(t)),this.combineAll&&(this.useMask?c.matchedMask=a:c.matchedTerms=o,c.termCount=this.numTerms),c}};function dg(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 fg(e,t,n,r){let{i,v:a,$:o}=t;if(a!==void 0)dg(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)dg(e,t.v,i,r);else dg(e,n.v,i,r)}}}function pg(e,t,n){let r={fieldCount:0,df:new Map,docFieldCount:new Map,docTermFieldHits:new Map};for(let i of e)fg(r,i,t,n);return r}function mg(e,t,n,r){fg(e,t,n,r)}function hg(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 gg(e,t){if(t.length===0)return;let n=Array.from(new Set(t)).sort((e,t)=>e-t);for(let t of n)hg(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 _g=class{constructor(e,t,n){this.options={...Y,...t},this.options.useExtendedSearch,this.options.useTokenSearch,this._keyStore=new fh(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=Kh(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 Ch))throw Error(ih);if(this._myIndex=t||wh(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight}),this.options.useTokenSearch){let e=lg({isCaseSensitive:this.options.isCaseSensitive,ignoreDiacritics:this.options.ignoreDiacritics,tokenize:this.options.tokenize});this._invertedIndex=pg(this._myIndex.records,this._myIndex.keys.length,e)}this._invalidateSearcherCache()}add(e){if(!th(e))return;this._docs.push(e);let t=this._myIndex.add(e,this._docs.length-1);if(this._invertedIndex&&t){let e=lg({isCaseSensitive:this.options.isCaseSensitive,ignoreDiacritics:this.options.ignoreDiacritics,tokenize:this.options.tokenize});mg(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&&gg(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(ah);this._invertedIndex&&gg(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(Xm(e)&&!e.trim()){let e=this._docs.map((e,t)=>({item:e,refIndex:t}));return Zm(n)&&n>-1&&(e=e.slice(0,n)),e}let c=a&&Zm(n)&&n>0&&Xm(e),l=o,u=(e,t)=>l(e,t)||e.idx-t.idx,d;if(c){let t=new ng(n,u);Xm(this._docs[0])?this._searchStringList(e,{heap:t,ignoreFieldNorm:s}):this._searchObjectList(e,{heap:t,ignoreFieldNorm:s}),d=t.extractSorted()}else d=Xm(e)?Xm(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e),tg(d,{ignoreFieldNorm:s}),a&&d.sort(Xm(e)?u:l),Zm(n)&&n>-1&&(d=d.slice(0,n));return ig(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(!th(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=eg(r.matches,{ignoreFieldNorm:n}),t.insert(r)):o.push(r)}}}),o}_searchLogical(e){let t=$h(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===qh.AND)return[]}return s},i=this._myIndex.records,a=new Map,o=[];return i.forEach(({$:e,i:n})=>{if(th(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(!th(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=eg(r.matches,{ignoreFieldNorm:n}),t.insert(r)):s.push(r)}}),s}_findMatches({key:e,value:t,searcher:n}){if(!th(t))return[];let r=[];if(qm(t))t.forEach(({v:t,i,n:a})=>{if(!th(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}};_g.version=`7.5.0`,_g.createIndex=wh,_g.parseIndex=Th,_g.config=Y,_g.match=function(e,t,n){if(n&&n.useTokenSearch)throw Error(uh);return Kh(e,{...Y,...n}).searchIn(t)},_g.parseQuery=$h,Gh(Uh),Gh(ug),_g.use=function(...e){e.forEach(e=>Gh(e))};var vg=_g;function yg(e){let t=e.slice(e.lastIndexOf(`/`)+1),n=t.lastIndexOf(`.`);return n<=0?``:t.slice(n+1).toLowerCase()}var bg={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`},xg={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 Sg(e){let t=xg[e.slice(e.lastIndexOf(`/`)+1).toLowerCase()];if(t)return t;let n=yg(e);return n?bg[n]??`generic`:`generic`}var Cg={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 wg({path:e,category:t,size:n=14}){let r=t??Sg(e??``),i=Cg[r]??Cg.generic;return(0,V.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,V.jsx)(`path`,{d:e},t))})}var Tg=`modulepreload`,Eg=function(e){return`/`+e},Dg={},Og=function(e){return e.pathname.endsWith(`.css`)},kg=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},Ag=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=Eg(t,n);let r=s(t),i=Og(r);return kg(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`:Tg,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)})},jg=4e3,Mg=(0,B.lazy)(()=>Ag(()=>import(`./CodeMirrorEditor-BNVBZZSS.js`).then(e=>({default:e.CodeMirrorEditor})),[])),Ng=class extends Error{status;body;constructor(e,t){super(t.error||`HTTP ${e}`),this.status=e,this.body=t,this.name=`ApiError`}},Pg=15e3,Fg=e=>new Ng(408,{error:`请求超时:${Pg/1e3} 秒内服务端没有响应`,code:`timeout`,details:{path:e}});async function Ig(e,t){let n=new AbortController,r=setTimeout(()=>n.abort(),Pg);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 Ng(r.status,i??{error:`HTTP ${r.status}`});return i}catch(t){throw n.signal.aborted?Fg(e):t}finally{clearTimeout(r)}}var Lg=e=>e instanceof Ng?e:new Ng(0,{error:e instanceof Error?e.message:`读取失败`}),Rg=e=>encodeURIComponent(e),zg=(e,t)=>`/api/files?workspaceId=${Rg(e)}&path=${Rg(t)}`,Bg=(e,t)=>`/api/file?workspaceId=${Rg(e)}&path=${Rg(t)}`,Vg=(e,t)=>`/api/file?workspaceId=${Rg(e)}&path=${Rg(t)}&meta=1`,Hg=(e,t)=>`/api/files?workspaceId=${Rg(e)}&q=${Rg(t)}`,Ug=e=>e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`,Wg=e=>{let t=new Date(e);return Number.isNaN(t.getTime())?``:new Date(e).toLocaleTimeString(`zh-CN`,{hour:`2-digit`,minute:`2-digit`})};function Gg({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,B.useEffect)(()=>{p&&f===void 0&&o(t)},[p,t,f,o]),(0,V.jsxs)(`li`,{className:`file-node`,"data-file-dir":t,"data-file-dir-changed":c.has(t)?`1`:`0`,children:[(0,V.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,V.jsx)(`span`,{className:`file-caret`,"aria-hidden":`true`,children:p?`▾`:`▸`}),(0,V.jsx)(wg,{category:`folder`}),(0,V.jsx)(`span`,{className:`file-name`,children:n}),c.has(t)&&(0,V.jsx)(`span`,{className:`file-badge file-badge-changed`,"data-file-dir-changed-badge":t,title:`里面有 agent 改过的文件`,children:`✎`})]}),p&&(0,V.jsx)(`ul`,{className:`file-children`,children:f===void 0?(0,V.jsx)(`li`,{className:`file-row-loading`,"data-file-loading":t,children:`读取中…`}):`error`in f?(0,V.jsx)(`li`,{className:`file-row-error`,"data-file-error":t,title:Zf(f.error.message),children:Xf(f.error.message,`这个目录读取失败。`)}):f.entries.length===0?(0,V.jsx)(`li`,{className:`file-row-empty`,"data-file-empty":t,children:`空目录`}):(0,V.jsxs)(V.Fragment,{children:[f.truncated&&(0,V.jsx)(`li`,{className:`file-row-empty`,"data-file-truncated":t,children:`条目过多,只显示前一部分`}),f.entries.map(t=>t.kind===`directory`?(0,V.jsx)(Gg,{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,V.jsx)(Kg,{entry:t,depth:d+1,openPaths:s,changedPaths:l,onOpen:u},t.path))]})})]})}function Kg({entry:e,depth:t,openPaths:n,changedPaths:r,onOpen:i}){if(e.kind===`symlink`)return(0,V.jsx)(`li`,{className:`file-node`,"data-file-entry":e.path,"data-file-outside":e.path,children:(0,V.jsxs)(`button`,{type:`button`,className:`file-row file-row-file`,disabled:!0,title:`${e.path} 是一个指向 workspace 之外的符号链接,不能打开`,style:{paddingLeft:`${8+t*13}px`},children:[(0,V.jsx)(`span`,{className:`file-caret`,"aria-hidden":`true`}),(0,V.jsx)(`span`,{className:`file-name`,children:e.name}),(0,V.jsx)(`span`,{className:`file-badge`,"data-file-outside-badge":`1`,children:`外部链接`})]})});let a=n.has(e.path),o=r.has(e.path);return(0,V.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,V.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,V.jsx)(`span`,{className:`file-caret`,"aria-hidden":`true`}),(0,V.jsx)(wg,{path:e.path}),(0,V.jsx)(`span`,{className:`file-name`,children:e.name}),a&&(0,V.jsx)(`span`,{className:`file-open-mark`,"data-file-open-mark":e.path,title:`已经打开`,"aria-label":`已经打开`,children:`●`}),o&&(0,V.jsx)(`span`,{className:`file-badge file-badge-changed`,"data-file-changed":e.path,title:`agent 改过这个文件`,children:`✎ 已改`}),!e.text&&(0,V.jsx)(`span`,{className:`file-badge`,"data-file-binary":`1`,"aria-label":`不支持的文件类型`,children:`不支持`})]})})}function qg({file:e,state:t,message:n,external:r,jumpToLine:i,onChange:a,onSave:o,onReload:s,onOverwrite:c}){let[l,u]=(0,B.useState)(!0),d=(0,B.useRef)(null);(0,B.useEffect)(()=>{i&&u(!1)},[e.path,i]),(0,B.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 Km(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 qm(e){return Array.isArray?Array.isArray(e):rh(e)===`[object Array]`}function Jm(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 Ym(e){return e==null?``:Jm(e)}function Xm(e){return typeof e==`string`}function Zm(e){return typeof e==`number`}function Qm(e){return e===!0||e===!1||eh(e)&&rh(e)==`[object Boolean]`}function $m(e){return typeof e==`object`}function eh(e){return $m(e)&&e!==null}function th(e){return e!=null}function nh(e){return!e.trim().length}function rh(e){return e==null?e===void 0?`[object Undefined]`:`[object Null]`:Object.prototype.toString.call(e)}var ih=`Incorrect 'index' type`,ah=`Invalid doc index: must be a non-negative integer within the bounds of the docs array`,oh=e=>`Invalid value for key ${e}`,sh=e=>`Pattern length exceeds max of ${e}.`,ch=e=>`Missing ${e} property in key`,lh=e=>`Property 'weight' in key '${e}' must be a positive integer`,uh=`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.`,dh=Object.prototype.hasOwnProperty,fh=class{constructor(e){this._keys=[],this._keyMap={};let t=0;e.forEach(e=>{let n=ph(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 ph(e){let t=null,n=null,r=null,i=1,a=null;if(Xm(e)||qm(e))r=e,t=mh(e),n=hh(e);else{if(!dh.call(e,`name`))throw Error(ch(`name`));let o=e.name;if(r=o,dh.call(e,`weight`)&&e.weight!==void 0&&(i=e.weight,i<=0))throw Error(lh(hh(o)));t=mh(o),n=hh(o),a=e.getFn??null}return{path:t,id:n,weight:i,src:r,getFn:a}}function mh(e){return qm(e)?e:e.split(`.`)}function hh(e){return qm(e)?e.join(`.`):e}function gh(e,t){let n=[],r=!1,i=(e,t,a,o)=>{if(th(e)){if(!t[a])n.push(o===void 0?e:{v:e,i:o});else{let s=e[t[a]];if(!th(s))return;if(a===t.length-1&&(Xm(s)||Zm(s)||Qm(s)||typeof s==`bigint`))n.push(o===void 0?Ym(s):{v:Ym(s),i:o});else if(qm(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,Xm(t)?t.split(`.`):t,0),r?n:n[0]}var _h={includeMatches:!1,findAllMatches:!1,minMatchCharLength:1},vh={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},yh={location:0,threshold:.6,distance:100},bh={useExtendedSearch:!1,useTokenSearch:!1,tokenize:void 0,tokenMatch:`any`,getFn:gh,ignoreLocation:!1,ignoreFieldNorm:!1,fieldNormWeight:1},Y=Object.freeze({...vh,..._h,...yh,...bh});function xh(e){return e>=9&&e<=13||e===32||e===160}function Sh(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++)xh(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 Ch=class{constructor({getFn:e=Y.getFn,fieldNormWeight:t=Y.fieldNormWeight}={}){this.norm=Sh(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(Xm(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(ah);if(Xm(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(ah);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!th(e)||nh(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(th(i)){if(qm(i)){let e=[];for(let t=0,n=i.length;t<n;t+=1){let n=i[t];if(th(n)){if(Xm(n)){if(!nh(n)){let r={v:n,i:t,n:this.norm.get(n)};e.push(r)}}else if(th(n.v)){let t=Xm(n.v)?n.v:Ym(n.v);if(!nh(t)){let r={v:t,i:n.i,n:this.norm.get(t)};e.push(r)}}}}n.$[t]=e}else if(Xm(i)&&!nh(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 wh(e,t,{getFn:n=Y.getFn,fieldNormWeight:r=Y.fieldNormWeight}={}){let i=new Ch({getFn:n,fieldNormWeight:r});return i.setKeys(e.map(ph)),i.setSources(t),i.create(),i}function Th(e,{getFn:t=Y.getFn,fieldNormWeight:n=Y.fieldNormWeight}={}){let{keys:r,records:i}=e,a=new Ch({getFn:t,fieldNormWeight:n});return a.setKeys(r),a.setIndexRecords(i),a}function Eh(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(sh(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=Eh(_,s);e.length?c&&(w.indices=e):w.isMatch=!1}return w}function Oh(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 kh(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 Ah={ł:`l`,Ł:`L`,đ:`d`,Đ:`D`,ø:`o`,Ø:`O`,ħ:`h`,Ħ:`H`,ŧ:`t`,Ŧ:`T`,ı:`i`,ß:`ss`},jh=RegExp(`[`+Object.keys(Ah).join(``)+`]`,`g`),Mh=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(jh,e=>Ah[e]):e=>e,Nh=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?Mh(e):e,this.pattern=e,this.chunks=[],!this.pattern.length)return;let u=(e,t)=>{this.chunks.push({pattern:e,alphabet:Oh(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?Mh(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=kh(u)),p}},Ph=new Set([`fuzzy`,`include`]);function Fh(e){return e.startsWith(`inverse`)}var Ih=[{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 Nh(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)}}}}],Lh=Ih.length,Rh=`\0`,zh=`|`;function Bh(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 Vh(e,t){let n=e.match(t);return n?n[1]:null}function Hh(e,t={}){return e.replace(/\\\|/g,Rh).split(zh).map(e=>{let n=Bh(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<Lh;){let e=Ih[o],n=Vh(i,e.multiRegex);n&&(r.push(e.create(n,t)),a=!0)}if(!a)for(o=-1;++o<Lh;){let e=Ih[o],n=Vh(i,e.singleRegex);if(n){r.push(e.create(n,t));break}}}return r})}var Uh=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?Mh(e):e,this.pattern=e,this.query=Hh(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?Mh(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,Fh(r.type)&&(c=!0),n&&(Ph.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=kh(o)),e}}return{isMatch:!1,score:1}}},Wh=[];function Gh(...e){Wh.push(...e)}function Kh(e,t){for(let n=0,r=Wh.length;n<r;n+=1){let r=Wh[n];if(r.condition(e,t))return new r(e,t)}return new Nh(e,t)}var qh={AND:`$and`,OR:`$or`},Jh={PATH:`$path`,PATTERN:`$val`},Yh=e=>!!(e[qh.AND]||e[qh.OR]),Xh=e=>!!e[Jh.PATH],Zh=e=>!qm(e)&&$m(e)&&!Yh(e),Qh=e=>({[qh.AND]:Object.keys(e).map(t=>({[t]:e[t]}))});function $h(e,t,{auto:n=!0}={}){let r=e=>{if(Xm(e)){let r={keyId:null,pattern:e};return n&&(r.searcher=Kh(e,t)),r}let i=Object.keys(e),a=Xh(e);if(!a&&i.length>1&&!Yh(e))return r(Qh(e));if(Zh(e)){let r=a?e[Jh.PATH]:i[0],o=a?e[Jh.PATTERN]:e[r];if(!Xm(o))throw Error(oh(r));let s={keyId:hh(r),pattern:o};return n&&(s.searcher=Kh(o,t)),s}let o={children:[],operator:i[0]};return i.forEach(t=>{let n=e[t];qm(n)&&n.forEach(e=>{o.children.push(r(e))})}),o};return Yh(e)||(e=Qh(e)),r(e)}function eg(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 tg(e,{ignoreFieldNorm:t=Y.ignoreFieldNorm}){e.forEach(e=>{e.score=eg(e.matches,{ignoreFieldNorm:t})})}var ng=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 rg(e){let t=[];return e.matches.forEach(e=>{if(!th(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 ig(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=rg(e)),r&&(a.score=e.score),a})}var ag=/[\p{L}\p{M}\p{N}_]+/gu,og=new WeakSet;function sg(e){og.has(e)||(og.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 cg(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||sg(e),t=>t.match(e)||[]):e=>e.match(ag)||[]}function lg({isCaseSensitive:e=!1,ignoreDiacritics:t=!1,tokenize:n}={}){let r=cg(n);return{tokenize(n){return e||(n=n.toLowerCase()),t&&(n=Mh(n)),r(n)}}}var ug=class{static condition(e,t){return t.useTokenSearch}constructor(e,t){this.options=t,this.analyzer=lg({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 Nh(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=kh(t)),this.combineAll&&(this.useMask?c.matchedMask=a:c.matchedTerms=o,c.termCount=this.numTerms),c}};function dg(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 fg(e,t,n,r){let{i,v:a,$:o}=t;if(a!==void 0)dg(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)dg(e,t.v,i,r);else dg(e,n.v,i,r)}}}function pg(e,t,n){let r={fieldCount:0,df:new Map,docFieldCount:new Map,docTermFieldHits:new Map};for(let i of e)fg(r,i,t,n);return r}function mg(e,t,n,r){fg(e,t,n,r)}function hg(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 gg(e,t){if(t.length===0)return;let n=Array.from(new Set(t)).sort((e,t)=>e-t);for(let t of n)hg(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 _g=class{constructor(e,t,n){this.options={...Y,...t},this.options.useExtendedSearch,this.options.useTokenSearch,this._keyStore=new fh(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=Kh(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 Ch))throw Error(ih);if(this._myIndex=t||wh(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight}),this.options.useTokenSearch){let e=lg({isCaseSensitive:this.options.isCaseSensitive,ignoreDiacritics:this.options.ignoreDiacritics,tokenize:this.options.tokenize});this._invertedIndex=pg(this._myIndex.records,this._myIndex.keys.length,e)}this._invalidateSearcherCache()}add(e){if(!th(e))return;this._docs.push(e);let t=this._myIndex.add(e,this._docs.length-1);if(this._invertedIndex&&t){let e=lg({isCaseSensitive:this.options.isCaseSensitive,ignoreDiacritics:this.options.ignoreDiacritics,tokenize:this.options.tokenize});mg(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&&gg(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(ah);this._invertedIndex&&gg(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(Xm(e)&&!e.trim()){let e=this._docs.map((e,t)=>({item:e,refIndex:t}));return Zm(n)&&n>-1&&(e=e.slice(0,n)),e}let c=a&&Zm(n)&&n>0&&Xm(e),l=o,u=(e,t)=>l(e,t)||e.idx-t.idx,d;if(c){let t=new ng(n,u);Xm(this._docs[0])?this._searchStringList(e,{heap:t,ignoreFieldNorm:s}):this._searchObjectList(e,{heap:t,ignoreFieldNorm:s}),d=t.extractSorted()}else d=Xm(e)?Xm(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e),tg(d,{ignoreFieldNorm:s}),a&&d.sort(Xm(e)?u:l),Zm(n)&&n>-1&&(d=d.slice(0,n));return ig(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(!th(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=eg(r.matches,{ignoreFieldNorm:n}),t.insert(r)):o.push(r)}}}),o}_searchLogical(e){let t=$h(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===qh.AND)return[]}return s},i=this._myIndex.records,a=new Map,o=[];return i.forEach(({$:e,i:n})=>{if(th(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(!th(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=eg(r.matches,{ignoreFieldNorm:n}),t.insert(r)):s.push(r)}}),s}_findMatches({key:e,value:t,searcher:n}){if(!th(t))return[];let r=[];if(qm(t))t.forEach(({v:t,i,n:a})=>{if(!th(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}};_g.version=`7.5.0`,_g.createIndex=wh,_g.parseIndex=Th,_g.config=Y,_g.match=function(e,t,n){if(n&&n.useTokenSearch)throw Error(uh);return Kh(e,{...Y,...n}).searchIn(t)},_g.parseQuery=$h,Gh(Uh),Gh(ug),_g.use=function(...e){e.forEach(e=>Gh(e))};var vg=_g;function yg(e){let t=e.slice(e.lastIndexOf(`/`)+1),n=t.lastIndexOf(`.`);return n<=0?``:t.slice(n+1).toLowerCase()}var bg={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`},xg={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 Sg(e){let t=xg[e.slice(e.lastIndexOf(`/`)+1).toLowerCase()];if(t)return t;let n=yg(e);return n?bg[n]??`generic`:`generic`}var Cg={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 wg({path:e,category:t,size:n=14}){let r=t??Sg(e??``),i=Cg[r]??Cg.generic;return(0,V.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,V.jsx)(`path`,{d:e},t))})}var Tg=`modulepreload`,Eg=function(e){return`/`+e},Dg={},Og=function(e){return e.pathname.endsWith(`.css`)},kg=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},Ag=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=Eg(t,n);let r=s(t),i=Og(r);return kg(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`:Tg,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)})},jg=4e3,Mg=(0,B.lazy)(()=>Ag(()=>import(`./CodeMirrorEditor-BlQhH3vs.js`).then(e=>({default:e.CodeMirrorEditor})),[])),Ng=class extends Error{status;body;constructor(e,t){super(t.error||`HTTP ${e}`),this.status=e,this.body=t,this.name=`ApiError`}},Pg=15e3,Fg=e=>new Ng(408,{error:`请求超时:${Pg/1e3} 秒内服务端没有响应`,code:`timeout`,details:{path:e}});async function Ig(e,t){let n=new AbortController,r=setTimeout(()=>n.abort(),Pg);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 Ng(r.status,i??{error:`HTTP ${r.status}`});return i}catch(t){throw n.signal.aborted?Fg(e):t}finally{clearTimeout(r)}}var Lg=e=>e instanceof Ng?e:new Ng(0,{error:e instanceof Error?e.message:`读取失败`}),Rg=e=>encodeURIComponent(e),zg=(e,t)=>`/api/files?workspaceId=${Rg(e)}&path=${Rg(t)}`,Bg=(e,t)=>`/api/file?workspaceId=${Rg(e)}&path=${Rg(t)}`,Vg=(e,t)=>`/api/file?workspaceId=${Rg(e)}&path=${Rg(t)}&meta=1`,Hg=(e,t)=>`/api/files?workspaceId=${Rg(e)}&q=${Rg(t)}`,Ug=e=>e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`,Wg=e=>{let t=new Date(e);return Number.isNaN(t.getTime())?``:new Date(e).toLocaleTimeString(`zh-CN`,{hour:`2-digit`,minute:`2-digit`})};function Gg({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,B.useEffect)(()=>{p&&f===void 0&&o(t)},[p,t,f,o]),(0,V.jsxs)(`li`,{className:`file-node`,"data-file-dir":t,"data-file-dir-changed":c.has(t)?`1`:`0`,children:[(0,V.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,V.jsx)(`span`,{className:`file-caret`,"aria-hidden":`true`,children:p?`▾`:`▸`}),(0,V.jsx)(wg,{category:`folder`}),(0,V.jsx)(`span`,{className:`file-name`,children:n}),c.has(t)&&(0,V.jsx)(`span`,{className:`file-badge file-badge-changed`,"data-file-dir-changed-badge":t,title:`里面有 agent 改过的文件`,children:`✎`})]}),p&&(0,V.jsx)(`ul`,{className:`file-children`,children:f===void 0?(0,V.jsx)(`li`,{className:`file-row-loading`,"data-file-loading":t,children:`读取中…`}):`error`in f?(0,V.jsx)(`li`,{className:`file-row-error`,"data-file-error":t,title:Zf(f.error.message),children:Xf(f.error.message,`这个目录读取失败。`)}):f.entries.length===0?(0,V.jsx)(`li`,{className:`file-row-empty`,"data-file-empty":t,children:`空目录`}):(0,V.jsxs)(V.Fragment,{children:[f.truncated&&(0,V.jsx)(`li`,{className:`file-row-empty`,"data-file-truncated":t,children:`条目过多,只显示前一部分`}),f.entries.map(t=>t.kind===`directory`?(0,V.jsx)(Gg,{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,V.jsx)(Kg,{entry:t,depth:d+1,openPaths:s,changedPaths:l,onOpen:u},t.path))]})})]})}function Kg({entry:e,depth:t,openPaths:n,changedPaths:r,onOpen:i}){if(e.kind===`symlink`)return(0,V.jsx)(`li`,{className:`file-node`,"data-file-entry":e.path,"data-file-outside":e.path,children:(0,V.jsxs)(`button`,{type:`button`,className:`file-row file-row-file`,disabled:!0,title:`${e.path} 是一个指向 workspace 之外的符号链接,不能打开`,style:{paddingLeft:`${8+t*13}px`},children:[(0,V.jsx)(`span`,{className:`file-caret`,"aria-hidden":`true`}),(0,V.jsx)(`span`,{className:`file-name`,children:e.name}),(0,V.jsx)(`span`,{className:`file-badge`,"data-file-outside-badge":`1`,children:`外部链接`})]})});let a=n.has(e.path),o=r.has(e.path);return(0,V.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,V.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,V.jsx)(`span`,{className:`file-caret`,"aria-hidden":`true`}),(0,V.jsx)(wg,{path:e.path}),(0,V.jsx)(`span`,{className:`file-name`,children:e.name}),a&&(0,V.jsx)(`span`,{className:`file-open-mark`,"data-file-open-mark":e.path,title:`已经打开`,"aria-label":`已经打开`,children:`●`}),o&&(0,V.jsx)(`span`,{className:`file-badge file-badge-changed`,"data-file-changed":e.path,title:`agent 改过这个文件`,children:`✎ 已改`}),e.document&&(0,V.jsx)(`span`,{className:`file-badge`,"data-file-document":`1`,"aria-label":`文档文件`,children:`文档`}),!e.text&&!e.document&&(0,V.jsx)(`span`,{className:`file-badge`,"data-file-binary":`1`,"aria-label":`不支持的文件类型`,children:`不支持`})]})})}function qg({file:e,state:t,message:n,external:r,jumpToLine:i,onChange:a,onSave:o,onReload:s,onOverwrite:c}){let[l,u]=(0,B.useState)(!0),d=(0,B.useRef)(null);(0,B.useEffect)(()=>{i&&u(!1)},[e.path,i]),(0,B.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,V.jsxs)(`div`,{className:`file-editor`,"data-file-editor":e.path,"data-save-state":t,children:[(0,V.jsxs)(`div`,{className:`file-editor-head`,children:[(0,V.jsx)(`span`,{className:`file-editor-path`,title:e.path,children:e.path}),(0,V.jsxs)(`span`,{className:`file-editor-flags`,children:[f&&(0,V.jsx)(`button`,{type:`button`,className:`file-preview-toggle`,onClick:()=>u(e=>!e),children:l?`原文`:`预览`}),e.dirty&&(0,V.jsx)(`span`,{className:`file-dirty`,"data-file-dirty":`1`,children:`未保存`}),(0,V.jsx)(`button`,{type:`button`,className:`file-save`,"data-file-save":e.path,onClick:o,disabled:t===`saving`,children:t===`saving`?`保存中…`:`保存`})]})]}),r&&t!==`conflict`&&(0,V.jsxs)(`div`,{className:`file-conflict`,"data-file-external":e.path,role:`alert`,children:[(0,V.jsx)(`p`,{children:`这个文件在磁盘上已经被改过了,你的修改还没有覆盖它。`}),(0,V.jsxs)(`div`,{className:`file-conflict-actions`,children:[(0,V.jsx)(`button`,{type:`button`,"data-file-reload":e.path,onClick:s,children:`丢掉我的修改,读磁盘版本`}),(0,V.jsx)(`button`,{type:`button`,"data-file-overwrite":e.path,onClick:c,children:`仍然覆盖磁盘`})]})]}),t===`conflict`&&(0,V.jsxs)(`div`,{className:`file-conflict`,"data-file-conflict":e.path,role:`alert`,children:[(0,V.jsx)(`p`,{children:`保存被拒绝:这个文件在磁盘上已经被改过了,覆盖会丢掉对方的改动。`}),(0,V.jsxs)(`div`,{className:`file-conflict-actions`,children:[(0,V.jsx)(`button`,{type:`button`,"data-file-reload":e.path,onClick:s,children:`丢掉我的修改,读磁盘版本`}),(0,V.jsx)(`button`,{type:`button`,"data-file-overwrite":e.path,onClick:c,children:`仍然覆盖磁盘`})]})]}),n&&t!==`conflict`&&!r&&(0,V.jsx)(`p`,{className:`file-editor-message file-message-${t}`,"data-file-message":t,role:`status`,children:n}),f&&l?(0,V.jsx)(`div`,{className:`file-markdown-preview`,"data-file-preview":`markdown`,children:(0,V.jsx)(gm,{source:e.content})}):(0,V.jsx)(Am,{fallback:(t,n)=>(0,V.jsxs)(`div`,{className:`file-editor-fallback`,"data-file-editor-fallback":`1`,children:[(0,V.jsxs)(`div`,{className:`file-editor-fallback-bar`,children:[(0,V.jsxs)(`span`,{children:[`⚠️ 高级编辑器加载异常(`,t.message||`未知错误`,`),已自动降级为安全模式`]}),(0,V.jsx)(`button`,{type:`button`,onClick:n,children:`重新加载`})]}),(0,V.jsx)(`textarea`,{className:`file-textarea`,value:e.content,onChange:e=>a(e.target.value),onKeyDown:e=>{(e.ctrlKey||e.metaKey)&&e.key===`s`&&(e.preventDefault(),o())}})]}),children:(0,V.jsx)(B.Suspense,{fallback:(0,V.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,V.jsx)(`span`,{className:`file-cm-status`,"data-file-editor-loading":`1`,children:`⌛ 正在加载编辑器…`})}),children:(0,V.jsx)(Mg,{path:e.path,value:e.content,onChange:a,jumpToLine:i,onSave:o})})})]})}function Jg({line:e}){if(e.kind===`fold`)return(0,V.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,V.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,V.jsx)(`span`,{className:`file-diff-mark`,"aria-hidden":`true`,children:t}),(0,V.jsx)(`span`,{className:`file-diff-number`,"aria-hidden":`true`,children:e.oldLine??``}),(0,V.jsx)(`span`,{className:`file-diff-number`,"aria-hidden":`true`,children:e.newLine??``}),(0,V.jsx)(`span`,{className:`file-diff-text`,children:e.text}),e.noNewline&&(0,V.jsx)(`span`,{className:`file-diff-no-newline`,title:`这个版本的末尾没有换行`,children:`(末尾无换行)`})]})}function Yg({diff:e,loading:t,error:n,bufferContent:r,mode:i,onMode:a}){if(t)return(0,V.jsx)(`div`,{className:`file-diff`,"data-file-diff-state":`loading`,children:(0,V.jsx)(`p`,{className:`rail-empty`,"data-file-diff-loading":`1`,children:`正在读取差异…`})});if(n)return(0,V.jsx)(`div`,{className:`file-diff`,"data-file-diff-state":`error`,children:(0,V.jsx)(`p`,{className:`rail-empty`,"data-file-diff-error":`1`,title:Zf(n),children:Xf(n,`这个文件的差异读取失败。`)})});if(!e)return(0,V.jsx)(`div`,{className:`file-diff`,"data-file-diff-state":`empty`,children:(0,V.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,V.jsxs)(`span`,{className:`file-diff-switch`,"data-file-diff-switch":`1`,children:[(0,V.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,V.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,V.jsxs)(`div`,{className:`file-diff`,"data-file-diff-state":`none`,"data-file-diff-baseline":d,children:[(0,V.jsxs)(`div`,{className:`file-editor-head`,children:[(0,V.jsx)(`span`,{className:`file-editor-path`,title:e.path,children:e.path}),(0,V.jsx)(`span`,{className:`file-editor-flags`,children:f})]}),(0,V.jsx)(`p`,{className:`file-diff-nobaseline`,"data-file-diff-nobaseline":`1`,children:u})]});let p=Gm(c,l),m=Km(p);return(0,V.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,V.jsxs)(`div`,{className:`file-editor-head`,children:[(0,V.jsx)(`span`,{className:`file-editor-path`,title:e.path,children:e.path}),(0,V.jsxs)(`span`,{className:`file-editor-flags`,children:[f,(0,V.jsx)(`span`,{className:`file-diff-baseline`,"data-file-diff-label":`1`,children:u}),(0,V.jsxs)(`span`,{className:`file-diff-count`,"data-file-diff-count":`1`,children:[`+`,p.added,` / -`,p.removed]})]})]}),e.beforeUnknown&&!s&&(0,V.jsx)(`p`,{className:`file-diff-warning`,"data-file-diff-before-unknown":`1`,role:`status`,children:`读不到改动前的版本(文件太大或无法读取),这里只显示现在的内容。`}),e.before===null&&!e.beforeUnknown&&!s&&(0,V.jsx)(`p`,{className:`file-diff-warning`,"data-file-diff-is-new":`1`,role:`status`,children:`这个文件是新建的,下面是它的全部内容。`}),p.identical?(0,V.jsx)(`p`,{className:`file-diff-nobaseline`,"data-file-diff-identical":`1`,children:`两个版本没有区别。`}):(0,V.jsx)(`div`,{className:`file-diff-body`,"data-file-diff-body":`1`,children:m.lines.map((e,t)=>(0,V.jsx)(Jg,{line:e},t))})]})}function Xg({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,V.jsxs)(`div`,{className:`rail-empty file-problem`,"data-file-root-error":`1`,"data-file-error-kind":r,role:`alert`,children:[r===`missing`&&(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`p`,{className:`file-problem-title`,"data-file-error-title":`1`,children:`工作区路径不存在,无法读取文件。`}),(0,V.jsx)(`p`,{className:`file-problem-hint`,children:`请确认这个路径是写错了,还是目录被移动或删除了:`}),(0,V.jsx)(`code`,{className:`file-problem-path`,"data-file-error-path":`1`,children:n||Xf(e.message,`路径未知`)})]}),r===`timeout`&&(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`p`,{className:`file-problem-title`,"data-file-error-title":`1`,children:`读取超时,服务端没有回应。`}),(0,V.jsxs)(`p`,{className:`file-problem-hint`,children:[`已经等了 `,Pg/1e3,` 秒。如果这个工作区在网络盘上,请检查它是否已连接,然后点上面的 ↻ 重试。`]})]}),r===`failed`&&(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`p`,{className:`file-problem-title`,"data-file-error-title":`1`,children:`读取失败。`}),(0,V.jsx)(`p`,{className:`file-problem-hint`,title:Zf(e.message),children:Xf(e.message,`读取失败,请稍后重试。`)})]})]})}function Zg(e){let[t,n]=(0,B.useState)([]),[r,i]=(0,B.useState)(),[a,o]=(0,B.useState)(``),[s,c]=(0,B.useState)({}),[l,u]=(0,B.useState)({}),[d,f]=(0,B.useState)({}),[p,m]=(0,B.useState)(()=>new Set),[h,g]=(0,B.useState)(``),[_,v]=(0,B.useState)(null),[y,b]=(0,B.useState)(null),[x,S]=(0,B.useState)(!1),[C,w]=(0,B.useState)([]),[T,E]=(0,B.useState)(!1),[D,O]=(0,B.useState)([]),k=(0,B.useCallback)((e,t)=>w(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()]}),[]),A=(0,B.useCallback)((e,t)=>{E(e),O(t)},[]);(0,B.useEffect)(()=>{if(w([]),E(!1),O([]),!e)return;let t=!0;return fetch(`/api/files/index?workspaceId=${encodeURIComponent(e)}`).then(e=>e.json()).then(e=>{t&&(k(e.changed??[],e.removed??[]),E(e.complete===!0),O(e.skipped??[]))}).catch(()=>void 0),()=>{t=!1}},[e,k]);let[j,M]=(0,B.useState)({});(0,B.useEffect)(()=>{if(n([]),i(void 0),o(``),c({}),u({}),f({}),m(new Set),v(null),b(null),g(``),S(!1),!e)return;let t=!0;return Ig(zg(e,``)).then(e=>{t&&f({"":e})}).catch(e=>{t&&f({"":{error:Lg(e)}})}),()=>{t=!1}},[e]);let N=(0,B.useRef)(void 0),[P,ee]=(0,B.useState)(void 0);(0,B.useEffect)(()=>{if(!e||N.current===e)return;N.current=e;let t=$g()[e];t&&(t.expanded.length&&m(new Set(t.expanded)),typeof t.listHeight==`number`&&v(t.listHeight),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),ee(t.active))})())},[e]),(0,B.useEffect)(()=>{if(!e)return;let n=setTimeout(()=>{let n=$g();n[e]={open:t.map(e=>e.path),expanded:[...p],...r?{active:r}:{},..._===null?{}:{listHeight:_}},e_(n)},400);return()=>{clearTimeout(n)}},[e,t,p,r,_]);let te=(0,B.useCallback)(t=>{e&&Ig(zg(e,t)).then(e=>{f(n=>({...n,[t]:e}))}).catch(e=>{f(n=>({...n,[t]:{error:Lg(e)}}))})},[e]),ne=(0,B.useCallback)(e=>{m(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),F=(0,B.useCallback)(()=>{e&&(f({}),m(new Set),Ig(zg(e,``)).then(e=>{f({"":e})}).catch(e=>{f({"":{error:Lg(e)}})}))},[e]);(0,B.useEffect)(()=>{let t=h.trim();if(!e||!t){b(null),S(!1);return}let n=!0;S(!0);let r=setTimeout(()=>{Ig(Hg(e,t)).then(e=>{n&&(b(e),S(!1))}).catch(e=>{n&&(b({mode:`search`,query:t,hits:[],total:0,indexed:!1}),S(!1),o(`搜索失败:${e instanceof Error?e.message:`未知错误`}`))})},80);return()=>{n=!1,clearTimeout(r)}},[h,e]);let re=(0,B.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 Ig(Bg(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,B.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,B.useCallback)((e,t)=>{n(n=>n.map(n=>n.path===e?{...n,content:t,dirty:!0}:n))},[]);(0,B.useEffect)(()=>{if(!e||t.length===0)return;let n=!0,r=t.map(e=>e.path),i=setInterval(()=>{for(let i of r)Ig(Vg(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(()=>{})},jg);return()=>{n=!1,clearInterval(i)}},[e,t]);let oe=(0,B.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 Ig(Vg(e,r))).etag}catch(e){c(t=>({...t,[r]:{state:`error`,message:`无法读取磁盘上的最新版本:${e instanceof Error?e.message:`未知错误`}`}}));return}try{let t=await Ig(Bg(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:`已保存 ${Wg(t.meta.modifiedAt)}`}}))}catch(e){let t=e instanceof Ng&&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,B.useCallback)(async t=>{if(e)try{let r=await Ig(Bg(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,B.useMemo)(()=>t.map(e=>({id:e.path,label:e.name,title:e.path,closable:!0,badge:e.dirty?(0,V.jsx)(`span`,{className:`file-tab-badge`,"data-file-tab-dirty":e.path,"aria-label":`未保存`,children:`●`}):void 0})),[t]),ue=(0,B.useMemo)(()=>new Set(t.map(e=>e.path)),[t]),de=(0,B.useCallback)((e,t,n)=>{M(r=>({...r,[e]:{changes:t,dropped:n}}))},[]),fe=e?j[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:ne,loadDirectory:te,refreshTree:F,listHeight:_,setListHeight:v,query:h,setQuery:g,hits:y,searching:x,changed:pe,changedPaths:(0,B.useMemo)(()=>new Set(pe.map(e=>e.path)),[pe]),changedDirs:(0,B.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:C,indexComplete:T,indexSkipped:D,setIndex:k,setIndexStatus:A,restoredActive:P}}var Qg=`super-pi.file-workbench.v1`;function $g(){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,i=Array.isArray(e.open)?e.open.filter(e=>typeof e==`string`):[],a=Array.isArray(e.expanded)?e.expanded.filter(e=>typeof e==`string`):[],o=typeof e.listHeight==`number`&&Number.isFinite(e.listHeight)&&e.listHeight>0?Math.round(e.listHeight):void 0;t[n]={open:i,expanded:a,...typeof e.active==`string`?{active:e.active}:{},...o?{listHeight:o}:{}}}return t}catch{return{}}}function e_(e){try{typeof window<`u`&&window.localStorage.setItem(Qg,JSON.stringify(e))}catch{}}function t_({height:e,onHeight:t,panelRef:n,min:r=120}){let[i,a]=(0,B.useState)(!1),o=()=>{let e=n.current?.querySelector(`.files-tree`)??null;return{list:e,height:e?.getBoundingClientRect().height??0}},s=e=>{e.preventDefault(),e.currentTarget.focus();let n=e.clientY,{height:i}=o();a(!0);let s=document.body,c=s.style.cursor,l=s.style.userSelect;s.style.cursor=`row-resize`,s.style.userSelect=`none`;let u=e=>{let a=Math.round(i+(e.clientY-n));t(Math.max(r,a))},d=()=>{s.style.cursor=c,s.style.userSelect=l,a(!1),window.removeEventListener(`mousemove`,u),window.removeEventListener(`mouseup`,d)};window.addEventListener(`mousemove`,u),window.addEventListener(`mouseup`,d)},c=e=>e.shiftKey?96:24;return(0,V.jsx)(`div`,{className:`files-splitter${i?` files-splitter-dragging`:``}`,"data-file-splitter":`1`,"data-file-splitter-dragging":i?`true`:`false`,role:`separator`,"aria-orientation":`horizontal`,"aria-label":`调整文件列表高度`,"aria-valuenow":e??void 0,"aria-valuemin":r,tabIndex:0,onMouseDown:s,onKeyDown:e=>{let i=c(e);if(e.key===`ArrowDown`){e.preventDefault();let{height:n}=o();t(Math.max(r,Math.round(n)+i))}else if(e.key===`ArrowUp`){e.preventDefault();let{height:n}=o(),a=Math.round(n)-i;t(a<=r?null:a)}else if(e.key===`Home`)e.preventDefault(),t(null);else if(e.key===`End`){e.preventDefault();let i=n.current?.querySelector(`.files-tree`)?.parentElement?.clientHeight??0;t(Math.max(r,i))}}})}function n_({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,listHeight:m,setListHeight:h,query:g,setQuery:_,hits:v,searching:y,changed:b,changedPaths:x,changedDirs:S,changedDropped:C}=t,w=(0,B.useCallback)(e=>{n?n(e):c(e)},[n,c]),T=l[``],E=g.trim(),D=(0,B.useRef)(null),O=(0,B.useCallback)(e=>{let t=D.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]),[k,A]=(0,B.useState)(200);(0,B.useEffect)(()=>{A(200)},[E,e]);let j=(0,B.useRef)(null);(0,B.useEffect)(()=>{if(E===``)return;let e=j.current;if(!e||typeof IntersectionObserver>`u`)return;let t=new IntersectionObserver(e=>{e.some(e=>e.isIntersecting)&&A(e=>e>=(v?.hits.length??0)?e:e+200)},{rootMargin:`200px`});return t.observe(e),()=>t.disconnect()},[E,v]);let M=(0,B.useMemo)(()=>{if(E){if(y||!v)return(0,V.jsx)(`p`,{className:`rail-empty`,"data-file-searching":`1`,children:`搜索中…`});if(v.hits.length===0)return(0,V.jsxs)(`p`,{className:`rail-empty`,"data-file-search-empty":`1`,children:[`没有匹配「`,E,`」的文件。`]});let e=v.hits.slice(0,k),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,V.jsxs)(V.Fragment,{children:[t.map(e=>(0,V.jsxs)(`section`,{className:`file-group`,"data-file-search-group":e.directory,children:[(0,V.jsxs)(`h3`,{className:`file-group-head`,"data-file-search-group-head":e.directory,children:[(0,V.jsx)(`span`,{className:`file-group-name`,children:e.directory||`/`}),(0,V.jsx)(`span`,{className:`file-group-count`,children:e.hits.length})]}),(0,V.jsx)(`ul`,{className:`file-list`,children:e.hits.map(e=>(0,V.jsx)(`li`,{children:(0,V.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:()=>w({path:e.path,name:e.name,text:!0}),children:[(0,V.jsx)(`span`,{className:`file-caret`,"aria-hidden":`true`}),(0,V.jsx)(wg,{path:e.path}),(0,V.jsx)(`span`,{className:`file-name`,children:e.name}),a.has(e.path)&&(0,V.jsx)(`span`,{className:`file-open-mark`,"data-file-open-mark":e.path,title:`已经打开`,"aria-label":`已经打开`,children:`●`})]})},e.path))})]},e.directory||`/`)),e.length<v.hits.length&&(0,V.jsx)(`div`,{ref:j,className:`file-sentinel`,"data-file-search-more":`1`,children:`正在载入更多…`})]})}return e?T===void 0?(0,V.jsx)(`p`,{className:`rail-empty`,"data-file-root-loading":`1`,children:`读取工作区…`}):`error`in T?(0,V.jsx)(Xg,{error:T.error}):(0,V.jsxs)(V.Fragment,{children:[T.truncated&&(0,V.jsx)(`p`,{className:`file-search-note`,"data-file-truncated-root":`1`,children:`条目过多,只显示前一部分。`}),T.entries.length===0?(0,V.jsx)(`p`,{className:`rail-empty`,"data-file-root-empty":`1`,children:`这个工作区是空的,没有文件也没有子目录。`}):(0,V.jsx)(`ul`,{className:`file-list`,children:T.entries.map(t=>t.kind===`directory`?(0,V.jsx)(Gg,{workspaceId:e,entryPath:t.path,name:t.name,listings:l,expanded:u,toggle:d,loadDirectory:f,openPaths:a,changedDirs:S,changedPaths:x,onOpen:e=>w(e),depth:0},t.path):(0,V.jsx)(Kg,{entry:t,depth:0,openPaths:a,changedPaths:x,onOpen:e=>w(e)},t.path))})]}):(0,V.jsx)(`p`,{className:`rail-empty`,"data-file-no-workspace":`1`,children:`先在左侧选一个工作区,这里会显示它的文件。`})},[E,y,v,k,e,T,l,u,d,f,w,a,S,x]);return(0,V.jsxs)(`div`,{className:`files-panel`,"data-files-panel":`1`,"data-files-open-count":i.length,"data-files-changed-count":b.length,ref:D,onKeyDown:O,children:[(0,V.jsxs)(`div`,{className:`files-search`,children:[(0,V.jsx)(`span`,{className:`files-search-icon`,"aria-hidden":`true`,children:(0,V.jsxs)(`svg`,{viewBox:`0 0 16 16`,width:`13`,height:`13`,fill:`none`,stroke:`currentColor`,strokeWidth:1.6,strokeLinecap:`round`,children:[(0,V.jsx)(`circle`,{cx:`7`,cy:`7`,r:`4.6`}),(0,V.jsx)(`path`,{d:`M10.4 10.4 14 14`})]})}),(0,V.jsx)(`input`,{type:`search`,className:`files-search-input`,"data-file-search-input":`1`,value:g,placeholder:`按文件名搜索…`,"aria-label":`按文件名搜索`,onKeyDown:e=>{e.key===`Escape`&&(e.preventDefault(),_(``))},onChange:e=>_(e.target.value)}),(0,V.jsx)(`button`,{type:`button`,className:`files-refresh`,"data-file-refresh":`1`,title:`重新读取目录`,"aria-label":`重新读取目录`,disabled:!e,onClick:()=>p(),children:`↻`})]}),E&&v&&!y&&(0,V.jsxs)(`p`,{className:`files-count`,"data-file-search-count":`1`,role:`status`,children:[(0,V.jsx)(`b`,{children:v.total.toLocaleString(`zh-CN`)}),` 个结果`,v.indexed===!1&&(0,V.jsx)(`span`,{className:`files-count-note`,"data-file-search-indexing":`1`,children:`正在建立索引…`})]}),b.length>0&&(0,V.jsxs)(`div`,{className:`files-changed`,"data-file-changed-list":`1`,children:[(0,V.jsxs)(`p`,{className:`files-changed-head`,"data-file-changed-head":`1`,children:[`agent 改了 `,b.length,` 个文件`]}),C>0&&(0,V.jsxs)(`p`,{className:`file-search-note`,"data-file-changed-dropped":`1`,children:[`还有 `,C,` 个改动没有记录(超过保留上限)。`]}),(0,V.jsx)(`ul`,{className:`file-list`,children:b.map(e=>(0,V.jsx)(`li`,{children:(0,V.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,V.jsx)(`span`,{className:`file-caret`,"aria-hidden":`true`}),(0,V.jsx)(wg,{path:e.path}),(0,V.jsx)(`span`,{className:`file-name`,children:e.path.split(`/`).pop()}),(0,V.jsx)(`span`,{className:`file-badge-path`,children:e.path.split(`/`).slice(0,-1).join(`/`)||`/`}),(0,V.jsx)(`span`,{className:`file-badge file-badge-changed`,"data-file-changed-kind":e.path,children:e.baseline===null&&!e.baselineUnknown?`新建`:`已改`})]})},e.path))})]}),o&&(0,V.jsx)(`p`,{className:`rail-empty`,"data-file-notice":`1`,children:o}),(0,V.jsxs)(`div`,{className:`files-tree`,"data-file-tree":E?`search`:`browse`,style:m===null?void 0:{height:`${m}px`,flex:`0 0 auto`},children:[(0,V.jsx)(`div`,{className:`files-tree-body`,children:M}),i.length===0&&(0,V.jsx)(`p`,{className:`rail-empty file-hint`,"data-file-none-open":`1`,children:`点一个文本文件,它会在上面的标签栏开一个标签,正文显示在中间主画面。`}),i.length>0&&(0,V.jsxs)(`p`,{className:`files-hint file-hint`,"data-file-open-hint":`1`,children:[`已打开 `,i.length,` 个文件,正文显示在中间主画面;点上面的标签切换,点这里的行切换。`]})]}),(0,V.jsx)(t_,{height:m,onHeight:h,panelRef:D}),(0,V.jsxs)(`p`,{className:`files-footnote`,"data-files-footnote":`1`,children:[`只支持纯文本(md / 代码),二进制文件不会打开。写入只允许覆盖已存在的文件,不新建,不删除。`,i.length>0&&` 当前打开 ${i.length} 个文件,占 ${Ug(i.reduce((e,t)=>e+t.content.length,0))}。`]})]})}function r_({workspaceId:e,onOpen:t,onClose:n}){let[r,i]=(0,B.useState)(``),[a,o]=(0,B.useState)(null),[s,c]=(0,B.useState)(``),[l,u]=(0,B.useState)(!1),[d,f]=(0,B.useState)(0),p=(0,B.useRef)(null),m=(0,B.useRef)(null);(0,B.useEffect)(()=>{p.current?.focus()},[]),(0,B.useEffect)(()=>{m.current?.scrollIntoView({block:`nearest`})},[d]),(0,B.useEffect)(()=>{let t=r.trim();if(o(null),c(``),f(0),!e||!t){u(!1);return}let n=!0;u(!0);let i=setTimeout(()=>{Ig(`/api/files/search?workspaceId=${Rg(e)}&q=${Rg(t)}`).then(e=>{n&&(o(e),u(!1))}).catch(e=>{n&&(c(Xf(e,`搜索没有完成`)),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,V.jsx)(`div`,{className:`quick-open-backdrop`,"data-content-search":`1`,role:`presentation`,onMouseDown:n,children:(0,V.jsxs)(`div`,{className:`quick-open content-search`,role:`dialog`,"aria-modal":`true`,"aria-label":`内容搜索`,onMouseDown:e=>e.stopPropagation(),children:[(0,V.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,V.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,V.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,V.jsxs)(`details`,{className:`quick-open-status`,"data-content-search-skipped":`1`,children:[(0,V.jsxs)(`summary`,{children:[`↷ 已跳过 `,a.skipped.length,` 个文件或目录`]}),(0,V.jsx)(`p`,{className:`content-search-skipped-paths`,children:a.skipped.join(`
|
|
50
|
-
`)})]}),a&&!l&&a.hits.length===0&&(0,V.jsx)(`p`,{className:`quick-open-status`,"data-content-search-empty":`1`,children:`○ 没有匹配的行`}),(0,V.jsx)(`ul`,{className:`quick-open-results content-search-results`,role:`listbox`,children:a?.hits.map((e,t)=>(0,V.jsx)(`li`,{children:(0,V.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,V.jsxs)(`span`,{children:[e.path,`:`,e.line]}),(0,V.jsx)(`small`,{title:e.text,children:e.text})]})},`${e.path}:${e.line}`))})]})})}function i_({entries:e,complete:t,skipped:n,onOpen:r,onClose:i}){let[a,o]=(0,B.useState)(``),[s,c]=(0,B.useState)(0),l=(0,B.useRef)(null),u=(0,B.useMemo)(()=>e.filter(e=>e.kind===`file`&&e.text!==!1),[e]),d=(0,B.useMemo)(()=>a.trim()?new vg(u,{keys:[`path`],threshold:.38,ignoreLocation:!0}).search(a).slice(0,20).map(e=>e.item):u.slice(0,20),[u,a]);(0,B.useEffect)(()=>{l.current?.focus(),c(0)},[a]);let f=(0,B.useCallback)(e=>{e&&(r({path:e.path,name:e.path.split(`/`).pop()??e.path,text:e.text}),i())},[r,i]);return(0,V.jsx)(`div`,{className:`quick-open-backdrop`,"data-quick-open":`1`,role:`presentation`,onMouseDown:i,children:(0,V.jsxs)(`div`,{className:`quick-open`,role:`dialog`,"aria-modal":`true`,"aria-label":`快速打开`,onMouseDown:e=>e.stopPropagation(),children:[(0,V.jsx)(`input`,{ref:l,className:`quick-open-input`,"data-quick-open-input":`1`,value:a,placeholder:`快速打开:输入文件名或路径`,"aria-label":`快速打开文件路径`,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,V.jsxs)(`p`,{className:`quick-open-status`,"data-quick-open-status":t?`complete`:`partial`,children:[t?`✓ 索引完整`:`⚠ 索引不完整`,` · `,u.length,` 个文件 · Esc 关闭`]}),n.length>0&&(0,V.jsxs)(`p`,{className:`quick-open-status`,"data-quick-open-skipped":`1`,title:n.join(`, `),children:[`↷ 已跳过:`,n.join(`, `)]}),(0,V.jsx)(`ul`,{className:`quick-open-results`,role:`listbox`,children:d.map((e,t)=>(0,V.jsx)(`li`,{children:(0,V.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,V.jsx)(`span`,{children:e.path.split(`/`).pop()}),(0,V.jsx)(`small`,{children:e.path})]})},e.path))})]})})}function a_(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 o_(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 s_(e,t,n=88,r=200){let[i,a]=(0,B.useState)(()=>a_(e,0,n,r)),[o,s]=(0,B.useState)(null),c=(0,B.useCallback)(()=>{let i=a_(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,B.useRef)(t);(0,B.useEffect)(()=>{t<=0||l.current!==t&&(l.current=t,c())},[t,c]);let u=(0,B.useRef)(null);return(0,B.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 c_({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,B.useRef)(null),[d,f]=(0,B.useState)(0),{layout:p,frozen:m,recompute:h}=s_(e.length,d,a,o);(0,B.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=o_(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,B.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,V.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,V.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,V.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,V.jsx)(`span`,{className:`${s}-icon workspace-tab-icon`,children:i.icon}),i.badge,(0,V.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,V.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 l_={pending:`未开始`,running:`运行中`,completed:`已完成`,failed:`失败`,skipped:`已跳过`,stopped:`已停止`},u_={running:`运行中`,completed:`全部完成`,failed:`中途失败`,stopped:`已停止`},d_={pending:`○`,running:`◐`,completed:`✓`,failed:`✕`,skipped:`→`,stopped:`■`},f_={stop:`失败即停`,skip:`失败跳过`,"retry:1":`失败重试 1 次`,"retry:2":`失败重试 2 次`,"retry:3":`失败重试 3 次`};function p_(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 m_(e){let t=e.status===`running`,[n,r]=(0,B.useState)(0);(0,B.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 h_({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,V.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,V.jsx)(`span`,{className:`workflow-step-mark`,"aria-hidden":`true`,children:d_[e.status]}),(0,V.jsxs)(`span`,{className:`workflow-step-n`,"data-workflow-step-n":e.index+1,children:[`第 `,e.index+1,` 步`]}),(0,V.jsx)(`strong`,{className:`workflow-step-name`,"data-workflow-step-name":e.index+1,children:a}),(0,V.jsx)(`span`,{className:`workflow-step-agent`,"data-workflow-step-agent-name":e.index+1,children:i}),n>1&&(0,V.jsxs)(`span`,{className:`workflow-step-tries`,"data-workflow-step-retried":e.index+1,children:[`尝试 `,n,` 次`]}),(0,V.jsx)(`span`,{className:`workflow-step-status`,"data-workflow-step-status-text":e.index+1,children:l_[e.status]}),e.status===`failed`&&r?.error&&(0,V.jsx)(`span`,{className:`workflow-step-why`,"data-workflow-step-error":e.index+1,title:Zf(r.error),children:Xf(r.error,`这一步没有完成。`)})]})}function g_({workflow:e,names:t,onStop:n,stopping:r}){let i=e.status===`running`,a=m_(e),o=e.steps.filter(e=>e.status===`completed`||e.status===`skipped`).length;return(0,V.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,V.jsxs)(`div`,{className:`workflow-head`,children:[(0,V.jsx)(`span`,{className:`workflow-badge`,children:`编排`}),(0,V.jsx)(`strong`,{className:`workflow-summary`,"data-workflow-summary":e.id,children:e.summary}),(0,V.jsxs)(`span`,{className:`workflow-progress`,"data-workflow-progress":e.id,children:[o,`/`,e.steps.length]}),(0,V.jsx)(`span`,{className:`workflow-status`,"data-workflow-status-text":e.id,children:u_[e.status]??`未知状态`}),(0,V.jsx)(`span`,{className:`workflow-policy`,"data-workflow-policy":e.onFailure,children:f_[e.onFailure]??e.onFailure}),a!==void 0&&(0,V.jsxs)(`span`,{className:`workflow-clock`,"data-workflow-elapsed":e.id,children:[i?`已运行 `:`用时 `,p_(a)]}),i&&(0,V.jsx)(`button`,{type:`button`,className:`workflow-stop`,"data-workflow-stop":e.id,disabled:r,onClick:n,children:`停止`})]}),(0,V.jsx)(`ol`,{className:`workflow-steps`,"data-workflow-step-count":e.steps.length,children:e.steps.map(e=>(0,V.jsx)(h_,{step:e,names:t},e.index))})]})}var __=[{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 v_({onClose:e}){let[t,n]=(0,B.useState)(`agents`);(0,B.useEffect)(()=>{let t=t=>{t.key===`Escape`&&!t.defaultPrevented&&e()};return window.addEventListener(`keydown`,t),()=>window.removeEventListener(`keydown`,t)},[e]);let r=__.find(e=>e.id===t)??__[0];return(0,V.jsx)(`div`,{className:`overlay`,onClick:e,children:(0,V.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,V.jsxs)(`div`,{className:`settings-window-head help-window-head`,children:[(0,V.jsxs)(`div`,{className:`help-head-title`,children:[(0,V.jsx)(`h2`,{id:`help-window-title`,children:`使用指南与帮助`}),(0,V.jsx)(`span`,{className:`help-badge`,children:`v0.1.x`})]}),(0,V.jsx)(`button`,{type:`button`,className:`help-close-button`,"aria-label":`关闭指南`,onClick:e,children:`✕`})]}),(0,V.jsxs)(`div`,{className:`settings-window-body help-window-body`,children:[(0,V.jsxs)(`nav`,{className:`settings-nav help-nav`,role:`tablist`,"aria-orientation":`vertical`,"aria-label":`使用指南分类`,children:[(0,V.jsx)(`div`,{className:`settings-nav-label`,children:`目录`}),__.map(e=>(0,V.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,V.jsx)(`span`,{className:`help-tab-icon`,"aria-hidden":`true`,children:e.icon}),(0,V.jsx)(`span`,{children:e.label})]},e.id))]}),(0,V.jsxs)(`div`,{id:`help-panel`,className:`settings-panel help-panel`,role:`tabpanel`,"aria-labelledby":`help-tab-${r.id}`,children:[(0,V.jsxs)(`div`,{className:`help-panel-header`,children:[(0,V.jsx)(`h3`,{className:`help-panel-title`,children:r.title}),(0,V.jsx)(`p`,{className:`help-panel-desc`,children:r.description})]}),(0,V.jsxs)(`div`,{className:`help-panel-content`,children:[r.id===`agents`&&(0,V.jsx)(x_,{}),r.id===`workspace`&&(0,V.jsx)(S_,{}),r.id===`subagents`&&(0,V.jsx)(w_,{}),r.id===`model-policy`&&(0,V.jsx)(C_,{}),r.id===`memory`&&(0,V.jsx)(y_,{}),r.id===`knowledge`&&(0,V.jsx)(b_,{}),r.id===`tools`&&(0,V.jsx)(T_,{}),r.id===`cli`&&(0,V.jsx)(E_,{}),r.id===`themes`&&(0,V.jsx)(D_,{})]}),(0,V.jsx)(`div`,{className:`picker-actions help-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,onClick:e,children:`关闭`})})]})]})]})})}function y_(){return(0,V.jsxs)(`div`,{className:`help-section-group`,children:[(0,V.jsxs)(`div`,{className:`help-card highlight`,children:[(0,V.jsx)(`h4`,{children:`🧠 它会记住什么?`}),(0,V.jsx)(`p`,{children:`用户档案保存跨工作区的长期偏好;工作区事实保存环境与项目约定;技能保存已经验证过的步骤、命令和坑。临时结果、秘密和未验证的失败不会保存。`})]}),(0,V.jsxs)(`div`,{className:`help-card`,children:[(0,V.jsx)(`h4`,{children:`主动保存与后台复盘`}),(0,V.jsxs)(`ul`,{className:`help-list`,children:[(0,V.jsxs)(`li`,{children:[`主 Agent 可以使用 `,(0,V.jsx)(`code`,{children:`memory`}),` 和 `,(0,V.jsx)(`code`,{children:`skill_manage`}),` 工具主动保存;说“记住了”本身不会写入。`]}),(0,V.jsx)(`li`,{children:`每隔若干回合,系统会在独立会话中复盘最近证据。复盘不能读写工作区文件、执行命令或派发任务。`}),(0,V.jsx)(`li`,{children:`读取记忆和历史只返回带来源的参考数据,不能把记忆中的文字当作新的指令。`})]})]}),(0,V.jsxs)(`div`,{className:`help-card`,children:[(0,V.jsx)(`h4`,{children:`权限与审批`}),(0,V.jsxs)(`ul`,{className:`help-list`,children:[(0,V.jsx)(`li`,{children:`子 Agent 可以读取相关记忆,但没有写入权限。`}),(0,V.jsx)(`li`,{children:`后台复盘新增记忆可以直接保存;修改或删除旧条目会进入设置中的待审批列表。`}),(0,V.jsx)(`li`,{children:`在“设置 → 主动记忆”可以开关功能、调整复盘间隔、编辑条目和批准提案。`})]})]})]})}function b_(){return(0,V.jsxs)(`div`,{className:`help-section-group`,children:[(0,V.jsxs)(`div`,{className:`help-card highlight`,children:[(0,V.jsx)(`h4`,{children:`📚 它解决什么问题?`}),(0,V.jsx)(`p`,{children:`Agent 默认靠训练时的记忆回答项目里的问题。知识库让你把规范、设计稿、会议纪要导入工作区,Agent 在回答前检索这些文档的原文片段,而不是凭印象编造。它与“主动记忆”不同:记忆是 Agent 自己沉淀的事实和技能,知识库只有你能写入。`})]}),(0,V.jsxs)(`div`,{className:`help-card`,children:[(0,V.jsx)(`h4`,{children:`怎么用`}),(0,V.jsxs)(`ul`,{className:`help-list`,children:[(0,V.jsx)(`li`,{children:`在“设置 → 知识库”里点“浏览工作区文件…”,在弹出的浏览器里挑一个 Markdown 或文本文件,挑完即导入。也可以直接粘贴正文,或手动填写相对路径。`}),(0,V.jsx)(`li`,{children:`同一个文件内容改了再导入就是更新,不会留下旧版本;同样的内容换个标题再导入也不会变成两篇。`}),(0,V.jsx)(`li`,{children:`面板里的“试检索”会用和 Agent 相同的检索器回答,方便你在交给 Agent 之前先确认它找得到。`}),(0,V.jsxs)(`li`,{children:[`从下一条消息开始生效。Agent 使用 `,(0,V.jsx)(`code`,{children:`knowledge_search`}),` 检索,只拿得到片段和来源,拿不到整篇文档。`]})]})]}),(0,V.jsxs)(`div`,{className:`help-card`,children:[(0,V.jsx)(`h4`,{children:`语义检索是内置的`}),(0,V.jsxs)(`ul`,{className:`help-list`,children:[(0,V.jsxs)(`li`,{children:[`关键词检索始终可用。语义检索让“撤销购买”也能找到写着“取消订单”的段落,它靠一个`,(0,V.jsx)(`strong`,{children:`随安装包一起分发`}),`的中文模型在本机运行,不需要额外下载、不需要联网、也不会把文档发到任何服务。`]}),(0,V.jsxs)(`li`,{children:[`第一次检索时加载模型(约一秒),之后一直可用。设 `,(0,V.jsx)(`code`,{children:`SUPER_PI_KNOWLEDGE_EMBEDDINGS=0`}),` 可以彻底关闭语义检索,只保留关键词检索。`]})]})]}),(0,V.jsxs)(`div`,{className:`help-card`,children:[(0,V.jsx)(`h4`,{children:`它不知道的事`}),(0,V.jsxs)(`ul`,{className:`help-list`,children:[(0,V.jsx)(`li`,{children:`知识库只会检索它有的东西。文档里没写的,它检索出来也不会有——所以导入什么,直接决定它能回答什么。`}),(0,V.jsx)(`li`,{children:`语义检索总会返回“最接近的那一段”,即使这一段其实并不回答问题。检索结果带一个分数,低分意味着这可能只是最像的一条,Agent 会被要求先核对再使用。`}),(0,V.jsx)(`li`,{children:`Agent 对知识库只读,不能写入或删除;导入和删除只有你能做。`})]})]})]})}function x_(){return(0,V.jsxs)(`div`,{className:`help-section-group`,children:[(0,V.jsxs)(`div`,{className:`help-card highlight`,children:[(0,V.jsx)(`h4`,{children:`💡 Agent 是什么?`}),(0,V.jsxs)(`p`,{children:[`在 Super Pi 中,`,(0,V.jsx)(`strong`,{children:`Agent(智能体)`}),` 是一套独立的「角色提示词设定与能力配置」。 通过切换 Agent,模型将扮演专精工程师、系统架构师、代码审查员或规划专家等不同角色,遵循指定的原则来协助你完成任务。`]})]}),(0,V.jsxs)(`div`,{className:`help-card`,children:[(0,V.jsx)(`h4`,{children:`📁 Agent 文件存放在哪里?`}),(0,V.jsxs)(`ul`,{className:`help-list`,children:[(0,V.jsxs)(`li`,{children:[(0,V.jsx)(`strong`,{children:`内置 Agent 目录:`}),`项目根目录下的 `,(0,V.jsx)(`code`,{children:`agents/`}),` 文件夹,例如 `,(0,V.jsx)(`code`,{children:`agents/coder.md`}),`、`,(0,V.jsx)(`code`,{children:`agents/planner.md`}),`、`,(0,V.jsx)(`code`,{children:`agents/reviewer.md`}),` 等。`]}),(0,V.jsxs)(`li`,{children:[(0,V.jsx)(`strong`,{children:`用户自定义持久化目录:`}),`用户主目录下的 `,(0,V.jsx)(`code`,{children:`~/.super-pi/agents/`}),`,放入此目录的文件在所有项目和更新中均持久有效。`]})]})]}),(0,V.jsxs)(`div`,{className:`help-card`,children:[(0,V.jsx)(`h4`,{children:`🚀 如何创建一个全新的自定义 Agent?`}),(0,V.jsxs)(`div`,{className:`help-steps`,children:[(0,V.jsxs)(`div`,{className:`help-step`,children:[(0,V.jsx)(`span`,{className:`step-num`,children:`1`}),(0,V.jsxs)(`div`,{className:`step-body`,children:[(0,V.jsx)(`strong`,{children:`创建 Markdown 文件`}),(0,V.jsxs)(`p`,{children:[`在 `,(0,V.jsx)(`code`,{children:`agents/`}),` 或 `,(0,V.jsx)(`code`,{children:`~/.super-pi/agents/`}),` 目录下新建文件,例如 `,(0,V.jsx)(`code`,{children:`architect.md`}),`。`]})]})]}),(0,V.jsxs)(`div`,{className:`help-step`,children:[(0,V.jsx)(`span`,{className:`step-num`,children:`2`}),(0,V.jsxs)(`div`,{className:`step-body`,children:[(0,V.jsx)(`strong`,{children:`编写元数据与系统提示词`}),(0,V.jsx)(`p`,{children:`文件开头使用 YAML Frontmatter 声明名称和描述,正文编写设定提示词:`}),(0,V.jsx)(`pre`,{className:`help-code-block`,children:(0,V.jsx)(`code`,{children:`---
|
|
50
|
+
`)})]}),a&&!l&&a.hits.length===0&&(0,V.jsx)(`p`,{className:`quick-open-status`,"data-content-search-empty":`1`,children:`○ 没有匹配的行`}),(0,V.jsx)(`ul`,{className:`quick-open-results content-search-results`,role:`listbox`,children:a?.hits.map((e,t)=>(0,V.jsx)(`li`,{children:(0,V.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,V.jsxs)(`span`,{children:[e.path,`:`,e.line]}),(0,V.jsx)(`small`,{title:e.text,children:e.text})]})},`${e.path}:${e.line}`))})]})})}function i_({entries:e,complete:t,skipped:n,onOpen:r,onClose:i}){let[a,o]=(0,B.useState)(``),[s,c]=(0,B.useState)(0),l=(0,B.useRef)(null),u=(0,B.useMemo)(()=>e.filter(e=>e.kind===`file`&&e.text!==!1),[e]),d=(0,B.useMemo)(()=>a.trim()?new vg(u,{keys:[`path`],threshold:.38,ignoreLocation:!0}).search(a).slice(0,20).map(e=>e.item):u.slice(0,20),[u,a]);(0,B.useEffect)(()=>{l.current?.focus(),c(0)},[a]);let f=(0,B.useCallback)(e=>{e&&(r({path:e.path,name:e.path.split(`/`).pop()??e.path,text:e.text}),i())},[r,i]);return(0,V.jsx)(`div`,{className:`quick-open-backdrop`,"data-quick-open":`1`,role:`presentation`,onMouseDown:i,children:(0,V.jsxs)(`div`,{className:`quick-open`,role:`dialog`,"aria-modal":`true`,"aria-label":`快速打开`,onMouseDown:e=>e.stopPropagation(),children:[(0,V.jsx)(`input`,{ref:l,className:`quick-open-input`,"data-quick-open-input":`1`,value:a,placeholder:`快速打开:输入文件名或路径`,"aria-label":`快速打开文件路径`,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,V.jsxs)(`p`,{className:`quick-open-status`,"data-quick-open-status":t?`complete`:`partial`,children:[t?`✓ 索引完整`:`⚠ 索引不完整`,` · `,u.length,` 个文件 · Esc 关闭`]}),n.length>0&&(0,V.jsxs)(`p`,{className:`quick-open-status`,"data-quick-open-skipped":`1`,title:n.join(`, `),children:[`↷ 已跳过:`,n.join(`, `)]}),(0,V.jsx)(`ul`,{className:`quick-open-results`,role:`listbox`,children:d.map((e,t)=>(0,V.jsx)(`li`,{children:(0,V.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,V.jsx)(`span`,{children:e.path.split(`/`).pop()}),(0,V.jsx)(`small`,{children:e.path})]})},e.path))})]})})}function a_(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 o_(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 s_(e,t,n=88,r=200){let[i,a]=(0,B.useState)(()=>a_(e,0,n,r)),[o,s]=(0,B.useState)(null),c=(0,B.useCallback)(()=>{let i=a_(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,B.useRef)(t);(0,B.useEffect)(()=>{t<=0||l.current!==t&&(l.current=t,c())},[t,c]);let u=(0,B.useRef)(null);return(0,B.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 c_({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,B.useRef)(null),[d,f]=(0,B.useState)(0),{layout:p,frozen:m,recompute:h}=s_(e.length,d,a,o);(0,B.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=o_(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,B.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,V.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,V.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,V.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,V.jsx)(`span`,{className:`${s}-icon workspace-tab-icon`,children:i.icon}),i.badge,(0,V.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,V.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 l_={pending:`未开始`,running:`运行中`,completed:`已完成`,failed:`失败`,skipped:`已跳过`,stopped:`已停止`},u_={running:`运行中`,completed:`全部完成`,failed:`中途失败`,stopped:`已停止`},d_={pending:`○`,running:`◐`,completed:`✓`,failed:`✕`,skipped:`→`,stopped:`■`},f_={stop:`失败即停`,skip:`失败跳过`,"retry:1":`失败重试 1 次`,"retry:2":`失败重试 2 次`,"retry:3":`失败重试 3 次`};function p_(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 m_(e){let t=e.status===`running`,[n,r]=(0,B.useState)(0);(0,B.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 h_({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,V.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,V.jsx)(`span`,{className:`workflow-step-mark`,"aria-hidden":`true`,children:d_[e.status]}),(0,V.jsxs)(`span`,{className:`workflow-step-n`,"data-workflow-step-n":e.index+1,children:[`第 `,e.index+1,` 步`]}),(0,V.jsx)(`strong`,{className:`workflow-step-name`,"data-workflow-step-name":e.index+1,children:a}),(0,V.jsx)(`span`,{className:`workflow-step-agent`,"data-workflow-step-agent-name":e.index+1,children:i}),n>1&&(0,V.jsxs)(`span`,{className:`workflow-step-tries`,"data-workflow-step-retried":e.index+1,children:[`尝试 `,n,` 次`]}),(0,V.jsx)(`span`,{className:`workflow-step-status`,"data-workflow-step-status-text":e.index+1,children:l_[e.status]}),e.status===`failed`&&r?.error&&(0,V.jsx)(`span`,{className:`workflow-step-why`,"data-workflow-step-error":e.index+1,title:Zf(r.error),children:Xf(r.error,`这一步没有完成。`)})]})}function g_({workflow:e,names:t,onStop:n,stopping:r}){let i=e.status===`running`,a=m_(e),o=e.steps.filter(e=>e.status===`completed`||e.status===`skipped`).length;return(0,V.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,V.jsxs)(`div`,{className:`workflow-head`,children:[(0,V.jsx)(`span`,{className:`workflow-badge`,children:`编排`}),(0,V.jsx)(`strong`,{className:`workflow-summary`,"data-workflow-summary":e.id,children:e.summary}),(0,V.jsxs)(`span`,{className:`workflow-progress`,"data-workflow-progress":e.id,children:[o,`/`,e.steps.length]}),(0,V.jsx)(`span`,{className:`workflow-status`,"data-workflow-status-text":e.id,children:u_[e.status]??`未知状态`}),(0,V.jsx)(`span`,{className:`workflow-policy`,"data-workflow-policy":e.onFailure,children:f_[e.onFailure]??e.onFailure}),a!==void 0&&(0,V.jsxs)(`span`,{className:`workflow-clock`,"data-workflow-elapsed":e.id,children:[i?`已运行 `:`用时 `,p_(a)]}),i&&(0,V.jsx)(`button`,{type:`button`,className:`workflow-stop`,"data-workflow-stop":e.id,disabled:r,onClick:n,children:`停止`})]}),(0,V.jsx)(`ol`,{className:`workflow-steps`,"data-workflow-step-count":e.steps.length,children:e.steps.map(e=>(0,V.jsx)(h_,{step:e,names:t},e.index))})]})}var __=[{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 v_({onClose:e}){let[t,n]=(0,B.useState)(`agents`);(0,B.useEffect)(()=>{let t=t=>{t.key===`Escape`&&!t.defaultPrevented&&e()};return window.addEventListener(`keydown`,t),()=>window.removeEventListener(`keydown`,t)},[e]);let r=__.find(e=>e.id===t)??__[0];return(0,V.jsx)(`div`,{className:`overlay`,onClick:e,children:(0,V.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,V.jsxs)(`div`,{className:`settings-window-head help-window-head`,children:[(0,V.jsxs)(`div`,{className:`help-head-title`,children:[(0,V.jsx)(`h2`,{id:`help-window-title`,children:`使用指南与帮助`}),(0,V.jsx)(`span`,{className:`help-badge`,children:`v0.1.x`})]}),(0,V.jsx)(`button`,{type:`button`,className:`help-close-button`,"aria-label":`关闭指南`,onClick:e,children:`✕`})]}),(0,V.jsxs)(`div`,{className:`settings-window-body help-window-body`,children:[(0,V.jsxs)(`nav`,{className:`settings-nav help-nav`,role:`tablist`,"aria-orientation":`vertical`,"aria-label":`使用指南分类`,children:[(0,V.jsx)(`div`,{className:`settings-nav-label`,children:`目录`}),__.map(e=>(0,V.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,V.jsx)(`span`,{className:`help-tab-icon`,"aria-hidden":`true`,children:e.icon}),(0,V.jsx)(`span`,{children:e.label})]},e.id))]}),(0,V.jsxs)(`div`,{id:`help-panel`,className:`settings-panel help-panel`,role:`tabpanel`,"aria-labelledby":`help-tab-${r.id}`,children:[(0,V.jsxs)(`div`,{className:`help-panel-header`,children:[(0,V.jsx)(`h3`,{className:`help-panel-title`,children:r.title}),(0,V.jsx)(`p`,{className:`help-panel-desc`,children:r.description})]}),(0,V.jsxs)(`div`,{className:`help-panel-content`,children:[r.id===`agents`&&(0,V.jsx)(x_,{}),r.id===`workspace`&&(0,V.jsx)(S_,{}),r.id===`subagents`&&(0,V.jsx)(w_,{}),r.id===`model-policy`&&(0,V.jsx)(C_,{}),r.id===`memory`&&(0,V.jsx)(y_,{}),r.id===`knowledge`&&(0,V.jsx)(b_,{}),r.id===`tools`&&(0,V.jsx)(T_,{}),r.id===`cli`&&(0,V.jsx)(E_,{}),r.id===`themes`&&(0,V.jsx)(D_,{})]}),(0,V.jsx)(`div`,{className:`picker-actions help-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,onClick:e,children:`关闭`})})]})]})]})})}function y_(){return(0,V.jsxs)(`div`,{className:`help-section-group`,children:[(0,V.jsxs)(`div`,{className:`help-card highlight`,children:[(0,V.jsx)(`h4`,{children:`🧠 它会记住什么?`}),(0,V.jsx)(`p`,{children:`用户档案保存跨工作区的长期偏好;工作区事实保存环境与项目约定;技能保存已经验证过的步骤、命令和坑。临时结果、秘密和未验证的失败不会保存。`})]}),(0,V.jsxs)(`div`,{className:`help-card`,children:[(0,V.jsx)(`h4`,{children:`主动保存与后台复盘`}),(0,V.jsxs)(`ul`,{className:`help-list`,children:[(0,V.jsxs)(`li`,{children:[`主 Agent 可以使用 `,(0,V.jsx)(`code`,{children:`memory`}),` 和 `,(0,V.jsx)(`code`,{children:`skill_manage`}),` 工具主动保存;说“记住了”本身不会写入。`]}),(0,V.jsx)(`li`,{children:`每隔若干回合,系统会在独立会话中复盘最近证据。复盘不能读写工作区文件、执行命令或派发任务。`}),(0,V.jsx)(`li`,{children:`读取记忆和历史只返回带来源的参考数据,不能把记忆中的文字当作新的指令。`})]})]}),(0,V.jsxs)(`div`,{className:`help-card`,children:[(0,V.jsx)(`h4`,{children:`权限与审批`}),(0,V.jsxs)(`ul`,{className:`help-list`,children:[(0,V.jsx)(`li`,{children:`子 Agent 可以读取相关记忆,但没有写入权限。`}),(0,V.jsx)(`li`,{children:`后台复盘新增记忆可以直接保存;修改或删除旧条目会进入设置中的待审批列表。`}),(0,V.jsx)(`li`,{children:`在“设置 → 主动记忆”可以开关功能、调整复盘间隔、编辑条目和批准提案。`})]})]})]})}function b_(){return(0,V.jsxs)(`div`,{className:`help-section-group`,children:[(0,V.jsxs)(`div`,{className:`help-card highlight`,children:[(0,V.jsx)(`h4`,{children:`📚 它解决什么问题?`}),(0,V.jsx)(`p`,{children:`Agent 默认靠训练时的记忆回答项目里的问题。知识库让你把规范、设计稿、会议纪要导入工作区,Agent 在回答前检索这些文档的原文片段,而不是凭印象编造。它与“主动记忆”不同:记忆是 Agent 自己沉淀的事实和技能,知识库的内容来自工作区里真实存在的文档。`})]}),(0,V.jsxs)(`div`,{className:`help-card`,children:[(0,V.jsx)(`h4`,{children:`怎么用`}),(0,V.jsxs)(`ul`,{className:`help-list`,children:[(0,V.jsxs)(`li`,{children:[`在“设置 → 知识库”里点“浏览工作区文件…”,在弹出的浏览器里挑一个 Markdown 或文本文件,挑完即导入。也可以直接粘贴正文、手动填写相对路径,或者直接对 Agent 说“把某某文件加入知识库”——它会用 `,(0,V.jsx)(`code`,{children:`knowledge_import`}),` 导入,走的是同一条服务端校验。`]}),(0,V.jsx)(`li`,{children:`同一个文件内容改了再导入就是更新,不会留下旧版本;同样的内容换个标题再导入也不会变成两篇。`}),(0,V.jsx)(`li`,{children:`面板里的“试检索”会用和 Agent 相同的检索器回答,方便你在交给 Agent 之前先确认它找得到。`}),(0,V.jsxs)(`li`,{children:[`从下一条消息开始生效。Agent 使用 `,(0,V.jsx)(`code`,{children:`knowledge_search`}),` 检索,只拿得到片段和来源,拿不到整篇文档。`]})]})]}),(0,V.jsxs)(`div`,{className:`help-card`,children:[(0,V.jsx)(`h4`,{children:`语义检索是内置的`}),(0,V.jsxs)(`ul`,{className:`help-list`,children:[(0,V.jsxs)(`li`,{children:[`关键词检索始终可用。语义检索让“撤销购买”也能找到写着“取消订单”的段落,它靠一个`,(0,V.jsx)(`strong`,{children:`随安装包一起分发`}),`的中文模型在本机运行,不需要额外下载、不需要联网、也不会把文档发到任何服务。`]}),(0,V.jsxs)(`li`,{children:[`第一次检索时加载模型(约一秒),之后一直可用。设 `,(0,V.jsx)(`code`,{children:`SUPER_PI_KNOWLEDGE_EMBEDDINGS=0`}),` 可以彻底关闭语义检索,只保留关键词检索。`]})]})]}),(0,V.jsxs)(`div`,{className:`help-card`,children:[(0,V.jsx)(`h4`,{children:`它不知道的事`}),(0,V.jsxs)(`ul`,{className:`help-list`,children:[(0,V.jsx)(`li`,{children:`知识库只会检索它有的东西。文档里没写的,它检索出来也不会有——所以导入什么,直接决定它能回答什么。`}),(0,V.jsx)(`li`,{children:`语义检索总会返回“最接近的那一段”,即使这一段其实并不回答问题。检索结果带一个分数,低分意味着这可能只是最像的一条,Agent 会被要求先核对再使用。`}),(0,V.jsxs)(`li`,{children:[`Agent 可以按你的要求把工作区文件导入知识库(`,(0,V.jsx)(`code`,{children:`knowledge_import`}),`,只接受文本类文件),但`,(0,V.jsx)(`strong`,{children:`不能删除`}),`——删除文档只有你能在“设置 → 知识库”里做。`]})]})]})]})}function x_(){return(0,V.jsxs)(`div`,{className:`help-section-group`,children:[(0,V.jsxs)(`div`,{className:`help-card highlight`,children:[(0,V.jsx)(`h4`,{children:`💡 Agent 是什么?`}),(0,V.jsxs)(`p`,{children:[`在 Super Pi 中,`,(0,V.jsx)(`strong`,{children:`Agent(智能体)`}),` 是一套独立的「角色提示词设定与能力配置」。 通过切换 Agent,模型将扮演专精工程师、系统架构师、代码审查员或规划专家等不同角色,遵循指定的原则来协助你完成任务。`]})]}),(0,V.jsxs)(`div`,{className:`help-card`,children:[(0,V.jsx)(`h4`,{children:`📁 Agent 文件存放在哪里?`}),(0,V.jsxs)(`ul`,{className:`help-list`,children:[(0,V.jsxs)(`li`,{children:[(0,V.jsx)(`strong`,{children:`内置 Agent 目录:`}),`项目根目录下的 `,(0,V.jsx)(`code`,{children:`agents/`}),` 文件夹,例如 `,(0,V.jsx)(`code`,{children:`agents/coder.md`}),`、`,(0,V.jsx)(`code`,{children:`agents/planner.md`}),`、`,(0,V.jsx)(`code`,{children:`agents/reviewer.md`}),` 等。`]}),(0,V.jsxs)(`li`,{children:[(0,V.jsx)(`strong`,{children:`用户自定义持久化目录:`}),`用户主目录下的 `,(0,V.jsx)(`code`,{children:`~/.super-pi/agents/`}),`,放入此目录的文件在所有项目和更新中均持久有效。`]})]})]}),(0,V.jsxs)(`div`,{className:`help-card`,children:[(0,V.jsx)(`h4`,{children:`🚀 如何创建一个全新的自定义 Agent?`}),(0,V.jsxs)(`div`,{className:`help-steps`,children:[(0,V.jsxs)(`div`,{className:`help-step`,children:[(0,V.jsx)(`span`,{className:`step-num`,children:`1`}),(0,V.jsxs)(`div`,{className:`step-body`,children:[(0,V.jsx)(`strong`,{children:`创建 Markdown 文件`}),(0,V.jsxs)(`p`,{children:[`在 `,(0,V.jsx)(`code`,{children:`agents/`}),` 或 `,(0,V.jsx)(`code`,{children:`~/.super-pi/agents/`}),` 目录下新建文件,例如 `,(0,V.jsx)(`code`,{children:`architect.md`}),`。`]})]})]}),(0,V.jsxs)(`div`,{className:`help-step`,children:[(0,V.jsx)(`span`,{className:`step-num`,children:`2`}),(0,V.jsxs)(`div`,{className:`step-body`,children:[(0,V.jsx)(`strong`,{children:`编写元数据与系统提示词`}),(0,V.jsx)(`p`,{children:`文件开头使用 YAML Frontmatter 声明名称和描述,正文编写设定提示词:`}),(0,V.jsx)(`pre`,{className:`help-code-block`,children:(0,V.jsx)(`code`,{children:`---
|
|
51
51
|
name: 系统架构师
|
|
52
52
|
description: 专注于系统架构拆解、模块解耦与技术选型分析
|
|
53
53
|
---
|
|
@@ -72,7 +72,7 @@ pi update npm:@evandu/super-pi
|
|
|
72
72
|
|
|
73
73
|
# 独立启动(无需 Pi 环境)
|
|
74
74
|
npx @evandu/super-pi`})})]}),(0,V.jsxs)(`div`,{className:`help-card`,children:[(0,V.jsx)(`h4`,{children:`🎯 键盘快捷键`}),(0,V.jsxs)(`div`,{className:`help-command-table`,children:[(0,V.jsxs)(`div`,{className:`cmd-row`,children:[(0,V.jsx)(`code`,{children:`Enter`}),(0,V.jsx)(`span`,{children:`发送对话消息`})]}),(0,V.jsxs)(`div`,{className:`cmd-row`,children:[(0,V.jsx)(`code`,{children:`Shift + Enter`}),(0,V.jsx)(`span`,{children:`输入框内换行`})]}),(0,V.jsxs)(`div`,{className:`cmd-row`,children:[(0,V.jsx)(`code`,{children:`Esc`}),(0,V.jsx)(`span`,{children:`快速关闭当前顶层弹窗(使用指南、设置、工作区选择器等)`})]})]})]})]})}function D_(){return(0,V.jsx)(`div`,{className:`help-section-group`,children:(0,V.jsxs)(`div`,{className:`help-card`,children:[(0,V.jsx)(`h4`,{children:`🎨 4 款主题,来自 VSCode 流行主题`}),(0,V.jsxs)(`div`,{className:`help-theme-list`,children:[(0,V.jsxs)(`div`,{className:`help-theme-item`,children:[(0,V.jsx)(`strong`,{children:`🟣 Dracula`}),(0,V.jsx)(`p`,{children:`紫调暗色,饱满对比,适合夜间专注编程。`})]}),(0,V.jsxs)(`div`,{className:`help-theme-item`,children:[(0,V.jsx)(`strong`,{children:`🟠 Monokai`}),(0,V.jsx)(`p`,{children:`暖调暗色,橙红点缀,经典编辑器风格。`})]}),(0,V.jsxs)(`div`,{className:`help-theme-item`,children:[(0,V.jsx)(`strong`,{children:`🟡 Solarized Light`}),(0,V.jsx)(`p`,{children:`暖黄米色调,柔和护眼,适合长时间阅读。`})]}),(0,V.jsxs)(`div`,{className:`help-theme-item`,children:[(0,V.jsx)(`strong`,{children:`🔵 GitHub Light`}),(0,V.jsx)(`p`,{children:`冷调浅色,中性清晰,日常办公首选。`})]})]}),(0,V.jsxs)(`p`,{className:`help-hint`,children:[`可在左侧栏底部的 `,(0,V.jsx)(`strong`,{children:`⚙ 设置`}),` 中一键切换主题,设置会自动持久化保存在本地。`]})]})})}function O_({workspaceId:e,onClose:t}){let[n,r]=(0,B.useState)(),[i,a]=(0,B.useState)(``),[o,s]=(0,B.useState)(!1),[c,l]=(0,B.useState)(`memory`),[u,d]=(0,B.useState)(``),[f,p]=(0,B.useState)(),m=(0,B.useRef)(e);m.current=e;let h=(0,B.useRef)(0);async function g(t){if(!e)return;let n=++h.current;s(!0),a(``);try{let i=await fetch(`/api/memory?workspaceId=${encodeURIComponent(e)}`,{method:t?`POST`:`GET`,headers:{"Content-Type":`application/json`},...t?{body:JSON.stringify(t)}:{}}),a=await i.json();if(!i.ok)throw Error(a.error);return m.current!==e||n!==h.current?!1:(r(a),!0)}catch(t){return m.current===e&&n===h.current&&a(Xf(t,`记忆读取失败。`)),!1}finally{m.current===e&&n===h.current&&s(!1)}}return(0,B.useEffect)(()=>{r(void 0),p(void 0),d(``),g()},[e]),e?(0,V.jsxs)(`section`,{"data-memory-panel":`1`,className:`settings-panel-container`,children:[(0,V.jsx)(`div`,{className:`settings-agents-header`,children:(0,V.jsxs)(`p`,{className:`settings-agents-desc`,children:[(0,V.jsx)(`strong`,{children:`长期知识与经验复盘。`}),` 用户档案跨工作区共享;工作区事实、技能和历史召回按当前工作区隔离。后台复盘不会静默删除旧记忆。`]})}),i&&(0,V.jsx)(`div`,{className:`settings-dir-error`,role:`alert`,children:i}),n&&(0,V.jsxs)(`fieldset`,{disabled:o,className:`settings-memory-fieldset`,children:[(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`主动记忆机制配置`}),(0,V.jsxs)(`div`,{className:`settings-memory-switches`,children:[(0,V.jsxs)(`label`,{className:`settings-checkbox-label`,children:[(0,V.jsx)(`input`,{type:`checkbox`,checked:n.settings.enabled,onChange:e=>void g({action:`configure`,settings:{...n.settings,enabled:e.target.checked}})}),`启用主动记忆`]}),(0,V.jsxs)(`label`,{className:`settings-checkbox-label`,children:[(0,V.jsx)(`input`,{type:`checkbox`,checked:n.settings.writeApproval,onChange:e=>void g({action:`configure`,settings:{...n.settings,writeApproval:e.target.checked}})}),`Agent 写入均需审批`]})]}),(0,V.jsxs)(`div`,{className:`settings-memory-interval-row`,style:{marginTop:10},children:[(0,V.jsxs)(`label`,{className:`settings-memory-interval-label`,children:[`复盘间隔(用户回合,0 为关闭):`,(0,V.jsx)(`input`,{"aria-label":`复盘间隔`,type:`number`,min:`0`,className:`settings-dir-input settings-interval-input`,value:n.settings.reviewInterval,onChange:e=>r({...n,settings:{...n.settings,reviewInterval:Number(e.target.value)}})})]}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-add-btn`,onClick:()=>void g({action:`configure`,settings:n.settings}),children:`保存间隔`})]})]}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsxs)(`div`,{className:`settings-memory-category-header`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`记忆条目管理`}),(0,V.jsxs)(`select`,{"aria-label":`记忆类别`,className:`settings-memory-select`,value:c,onChange:e=>{l(e.target.value),p(void 0),d(``)},children:[(0,V.jsx)(`option`,{value:`user`,children:`用户档案(全局共享)`}),(0,V.jsx)(`option`,{value:`memory`,children:`工作区事实(当前工作区)`}),(0,V.jsx)(`option`,{value:`skills`,children:`技能与经验(当前工作区)`})]})]}),(n.entries[c]??[]).length===0?(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`当前类别暂无条目。在下方输入内容即可添加。`}):(0,V.jsx)(`div`,{className:`settings-memory-entries-list`,children:(n.entries[c]??[]).map(e=>(0,V.jsxs)(`article`,{"data-memory-entry":e.id,className:`settings-memory-card`,children:[(0,V.jsx)(`pre`,{className:`settings-memory-content`,children:e.content}),(0,V.jsxs)(`div`,{className:`settings-memory-card-actions`,children:[(0,V.jsx)(`button`,{type:`button`,className:`settings-rule-edit-btn`,onClick:()=>{p(e.id),d(e.content)},children:`编辑`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-remove-btn`,onClick:()=>void g({action:`write`,operation:{target:c,action:`remove`,id:e.id}}),children:`删除`})]})]},e.id))}),(0,V.jsxs)(`div`,{className:`settings-memory-editor`,style:{marginTop:12},children:[(0,V.jsx)(`h5`,{className:`settings-memory-editor-title`,children:f?`编辑条目`:`添加新条目`}),(0,V.jsx)(`textarea`,{"aria-label":`记忆内容`,className:`settings-memory-textarea`,placeholder:c===`skills`?`# 技能名称
|
|
75
|
-
已验证的步骤、命令和注意事项`:`输入长期有效的事实或偏好`,value:u,onChange:e=>d(e.target.value)}),(0,V.jsxs)(`div`,{className:`settings-rule-form-buttons`,children:[(0,V.jsxs)(`button`,{type:`button`,className:`settings-dir-add-btn`,disabled:!u.trim(),onClick:async()=>{await g({action:`write`,operation:{target:c,action:f?`replace`:`add`,id:f,content:u}})&&(p(void 0),d(``))},children:[`保存`,f?`修改`:`新条目`]}),f&&(0,V.jsx)(`button`,{type:`button`,className:`settings-rule-cancel-btn`,onClick:()=>{p(void 0),d(``)},children:`取消编辑`})]})]})]}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsxs)(`h4`,{className:`settings-section-title`,children:[`待审批提案(共 `,n.pending.length,` 个)`]}),n.pending.length===0?(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`暂无待审批提案。`}):(0,V.jsx)(`div`,{className:`settings-dirs-list`,children:n.pending.map(e=>(0,V.jsxs)(`article`,{"data-memory-proposal":e.id,className:`settings-proposal-card`,children:[(0,V.jsxs)(`div`,{className:`settings-proposal-header`,children:[(0,V.jsx)(`span`,{className:`settings-proposal-badge`,children:e.operation.target}),(0,V.jsx)(`span`,{className:`settings-proposal-action`,children:e.operation.action})]}),e.previous&&(0,V.jsxs)(`pre`,{className:`settings-proposal-diff old`,children:[`原内容:`,e.previous]}),(0,V.jsx)(`pre`,{className:`settings-proposal-diff new`,children:e.operation.content}),(0,V.jsxs)(`div`,{className:`settings-proposal-actions`,children:[(0,V.jsx)(`button`,{type:`button`,className:`settings-rule-edit-btn`,onClick:()=>void g({action:`approve`,proposalId:e.id}),children:`批准`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-remove-btn`,onClick:()=>void g({action:`discard`,proposalId:e.id}),children:`拒绝`})]})]},e.id))})]})]}),t&&(0,V.jsx)(`div`,{className:`picker-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,onClick:t,children:`完成`})})]}):(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`请先在主界面选择工作区以管理其专属记忆与技能。`})}function k_({workspaceId:e,onClose:t,onPick:n}){let[r,i]=(0,B.useState)(),[a,o]=(0,B.useState)(!1),[s,c]=(0,B.useState)(``),[l,u]=(0,B.useState)(``),[d,f]=(0,B.useState)(),p=(0,B.useRef)(0);async function m(t){let n=++p.current;o(!0),c(``);try{let r=await fetch(`/api/files?workspaceId=${encodeURIComponent(e)}${t?`&path=${encodeURIComponent(t)}`:``}`),a=await r.json();if(!r.ok)throw Error(a.error??`HTTP ${r.status}`);if(n!==p.current)return;i(a),f(void 0)}catch(e){n===p.current&&c(Xf(e,`这个目录读取失败。`))}finally{n===p.current&&o(!1)}}(0,B.useEffect)(()=>{m()},[e]),(0,B.useEffect)(()=>{let e=e=>{e.key===`Escape`&&!e.isComposing&&t()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[t]);let h=l.trim().toLocaleLowerCase(),g=(0,B.useMemo)(()=>(r?.entries??[]).filter(e=>e.kind===`directory`||e.kind===`file`&&e.text&&!e.outside),[r]),_=h?g.filter(e=>e.name.toLocaleLowerCase().includes(h)):g;return(0,V.jsx)(`div`,{className:`overlay`,onClick:t,children:(0,V.jsxs)(`div`,{className:`picker knowledge-picker`,"data-knowledge-picker":`1`,onClick:e=>e.stopPropagation(),role:`dialog`,"aria-modal":`true`,"aria-label":`选择要导入的文档`,children:[(0,V.jsx)(`h2`,{children:`选择要导入的文档`}),(0,V.jsxs)(`div`,{className:`picker-path-bar`,children:[(0,V.jsx)(`input`,{"aria-label":`按文件名过滤`,className:`picker-path-input`,placeholder:`按文件名过滤…`,value:l,onChange:e=>u(e.target.value)}),(0,V.jsx)(`button`,{type:`button`,className:`picker-up-btn`,disabled:!r||r.parent===null||a,onClick:()=>void m(r?.parent??void 0),"aria-label":`上一级`,children:`↑`})]}),(0,V.jsx)(`div`,{className:`picker-status`,"data-knowledge-picker-path":r?.path??``,children:r?r.path||`工作区根目录`:`读取中…`}),s&&(0,V.jsx)(`div`,{className:`picker-error`,role:`alert`,children:s}),(0,V.jsx)(`div`,{className:`picker-list`,"data-knowledge-picker-list":_.length,children:_.length===0?(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:h?`没有匹配的文件。`:`这个目录里没有可导入的文本文件。`}):_.map(e=>e.kind===`directory`?(0,V.jsxs)(`button`,{type:`button`,className:`picker-dir`,"data-knowledge-picker-dir":e.path,onClick:()=>void m(e.path),children:[`📁 `,e.name]},e.path):(0,V.jsxs)(`button`,{type:`button`,className:`picker-dir`,"data-knowledge-picker-file":e.path,"aria-pressed":d===e.path,onClick:()=>f(e.path),onDoubleClick:()=>n(e.path),children:[`📄 `,e.name]},e.path))}),(0,V.jsxs)(`div`,{className:`picker-actions`,children:[(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,onClick:t,children:`取消`}),(0,V.jsx)(`button`,{type:`button`,className:`picker-ok`,disabled:!d,"data-knowledge-picker-ok":d??``,onClick:()=>{d&&n(d)},children:`导入这个文档`})]})]})})}function A_({workspaceId:e,onClose:t}){let[n,r]=(0,B.useState)(),[i,a]=(0,B.useState)(``),[o,s]=(0,B.useState)(!1),[c,l]=(0,B.useState)(``),[u,d]=(0,B.useState)(``),[f,p]=(0,B.useState)(``),[m,h]=(0,B.useState)(``),[g,_]=(0,B.useState)(!1),v=(0,B.useRef)(e);v.current=e;let y=(0,B.useRef)(0);async function b(t){if(!e)return;let n=++y.current;s(!0),a(``);try{let i=await fetch(`/api/knowledge?workspaceId=${encodeURIComponent(e)}`,{method:t?`POST`:`GET`,headers:{"Content-Type":`application/json`},...t?{body:JSON.stringify(t)}:{}}),a=await i.json();if(!i.ok)throw Error(a.error);return v.current!==e||n!==y.current?!1:(r(a),!0)}catch(t){return v.current===e&&n===y.current&&a(Xf(t,`知识库读取失败。`)),!1}finally{v.current===e&&n===y.current&&s(!1)}}if((0,B.useEffect)(()=>{r(void 0),l(``),d(``),p(``),h(``),b()},[e]),!e)return(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`请先在主界面选择工作区以管理它的知识库。`});let x=n?.documents??[],S=x.reduce((e,t)=>e+t.characters,0),C=n?.semantic,w=C?C.enabled?C.error?`不可用:${Xf(C.error,`本地语义模型没有加载成功`)};已退回关键词检索`:C.ready?`已就绪,已索引 ${C.indexed} 个片段`:C.bundled===!1?`随包分发的模型缺失;已退回关键词检索`:`首次检索时加载本地模型,之后一直可用`:`已关闭(SUPER_PI_KNOWLEDGE_EMBEDDINGS=0)`:`未启用`;return(0,V.jsxs)(`section`,{"data-knowledge-panel":`1`,className:`settings-panel-container`,children:[(0,V.jsx)(`div`,{className:`settings-agents-header`,children:(0,V.jsxs)(`p`,{className:`settings-agents-desc`,children:[(0,V.jsx)(`strong`,{children:`项目自己的文档。`}),` 浏览工作区里的规范、设计稿、会议纪要导入进来,Agent 就能在回答前检索原文,而不是凭记忆编造。文档按当前工作区隔离,检索结果只回传片段而不回传全文。关键词检索始终可用;语义检索能在用词不同的情况下找到片段,但代价是首次使用要下载一个本地模型。`]})}),(0,V.jsxs)(`div`,{className:`settings-dir-info`,"data-knowledge-semantic":C?C.error?`unavailable`:C.ready?`ready`:`loading`:`off`,title:C?.error,children:[`语义检索:`,w]}),i&&(0,V.jsx)(`div`,{className:`settings-dir-error`,role:`alert`,children:i}),n&&(0,V.jsxs)(`fieldset`,{disabled:o,className:`settings-memory-fieldset`,children:[(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsxs)(`h4`,{className:`settings-section-title`,children:[`从工作区文件导入(`,x.length,` 篇,共 `,S,` 字符)`]}),(0,V.jsxs)(`div`,{className:`settings-add-dir-form`,children:[(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-add-btn`,"data-knowledge-browse":`1`,onClick:()=>_(!0),children:`浏览工作区文件…`}),(0,V.jsx)(`span`,{className:`settings-dir-info`,children:`在工作区里挑选一个 Markdown 或文本文件`})]}),(0,V.jsxs)(`div`,{className:`settings-add-dir-form`,style:{marginTop:8},children:[(0,V.jsx)(`input`,{"aria-label":`文档路径`,className:`settings-dir-input`,placeholder:`或直接填写相对路径,例如 docs/design.md`,value:c,onChange:e=>l(e.target.value)}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-add-btn`,disabled:!c.trim(),onClick:async()=>{await b({action:`add`,path:c})&&l(``)},children:`导入`})]}),(0,V.jsxs)(`div`,{className:`settings-memory-editor`,style:{marginTop:12},children:[(0,V.jsx)(`h5`,{className:`settings-memory-editor-title`,children:`或者直接粘贴正文`}),(0,V.jsx)(`input`,{"aria-label":`文档标题`,className:`settings-dir-input`,placeholder:`标题(留空则取正文首行)`,value:u,onChange:e=>d(e.target.value)}),(0,V.jsx)(`textarea`,{"aria-label":`文档正文`,className:`settings-memory-textarea`,placeholder:`以 # 开头的标题会成为检索结果里的段落归属`,value:f,onChange:e=>p(e.target.value)}),(0,V.jsxs)(`div`,{className:`settings-rule-form-buttons`,children:[(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-add-btn`,disabled:!f.trim(),onClick:async()=>{await b({action:`add`,title:u,text:f})&&(d(``),p(``))},children:`保存文档`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-rule-cancel-btn`,onClick:()=>{d(``),p(``)},children:`清空`})]})]})]}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`已导入文档`}),x.length===0?(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`还没有文档。导入后,下一条消息起 Agent 就能检索到它们。`}):(0,V.jsx)(`div`,{className:`settings-dirs-list`,children:x.map(e=>(0,V.jsxs)(`article`,{"data-knowledge-document":e.id,className:`settings-memory-card`,children:[(0,V.jsxs)(`div`,{className:`settings-dir-row`,children:[(0,V.jsx)(`span`,{className:`settings-dir-tag`,children:e.format||`txt`}),(0,V.jsx)(`span`,{className:`settings-dir-path`,children:e.title}),(0,V.jsxs)(`span`,{className:`settings-dir-count`,children:[e.characters,` 字符`]})]}),(0,V.jsx)(`div`,{className:`settings-dir-info`,children:e.source}),(0,V.jsx)(`div`,{className:`settings-memory-card-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-remove-btn`,onClick:()=>void b({action:`remove`,documentId:e.id}),children:`删除`})})]},e.id))})]}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`试检索`}),(0,V.jsxs)(`div`,{className:`settings-add-dir-form`,children:[(0,V.jsx)(`input`,{"aria-label":`检索词`,className:`settings-dir-input`,placeholder:`用和提问时相同的措辞试试`,value:m,onChange:e=>h(e.target.value),onKeyDown:e=>{e.key===`Enter`&&m.trim()&&b({action:`search`,query:m})}}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-add-btn`,disabled:!m.trim(),onClick:()=>void b({action:`search`,query:m}),children:`检索`})]}),m.trim()&&(n?.hits?.length===0?(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`没有命中。知识库确实没有这段内容——Agent 也会得到同样的空结果。`}):(0,V.jsx)(`div`,{className:`settings-memory-entries-list`,children:(n?.hits??[]).map(e=>(0,V.jsxs)(`article`,{"data-knowledge-hit":`${e.documentId}#${e.chunk}`,className:`settings-memory-card`,children:[(0,V.jsxs)(`div`,{className:`settings-dir-row`,children:[(0,V.jsx)(`span`,{className:`settings-dir-tag`,children:e.title}),(0,V.jsxs)(`span`,{className:`settings-dir-count`,title:`相关度(越高越接近)`,children:[`相关度 `,e.score.toFixed(2)]})]}),e.heading&&(0,V.jsx)(`div`,{className:`settings-dir-info`,children:e.heading}),(0,V.jsx)(`pre`,{className:`settings-memory-content`,children:e.text})]},`${e.documentId}#${e.chunk}`))}))]})]}),t&&(0,V.jsx)(`div`,{className:`picker-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,onClick:t,children:`完成`})}),g&&(0,V.jsx)(k_,{workspaceId:e,onClose:()=>_(!1),onPick:async e=>{_(!1),await b({action:`add`,path:e})&&l(``)}})]})}var j_=[{kind:`calculator`,name:`计算器`,glyph:`∑`,blurb:`算术表达式,四则运算与乘方。除零会明确报错。`},{kind:`timestamp`,name:`时间戳`,glyph:`◷`,blurb:`Unix 时间戳与日期互转,本地计算,不联网。`}],M_=[{id:`preset_calculator`,kind:`calculator`,name:`计算器`,glyph:`∑`}],N_=40,P_=2048,F_=`super-pi:tools:v1`;function I_(e){return typeof e==`string`?e.replace(/\s+/g,` `).trim().slice(0,N_):``}function L_(e){let t=e.trim();if(!t)return{ok:!1,reason:`请填写网址。`};if(t.length>P_)return{ok:!1,reason:`网址太长了,请控制在 ${P_} 个字符以内。`};let n=xp(t);return n?{ok:!0,url:n}:{ok:!1,reason:`这个网址不是允许的协议。只支持 http / https / mailto 开头的网址。`}}function R_(e){if(!e)return[];let t;try{t=JSON.parse(e)}catch{return[]}if(!Array.isArray(t))return[];let n=[],r=new Set;for(let e of t){if(n.length>=32)break;if(typeof e!=`object`||!e)continue;let t=e,i=t.kind;if(typeof i!=`string`||i!==`calculator`&&i!==`timestamp`&&i!==`link`)continue;let a=I_(t.name);if(!a)continue;let o=typeof t.glyph==`string`&&t.glyph.trim()?t.glyph.trim().slice(0,4):``;if(!o)continue;let s=typeof t.id==`string`&&t.id.trim()?t.id.trim().slice(0,64):``;if(s&&!r.has(s)){if(i===`link`){let e=xp(typeof t.url==`string`?t.url:``);if(!e)continue;r.add(s),n.push({id:s,kind:`link`,name:a,glyph:o,url:e})}else r.add(s),n.push({id:s,kind:i,name:a,glyph:o})}}return n}function z_(e){return JSON.stringify(e.map(e=>e.kind===`link`?{...e}:{id:e.id,kind:e.kind,name:e.name,glyph:e.glyph}))}function B_(){let e=typeof globalThis<`u`?globalThis.crypto:void 0;return typeof e?.randomUUID==`function`?e.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function V_(e,t){let n=e===`link`?`link`:`preset_${e}`,r=B_().replace(/-/g,``).slice(0,8),i=`${n}_${r}`,a=1;for(;t.includes(i);)i=`${n}_${r}_${a}`,a+=1;return i}function H_(e,t){if(e.some(e=>e.kind===t))return e.slice();let n=j_.find(e=>e.kind===t);return n?[...e,{id:V_(t,e.map(e=>e.id)),kind:t,name:n.name,glyph:n.glyph}]:e.slice()}function U_(e,t){return e.filter(e=>e.id!==t)}var W_=e=>({ok:!1,reason:e}),G_=`除数不能为 0:除以零没有结果,请换一个非零的除数。`,K_=new Set([`/`,`%`]),q_=e=>e!==void 0&&e>=`0`&&e<=`9`,J_=e=>e!==void 0&&/\s/.test(e);function Y_(e){for(;J_(e.source[e.at]);)e.at+=1}function X_(e){let t=e.at,n=0;for(;q_(e.source[e.at]);)e.at+=1,n+=1;if(e.source[e.at]===`.`)for(e.at+=1;q_(e.source[e.at]);)e.at+=1,n+=1;if(!n)return e.at=t,W_(`「${e.source[t]}」不是有效的数字。`);let r=Number(e.source.slice(t,e.at));return Number.isFinite(r)?{ok:!0,value:r}:W_(`数字太长了,无法表示。`)}function Z_(e){Y_(e);let t=e.source[e.at];if(t===void 0)return W_(`算式不完整:末尾还缺一个数字或右括号。`);if(t===`(`){e.at+=1;let t=tv(e);return t.ok?(Y_(e),e.source[e.at]===`)`?(e.at+=1,t):W_(`括号不匹配:少了一个右括号「)」。`)):t}return q_(t)||t===`.`?X_(e):W_(`无法识别的字符「${t}」。`)}function Q_(e){let t=Z_(e);if(!t.ok||(Y_(e),e.source[e.at]!==`^`))return t;e.at+=1;let n=$_(e);if(!n.ok)return n;let r=t.value**n.value;return Number.isFinite(r)?{ok:!0,value:r}:W_(`结果超出了可计算的数值范围。`)}function $_(e){Y_(e);let t=e.source[e.at];if(t!==`+`&&t!==`-`)return Q_(e);e.at+=1;let n=$_(e);if(!n.ok)return n;let r=t===`-`?-n.value:n.value;return Number.isFinite(r)?{ok:!0,value:r}:W_(`结果超出了可计算的数值范围。`)}function ev(e){let t=$_(e);if(!t.ok)return t;for(;;){Y_(e);let n=e.source[e.at];if(n!==`*`&&!K_.has(n))return t;e.at+=1;let r=$_(e);if(!r.ok)return r;if(K_.has(n)&&r.value===0)return W_(G_);let i=n===`*`?t.value*r.value:n===`%`?t.value%r.value:t.value/r.value;if(!Number.isFinite(i))return W_(`结果超出了可计算的数值范围。`);t={ok:!0,value:i}}}function tv(e){let t=ev(e);if(!t.ok)return t;for(;;){Y_(e);let n=e.source[e.at];if(n!==`+`&&n!==`-`)return t;e.at+=1;let r=ev(e);if(!r.ok)return r;let i=n===`+`?t.value+r.value:t.value-r.value;if(!Number.isFinite(i))return W_(`结果超出了可计算的数值范围。`);t={ok:!0,value:i}}}function nv(e){let t=e.trim();if(!t)return W_(`请输入算式。`);if(t.length>200)return W_(`算式太长了,请控制在 200 个字符以内。`);let n={source:t,at:0},r=tv(n);return r.ok?(Y_(n),n.at===t.length?Number.isFinite(r.value)?r:W_(`结果不是有限数字。`):W_(`「${t[n.at]}」后面的内容无法识别,请检查是否漏了运算符。`)):r}function rv(e){return String(!Number.isFinite(e)||Number.isInteger(e)&&Math.abs(e)<1e21?e:Number(e.toPrecision(12)))}function iv(e){let t=e.trim();if(!t)return{ok:!1,reason:`请输入时间戳或日期。`};if(/^-?\d+$/.test(t)){let e=Number(t);if(!Number.isFinite(e))return{ok:!1,reason:`这个数字太大,无法表示。`};let n=t.replace(`-`,``).length<=11?e*1e3:e;return!Number.isFinite(n)||Math.abs(n)>864e13?{ok:!1,reason:`这个时间戳超出了日期能表示的范围。`}:{ok:!0,ms:n}}let n=Date.parse(t);return Number.isNaN(n)?{ok:!1,reason:`看不懂这个日期。试试 1757000000、2026-10-08 或 2026-10-08T09:00:00。`}:{ok:!0,ms:n}}var av=e=>String(Math.abs(e)).padStart(2,`0`);function ov(e){let t=new Date(e);return Number.isNaN(t.getTime())?null:{local:`${t.getFullYear()}-${av(t.getMonth()+1)}-${av(t.getDate())} ${av(t.getHours())}:${av(t.getMinutes())}:${av(t.getSeconds())}`,iso:t.toISOString(),seconds:String(Math.floor(e/1e3)),milliseconds:String(e)}}var sv=e=>e.nativeEvent.isComposing||e.keyCode===229,cv=`super-pi.theme`,lv=[{id:`dracula`,name:`Dracula`,blurb:`紫调暗色,饱满对比,适合夜间专注。`},{id:`monokai`,name:`Monokai`,blurb:`暖调暗色,橙红点缀,经典编辑器风格。`},{id:`solarized-light`,name:`Solarized Light`,blurb:`暖黄米色调,柔和护眼,适合长时间阅读。`},{id:`github-light`,name:`GitHub Light`,blurb:`冷调浅色,中性清晰,日常办公首选。`}],uv=`dracula`,dv=e=>typeof e==`string`&&lv.some(t=>t.id===e);function fv(){try{let e=window.localStorage.getItem(cv);if(!e)return uv;let t=JSON.parse(e),n=typeof t==`string`?t:t?.id;return dv(n)?n:uv}catch{return uv}}function pv(e){document.documentElement.setAttribute(`data-theme`,e);try{window.localStorage.setItem(cv,JSON.stringify({id:e,version:1}))}catch{}}function mv(){let[e,t]=(0,B.useState)(uv);return(0,B.useEffect)(()=>{t(fv());let e=e=>{if(e.key===`super-pi.theme`&&e.newValue)try{let n=JSON.parse(e.newValue),r=typeof n==`string`?n:n?.id;dv(r)&&(document.documentElement.setAttribute(`data-theme`,r),t(r))}catch{}};return window.addEventListener(`storage`,e),()=>window.removeEventListener(`storage`,e)},[]),{theme:e,setTheme:(0,B.useCallback)(e=>{pv(e),t(e)},[])}}function hv({theme:e,onChooseTheme:t,onClose:n}){let r=lv.find(t=>t.id===e);return(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`div`,{className:`settings-scope`,children:`主题只影响这台设备的显示,不改变任何内容;切换立即生效。`}),lv.length===0?(0,V.jsx)(`div`,{className:`theme-empty`,"data-theme-empty":`1`,children:`没有可用的主题。界面将继续使用默认配色,你可以在主题文件恢复后重试。`}):(0,V.jsx)(`div`,{className:`theme-options`,role:`radiogroup`,"aria-label":`主题`,children:lv.map(n=>{let r=n.id===e;return(0,V.jsxs)(`button`,{type:`button`,className:`theme-option`,role:`radio`,"aria-checked":r,"aria-pressed":r,"data-theme-option":n.id,"data-theme-current":r?`1`:`0`,onClick:()=>t(n.id),children:[(0,V.jsx)(`span`,{className:`theme-preview-strip`,"data-preview":n.id,"aria-hidden":`true`}),(0,V.jsxs)(`span`,{className:`theme-option-name`,children:[n.name,r&&(0,V.jsx)(`span`,{className:`theme-option-current`,children:`当前 ✓`})]}),(0,V.jsx)(`span`,{className:`theme-option-blurb`,children:n.blurb})]},n.id)})}),(0,V.jsx)(`div`,{className:`picker-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,"data-theme-close":`1`,onClick:n,children:`完成`})}),(0,V.jsxs)(`div`,{className:`settings-scope theme-current-line`,children:[`当前:`,r?`${r.name}(${r.id})`:`默认`]})]})}function gv({userNickname:e,onSetUserNickname:t,onClose:n}){return(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`div`,{className:`settings-scope`,children:`昵称会显示在消息时间戳旁和头像上,替代默认的「你」。留空恢复默认。`}),(0,V.jsxs)(`div`,{className:`general-nickname`,children:[(0,V.jsx)(`label`,{className:`general-nickname-label`,htmlFor:`general-nickname-input`,children:`昵称`}),(0,V.jsx)(`input`,{id:`general-nickname-input`,type:`text`,className:`general-nickname-input`,"data-general-nickname":`1`,maxLength:24,placeholder:`你`,value:e??``,onChange:e=>t?.(e.target.value)}),(0,V.jsx)(`span`,{className:`general-nickname-hint`,"data-general-nickname-preview":`1`,title:`当前显示`,children:e?.trim()?`将显示为:${e.trim()}`:`将显示为:你`})]}),(0,V.jsx)(`div`,{className:`picker-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,onClick:n,children:`完成`})})]})}function _v({context:e}){let[t,n]=(0,B.useState)(``),[r,i]=(0,B.useState)(``),[a,o]=(0,B.useState)(!1),s=e.agentCatalog,c=e.subagentCatalog,l=s?.agents??[],u=c?.agents??[],d=[...l,...u],f=[...s?.problems??[],...c?.problems??[]],p=[...new Set([...s?.directories??(s?.directory?[s.directory]:[]),...e.customAgentDirs??[]])],m=e.customAgentDirs??[],h=r=>{if(r.preventDefault(),e.pendingSettings)return;let a=t.trim();a&&(m.includes(a)?i(`该路径已存在于自定义目录列表中`):(e.onSetCustomAgentDirs?.([...m,a]),n(``),i(``)))},g=t=>{let n=m.filter(e=>e!==t);e.onSetCustomAgentDirs?.(n)};return(0,V.jsxs)(`div`,{className:`settings-agents-container`,children:[(0,V.jsxs)(`div`,{className:`settings-agents-header`,children:[(0,V.jsx)(`p`,{className:`settings-agents-desc`,children:`Super Pi 支持多目录发现智能体。系统会按优先级自上而下合并扫描目录;若存在同名配置,高优先级目录的文件将覆盖低优先级目录。`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-agent-rescan-btn`,onClick:()=>{o(!0),e.onRescanAgents?.(),setTimeout(()=>o(!1),600)},disabled:a,title:`重新扫描所有目录中的智能体定义文件`,children:a?`正在扫描…`:`🔄 立即重新扫描`})]}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`发现路径清单(按优先级自高到低)`}),(0,V.jsx)(`div`,{className:`settings-dirs-list`,children:p.length===0?(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`暂无活跃的发现路径`}):p.map((t,n)=>{let r=m.includes(t),i=t.includes(`.super_pi`)||t.includes(`.super-pi`)||t.includes(`.pi`),a=!r&&!i,o=d.filter(e=>e.sourceDir===t).length;return(0,V.jsxs)(`div`,{className:`settings-dir-row`,children:[(0,V.jsxs)(`div`,{className:`settings-dir-info`,children:[(0,V.jsxs)(`span`,{className:`settings-dir-priority`,children:[`#`,n+1]}),(0,V.jsx)(`span`,{className:`settings-dir-path`,title:t,children:t}),(0,V.jsx)(`span`,{className:`settings-dir-tag`,children:r?`自定义`:i?`用户全局`:a?`内置`:`环境`}),(0,V.jsxs)(`span`,{className:`settings-dir-count`,children:[`(发现 `,o,` 个智能体)`]})]}),r&&(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-remove-btn`,disabled:e.pendingSettings,onClick:()=>g(t),title:`移除此自定义扫描路径`,children:`移除`})]},t)})})]}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`添加自定义路径`}),(0,V.jsxs)(`form`,{onSubmit:h,className:`settings-add-dir-form`,children:[(0,V.jsx)(`input`,{type:`text`,className:`settings-dir-input`,value:t,onChange:e=>{n(e.target.value),r&&i(``)},onKeyDown:e=>{e.key===`Enter`&&sv(e)&&e.preventDefault()},placeholder:`输入本地目录绝对路径或 ~/ 开头路径,如 D:\\agents 或 ~/.super_pi/agents`}),(0,V.jsx)(`button`,{type:`submit`,className:`settings-dir-add-btn`,disabled:e.pendingSettings||!t.trim(),children:`添加目录`})]}),r&&(0,V.jsx)(`div`,{className:`settings-dir-error`,children:r})]}),f.length>0&&(0,V.jsxs)(`section`,{className:`settings-section settings-problems-section`,children:[(0,V.jsxs)(`h4`,{className:`settings-problems-title`,children:[`⚠️ 发现 `,f.length,` 个文件解析问题`]}),(0,V.jsx)(`div`,{className:`settings-problems-list`,children:f.map((e,t)=>(0,V.jsxs)(`div`,{className:`settings-problem-row`,children:[(0,V.jsx)(`span`,{className:`settings-problem-file`,children:e.file}),`: `,e.message]},t))})]}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsxs)(`h4`,{className:`settings-section-title`,children:[`已发现的智能体(共 `,d.length,` 个)`]}),d.length===0?(0,V.jsxs)(`div`,{className:`settings-empty-hint`,children:[`当前未发现任何智能体。请在上述目录中添加 `,(0,V.jsx)(`code`,{children:`.md`}),` 文件(需包含 YAML frontmatter)。`]}):(0,V.jsx)(`div`,{className:`settings-agent-grid`,children:d.map(e=>(0,V.jsxs)(`div`,{className:`settings-agent-card`,children:[(0,V.jsxs)(`div`,{className:`settings-agent-card-header`,children:[(0,V.jsx)(`span`,{className:`settings-agent-name`,children:e.name}),(0,V.jsxs)(`span`,{className:`settings-agent-id`,children:[`(`,e.id,`)`]}),(0,V.jsx)(`span`,{className:`settings-agent-mode-badge ${e.mode}`,children:e.mode===`primary`?`主智能体`:`子智能体`})]}),e.sourceDir&&(0,V.jsxs)(`div`,{className:`settings-agent-source`,title:e.sourceDir,children:[`来源:`,e.sourceDir]}),e.description&&(0,V.jsx)(`div`,{className:`settings-agent-desc`,children:e.description}),(0,V.jsxs)(`div`,{className:`settings-agent-footer`,children:[(0,V.jsx)(`span`,{className:`settings-agent-tools`,children:e.toolSummary}),e.model&&(0,V.jsxs)(`span`,{className:`settings-agent-model`,children:[e.model.provider,`/`,e.model.modelId]})]})]},`${e.sourceDir}-${e.id}`))})]}),(0,V.jsx)(`div`,{className:`picker-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,onClick:e.onClose,children:`完成`})})]})}function vv(e){return(0,V.jsx)(_v,{context:e})}function yv({context:e}){let[t,n]=(0,B.useState)({enabled:!1}),[r,i]=(0,B.useState)(``),a=(0,B.useCallback)(async e=>{try{let[t,r]=await Promise.all([fetch(`/api/terminal`).then(e=>e.json()),fetch(`/api/terminal-shell`).then(e=>e.json())]);n({...r,enabled:t.enabled}),e&&i(r.shell?[r.shell.file,...r.shell.args].map(e=>/\s/.test(e)?`"${e}"`:e).join(` `):``)}catch{}},[]);(0,B.useEffect)(()=>{a(!0)},[a]);let o=(0,B.useRef)(e.terminalShell);return(0,B.useEffect)(()=>{o.current!==e.terminalShell&&(o.current=e.terminalShell,a(!1))},[e.terminalShell,a]),t.enabled?(0,V.jsx)(`section`,{className:`settings-panel-container`,"data-terminal-settings":`1`,children:(0,V.jsxs)(`div`,{className:`settings-section`,children:[(0,V.jsxs)(`p`,{className:`settings-empty-hint`,children:[`当前生效:`,(0,V.jsx)(`code`,{children:t.shell?[t.shell.file,...t.shell.args].join(` `):``}),`(来自`,t.source,`)。只影响新开的终端。`]}),(0,V.jsx)(`label`,{className:`settings-section-title`,children:`默认 shell`}),(0,V.jsx)(`input`,{className:`settings-dir-input`,"data-terminal-shell-input":`1`,value:r,onChange:e=>i(e.target.value),placeholder:`例如 wsl.exe -e zsh`}),(0,V.jsx)(`div`,{className:`settings-dirs-list`,children:(t.candidates??[]).map(e=>(0,V.jsx)(`button`,{type:`button`,className:`settings-agent-rescan-btn`,onClick:()=>i([e.file,...e.args].map(e=>/\s/.test(e)?`"${e}"`:e).join(` `)),children:e.label},`${e.file}:${e.args.join(` `)}`))}),(0,V.jsx)(`div`,{children:(0,V.jsx)(`button`,{type:`button`,className:`settings-agent-rescan-btn`,"data-terminal-shell-save":`1`,onClick:()=>e.onSetTerminalShell?.(r.trim()||null),children:`保存`})})]})}):(0,V.jsx)(`section`,{className:`settings-panel-container`,"data-terminal-settings":`disabled`,children:(0,V.jsx)(`p`,{className:`settings-empty-hint`,children:`终端没有启用,无法设置默认 shell。`})})}function bv({context:e}){let[t,n]=(0,B.useState)(``),[r,i]=(0,B.useState)(``),[a,o]=(0,B.useState)(),s=e=>{try{return new RegExp(e,`i`),!1}catch{return!0}},c=s(t),l=s(r),u=e.modelFilterRules??[];return(0,V.jsxs)(`section`,{"data-model-rules":`1`,className:`settings-panel-container`,children:[(0,V.jsx)(`div`,{className:`settings-agents-header`,children:(0,V.jsxs)(`p`,{className:`settings-agents-desc`,children:[(0,V.jsx)(`strong`,{children:`按工作区约束可用模型。`}),`当工作区名称匹配指定正则表达式时,会话中仅可选择符合模型正则的模型(匹配模型名称或 `,(0,V.jsx)(`code`,{children:`provider/modelId`}),`)。多条命中规则必须全部满足。`]})}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsxs)(`h4`,{className:`settings-section-title`,children:[`已配置的过滤规则(共 `,u.length,` 条)`]}),u.length===0?(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`暂无模型过滤规则。所有工作区默认可使用全部已配置模型。`}):(0,V.jsx)(`div`,{className:`settings-dirs-list`,children:u.map(t=>{let r=a===t.id;return(0,V.jsxs)(`div`,{className:`settings-rule-card ${r?`editing`:``}`,children:[(0,V.jsx)(`div`,{className:`settings-rule-info`,children:(0,V.jsxs)(`div`,{className:`settings-rule-patterns`,children:[(0,V.jsxs)(`span`,{className:`settings-rule-pill`,children:[(0,V.jsx)(`span`,{className:`settings-rule-pill-tag`,children:`工作区`}),(0,V.jsx)(`code`,{className:`settings-rule-code`,title:t.workspacePattern,children:t.workspacePattern})]}),(0,V.jsx)(`span`,{className:`settings-rule-arrow`,"aria-hidden":`true`,children:`→`}),(0,V.jsxs)(`span`,{className:`settings-rule-pill`,children:[(0,V.jsx)(`span`,{className:`settings-rule-pill-tag`,children:`允许模型`}),(0,V.jsx)(`code`,{className:`settings-rule-code`,title:t.modelPattern,children:t.modelPattern})]})]})}),(0,V.jsxs)(`div`,{className:`settings-rule-actions`,children:[(0,V.jsx)(`button`,{type:`button`,className:`settings-rule-edit-btn`,onClick:()=>{o(t.id),n(t.workspacePattern),i(t.modelPattern)},children:r?`编辑中`:`编辑`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-remove-btn`,onClick:()=>{a===t.id&&(o(void 0),n(``),i(``)),e.onSetModelRules?.(u.filter(e=>e.id!==t.id))},children:`删除`})]})]},t.id)})})]}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:a?`编辑过滤规则`:`添加新规则`}),(0,V.jsxs)(`fieldset`,{disabled:e.pendingSettings,className:`model-rules-fields settings-rule-fieldset`,children:[(0,V.jsxs)(`div`,{className:`settings-rule-form-grid`,children:[(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`工作区名正则表达式`}),(0,V.jsx)(`input`,{type:`text`,"data-rule-workspace":`1`,className:`settings-dir-input`,value:t,"aria-invalid":c,placeholder:`如 ^proj- 或 my-workspace`,onChange:e=>n(e.target.value)})]}),(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`允许的模型名正则表达式`}),(0,V.jsx)(`input`,{type:`text`,"data-rule-model":`1`,className:`settings-dir-input`,value:r,"aria-invalid":l,placeholder:`如 anthropic/.* 或 gpt-4o|claude`,onChange:e=>i(e.target.value)})]})]}),(c||l)&&(0,V.jsx)(`div`,{className:`settings-dir-error`,role:`alert`,children:`⚠️ 正则表达式语法不合法,请检查后修正。`}),(0,V.jsxs)(`div`,{className:`settings-rule-form-buttons`,children:[(0,V.jsx)(`button`,{type:`button`,"data-rule-save":`1`,className:`settings-dir-add-btn`,disabled:!t.trim()||!r.trim()||c||l,onClick:()=>{let s={id:a??B_(),workspacePattern:t.trim(),modelPattern:r.trim()};e.onSetModelRules?.([...u.filter(e=>e.id!==s.id),s]),n(``),i(``),o(void 0)},children:a?`保存修改`:`添加规则`}),a&&(0,V.jsx)(`button`,{type:`button`,className:`settings-rule-cancel-btn`,onClick:()=>{o(void 0),n(``),i(``)},children:`取消编辑`})]})]})]}),(0,V.jsx)(`div`,{className:`picker-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,onClick:e.onClose,children:`完成`})})]})}function xv({catalog:e,customProviders:t,onEditModel:n}){let[r,i]=(0,B.useState)(!1),a=e?.models??[];if(a.length===0)return null;let o={};for(let e of a){let t=e.provider||`other`;o[t]||(o[t]=[]),o[t].push(e)}let s=Object.keys(o).sort(),c=new Set((t??[]).filter(e=>e.builtin).map(e=>e.id));return(0,V.jsxs)(`div`,{className:`settings-system-models`,"data-system-models":`1`,children:[(0,V.jsxs)(`button`,{type:`button`,className:`settings-system-models-toggle`,onClick:()=>i(!r),"aria-expanded":!r,children:[(0,V.jsx)(`span`,{className:`settings-system-models-icon`,children:r?`▸`:`▾`}),(0,V.jsxs)(`span`,{className:`settings-system-models-title`,children:[`已发现的可用模型清单(共 `,a.length,` 个模型 · `,s.length,` 个供应商)`]})]}),!r&&(0,V.jsxs)(`div`,{className:`settings-system-models-content`,children:[(0,V.jsx)(`p`,{className:`settings-agents-desc settings-system-models-note`,children:`Pi 现在实际提供这些模型。改动和删除请在下方「Pi 的供应商与模型」里做——那里编辑的就是 Pi 自己的配置,这里只是它被 Pi 读出来的结果。`}),s.map(e=>{let t=o[e],r=c.has(e);return(0,V.jsxs)(`div`,{className:`settings-system-group`,children:[(0,V.jsxs)(`div`,{className:`settings-system-group-head`,children:[(0,V.jsx)(`span`,{className:`settings-system-group-name`,children:e}),(0,V.jsxs)(`span`,{className:`settings-system-group-count`,children:[`(`,t.length,` 个模型)`]}),(0,V.jsx)(`span`,{className:`settings-system-badge ${r?`system`:`custom`}`,children:r?`Pi 提供`:`models.json 定义`})]}),(0,V.jsx)(`div`,{className:`settings-system-model-list`,children:t.map(t=>(0,V.jsxs)(`div`,{className:`settings-system-model-row`,children:[(0,V.jsxs)(`div`,{className:`settings-system-model-info`,children:[(0,V.jsx)(`span`,{className:`settings-system-model-name`,children:t.label||t.modelId}),(0,V.jsx)(`code`,{className:`settings-system-model-id`,children:t.modelId})]}),(0,V.jsx)(`div`,{className:`settings-system-model-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`settings-provider-link`,"data-system-model-edit":`${e}:${t.modelId}`,onClick:()=>n?.(e,t.modelId,t.label),children:`编辑配置`})})]},t.modelId))})]},e)})]})]})}var Sv=e=>{try{let t=e.trim();if(!t)return`custom-provider`;let n=new URL(t.startsWith(`http`)?t:`https://${t}`),r=n.hostname.toLowerCase();if(r.includes(`openai`))return`openai`;if(r.includes(`anthropic`))return`anthropic`;if(r.includes(`deepseek`))return`deepseek`;if(r.includes(`google`)||r.includes(`gemini`))return`google`;if(r.includes(`groq`))return`groq`;if(r.includes(`mistral`))return`mistral`;if(r.includes(`moonshot`)||r.includes(`kimi`))return`moonshot`;if(r.includes(`ollama`)||n.port===`11434`)return`ollama`;let i=r.split(`.`).filter(e=>e!==`api`&&e!==`v1`&&e!==`com`&&e!==`org`&&e!==`net`&&e!==`cn`&&e!==`ai`&&e!==`io`);return i.length>0&&i[0]&&i[0].replace(/[^a-z0-9_-]/g,``)||`custom-provider`}catch{return`custom-provider`}};function Cv({context:e,externalEditModel:t,offered:n}){let r=e.providers??[],i=e.providerApis??[],[a,o]=(0,B.useState)({kind:`add`}),[s,c]=(0,B.useState)(``),[l,u]=(0,B.useState)(``),[d,f]=(0,B.useState)(``),[p,m]=(0,B.useState)(``),[h,g]=(0,B.useState)(``),[_,v]=(0,B.useState)(!1),[y,b]=(0,B.useState)(``),[x,S]=(0,B.useState)(``),[C,w]=(0,B.useState)(!1),[T,E]=(0,B.useState)(!1),[D,O]=(0,B.useState)(``),[k,A]=(0,B.useState)(``),[j,M]=(0,B.useState)(!0),[N,P]=(0,B.useState)(!0),[ee,te]=(0,B.useState)(!1),[ne,F]=(0,B.useState)(),[re,ie]=(0,B.useState)([]),[ae,oe]=(0,B.useState)(``),[se,ce]=(0,B.useState)(new Set),[le,ue]=(0,B.useState)();(0,B.useEffect)(()=>{if(!t)return;let{provider:e,modelId:n,label:a}=t;fe.current=!0;let s=r.find(t=>t.id===e);if(s){he(s);let t=s.models.find(e=>e.id===n);t?(ge(t),o({kind:`editModel`,providerId:e,modelId:n})):(ge(void 0),b(n),S(a&&a!==n?a:``),o({kind:`addModel`,providerId:e}))}else c(e),u(e),f(``),m(i[0]??`openai-completions`),g(``),v(!1),b(n),S(a&&a!==n?a:``),w(!1),E(!1),O(``),A(``),o({kind:`add`});document.querySelector(`.settings-provider-form`)?.scrollIntoView({behavior:`smooth`})},[t]);let de=a.kind===`add`?void 0:r.find(e=>e.id===a.providerId),fe=(0,B.useRef)(!1),pe=()=>{fe.current=!0},me=(0,B.useRef)(!1);(0,B.useEffect)(()=>{me.current&&(me.current=!1,!fe.current&&I())},[r]);let I=()=>{o({kind:`add`}),fe.current=!1,c(``),u(``),f(``),m(i[0]??`openai-completions`),g(``),v(!1),b(``),S(``),w(!1),E(!1),O(``),A(``),M(!0),P(!0),te(!1),F(void 0),ie([]),oe(``),ce(new Set),ue(void 0)},he=e=>{c(e.id),u(e.name===e.id?``:e.name),f(e.baseUrl),m(e.api),g(``),v(!1)},ge=e=>{b(e?.id??``),S(!e||e.name===e.id?``:e.name),w(e?.reasoning??!1),E(e?.imageInput??!1),O(e?String(e.contextWindow):``),A(e?String(e.maxTokens):``),M(!0),P(!0)},_e=e=>{let t=r.find(t=>t.id===e);t&&(pe(),o({kind:`addModel`,providerId:e}),he(t),ge(void 0))},ve=(e,t)=>{let n=r.find(t=>t.id===e),i=n?.models.find(e=>e.id===t);n&&i&&(pe(),o({kind:`editModel`,providerId:e,modelId:t}),he(n),ge(i))},ye=async()=>{if(!d.trim())F(`请先填写 API 地址`);else{if(!s.trim()){let e=Sv(d);c(e),l.trim()||u(e)}te(!0),F(void 0);try{let e=s.trim()||Sv(d),t=await fetch(`/api/providers/fetch-models`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({baseUrl:d.trim(),apiKey:h.trim(),api:p,providerId:e})}),n=await t.json();if(!t.ok||!n.ok)throw Error(n.error||`获取模型失败`);let r=n.models||[];ie(r),ce(new Set(r.map(e=>e.id))),r.length===1&&ge(r[0])}catch(e){F(e instanceof Error?e.message:String(e))}finally{te(!1)}}},be=()=>{if(se.size===0||!d.trim())return;let t=s.trim()||Sv(d);s.trim()||c(t);let n=re.filter(e=>se.has(e.id));n.length&&(me.current=!0,fe.current=!1,e.onSetProvider?.({id:t,...l.trim()?{name:l.trim()}:{name:t},baseUrl:d.trim(),api:p.trim()||`openai-completions`,...h.trim()?{apiKey:h.trim()}:{},models:n.map(e=>({id:e.id,name:e.name||e.id,reasoning:e.reasoning,imageInput:e.imageInput,contextWindow:e.contextWindow,maxTokens:e.maxTokens,supportsDeveloperRole:!0,supportsReasoningEffort:!0}))}),ie([]))},xe=s.trim()||(d.trim()?Sv(d):``),Se=d.trim()&&y.trim()&&!e.pendingSettings,Ce=r.filter(e=>!e.disabled),we=r.filter(e=>e.disabled);return(0,V.jsxs)(`section`,{className:`settings-section`,"data-settings-providers":`1`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`Pi 的供应商与模型`}),(0,V.jsxs)(`p`,{className:`settings-agents-desc`,children:[(0,V.jsx)(`strong`,{children:`这里就是 Pi 的模型配置本身,不是另一份。`}),(0,V.jsx)(`code`,{children:`models.json`}),` 里的定义、`,(0,V.jsx)(`code`,{children:`auth.json`}),` 里的凭据都在这里直接读写: 不论是你手写的条目还是这里添加的,都能改、能删。Pi 内置的供应商(例如订阅制的 coding plan) 没有 `,(0,V.jsx)(`code`,{children:`models.json`}),` 定义,只有凭据,所以它们能停用不能改地址。 停用会把配置从 Pi 的文件里拿掉并在这里记下,续订后可以原样启用。`]}),Ce.length>0?(0,V.jsx)(`div`,{className:`settings-provider-list`,children:Ce.map(t=>(0,V.jsxs)(`div`,{className:`settings-provider-card`,"data-provider-row":t.id,children:[(0,V.jsxs)(`div`,{className:`settings-provider-head`,children:[(0,V.jsx)(`span`,{className:`settings-provider-id`,children:t.id}),t.name!==t.id&&(0,V.jsx)(`span`,{className:`settings-provider-name`,children:t.name}),t.hasKey&&(0,V.jsx)(`span`,{className:`settings-provider-badge`,children:`已设置 key`}),t.keyInModelsJson&&(0,V.jsx)(`span`,{className:`settings-provider-badge`,children:`key 在 models.json`}),t.builtin&&(0,V.jsx)(`span`,{className:`settings-provider-badge settings-provider-badge-builtin`,children:`Pi 内置`})]}),t.builtin?(0,V.jsx)(`div`,{className:`settings-provider-meta`,children:`模型由 Pi 提供,这里只能停用`}):(0,V.jsxs)(`div`,{className:`settings-provider-meta`,children:[t.baseUrl,` · `,t.api]}),t.invalidFields&&t.invalidFields.length>0&&(0,V.jsxs)(`div`,{className:`settings-provider-note settings-provider-note-warn`,children:[`这个条目的 `,t.invalidFields.join(`、`),` 是空字符串,Pi 的 schema 不接受, 于是它拒绝整个 models.json —— 文件里所有自定义供应商都不会出现在选择器里。`]}),!t.hasKey&&!t.keyInModelsJson&&(0,V.jsx)(`div`,{className:`settings-provider-note settings-provider-note-warn`,children:`没有可用凭据,Pi 不会提供这个供应商的模型 —— 它不会出现在任何模型选择器里。编辑里填一个 key 就能恢复。`}),t.keyInModelsJson&&!t.hasKey&&(0,V.jsx)(`div`,{className:`settings-provider-note`,children:`key 写在 models.json 里(Pi 按其中的写法解析,例如 $VAR)。解析不到时 Pi 不会提供它。`}),n&&(n.has(t.id)?(0,V.jsx)(`div`,{className:`settings-provider-note`,children:`Pi 正在提供它的模型。`}):!t.hasKey&&!t.keyInModelsJson?null:(0,V.jsx)(`div`,{className:`settings-provider-note settings-provider-note-warn`,children:`Pi 现在没有提供它的模型(凭据可能已失效,或环境变量没解析到)。`})),(0,V.jsxs)(`div`,{className:`settings-provider-models`,children:[t.models.map(n=>(0,V.jsxs)(`div`,{className:`settings-provider-model-row`,"data-model-row":`${t.id}:${n.id}`,children:[(0,V.jsx)(`span`,{className:`settings-provider-model`,children:n.name}),(0,V.jsx)(`code`,{className:`settings-provider-model-id`,children:n.id}),!t.builtin&&(0,V.jsxs)(`div`,{className:`settings-provider-model-actions`,children:[(0,V.jsx)(`button`,{type:`button`,className:`settings-provider-link`,"data-model-edit":`${t.id}:${n.id}`,onClick:()=>ve(t.id,n.id),children:`编辑`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-provider-link danger`,"data-model-delete":`${t.id}:${n.id}`,onClick:()=>e.onRemoveProviderModel?.(t.id,n.id),children:`删除`})]})]},n.id)),t.builtin&&t.models.length===0&&(0,V.jsx)(`div`,{className:`settings-provider-empty-note`,children:`暂未读取到模型清单`})]}),(0,V.jsxs)(`div`,{className:`settings-provider-actions`,children:[!t.builtin&&(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-add-btn`,"data-provider-add-model":t.id,onClick:()=>_e(t.id),children:`添加模型`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-cancel-btn`,"data-provider-disable":t.id,onClick:()=>e.onToggleProvider?.(t.id,!1),children:`停用`}),le===t.id?(0,V.jsxs)(`div`,{className:`settings-provider-delete-confirm`,children:[(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-cancel-btn danger-confirm`,onClick:()=>{ue(void 0),e.onRemoveProvider?.(t.id)},children:`确定删除?`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-cancel-btn`,onClick:()=>ue(void 0),children:`取消`})]}):(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-cancel-btn`,"data-provider-delete":t.id,onClick:()=>ue(t.id),children:`删除供应商`})]})]},t.id))}):(0,V.jsx)(`div`,{className:`settings-empty-hint settings-provider-empty-note`,children:`暂无已启用的供应商。可在下方添加,或直接选用上方系统已有的内置模型。`}),we.length>0&&(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`已停用的供应商`}),(0,V.jsxs)(`p`,{className:`settings-agents-desc`,children:[`这些供应商已经从 Pi 的配置里拿掉,所以不会出现在任何模型选择器里。启用会把`,(0,V.jsx)(`code`,{children:`models.json`}),` 定义和凭据原样放回去。`]}),(0,V.jsx)(`div`,{className:`settings-provider-list`,children:we.map(t=>(0,V.jsxs)(`div`,{className:`settings-provider-card settings-provider-card-off`,"data-provider-off-row":t.id,children:[(0,V.jsxs)(`div`,{className:`settings-provider-head`,children:[(0,V.jsx)(`span`,{className:`settings-provider-id`,children:t.id}),t.name!==t.id&&(0,V.jsx)(`span`,{className:`settings-provider-name`,children:t.name}),(0,V.jsx)(`span`,{className:`settings-provider-badge settings-provider-badge-off`,children:`已停用`}),t.builtin&&(0,V.jsx)(`span`,{className:`settings-provider-badge settings-provider-badge-builtin`,children:`Pi 内置`})]}),(0,V.jsx)(`div`,{className:`settings-provider-meta`,children:t.models.length?`原模型:${t.models.map(e=>e.name).join(`、`)}`:t.hasKey?`已保留凭据`:`无模型记录`}),(0,V.jsxs)(`div`,{className:`settings-provider-actions`,children:[(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-add-btn`,"data-provider-enable":t.id,onClick:()=>e.onToggleProvider?.(t.id,!0),children:`启用`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-cancel-btn`,"data-provider-forget":t.id,onClick:()=>e.onRemoveProvider?.(t.id),children:`彻底删除`})]})]},t.id))})]}),(0,V.jsxs)(`h4`,{className:`settings-section-title`,children:[a.kind===`add`&&`添加供应商与模型`,a.kind===`addModel`&&`为供应商「${a.providerId}」添加模型`,a.kind===`editModel`&&`编辑模型「${a.modelId}」`]}),a.kind!==`add`&&(0,V.jsxs)(`p`,{className:`settings-agents-desc`,"data-provider-shared-note":`1`,children:[`上面这些是这个供应商下`,(0,V.jsx)(`b`,{children:`所有模型共用`}),`的(地址、API 类型、key)。改动会同时影响它下面的每个模型。`]}),(0,V.jsxs)(`div`,{className:`settings-provider-form`,onChange:pe,children:[(0,V.jsxs)(`div`,{className:`settings-rule-form-grid`,children:[(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`供应商 id`}),(0,V.jsx)(`input`,{type:`text`,"data-provider-id":`1`,className:`settings-dir-input`,value:s,placeholder:`如 my-proxy`,readOnly:a.kind!==`add`,onChange:e=>c(e.target.value)})]}),(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`显示名称`}),(0,V.jsx)(`input`,{type:`text`,"data-provider-name":`1`,className:`settings-dir-input`,value:l,placeholder:`如 公司中转`,onChange:e=>u(e.target.value)})]})]}),(0,V.jsxs)(`div`,{className:`settings-rule-form-grid`,children:[(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`API 地址`}),(0,V.jsx)(`input`,{type:`text`,"data-provider-base-url":`1`,className:`settings-dir-input`,value:d,placeholder:`如 https://api.example.com/v1`,onBlur:()=>{if(d.trim()&&!s.trim()){let e=Sv(d);c(e),l.trim()||u(e)}},onChange:e=>f(e.target.value)})]}),(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`API 类型`}),(0,V.jsx)(`select`,{"data-provider-api":`1`,className:`settings-model-select`,value:p,onChange:e=>m(e.target.value),children:(i.length?i:[`openai-completions`]).map(e=>(0,V.jsx)(`option`,{value:e,children:e},e))})]})]}),(0,V.jsxs)(`div`,{className:`settings-rule-form-grid`,children:[(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`API key`}),(0,V.jsx)(`input`,{type:`password`,"data-provider-api-key":`1`,className:`settings-dir-input`,value:h,autoComplete:`off`,placeholder:de?.hasKey?`已设置,留空表示不修改`:`如 sk-...`,onChange:e=>g(e.target.value)})]}),(0,V.jsxs)(`div`,{className:`settings-rule-input-group settings-fetch-models-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`智能探测`}),(0,V.jsx)(`div`,{className:`settings-fetch-models-row`,children:(0,V.jsx)(`button`,{type:`button`,className:`settings-fetch-models-btn`,"data-fetch-models-btn":`1`,disabled:!d.trim()||ee,onClick:ye,children:ee?`正在连接并获取模型列表…`:`🔍 自动获取可用模型`})})]})]}),ne&&(0,V.jsx)(`div`,{className:`settings-fetch-models-error`,children:ne}),re.length>0&&(0,V.jsxs)(`div`,{className:`settings-discovered-box`,"data-discovered-box":`1`,children:[(0,V.jsxs)(`div`,{className:`settings-discovered-head`,children:[(0,V.jsxs)(`span`,{className:`settings-discovered-title`,children:[`从远程接口探测到 `,re.length,` 个可用模型`]}),(0,V.jsxs)(`div`,{className:`settings-discovered-actions`,children:[(0,V.jsx)(`button`,{type:`button`,className:`settings-provider-link`,onClick:()=>ce(new Set(re.map(e=>e.id))),children:`全选`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-provider-link`,onClick:()=>ce(new Set),children:`清空`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-provider-link danger`,onClick:()=>ie([]),children:`收起列表`})]})]}),(0,V.jsx)(`input`,{type:`text`,className:`settings-dir-input settings-discovered-search`,placeholder:`搜索模型名称或 ID…`,value:ae,onChange:e=>oe(e.target.value)}),(0,V.jsx)(`div`,{className:`settings-discovered-list`,children:re.filter(e=>!ae||e.id.toLowerCase().includes(ae.toLowerCase())).map(e=>{let t=se.has(e.id);return(0,V.jsxs)(`div`,{className:`settings-discovered-item`,children:[(0,V.jsxs)(`label`,{className:`settings-discovered-label`,children:[(0,V.jsx)(`input`,{type:`checkbox`,checked:t,onChange:t=>{let n=new Set(se);t.target.checked?n.add(e.id):n.delete(e.id),ce(n)}}),(0,V.jsx)(`span`,{className:`settings-discovered-name`,children:e.name}),e.reasoning&&(0,V.jsx)(`span`,{className:`settings-discovered-tag reasoning`,children:`推理`}),e.imageInput&&(0,V.jsx)(`span`,{className:`settings-discovered-tag vision`,children:`视觉`})]}),(0,V.jsx)(`button`,{type:`button`,className:`settings-provider-link`,title:`将此模型的参数填入下方单个编辑表单`,onClick:()=>ge(e),children:`填入下方`})]},e.id)})}),(0,V.jsx)(`div`,{className:`settings-discovered-footer`,children:(0,V.jsxs)(`button`,{type:`button`,className:`settings-dir-add-btn`,disabled:se.size===0||!d.trim()||ee,onClick:be,children:[`批量导入选中的 `,se.size,` 个模型并保存`]})})]}),(0,V.jsxs)(`div`,{className:`settings-rule-form-grid`,children:[(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`模型 id`}),(0,V.jsx)(`input`,{type:`text`,"data-model-id":`1`,className:`settings-dir-input`,value:y,placeholder:`如 gpt-4o 或点击上方自动探测填入`,onChange:e=>b(e.target.value)})]}),(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`模型显示名`}),(0,V.jsx)(`input`,{type:`text`,"data-model-name":`1`,className:`settings-dir-input`,value:x,placeholder:`留空则用模型 id`,onChange:e=>S(e.target.value)})]})]}),(0,V.jsx)(`div`,{className:`settings-rule-form-grid`,children:(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`上下文窗口 / 最大输出`}),(0,V.jsxs)(`div`,{className:`settings-provider-numbers`,children:[(0,V.jsx)(`input`,{type:`number`,"data-model-context-window":`1`,className:`settings-dir-input`,value:D,placeholder:`128000`,onChange:e=>O(e.target.value)}),(0,V.jsx)(`input`,{type:`number`,"data-model-max-tokens":`1`,className:`settings-dir-input`,value:k,placeholder:`16384`,onChange:e=>A(e.target.value)})]})]})}),(0,V.jsxs)(`div`,{className:`settings-provider-switches`,children:[(0,V.jsxs)(`label`,{className:`settings-checkbox-label`,children:[(0,V.jsx)(`input`,{type:`checkbox`,"data-model-reasoning":`1`,checked:C,onChange:e=>w(e.target.checked)}),`推理模型`]}),(0,V.jsxs)(`label`,{className:`settings-checkbox-label`,children:[(0,V.jsx)(`input`,{type:`checkbox`,"data-model-image-input":`1`,checked:T,onChange:e=>E(e.target.checked)}),`支持图片输入`]}),(0,V.jsxs)(`label`,{className:`settings-checkbox-label`,children:[(0,V.jsx)(`input`,{type:`checkbox`,"data-model-developer-role":`1`,checked:j,onChange:e=>M(e.target.checked)}),`支持 developer 角色`]}),(0,V.jsxs)(`label`,{className:`settings-checkbox-label`,children:[(0,V.jsx)(`input`,{type:`checkbox`,"data-model-reasoning-effort":`1`,checked:N,onChange:e=>P(e.target.checked)}),`支持 reasoning_effort`]}),de?.hasKey&&(0,V.jsxs)(`label`,{className:`settings-checkbox-label`,children:[(0,V.jsx)(`input`,{type:`checkbox`,"data-provider-clear-key":`1`,checked:_,onChange:e=>v(e.target.checked)}),`清除已保存的 key`]})]}),(0,V.jsxs)(`div`,{className:`settings-rule-form-buttons`,children:[(0,V.jsx)(`button`,{type:`button`,"data-provider-save":`1`,className:`settings-dir-add-btn`,disabled:!Se,onClick:()=>{me.current=!0,fe.current=!1;let t=s.trim()||xe;e.onSetProvider?.({id:t,...l.trim()?{name:l.trim()}:{name:t},baseUrl:d.trim(),api:p.trim()||`openai-completions`,...h.trim()?{apiKey:h.trim()}:{},..._?{clearKey:!0}:{},models:[{id:y.trim(),...x.trim()?{name:x.trim()}:{},...C?{reasoning:!0}:{},...T?{imageInput:!0}:{},...D.trim()?{contextWindow:Number(D)}:{},...k.trim()?{maxTokens:Number(k)}:{},...j?{}:{supportsDeveloperRole:!1},...N?{}:{supportsReasoningEffort:!1}}]})},children:a.kind===`add`?`添加单个模型`:a.kind===`addModel`?`添加模型`:`保存修改`}),a.kind!==`add`&&(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-cancel-btn`,"data-provider-cancel":`1`,onClick:I,children:`取消`})]})]})]})}function wv({context:e}){let t=e.modelCatalog,n=e.defaultModel,r=t?.models??[],i=r.reduce((e,t)=>e.includes(t.provider)?e:[...e,t.provider],[]),a=n?`${n.provider}/${n.modelId}`:``,[o,s]=(0,B.useState)(n?.provider??``),[c,l]=(0,B.useState)(n?.modelId??``),u=(0,B.useRef)(void 0);(0,B.useEffect)(()=>{u.current!==a&&(u.current=a,s(n?.provider??``),l(n?.modelId??``))},[a,n]);let d=n&&!i.includes(n.provider)?[...i,n.provider]:i,f=d.includes(o)?o:d[0]??``,p=r.filter(e=>e.provider===f),m=n&&n.provider===f&&!p.some(e=>e.modelId===n.modelId)?[...p,{provider:n.provider,modelId:n.modelId,label:n.label}]:p,h=m.some(e=>e.modelId===c)?c:m[0]?.modelId??``,g=!n||r.some(e=>e.provider===n.provider&&e.modelId===n.modelId),_=f&&h?`${f}/${h}`:``,v=_!==a,y=!t,b=t?.source===`unavailable`,[x,S]=(0,B.useState)(),C=e=>{s(e);let t=r.filter(t=>t.provider===e);l(e=>t.some(t=>t.modelId===e)?e:t[0]?.modelId??``)};return(0,V.jsxs)(`section`,{"data-settings-model":`1`,className:`settings-panel-container`,children:[(0,V.jsx)(`div`,{className:`settings-agents-header`,children:(0,V.jsxs)(`p`,{className:`settings-agents-desc`,children:[(0,V.jsx)(`strong`,{children:`设置新建会话的默认模型。`}),`这里的选择对所有工作区生效,但优先级低于工作区自己的默认模型;两者都没有时,跟随 Pi 的默认模型。 默认值只在会话创建时复制一次,之后改这里不会改动已经存在的会话。`]})}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`当前默认模型`}),(0,V.jsx)(`div`,{className:`settings-model-current`,"data-model-current":`1`,children:n?(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`span`,{className:`settings-model-current-name`,children:n.label}),(0,V.jsxs)(`code`,{className:`settings-model-current-pair`,children:[n.provider,`/`,n.modelId]})]}):(0,V.jsx)(`span`,{className:`settings-model-current-none`,children:`跟随 Pi 默认模型`})}),n&&!g&&(0,V.jsx)(`div`,{className:`settings-dir-error`,role:`alert`,children:`⚠️ Pi 当前不再提供这个模型,新会话会改用 Pi 的默认模型。`})]}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`修改默认模型`}),y?(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`正在读取 Pi 的模型列表…`}):b?(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`无法读取 Pi 的模型列表,暂时不能设置默认模型。`}):(0,V.jsxs)(V.Fragment,{children:[(0,V.jsxs)(`div`,{className:`settings-model-grid`,children:[(0,V.jsxs)(`label`,{className:`settings-model-group`,children:[(0,V.jsx)(`span`,{className:`settings-model-label`,children:`供应商`}),(0,V.jsx)(`select`,{"data-model-provider":`1`,className:`settings-model-select`,value:f,disabled:e.pendingSettings||d.length===0,onChange:e=>C(e.target.value),children:d.map(e=>(0,V.jsx)(`option`,{value:e,children:e},e))})]}),(0,V.jsxs)(`label`,{className:`settings-model-group`,children:[(0,V.jsx)(`span`,{className:`settings-model-label`,children:`模型`}),(0,V.jsx)(`select`,{"data-model-select":`1`,className:`settings-model-select`,value:h,disabled:e.pendingSettings||m.length===0,onChange:e=>l(e.target.value),children:m.map(e=>(0,V.jsx)(`option`,{value:e.modelId,children:e.label},e.modelId))})]})]}),(0,V.jsxs)(`div`,{className:`settings-rule-form-buttons`,children:[(0,V.jsx)(`button`,{type:`button`,"data-model-save":`1`,className:`settings-dir-add-btn`,disabled:!v||e.pendingSettings||!_,onClick:()=>{let t=r.find(e=>e.provider===f&&e.modelId===h);t&&e.onSetDefaultModel?.({provider:t.provider,modelId:t.modelId,label:t.label})},children:`保存默认模型`}),(0,V.jsx)(`button`,{type:`button`,"data-model-clear":`1`,className:`settings-dir-cancel-btn`,disabled:!n||e.pendingSettings,onClick:()=>e.onSetDefaultModel?.(null),children:`清除默认模型`})]})]})]}),e.modelCatalog?.configError&&(0,V.jsxs)(`div`,{className:`settings-provider-note settings-provider-note-warn settings-provider-config-error`,"data-provider-config-error":`1`,children:[(0,V.jsx)(`div`,{children:`Pi 拒绝了自己的模型配置,因此它不提供文件里的任何自定义供应商:`}),(0,V.jsx)(`pre`,{className:`settings-provider-config-error-text`,children:e.modelCatalog.configError}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-cancel-btn`,"data-provider-repair":`1`,onClick:()=>e.onRepairProviders?.(),children:`修好这个文件`})]}),(0,V.jsx)(xv,{catalog:e.modelCatalog,customProviders:e.providers,onEditModel:(e,t,n)=>S({provider:e,modelId:t,label:n})}),(0,V.jsx)(Cv,{context:e,externalEditModel:x,offered:new Set((e.modelCatalog?.models??[]).map(e=>e.provider))}),(0,V.jsx)(`div`,{className:`picker-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,onClick:e.onClose,children:`完成`})})]})}var Tv=[{id:`appearance`,label:`外观`,render:hv},{id:`general`,label:`通用`,render:gv},{id:`memory`,label:`主动记忆`,render:e=>(0,V.jsx)(O_,{workspaceId:e.workspaceId,onClose:e.onClose})},{id:`knowledge`,label:`知识库`,render:e=>(0,V.jsx)(A_,{workspaceId:e.workspaceId,onClose:e.onClose})},{id:`agents`,label:`智能体`,render:vv},{id:`model`,label:`模型`,render:e=>(0,V.jsx)(wv,{context:e})},{id:`model-rules`,label:`模型过滤`,render:e=>(0,V.jsx)(bv,{context:e})},{id:`terminal`,label:`终端`,render:e=>(0,V.jsx)(yv,{context:e})}],Ev=Tv[0]?.id;function Dv({workspaceId:e,theme:t,onChooseTheme:n,onClose:r,agentCatalog:i,subagentCatalog:a,modelFilterRules:o,onSetModelRules:s,defaultModel:c,modelCatalog:l,onSetDefaultModel:u,providers:d,providerApis:f,onSetProvider:p,onRemoveProvider:m,onToggleProvider:h,onRepairProviders:g,onRemoveProviderModel:_,customAgentDirs:v,pendingSettings:y,onSetCustomAgentDirs:b,onRescanAgents:x,userNickname:S,onSetUserNickname:C,terminalShell:w,onSetTerminalShell:T}){let[E,D]=(0,B.useState)(Ev);(0,B.useEffect)(()=>{let e=e=>{e.key===`Escape`&&!e.defaultPrevented&&r()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[r]);let O=Tv.find(e=>e.id===E)??Tv[0];return(0,V.jsx)(`div`,{className:`overlay`,onClick:r,children:(0,V.jsxs)(`div`,{className:`picker settings-window`,"data-theme-dialog":`1`,"data-settings-window":`1`,onClick:e=>e.stopPropagation(),children:[(0,V.jsx)(`div`,{className:`settings-window-head`,children:(0,V.jsx)(`h2`,{children:`设置`})}),(0,V.jsxs)(`div`,{className:`settings-window-body`,children:[(0,V.jsxs)(`nav`,{className:`settings-nav`,role:`tablist`,"aria-orientation":`vertical`,"aria-label":`设置分类`,"data-settings-nav":`1`,children:[(0,V.jsx)(`div`,{className:`settings-nav-label`,children:`分类`}),Tv.map(e=>(0,V.jsx)(`button`,{type:`button`,id:`settings-tab-${e.id}`,className:`settings-category`,role:`tab`,"aria-selected":e.id===O?.id,"aria-controls":`settings-panel`,tabIndex:e.id===O?.id?0:-1,"data-settings-category":e.id,onClick:()=>D(e.id),children:e.label},e.id))]}),O&&(0,V.jsxs)(`div`,{className:`settings-panel`,id:`settings-panel`,role:`tabpanel`,"aria-labelledby":`settings-tab-${O.id}`,"data-settings-panel":O.id,children:[(0,V.jsx)(`h3`,{className:`settings-panel-title`,"data-settings-panel-title":O.id,children:O.label}),O.render({workspaceId:e,theme:t,onChooseTheme:n,onClose:r,agentCatalog:i,subagentCatalog:a,modelFilterRules:o,onSetModelRules:s,defaultModel:c,modelCatalog:l,onSetDefaultModel:u,providers:d,providerApis:f,onSetProvider:p,onRemoveProvider:m,onToggleProvider:h,onRepairProviders:g,onRemoveProviderModel:_,customAgentDirs:v,pendingSettings:y,onSetCustomAgentDirs:b,onRescanAgents:x,userNickname:S,onSetUserNickname:C,terminalShell:w,onSetTerminalShell:T})]})]})]})})}var Ov=Object.defineProperty,kv=Object.getOwnPropertyDescriptor,Av=(e,t)=>{for(var n in t)Ov(e,n,{get:t[n],enumerable:!0})},jv=(e,t,n,r)=>{for(var i=r>1?void 0:r?kv(t,n):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(i=(r?o(t,n,i):o(i))||i);return r&&i&&Ov(t,n,i),i},X=(e,t)=>(n,r)=>t(n,r,e),Mv=`Terminal input`,Nv={get:()=>Mv,set:e=>Mv=e},Pv=`Too much output to announce, navigate to rows manually to read`,Fv={get:()=>Pv,set:e=>Pv=e};function Iv(e){return e.replace(/\r?\n/g,`\r`)}function Lv(e,t){return t?`\x1B[200~`+e+`\x1B[201~`:e}function Rv(e,t){e.clipboardData&&e.clipboardData.setData(`text/plain`,t.selectionText),e.preventDefault()}function zv(e,t,n,r){e.stopPropagation(),e.clipboardData&&Bv(e.clipboardData.getData(`text/plain`),t,n,r)}function Bv(e,t,n,r){e=Iv(e),e=Lv(e,n.decPrivateModes.bracketedPasteMode&&r.rawOptions.ignoreBracketedPasteMode!==!0),n.triggerDataEvent(e,!0),t.value=``}function Vv(e,t,n){let r=n.getBoundingClientRect(),i=e.clientX-r.left-10,a=e.clientY-r.top-10;t.style.width=`20px`,t.style.height=`20px`,t.style.left=`${i}px`,t.style.top=`${a}px`,t.style.zIndex=`1000`,t.focus()}function Hv(e,t,n,r,i){Vv(e,t,n),i&&r.rightClickSelect(e),t.value=r.selectionText,t.select()}function Uv(e){return e>65535?(e-=65536,String.fromCharCode((e>>10)+55296)+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)}function Wv(e,t=0,n=e.length){let r=``;for(let i=t;i<n;++i){let t=e[i];t>65535?(t-=65536,r+=String.fromCharCode((t>>10)+55296)+String.fromCharCode(t%1024+56320)):r+=String.fromCharCode(t)}return r}var Gv=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){let n=e.length;if(!n)return 0;let r=0,i=0;if(this._interim){let n=e.charCodeAt(i++);56320<=n&&n<=57343?t[r++]=(this._interim-55296)*1024+n-56320+65536:(t[r++]=this._interim,t[r++]=n),this._interim=0}for(let a=i;a<n;++a){let i=e.charCodeAt(a);if(55296<=i&&i<=56319){if(++a>=n)return this._interim=i,r;let o=e.charCodeAt(a);56320<=o&&o<=57343?t[r++]=(i-55296)*1024+o-56320+65536:(t[r++]=i,t[r++]=o)}else i!==65279&&(t[r++]=i)}return r}},Kv=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){let n=e.length;if(!n)return 0;let r=0,i,a,o,s,c=0,l=0;if(this.interim[0]){let i=!1,a=this.interim[0];a&=(a&224)==192?31:(a&240)==224?15:7;let o=0,s;for(;(s=this.interim[++o]&63)&&o<4;)a<<=6,a|=s;let c=(this.interim[0]&224)==192?2:(this.interim[0]&240)==224?3:4,u=c-o;for(;l<u;){if(l>=n)return 0;if(s=e[l++],(s&192)!=128){l--,i=!0;break}this.interim[o++]=s,a<<=6,a|=s&63}i||(c===2?a<128?l--:t[r++]=a:c===3?a<2048||a>=55296&&a<=57343||a===65279||(t[r++]=a):a<65536||a>1114111||(t[r++]=a)),this.interim.fill(0)}let u=n-4,d=l;for(;d<n;){for(;d<u&&!((i=e[d])&128)&&!((a=e[d+1])&128)&&!((o=e[d+2])&128)&&!((s=e[d+3])&128);)t[r++]=i,t[r++]=a,t[r++]=o,t[r++]=s,d+=4;if(i=e[d++],i<128)t[r++]=i;else if((i&224)==192){if(d>=n)return this.interim[0]=i,r;if(a=e[d++],(a&192)!=128||(c=(i&31)<<6|a&63,c<128)){d--;continue}t[r++]=c}else if((i&240)==224){if(d>=n)return this.interim[0]=i,r;if(a=e[d++],(a&192)!=128){d--;continue}if(d>=n)return this.interim[0]=i,this.interim[1]=a,r;if(o=e[d++],(o&192)!=128){d--;continue}if(c=(i&15)<<12|(a&63)<<6|o&63,c<2048||c>=55296&&c<=57343||c===65279)continue;t[r++]=c}else if((i&248)==240){if(d>=n)return this.interim[0]=i,r;if(a=e[d++],(a&192)!=128){d--;continue}if(d>=n)return this.interim[0]=i,this.interim[1]=a,r;if(o=e[d++],(o&192)!=128){d--;continue}if(d>=n)return this.interim[0]=i,this.interim[1]=a,this.interim[2]=o,r;if(s=e[d++],(s&192)!=128){d--;continue}if(c=(i&7)<<18|(a&63)<<12|(o&63)<<6|s&63,c<65536||c>1114111)continue;t[r++]=c}}return r}},qv=``,Jv=` `,Yv=class e{constructor(){this.fg=0,this.bg=0,this.extended=new Xv}static toColorRGB(e){return[e>>>16&255,e>>>8&255,e&255]}static fromColorRGB(e){return(e[0]&255)<<16|(e[1]&255)<<8|e[2]&255}clone(){let t=new e;return t.fg=this.fg,t.bg=this.bg,t.extended=this.extended.clone(),t}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)==50331648}isBgRGB(){return(this.bg&50331648)==50331648}isFgPalette(){return(this.fg&50331648)==16777216||(this.fg&50331648)==33554432}isBgPalette(){return(this.bg&50331648)==16777216||(this.bg&50331648)==33554432}isFgDefault(){return!(this.fg&50331648)}isBgDefault(){return!(this.bg&50331648)}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)==50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)==16777216||(this.extended.underlineColor&50331648)==33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?!(this.extended.underlineColor&50331648):this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},Xv=class e{constructor(e=0,t=0){this._ext=0,this._urlId=0,this._ext=e,this._urlId=t}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(e){this._ext&=-67108864,this._ext|=e&67108863}get urlId(){return this._urlId}set urlId(e){this._urlId=e}get underlineVariantOffset(){let e=(this._ext&3758096384)>>29;return e<0?e^4294967288:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}clone(){return new e(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0}},Zv=class e extends Yv{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new Xv,this.combinedData=``}static fromCharData(t){let n=new e;return n.setFromCharData(t),n}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?Uv(this.content&2097151):``}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(e){this.fg=e[0],this.bg=0;let t=!1;if(e[1].length>2)t=!0;else if(e[1].length===2){let n=e[1].charCodeAt(0);if(55296<=n&&n<=56319){let r=e[1].charCodeAt(1);56320<=r&&r<=57343?this.content=(n-55296)*1024+r-56320+65536|e[2]<<22:t=!0}else t=!0}else this.content=e[1].charCodeAt(0)|e[2]<<22;t&&(this.combinedData=e[1],this.content=2097152|e[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}},Qv=`di$target`,$v=`di$dependencies`,ey=new Map;function ty(e){return e[$v]||[]}function ny(e){if(ey.has(e))return ey.get(e);let t=function(e,n,r){if(arguments.length!==3)throw Error(`@IServiceName-decorator can only be used to decorate a parameter`);ry(t,e,r)};return t._id=e,ey.set(e,t),t}function ry(e,t,n){t[Qv]===t?t[$v].push({id:e,index:n}):(t[$v]=[{id:e,index:n}],t[Qv]=t)}var iy=ny(`BufferService`),ay=ny(`CoreMouseService`),oy=ny(`CoreService`),sy=ny(`CharsetService`),cy=ny(`InstantiationService`),ly=ny(`LogService`),uy=ny(`OptionsService`),dy=ny(`OscLinkService`),fy=ny(`UnicodeService`),py=ny(`DecorationService`),my=class{constructor(e,t,n){this._bufferService=e,this._optionsService=t,this._oscLinkService=n}provideLinks(e,t){let n=this._bufferService.buffer.lines.get(e-1);if(!n){t(void 0);return}let r=[],i=this._optionsService.rawOptions.linkHandler,a=new Zv,o=n.getTrimmedLength(),s=-1,c=-1,l=!1;for(let t=0;t<o;t++)if(c!==-1||n.hasContent(t)){if(n.loadCell(t,a),a.hasExtendedAttrs()&&a.extended.urlId){if(c===-1){c=t,s=a.extended.urlId;continue}l=a.extended.urlId!==s}else c!==-1&&(l=!0);if(l||c!==-1&&t===o-1){let n=this._oscLinkService.getLinkData(s)?.uri;if(n){let a={start:{x:c+1,y:e},end:{x:t+ +(!l&&t===o-1),y:e}},s=!1;if(!i?.allowNonHttpProtocols)try{let e=new URL(n);[`http:`,`https:`].includes(e.protocol)||(s=!0)}catch{s=!0}s||r.push({text:n,range:a,activate:(e,t)=>i?i.activate(e,t,a):hy(e,t),hover:(e,t)=>i?.hover?.(e,t,a),leave:(e,t)=>i?.leave?.(e,t,a)})}l=!1,a.hasExtendedAttrs()&&a.extended.urlId?(c=t,s=a.extended.urlId):(c=-1,s=-1)}}t(r)}};my=jv([X(0,iy),X(1,uy),X(2,dy)],my);function hy(e,t){if(confirm(`Do you want to navigate to ${t}?
|
|
75
|
+
已验证的步骤、命令和注意事项`:`输入长期有效的事实或偏好`,value:u,onChange:e=>d(e.target.value)}),(0,V.jsxs)(`div`,{className:`settings-rule-form-buttons`,children:[(0,V.jsxs)(`button`,{type:`button`,className:`settings-dir-add-btn`,disabled:!u.trim(),onClick:async()=>{await g({action:`write`,operation:{target:c,action:f?`replace`:`add`,id:f,content:u}})&&(p(void 0),d(``))},children:[`保存`,f?`修改`:`新条目`]}),f&&(0,V.jsx)(`button`,{type:`button`,className:`settings-rule-cancel-btn`,onClick:()=>{p(void 0),d(``)},children:`取消编辑`})]})]})]}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsxs)(`h4`,{className:`settings-section-title`,children:[`待审批提案(共 `,n.pending.length,` 个)`]}),n.pending.length===0?(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`暂无待审批提案。`}):(0,V.jsx)(`div`,{className:`settings-dirs-list`,children:n.pending.map(e=>(0,V.jsxs)(`article`,{"data-memory-proposal":e.id,className:`settings-proposal-card`,children:[(0,V.jsxs)(`div`,{className:`settings-proposal-header`,children:[(0,V.jsx)(`span`,{className:`settings-proposal-badge`,children:e.operation.target}),(0,V.jsx)(`span`,{className:`settings-proposal-action`,children:e.operation.action})]}),e.previous&&(0,V.jsxs)(`pre`,{className:`settings-proposal-diff old`,children:[`原内容:`,e.previous]}),(0,V.jsx)(`pre`,{className:`settings-proposal-diff new`,children:e.operation.content}),(0,V.jsxs)(`div`,{className:`settings-proposal-actions`,children:[(0,V.jsx)(`button`,{type:`button`,className:`settings-rule-edit-btn`,onClick:()=>void g({action:`approve`,proposalId:e.id}),children:`批准`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-remove-btn`,onClick:()=>void g({action:`discard`,proposalId:e.id}),children:`拒绝`})]})]},e.id))})]})]}),t&&(0,V.jsx)(`div`,{className:`picker-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,onClick:t,children:`完成`})})]}):(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`请先在主界面选择工作区以管理其专属记忆与技能。`})}function k_({workspaceId:e,onClose:t,onPick:n}){let[r,i]=(0,B.useState)(),[a,o]=(0,B.useState)(!1),[s,c]=(0,B.useState)(``),[l,u]=(0,B.useState)(``),[d,f]=(0,B.useState)(),p=(0,B.useRef)(0);async function m(t){let n=++p.current;o(!0),c(``);try{let r=await fetch(`/api/files?workspaceId=${encodeURIComponent(e)}${t?`&path=${encodeURIComponent(t)}`:``}`),a=await r.json();if(!r.ok)throw Error(a.error??`HTTP ${r.status}`);if(n!==p.current)return;i(a),f(void 0)}catch(e){n===p.current&&c(Xf(e,`这个目录读取失败。`))}finally{n===p.current&&o(!1)}}(0,B.useEffect)(()=>{m()},[e]),(0,B.useEffect)(()=>{let e=e=>{e.key===`Escape`&&!e.isComposing&&t()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[t]);let h=l.trim().toLocaleLowerCase(),g=(0,B.useMemo)(()=>(r?.entries??[]).filter(e=>e.kind===`directory`||e.kind===`file`&&(e.text||e.document)&&!e.outside),[r]),_=h?g.filter(e=>e.name.toLocaleLowerCase().includes(h)):g;return(0,V.jsx)(`div`,{className:`overlay`,onClick:t,children:(0,V.jsxs)(`div`,{className:`picker knowledge-picker`,"data-knowledge-picker":`1`,onClick:e=>e.stopPropagation(),role:`dialog`,"aria-modal":`true`,"aria-label":`选择要导入的文档`,children:[(0,V.jsx)(`h2`,{children:`选择要导入的文档`}),(0,V.jsxs)(`div`,{className:`picker-path-bar`,children:[(0,V.jsx)(`input`,{"aria-label":`按文件名过滤`,className:`picker-path-input`,placeholder:`按文件名过滤…`,value:l,onChange:e=>u(e.target.value)}),(0,V.jsx)(`button`,{type:`button`,className:`picker-up-btn`,disabled:!r||r.parent===null||a,onClick:()=>void m(r?.parent??void 0),"aria-label":`上一级`,children:`↑`})]}),(0,V.jsx)(`div`,{className:`picker-status`,"data-knowledge-picker-path":r?.path??``,children:r?r.path||`工作区根目录`:`读取中…`}),s&&(0,V.jsx)(`div`,{className:`picker-error`,role:`alert`,children:s}),(0,V.jsx)(`div`,{className:`picker-list`,"data-knowledge-picker-list":_.length,children:_.length===0?(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:h?`没有匹配的文件。`:`这个目录里没有可导入的文件。`}):_.map(e=>e.kind===`directory`?(0,V.jsxs)(`button`,{type:`button`,className:`picker-dir`,"data-knowledge-picker-dir":e.path,onClick:()=>void m(e.path),children:[`📁 `,e.name]},e.path):(0,V.jsxs)(`button`,{type:`button`,className:`picker-dir`,"data-knowledge-picker-file":e.path,"data-knowledge-picker-document":e.document?`1`:void 0,"aria-pressed":d===e.path,onClick:()=>f(e.path),onDoubleClick:()=>n(e.path),children:[e.document?`📕 文档`:`📄`,` `,e.name]},e.path))}),(0,V.jsxs)(`div`,{className:`picker-actions`,children:[(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,onClick:t,children:`取消`}),(0,V.jsx)(`button`,{type:`button`,className:`picker-ok`,disabled:!d,"data-knowledge-picker-ok":d??``,onClick:()=>{d&&n(d)},children:`导入这个文档`})]})]})})}function A_({workspaceId:e,onClose:t}){let[n,r]=(0,B.useState)(),[i,a]=(0,B.useState)(``),[o,s]=(0,B.useState)(!1),[c,l]=(0,B.useState)(``),[u,d]=(0,B.useState)(``),[f,p]=(0,B.useState)(``),[m,h]=(0,B.useState)(``),[g,_]=(0,B.useState)(!1),v=(0,B.useRef)(e);v.current=e;let y=(0,B.useRef)(0);async function b(t){if(!e)return;let n=++y.current;s(!0),a(``);try{let i=await fetch(`/api/knowledge?workspaceId=${encodeURIComponent(e)}`,{method:t?`POST`:`GET`,headers:{"Content-Type":`application/json`},...t?{body:JSON.stringify(t)}:{}}),a=await i.json();if(!i.ok)throw Error(a.error);return v.current!==e||n!==y.current?!1:(r(a),!0)}catch(t){return v.current===e&&n===y.current&&a(Xf(t,`知识库读取失败。`)),!1}finally{v.current===e&&n===y.current&&s(!1)}}if((0,B.useEffect)(()=>{r(void 0),l(``),d(``),p(``),h(``),b()},[e]),!e)return(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`请先在主界面选择工作区以管理它的知识库。`});let x=n?.documents??[],S=x.reduce((e,t)=>e+t.characters,0),C=n?.semantic,w=C?C.enabled?C.error?`不可用:${Xf(C.error,`本地语义模型没有加载成功`)};已退回关键词检索`:C.ready?`已就绪,已索引 ${C.indexed} 个片段`:C.bundled===!1?`随包分发的模型缺失;已退回关键词检索`:`首次检索时加载本地模型,之后一直可用`:`已关闭(SUPER_PI_KNOWLEDGE_EMBEDDINGS=0)`:`未启用`;return(0,V.jsxs)(`section`,{"data-knowledge-panel":`1`,className:`settings-panel-container`,children:[(0,V.jsx)(`div`,{className:`settings-agents-header`,children:(0,V.jsxs)(`p`,{className:`settings-agents-desc`,children:[(0,V.jsx)(`strong`,{children:`项目自己的文档。`}),` 浏览工作区里的规范、设计稿、会议纪要导入进来,Agent 就能在回答前检索原文,而不是凭记忆编造。文档按当前工作区隔离,检索结果只回传片段而不回传全文。关键词检索始终可用;语义检索能在用词不同的情况下找到片段,但代价是首次使用要下载一个本地模型。`]})}),(0,V.jsxs)(`div`,{className:`settings-dir-info`,"data-knowledge-semantic":C?C.error?`unavailable`:C.ready?`ready`:`loading`:`off`,title:C?.error,children:[`语义检索:`,w]}),i&&(0,V.jsx)(`div`,{className:`settings-dir-error`,role:`alert`,children:i}),n&&(0,V.jsxs)(`fieldset`,{disabled:o,className:`settings-memory-fieldset`,children:[(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsxs)(`h4`,{className:`settings-section-title`,children:[`从工作区文件导入(`,x.length,` 篇,共 `,S,` 字符)`]}),(0,V.jsxs)(`div`,{className:`settings-add-dir-form`,children:[(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-add-btn`,"data-knowledge-browse":`1`,onClick:()=>_(!0),children:`浏览工作区文件…`}),(0,V.jsx)(`span`,{className:`settings-dir-info`,children:`在工作区里挑选一个 Markdown 或文本文件`})]}),(0,V.jsxs)(`div`,{className:`settings-add-dir-form`,style:{marginTop:8},children:[(0,V.jsx)(`input`,{"aria-label":`文档路径`,className:`settings-dir-input`,placeholder:`或直接填写相对路径,例如 docs/design.md`,value:c,onChange:e=>l(e.target.value)}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-add-btn`,disabled:!c.trim(),onClick:async()=>{await b({action:`add`,path:c})&&l(``)},children:`导入`})]}),(0,V.jsxs)(`div`,{className:`settings-memory-editor`,style:{marginTop:12},children:[(0,V.jsx)(`h5`,{className:`settings-memory-editor-title`,children:`或者直接粘贴正文`}),(0,V.jsx)(`input`,{"aria-label":`文档标题`,className:`settings-dir-input`,placeholder:`标题(留空则取正文首行)`,value:u,onChange:e=>d(e.target.value)}),(0,V.jsx)(`textarea`,{"aria-label":`文档正文`,className:`settings-memory-textarea`,placeholder:`以 # 开头的标题会成为检索结果里的段落归属`,value:f,onChange:e=>p(e.target.value)}),(0,V.jsxs)(`div`,{className:`settings-rule-form-buttons`,children:[(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-add-btn`,disabled:!f.trim(),onClick:async()=>{await b({action:`add`,title:u,text:f})&&(d(``),p(``))},children:`保存文档`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-rule-cancel-btn`,onClick:()=>{d(``),p(``)},children:`清空`})]})]})]}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`已导入文档`}),x.length===0?(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`还没有文档。导入后,下一条消息起 Agent 就能检索到它们。`}):(0,V.jsx)(`div`,{className:`settings-dirs-list`,children:x.map(e=>(0,V.jsxs)(`article`,{"data-knowledge-document":e.id,className:`settings-memory-card`,children:[(0,V.jsxs)(`div`,{className:`settings-dir-row`,children:[(0,V.jsx)(`span`,{className:`settings-dir-tag`,children:e.format||`txt`}),(0,V.jsx)(`span`,{className:`settings-dir-path`,children:e.title}),(0,V.jsxs)(`span`,{className:`settings-dir-count`,children:[e.characters,` 字符`]})]}),(0,V.jsx)(`div`,{className:`settings-dir-info`,children:e.source}),(0,V.jsx)(`div`,{className:`settings-memory-card-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-remove-btn`,onClick:()=>void b({action:`remove`,documentId:e.id}),children:`删除`})})]},e.id))})]}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`试检索`}),(0,V.jsxs)(`div`,{className:`settings-add-dir-form`,children:[(0,V.jsx)(`input`,{"aria-label":`检索词`,className:`settings-dir-input`,placeholder:`用和提问时相同的措辞试试`,value:m,onChange:e=>h(e.target.value),onKeyDown:e=>{e.key===`Enter`&&m.trim()&&b({action:`search`,query:m})}}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-add-btn`,disabled:!m.trim(),onClick:()=>void b({action:`search`,query:m}),children:`检索`})]}),m.trim()&&(n?.hits?.length===0?(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`没有命中。知识库确实没有这段内容——Agent 也会得到同样的空结果。`}):(0,V.jsx)(`div`,{className:`settings-memory-entries-list`,children:(n?.hits??[]).map(e=>(0,V.jsxs)(`article`,{"data-knowledge-hit":`${e.documentId}#${e.chunk}`,className:`settings-memory-card`,children:[(0,V.jsxs)(`div`,{className:`settings-dir-row`,children:[(0,V.jsx)(`span`,{className:`settings-dir-tag`,children:e.title}),(0,V.jsxs)(`span`,{className:`settings-dir-count`,title:`相关度(越高越接近)`,children:[`相关度 `,e.score.toFixed(2)]})]}),e.heading&&(0,V.jsx)(`div`,{className:`settings-dir-info`,children:e.heading}),(0,V.jsx)(`pre`,{className:`settings-memory-content`,children:e.text})]},`${e.documentId}#${e.chunk}`))}))]})]}),t&&(0,V.jsx)(`div`,{className:`picker-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,onClick:t,children:`完成`})}),g&&(0,V.jsx)(k_,{workspaceId:e,onClose:()=>_(!1),onPick:async e=>{_(!1),await b({action:`add`,path:e})&&l(``)}})]})}var j_=[{kind:`calculator`,name:`计算器`,glyph:`∑`,blurb:`算术表达式,四则运算与乘方。除零会明确报错。`},{kind:`timestamp`,name:`时间戳`,glyph:`◷`,blurb:`Unix 时间戳与日期互转,本地计算,不联网。`}],M_=[{id:`preset_calculator`,kind:`calculator`,name:`计算器`,glyph:`∑`}],N_=40,P_=2048,F_=`super-pi:tools:v1`;function I_(e){return typeof e==`string`?e.replace(/\s+/g,` `).trim().slice(0,N_):``}function L_(e){let t=e.trim();if(!t)return{ok:!1,reason:`请填写网址。`};if(t.length>P_)return{ok:!1,reason:`网址太长了,请控制在 ${P_} 个字符以内。`};let n=xp(t);return n?{ok:!0,url:n}:{ok:!1,reason:`这个网址不是允许的协议。只支持 http / https / mailto 开头的网址。`}}function R_(e){if(!e)return[];let t;try{t=JSON.parse(e)}catch{return[]}if(!Array.isArray(t))return[];let n=[],r=new Set;for(let e of t){if(n.length>=32)break;if(typeof e!=`object`||!e)continue;let t=e,i=t.kind;if(typeof i!=`string`||i!==`calculator`&&i!==`timestamp`&&i!==`link`)continue;let a=I_(t.name);if(!a)continue;let o=typeof t.glyph==`string`&&t.glyph.trim()?t.glyph.trim().slice(0,4):``;if(!o)continue;let s=typeof t.id==`string`&&t.id.trim()?t.id.trim().slice(0,64):``;if(s&&!r.has(s)){if(i===`link`){let e=xp(typeof t.url==`string`?t.url:``);if(!e)continue;r.add(s),n.push({id:s,kind:`link`,name:a,glyph:o,url:e})}else r.add(s),n.push({id:s,kind:i,name:a,glyph:o})}}return n}function z_(e){return JSON.stringify(e.map(e=>e.kind===`link`?{...e}:{id:e.id,kind:e.kind,name:e.name,glyph:e.glyph}))}function B_(){let e=typeof globalThis<`u`?globalThis.crypto:void 0;return typeof e?.randomUUID==`function`?e.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function V_(e,t){let n=e===`link`?`link`:`preset_${e}`,r=B_().replace(/-/g,``).slice(0,8),i=`${n}_${r}`,a=1;for(;t.includes(i);)i=`${n}_${r}_${a}`,a+=1;return i}function H_(e,t){if(e.some(e=>e.kind===t))return e.slice();let n=j_.find(e=>e.kind===t);return n?[...e,{id:V_(t,e.map(e=>e.id)),kind:t,name:n.name,glyph:n.glyph}]:e.slice()}function U_(e,t){return e.filter(e=>e.id!==t)}var W_=e=>({ok:!1,reason:e}),G_=`除数不能为 0:除以零没有结果,请换一个非零的除数。`,K_=new Set([`/`,`%`]),q_=e=>e!==void 0&&e>=`0`&&e<=`9`,J_=e=>e!==void 0&&/\s/.test(e);function Y_(e){for(;J_(e.source[e.at]);)e.at+=1}function X_(e){let t=e.at,n=0;for(;q_(e.source[e.at]);)e.at+=1,n+=1;if(e.source[e.at]===`.`)for(e.at+=1;q_(e.source[e.at]);)e.at+=1,n+=1;if(!n)return e.at=t,W_(`「${e.source[t]}」不是有效的数字。`);let r=Number(e.source.slice(t,e.at));return Number.isFinite(r)?{ok:!0,value:r}:W_(`数字太长了,无法表示。`)}function Z_(e){Y_(e);let t=e.source[e.at];if(t===void 0)return W_(`算式不完整:末尾还缺一个数字或右括号。`);if(t===`(`){e.at+=1;let t=tv(e);return t.ok?(Y_(e),e.source[e.at]===`)`?(e.at+=1,t):W_(`括号不匹配:少了一个右括号「)」。`)):t}return q_(t)||t===`.`?X_(e):W_(`无法识别的字符「${t}」。`)}function Q_(e){let t=Z_(e);if(!t.ok||(Y_(e),e.source[e.at]!==`^`))return t;e.at+=1;let n=$_(e);if(!n.ok)return n;let r=t.value**n.value;return Number.isFinite(r)?{ok:!0,value:r}:W_(`结果超出了可计算的数值范围。`)}function $_(e){Y_(e);let t=e.source[e.at];if(t!==`+`&&t!==`-`)return Q_(e);e.at+=1;let n=$_(e);if(!n.ok)return n;let r=t===`-`?-n.value:n.value;return Number.isFinite(r)?{ok:!0,value:r}:W_(`结果超出了可计算的数值范围。`)}function ev(e){let t=$_(e);if(!t.ok)return t;for(;;){Y_(e);let n=e.source[e.at];if(n!==`*`&&!K_.has(n))return t;e.at+=1;let r=$_(e);if(!r.ok)return r;if(K_.has(n)&&r.value===0)return W_(G_);let i=n===`*`?t.value*r.value:n===`%`?t.value%r.value:t.value/r.value;if(!Number.isFinite(i))return W_(`结果超出了可计算的数值范围。`);t={ok:!0,value:i}}}function tv(e){let t=ev(e);if(!t.ok)return t;for(;;){Y_(e);let n=e.source[e.at];if(n!==`+`&&n!==`-`)return t;e.at+=1;let r=ev(e);if(!r.ok)return r;let i=n===`+`?t.value+r.value:t.value-r.value;if(!Number.isFinite(i))return W_(`结果超出了可计算的数值范围。`);t={ok:!0,value:i}}}function nv(e){let t=e.trim();if(!t)return W_(`请输入算式。`);if(t.length>200)return W_(`算式太长了,请控制在 200 个字符以内。`);let n={source:t,at:0},r=tv(n);return r.ok?(Y_(n),n.at===t.length?Number.isFinite(r.value)?r:W_(`结果不是有限数字。`):W_(`「${t[n.at]}」后面的内容无法识别,请检查是否漏了运算符。`)):r}function rv(e){return String(!Number.isFinite(e)||Number.isInteger(e)&&Math.abs(e)<1e21?e:Number(e.toPrecision(12)))}function iv(e){let t=e.trim();if(!t)return{ok:!1,reason:`请输入时间戳或日期。`};if(/^-?\d+$/.test(t)){let e=Number(t);if(!Number.isFinite(e))return{ok:!1,reason:`这个数字太大,无法表示。`};let n=t.replace(`-`,``).length<=11?e*1e3:e;return!Number.isFinite(n)||Math.abs(n)>864e13?{ok:!1,reason:`这个时间戳超出了日期能表示的范围。`}:{ok:!0,ms:n}}let n=Date.parse(t);return Number.isNaN(n)?{ok:!1,reason:`看不懂这个日期。试试 1757000000、2026-10-08 或 2026-10-08T09:00:00。`}:{ok:!0,ms:n}}var av=e=>String(Math.abs(e)).padStart(2,`0`);function ov(e){let t=new Date(e);return Number.isNaN(t.getTime())?null:{local:`${t.getFullYear()}-${av(t.getMonth()+1)}-${av(t.getDate())} ${av(t.getHours())}:${av(t.getMinutes())}:${av(t.getSeconds())}`,iso:t.toISOString(),seconds:String(Math.floor(e/1e3)),milliseconds:String(e)}}var sv=e=>e.nativeEvent.isComposing||e.keyCode===229,cv=`super-pi.theme`,lv=[{id:`dracula`,name:`Dracula`,blurb:`紫调暗色,饱满对比,适合夜间专注。`},{id:`monokai`,name:`Monokai`,blurb:`暖调暗色,橙红点缀,经典编辑器风格。`},{id:`solarized-light`,name:`Solarized Light`,blurb:`暖黄米色调,柔和护眼,适合长时间阅读。`},{id:`github-light`,name:`GitHub Light`,blurb:`冷调浅色,中性清晰,日常办公首选。`}],uv=`dracula`,dv=e=>typeof e==`string`&&lv.some(t=>t.id===e);function fv(){try{let e=window.localStorage.getItem(cv);if(!e)return uv;let t=JSON.parse(e),n=typeof t==`string`?t:t?.id;return dv(n)?n:uv}catch{return uv}}function pv(e){document.documentElement.setAttribute(`data-theme`,e);try{window.localStorage.setItem(cv,JSON.stringify({id:e,version:1}))}catch{}}function mv(){let[e,t]=(0,B.useState)(uv);return(0,B.useEffect)(()=>{t(fv());let e=e=>{if(e.key===`super-pi.theme`&&e.newValue)try{let n=JSON.parse(e.newValue),r=typeof n==`string`?n:n?.id;dv(r)&&(document.documentElement.setAttribute(`data-theme`,r),t(r))}catch{}};return window.addEventListener(`storage`,e),()=>window.removeEventListener(`storage`,e)},[]),{theme:e,setTheme:(0,B.useCallback)(e=>{pv(e),t(e)},[])}}function hv({theme:e,onChooseTheme:t,onClose:n}){let r=lv.find(t=>t.id===e);return(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`div`,{className:`settings-scope`,children:`主题只影响这台设备的显示,不改变任何内容;切换立即生效。`}),lv.length===0?(0,V.jsx)(`div`,{className:`theme-empty`,"data-theme-empty":`1`,children:`没有可用的主题。界面将继续使用默认配色,你可以在主题文件恢复后重试。`}):(0,V.jsx)(`div`,{className:`theme-options`,role:`radiogroup`,"aria-label":`主题`,children:lv.map(n=>{let r=n.id===e;return(0,V.jsxs)(`button`,{type:`button`,className:`theme-option`,role:`radio`,"aria-checked":r,"aria-pressed":r,"data-theme-option":n.id,"data-theme-current":r?`1`:`0`,onClick:()=>t(n.id),children:[(0,V.jsx)(`span`,{className:`theme-preview-strip`,"data-preview":n.id,"aria-hidden":`true`}),(0,V.jsxs)(`span`,{className:`theme-option-name`,children:[n.name,r&&(0,V.jsx)(`span`,{className:`theme-option-current`,children:`当前 ✓`})]}),(0,V.jsx)(`span`,{className:`theme-option-blurb`,children:n.blurb})]},n.id)})}),(0,V.jsx)(`div`,{className:`picker-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,"data-theme-close":`1`,onClick:n,children:`完成`})}),(0,V.jsxs)(`div`,{className:`settings-scope theme-current-line`,children:[`当前:`,r?`${r.name}(${r.id})`:`默认`]})]})}function gv({userNickname:e,onSetUserNickname:t,onClose:n}){return(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`div`,{className:`settings-scope`,children:`昵称会显示在消息时间戳旁和头像上,替代默认的「你」。留空恢复默认。`}),(0,V.jsxs)(`div`,{className:`general-nickname`,children:[(0,V.jsx)(`label`,{className:`general-nickname-label`,htmlFor:`general-nickname-input`,children:`昵称`}),(0,V.jsx)(`input`,{id:`general-nickname-input`,type:`text`,className:`general-nickname-input`,"data-general-nickname":`1`,maxLength:24,placeholder:`你`,value:e??``,onChange:e=>t?.(e.target.value)}),(0,V.jsx)(`span`,{className:`general-nickname-hint`,"data-general-nickname-preview":`1`,title:`当前显示`,children:e?.trim()?`将显示为:${e.trim()}`:`将显示为:你`})]}),(0,V.jsx)(`div`,{className:`picker-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,onClick:n,children:`完成`})})]})}function _v({context:e}){let[t,n]=(0,B.useState)(``),[r,i]=(0,B.useState)(``),[a,o]=(0,B.useState)(!1),s=e.agentCatalog,c=e.subagentCatalog,l=s?.agents??[],u=c?.agents??[],d=[...l,...u],f=[...s?.problems??[],...c?.problems??[]],p=[...new Set([...s?.directories??(s?.directory?[s.directory]:[]),...e.customAgentDirs??[]])],m=e.customAgentDirs??[],h=r=>{if(r.preventDefault(),e.pendingSettings)return;let a=t.trim();a&&(m.includes(a)?i(`该路径已存在于自定义目录列表中`):(e.onSetCustomAgentDirs?.([...m,a]),n(``),i(``)))},g=t=>{let n=m.filter(e=>e!==t);e.onSetCustomAgentDirs?.(n)};return(0,V.jsxs)(`div`,{className:`settings-agents-container`,children:[(0,V.jsxs)(`div`,{className:`settings-agents-header`,children:[(0,V.jsx)(`p`,{className:`settings-agents-desc`,children:`Super Pi 支持多目录发现智能体。系统会按优先级自上而下合并扫描目录;若存在同名配置,高优先级目录的文件将覆盖低优先级目录。`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-agent-rescan-btn`,onClick:()=>{o(!0),e.onRescanAgents?.(),setTimeout(()=>o(!1),600)},disabled:a,title:`重新扫描所有目录中的智能体定义文件`,children:a?`正在扫描…`:`🔄 立即重新扫描`})]}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`发现路径清单(按优先级自高到低)`}),(0,V.jsx)(`div`,{className:`settings-dirs-list`,children:p.length===0?(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`暂无活跃的发现路径`}):p.map((t,n)=>{let r=m.includes(t),i=t.includes(`.super_pi`)||t.includes(`.super-pi`)||t.includes(`.pi`),a=!r&&!i,o=d.filter(e=>e.sourceDir===t).length;return(0,V.jsxs)(`div`,{className:`settings-dir-row`,children:[(0,V.jsxs)(`div`,{className:`settings-dir-info`,children:[(0,V.jsxs)(`span`,{className:`settings-dir-priority`,children:[`#`,n+1]}),(0,V.jsx)(`span`,{className:`settings-dir-path`,title:t,children:t}),(0,V.jsx)(`span`,{className:`settings-dir-tag`,children:r?`自定义`:i?`用户全局`:a?`内置`:`环境`}),(0,V.jsxs)(`span`,{className:`settings-dir-count`,children:[`(发现 `,o,` 个智能体)`]})]}),r&&(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-remove-btn`,disabled:e.pendingSettings,onClick:()=>g(t),title:`移除此自定义扫描路径`,children:`移除`})]},t)})})]}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`添加自定义路径`}),(0,V.jsxs)(`form`,{onSubmit:h,className:`settings-add-dir-form`,children:[(0,V.jsx)(`input`,{type:`text`,className:`settings-dir-input`,value:t,onChange:e=>{n(e.target.value),r&&i(``)},onKeyDown:e=>{e.key===`Enter`&&sv(e)&&e.preventDefault()},placeholder:`输入本地目录绝对路径或 ~/ 开头路径,如 D:\\agents 或 ~/.super_pi/agents`}),(0,V.jsx)(`button`,{type:`submit`,className:`settings-dir-add-btn`,disabled:e.pendingSettings||!t.trim(),children:`添加目录`})]}),r&&(0,V.jsx)(`div`,{className:`settings-dir-error`,children:r})]}),f.length>0&&(0,V.jsxs)(`section`,{className:`settings-section settings-problems-section`,children:[(0,V.jsxs)(`h4`,{className:`settings-problems-title`,children:[`⚠️ 发现 `,f.length,` 个文件解析问题`]}),(0,V.jsx)(`div`,{className:`settings-problems-list`,children:f.map((e,t)=>(0,V.jsxs)(`div`,{className:`settings-problem-row`,children:[(0,V.jsx)(`span`,{className:`settings-problem-file`,children:e.file}),`: `,e.message]},t))})]}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsxs)(`h4`,{className:`settings-section-title`,children:[`已发现的智能体(共 `,d.length,` 个)`]}),d.length===0?(0,V.jsxs)(`div`,{className:`settings-empty-hint`,children:[`当前未发现任何智能体。请在上述目录中添加 `,(0,V.jsx)(`code`,{children:`.md`}),` 文件(需包含 YAML frontmatter)。`]}):(0,V.jsx)(`div`,{className:`settings-agent-grid`,children:d.map(e=>(0,V.jsxs)(`div`,{className:`settings-agent-card`,children:[(0,V.jsxs)(`div`,{className:`settings-agent-card-header`,children:[(0,V.jsx)(`span`,{className:`settings-agent-name`,children:e.name}),(0,V.jsxs)(`span`,{className:`settings-agent-id`,children:[`(`,e.id,`)`]}),(0,V.jsx)(`span`,{className:`settings-agent-mode-badge ${e.mode}`,children:e.mode===`primary`?`主智能体`:`子智能体`})]}),e.sourceDir&&(0,V.jsxs)(`div`,{className:`settings-agent-source`,title:e.sourceDir,children:[`来源:`,e.sourceDir]}),e.description&&(0,V.jsx)(`div`,{className:`settings-agent-desc`,children:e.description}),(0,V.jsxs)(`div`,{className:`settings-agent-footer`,children:[(0,V.jsx)(`span`,{className:`settings-agent-tools`,children:e.toolSummary}),e.model&&(0,V.jsxs)(`span`,{className:`settings-agent-model`,children:[e.model.provider,`/`,e.model.modelId]})]})]},`${e.sourceDir}-${e.id}`))})]}),(0,V.jsx)(`div`,{className:`picker-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,onClick:e.onClose,children:`完成`})})]})}function vv(e){return(0,V.jsx)(_v,{context:e})}function yv({context:e}){let[t,n]=(0,B.useState)({enabled:!1}),[r,i]=(0,B.useState)(``),a=(0,B.useCallback)(async e=>{try{let[t,r]=await Promise.all([fetch(`/api/terminal`).then(e=>e.json()),fetch(`/api/terminal-shell`).then(e=>e.json())]);n({...r,enabled:t.enabled}),e&&i(r.shell?[r.shell.file,...r.shell.args].map(e=>/\s/.test(e)?`"${e}"`:e).join(` `):``)}catch{}},[]);(0,B.useEffect)(()=>{a(!0)},[a]);let o=(0,B.useRef)(e.terminalShell);return(0,B.useEffect)(()=>{o.current!==e.terminalShell&&(o.current=e.terminalShell,a(!1))},[e.terminalShell,a]),t.enabled?(0,V.jsx)(`section`,{className:`settings-panel-container`,"data-terminal-settings":`1`,children:(0,V.jsxs)(`div`,{className:`settings-section`,children:[(0,V.jsxs)(`p`,{className:`settings-empty-hint`,children:[`当前生效:`,(0,V.jsx)(`code`,{children:t.shell?[t.shell.file,...t.shell.args].join(` `):``}),`(来自`,t.source,`)。只影响新开的终端。`]}),(0,V.jsx)(`label`,{className:`settings-section-title`,children:`默认 shell`}),(0,V.jsx)(`input`,{className:`settings-dir-input`,"data-terminal-shell-input":`1`,value:r,onChange:e=>i(e.target.value),placeholder:`例如 wsl.exe -e zsh`}),(0,V.jsx)(`div`,{className:`settings-dirs-list`,children:(t.candidates??[]).map(e=>(0,V.jsx)(`button`,{type:`button`,className:`settings-agent-rescan-btn`,onClick:()=>i([e.file,...e.args].map(e=>/\s/.test(e)?`"${e}"`:e).join(` `)),children:e.label},`${e.file}:${e.args.join(` `)}`))}),(0,V.jsx)(`div`,{children:(0,V.jsx)(`button`,{type:`button`,className:`settings-agent-rescan-btn`,"data-terminal-shell-save":`1`,onClick:()=>e.onSetTerminalShell?.(r.trim()||null),children:`保存`})})]})}):(0,V.jsx)(`section`,{className:`settings-panel-container`,"data-terminal-settings":`disabled`,children:(0,V.jsx)(`p`,{className:`settings-empty-hint`,children:`终端没有启用,无法设置默认 shell。`})})}function bv({context:e}){let[t,n]=(0,B.useState)(``),[r,i]=(0,B.useState)(``),[a,o]=(0,B.useState)(),s=e=>{try{return new RegExp(e,`i`),!1}catch{return!0}},c=s(t),l=s(r),u=e.modelFilterRules??[];return(0,V.jsxs)(`section`,{"data-model-rules":`1`,className:`settings-panel-container`,children:[(0,V.jsx)(`div`,{className:`settings-agents-header`,children:(0,V.jsxs)(`p`,{className:`settings-agents-desc`,children:[(0,V.jsx)(`strong`,{children:`按工作区约束可用模型。`}),`当工作区名称匹配指定正则表达式时,会话中仅可选择符合模型正则的模型(匹配模型名称或 `,(0,V.jsx)(`code`,{children:`provider/modelId`}),`)。多条命中规则必须全部满足。`]})}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsxs)(`h4`,{className:`settings-section-title`,children:[`已配置的过滤规则(共 `,u.length,` 条)`]}),u.length===0?(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`暂无模型过滤规则。所有工作区默认可使用全部已配置模型。`}):(0,V.jsx)(`div`,{className:`settings-dirs-list`,children:u.map(t=>{let r=a===t.id;return(0,V.jsxs)(`div`,{className:`settings-rule-card ${r?`editing`:``}`,children:[(0,V.jsx)(`div`,{className:`settings-rule-info`,children:(0,V.jsxs)(`div`,{className:`settings-rule-patterns`,children:[(0,V.jsxs)(`span`,{className:`settings-rule-pill`,children:[(0,V.jsx)(`span`,{className:`settings-rule-pill-tag`,children:`工作区`}),(0,V.jsx)(`code`,{className:`settings-rule-code`,title:t.workspacePattern,children:t.workspacePattern})]}),(0,V.jsx)(`span`,{className:`settings-rule-arrow`,"aria-hidden":`true`,children:`→`}),(0,V.jsxs)(`span`,{className:`settings-rule-pill`,children:[(0,V.jsx)(`span`,{className:`settings-rule-pill-tag`,children:`允许模型`}),(0,V.jsx)(`code`,{className:`settings-rule-code`,title:t.modelPattern,children:t.modelPattern})]})]})}),(0,V.jsxs)(`div`,{className:`settings-rule-actions`,children:[(0,V.jsx)(`button`,{type:`button`,className:`settings-rule-edit-btn`,onClick:()=>{o(t.id),n(t.workspacePattern),i(t.modelPattern)},children:r?`编辑中`:`编辑`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-remove-btn`,onClick:()=>{a===t.id&&(o(void 0),n(``),i(``)),e.onSetModelRules?.(u.filter(e=>e.id!==t.id))},children:`删除`})]})]},t.id)})})]}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:a?`编辑过滤规则`:`添加新规则`}),(0,V.jsxs)(`fieldset`,{disabled:e.pendingSettings,className:`model-rules-fields settings-rule-fieldset`,children:[(0,V.jsxs)(`div`,{className:`settings-rule-form-grid`,children:[(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`工作区名正则表达式`}),(0,V.jsx)(`input`,{type:`text`,"data-rule-workspace":`1`,className:`settings-dir-input`,value:t,"aria-invalid":c,placeholder:`如 ^proj- 或 my-workspace`,onChange:e=>n(e.target.value)})]}),(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`允许的模型名正则表达式`}),(0,V.jsx)(`input`,{type:`text`,"data-rule-model":`1`,className:`settings-dir-input`,value:r,"aria-invalid":l,placeholder:`如 anthropic/.* 或 gpt-4o|claude`,onChange:e=>i(e.target.value)})]})]}),(c||l)&&(0,V.jsx)(`div`,{className:`settings-dir-error`,role:`alert`,children:`⚠️ 正则表达式语法不合法,请检查后修正。`}),(0,V.jsxs)(`div`,{className:`settings-rule-form-buttons`,children:[(0,V.jsx)(`button`,{type:`button`,"data-rule-save":`1`,className:`settings-dir-add-btn`,disabled:!t.trim()||!r.trim()||c||l,onClick:()=>{let s={id:a??B_(),workspacePattern:t.trim(),modelPattern:r.trim()};e.onSetModelRules?.([...u.filter(e=>e.id!==s.id),s]),n(``),i(``),o(void 0)},children:a?`保存修改`:`添加规则`}),a&&(0,V.jsx)(`button`,{type:`button`,className:`settings-rule-cancel-btn`,onClick:()=>{o(void 0),n(``),i(``)},children:`取消编辑`})]})]})]}),(0,V.jsx)(`div`,{className:`picker-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,onClick:e.onClose,children:`完成`})})]})}function xv({catalog:e,customProviders:t,onEditModel:n}){let[r,i]=(0,B.useState)(!1),a=e?.models??[];if(a.length===0)return null;let o={};for(let e of a){let t=e.provider||`other`;o[t]||(o[t]=[]),o[t].push(e)}let s=Object.keys(o).sort(),c=new Set((t??[]).filter(e=>e.builtin).map(e=>e.id));return(0,V.jsxs)(`div`,{className:`settings-system-models`,"data-system-models":`1`,children:[(0,V.jsxs)(`button`,{type:`button`,className:`settings-system-models-toggle`,onClick:()=>i(!r),"aria-expanded":!r,children:[(0,V.jsx)(`span`,{className:`settings-system-models-icon`,children:r?`▸`:`▾`}),(0,V.jsxs)(`span`,{className:`settings-system-models-title`,children:[`已发现的可用模型清单(共 `,a.length,` 个模型 · `,s.length,` 个供应商)`]})]}),!r&&(0,V.jsxs)(`div`,{className:`settings-system-models-content`,children:[(0,V.jsx)(`p`,{className:`settings-agents-desc settings-system-models-note`,children:`Pi 现在实际提供这些模型。改动和删除请在下方「Pi 的供应商与模型」里做——那里编辑的就是 Pi 自己的配置,这里只是它被 Pi 读出来的结果。`}),s.map(e=>{let t=o[e],r=c.has(e);return(0,V.jsxs)(`div`,{className:`settings-system-group`,children:[(0,V.jsxs)(`div`,{className:`settings-system-group-head`,children:[(0,V.jsx)(`span`,{className:`settings-system-group-name`,children:e}),(0,V.jsxs)(`span`,{className:`settings-system-group-count`,children:[`(`,t.length,` 个模型)`]}),(0,V.jsx)(`span`,{className:`settings-system-badge ${r?`system`:`custom`}`,children:r?`Pi 提供`:`models.json 定义`})]}),(0,V.jsx)(`div`,{className:`settings-system-model-list`,children:t.map(t=>(0,V.jsxs)(`div`,{className:`settings-system-model-row`,children:[(0,V.jsxs)(`div`,{className:`settings-system-model-info`,children:[(0,V.jsx)(`span`,{className:`settings-system-model-name`,children:t.label||t.modelId}),(0,V.jsx)(`code`,{className:`settings-system-model-id`,children:t.modelId})]}),(0,V.jsx)(`div`,{className:`settings-system-model-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`settings-provider-link`,"data-system-model-edit":`${e}:${t.modelId}`,onClick:()=>n?.(e,t.modelId,t.label),children:`编辑配置`})})]},t.modelId))})]},e)})]})]})}var Sv=e=>{try{let t=e.trim();if(!t)return`custom-provider`;let n=new URL(t.startsWith(`http`)?t:`https://${t}`),r=n.hostname.toLowerCase();if(r.includes(`openai`))return`openai`;if(r.includes(`anthropic`))return`anthropic`;if(r.includes(`deepseek`))return`deepseek`;if(r.includes(`google`)||r.includes(`gemini`))return`google`;if(r.includes(`groq`))return`groq`;if(r.includes(`mistral`))return`mistral`;if(r.includes(`moonshot`)||r.includes(`kimi`))return`moonshot`;if(r.includes(`ollama`)||n.port===`11434`)return`ollama`;let i=r.split(`.`).filter(e=>e!==`api`&&e!==`v1`&&e!==`com`&&e!==`org`&&e!==`net`&&e!==`cn`&&e!==`ai`&&e!==`io`);return i.length>0&&i[0]&&i[0].replace(/[^a-z0-9_-]/g,``)||`custom-provider`}catch{return`custom-provider`}};function Cv({context:e,externalEditModel:t,offered:n}){let r=e.providers??[],i=e.providerApis??[],[a,o]=(0,B.useState)({kind:`add`}),[s,c]=(0,B.useState)(``),[l,u]=(0,B.useState)(``),[d,f]=(0,B.useState)(``),[p,m]=(0,B.useState)(``),[h,g]=(0,B.useState)(``),[_,v]=(0,B.useState)(!1),[y,b]=(0,B.useState)(``),[x,S]=(0,B.useState)(``),[C,w]=(0,B.useState)(!1),[T,E]=(0,B.useState)(!1),[D,O]=(0,B.useState)(``),[k,A]=(0,B.useState)(``),[j,M]=(0,B.useState)(!0),[N,P]=(0,B.useState)(!0),[ee,te]=(0,B.useState)(!1),[ne,F]=(0,B.useState)(),[re,ie]=(0,B.useState)([]),[ae,oe]=(0,B.useState)(``),[se,ce]=(0,B.useState)(new Set),[le,ue]=(0,B.useState)();(0,B.useEffect)(()=>{if(!t)return;let{provider:e,modelId:n,label:a}=t;fe.current=!0;let s=r.find(t=>t.id===e);if(s){he(s);let t=s.models.find(e=>e.id===n);t?(ge(t),o({kind:`editModel`,providerId:e,modelId:n})):(ge(void 0),b(n),S(a&&a!==n?a:``),o({kind:`addModel`,providerId:e}))}else c(e),u(e),f(``),m(i[0]??`openai-completions`),g(``),v(!1),b(n),S(a&&a!==n?a:``),w(!1),E(!1),O(``),A(``),o({kind:`add`});document.querySelector(`.settings-provider-form`)?.scrollIntoView({behavior:`smooth`})},[t]);let de=a.kind===`add`?void 0:r.find(e=>e.id===a.providerId),fe=(0,B.useRef)(!1),pe=()=>{fe.current=!0},me=(0,B.useRef)(!1);(0,B.useEffect)(()=>{me.current&&(me.current=!1,!fe.current&&I())},[r]);let I=()=>{o({kind:`add`}),fe.current=!1,c(``),u(``),f(``),m(i[0]??`openai-completions`),g(``),v(!1),b(``),S(``),w(!1),E(!1),O(``),A(``),M(!0),P(!0),te(!1),F(void 0),ie([]),oe(``),ce(new Set),ue(void 0)},he=e=>{c(e.id),u(e.name===e.id?``:e.name),f(e.baseUrl),m(e.api),g(``),v(!1)},ge=e=>{b(e?.id??``),S(!e||e.name===e.id?``:e.name),w(e?.reasoning??!1),E(e?.imageInput??!1),O(e?String(e.contextWindow):``),A(e?String(e.maxTokens):``),M(!0),P(!0)},_e=e=>{let t=r.find(t=>t.id===e);t&&(pe(),o({kind:`addModel`,providerId:e}),he(t),ge(void 0))},ve=(e,t)=>{let n=r.find(t=>t.id===e),i=n?.models.find(e=>e.id===t);n&&i&&(pe(),o({kind:`editModel`,providerId:e,modelId:t}),he(n),ge(i))},ye=async()=>{if(!d.trim())F(`请先填写 API 地址`);else{if(!s.trim()){let e=Sv(d);c(e),l.trim()||u(e)}te(!0),F(void 0);try{let e=s.trim()||Sv(d),t=await fetch(`/api/providers/fetch-models`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({baseUrl:d.trim(),apiKey:h.trim(),api:p,providerId:e})}),n=await t.json();if(!t.ok||!n.ok)throw Error(n.error||`获取模型失败`);let r=n.models||[];ie(r),ce(new Set(r.map(e=>e.id))),r.length===1&&ge(r[0])}catch(e){F(e instanceof Error?e.message:String(e))}finally{te(!1)}}},be=()=>{if(se.size===0||!d.trim())return;let t=s.trim()||Sv(d);s.trim()||c(t);let n=re.filter(e=>se.has(e.id));n.length&&(me.current=!0,fe.current=!1,e.onSetProvider?.({id:t,...l.trim()?{name:l.trim()}:{name:t},baseUrl:d.trim(),api:p.trim()||`openai-completions`,...h.trim()?{apiKey:h.trim()}:{},models:n.map(e=>({id:e.id,name:e.name||e.id,reasoning:e.reasoning,imageInput:e.imageInput,contextWindow:e.contextWindow,maxTokens:e.maxTokens,supportsDeveloperRole:!0,supportsReasoningEffort:!0}))}),ie([]))},xe=s.trim()||(d.trim()?Sv(d):``),Se=d.trim()&&y.trim()&&!e.pendingSettings,Ce=r.filter(e=>!e.disabled),we=r.filter(e=>e.disabled);return(0,V.jsxs)(`section`,{className:`settings-section`,"data-settings-providers":`1`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`Pi 的供应商与模型`}),(0,V.jsxs)(`p`,{className:`settings-agents-desc`,children:[(0,V.jsx)(`strong`,{children:`这里就是 Pi 的模型配置本身,不是另一份。`}),(0,V.jsx)(`code`,{children:`models.json`}),` 里的定义、`,(0,V.jsx)(`code`,{children:`auth.json`}),` 里的凭据都在这里直接读写: 不论是你手写的条目还是这里添加的,都能改、能删。Pi 内置的供应商(例如订阅制的 coding plan) 没有 `,(0,V.jsx)(`code`,{children:`models.json`}),` 定义,只有凭据,所以它们能停用不能改地址。 停用会把配置从 Pi 的文件里拿掉并在这里记下,续订后可以原样启用。`]}),Ce.length>0?(0,V.jsx)(`div`,{className:`settings-provider-list`,children:Ce.map(t=>(0,V.jsxs)(`div`,{className:`settings-provider-card`,"data-provider-row":t.id,children:[(0,V.jsxs)(`div`,{className:`settings-provider-head`,children:[(0,V.jsx)(`span`,{className:`settings-provider-id`,children:t.id}),t.name!==t.id&&(0,V.jsx)(`span`,{className:`settings-provider-name`,children:t.name}),t.hasKey&&(0,V.jsx)(`span`,{className:`settings-provider-badge`,children:`已设置 key`}),t.keyInModelsJson&&(0,V.jsx)(`span`,{className:`settings-provider-badge`,children:`key 在 models.json`}),t.builtin&&(0,V.jsx)(`span`,{className:`settings-provider-badge settings-provider-badge-builtin`,children:`Pi 内置`})]}),t.builtin?(0,V.jsx)(`div`,{className:`settings-provider-meta`,children:`模型由 Pi 提供,这里只能停用`}):(0,V.jsxs)(`div`,{className:`settings-provider-meta`,children:[t.baseUrl,` · `,t.api]}),t.invalidFields&&t.invalidFields.length>0&&(0,V.jsxs)(`div`,{className:`settings-provider-note settings-provider-note-warn`,children:[`这个条目的 `,t.invalidFields.join(`、`),` 是空字符串,Pi 的 schema 不接受, 于是它拒绝整个 models.json —— 文件里所有自定义供应商都不会出现在选择器里。`]}),!t.hasKey&&!t.keyInModelsJson&&(0,V.jsx)(`div`,{className:`settings-provider-note settings-provider-note-warn`,children:`没有可用凭据,Pi 不会提供这个供应商的模型 —— 它不会出现在任何模型选择器里。编辑里填一个 key 就能恢复。`}),t.keyInModelsJson&&!t.hasKey&&(0,V.jsx)(`div`,{className:`settings-provider-note`,children:`key 写在 models.json 里(Pi 按其中的写法解析,例如 $VAR)。解析不到时 Pi 不会提供它。`}),n&&(n.has(t.id)?(0,V.jsx)(`div`,{className:`settings-provider-note`,children:`Pi 正在提供它的模型。`}):!t.hasKey&&!t.keyInModelsJson?null:(0,V.jsx)(`div`,{className:`settings-provider-note settings-provider-note-warn`,children:`Pi 现在没有提供它的模型(凭据可能已失效,或环境变量没解析到)。`})),(0,V.jsxs)(`div`,{className:`settings-provider-models`,children:[t.models.map(n=>(0,V.jsxs)(`div`,{className:`settings-provider-model-row`,"data-model-row":`${t.id}:${n.id}`,children:[(0,V.jsx)(`span`,{className:`settings-provider-model`,children:n.name}),(0,V.jsx)(`code`,{className:`settings-provider-model-id`,children:n.id}),!t.builtin&&(0,V.jsxs)(`div`,{className:`settings-provider-model-actions`,children:[(0,V.jsx)(`button`,{type:`button`,className:`settings-provider-link`,"data-model-edit":`${t.id}:${n.id}`,onClick:()=>ve(t.id,n.id),children:`编辑`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-provider-link danger`,"data-model-delete":`${t.id}:${n.id}`,onClick:()=>e.onRemoveProviderModel?.(t.id,n.id),children:`删除`})]})]},n.id)),t.builtin&&t.models.length===0&&(0,V.jsx)(`div`,{className:`settings-provider-empty-note`,children:`暂未读取到模型清单`})]}),(0,V.jsxs)(`div`,{className:`settings-provider-actions`,children:[!t.builtin&&(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-add-btn`,"data-provider-add-model":t.id,onClick:()=>_e(t.id),children:`添加模型`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-cancel-btn`,"data-provider-disable":t.id,onClick:()=>e.onToggleProvider?.(t.id,!1),children:`停用`}),le===t.id?(0,V.jsxs)(`div`,{className:`settings-provider-delete-confirm`,children:[(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-cancel-btn danger-confirm`,onClick:()=>{ue(void 0),e.onRemoveProvider?.(t.id)},children:`确定删除?`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-cancel-btn`,onClick:()=>ue(void 0),children:`取消`})]}):(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-cancel-btn`,"data-provider-delete":t.id,onClick:()=>ue(t.id),children:`删除供应商`})]})]},t.id))}):(0,V.jsx)(`div`,{className:`settings-empty-hint settings-provider-empty-note`,children:`暂无已启用的供应商。可在下方添加,或直接选用上方系统已有的内置模型。`}),we.length>0&&(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`已停用的供应商`}),(0,V.jsxs)(`p`,{className:`settings-agents-desc`,children:[`这些供应商已经从 Pi 的配置里拿掉,所以不会出现在任何模型选择器里。启用会把`,(0,V.jsx)(`code`,{children:`models.json`}),` 定义和凭据原样放回去。`]}),(0,V.jsx)(`div`,{className:`settings-provider-list`,children:we.map(t=>(0,V.jsxs)(`div`,{className:`settings-provider-card settings-provider-card-off`,"data-provider-off-row":t.id,children:[(0,V.jsxs)(`div`,{className:`settings-provider-head`,children:[(0,V.jsx)(`span`,{className:`settings-provider-id`,children:t.id}),t.name!==t.id&&(0,V.jsx)(`span`,{className:`settings-provider-name`,children:t.name}),(0,V.jsx)(`span`,{className:`settings-provider-badge settings-provider-badge-off`,children:`已停用`}),t.builtin&&(0,V.jsx)(`span`,{className:`settings-provider-badge settings-provider-badge-builtin`,children:`Pi 内置`})]}),(0,V.jsx)(`div`,{className:`settings-provider-meta`,children:t.models.length?`原模型:${t.models.map(e=>e.name).join(`、`)}`:t.hasKey?`已保留凭据`:`无模型记录`}),(0,V.jsxs)(`div`,{className:`settings-provider-actions`,children:[(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-add-btn`,"data-provider-enable":t.id,onClick:()=>e.onToggleProvider?.(t.id,!0),children:`启用`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-cancel-btn`,"data-provider-forget":t.id,onClick:()=>e.onRemoveProvider?.(t.id),children:`彻底删除`})]})]},t.id))})]}),(0,V.jsxs)(`h4`,{className:`settings-section-title`,children:[a.kind===`add`&&`添加供应商与模型`,a.kind===`addModel`&&`为供应商「${a.providerId}」添加模型`,a.kind===`editModel`&&`编辑模型「${a.modelId}」`]}),a.kind!==`add`&&(0,V.jsxs)(`p`,{className:`settings-agents-desc`,"data-provider-shared-note":`1`,children:[`上面这些是这个供应商下`,(0,V.jsx)(`b`,{children:`所有模型共用`}),`的(地址、API 类型、key)。改动会同时影响它下面的每个模型。`]}),(0,V.jsxs)(`div`,{className:`settings-provider-form`,onChange:pe,children:[(0,V.jsxs)(`div`,{className:`settings-rule-form-grid`,children:[(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`供应商 id`}),(0,V.jsx)(`input`,{type:`text`,"data-provider-id":`1`,className:`settings-dir-input`,value:s,placeholder:`如 my-proxy`,readOnly:a.kind!==`add`,onChange:e=>c(e.target.value)})]}),(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`显示名称`}),(0,V.jsx)(`input`,{type:`text`,"data-provider-name":`1`,className:`settings-dir-input`,value:l,placeholder:`如 公司中转`,onChange:e=>u(e.target.value)})]})]}),(0,V.jsxs)(`div`,{className:`settings-rule-form-grid`,children:[(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`API 地址`}),(0,V.jsx)(`input`,{type:`text`,"data-provider-base-url":`1`,className:`settings-dir-input`,value:d,placeholder:`如 https://api.example.com/v1`,onBlur:()=>{if(d.trim()&&!s.trim()){let e=Sv(d);c(e),l.trim()||u(e)}},onChange:e=>f(e.target.value)})]}),(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`API 类型`}),(0,V.jsx)(`select`,{"data-provider-api":`1`,className:`settings-model-select`,value:p,onChange:e=>m(e.target.value),children:(i.length?i:[`openai-completions`]).map(e=>(0,V.jsx)(`option`,{value:e,children:e},e))})]})]}),(0,V.jsxs)(`div`,{className:`settings-rule-form-grid`,children:[(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`API key`}),(0,V.jsx)(`input`,{type:`password`,"data-provider-api-key":`1`,className:`settings-dir-input`,value:h,autoComplete:`off`,placeholder:de?.hasKey?`已设置,留空表示不修改`:`如 sk-...`,onChange:e=>g(e.target.value)})]}),(0,V.jsxs)(`div`,{className:`settings-rule-input-group settings-fetch-models-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`智能探测`}),(0,V.jsx)(`div`,{className:`settings-fetch-models-row`,children:(0,V.jsx)(`button`,{type:`button`,className:`settings-fetch-models-btn`,"data-fetch-models-btn":`1`,disabled:!d.trim()||ee,onClick:ye,children:ee?`正在连接并获取模型列表…`:`🔍 自动获取可用模型`})})]})]}),ne&&(0,V.jsx)(`div`,{className:`settings-fetch-models-error`,children:ne}),re.length>0&&(0,V.jsxs)(`div`,{className:`settings-discovered-box`,"data-discovered-box":`1`,children:[(0,V.jsxs)(`div`,{className:`settings-discovered-head`,children:[(0,V.jsxs)(`span`,{className:`settings-discovered-title`,children:[`从远程接口探测到 `,re.length,` 个可用模型`]}),(0,V.jsxs)(`div`,{className:`settings-discovered-actions`,children:[(0,V.jsx)(`button`,{type:`button`,className:`settings-provider-link`,onClick:()=>ce(new Set(re.map(e=>e.id))),children:`全选`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-provider-link`,onClick:()=>ce(new Set),children:`清空`}),(0,V.jsx)(`button`,{type:`button`,className:`settings-provider-link danger`,onClick:()=>ie([]),children:`收起列表`})]})]}),(0,V.jsx)(`input`,{type:`text`,className:`settings-dir-input settings-discovered-search`,placeholder:`搜索模型名称或 ID…`,value:ae,onChange:e=>oe(e.target.value)}),(0,V.jsx)(`div`,{className:`settings-discovered-list`,children:re.filter(e=>!ae||e.id.toLowerCase().includes(ae.toLowerCase())).map(e=>{let t=se.has(e.id);return(0,V.jsxs)(`div`,{className:`settings-discovered-item`,children:[(0,V.jsxs)(`label`,{className:`settings-discovered-label`,children:[(0,V.jsx)(`input`,{type:`checkbox`,checked:t,onChange:t=>{let n=new Set(se);t.target.checked?n.add(e.id):n.delete(e.id),ce(n)}}),(0,V.jsx)(`span`,{className:`settings-discovered-name`,children:e.name}),e.reasoning&&(0,V.jsx)(`span`,{className:`settings-discovered-tag reasoning`,children:`推理`}),e.imageInput&&(0,V.jsx)(`span`,{className:`settings-discovered-tag vision`,children:`视觉`})]}),(0,V.jsx)(`button`,{type:`button`,className:`settings-provider-link`,title:`将此模型的参数填入下方单个编辑表单`,onClick:()=>ge(e),children:`填入下方`})]},e.id)})}),(0,V.jsx)(`div`,{className:`settings-discovered-footer`,children:(0,V.jsxs)(`button`,{type:`button`,className:`settings-dir-add-btn`,disabled:se.size===0||!d.trim()||ee,onClick:be,children:[`批量导入选中的 `,se.size,` 个模型并保存`]})})]}),(0,V.jsxs)(`div`,{className:`settings-rule-form-grid`,children:[(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`模型 id`}),(0,V.jsx)(`input`,{type:`text`,"data-model-id":`1`,className:`settings-dir-input`,value:y,placeholder:`如 gpt-4o 或点击上方自动探测填入`,onChange:e=>b(e.target.value)})]}),(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`模型显示名`}),(0,V.jsx)(`input`,{type:`text`,"data-model-name":`1`,className:`settings-dir-input`,value:x,placeholder:`留空则用模型 id`,onChange:e=>S(e.target.value)})]})]}),(0,V.jsx)(`div`,{className:`settings-rule-form-grid`,children:(0,V.jsxs)(`label`,{className:`settings-rule-input-group`,children:[(0,V.jsx)(`span`,{className:`settings-rule-label-text`,children:`上下文窗口 / 最大输出`}),(0,V.jsxs)(`div`,{className:`settings-provider-numbers`,children:[(0,V.jsx)(`input`,{type:`number`,"data-model-context-window":`1`,className:`settings-dir-input`,value:D,placeholder:`128000`,onChange:e=>O(e.target.value)}),(0,V.jsx)(`input`,{type:`number`,"data-model-max-tokens":`1`,className:`settings-dir-input`,value:k,placeholder:`16384`,onChange:e=>A(e.target.value)})]})]})}),(0,V.jsxs)(`div`,{className:`settings-provider-switches`,children:[(0,V.jsxs)(`label`,{className:`settings-checkbox-label`,children:[(0,V.jsx)(`input`,{type:`checkbox`,"data-model-reasoning":`1`,checked:C,onChange:e=>w(e.target.checked)}),`推理模型`]}),(0,V.jsxs)(`label`,{className:`settings-checkbox-label`,children:[(0,V.jsx)(`input`,{type:`checkbox`,"data-model-image-input":`1`,checked:T,onChange:e=>E(e.target.checked)}),`支持图片输入`]}),(0,V.jsxs)(`label`,{className:`settings-checkbox-label`,children:[(0,V.jsx)(`input`,{type:`checkbox`,"data-model-developer-role":`1`,checked:j,onChange:e=>M(e.target.checked)}),`支持 developer 角色`]}),(0,V.jsxs)(`label`,{className:`settings-checkbox-label`,children:[(0,V.jsx)(`input`,{type:`checkbox`,"data-model-reasoning-effort":`1`,checked:N,onChange:e=>P(e.target.checked)}),`支持 reasoning_effort`]}),de?.hasKey&&(0,V.jsxs)(`label`,{className:`settings-checkbox-label`,children:[(0,V.jsx)(`input`,{type:`checkbox`,"data-provider-clear-key":`1`,checked:_,onChange:e=>v(e.target.checked)}),`清除已保存的 key`]})]}),(0,V.jsxs)(`div`,{className:`settings-rule-form-buttons`,children:[(0,V.jsx)(`button`,{type:`button`,"data-provider-save":`1`,className:`settings-dir-add-btn`,disabled:!Se,onClick:()=>{me.current=!0,fe.current=!1;let t=s.trim()||xe;e.onSetProvider?.({id:t,...l.trim()?{name:l.trim()}:{name:t},baseUrl:d.trim(),api:p.trim()||`openai-completions`,...h.trim()?{apiKey:h.trim()}:{},..._?{clearKey:!0}:{},models:[{id:y.trim(),...x.trim()?{name:x.trim()}:{},...C?{reasoning:!0}:{},...T?{imageInput:!0}:{},...D.trim()?{contextWindow:Number(D)}:{},...k.trim()?{maxTokens:Number(k)}:{},...j?{}:{supportsDeveloperRole:!1},...N?{}:{supportsReasoningEffort:!1}}]})},children:a.kind===`add`?`添加单个模型`:a.kind===`addModel`?`添加模型`:`保存修改`}),a.kind!==`add`&&(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-cancel-btn`,"data-provider-cancel":`1`,onClick:I,children:`取消`})]})]})]})}function wv({context:e}){let t=e.modelCatalog,n=e.defaultModel,r=t?.models??[],i=r.reduce((e,t)=>e.includes(t.provider)?e:[...e,t.provider],[]),a=n?`${n.provider}/${n.modelId}`:``,[o,s]=(0,B.useState)(n?.provider??``),[c,l]=(0,B.useState)(n?.modelId??``),u=(0,B.useRef)(void 0);(0,B.useEffect)(()=>{u.current!==a&&(u.current=a,s(n?.provider??``),l(n?.modelId??``))},[a,n]);let d=n&&!i.includes(n.provider)?[...i,n.provider]:i,f=d.includes(o)?o:d[0]??``,p=r.filter(e=>e.provider===f),m=n&&n.provider===f&&!p.some(e=>e.modelId===n.modelId)?[...p,{provider:n.provider,modelId:n.modelId,label:n.label}]:p,h=m.some(e=>e.modelId===c)?c:m[0]?.modelId??``,g=!n||r.some(e=>e.provider===n.provider&&e.modelId===n.modelId),_=f&&h?`${f}/${h}`:``,v=_!==a,y=!t,b=t?.source===`unavailable`,[x,S]=(0,B.useState)(),C=e=>{s(e);let t=r.filter(t=>t.provider===e);l(e=>t.some(t=>t.modelId===e)?e:t[0]?.modelId??``)};return(0,V.jsxs)(`section`,{"data-settings-model":`1`,className:`settings-panel-container`,children:[(0,V.jsx)(`div`,{className:`settings-agents-header`,children:(0,V.jsxs)(`p`,{className:`settings-agents-desc`,children:[(0,V.jsx)(`strong`,{children:`设置新建会话的默认模型。`}),`这里的选择对所有工作区生效,但优先级低于工作区自己的默认模型;两者都没有时,跟随 Pi 的默认模型。 默认值只在会话创建时复制一次,之后改这里不会改动已经存在的会话。`]})}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`当前默认模型`}),(0,V.jsx)(`div`,{className:`settings-model-current`,"data-model-current":`1`,children:n?(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`span`,{className:`settings-model-current-name`,children:n.label}),(0,V.jsxs)(`code`,{className:`settings-model-current-pair`,children:[n.provider,`/`,n.modelId]})]}):(0,V.jsx)(`span`,{className:`settings-model-current-none`,children:`跟随 Pi 默认模型`})}),n&&!g&&(0,V.jsx)(`div`,{className:`settings-dir-error`,role:`alert`,children:`⚠️ Pi 当前不再提供这个模型,新会话会改用 Pi 的默认模型。`})]}),(0,V.jsxs)(`section`,{className:`settings-section`,children:[(0,V.jsx)(`h4`,{className:`settings-section-title`,children:`修改默认模型`}),y?(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`正在读取 Pi 的模型列表…`}):b?(0,V.jsx)(`div`,{className:`settings-empty-hint`,children:`无法读取 Pi 的模型列表,暂时不能设置默认模型。`}):(0,V.jsxs)(V.Fragment,{children:[(0,V.jsxs)(`div`,{className:`settings-model-grid`,children:[(0,V.jsxs)(`label`,{className:`settings-model-group`,children:[(0,V.jsx)(`span`,{className:`settings-model-label`,children:`供应商`}),(0,V.jsx)(`select`,{"data-model-provider":`1`,className:`settings-model-select`,value:f,disabled:e.pendingSettings||d.length===0,onChange:e=>C(e.target.value),children:d.map(e=>(0,V.jsx)(`option`,{value:e,children:e},e))})]}),(0,V.jsxs)(`label`,{className:`settings-model-group`,children:[(0,V.jsx)(`span`,{className:`settings-model-label`,children:`模型`}),(0,V.jsx)(`select`,{"data-model-select":`1`,className:`settings-model-select`,value:h,disabled:e.pendingSettings||m.length===0,onChange:e=>l(e.target.value),children:m.map(e=>(0,V.jsx)(`option`,{value:e.modelId,children:e.label},e.modelId))})]})]}),(0,V.jsxs)(`div`,{className:`settings-rule-form-buttons`,children:[(0,V.jsx)(`button`,{type:`button`,"data-model-save":`1`,className:`settings-dir-add-btn`,disabled:!v||e.pendingSettings||!_,onClick:()=>{let t=r.find(e=>e.provider===f&&e.modelId===h);t&&e.onSetDefaultModel?.({provider:t.provider,modelId:t.modelId,label:t.label})},children:`保存默认模型`}),(0,V.jsx)(`button`,{type:`button`,"data-model-clear":`1`,className:`settings-dir-cancel-btn`,disabled:!n||e.pendingSettings,onClick:()=>e.onSetDefaultModel?.(null),children:`清除默认模型`})]})]})]}),e.modelCatalog?.configError&&(0,V.jsxs)(`div`,{className:`settings-provider-note settings-provider-note-warn settings-provider-config-error`,"data-provider-config-error":`1`,children:[(0,V.jsx)(`div`,{children:`Pi 拒绝了自己的模型配置,因此它不提供文件里的任何自定义供应商:`}),(0,V.jsx)(`pre`,{className:`settings-provider-config-error-text`,children:e.modelCatalog.configError}),(0,V.jsx)(`button`,{type:`button`,className:`settings-dir-cancel-btn`,"data-provider-repair":`1`,onClick:()=>e.onRepairProviders?.(),children:`修好这个文件`})]}),(0,V.jsx)(xv,{catalog:e.modelCatalog,customProviders:e.providers,onEditModel:(e,t,n)=>S({provider:e,modelId:t,label:n})}),(0,V.jsx)(Cv,{context:e,externalEditModel:x,offered:new Set((e.modelCatalog?.models??[]).map(e=>e.provider))}),(0,V.jsx)(`div`,{className:`picker-actions`,children:(0,V.jsx)(`button`,{type:`button`,className:`picker-cancel`,onClick:e.onClose,children:`完成`})})]})}var Tv=[{id:`appearance`,label:`外观`,render:hv},{id:`general`,label:`通用`,render:gv},{id:`memory`,label:`主动记忆`,render:e=>(0,V.jsx)(O_,{workspaceId:e.workspaceId,onClose:e.onClose})},{id:`knowledge`,label:`知识库`,render:e=>(0,V.jsx)(A_,{workspaceId:e.workspaceId,onClose:e.onClose})},{id:`agents`,label:`智能体`,render:vv},{id:`model`,label:`模型`,render:e=>(0,V.jsx)(wv,{context:e})},{id:`model-rules`,label:`模型过滤`,render:e=>(0,V.jsx)(bv,{context:e})},{id:`terminal`,label:`终端`,render:e=>(0,V.jsx)(yv,{context:e})}],Ev=Tv[0]?.id;function Dv({workspaceId:e,theme:t,onChooseTheme:n,onClose:r,agentCatalog:i,subagentCatalog:a,modelFilterRules:o,onSetModelRules:s,defaultModel:c,modelCatalog:l,onSetDefaultModel:u,providers:d,providerApis:f,onSetProvider:p,onRemoveProvider:m,onToggleProvider:h,onRepairProviders:g,onRemoveProviderModel:_,customAgentDirs:v,pendingSettings:y,onSetCustomAgentDirs:b,onRescanAgents:x,userNickname:S,onSetUserNickname:C,terminalShell:w,onSetTerminalShell:T}){let[E,D]=(0,B.useState)(Ev);(0,B.useEffect)(()=>{let e=e=>{e.key===`Escape`&&!e.defaultPrevented&&r()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[r]);let O=Tv.find(e=>e.id===E)??Tv[0];return(0,V.jsx)(`div`,{className:`overlay`,onClick:r,children:(0,V.jsxs)(`div`,{className:`picker settings-window`,"data-theme-dialog":`1`,"data-settings-window":`1`,onClick:e=>e.stopPropagation(),children:[(0,V.jsx)(`div`,{className:`settings-window-head`,children:(0,V.jsx)(`h2`,{children:`设置`})}),(0,V.jsxs)(`div`,{className:`settings-window-body`,children:[(0,V.jsxs)(`nav`,{className:`settings-nav`,role:`tablist`,"aria-orientation":`vertical`,"aria-label":`设置分类`,"data-settings-nav":`1`,children:[(0,V.jsx)(`div`,{className:`settings-nav-label`,children:`分类`}),Tv.map(e=>(0,V.jsx)(`button`,{type:`button`,id:`settings-tab-${e.id}`,className:`settings-category`,role:`tab`,"aria-selected":e.id===O?.id,"aria-controls":`settings-panel`,tabIndex:e.id===O?.id?0:-1,"data-settings-category":e.id,onClick:()=>D(e.id),children:e.label},e.id))]}),O&&(0,V.jsxs)(`div`,{className:`settings-panel`,id:`settings-panel`,role:`tabpanel`,"aria-labelledby":`settings-tab-${O.id}`,"data-settings-panel":O.id,children:[(0,V.jsx)(`h3`,{className:`settings-panel-title`,"data-settings-panel-title":O.id,children:O.label}),O.render({workspaceId:e,theme:t,onChooseTheme:n,onClose:r,agentCatalog:i,subagentCatalog:a,modelFilterRules:o,onSetModelRules:s,defaultModel:c,modelCatalog:l,onSetDefaultModel:u,providers:d,providerApis:f,onSetProvider:p,onRemoveProvider:m,onToggleProvider:h,onRepairProviders:g,onRemoveProviderModel:_,customAgentDirs:v,pendingSettings:y,onSetCustomAgentDirs:b,onRescanAgents:x,userNickname:S,onSetUserNickname:C,terminalShell:w,onSetTerminalShell:T})]})]})]})})}var Ov=Object.defineProperty,kv=Object.getOwnPropertyDescriptor,Av=(e,t)=>{for(var n in t)Ov(e,n,{get:t[n],enumerable:!0})},jv=(e,t,n,r)=>{for(var i=r>1?void 0:r?kv(t,n):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(i=(r?o(t,n,i):o(i))||i);return r&&i&&Ov(t,n,i),i},X=(e,t)=>(n,r)=>t(n,r,e),Mv=`Terminal input`,Nv={get:()=>Mv,set:e=>Mv=e},Pv=`Too much output to announce, navigate to rows manually to read`,Fv={get:()=>Pv,set:e=>Pv=e};function Iv(e){return e.replace(/\r?\n/g,`\r`)}function Lv(e,t){return t?`\x1B[200~`+e+`\x1B[201~`:e}function Rv(e,t){e.clipboardData&&e.clipboardData.setData(`text/plain`,t.selectionText),e.preventDefault()}function zv(e,t,n,r){e.stopPropagation(),e.clipboardData&&Bv(e.clipboardData.getData(`text/plain`),t,n,r)}function Bv(e,t,n,r){e=Iv(e),e=Lv(e,n.decPrivateModes.bracketedPasteMode&&r.rawOptions.ignoreBracketedPasteMode!==!0),n.triggerDataEvent(e,!0),t.value=``}function Vv(e,t,n){let r=n.getBoundingClientRect(),i=e.clientX-r.left-10,a=e.clientY-r.top-10;t.style.width=`20px`,t.style.height=`20px`,t.style.left=`${i}px`,t.style.top=`${a}px`,t.style.zIndex=`1000`,t.focus()}function Hv(e,t,n,r,i){Vv(e,t,n),i&&r.rightClickSelect(e),t.value=r.selectionText,t.select()}function Uv(e){return e>65535?(e-=65536,String.fromCharCode((e>>10)+55296)+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)}function Wv(e,t=0,n=e.length){let r=``;for(let i=t;i<n;++i){let t=e[i];t>65535?(t-=65536,r+=String.fromCharCode((t>>10)+55296)+String.fromCharCode(t%1024+56320)):r+=String.fromCharCode(t)}return r}var Gv=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){let n=e.length;if(!n)return 0;let r=0,i=0;if(this._interim){let n=e.charCodeAt(i++);56320<=n&&n<=57343?t[r++]=(this._interim-55296)*1024+n-56320+65536:(t[r++]=this._interim,t[r++]=n),this._interim=0}for(let a=i;a<n;++a){let i=e.charCodeAt(a);if(55296<=i&&i<=56319){if(++a>=n)return this._interim=i,r;let o=e.charCodeAt(a);56320<=o&&o<=57343?t[r++]=(i-55296)*1024+o-56320+65536:(t[r++]=i,t[r++]=o)}else i!==65279&&(t[r++]=i)}return r}},Kv=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){let n=e.length;if(!n)return 0;let r=0,i,a,o,s,c=0,l=0;if(this.interim[0]){let i=!1,a=this.interim[0];a&=(a&224)==192?31:(a&240)==224?15:7;let o=0,s;for(;(s=this.interim[++o]&63)&&o<4;)a<<=6,a|=s;let c=(this.interim[0]&224)==192?2:(this.interim[0]&240)==224?3:4,u=c-o;for(;l<u;){if(l>=n)return 0;if(s=e[l++],(s&192)!=128){l--,i=!0;break}this.interim[o++]=s,a<<=6,a|=s&63}i||(c===2?a<128?l--:t[r++]=a:c===3?a<2048||a>=55296&&a<=57343||a===65279||(t[r++]=a):a<65536||a>1114111||(t[r++]=a)),this.interim.fill(0)}let u=n-4,d=l;for(;d<n;){for(;d<u&&!((i=e[d])&128)&&!((a=e[d+1])&128)&&!((o=e[d+2])&128)&&!((s=e[d+3])&128);)t[r++]=i,t[r++]=a,t[r++]=o,t[r++]=s,d+=4;if(i=e[d++],i<128)t[r++]=i;else if((i&224)==192){if(d>=n)return this.interim[0]=i,r;if(a=e[d++],(a&192)!=128||(c=(i&31)<<6|a&63,c<128)){d--;continue}t[r++]=c}else if((i&240)==224){if(d>=n)return this.interim[0]=i,r;if(a=e[d++],(a&192)!=128){d--;continue}if(d>=n)return this.interim[0]=i,this.interim[1]=a,r;if(o=e[d++],(o&192)!=128){d--;continue}if(c=(i&15)<<12|(a&63)<<6|o&63,c<2048||c>=55296&&c<=57343||c===65279)continue;t[r++]=c}else if((i&248)==240){if(d>=n)return this.interim[0]=i,r;if(a=e[d++],(a&192)!=128){d--;continue}if(d>=n)return this.interim[0]=i,this.interim[1]=a,r;if(o=e[d++],(o&192)!=128){d--;continue}if(d>=n)return this.interim[0]=i,this.interim[1]=a,this.interim[2]=o,r;if(s=e[d++],(s&192)!=128){d--;continue}if(c=(i&7)<<18|(a&63)<<12|(o&63)<<6|s&63,c<65536||c>1114111)continue;t[r++]=c}}return r}},qv=``,Jv=` `,Yv=class e{constructor(){this.fg=0,this.bg=0,this.extended=new Xv}static toColorRGB(e){return[e>>>16&255,e>>>8&255,e&255]}static fromColorRGB(e){return(e[0]&255)<<16|(e[1]&255)<<8|e[2]&255}clone(){let t=new e;return t.fg=this.fg,t.bg=this.bg,t.extended=this.extended.clone(),t}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)==50331648}isBgRGB(){return(this.bg&50331648)==50331648}isFgPalette(){return(this.fg&50331648)==16777216||(this.fg&50331648)==33554432}isBgPalette(){return(this.bg&50331648)==16777216||(this.bg&50331648)==33554432}isFgDefault(){return!(this.fg&50331648)}isBgDefault(){return!(this.bg&50331648)}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)==50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)==16777216||(this.extended.underlineColor&50331648)==33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?!(this.extended.underlineColor&50331648):this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},Xv=class e{constructor(e=0,t=0){this._ext=0,this._urlId=0,this._ext=e,this._urlId=t}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(e){this._ext&=-67108864,this._ext|=e&67108863}get urlId(){return this._urlId}set urlId(e){this._urlId=e}get underlineVariantOffset(){let e=(this._ext&3758096384)>>29;return e<0?e^4294967288:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}clone(){return new e(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0}},Zv=class e extends Yv{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new Xv,this.combinedData=``}static fromCharData(t){let n=new e;return n.setFromCharData(t),n}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?Uv(this.content&2097151):``}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(e){this.fg=e[0],this.bg=0;let t=!1;if(e[1].length>2)t=!0;else if(e[1].length===2){let n=e[1].charCodeAt(0);if(55296<=n&&n<=56319){let r=e[1].charCodeAt(1);56320<=r&&r<=57343?this.content=(n-55296)*1024+r-56320+65536|e[2]<<22:t=!0}else t=!0}else this.content=e[1].charCodeAt(0)|e[2]<<22;t&&(this.combinedData=e[1],this.content=2097152|e[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}},Qv=`di$target`,$v=`di$dependencies`,ey=new Map;function ty(e){return e[$v]||[]}function ny(e){if(ey.has(e))return ey.get(e);let t=function(e,n,r){if(arguments.length!==3)throw Error(`@IServiceName-decorator can only be used to decorate a parameter`);ry(t,e,r)};return t._id=e,ey.set(e,t),t}function ry(e,t,n){t[Qv]===t?t[$v].push({id:e,index:n}):(t[$v]=[{id:e,index:n}],t[Qv]=t)}var iy=ny(`BufferService`),ay=ny(`CoreMouseService`),oy=ny(`CoreService`),sy=ny(`CharsetService`),cy=ny(`InstantiationService`),ly=ny(`LogService`),uy=ny(`OptionsService`),dy=ny(`OscLinkService`),fy=ny(`UnicodeService`),py=ny(`DecorationService`),my=class{constructor(e,t,n){this._bufferService=e,this._optionsService=t,this._oscLinkService=n}provideLinks(e,t){let n=this._bufferService.buffer.lines.get(e-1);if(!n){t(void 0);return}let r=[],i=this._optionsService.rawOptions.linkHandler,a=new Zv,o=n.getTrimmedLength(),s=-1,c=-1,l=!1;for(let t=0;t<o;t++)if(c!==-1||n.hasContent(t)){if(n.loadCell(t,a),a.hasExtendedAttrs()&&a.extended.urlId){if(c===-1){c=t,s=a.extended.urlId;continue}l=a.extended.urlId!==s}else c!==-1&&(l=!0);if(l||c!==-1&&t===o-1){let n=this._oscLinkService.getLinkData(s)?.uri;if(n){let a={start:{x:c+1,y:e},end:{x:t+ +(!l&&t===o-1),y:e}},s=!1;if(!i?.allowNonHttpProtocols)try{let e=new URL(n);[`http:`,`https:`].includes(e.protocol)||(s=!0)}catch{s=!0}s||r.push({text:n,range:a,activate:(e,t)=>i?i.activate(e,t,a):hy(e,t),hover:(e,t)=>i?.hover?.(e,t,a),leave:(e,t)=>i?.leave?.(e,t,a)})}l=!1,a.hasExtendedAttrs()&&a.extended.urlId?(c=t,s=a.extended.urlId):(c=-1,s=-1)}}t(r)}};my=jv([X(0,iy),X(1,uy),X(2,dy)],my);function hy(e,t){if(confirm(`Do you want to navigate to ${t}?
|
|
76
76
|
|
|
77
77
|
WARNING: This link could potentially be dangerous`)){let e=window.open();if(e){try{e.opener=null}catch{}e.location.href=t}else console.warn(`Opening link blocked as opener could not be cleared`)}}var gy=ny(`CharSizeService`),_y=ny(`CoreBrowserService`),vy=ny(`MouseService`),yy=ny(`RenderService`),by=ny(`SelectionService`),xy=ny(`CharacterJoinerService`),Sy=ny(`ThemeService`),Cy=ny(`LinkProviderService`),wy=new class{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(e){setTimeout(()=>{throw e.stack?Ay.isErrorNoTelemetry(e)?new Ay(e.message+`
|
|
78
78
|
|