@paircode/ui-modals 0.1.0 → 0.1.1

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.
@@ -1,5 +1,5 @@
1
- var UiModals=(function(j,e,y,xe,A){"use strict";var xo=Object.defineProperty;var bo=(j,e,y)=>e in j?xo(j,e,{enumerable:!0,configurable:!0,writable:!0,value:y}):j[e]=y;var I=(j,e,y)=>bo(j,typeof e!="symbol"?e+"":e,y);var se;const O=(r,t)=>{const n=r.__vccOpts||r;for(const[o,l]of t)n[o]=l;return n},Fe=["width","height"],ze={key:0,d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"},P=O({__name:"SvgIcon",props:{name:{type:String,required:!0},size:{type:Number,default:16}},setup(r){return(t,n)=>(e.openBlock(),e.createElementBlock("svg",{class:"svg-icon",width:r.size,height:r.size,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[e.createCommentVNode(" Folder "),r.name==="folder"?(e.openBlock(),e.createElementBlock("path",ze)):r.name==="folder-open"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createCommentVNode(" Folder Open "),n[0]||(n[0]=e.createElementVNode("path",{d:"M6 17l-3-9h18l-3 9H6z"},null,-1)),n[1]||(n[1]=e.createElementVNode("path",{d:"M4 8V5a2 2 0 0 1 2-2h5l2 3h7a2 2 0 0 1 2 2v3"},null,-1))],64)):r.name==="file"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:2},[e.createCommentVNode(" File "),n[2]||(n[2]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[3]||(n[3]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1))],64)):r.name==="file-code"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:3},[e.createCommentVNode(" File Code "),n[4]||(n[4]=e.createStaticVNode('<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" data-v-faf69761></path><polyline points="14 2 14 8 20 8" data-v-faf69761></polyline><line x1="10" y1="12" x2="8" y2="14" data-v-faf69761></line><line x1="10" y1="16" x2="8" y2="18" data-v-faf69761></line><line x1="14" y1="12" x2="16" y2="14" data-v-faf69761></line><line x1="14" y1="16" x2="16" y2="18" data-v-faf69761></line>',6))],64)):r.name==="file-text"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:4},[e.createCommentVNode(" File Text / Document "),n[5]||(n[5]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[6]||(n[6]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[7]||(n[7]=e.createElementVNode("line",{x1:"9",y1:"13",x2:"15",y2:"13"},null,-1)),n[8]||(n[8]=e.createElementVNode("line",{x1:"9",y1:"17",x2:"15",y2:"17"},null,-1))],64)):r.name==="search"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:5},[e.createCommentVNode(" Search "),n[9]||(n[9]=e.createElementVNode("circle",{cx:"11",cy:"11",r:"8"},null,-1)),n[10]||(n[10]=e.createElementVNode("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"},null,-1))],64)):r.name==="terminal"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:6},[e.createCommentVNode(" Terminal / Console "),n[11]||(n[11]=e.createElementVNode("polyline",{points:"4 17 10 11 4 5"},null,-1)),n[12]||(n[12]=e.createElementVNode("line",{x1:"12",y1:"19",x2:"20",y2:"19"},null,-1))],64)):r.name==="chat"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:7},[e.createCommentVNode(" Chat / Message "),n[13]||(n[13]=e.createElementVNode("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"},null,-1))],64)):r.name==="settings"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:8},[e.createCommentVNode(" Gear / Settings "),n[14]||(n[14]=e.createElementVNode("circle",{cx:"12",cy:"12",r:"3"},null,-1)),n[15]||(n[15]=e.createElementVNode("path",{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"},null,-1))],64)):r.name==="home"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:9},[e.createCommentVNode(" Home "),n[16]||(n[16]=e.createElementVNode("path",{d:"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"},null,-1)),n[17]||(n[17]=e.createElementVNode("polyline",{points:"9 22 9 12 15 12 15 22"},null,-1))],64)):r.name==="chevron-right"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:10},[e.createCommentVNode(" Chevron Right "),n[18]||(n[18]=e.createElementVNode("polyline",{points:"9 6 15 12 9 18"},null,-1))],64)):r.name==="chevron-down"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:11},[e.createCommentVNode(" Chevron Down (Rotated chevron-right) "),n[19]||(n[19]=e.createElementVNode("polyline",{points:"6 9 12 15 18 9"},null,-1))],64)):r.name==="plus"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:12},[e.createCommentVNode(" Plus / Add "),n[20]||(n[20]=e.createElementVNode("line",{x1:"12",y1:"5",x2:"12",y2:"19"},null,-1)),n[21]||(n[21]=e.createElementVNode("line",{x1:"5",y1:"12",x2:"19",y2:"12"},null,-1))],64)):r.name==="close"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:13},[e.createCommentVNode(" Close / X "),n[22]||(n[22]=e.createElementVNode("line",{x1:"18",y1:"6",x2:"6",y2:"18"},null,-1)),n[23]||(n[23]=e.createElementVNode("line",{x1:"6",y1:"6",x2:"18",y2:"18"},null,-1))],64)):r.name==="refresh"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:14},[e.createCommentVNode(" Refresh "),n[24]||(n[24]=e.createElementVNode("polyline",{points:"23 4 23 10 17 10"},null,-1)),n[25]||(n[25]=e.createElementVNode("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"},null,-1))],64)):r.name==="drive"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:15},[e.createCommentVNode(" Hard Drive / Disk "),n[26]||(n[26]=e.createElementVNode("line",{x1:"22",y1:"12",x2:"2",y2:"12"},null,-1)),n[27]||(n[27]=e.createElementVNode("path",{d:"M5.45 5.11L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z"},null,-1)),n[28]||(n[28]=e.createElementVNode("line",{x1:"6",y1:"16",x2:"6.01",y2:"16"},null,-1)),n[29]||(n[29]=e.createElementVNode("line",{x1:"10",y1:"16",x2:"10.01",y2:"16"},null,-1))],64)):r.name==="source-control"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:16},[e.createCommentVNode(" Source Control / Git Branch "),n[30]||(n[30]=e.createElementVNode("line",{x1:"6",y1:"3",x2:"6",y2:"15"},null,-1)),n[31]||(n[31]=e.createElementVNode("circle",{cx:"18",cy:"6",r:"3"},null,-1)),n[32]||(n[32]=e.createElementVNode("circle",{cx:"6",cy:"18",r:"3"},null,-1)),n[33]||(n[33]=e.createElementVNode("path",{d:"M18 9a9 9 0 0 1-9 9"},null,-1))],64)):r.name==="git-branch"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:17},[e.createCommentVNode(" Git Branch "),n[34]||(n[34]=e.createElementVNode("line",{x1:"6",y1:"3",x2:"6",y2:"15"},null,-1)),n[35]||(n[35]=e.createElementVNode("circle",{cx:"18",cy:"6",r:"3"},null,-1)),n[36]||(n[36]=e.createElementVNode("circle",{cx:"6",cy:"18",r:"3"},null,-1)),n[37]||(n[37]=e.createElementVNode("path",{d:"M18 9a9 9 0 0 1-9 9"},null,-1))],64)):r.name==="git-pull"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:18},[e.createCommentVNode(" Git Pull "),n[38]||(n[38]=e.createStaticVNode('<circle cx="18" cy="18" r="3" data-v-faf69761></circle><circle cx="6" cy="6" r="3" data-v-faf69761></circle><path d="M13 6h3a2 2 0 0 1 2 2v7" data-v-faf69761></path><line x1="6" y1="18" x2="6" y2="9" data-v-faf69761></line><polyline points="9 9 6 6 3 9" data-v-faf69761></polyline>',5))],64)):r.name==="git-push"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:19},[e.createCommentVNode(" Git Push "),n[39]||(n[39]=e.createStaticVNode('<circle cx="18" cy="6" r="3" data-v-faf69761></circle><circle cx="6" cy="18" r="3" data-v-faf69761></circle><path d="M13 18h-2a2 2 0 0 1-2-2V9" data-v-faf69761></path><line x1="6" y1="6" x2="6" y2="15" data-v-faf69761></line><polyline points="9 15 6 18 3 15" data-v-faf69761></polyline>',5))],64)):r.name==="output"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:20},[e.createCommentVNode(" Output / Window "),n[40]||(n[40]=e.createElementVNode("rect",{x:"2",y:"3",width:"20",height:"14",rx:"2",ry:"2"},null,-1)),n[41]||(n[41]=e.createElementVNode("line",{x1:"8",y1:"21",x2:"16",y2:"21"},null,-1)),n[42]||(n[42]=e.createElementVNode("line",{x1:"12",y1:"17",x2:"12",y2:"21"},null,-1))],64)):r.name==="warning"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:21},[e.createCommentVNode(" Warning / Alert "),n[43]||(n[43]=e.createElementVNode("path",{d:"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"},null,-1)),n[44]||(n[44]=e.createElementVNode("line",{x1:"12",y1:"9",x2:"12",y2:"13"},null,-1)),n[45]||(n[45]=e.createElementVNode("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"},null,-1))],64)):r.name==="undo"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:22},[e.createCommentVNode(" Undo "),n[46]||(n[46]=e.createElementVNode("polyline",{points:"1 4 1 10 7 10"},null,-1)),n[47]||(n[47]=e.createElementVNode("path",{d:"M3.51 15a9 9 0 1 0 2.13-9.36L1 10"},null,-1))],64)):r.name==="redo"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:23},[e.createCommentVNode(" Redo "),n[48]||(n[48]=e.createElementVNode("polyline",{points:"23 4 23 10 17 10"},null,-1)),n[49]||(n[49]=e.createElementVNode("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"},null,-1))],64)):r.name==="package"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:24},[e.createCommentVNode(" Package / Box / Store "),n[50]||(n[50]=e.createElementVNode("line",{x1:"16.5",y1:"9.4",x2:"7.5",y2:"4.21"},null,-1)),n[51]||(n[51]=e.createElementVNode("path",{d:"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"},null,-1)),n[52]||(n[52]=e.createElementVNode("polyline",{points:"3.27 6.96 12 12.01 20.73 6.96"},null,-1)),n[53]||(n[53]=e.createElementVNode("line",{x1:"12",y1:"22.08",x2:"12",y2:"12"},null,-1))],64)):r.name==="globe"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:25},[e.createCommentVNode(" Globe / External "),n[54]||(n[54]=e.createElementVNode("circle",{cx:"12",cy:"12",r:"10"},null,-1)),n[55]||(n[55]=e.createElementVNode("line",{x1:"2",y1:"12",x2:"22",y2:"12"},null,-1)),n[56]||(n[56]=e.createElementVNode("path",{d:"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"},null,-1))],64)):r.name==="cycle"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:26},[e.createCommentVNode(" Refresh / Cycle (for agent) "),n[57]||(n[57]=e.createElementVNode("polyline",{points:"23 4 23 10 17 10"},null,-1)),n[58]||(n[58]=e.createElementVNode("polyline",{points:"1 20 1 14 7 14"},null,-1)),n[59]||(n[59]=e.createElementVNode("path",{d:"M3.51 9a9 9 0 0 1 14.85-3.36L23 10"},null,-1)),n[60]||(n[60]=e.createElementVNode("path",{d:"M20.49 15a9 9 0 0 1-14.85 3.36L1 14"},null,-1))],64)):r.name==="send"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:27},[e.createCommentVNode(" Send (arrow up) "),n[61]||(n[61]=e.createElementVNode("line",{x1:"12",y1:"19",x2:"12",y2:"5"},null,-1)),n[62]||(n[62]=e.createElementVNode("polyline",{points:"5 12 12 5 19 12"},null,-1))],64)):r.name==="send-plane"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:28},[e.createCommentVNode(" Send Plane (paper airplane) "),n[63]||(n[63]=e.createElementVNode("line",{x1:"22",y1:"2",x2:"11",y2:"13"},null,-1)),n[64]||(n[64]=e.createElementVNode("polygon",{points:"22 2 15 22 11 13 2 9 22 2"},null,-1))],64)):r.name==="stop-dot"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:29},[e.createCommentVNode(" Stop Dot (pulsing circle) "),n[65]||(n[65]=e.createElementVNode("circle",{cx:"12",cy:"12",r:"6",class:"stop-pulse"},null,-1)),n[66]||(n[66]=e.createElementVNode("circle",{cx:"12",cy:"12",r:"10",class:"stop-pulse-ring"},null,-1))],64)):r.name==="wrench"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:30},[e.createCommentVNode(" Wrench / Tool "),n[67]||(n[67]=e.createElementVNode("path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"},null,-1))],64)):r.name==="database"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:31},[e.createCommentVNode(" Database "),n[68]||(n[68]=e.createElementVNode("ellipse",{cx:"12",cy:"5",rx:"9",ry:"3"},null,-1)),n[69]||(n[69]=e.createElementVNode("path",{d:"M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"},null,-1)),n[70]||(n[70]=e.createElementVNode("path",{d:"M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"},null,-1))],64)):r.name==="user"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:32},[e.createCommentVNode(" User / Person "),n[71]||(n[71]=e.createElementVNode("path",{d:"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"},null,-1)),n[72]||(n[72]=e.createElementVNode("circle",{cx:"12",cy:"7",r:"4"},null,-1))],64)):r.name==="info"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:33},[e.createCommentVNode(" Info "),n[73]||(n[73]=e.createElementVNode("circle",{cx:"12",cy:"12",r:"10"},null,-1)),n[74]||(n[74]=e.createElementVNode("line",{x1:"12",y1:"16",x2:"12",y2:"12"},null,-1)),n[75]||(n[75]=e.createElementVNode("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"},null,-1))],64)):r.name==="lightbulb"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:34},[e.createCommentVNode(" Lightbulb / Suggestion "),n[76]||(n[76]=e.createElementVNode("path",{d:"M9 18h6"},null,-1)),n[77]||(n[77]=e.createElementVNode("path",{d:"M10 22h4"},null,-1)),n[78]||(n[78]=e.createElementVNode("path",{d:"M15.09 14c.18-.98.65-1.74 1.41-2.5A4.65 4.65 0 0 0 18 8 6 6 0 0 0 6 8c0 1 .23 2.23 1.5 3.5A4.61 4.61 0 0 1 8.91 14"},null,-1))],64)):r.name==="sparkles"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:35},[e.createCommentVNode(" Sparkles / Auto "),n[79]||(n[79]=e.createStaticVNode('<path d="M13.5 4L15 8l4 .5L15 12l1.5 4-4-2-4 2L10 12l-4-3.5L10 8z" data-v-faf69761></path><line x1="3" y1="18" x2="3" y2="21" data-v-faf69761></line><line x1="21" y1="18" x2="21" y2="21" data-v-faf69761></line><line x1="7" y1="20" x2="11" y2="20" data-v-faf69761></line><line x1="17" y1="20" x2="19" y2="20" data-v-faf69761></line>',5))],64)):r.name==="bot"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:36},[e.createCommentVNode(" Bot / AI "),n[80]||(n[80]=e.createStaticVNode('<rect x="3" y="11" width="18" height="10" rx="2" data-v-faf69761></rect><circle cx="12" cy="5" r="2" data-v-faf69761></circle><path d="M12 7v4" data-v-faf69761></path><line x1="8" y1="16" x2="8" y2="16" data-v-faf69761></line><line x1="16" y1="16" x2="16" y2="16" data-v-faf69761></line>',5))],64)):r.name==="file-js"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:37},[e.createCommentVNode(" File Type Icons "),n[81]||(n[81]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[82]||(n[82]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[83]||(n[83]=e.createElementVNode("text",{x:"8",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"JS",-1))],64)):r.name==="file-ts"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:38},[n[84]||(n[84]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[85]||(n[85]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[86]||(n[86]=e.createElementVNode("text",{x:"8",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"TS",-1))],64)):r.name==="file-go"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:39},[n[87]||(n[87]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[88]||(n[88]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[89]||(n[89]=e.createElementVNode("text",{x:"9",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"Go",-1))],64)):r.name==="file-py"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:40},[n[90]||(n[90]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[91]||(n[91]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[92]||(n[92]=e.createElementVNode("text",{x:"7",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"Py",-1))],64)):r.name==="file-java"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:41},[n[93]||(n[93]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[94]||(n[94]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[95]||(n[95]=e.createElementVNode("text",{x:"6",y:"17","font-size":"8",fill:"currentColor","font-weight":"bold",stroke:"none"},"Java",-1))],64)):r.name==="file-html"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:42},[n[96]||(n[96]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[97]||(n[97]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[98]||(n[98]=e.createElementVNode("text",{x:"6",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"HTML",-1))],64)):r.name==="file-css"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:43},[n[99]||(n[99]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[100]||(n[100]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[101]||(n[101]=e.createElementVNode("text",{x:"7",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"CSS",-1))],64)):r.name==="file-json"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:44},[n[102]||(n[102]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[103]||(n[103]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[104]||(n[104]=e.createElementVNode("text",{x:"5",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"{ }",-1))],64)):r.name==="file-md"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:45},[n[105]||(n[105]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[106]||(n[106]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[107]||(n[107]=e.createElementVNode("text",{x:"7",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"MD",-1))],64)):r.name==="file-vue"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:46},[n[108]||(n[108]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[109]||(n[109]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[110]||(n[110]=e.createElementVNode("text",{x:"7",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"Vue",-1))],64)):r.name==="copy"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:47},[e.createCommentVNode(" Copy "),n[111]||(n[111]=e.createElementVNode("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"},null,-1)),n[112]||(n[112]=e.createElementVNode("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"},null,-1))],64)):r.name==="minus"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:48},[e.createCommentVNode(" Minus "),n[113]||(n[113]=e.createElementVNode("line",{x1:"5",y1:"12",x2:"19",y2:"12"},null,-1))],64)):r.name==="edit"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:49},[e.createCommentVNode(" Edit / Rename "),n[114]||(n[114]=e.createElementVNode("path",{d:"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"},null,-1)),n[115]||(n[115]=e.createElementVNode("path",{d:"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"},null,-1))],64)):r.name==="trash"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:50},[e.createCommentVNode(" Trash / Delete "),n[116]||(n[116]=e.createElementVNode("polyline",{points:"3 6 5 6 21 6"},null,-1)),n[117]||(n[117]=e.createElementVNode("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"},null,-1))],64)):r.name==="file-plus"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:51},[e.createCommentVNode(" File Plus / New File "),n[118]||(n[118]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[119]||(n[119]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[120]||(n[120]=e.createElementVNode("line",{x1:"12",y1:"18",x2:"12",y2:"12"},null,-1)),n[121]||(n[121]=e.createElementVNode("line",{x1:"9",y1:"15",x2:"15",y2:"15"},null,-1))],64)):r.name==="message-square"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:52},[e.createCommentVNode(" Folder Plus / New Folder "),n[122]||(n[122]=e.createElementVNode("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"},null,-1))],64)):r.name==="folder-plus"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:53},[n[123]||(n[123]=e.createElementVNode("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2v3"},null,-1)),n[124]||(n[124]=e.createElementVNode("line",{x1:"12",y1:"11",x2:"12",y2:"17"},null,-1)),n[125]||(n[125]=e.createElementVNode("line",{x1:"9",y1:"14",x2:"15",y2:"14"},null,-1))],64)):r.name==="brain"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:54},[e.createCommentVNode(" Brain / Thinking "),n[126]||(n[126]=e.createElementVNode("path",{d:"M12 2a4 4 0 0 0-4 4v1a5 5 0 0 0-5 5v1a4 4 0 0 0 3 3.87V17a3 3 0 0 0 3 3h6a3 3 0 0 0 3-3v-.13A4 4 0 0 0 21 13v-1a5 5 0 0 0-5-5V6a4 4 0 0 0-4-4z"},null,-1)),n[127]||(n[127]=e.createElementVNode("path",{d:"M9 12v2"},null,-1)),n[128]||(n[128]=e.createElementVNode("path",{d:"M15 12v2"},null,-1)),n[129]||(n[129]=e.createElementVNode("path",{d:"M12 9v5"},null,-1))],64)):r.name==="check"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:55},[e.createCommentVNode(" Check / Success "),n[130]||(n[130]=e.createElementVNode("polyline",{points:"20 6 9 17 4 12"},null,-1))],64)):r.name==="clock"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:56},[e.createCommentVNode(" Clock / Pending "),n[131]||(n[131]=e.createElementVNode("circle",{cx:"12",cy:"12",r:"10"},null,-1)),n[132]||(n[132]=e.createElementVNode("polyline",{points:"12 6 12 12 16 14"},null,-1))],64)):r.name==="help"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:57},[e.createCommentVNode(" Help / Question "),n[133]||(n[133]=e.createElementVNode("circle",{cx:"12",cy:"12",r:"10"},null,-1)),n[134]||(n[134]=e.createElementVNode("path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"},null,-1)),n[135]||(n[135]=e.createElementVNode("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"},null,-1))],64)):r.name==="shield"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:58},[e.createCommentVNode(" Shield / Approval "),n[136]||(n[136]=e.createElementVNode("path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"},null,-1))],64)):r.name==="shield-off"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:59},[e.createCommentVNode(" Shield Off / No Review "),n[137]||(n[137]=e.createElementVNode("path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"},null,-1)),n[138]||(n[138]=e.createElementVNode("line",{x1:"4",y1:"4",x2:"20",y2:"20",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round"},null,-1))],64)):r.name==="code"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:60},[e.createCommentVNode(" Code / Brackets "),n[139]||(n[139]=e.createElementVNode("polyline",{points:"16 18 22 12 16 6"},null,-1)),n[140]||(n[140]=e.createElementVNode("polyline",{points:"8 6 2 12 8 18"},null,-1))],64)):r.name==="list"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:61},[e.createCommentVNode(" List / Menu "),n[141]||(n[141]=e.createStaticVNode('<line x1="8" y1="6" x2="21" y2="6" data-v-faf69761></line><line x1="8" y1="12" x2="21" y2="12" data-v-faf69761></line><line x1="8" y1="18" x2="21" y2="18" data-v-faf69761></line><line x1="3" y1="6" x2="3.01" y2="6" data-v-faf69761></line><line x1="3" y1="12" x2="3.01" y2="12" data-v-faf69761></line><line x1="3" y1="18" x2="3.01" y2="18" data-v-faf69761></line>',6))],64)):r.name==="layers"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:62},[e.createCommentVNode(" Layers / Stack / Context "),n[142]||(n[142]=e.createElementVNode("polygon",{points:"12 2 2 7 12 12 22 7 12 2"},null,-1)),n[143]||(n[143]=e.createElementVNode("polyline",{points:"2 17 12 22 22 17"},null,-1)),n[144]||(n[144]=e.createElementVNode("polyline",{points:"2 12 12 17 22 12"},null,-1))],64)):r.name==="eye"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:63},[e.createCommentVNode(" Eye / Show "),n[145]||(n[145]=e.createElementVNode("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"},null,-1)),n[146]||(n[146]=e.createElementVNode("circle",{cx:"12",cy:"12",r:"3"},null,-1))],64)):r.name==="eye-off"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:64},[e.createCommentVNode(" Eye Off / Hide "),n[147]||(n[147]=e.createElementVNode("path",{d:"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94"},null,-1)),n[148]||(n[148]=e.createElementVNode("path",{d:"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19"},null,-1)),n[149]||(n[149]=e.createElementVNode("line",{x1:"1",y1:"1",x2:"23",y2:"23"},null,-1))],64)):r.name==="bug"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:65},[e.createCommentVNode(" Bug "),n[150]||(n[150]=e.createStaticVNode('<rect x="8" y="2" width="8" height="4" rx="1" ry="1" data-v-faf69761></rect><path d="M20 12h-3a5 5 0 0 1-5 5 5 5 0 0 1-5-5H4" data-v-faf69761></path><path d="M4 8h16" data-v-faf69761></path><path d="M12 2v7" data-v-faf69761></path><path d="M9 17l-3 4" data-v-faf69761></path><path d="M15 17l3 4" data-v-faf69761></path>',6))],64)):r.name==="check-circle"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:66},[e.createCommentVNode(" Check Circle "),n[151]||(n[151]=e.createElementVNode("path",{d:"M22 11.08V12a10 10 0 1 1-5.93-9.14"},null,-1)),n[152]||(n[152]=e.createElementVNode("polyline",{points:"22 4 12 14.01 9 11.01"},null,-1))],64)):r.name==="book-open"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:67},[e.createCommentVNode(" Book Open / Documentation "),n[153]||(n[153]=e.createElementVNode("path",{d:"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"},null,-1)),n[154]||(n[154]=e.createElementVNode("path",{d:"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"},null,-1))],64)):r.name==="tool"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:68},[e.createCommentVNode(" Tool / Wrench alternate "),n[155]||(n[155]=e.createElementVNode("path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"},null,-1))],64)):r.name==="keyboard"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:69},[e.createCommentVNode(" Keyboard "),n[156]||(n[156]=e.createStaticVNode('<rect x="2" y="4" width="20" height="16" rx="2" ry="2" data-v-faf69761></rect><line x1="6" y1="8" x2="6.01" y2="8" data-v-faf69761></line><line x1="10" y1="8" x2="10.01" y2="8" data-v-faf69761></line><line x1="14" y1="8" x2="14.01" y2="8" data-v-faf69761></line><line x1="18" y1="8" x2="18.01" y2="8" data-v-faf69761></line><line x1="6" y1="12" x2="6.01" y2="12" data-v-faf69761></line><line x1="10" y1="12" x2="10.01" y2="12" data-v-faf69761></line><line x1="14" y1="12" x2="14.01" y2="12" data-v-faf69761></line><line x1="18" y1="12" x2="18.01" y2="12" data-v-faf69761></line><line x1="6" y1="16" x2="18" y2="16" data-v-faf69761></line>',10))],64)):r.name==="chevron-left"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:70},[e.createCommentVNode(" Chevron Left "),n[157]||(n[157]=e.createElementVNode("polyline",{points:"15 6 9 12 15 18"},null,-1))],64)):r.name==="grid"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:71},[e.createCommentVNode(" Grid / App Grid "),n[158]||(n[158]=e.createElementVNode("rect",{x:"3",y:"3",width:"7",height:"7"},null,-1)),n[159]||(n[159]=e.createElementVNode("rect",{x:"14",y:"3",width:"7",height:"7"},null,-1)),n[160]||(n[160]=e.createElementVNode("rect",{x:"14",y:"14",width:"7",height:"7"},null,-1)),n[161]||(n[161]=e.createElementVNode("rect",{x:"3",y:"14",width:"7",height:"7"},null,-1))],64)):r.name==="puzzle"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:72},[e.createCommentVNode(" Puzzle / 插件 "),n[162]||(n[162]=e.createElementVNode("path",{d:"M4 7h3a2 2 0 0 1 4 0h9v9h-3a2 2 0 0 0-4 0H4z"},null,-1)),n[163]||(n[163]=e.createElementVNode("path",{d:"M11 7v9"},null,-1))],64)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:73},[n[164]||(n[164]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[165]||(n[165]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[166]||(n[166]=e.createElementVNode("line",{x1:"9",y1:"13",x2:"15",y2:"13"},null,-1)),n[167]||(n[167]=e.createElementVNode("line",{x1:"9",y1:"17",x2:"15",y2:"17"},null,-1))],64))],8,Fe))}},[["__scopeId","data-v-faf69761"]]),Ue={class:"me-field"},He={class:"me-editor"},je={class:"me-input-row"},Ke=["onKeydown"],qe={class:"me-tags"},We={key:0,class:"me-empty"},Je=["onClick"],be=O({__name:"ModelEditor",props:{models:{type:Array,default:()=>[]}},emits:["change"],setup(r,{emit:t}){const n=r,o=t,l=e.ref(""),a=e.ref([...n.models]);e.watch(()=>n.models,f=>{a.value=[...f]});function s(){const f=l.value.split(/[\n,,]/).map(b=>b.trim()).filter(Boolean);let k=!1;for(const b of f)a.value.includes(b)||(a.value.push(b),k=!0);k&&o("change",[...a.value]),l.value=""}function d(f){const k=(f.clipboardData||window.clipboardData).getData("text");if(/[,\n,]/.test(k)){f.preventDefault();const b=k.split(/[\n,,]/).map(w=>w.trim()).filter(Boolean);let u=!1;for(const w of b)a.value.includes(w)||(a.value.push(w),u=!0);u&&o("change",[...a.value]),l.value=""}}function i(f){a.value.splice(f,1),o("change",[...a.value])}return(f,k)=>(e.openBlock(),e.createElementBlock("div",Ue,[k[1]||(k[1]=e.createElementVNode("span",{class:"me-label"},"可用模型(回车或逗号分隔添加;支持整段粘贴)",-1)),e.createElementVNode("div",He,[e.createElementVNode("div",je,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":k[0]||(k[0]=b=>l.value=b),class:"me-input",placeholder:"输入模型名,回车添加…",onKeydown:e.withKeys(e.withModifiers(s,["prevent"]),["enter"]),onPaste:d},null,40,Ke),[[e.vModelText,l.value]]),e.createElementVNode("button",{class:"me-btn",onClick:s},"添加")]),e.createElementVNode("div",qe,[a.value.length?e.createCommentVNode("v-if",!0):(e.openBlock(),e.createElementBlock("span",We,"暂无模型——添加后 AI tab 的模型下拉会按服务商显示")),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,(b,u)=>(e.openBlock(),e.createElementBlock("span",{key:b+u,class:"me-tag"},[e.createTextVNode(e.toDisplayString(b)+" ",1),e.createElementVNode("button",{class:"me-x",title:"移除",onClick:w=>i(u)},"×",8,Je)]))),128))])])]))}},[["__scopeId","data-v-e3700bd7"]]),Ze={class:"provider-manager"},Qe={class:"pm-toolbar"},Xe={class:"pm-count"},Ye={key:0,class:"pm-edit"},_e={class:"pm-field"},ve={class:"pm-field"},en={class:"pm-field"},nn={class:"pm-field"},tn={class:"pm-params"},rn={key:0,class:"pm-param-rows"},ln=["title"],on=["onUpdate:modelValue"],an=["value"],sn=["onUpdate:modelValue"],cn=["value"],dn=["onUpdate:modelValue"],pn=["onUpdate:modelValue"],mn={key:1,class:"pm-params-empty"},gn={class:"pm-edit-actions"},kn=["disabled"],hn={key:1,class:"pm-cards"},fn={key:0,class:"pm-edit"},yn={class:"pm-edit-title"},un={class:"pm-field"},En=["value"],xn={class:"pm-field"},bn={class:"pm-field"},Vn={class:"pm-field"},Nn={class:"pm-params"},wn={key:0,class:"pm-param-rows"},Tn=["title"],Sn=["onUpdate:modelValue"],Cn=["value"],Bn=["onUpdate:modelValue"],In=["value"],An=["onUpdate:modelValue"],Pn=["onUpdate:modelValue"],Mn={key:1,class:"pm-params-empty"},$n={class:"pm-edit-actions"},Dn=["disabled"],Rn={key:1,class:"pm-card"},Gn={class:"pm-card-head"},Ln=["title"],On={class:"pm-ops"},Fn=["onClick"],zn=["onClick"],Un=["title"],Hn=["title"],jn={class:"pm-ctx"},Kn={class:"pm-models"},qn={key:0,class:"pm-none"},Wn={key:0,class:"pm-params-summary"},Jn={key:2,class:"pm-empty"},Zn={key:3,class:"pm-error"},Qn=O({__name:"ProviderManager",emits:["saved"],setup(r,{emit:t}){const n=t,o=e.ref([]),l=e.ref(""),a=e.ref({name:"",baseURL:"",apiKey:"",contextMaxTokens:0}),s=e.ref([]),d=e.ref({}),i=e.ref(""),f=e.ref(!1),k=[{v:"",label:"默认"},{v:"none",label:"none(关闭)"},{v:"minimal",label:"minimal(极简)"},{v:"low",label:"low(低)"},{v:"medium",label:"medium(中)"},{v:"high",label:"high(高)"},{v:"xhigh",label:"xhigh(超高)"},{v:"max",label:"max(最大化)"}],b=["","0","0.1","0.2","0.3","0.4","0.5","0.6","0.7","0.8","0.9","1.0","1.2","1.5","2.0"];function u(h){const p=y.state.settings&&y.state.settings.modelParams||{};return JSON.parse(JSON.stringify(p[h]||{}))}async function w(){try{const h=await A.getModels();o.value=(h.providers||[]).map(p=>({name:p,baseURL:(h.providerBaseURLs||{})[p]||"",apiKey:(h.providerKeys||{})[p]||"",contextMaxTokens:(h.providerContexts||{})[p]||0,models:(h.models||{})[p]||[]})),i.value=""}catch(h){i.value="加载服务商失败: "+(h.message||h)}}e.onMounted(w);function x(){l.value="__new__",a.value={name:"",baseURL:"",apiKey:"",contextMaxTokens:0},s.value=[],d.value={},i.value=""}function N(h){l.value=h.name,a.value={name:h.name,baseURL:h.baseURL,apiKey:h.apiKey||"",contextMaxTokens:h.contextMaxTokens||0},s.value=[...h.models||[]];const p=u(h.name);for(const m of s.value)p[m]||(p[m]={temperature:"",thinkingMode:"",maxTokens:0,contextMaxTokens:0});d.value=p,i.value=""}function T(h){const p={...d.value};for(const m of h)p[m]||(p[m]={temperature:"",thinkingMode:"",maxTokens:0,contextMaxTokens:0});for(const m of Object.keys(p))h.includes(m)||delete p[m];d.value=p,s.value=h}function L(){l.value="",i.value=""}function M(){const h={};for(const p of o.value)h[p.name]={baseURL:p.baseURL,models:p.models,apiKey:p.apiKey||"",contextMaxTokens:p.contextMaxTokens||0};return h}async function D(){const h=a.value.name.trim()||(l.value!=="__new__"?l.value:"");if(!h){i.value="服务商名称不能为空";return}const p=M();if(l.value==="__new__"&&p[h]){i.value=`服务商「${h}」已存在`;return}p[h]={baseURL:a.value.baseURL.trim(),models:s.value,apiKey:(a.value.apiKey||"").trim(),contextMaxTokens:Math.max(0,Number(a.value.contextMaxTokens)||0)},f.value=!0;try{await A.saveModels(p),await K(h),l.value="",await w(),n("saved")}catch(m){i.value="保存失败: "+(m.message||m)}finally{f.value=!1}}async function K(h){let p={};try{const g=await A.apiGet("/settings");p=g&&g.settings||{}}catch{}const m=JSON.parse(JSON.stringify(p.modelParams||{})),E={};for(const[g,V]of Object.entries(d.value)){const B=V||{},G={};B.temperature!==""&&B.temperature!==void 0&&B.temperature!==null&&(G.temperature=B.temperature),B.thinkingMode&&(G.thinkingMode=B.thinkingMode),Number(B.maxTokens)>0&&(G.maxTokens=Number(B.maxTokens)),Number(B.contextMaxTokens)>0&&(G.contextMaxTokens=Number(B.contextMaxTokens)),Object.keys(G).length&&(E[g]=G)}Object.keys(E).length?m[h]=E:delete m[h];const c={...p,modelParams:m};await A.apiPut("/settings",{settings:c,pluginSettings:p.pluginSettings||{}}),y.state.settings=c}async function U(h){if(!window.confirm(`删除服务商「${h.name}」?
2
- (AI tab 将不再可选该服务商)`))return;const p=M();delete p[h.name];try{await A.saveModels(p);let m={};try{const c=await A.apiGet("/settings");m=c&&c.settings||{}}catch{}const E=JSON.parse(JSON.stringify(m.modelParams||{}));if(E[h.name]){delete E[h.name];const c={...m,modelParams:E};await A.apiPut("/settings",{settings:c,pluginSettings:m.pluginSettings||{}}),y.state.settings=c}await w(),n("saved")}catch(m){i.value="删除失败: "+(m.message||m)}}function R(h){const m=(y.state.settings&&y.state.settings.modelParams||{})[h]||{},E=Object.keys(m).length;return E?"模型参数已配置 "+E+" 个":""}return(h,p)=>(e.openBlock(),e.createElementBlock("div",Ze,[e.createCommentVNode(" 工具栏 "),e.createElementVNode("div",Qe,[e.createElementVNode("span",Xe,e.toDisplayString(o.value.length)+" 个服务商",1),e.createElementVNode("button",{class:"pm-btn pm-primary",onClick:x},"+ 新增服务商")]),e.createCommentVNode(" 新增表单(工具栏下方展开,紧邻按钮不跳动) "),l.value==="__new__"?(e.openBlock(),e.createElementBlock("div",Ye,[p[12]||(p[12]=e.createElementVNode("div",{class:"pm-edit-title"},"新增服务商",-1)),e.createElementVNode("div",_e,[p[7]||(p[7]=e.createElementVNode("span",{class:"pm-field-label"},"服务商名称",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":p[0]||(p[0]=m=>a.value.name=m),placeholder:"如 deepseek"},null,512),[[e.vModelText,a.value.name]])]),e.createElementVNode("div",ve,[p[8]||(p[8]=e.createElementVNode("span",{class:"pm-field-label"},"Base URL",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":p[1]||(p[1]=m=>a.value.baseURL=m),placeholder:"https://api.deepseek.com/v1"},null,512),[[e.vModelText,a.value.baseURL]])]),e.createElementVNode("div",en,[p[9]||(p[9]=e.createElementVNode("span",{class:"pm-field-label"},"API Key(该服务商独立保存)",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":p[2]||(p[2]=m=>a.value.apiKey=m),type:"password",placeholder:"sk-…"},null,512),[[e.vModelText,a.value.apiKey]])]),e.createElementVNode("div",nn,[p[10]||(p[10]=e.createElementVNode("span",{class:"pm-field-label"},"上下文大小(Token)",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":p[3]||(p[3]=m=>a.value.contextMaxTokens=m),type:"number",min:"0",step:"1000",placeholder:"0=不限制(模型级未配置时的默认窗口)"},null,512),[[e.vModelText,a.value.contextMaxTokens]])]),e.createVNode(be,{models:s.value,onChange:T},null,8,["models"]),e.createElementVNode("div",tn,[p[11]||(p[11]=e.createElementVNode("div",{class:"pm-params-title"},"模型参数(每模型独立配置;对话里也可临时切换思考档位)",-1)),s.value.length?(e.openBlock(),e.createElementBlock("div",rn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.value,m=>(e.openBlock(),e.createElementBlock("div",{key:m,class:"pm-param-row"},[e.createElementVNode("span",{class:"pm-param-model",title:m},e.toDisplayString(m),9,ln),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":E=>d.value[m].temperature=E,title:"温度(随机性)"},[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(b,E=>e.createElementVNode("option",{key:"t"+E,value:E},e.toDisplayString(E===""?"温度默认":E),9,an)),64))],8,on),[[e.vModelSelect,d.value[m].temperature]]),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":E=>d.value[m].thinkingMode=E,title:"思考档位(OpenAI 定义)"},[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(k,E=>e.createElementVNode("option",{key:"k"+E.v,value:E.v},e.toDisplayString(E.label),9,cn)),64))],8,sn),[[e.vModelSelect,d.value[m].thinkingMode]]),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":E=>d.value[m].maxTokens=E,type:"number",min:"0",step:"1024",placeholder:"输出 Token",title:"最大输出 Token(0=默认)"},null,8,dn),[[e.vModelText,d.value[m].maxTokens,void 0,{number:!0}]]),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":E=>d.value[m].contextMaxTokens=E,type:"number",min:"0",step:"4096",placeholder:"上下文",title:"上下文窗口(0=默认)"},null,8,pn),[[e.vModelText,d.value[m].contextMaxTokens,void 0,{number:!0}]])]))),128))])):(e.openBlock(),e.createElementBlock("div",mn,"添加模型后,可逐模型配置温度/思考档位/输出上限/上下文窗口"))]),e.createElementVNode("div",gn,[e.createElementVNode("button",{class:"pm-btn pm-primary",disabled:f.value,onClick:D},e.toDisplayString(f.value?"保存中…":"保存服务商"),9,kn),e.createElementVNode("button",{class:"pm-btn",onClick:L},"取消")])])):e.createCommentVNode("v-if",!0),e.createCommentVNode(" 服务商卡片列表(编辑时在卡片位置就地展开表单,不跳顶) "),o.value.length?(e.openBlock(),e.createElementBlock("div",hn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.value,m=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:m.name},[l.value===m.name?(e.openBlock(),e.createElementBlock("div",fn,[e.createElementVNode("div",yn,"编辑服务商:"+e.toDisplayString(m.name),1),e.createElementVNode("div",un,[p[13]||(p[13]=e.createElementVNode("span",{class:"pm-field-label"},"服务商名称",-1)),e.createElementVNode("input",{value:m.name,disabled:""},null,8,En)]),e.createElementVNode("div",xn,[p[14]||(p[14]=e.createElementVNode("span",{class:"pm-field-label"},"Base URL",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":p[4]||(p[4]=E=>a.value.baseURL=E),placeholder:"https://api.deepseek.com/v1"},null,512),[[e.vModelText,a.value.baseURL]])]),e.createElementVNode("div",bn,[p[15]||(p[15]=e.createElementVNode("span",{class:"pm-field-label"},"API Key(该服务商独立保存)",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":p[5]||(p[5]=E=>a.value.apiKey=E),type:"password",placeholder:"sk-…"},null,512),[[e.vModelText,a.value.apiKey]])]),e.createElementVNode("div",Vn,[p[16]||(p[16]=e.createElementVNode("span",{class:"pm-field-label"},"上下文大小(Token)",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":p[6]||(p[6]=E=>a.value.contextMaxTokens=E),type:"number",min:"0",step:"1000",placeholder:"0=不限制(模型级未配置时的默认窗口)"},null,512),[[e.vModelText,a.value.contextMaxTokens]])]),e.createVNode(be,{models:s.value,onChange:T},null,8,["models"]),e.createElementVNode("div",Nn,[p[17]||(p[17]=e.createElementVNode("div",{class:"pm-params-title"},"模型参数(每模型独立配置;对话里也可临时切换思考档位)",-1)),s.value.length?(e.openBlock(),e.createElementBlock("div",wn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.value,E=>(e.openBlock(),e.createElementBlock("div",{key:E,class:"pm-param-row"},[e.createElementVNode("span",{class:"pm-param-model",title:E},e.toDisplayString(E),9,Tn),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":c=>d.value[E].temperature=c,title:"温度(随机性)"},[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(b,c=>e.createElementVNode("option",{key:"t"+c,value:c},e.toDisplayString(c===""?"温度默认":c),9,Cn)),64))],8,Sn),[[e.vModelSelect,d.value[E].temperature]]),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":c=>d.value[E].thinkingMode=c,title:"思考档位(OpenAI 定义)"},[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(k,c=>e.createElementVNode("option",{key:"k"+c.v,value:c.v},e.toDisplayString(c.label),9,In)),64))],8,Bn),[[e.vModelSelect,d.value[E].thinkingMode]]),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":c=>d.value[E].maxTokens=c,type:"number",min:"0",step:"1024",placeholder:"输出 Token",title:"最大输出 Token(0=默认)"},null,8,An),[[e.vModelText,d.value[E].maxTokens,void 0,{number:!0}]]),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":c=>d.value[E].contextMaxTokens=c,type:"number",min:"0",step:"4096",placeholder:"上下文",title:"上下文窗口(0=默认)"},null,8,Pn),[[e.vModelText,d.value[E].contextMaxTokens,void 0,{number:!0}]])]))),128))])):(e.openBlock(),e.createElementBlock("div",Mn,"添加模型后,可逐模型配置温度/思考档位/输出上限/上下文窗口"))]),e.createElementVNode("div",$n,[e.createElementVNode("button",{class:"pm-btn pm-primary",disabled:f.value,onClick:D},e.toDisplayString(f.value?"保存中…":"保存服务商"),9,Dn),e.createElementVNode("button",{class:"pm-btn",onClick:L},"取消")])])):(e.openBlock(),e.createElementBlock("div",Rn,[e.createElementVNode("div",Gn,[e.createElementVNode("span",{class:"pm-name",title:m.name},e.toDisplayString(m.name),9,Ln),e.createElementVNode("div",On,[e.createElementVNode("button",{class:"pm-btn pm-small",onClick:E=>N(m)},"编辑",8,Fn),e.createElementVNode("button",{class:"pm-btn pm-small pm-danger",onClick:E=>U(m)},"删除",8,zn)])]),e.createElementVNode("div",{class:"pm-url",title:m.baseURL},e.toDisplayString(m.baseURL||"未配置 Base URL"),9,Un),e.createElementVNode("div",{class:e.normalizeClass(["pm-key",{"pm-key-ok":m.apiKey}]),title:m.apiKey?"已配置 API Key":"未配置 API Key"},e.toDisplayString(m.apiKey?"API Key 已配置":"未配置 API Key"),11,Hn),e.createElementVNode("div",jn,e.toDisplayString(m.contextMaxTokens>0?"上下文 "+(m.contextMaxTokens/1e3).toFixed(0)+"K Token":"上下文 未限制"),1),e.createElementVNode("div",Kn,[m.models.length?e.createCommentVNode("v-if",!0):(e.openBlock(),e.createElementBlock("span",qn,"(未配置模型)")),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.models,E=>(e.openBlock(),e.createElementBlock("span",{key:E,class:"pm-tag"},e.toDisplayString(E),1))),128))]),R(m.name)?(e.openBlock(),e.createElementBlock("div",Wn,e.toDisplayString(R(m.name)),1)):e.createCommentVNode("v-if",!0)]))],64))),128))])):l.value!=="__new__"?(e.openBlock(),e.createElementBlock("div",Jn,"暂无服务商,点「+ 新增服务商」添加")):e.createCommentVNode("v-if",!0),i.value?(e.openBlock(),e.createElementBlock("div",Zn,e.toDisplayString(i.value),1)):e.createCommentVNode("v-if",!0)]))}},[["__scopeId","data-v-ce1b9f02"]]),Xn={class:"pm-manager"},Yn={class:"mgm-toolbar"},_n={class:"mgm-count"},vn={key:0,class:"mgm-edit"},et={class:"mgm-edit-title"},nt={class:"mgm-field"},tt={class:"mgm-field"},rt=["value"],lt={class:"mgm-field"},ot={class:"mgm-field"},at={class:"mgm-field"},st=["value"],it={class:"mgm-edit-actions"},ct=["disabled"],dt={key:1,class:"mgm-cards"},pt={class:"mgm-card-head"},mt=["title"],gt={key:0,class:"pm-active-badge"},kt={class:"mgm-ops"},ht=["disabled","onClick"],ft=["onClick"],yt=["onClick"],ut={class:"pm-preview"},Et={class:"pm-snap-row"},xt={class:"pm-snap-row"},bt={class:"pm-snap-row"},Vt={key:2,class:"mgm-empty"},Nt={key:3,class:"mgm-error"},wt=O({__name:"PresetManager",emits:["saved"],setup(r,{expose:t,emit:n}){const o=n,l=e.ref({}),a=e.computed(()=>Object.keys(l.value||{})),s=e.ref(""),d=e.ref(!1),i=e.ref(""),f=e.ref(!1),k=e.ref(""),b=e.ref(""),u=e.ref(null),w=e.computed(()=>u.value&&u.value.providers||[]),x=e.computed(()=>(u.value&&u.value.models||{})[N.value.provider]||[]),N=e.ref({name:"",provider:"",baseURL:"",apiKey:"",executeModel:""});function T(c){b.value=c,setTimeout(()=>{b.value===c&&(b.value="")},4e3)}function L(c){return c?c.slice(0,10)+"…":"—"}async function M(){try{const[c,g,V]=await Promise.all([A.getAiPresets().catch(()=>({presets:{}})),A.apiGet("/settings").catch(()=>({settings:{}})),A.getModels().catch(()=>null)]);l.value=c&&c.presets||{},s.value=g&&g.settings&&g.settings.preset||"",u.value=V}catch(c){T("加载失败: "+(c.message||c))}}function D(c){const g=u.value||{};return{baseURL:g.providerBaseURLs&&g.providerBaseURLs[c]||"",apiKey:g.providerKeys&&g.providerKeys[c]||"",models:g.models&&g.models[c]||[]}}function K(){const c=window&&window.__PAIRCODE_CORE&&window.__PAIRCODE_CORE.uiState&&window.__PAIRCODE_CORE.uiState.state&&window.__PAIRCODE_CORE.uiState.state.settings||{};let g={};c.preset&&l.value&&l.value[c.preset]&&(g=l.value[c.preset]);const V=g.provider||c.provider||w.value[0]||"",B=D(V),G=B.models,Y=g.executeModel||c.executeModel||"";N.value={name:"",provider:V,baseURL:g.baseURL||c.baseURL||B.baseURL||"",apiKey:g.apiKey||c.apiKey||B.apiKey||"",executeModel:G.includes(Y)?Y:G[0]||""},i.value="",d.value=!0}function U(c){const g=l.value&&l.value[c]||{};N.value={name:c,provider:g.provider||"",baseURL:g.baseURL||"",apiKey:g.apiKey||"",executeModel:g.executeModel||""},i.value=c,d.value=!0}function R(){d.value=!1,i.value=""}function h(){if(!N.value.provider)return;const c=D(N.value.provider);N.value.baseURL=c.baseURL||"",N.value.apiKey=c.apiKey||"",N.value.executeModel=c.models.includes(N.value.executeModel)?N.value.executeModel:c.models[0]||""}e.watch(()=>N.value.provider,(c,g)=>{!d.value||g===""||c!==g&&h()});async function p(){const c=N.value.name.trim();if(!c){T("请输入配置名称");return}if(!N.value.provider){T("请选择服务商");return}if(!N.value.apiKey){T("请填写 API Key");return}f.value=!0,b.value="";try{const g={provider:N.value.provider,baseURL:N.value.baseURL,apiKey:N.value.apiKey,executeModel:N.value.executeModel};if(i.value&&i.value!==c){const V={...l.value||{}};V[c]=g,delete V[i.value];const B=await A.saveAiPresets(V);if(!(B&&B.ok)){T(B&&B.error||"保存失败");return}l.value=V,s.value===i.value&&(s.value=c,await A.apiPut("/settings",{settings:{preset:c},pluginSettings:{}}).catch(()=>{}))}else{const V=await A.saveAiPreset("save",c,g);if(!(V&&V.ok)){T(V&&V.error||"保存失败");return}l.value=V.presets||l.value}R(),o("saved")}catch(g){T("保存失败: "+(g.message||g))}finally{f.value=!1}}async function m(c){k.value=c,b.value="";try{const g=await A.saveAiPreset("apply",c);g&&g.ok?(s.value=c,o("saved")):T(g&&g.error||"应用失败")}catch(g){T("应用失败: "+(g.message||g))}finally{k.value=""}}async function E(c){if(confirm("删除配置「"+c+"」?")){b.value="";try{const g=await A.saveAiPreset("delete",c);g&&g.ok?(l.value=g.presets||l.value,s.value===c&&(s.value=""),o("saved")):T(g&&g.error||"删除失败")}catch(g){T("删除失败: "+(g.message||g))}}}return e.onMounted(M),t({load:M}),(c,g)=>(e.openBlock(),e.createElementBlock("div",Xn,[e.createCommentVNode(" 工具栏 "),e.createElementVNode("div",Yn,[e.createElementVNode("span",_n,e.toDisplayString(a.value.length)+" 个配置",1),e.createElementVNode("button",{class:"mgm-btn mgm-primary",onClick:K},"+ 添加新配置")]),e.createCommentVNode(" 添加 / 编辑表单(点击添加/编辑才弹出) "),d.value?(e.openBlock(),e.createElementBlock("div",vn,[e.createElementVNode("div",et,e.toDisplayString(i.value?"编辑配置:"+i.value:"添加新配置"),1),e.createElementVNode("div",nt,[g[5]||(g[5]=e.createElementVNode("span",{class:"mgm-field-label"},"配置名称",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":g[0]||(g[0]=V=>N.value.name=V),type:"text",placeholder:"如:主力 / 写作备用…",onKeydown:e.withKeys(p,["enter"])},null,544),[[e.vModelText,N.value.name]])]),e.createElementVNode("div",tt,[g[6]||(g[6]=e.createElementVNode("span",{class:"mgm-field-label"},"服务商",-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":g[1]||(g[1]=V=>N.value.provider=V),class:"mgm-select",onChange:h},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(w.value,V=>(e.openBlock(),e.createElementBlock("option",{key:V,value:V},e.toDisplayString(V),9,rt))),128))],544),[[e.vModelSelect,N.value.provider]])]),e.createElementVNode("div",lt,[g[7]||(g[7]=e.createElementVNode("span",{class:"mgm-field-label"},"Base URL",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":g[2]||(g[2]=V=>N.value.baseURL=V),type:"text",placeholder:"https://api.deepseek.com/v1"},null,512),[[e.vModelText,N.value.baseURL]])]),e.createElementVNode("div",ot,[g[8]||(g[8]=e.createElementVNode("span",{class:"mgm-field-label"},"API Key",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":g[3]||(g[3]=V=>N.value.apiKey=V),type:"password",placeholder:"sk-…"},null,512),[[e.vModelText,N.value.apiKey]])]),e.createElementVNode("div",at,[g[9]||(g[9]=e.createElementVNode("span",{class:"mgm-field-label"},"模型",-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":g[4]||(g[4]=V=>N.value.executeModel=V),class:"mgm-select"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(x.value,V=>(e.openBlock(),e.createElementBlock("option",{key:V,value:V},e.toDisplayString(V),9,st))),128))],512),[[e.vModelSelect,N.value.executeModel]])]),e.createElementVNode("div",it,[e.createElementVNode("button",{class:"mgm-btn mgm-primary",disabled:f.value,onClick:p},e.toDisplayString(f.value?"保存中…":"保存配置"),9,ct),e.createElementVNode("button",{class:"mgm-btn",onClick:R},"取消")])])):e.createCommentVNode("v-if",!0),e.createCommentVNode(" 配置卡片列表(主视图) "),a.value.length?(e.openBlock(),e.createElementBlock("div",dt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,V=>(e.openBlock(),e.createElementBlock("div",{key:V,class:e.normalizeClass(["mgm-card",{"pm-active":V===s.value}])},[e.createElementVNode("div",pt,[e.createElementVNode("span",{class:"mgm-name",title:V},[e.createTextVNode(e.toDisplayString(V),1),V===s.value?(e.openBlock(),e.createElementBlock("span",gt,"使用中")):e.createCommentVNode("v-if",!0)],8,mt),e.createElementVNode("div",kt,[e.createElementVNode("button",{class:"mgm-btn mgm-small",disabled:k.value===V,onClick:B=>m(V)},e.toDisplayString(k.value===V?"应用中…":"应用"),9,ht),e.createElementVNode("button",{class:"mgm-btn mgm-small",onClick:B=>U(V)},"编辑",8,ft),e.createElementVNode("button",{class:"mgm-btn mgm-small mgm-danger",onClick:B=>E(V)},"删除",8,yt)])]),e.createElementVNode("div",ut,[e.createElementVNode("div",Et,[g[10]||(g[10]=e.createElementVNode("span",null,"服务商",-1)),e.createElementVNode("b",null,e.toDisplayString((l.value[V]||{}).provider||"—"),1)]),e.createElementVNode("div",xt,[g[11]||(g[11]=e.createElementVNode("span",null,"模型",-1)),e.createElementVNode("b",null,e.toDisplayString((l.value[V]||{}).executeModel||"—"),1)]),e.createElementVNode("div",bt,[g[12]||(g[12]=e.createElementVNode("span",null,"API Key",-1)),e.createElementVNode("b",null,e.toDisplayString(L((l.value[V]||{}).apiKey)),1)])])],2))),128))])):d.value?e.createCommentVNode("v-if",!0):(e.openBlock(),e.createElementBlock("div",Vt,"还没有 AI 配置。点「+ 添加新配置」去设置模型和 Key,保存后即可应用。")),b.value?(e.openBlock(),e.createElementBlock("div",Nt,e.toDisplayString(b.value),1)):e.createCommentVNode("v-if",!0)]))}},[["__scopeId","data-v-2cccd6a1"]]),Tt={class:"modal-content"},St={class:"modal-body"},Ct={key:0,class:"settings-tabs"},Bt=["onClick"],It={class:"settings-content"},At={key:0},Pt={key:0,class:"group-title"},Mt=["title"],$t=["title"],Dt=["onUpdate:modelValue"],Rt=["title"],Gt={class:"field-control"},Lt=["type","onUpdate:modelValue","placeholder"],Ot=["onUpdate:modelValue","min","max","step"],Ft=["onUpdate:modelValue","onChange"],zt=["value"],Ut=["onUpdate:modelValue","placeholder"],Ht={class:"slider-row"},jt=["onUpdate:modelValue","min","max","step"],Kt={class:"slider-val"},qt={class:"color-row"},Wt=["onUpdate:modelValue"],Jt={class:"color-code"},Zt=["value","onInput","placeholder"],Qt=["placeholder"],Xt=["onUpdate:modelValue"],Yt={key:0,class:"setting-hint"},_t={key:0,class:"settings-empty"},vt=O({__name:"SettingsModal",emits:["close"],setup(r,{emit:t}){const n=t,o=e.ref(""),l=e.computed(()=>{const h=(y.state.pluginSchemas||[]).map(p=>({key:p.key,title:p.title||p.key,groups:a(p.fields||[])}));return h.length&&!o.value&&(o.value=h[0].key),h});function a(h){const p=[],m={};for(const E of h){const c=E.group||"";m[c]||(m[c]=[],p.push({title:c,fields:m[c]})),m[c].push(E)}return p}const s=e.ref(null);let d="";async function i(){try{s.value=await A.getModels()}catch{s.value=null}}function f(h){return h?(s.value&&s.value.models||{})[h]||[]:[]}function k(h,p){var m,E,c;if(p.optionsSource==="models"){const g=(m=u[h])==null?void 0:m[p.name],V=f((E=u.ai)==null?void 0:E.provider);return g&&!V.includes(g)?[...V,g]:V}if(p.optionsSource==="providers"){const g=s.value&&s.value.providers||[];if(g.length){const V=(c=u[h])==null?void 0:c[p.name];return V&&!g.includes(V)?[...g,V]:g}return p.options||[]}return p.options||[]}function b(h){if(!u.ai)return;const p=u.ai,m=h.linkFields||(h.linkField?[h.linkField]:[]);if(!m.length)return;const E=s.value||{},c=E.providerBaseURLs||{},g=E.providerKeys||{},V=p.provider,B=c[d];for(const G of m)if(G==="apiKey")p[G]=g[V]||"";else{const Y=p[G];(Y===void 0||Y===""||B&&Y===B)&&(p[G]=c[V]||"")}d=V}const u=e.reactive({}),w=e.ref("");function x(h){switch(h){case"checkbox":return!1;case"number":return 0;case"tags":return[];default:return""}}function N(){for(const E of Object.keys(u))delete u[E];const h=y.state.settings||{};d=h.provider||"";const p=h.pluginSettings||{};for(const E of y.state.pluginSchemas||[]){u[E.key]={};for(const c of E.fields||[]){let g;if(!(c.type==="project"||c.type==="provider-manager"||c.type==="model-params-manager"||c.type==="preset-manager")){if(c.binding)g=h[c.binding]!==void 0?h[c.binding]:c.default;else{const V=p[E.key]||{};g=V[c.name]!==void 0?V[c.name]:c.default}g===void 0&&(g=x(c.type)),c.type==="checkbox"&&(g=!!g),c.type==="number"&&(g=typeof g=="number"?g:Number(g)||0),c.type==="tags"&&(g=Array.isArray(g)?g:[]),u[E.key][c.name]=g}}}const m=(y.state.pluginSchemas||[]).some(E=>(E.fields||[]).some(c=>c.type==="project"));w.value="",m&&M()}function T(h,p){var E;const m=(E=u[h])==null?void 0:E[p.name];return Array.isArray(m)?m.join(", "):m||""}function L(h,p,m){u[h][p.name]=m.target.value.split(",").map(E=>E.trim()).filter(Boolean)}async function M(){try{const h=await A.getInstructions("project");w.value=h.content||""}catch{}}function D(){var h;N(),(h=y.state.settings)!=null&&h.theme&&y.applyTheme(y.state.settings.theme)}const K=()=>{D()};async function U(){try{const h=await A.apiGet("/settings");h&&h.settings&&(y.state.settings=h.settings,await i(),D())}catch{}}const R=async()=>{try{let h={};try{const c=await A.apiGet("/settings");h=c&&c.settings||{}}catch{}const p={...h},m={...h.pluginSettings||{}};let E=!1;for(const c of y.state.pluginSchemas||[]){const g=u[c.key]||{};for(const V of c.fields||[]){if(V.type==="project"){await A.saveInstructions("project",w.value);continue}if(V.type==="provider-manager"||V.type==="model-params-manager"||V.type==="preset-manager")continue;const B=g[V.name];V.binding?(V.name==="theme"&&B!==p[V.binding]&&(E=!0),p[V.binding]=B):(m[c.key]||(m[c.key]={}),m[c.key][V.name]=B)}}await A.apiPut("/settings",{settings:p,pluginSettings:m}),y.state.settings=p,E&&y.applyTheme(p.theme),window.$toast("设置已保存","success"),n("close")}catch(h){window.$toast("保存失败: "+h.message,"error")}};return e.onMounted(async()=>{await i(),D()}),(h,p)=>(e.openBlock(),e.createElementBlock("div",{class:"modal-overlay",onClick:p[2]||(p[2]=e.withModifiers(m=>h.$emit("close"),["self"]))},[e.createElementVNode("div",Tt,[e.createElementVNode("h2",null,[e.createVNode(P,{name:"settings",size:18}),p[3]||(p[3]=e.createTextVNode(" 设置 ",-1)),e.createElementVNode("button",{class:"modal-close",onClick:p[0]||(p[0]=m=>h.$emit("close"))},"×")]),e.createElementVNode("div",St,[e.createCommentVNode(" ═══ 纯 schema 驱动:所有配置 tab 由插件 ctx.registerSettings 注册 ═══ "),l.value.length?(e.openBlock(),e.createElementBlock("div",Ct,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,m=>(e.openBlock(),e.createElementBlock("button",{key:m.key,class:e.normalizeClass(["settings-tab",{active:o.value===m.key}]),onClick:E=>o.value=m.key},e.toDisplayString(m.title),11,Bt))),128))])):e.createCommentVNode("v-if",!0),e.createElementVNode("div",It,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,m=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:m.key},[o.value===m.key?(e.openBlock(),e.createElementBlock("div",At,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.groups,E=>(e.openBlock(),e.createElementBlock("div",{key:E.title||"__main",class:"setting-group"},[E.title?(e.openBlock(),e.createElementBlock("div",Pt,e.toDisplayString(E.title),1)):e.createCommentVNode("v-if",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(E.fields,c=>(e.openBlock(),e.createElementBlock("div",{key:c.name,class:e.normalizeClass(["setting-row",{"row-toggle":c.type==="checkbox"}])},[e.createCommentVNode(" checkbox:label 与开关同行 "),c.type==="checkbox"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createElementVNode("label",{class:"field-label",title:c.hint},e.toDisplayString(c.label),9,Mt),e.createElementVNode("label",{class:"pp-switch",title:c.hint},[e.withDirectives(e.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":g=>u[m.key][c.name]=g},null,8,Dt),[[e.vModelCheckbox,u[m.key][c.name]]]),p[4]||(p[4]=e.createElementVNode("span",{class:"pp-switch-track"},null,-1))],8,$t)],64)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createCommentVNode(" 其他类型:label 在上、控件在下、说明文字在控件下方(不挤占输入区) "),e.createElementVNode("label",{class:"field-label",title:c.hint},e.toDisplayString(c.label),9,Rt),e.createElementVNode("div",Gt,[e.createCommentVNode(" text / password "),c.type==="text"||c.type==="password"?e.withDirectives((e.openBlock(),e.createElementBlock("input",{key:0,class:"field-input",type:c.type==="password"?"password":"text","onUpdate:modelValue":g=>u[m.key][c.name]=g,placeholder:c.placeholder},null,8,Lt)),[[e.vModelDynamic,u[m.key][c.name]]]):c.type==="number"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createCommentVNode(" number "),e.withDirectives(e.createElementVNode("input",{class:"field-input",type:"number","onUpdate:modelValue":g=>u[m.key][c.name]=g,min:c.min,max:c.max,step:c.step},null,8,Ot),[[e.vModelText,u[m.key][c.name],void 0,{number:!0}]])],2112)):c.type==="select"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:2},[e.createCommentVNode(" select(optionsSource 驱动动态数据源:models=按服务商模型列表 / providers=服务商列表) "),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":g=>u[m.key][c.name]=g,class:"field-select",onChange:g=>b(c)},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(k(m.key,c),g=>(e.openBlock(),e.createElementBlock("option",{key:g,value:g},e.toDisplayString(g),9,zt))),128))],40,Ft),[[e.vModelSelect,u[m.key][c.name]]])],2112)):c.type==="textarea"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:3},[e.createCommentVNode(" textarea "),e.withDirectives(e.createElementVNode("textarea",{"onUpdate:modelValue":g=>u[m.key][c.name]=g,class:"field-textarea",rows:"4",placeholder:c.placeholder},null,8,Ut),[[e.vModelText,u[m.key][c.name]]])],2112)):c.type==="slider"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:4},[e.createCommentVNode(" slider "),e.createElementVNode("div",Ht,[e.withDirectives(e.createElementVNode("input",{type:"range","onUpdate:modelValue":g=>u[m.key][c.name]=g,min:c.min!=null?c.min:0,max:c.max!=null?c.max:100,step:c.step||1},null,8,jt),[[e.vModelText,u[m.key][c.name],void 0,{number:!0}]]),e.createElementVNode("span",Kt,e.toDisplayString(u[m.key][c.name]),1)])],2112)):c.type==="color"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:5},[e.createCommentVNode(" color "),e.createElementVNode("div",qt,[e.withDirectives(e.createElementVNode("input",{type:"color","onUpdate:modelValue":g=>u[m.key][c.name]=g},null,8,Wt),[[e.vModelText,u[m.key][c.name]]]),e.createElementVNode("code",Jt,e.toDisplayString(u[m.key][c.name]),1)])],2112)):c.type==="tags"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:6},[e.createCommentVNode(" tags(逗号分隔数组) "),e.createElementVNode("input",{type:"text",class:"field-input",value:T(m.key,c),onInput:g=>L(m.key,c,g),placeholder:c.placeholder||"逗号分隔"},null,40,Zt)],2112)):c.type==="project"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:7},[e.createCommentVNode(" project(平台特殊:项目级指令,经 /api/instructions 读写) "),e.withDirectives(e.createElementVNode("textarea",{"onUpdate:modelValue":p[1]||(p[1]=g=>w.value=g),class:"field-textarea",rows:"4",placeholder:c.placeholder},null,8,Qt),[[e.vModelText,w.value]])],2112)):c.type==="provider-manager"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:8},[e.createCommentVNode(" provider-manager(服务商维护面板:CRUD /api/models,独立保存,不参与普通表单) "),e.createVNode(Qn,{onSaved:i})],2112)):c.type==="preset-manager"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:9},[e.createCommentVNode(" preset-manager(AI 配置预设面板:CRUD /api/ai-presets,独立保存,不参与普通表单) "),e.createVNode(wt,{onSaved:U})],2112)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:10},[e.createCommentVNode(" 兜底 text "),e.withDirectives(e.createElementVNode("input",{class:"field-input",type:"text","onUpdate:modelValue":g=>u[m.key][c.name]=g},null,8,Xt),[[e.vModelText,u[m.key][c.name]]])],2112))]),c.hint?(e.openBlock(),e.createElementBlock("span",Yt,e.toDisplayString(c.hint),1)):e.createCommentVNode("v-if",!0)],64))],2))),128))]))),128))])):e.createCommentVNode("v-if",!0)],64))),128)),l.value.length?e.createCommentVNode("v-if",!0):(e.openBlock(),e.createElementBlock("div",_t,"暂无配置项(等待插件注册…)"))])]),e.createElementVNode("div",{class:"modal-footer"},[e.createElementVNode("button",{class:"btn-secondary",onClick:K},"撤销"),e.createElementVNode("button",{class:"btn-primary",onClick:R},"保存设置")])])]))}},[["__scopeId","data-v-41699918"]]),er={class:"modal-content sys-modal"},nr={class:"modal-header"},tr={class:"modal-body"},rr={key:0,class:"loading"},lr={key:1,class:"sys-info"},or={class:"info-row"},ar={class:"info-row"},sr={class:"info-row"},ir={class:"info-row"},cr={class:"info-row"},dr={class:"info-row"},pr={class:"modal-footer"},mr=O({__name:"SystemModal",emits:["close"],setup(r,{emit:t}){const n=e.ref(!0),o=e.ref({});return e.onMounted(async()=>{try{o.value=await A.apiGet("/system/info")}catch{}n.value=!1}),(l,a)=>(e.openBlock(),e.createElementBlock("div",{class:"modal-overlay",onClick:a[2]||(a[2]=e.withModifiers(s=>l.$emit("close"),["self"]))},[e.createElementVNode("div",er,[e.createElementVNode("div",nr,[a[3]||(a[3]=e.createElementVNode("h2",null,"ℹ 系统信息",-1)),e.createElementVNode("button",{class:"modal-close",onClick:a[0]||(a[0]=s=>l.$emit("close"))},"×")]),e.createElementVNode("div",tr,[n.value?(e.openBlock(),e.createElementBlock("div",rr,"加载中...")):(e.openBlock(),e.createElementBlock("div",lr,[e.createElementVNode("div",or,[a[4]||(a[4]=e.createElementVNode("label",null,"主机名",-1)),e.createElementVNode("span",null,e.toDisplayString(o.value.hostname),1)]),e.createElementVNode("div",ar,[a[5]||(a[5]=e.createElementVNode("label",null,"当前目录",-1)),e.createElementVNode("span",null,e.toDisplayString(o.value.cwd),1)]),e.createElementVNode("div",sr,[a[6]||(a[6]=e.createElementVNode("label",null,"操作系统",-1)),e.createElementVNode("span",null,e.toDisplayString(o.value.os),1)]),e.createElementVNode("div",ir,[a[7]||(a[7]=e.createElementVNode("label",null,"Go 版本",-1)),e.createElementVNode("span",null,e.toDisplayString(o.value.goos),1)]),e.createElementVNode("div",cr,[a[8]||(a[8]=e.createElementVNode("label",null,"工作区",-1)),e.createElementVNode("span",null,e.toDisplayString(o.value.workspace),1)]),e.createElementVNode("div",dr,[a[9]||(a[9]=e.createElementVNode("label",null,"文件夹",-1)),e.createElementVNode("span",null,e.toDisplayString((o.value.folders||[]).join(", ")),1)])]))]),e.createElementVNode("div",pr,[e.createElementVNode("button",{class:"btn-secondary",onClick:a[1]||(a[1]=s=>l.$emit("close"))},"关闭")])])]))}},[["__scopeId","data-v-c27b6ec9"]]),gr={class:"modal-content source-modal"},kr={class:"modal-header"},hr={class:"modal-footer"},fr=O({__name:"SourceModal",emits:["close"],setup(r){return(t,n)=>(e.openBlock(),e.createElementBlock("div",{class:"modal-overlay",onClick:n[2]||(n[2]=e.withModifiers(o=>t.$emit("close"),["self"]))},[e.createElementVNode("div",gr,[e.createElementVNode("div",kr,[n[3]||(n[3]=e.createElementVNode("h2",null,"⎔ 源代码管理",-1)),e.createElementVNode("button",{class:"modal-close",onClick:n[0]||(n[0]=o=>t.$emit("close"))},"×")]),n[4]||(n[4]=e.createElementVNode("div",{class:"modal-body"},[e.createElementVNode("p",{style:{color:"var(--text-muted)","text-align":"center","margin-top":"40px"}},[e.createTextVNode(" Git 集成开发中"),e.createElementVNode("br"),e.createElementVNode("br"),e.createTextVNode(" 功能规划:"),e.createElementVNode("br"),e.createTextVNode(" · Git 状态查看"),e.createElementVNode("br"),e.createTextVNode(" · 暂存/提交/推送"),e.createElementVNode("br"),e.createTextVNode(" · 分支管理"),e.createElementVNode("br"),e.createTextVNode(" · Diff 对比 ")])],-1)),e.createElementVNode("div",hr,[e.createElementVNode("button",{class:"btn-secondary",onClick:n[1]||(n[1]=o=>t.$emit("close"))},"关闭")])])]))}},[["__scopeId","data-v-2e060397"]]),yr=`# 功能介绍
1
+ var UiModals=(function(J,e,b,Ve,M){"use strict";var Ml=Object.defineProperty;var Dl=(J,e,b)=>e in J?Ml(J,e,{enumerable:!0,configurable:!0,writable:!0,value:b}):J[e]=b;var P=(J,e,b)=>Dl(J,typeof e!="symbol"?e+"":e,b);var ie;const U=(r,t)=>{const n=r.__vccOpts||r;for(const[o,l]of t)n[o]=l;return n},Ue=["width","height"],je={key:0,d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"},D=U({__name:"SvgIcon",props:{name:{type:String,required:!0},size:{type:Number,default:16}},setup(r){return(t,n)=>(e.openBlock(),e.createElementBlock("svg",{class:"svg-icon",width:r.size,height:r.size,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[e.createCommentVNode(" Folder "),r.name==="folder"?(e.openBlock(),e.createElementBlock("path",je)):r.name==="folder-open"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createCommentVNode(" Folder Open "),n[0]||(n[0]=e.createElementVNode("path",{d:"M6 17l-3-9h18l-3 9H6z"},null,-1)),n[1]||(n[1]=e.createElementVNode("path",{d:"M4 8V5a2 2 0 0 1 2-2h5l2 3h7a2 2 0 0 1 2 2v3"},null,-1))],64)):r.name==="file"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:2},[e.createCommentVNode(" File "),n[2]||(n[2]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[3]||(n[3]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1))],64)):r.name==="file-code"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:3},[e.createCommentVNode(" File Code "),n[4]||(n[4]=e.createStaticVNode('<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" data-v-faf69761></path><polyline points="14 2 14 8 20 8" data-v-faf69761></polyline><line x1="10" y1="12" x2="8" y2="14" data-v-faf69761></line><line x1="10" y1="16" x2="8" y2="18" data-v-faf69761></line><line x1="14" y1="12" x2="16" y2="14" data-v-faf69761></line><line x1="14" y1="16" x2="16" y2="18" data-v-faf69761></line>',6))],64)):r.name==="file-text"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:4},[e.createCommentVNode(" File Text / Document "),n[5]||(n[5]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[6]||(n[6]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[7]||(n[7]=e.createElementVNode("line",{x1:"9",y1:"13",x2:"15",y2:"13"},null,-1)),n[8]||(n[8]=e.createElementVNode("line",{x1:"9",y1:"17",x2:"15",y2:"17"},null,-1))],64)):r.name==="search"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:5},[e.createCommentVNode(" Search "),n[9]||(n[9]=e.createElementVNode("circle",{cx:"11",cy:"11",r:"8"},null,-1)),n[10]||(n[10]=e.createElementVNode("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"},null,-1))],64)):r.name==="terminal"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:6},[e.createCommentVNode(" Terminal / Console "),n[11]||(n[11]=e.createElementVNode("polyline",{points:"4 17 10 11 4 5"},null,-1)),n[12]||(n[12]=e.createElementVNode("line",{x1:"12",y1:"19",x2:"20",y2:"19"},null,-1))],64)):r.name==="chat"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:7},[e.createCommentVNode(" Chat / Message "),n[13]||(n[13]=e.createElementVNode("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"},null,-1))],64)):r.name==="settings"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:8},[e.createCommentVNode(" Gear / Settings "),n[14]||(n[14]=e.createElementVNode("circle",{cx:"12",cy:"12",r:"3"},null,-1)),n[15]||(n[15]=e.createElementVNode("path",{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"},null,-1))],64)):r.name==="home"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:9},[e.createCommentVNode(" Home "),n[16]||(n[16]=e.createElementVNode("path",{d:"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"},null,-1)),n[17]||(n[17]=e.createElementVNode("polyline",{points:"9 22 9 12 15 12 15 22"},null,-1))],64)):r.name==="chevron-right"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:10},[e.createCommentVNode(" Chevron Right "),n[18]||(n[18]=e.createElementVNode("polyline",{points:"9 6 15 12 9 18"},null,-1))],64)):r.name==="chevron-down"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:11},[e.createCommentVNode(" Chevron Down (Rotated chevron-right) "),n[19]||(n[19]=e.createElementVNode("polyline",{points:"6 9 12 15 18 9"},null,-1))],64)):r.name==="plus"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:12},[e.createCommentVNode(" Plus / Add "),n[20]||(n[20]=e.createElementVNode("line",{x1:"12",y1:"5",x2:"12",y2:"19"},null,-1)),n[21]||(n[21]=e.createElementVNode("line",{x1:"5",y1:"12",x2:"19",y2:"12"},null,-1))],64)):r.name==="close"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:13},[e.createCommentVNode(" Close / X "),n[22]||(n[22]=e.createElementVNode("line",{x1:"18",y1:"6",x2:"6",y2:"18"},null,-1)),n[23]||(n[23]=e.createElementVNode("line",{x1:"6",y1:"6",x2:"18",y2:"18"},null,-1))],64)):r.name==="refresh"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:14},[e.createCommentVNode(" Refresh "),n[24]||(n[24]=e.createElementVNode("polyline",{points:"23 4 23 10 17 10"},null,-1)),n[25]||(n[25]=e.createElementVNode("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"},null,-1))],64)):r.name==="drive"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:15},[e.createCommentVNode(" Hard Drive / Disk "),n[26]||(n[26]=e.createElementVNode("line",{x1:"22",y1:"12",x2:"2",y2:"12"},null,-1)),n[27]||(n[27]=e.createElementVNode("path",{d:"M5.45 5.11L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z"},null,-1)),n[28]||(n[28]=e.createElementVNode("line",{x1:"6",y1:"16",x2:"6.01",y2:"16"},null,-1)),n[29]||(n[29]=e.createElementVNode("line",{x1:"10",y1:"16",x2:"10.01",y2:"16"},null,-1))],64)):r.name==="source-control"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:16},[e.createCommentVNode(" Source Control / Git Branch "),n[30]||(n[30]=e.createElementVNode("line",{x1:"6",y1:"3",x2:"6",y2:"15"},null,-1)),n[31]||(n[31]=e.createElementVNode("circle",{cx:"18",cy:"6",r:"3"},null,-1)),n[32]||(n[32]=e.createElementVNode("circle",{cx:"6",cy:"18",r:"3"},null,-1)),n[33]||(n[33]=e.createElementVNode("path",{d:"M18 9a9 9 0 0 1-9 9"},null,-1))],64)):r.name==="git-branch"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:17},[e.createCommentVNode(" Git Branch "),n[34]||(n[34]=e.createElementVNode("line",{x1:"6",y1:"3",x2:"6",y2:"15"},null,-1)),n[35]||(n[35]=e.createElementVNode("circle",{cx:"18",cy:"6",r:"3"},null,-1)),n[36]||(n[36]=e.createElementVNode("circle",{cx:"6",cy:"18",r:"3"},null,-1)),n[37]||(n[37]=e.createElementVNode("path",{d:"M18 9a9 9 0 0 1-9 9"},null,-1))],64)):r.name==="git-pull"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:18},[e.createCommentVNode(" Git Pull "),n[38]||(n[38]=e.createStaticVNode('<circle cx="18" cy="18" r="3" data-v-faf69761></circle><circle cx="6" cy="6" r="3" data-v-faf69761></circle><path d="M13 6h3a2 2 0 0 1 2 2v7" data-v-faf69761></path><line x1="6" y1="18" x2="6" y2="9" data-v-faf69761></line><polyline points="9 9 6 6 3 9" data-v-faf69761></polyline>',5))],64)):r.name==="git-push"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:19},[e.createCommentVNode(" Git Push "),n[39]||(n[39]=e.createStaticVNode('<circle cx="18" cy="6" r="3" data-v-faf69761></circle><circle cx="6" cy="18" r="3" data-v-faf69761></circle><path d="M13 18h-2a2 2 0 0 1-2-2V9" data-v-faf69761></path><line x1="6" y1="6" x2="6" y2="15" data-v-faf69761></line><polyline points="9 15 6 18 3 15" data-v-faf69761></polyline>',5))],64)):r.name==="output"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:20},[e.createCommentVNode(" Output / Window "),n[40]||(n[40]=e.createElementVNode("rect",{x:"2",y:"3",width:"20",height:"14",rx:"2",ry:"2"},null,-1)),n[41]||(n[41]=e.createElementVNode("line",{x1:"8",y1:"21",x2:"16",y2:"21"},null,-1)),n[42]||(n[42]=e.createElementVNode("line",{x1:"12",y1:"17",x2:"12",y2:"21"},null,-1))],64)):r.name==="warning"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:21},[e.createCommentVNode(" Warning / Alert "),n[43]||(n[43]=e.createElementVNode("path",{d:"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"},null,-1)),n[44]||(n[44]=e.createElementVNode("line",{x1:"12",y1:"9",x2:"12",y2:"13"},null,-1)),n[45]||(n[45]=e.createElementVNode("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"},null,-1))],64)):r.name==="undo"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:22},[e.createCommentVNode(" Undo "),n[46]||(n[46]=e.createElementVNode("polyline",{points:"1 4 1 10 7 10"},null,-1)),n[47]||(n[47]=e.createElementVNode("path",{d:"M3.51 15a9 9 0 1 0 2.13-9.36L1 10"},null,-1))],64)):r.name==="redo"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:23},[e.createCommentVNode(" Redo "),n[48]||(n[48]=e.createElementVNode("polyline",{points:"23 4 23 10 17 10"},null,-1)),n[49]||(n[49]=e.createElementVNode("path",{d:"M20.49 15a9 9 0 1 1-2.12-9.36L23 10"},null,-1))],64)):r.name==="package"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:24},[e.createCommentVNode(" Package / Box / Store "),n[50]||(n[50]=e.createElementVNode("line",{x1:"16.5",y1:"9.4",x2:"7.5",y2:"4.21"},null,-1)),n[51]||(n[51]=e.createElementVNode("path",{d:"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"},null,-1)),n[52]||(n[52]=e.createElementVNode("polyline",{points:"3.27 6.96 12 12.01 20.73 6.96"},null,-1)),n[53]||(n[53]=e.createElementVNode("line",{x1:"12",y1:"22.08",x2:"12",y2:"12"},null,-1))],64)):r.name==="globe"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:25},[e.createCommentVNode(" Globe / External "),n[54]||(n[54]=e.createElementVNode("circle",{cx:"12",cy:"12",r:"10"},null,-1)),n[55]||(n[55]=e.createElementVNode("line",{x1:"2",y1:"12",x2:"22",y2:"12"},null,-1)),n[56]||(n[56]=e.createElementVNode("path",{d:"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"},null,-1))],64)):r.name==="cycle"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:26},[e.createCommentVNode(" Refresh / Cycle (for agent) "),n[57]||(n[57]=e.createElementVNode("polyline",{points:"23 4 23 10 17 10"},null,-1)),n[58]||(n[58]=e.createElementVNode("polyline",{points:"1 20 1 14 7 14"},null,-1)),n[59]||(n[59]=e.createElementVNode("path",{d:"M3.51 9a9 9 0 0 1 14.85-3.36L23 10"},null,-1)),n[60]||(n[60]=e.createElementVNode("path",{d:"M20.49 15a9 9 0 0 1-14.85 3.36L1 14"},null,-1))],64)):r.name==="send"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:27},[e.createCommentVNode(" Send (arrow up) "),n[61]||(n[61]=e.createElementVNode("line",{x1:"12",y1:"19",x2:"12",y2:"5"},null,-1)),n[62]||(n[62]=e.createElementVNode("polyline",{points:"5 12 12 5 19 12"},null,-1))],64)):r.name==="send-plane"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:28},[e.createCommentVNode(" Send Plane (paper airplane) "),n[63]||(n[63]=e.createElementVNode("line",{x1:"22",y1:"2",x2:"11",y2:"13"},null,-1)),n[64]||(n[64]=e.createElementVNode("polygon",{points:"22 2 15 22 11 13 2 9 22 2"},null,-1))],64)):r.name==="stop-dot"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:29},[e.createCommentVNode(" Stop Dot (pulsing circle) "),n[65]||(n[65]=e.createElementVNode("circle",{cx:"12",cy:"12",r:"6",class:"stop-pulse"},null,-1)),n[66]||(n[66]=e.createElementVNode("circle",{cx:"12",cy:"12",r:"10",class:"stop-pulse-ring"},null,-1))],64)):r.name==="wrench"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:30},[e.createCommentVNode(" Wrench / Tool "),n[67]||(n[67]=e.createElementVNode("path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"},null,-1))],64)):r.name==="database"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:31},[e.createCommentVNode(" Database "),n[68]||(n[68]=e.createElementVNode("ellipse",{cx:"12",cy:"5",rx:"9",ry:"3"},null,-1)),n[69]||(n[69]=e.createElementVNode("path",{d:"M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"},null,-1)),n[70]||(n[70]=e.createElementVNode("path",{d:"M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"},null,-1))],64)):r.name==="user"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:32},[e.createCommentVNode(" User / Person "),n[71]||(n[71]=e.createElementVNode("path",{d:"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"},null,-1)),n[72]||(n[72]=e.createElementVNode("circle",{cx:"12",cy:"7",r:"4"},null,-1))],64)):r.name==="info"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:33},[e.createCommentVNode(" Info "),n[73]||(n[73]=e.createElementVNode("circle",{cx:"12",cy:"12",r:"10"},null,-1)),n[74]||(n[74]=e.createElementVNode("line",{x1:"12",y1:"16",x2:"12",y2:"12"},null,-1)),n[75]||(n[75]=e.createElementVNode("line",{x1:"12",y1:"8",x2:"12.01",y2:"8"},null,-1))],64)):r.name==="lightbulb"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:34},[e.createCommentVNode(" Lightbulb / Suggestion "),n[76]||(n[76]=e.createElementVNode("path",{d:"M9 18h6"},null,-1)),n[77]||(n[77]=e.createElementVNode("path",{d:"M10 22h4"},null,-1)),n[78]||(n[78]=e.createElementVNode("path",{d:"M15.09 14c.18-.98.65-1.74 1.41-2.5A4.65 4.65 0 0 0 18 8 6 6 0 0 0 6 8c0 1 .23 2.23 1.5 3.5A4.61 4.61 0 0 1 8.91 14"},null,-1))],64)):r.name==="sparkles"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:35},[e.createCommentVNode(" Sparkles / Auto "),n[79]||(n[79]=e.createStaticVNode('<path d="M13.5 4L15 8l4 .5L15 12l1.5 4-4-2-4 2L10 12l-4-3.5L10 8z" data-v-faf69761></path><line x1="3" y1="18" x2="3" y2="21" data-v-faf69761></line><line x1="21" y1="18" x2="21" y2="21" data-v-faf69761></line><line x1="7" y1="20" x2="11" y2="20" data-v-faf69761></line><line x1="17" y1="20" x2="19" y2="20" data-v-faf69761></line>',5))],64)):r.name==="bot"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:36},[e.createCommentVNode(" Bot / AI "),n[80]||(n[80]=e.createStaticVNode('<rect x="3" y="11" width="18" height="10" rx="2" data-v-faf69761></rect><circle cx="12" cy="5" r="2" data-v-faf69761></circle><path d="M12 7v4" data-v-faf69761></path><line x1="8" y1="16" x2="8" y2="16" data-v-faf69761></line><line x1="16" y1="16" x2="16" y2="16" data-v-faf69761></line>',5))],64)):r.name==="file-js"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:37},[e.createCommentVNode(" File Type Icons "),n[81]||(n[81]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[82]||(n[82]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[83]||(n[83]=e.createElementVNode("text",{x:"8",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"JS",-1))],64)):r.name==="file-ts"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:38},[n[84]||(n[84]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[85]||(n[85]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[86]||(n[86]=e.createElementVNode("text",{x:"8",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"TS",-1))],64)):r.name==="file-go"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:39},[n[87]||(n[87]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[88]||(n[88]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[89]||(n[89]=e.createElementVNode("text",{x:"9",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"Go",-1))],64)):r.name==="file-py"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:40},[n[90]||(n[90]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[91]||(n[91]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[92]||(n[92]=e.createElementVNode("text",{x:"7",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"Py",-1))],64)):r.name==="file-java"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:41},[n[93]||(n[93]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[94]||(n[94]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[95]||(n[95]=e.createElementVNode("text",{x:"6",y:"17","font-size":"8",fill:"currentColor","font-weight":"bold",stroke:"none"},"Java",-1))],64)):r.name==="file-html"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:42},[n[96]||(n[96]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[97]||(n[97]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[98]||(n[98]=e.createElementVNode("text",{x:"6",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"HTML",-1))],64)):r.name==="file-css"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:43},[n[99]||(n[99]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[100]||(n[100]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[101]||(n[101]=e.createElementVNode("text",{x:"7",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"CSS",-1))],64)):r.name==="file-json"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:44},[n[102]||(n[102]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[103]||(n[103]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[104]||(n[104]=e.createElementVNode("text",{x:"5",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"{ }",-1))],64)):r.name==="file-md"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:45},[n[105]||(n[105]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[106]||(n[106]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[107]||(n[107]=e.createElementVNode("text",{x:"7",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"MD",-1))],64)):r.name==="file-vue"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:46},[n[108]||(n[108]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[109]||(n[109]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[110]||(n[110]=e.createElementVNode("text",{x:"7",y:"17","font-size":"9",fill:"currentColor","font-weight":"bold",stroke:"none"},"Vue",-1))],64)):r.name==="copy"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:47},[e.createCommentVNode(" Copy "),n[111]||(n[111]=e.createElementVNode("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"},null,-1)),n[112]||(n[112]=e.createElementVNode("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"},null,-1))],64)):r.name==="minus"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:48},[e.createCommentVNode(" Minus "),n[113]||(n[113]=e.createElementVNode("line",{x1:"5",y1:"12",x2:"19",y2:"12"},null,-1))],64)):r.name==="edit"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:49},[e.createCommentVNode(" Edit / Rename "),n[114]||(n[114]=e.createElementVNode("path",{d:"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"},null,-1)),n[115]||(n[115]=e.createElementVNode("path",{d:"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"},null,-1))],64)):r.name==="trash"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:50},[e.createCommentVNode(" Trash / Delete "),n[116]||(n[116]=e.createElementVNode("polyline",{points:"3 6 5 6 21 6"},null,-1)),n[117]||(n[117]=e.createElementVNode("path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"},null,-1))],64)):r.name==="file-plus"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:51},[e.createCommentVNode(" File Plus / New File "),n[118]||(n[118]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[119]||(n[119]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[120]||(n[120]=e.createElementVNode("line",{x1:"12",y1:"18",x2:"12",y2:"12"},null,-1)),n[121]||(n[121]=e.createElementVNode("line",{x1:"9",y1:"15",x2:"15",y2:"15"},null,-1))],64)):r.name==="message-square"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:52},[e.createCommentVNode(" Folder Plus / New Folder "),n[122]||(n[122]=e.createElementVNode("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"},null,-1))],64)):r.name==="folder-plus"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:53},[n[123]||(n[123]=e.createElementVNode("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2v3"},null,-1)),n[124]||(n[124]=e.createElementVNode("line",{x1:"12",y1:"11",x2:"12",y2:"17"},null,-1)),n[125]||(n[125]=e.createElementVNode("line",{x1:"9",y1:"14",x2:"15",y2:"14"},null,-1))],64)):r.name==="brain"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:54},[e.createCommentVNode(" Brain / Thinking "),n[126]||(n[126]=e.createElementVNode("path",{d:"M12 2a4 4 0 0 0-4 4v1a5 5 0 0 0-5 5v1a4 4 0 0 0 3 3.87V17a3 3 0 0 0 3 3h6a3 3 0 0 0 3-3v-.13A4 4 0 0 0 21 13v-1a5 5 0 0 0-5-5V6a4 4 0 0 0-4-4z"},null,-1)),n[127]||(n[127]=e.createElementVNode("path",{d:"M9 12v2"},null,-1)),n[128]||(n[128]=e.createElementVNode("path",{d:"M15 12v2"},null,-1)),n[129]||(n[129]=e.createElementVNode("path",{d:"M12 9v5"},null,-1))],64)):r.name==="check"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:55},[e.createCommentVNode(" Check / Success "),n[130]||(n[130]=e.createElementVNode("polyline",{points:"20 6 9 17 4 12"},null,-1))],64)):r.name==="clock"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:56},[e.createCommentVNode(" Clock / Pending "),n[131]||(n[131]=e.createElementVNode("circle",{cx:"12",cy:"12",r:"10"},null,-1)),n[132]||(n[132]=e.createElementVNode("polyline",{points:"12 6 12 12 16 14"},null,-1))],64)):r.name==="help"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:57},[e.createCommentVNode(" Help / Question "),n[133]||(n[133]=e.createElementVNode("circle",{cx:"12",cy:"12",r:"10"},null,-1)),n[134]||(n[134]=e.createElementVNode("path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"},null,-1)),n[135]||(n[135]=e.createElementVNode("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"},null,-1))],64)):r.name==="shield"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:58},[e.createCommentVNode(" Shield / Approval "),n[136]||(n[136]=e.createElementVNode("path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"},null,-1))],64)):r.name==="shield-off"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:59},[e.createCommentVNode(" Shield Off / No Review "),n[137]||(n[137]=e.createElementVNode("path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"},null,-1)),n[138]||(n[138]=e.createElementVNode("line",{x1:"4",y1:"4",x2:"20",y2:"20",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round"},null,-1))],64)):r.name==="code"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:60},[e.createCommentVNode(" Code / Brackets "),n[139]||(n[139]=e.createElementVNode("polyline",{points:"16 18 22 12 16 6"},null,-1)),n[140]||(n[140]=e.createElementVNode("polyline",{points:"8 6 2 12 8 18"},null,-1))],64)):r.name==="list"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:61},[e.createCommentVNode(" List / Menu "),n[141]||(n[141]=e.createStaticVNode('<line x1="8" y1="6" x2="21" y2="6" data-v-faf69761></line><line x1="8" y1="12" x2="21" y2="12" data-v-faf69761></line><line x1="8" y1="18" x2="21" y2="18" data-v-faf69761></line><line x1="3" y1="6" x2="3.01" y2="6" data-v-faf69761></line><line x1="3" y1="12" x2="3.01" y2="12" data-v-faf69761></line><line x1="3" y1="18" x2="3.01" y2="18" data-v-faf69761></line>',6))],64)):r.name==="layers"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:62},[e.createCommentVNode(" Layers / Stack / Context "),n[142]||(n[142]=e.createElementVNode("polygon",{points:"12 2 2 7 12 12 22 7 12 2"},null,-1)),n[143]||(n[143]=e.createElementVNode("polyline",{points:"2 17 12 22 22 17"},null,-1)),n[144]||(n[144]=e.createElementVNode("polyline",{points:"2 12 12 17 22 12"},null,-1))],64)):r.name==="eye"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:63},[e.createCommentVNode(" Eye / Show "),n[145]||(n[145]=e.createElementVNode("path",{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"},null,-1)),n[146]||(n[146]=e.createElementVNode("circle",{cx:"12",cy:"12",r:"3"},null,-1))],64)):r.name==="eye-off"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:64},[e.createCommentVNode(" Eye Off / Hide "),n[147]||(n[147]=e.createElementVNode("path",{d:"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94"},null,-1)),n[148]||(n[148]=e.createElementVNode("path",{d:"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19"},null,-1)),n[149]||(n[149]=e.createElementVNode("line",{x1:"1",y1:"1",x2:"23",y2:"23"},null,-1))],64)):r.name==="bug"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:65},[e.createCommentVNode(" Bug "),n[150]||(n[150]=e.createStaticVNode('<rect x="8" y="2" width="8" height="4" rx="1" ry="1" data-v-faf69761></rect><path d="M20 12h-3a5 5 0 0 1-5 5 5 5 0 0 1-5-5H4" data-v-faf69761></path><path d="M4 8h16" data-v-faf69761></path><path d="M12 2v7" data-v-faf69761></path><path d="M9 17l-3 4" data-v-faf69761></path><path d="M15 17l3 4" data-v-faf69761></path>',6))],64)):r.name==="check-circle"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:66},[e.createCommentVNode(" Check Circle "),n[151]||(n[151]=e.createElementVNode("path",{d:"M22 11.08V12a10 10 0 1 1-5.93-9.14"},null,-1)),n[152]||(n[152]=e.createElementVNode("polyline",{points:"22 4 12 14.01 9 11.01"},null,-1))],64)):r.name==="book-open"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:67},[e.createCommentVNode(" Book Open / Documentation "),n[153]||(n[153]=e.createElementVNode("path",{d:"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"},null,-1)),n[154]||(n[154]=e.createElementVNode("path",{d:"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"},null,-1))],64)):r.name==="tool"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:68},[e.createCommentVNode(" Tool / Wrench alternate "),n[155]||(n[155]=e.createElementVNode("path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"},null,-1))],64)):r.name==="keyboard"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:69},[e.createCommentVNode(" Keyboard "),n[156]||(n[156]=e.createStaticVNode('<rect x="2" y="4" width="20" height="16" rx="2" ry="2" data-v-faf69761></rect><line x1="6" y1="8" x2="6.01" y2="8" data-v-faf69761></line><line x1="10" y1="8" x2="10.01" y2="8" data-v-faf69761></line><line x1="14" y1="8" x2="14.01" y2="8" data-v-faf69761></line><line x1="18" y1="8" x2="18.01" y2="8" data-v-faf69761></line><line x1="6" y1="12" x2="6.01" y2="12" data-v-faf69761></line><line x1="10" y1="12" x2="10.01" y2="12" data-v-faf69761></line><line x1="14" y1="12" x2="14.01" y2="12" data-v-faf69761></line><line x1="18" y1="12" x2="18.01" y2="12" data-v-faf69761></line><line x1="6" y1="16" x2="18" y2="16" data-v-faf69761></line>',10))],64)):r.name==="chevron-left"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:70},[e.createCommentVNode(" Chevron Left "),n[157]||(n[157]=e.createElementVNode("polyline",{points:"15 6 9 12 15 18"},null,-1))],64)):r.name==="grid"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:71},[e.createCommentVNode(" Grid / App Grid "),n[158]||(n[158]=e.createElementVNode("rect",{x:"3",y:"3",width:"7",height:"7"},null,-1)),n[159]||(n[159]=e.createElementVNode("rect",{x:"14",y:"3",width:"7",height:"7"},null,-1)),n[160]||(n[160]=e.createElementVNode("rect",{x:"14",y:"14",width:"7",height:"7"},null,-1)),n[161]||(n[161]=e.createElementVNode("rect",{x:"3",y:"14",width:"7",height:"7"},null,-1))],64)):r.name==="puzzle"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:72},[e.createCommentVNode(" Puzzle / 插件 "),n[162]||(n[162]=e.createElementVNode("path",{d:"M4 7h3a2 2 0 0 1 4 0h9v9h-3a2 2 0 0 0-4 0H4z"},null,-1)),n[163]||(n[163]=e.createElementVNode("path",{d:"M11 7v9"},null,-1))],64)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:73},[n[164]||(n[164]=e.createElementVNode("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},null,-1)),n[165]||(n[165]=e.createElementVNode("polyline",{points:"14 2 14 8 20 8"},null,-1)),n[166]||(n[166]=e.createElementVNode("line",{x1:"9",y1:"13",x2:"15",y2:"13"},null,-1)),n[167]||(n[167]=e.createElementVNode("line",{x1:"9",y1:"17",x2:"15",y2:"17"},null,-1))],64))],8,Ue))}},[["__scopeId","data-v-faf69761"]]),He={class:"me-field"},qe={class:"me-label"},We={class:"me-editor"},Je={class:"me-input-row"},Ke=["placeholder","onKeydown"],Ze={class:"me-tags"},Qe={key:0,class:"me-empty"},Xe=["onClick"],Ne=U({__name:"ModelEditor",props:{models:{type:Array,default:()=>[]},label:{type:String,default:"可用模型(回车或逗号分隔添加;支持整段粘贴)"},placeholder:{type:String,default:"输入模型名,回车添加…"}},emits:["change"],setup(r,{emit:t}){const n=r,o=t,l=e.ref(""),a=e.ref([...n.models]);e.watch(()=>n.models,h=>{a.value=[...h]});function s(){const h=l.value.split(/[\n,,]/).map(x=>x.trim()).filter(Boolean);let g=!1;for(const x of h)a.value.includes(x)||(a.value.push(x),g=!0);g&&o("change",[...a.value]),l.value=""}function d(h){const g=(h.clipboardData||window.clipboardData).getData("text");if(/[,\n,]/.test(g)){h.preventDefault();const x=g.split(/[\n,,]/).map(B=>B.trim()).filter(Boolean);let N=!1;for(const B of x)a.value.includes(B)||(a.value.push(B),N=!0);N&&o("change",[...a.value]),l.value=""}}function i(h){a.value.splice(h,1),o("change",[...a.value])}return(h,g)=>(e.openBlock(),e.createElementBlock("div",He,[e.createElementVNode("span",qe,e.toDisplayString(r.label),1),e.createElementVNode("div",We,[e.createElementVNode("div",Je,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":g[0]||(g[0]=x=>l.value=x),class:"me-input",placeholder:r.placeholder,onKeydown:e.withKeys(e.withModifiers(s,["prevent"]),["enter"]),onPaste:d},null,40,Ke),[[e.vModelText,l.value]]),e.createElementVNode("button",{class:"me-btn",onClick:s},"添加")]),e.createElementVNode("div",Ze,[a.value.length?e.createCommentVNode("v-if",!0):(e.openBlock(),e.createElementBlock("span",Qe,"暂无模型——添加后 AI tab 的模型下拉会按服务商显示")),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,(x,N)=>(e.openBlock(),e.createElementBlock("span",{key:x+N,class:"me-tag"},[e.createTextVNode(e.toDisplayString(x)+" ",1),e.createElementVNode("button",{class:"me-x",title:"移除",onClick:B=>i(N)},"×",8,Xe)]))),128))])])]))}},[["__scopeId","data-v-a5e576a7"]]),Ye={class:"provider-manager"},_e={class:"pm-toolbar"},ve={class:"pm-count"},en={key:0,class:"pm-edit"},nn={class:"pm-field"},tn={class:"pm-field"},rn={class:"pm-field"},on={class:"pm-field-label"},ln=["title"],an=["value"],sn={key:0,class:"pm-protocol-hint"},cn={class:"pm-field"},dn={class:"pm-params"},pn={key:0,class:"pm-param-rows"},mn=["title"],gn=["title"],kn=["onUpdate:modelValue"],hn=["onUpdate:modelValue","title"],fn=["value"],yn=["onUpdate:modelValue","min","step","placeholder","title"],un=["onUpdate:modelValue","placeholder","title"],En={key:1,class:"pm-params-empty"},bn={class:"pm-edit-actions"},xn=["disabled"],Vn={key:1,class:"pm-cards"},Nn={key:0,class:"pm-edit"},wn={class:"pm-edit-title"},Tn={class:"pm-field"},Bn=["value"],Sn={class:"pm-field"},Cn={class:"pm-field"},In={class:"pm-field-label"},An=["title"],Pn=["value"],$n={key:0,class:"pm-protocol-hint"},Mn={class:"pm-field"},Dn={class:"pm-params"},Rn={key:0,class:"pm-param-rows"},Ln=["title"],Gn=["title"],Fn=["onUpdate:modelValue"],On=["onUpdate:modelValue","title"],zn=["value"],Un=["onUpdate:modelValue","min","step","placeholder","title"],jn=["onUpdate:modelValue","placeholder","title"],Hn={key:1,class:"pm-params-empty"},qn={class:"pm-edit-actions"},Wn=["disabled"],Jn={key:1,class:"pm-card"},Kn={class:"pm-card-head"},Zn=["title"],Qn={class:"pm-ops"},Xn=["onClick"],Yn=["onClick"],_n=["title"],vn=["title"],et={class:"pm-ctx"},nt={class:"pm-models"},tt={key:0,class:"pm-none"},rt={key:1,class:"pm-params-summary"},ot={key:2,class:"pm-empty"},lt={key:3,class:"pm-error"},at=U({__name:"ProviderManager",props:{modelParamFields:{type:Array,default:()=>[]},modelEditor:{type:Object,default:()=>({})},protocolLabel:{type:String,default:"LLM 协议"},protocolOptions:{type:Array,default:()=>[]},protocolHint:{type:String,default:""}},emits:["saved"],setup(r,{emit:t}){const n=t,o=r,l=e.ref([]),a=e.ref(""),s=e.ref({name:"",baseURL:"",contextMaxTokens:0}),d=e.ref([]),i=e.ref({}),h=e.ref(""),g=e.ref(!1);function x(){const V={};for(const f of o.modelParamFields)f.type==="checkbox"?V[f.name]=!1:f.type==="number"?V[f.name]=0:V[f.name]="";return V}function N(V){const f=b.state.settings&&b.state.settings.modelParams||{};return JSON.parse(JSON.stringify(f[V]||{}))}async function B(){try{const V=await M.getModels();l.value=(V.providers||[]).map(f=>({name:f,baseURL:(V.providerBaseURLs||{})[f]||"",contextMaxTokens:(V.providerContexts||{})[f]||0,protocol:(V.providerProtocols||{})[f]||"",models:(V.models||{})[f]||[]})),h.value=""}catch(V){h.value="加载服务商失败: "+(V.message||V)}}e.onMounted(B);function y(){a.value="__new__",s.value={name:"",baseURL:"",contextMaxTokens:0,protocol:""},d.value=[],i.value={},h.value=""}function T(V){a.value=V.name,s.value={name:V.name,baseURL:V.baseURL,contextMaxTokens:V.contextMaxTokens||0,protocol:V.protocol||""},d.value=[...V.models||[]];const f=N(V.name),m=x();for(const p of d.value)f[p]||(f[p]={...m});i.value=f,h.value=""}function C(V){const f={...i.value},m=x();for(const p of V)f[p]||(f[p]={...m});for(const p of Object.keys(f))V.includes(p)||delete f[p];i.value=f,d.value=V}function $(){a.value="",h.value=""}function R(){const V={};for(const f of l.value)V[f.name]={baseURL:f.baseURL,models:f.models,contextMaxTokens:f.contextMaxTokens||0,protocol:f.protocol||""};return V}async function O(){const V=s.value.name.trim()||(a.value!=="__new__"?a.value:"");if(!V){h.value="服务商名称不能为空";return}const f=R();if(a.value==="__new__"&&f[V]){h.value=`服务商「${V}」已存在`;return}f[V]={baseURL:s.value.baseURL.trim(),models:d.value,contextMaxTokens:Math.max(0,Number(s.value.contextMaxTokens)||0),protocol:(s.value.protocol||"").trim()},g.value=!0;try{await M.saveModels(f),await W(V),a.value="",await B(),n("saved")}catch(m){h.value="保存失败: "+(m.message||m)}finally{g.value=!1}}async function W(V){let f={};try{const u=await M.apiGet("/settings");f=u&&u.settings||{}}catch{}const m=JSON.parse(JSON.stringify(f.modelParams||{})),p={};for(const[u,c]of Object.entries(i.value)){const E=c||{},w={};for(const A of o.modelParamFields){const L=E[A.name];A.type==="checkbox"?L===!0&&(w[A.name]=!0):A.type==="number"?Number(L)>0&&(w[A.name]=Number(L)):L!==""&&L!==void 0&&L!==null&&(w[A.name]=L)}Object.keys(w).length&&(p[u]=w)}Object.keys(p).length?m[V]=p:delete m[V];const k={...f,modelParams:m};await M.apiPut("/settings",{settings:k,pluginSettings:f.pluginSettings||{}}),b.state.settings=k}async function z(V){if(!window.confirm(`删除服务商「${V.name}」?
2
+ (AI tab 将不再可选该服务商)`))return;const f=R();delete f[V.name];try{await M.saveModels(f);let m={};try{const k=await M.apiGet("/settings");m=k&&k.settings||{}}catch{}const p=JSON.parse(JSON.stringify(m.modelParams||{}));if(p[V.name]){delete p[V.name];const k={...m,modelParams:p};await M.apiPut("/settings",{settings:k,pluginSettings:m.pluginSettings||{}}),b.state.settings=k}await B(),n("saved")}catch(m){h.value="删除失败: "+(m.message||m)}}function F(V){const m=(b.state.settings&&b.state.settings.modelParams||{})[V]||{},p=Object.keys(m).length;return p?"模型参数已配置 "+p+" 个":""}return(V,f)=>(e.openBlock(),e.createElementBlock("div",Ye,[e.createCommentVNode(" 工具栏 "),e.createElementVNode("div",_e,[e.createElementVNode("span",ve,e.toDisplayString(l.value.length)+" 个服务商",1),e.createElementVNode("button",{class:"pm-btn pm-primary",onClick:y},"+ 新增服务商")]),e.createCommentVNode(" 新增表单(工具栏下方展开,紧邻按钮不跳动) "),a.value==="__new__"?(e.openBlock(),e.createElementBlock("div",en,[f[11]||(f[11]=e.createElementVNode("div",{class:"pm-edit-title"},"新增服务商",-1)),e.createElementVNode("div",nn,[f[7]||(f[7]=e.createElementVNode("span",{class:"pm-field-label"},"服务商名称",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":f[0]||(f[0]=m=>s.value.name=m),placeholder:"如 deepseek"},null,512),[[e.vModelText,s.value.name]])]),e.createElementVNode("div",tn,[f[8]||(f[8]=e.createElementVNode("span",{class:"pm-field-label"},"API URL(基础地址或完整端点)",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":f[1]||(f[1]=m=>s.value.baseURL=m),placeholder:"https://api.deepseek.com/v1(基础地址;旧完整端点亦兼容)"},null,512),[[e.vModelText,s.value.baseURL]])]),e.createElementVNode("div",rn,[e.createElementVNode("span",on,e.toDisplayString(r.protocolLabel),1),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":f[2]||(f[2]=m=>s.value.protocol=m),title:r.protocolHint},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.protocolOptions,m=>(e.openBlock(),e.createElementBlock("option",{key:"p"+m,value:m},e.toDisplayString(m||"默认"),9,an))),128))],8,ln),[[e.vModelSelect,s.value.protocol]]),r.protocolHint?(e.openBlock(),e.createElementBlock("span",sn,e.toDisplayString(r.protocolHint),1)):e.createCommentVNode("v-if",!0)]),e.createElementVNode("div",cn,[f[9]||(f[9]=e.createElementVNode("span",{class:"pm-field-label"},"上下文大小(Token)",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":f[3]||(f[3]=m=>s.value.contextMaxTokens=m),type:"number",min:"0",step:"1000",placeholder:"0=不限制(模型级未配置时的默认窗口)"},null,512),[[e.vModelText,s.value.contextMaxTokens]])]),e.createVNode(Ne,{models:d.value,label:r.modelEditor.label||"可用模型(回车或逗号分隔添加;支持整段粘贴)",placeholder:r.modelEditor.placeholder||"输入模型名,回车添加…",onChange:C},null,8,["models","label","placeholder"]),e.createElementVNode("div",dn,[f[10]||(f[10]=e.createElementVNode("div",{class:"pm-params-title"},"模型参数(每模型独立配置;对话里也可临时切换思考档位)",-1)),d.value.length?(e.openBlock(),e.createElementBlock("div",pn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,m=>(e.openBlock(),e.createElementBlock("div",{key:m,class:"pm-param-row"},[e.createElementVNode("span",{class:"pm-param-model",title:m},e.toDisplayString(m),9,mn),e.createCommentVNode(" ★ 2026-08-21 schema 驱动:按 modelParamFields 动态渲染(checkbox/select/number/text) "),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.modelParamFields,p=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:p.name},[p.type==="checkbox"?(e.openBlock(),e.createElementBlock("label",{key:0,class:"pm-param-check",title:p.hint||p.label},[e.withDirectives(e.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":k=>i.value[m][p.name]=k},null,8,kn),[[e.vModelCheckbox,i.value[m][p.name]]]),e.createTextVNode(" "+e.toDisplayString(p.label),1)],8,gn)):p.type==="select"?e.withDirectives((e.openBlock(),e.createElementBlock("select",{key:1,"onUpdate:modelValue":k=>i.value[m][p.name]=k,title:p.hint||p.label},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.options||[],k=>(e.openBlock(),e.createElementBlock("option",{key:"o"+k,value:k},e.toDisplayString(k===""?p.label+"默认":k),9,fn))),128))],8,hn)),[[e.vModelSelect,i.value[m][p.name]]]):p.type==="number"?e.withDirectives((e.openBlock(),e.createElementBlock("input",{key:2,"onUpdate:modelValue":k=>i.value[m][p.name]=k,type:"number",min:p.min??0,step:p.step??1,placeholder:p.label,title:p.hint||p.label},null,8,yn)),[[e.vModelText,i.value[m][p.name],void 0,{number:!0}]]):e.withDirectives((e.openBlock(),e.createElementBlock("input",{key:3,"onUpdate:modelValue":k=>i.value[m][p.name]=k,type:"text",placeholder:p.label,title:p.hint||p.label},null,8,un)),[[e.vModelText,i.value[m][p.name]]])],64))),128))]))),128))])):(e.openBlock(),e.createElementBlock("div",En,"添加模型后,可逐模型配置参数(温度/思考/输出/上下文/多模态…)"))]),e.createElementVNode("div",bn,[e.createElementVNode("button",{class:"pm-btn pm-primary",disabled:g.value,onClick:O},e.toDisplayString(g.value?"保存中…":"保存服务商"),9,xn),e.createElementVNode("button",{class:"pm-btn",onClick:$},"取消")])])):e.createCommentVNode("v-if",!0),e.createCommentVNode(" 服务商卡片列表(编辑时在卡片位置就地展开表单,不跳顶) "),l.value.length?(e.openBlock(),e.createElementBlock("div",Vn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,m=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:m.name},[a.value===m.name?(e.openBlock(),e.createElementBlock("div",Nn,[e.createElementVNode("div",wn,"编辑服务商:"+e.toDisplayString(m.name),1),e.createElementVNode("div",Tn,[f[12]||(f[12]=e.createElementVNode("span",{class:"pm-field-label"},"服务商名称",-1)),e.createElementVNode("input",{value:m.name,disabled:""},null,8,Bn)]),e.createElementVNode("div",Sn,[f[13]||(f[13]=e.createElementVNode("span",{class:"pm-field-label"},"API URL(基础地址或完整端点)",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":f[4]||(f[4]=p=>s.value.baseURL=p),placeholder:"https://api.deepseek.com/v1(基础地址;旧完整端点亦兼容)"},null,512),[[e.vModelText,s.value.baseURL]])]),e.createElementVNode("div",Cn,[e.createElementVNode("span",In,e.toDisplayString(r.protocolLabel),1),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":f[5]||(f[5]=p=>s.value.protocol=p),title:r.protocolHint},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.protocolOptions,p=>(e.openBlock(),e.createElementBlock("option",{key:"p"+p,value:p},e.toDisplayString(p||"默认"),9,Pn))),128))],8,An),[[e.vModelSelect,s.value.protocol]]),r.protocolHint?(e.openBlock(),e.createElementBlock("span",$n,e.toDisplayString(r.protocolHint),1)):e.createCommentVNode("v-if",!0)]),e.createElementVNode("div",Mn,[f[14]||(f[14]=e.createElementVNode("span",{class:"pm-field-label"},"上下文大小(Token)",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":f[6]||(f[6]=p=>s.value.contextMaxTokens=p),type:"number",min:"0",step:"1000",placeholder:"0=不限制(模型级未配置时的默认窗口)"},null,512),[[e.vModelText,s.value.contextMaxTokens]])]),e.createVNode(Ne,{models:d.value,label:r.modelEditor.label||"可用模型(回车或逗号分隔添加;支持整段粘贴)",placeholder:r.modelEditor.placeholder||"输入模型名,回车添加…",onChange:C},null,8,["models","label","placeholder"]),e.createElementVNode("div",Dn,[f[15]||(f[15]=e.createElementVNode("div",{class:"pm-params-title"},"模型参数(每模型独立配置;对话里也可临时切换思考档位)",-1)),d.value.length?(e.openBlock(),e.createElementBlock("div",Rn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,p=>(e.openBlock(),e.createElementBlock("div",{key:p,class:"pm-param-row"},[e.createElementVNode("span",{class:"pm-param-model",title:p},e.toDisplayString(p),9,Ln),e.createCommentVNode(" ★ 2026-08-21 schema 驱动:按 modelParamFields 动态渲染(checkbox/select/number/text) "),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.modelParamFields,k=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:k.name},[k.type==="checkbox"?(e.openBlock(),e.createElementBlock("label",{key:0,class:"pm-param-check",title:k.hint||k.label},[e.withDirectives(e.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":u=>i.value[p][k.name]=u},null,8,Fn),[[e.vModelCheckbox,i.value[p][k.name]]]),e.createTextVNode(" "+e.toDisplayString(k.label),1)],8,Gn)):k.type==="select"?e.withDirectives((e.openBlock(),e.createElementBlock("select",{key:1,"onUpdate:modelValue":u=>i.value[p][k.name]=u,title:k.hint||k.label},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(k.options||[],u=>(e.openBlock(),e.createElementBlock("option",{key:"o"+u,value:u},e.toDisplayString(u===""?k.label+"默认":u),9,zn))),128))],8,On)),[[e.vModelSelect,i.value[p][k.name]]]):k.type==="number"?e.withDirectives((e.openBlock(),e.createElementBlock("input",{key:2,"onUpdate:modelValue":u=>i.value[p][k.name]=u,type:"number",min:k.min??0,step:k.step??1,placeholder:k.label,title:k.hint||k.label},null,8,Un)),[[e.vModelText,i.value[p][k.name],void 0,{number:!0}]]):e.withDirectives((e.openBlock(),e.createElementBlock("input",{key:3,"onUpdate:modelValue":u=>i.value[p][k.name]=u,type:"text",placeholder:k.label,title:k.hint||k.label},null,8,jn)),[[e.vModelText,i.value[p][k.name]]])],64))),128))]))),128))])):(e.openBlock(),e.createElementBlock("div",Hn,"添加模型后,可逐模型配置参数(温度/思考/输出/上下文/多模态…)"))]),e.createElementVNode("div",qn,[e.createElementVNode("button",{class:"pm-btn pm-primary",disabled:g.value,onClick:O},e.toDisplayString(g.value?"保存中…":"保存服务商"),9,Wn),e.createElementVNode("button",{class:"pm-btn",onClick:$},"取消")])])):(e.openBlock(),e.createElementBlock("div",Jn,[e.createElementVNode("div",Kn,[e.createElementVNode("span",{class:"pm-name",title:m.name},e.toDisplayString(m.name),9,Zn),e.createElementVNode("div",Qn,[e.createElementVNode("button",{class:"pm-btn pm-small",onClick:p=>T(m)},"编辑",8,Xn),e.createElementVNode("button",{class:"pm-btn pm-small pm-danger",onClick:p=>z(m)},"删除",8,Yn)])]),e.createElementVNode("div",{class:"pm-url",title:m.baseURL},e.toDisplayString(m.baseURL||"未配置 API URL"),9,_n),m.protocol?(e.openBlock(),e.createElementBlock("div",{key:0,class:"pm-protocol",title:r.protocolHint},"协议 "+e.toDisplayString(m.protocol),9,vn)):e.createCommentVNode("v-if",!0),e.createElementVNode("div",et,e.toDisplayString(m.contextMaxTokens>0?"上下文 "+(m.contextMaxTokens/1e3).toFixed(0)+"K Token":"上下文 未限制"),1),e.createElementVNode("div",nt,[m.models.length?e.createCommentVNode("v-if",!0):(e.openBlock(),e.createElementBlock("span",tt,"(未配置模型)")),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.models,p=>(e.openBlock(),e.createElementBlock("span",{key:p,class:"pm-tag"},e.toDisplayString(p),1))),128))]),F(m.name)?(e.openBlock(),e.createElementBlock("div",rt,e.toDisplayString(F(m.name)),1)):e.createCommentVNode("v-if",!0)]))],64))),128))])):a.value!=="__new__"?(e.openBlock(),e.createElementBlock("div",ot,"暂无服务商,点「+ 新增服务商」添加")):e.createCommentVNode("v-if",!0),h.value?(e.openBlock(),e.createElementBlock("div",lt,e.toDisplayString(h.value),1)):e.createCommentVNode("v-if",!0)]))}},[["__scopeId","data-v-4185f7bf"]]),st={class:"pm-manager"},it={class:"mgm-toolbar"},ct={class:"mgm-count"},dt={key:0,class:"mgm-edit"},pt={class:"mgm-edit-title"},mt={class:"mgm-field"},gt={class:"mgm-field-label"},kt={key:0,class:"mgm-required"},ht=["onUpdate:modelValue","onChange"],ft=["value"],yt=["onUpdate:modelValue","placeholder"],ut=["onUpdate:modelValue","placeholder"],Et={key:3,class:"mgm-field-hint"},bt={class:"mgm-edit-actions"},xt=["disabled"],Vt={key:1,class:"mgm-cards"},Nt={class:"mgm-card-head"},wt=["title"],Tt={key:0,class:"pm-active-badge"},Bt={class:"mgm-ops"},St=["disabled","onClick"],Ct=["onClick"],It=["onClick"],At={class:"pm-preview"},Pt={class:"pm-snap-row"},$t={class:"pm-snap-row"},Mt={key:2,class:"mgm-empty"},Dt={key:3,class:"mgm-error"},Rt=U({__name:"PresetManager",props:{presetFields:{type:Array,default:()=>[]}},emits:["saved"],setup(r,{expose:t,emit:n}){const o=r,l=n,a=e.ref({}),s=e.computed(()=>Object.keys(a.value||{})),d=e.ref(""),i=e.ref(!1),h=e.ref(""),g=e.ref(!1),x=e.ref(""),N=e.ref(""),B=e.ref(null),y=e.computed(()=>B.value&&B.value.providers||[]),T=e.ref({name:"",provider:"",baseURL:"",apiKey:""});function C(u={}){const c={name:"",provider:"",baseURL:"",apiKey:""};for(const E of o.presetFields)E.name in c||(c[E.name]="");return Object.assign(c,u)}function $(u){N.value=u,setTimeout(()=>{N.value===u&&(N.value="")},4e3)}async function R(){try{const[u,c,E]=await Promise.all([M.getAiPresets().catch(()=>({presets:{}})),M.apiGet("/settings").catch(()=>({settings:{}})),M.getModels().catch(()=>null)]);a.value=u&&u.presets||{},d.value=c&&c.settings&&c.settings.preset||"",B.value=E}catch(u){$("加载失败: "+(u.message||u))}}function O(u){const c=B.value||{};return{baseURL:c.providerBaseURLs&&c.providerBaseURLs[u]||"",models:c.models&&c.models[u]||[]}}function W(){const u=window&&window.__PAIRCODE_CORE&&window.__PAIRCODE_CORE.uiState&&window.__PAIRCODE_CORE.uiState.state&&window.__PAIRCODE_CORE.uiState.state.settings||{};let c={};u.preset&&a.value&&a.value[u.preset]&&(c=a.value[u.preset]);const E=c.provider||u.provider||y.value[0]||"",w=O(E);T.value=C({provider:E,baseURL:c.baseURL||u.baseURL||w.baseURL||"",apiKey:c.apiKey||""}),h.value="",i.value=!0}function z(u){const c=a.value&&a.value[u]||{};T.value=C({name:u,provider:c.provider||"",baseURL:c.baseURL||"",apiKey:c.apiKey||""}),h.value=u,i.value=!0}function F(){i.value=!1,h.value=""}function V(u){return u.source==="providers"?y.value||[]:u.options||[]}function f(u){if(u.name==="provider"&&T.value.provider){const c=O(T.value.provider);T.value.baseURL=c.baseURL||""}}e.watch(()=>T.value.provider,(u,c)=>{!i.value||c===""||u!==c&&f({name:"provider"})});async function m(){const u=T.value.name.trim();if(!u){$("请输入配置名称");return}const c=T.value.provider||"";if(!c){$("请选择服务商");return}for(const w of o.presetFields)if(w.required&&!T.value[w.name]){$("请填写"+w.label);return}const E=O(c);T.value.baseURL||(T.value.baseURL=E.baseURL||""),g.value=!0,N.value="";try{const w={provider:c,baseURL:T.value.baseURL,apiKey:T.value.apiKey};for(const A of o.presetFields)A.name!=="provider"&&A.name!=="apiKey"&&(w[A.name]=T.value[A.name]);if(h.value&&h.value!==u){const A={...a.value||{}};A[u]=w,delete A[h.value];const L=await M.saveAiPresets(A);if(!(L&&L.ok)){$(L&&L.error||"保存失败");return}a.value=A,d.value===h.value&&(d.value=u,await M.apiPut("/settings",{settings:{preset:u},pluginSettings:{}}).catch(()=>{}))}else{const A=await M.saveAiPreset("save",u,w);if(!(A&&A.ok)){$(A&&A.error||"保存失败");return}a.value=A.presets||a.value}F(),l("saved")}catch(w){$("保存失败: "+(w.message||w))}finally{g.value=!1}}async function p(u){x.value=u,N.value="";try{const c=await M.saveAiPreset("apply",u);c&&c.ok?(d.value=u,l("saved")):$(c&&c.error||"应用失败")}catch(c){$("应用失败: "+(c.message||c))}finally{x.value=""}}async function k(u){if(confirm("删除配置「"+u+"」?")){N.value="";try{const c=await M.saveAiPreset("delete",u);c&&c.ok?(a.value=c.presets||a.value,d.value===u&&(d.value=""),l("saved")):$(c&&c.error||"删除失败")}catch(c){$("删除失败: "+(c.message||c))}}}return e.onMounted(R),t({load:R}),(u,c)=>(e.openBlock(),e.createElementBlock("div",st,[e.createCommentVNode(" 工具栏 "),e.createElementVNode("div",it,[e.createElementVNode("span",ct,e.toDisplayString(s.value.length)+" 个配置",1),e.createElementVNode("button",{class:"mgm-btn mgm-primary",onClick:W,title:"添加一条 AI 配置(服务商 + API Key)"},"+ 添加新配置")]),e.createCommentVNode(" 添加 / 编辑表单(点击添加/编辑才弹出) "),i.value?(e.openBlock(),e.createElementBlock("div",dt,[e.createElementVNode("div",pt,e.toDisplayString(h.value?"编辑配置:"+h.value:"添加新配置"),1),e.createElementVNode("div",mt,[c[1]||(c[1]=e.createElementVNode("span",{class:"mgm-field-label"},"配置名称",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":c[0]||(c[0]=E=>T.value.name=E),type:"text",placeholder:"如:主力 / 写作备用…",onKeydown:e.withKeys(m,["enter"])},null,544),[[e.vModelText,T.value.name]])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.presetFields,E=>(e.openBlock(),e.createElementBlock("div",{key:E.name,class:"mgm-field"},[e.createElementVNode("span",gt,[e.createTextVNode(e.toDisplayString(E.label),1),E.required?(e.openBlock(),e.createElementBlock("span",kt,"*")):e.createCommentVNode("v-if",!0)]),e.createCommentVNode(" select 类型(服务商选择) "),E.type==="select"?e.withDirectives((e.openBlock(),e.createElementBlock("select",{key:0,"onUpdate:modelValue":w=>T.value[E.name]=w,class:"mgm-select",onChange:w=>f(E)},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(V(E),w=>(e.openBlock(),e.createElementBlock("option",{key:w,value:w},e.toDisplayString(w),9,ft))),128))],40,ht)),[[e.vModelSelect,T.value[E.name]]]):E.type==="password"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createCommentVNode(" password 类型(API Key) "),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":w=>T.value[E.name]=w,type:"password",placeholder:E.placeholder||""},null,8,yt),[[e.vModelText,T.value[E.name]]])],2112)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:2},[e.createCommentVNode(" text 兜底 "),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":w=>T.value[E.name]=w,type:"text",placeholder:E.placeholder||""},null,8,ut),[[e.vModelText,T.value[E.name]]])],2112)),E.hint?(e.openBlock(),e.createElementBlock("span",Et,e.toDisplayString(E.hint),1)):e.createCommentVNode("v-if",!0)]))),128)),e.createElementVNode("div",bt,[e.createElementVNode("button",{class:"mgm-btn mgm-primary",disabled:g.value,onClick:m},e.toDisplayString(g.value?"保存中…":"保存配置"),9,xt),e.createElementVNode("button",{class:"mgm-btn",onClick:F},"取消")])])):e.createCommentVNode("v-if",!0),e.createCommentVNode(" 配置卡片列表(主视图) "),s.value.length?(e.openBlock(),e.createElementBlock("div",Vt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.value,E=>(e.openBlock(),e.createElementBlock("div",{key:E,class:e.normalizeClass(["mgm-card",{"pm-active":E===d.value}])},[e.createElementVNode("div",Nt,[e.createElementVNode("span",{class:"mgm-name",title:E},[e.createTextVNode(e.toDisplayString(E),1),E===d.value?(e.openBlock(),e.createElementBlock("span",Tt,"使用中")):e.createCommentVNode("v-if",!0)],8,wt),e.createElementVNode("div",Bt,[e.createElementVNode("button",{class:"mgm-btn mgm-small",disabled:x.value===E,onClick:w=>p(E)},e.toDisplayString(x.value===E?"应用中…":"应用"),9,St),e.createElementVNode("button",{class:"mgm-btn mgm-small",onClick:w=>z(E)},"编辑",8,Ct),e.createElementVNode("button",{class:"mgm-btn mgm-small mgm-danger",onClick:w=>k(E)},"删除",8,It)])]),e.createElementVNode("div",At,[e.createElementVNode("div",Pt,[c[2]||(c[2]=e.createElementVNode("span",null,"服务商",-1)),e.createElementVNode("b",null,e.toDisplayString((a.value[E]||{}).provider||"—"),1)]),e.createElementVNode("div",$t,[c[3]||(c[3]=e.createElementVNode("span",null,"API Key",-1)),e.createElementVNode("b",null,e.toDisplayString((a.value[E]||{}).apiKey?"已配置":"未配置"),1)])])],2))),128))])):i.value?e.createCommentVNode("v-if",!0):(e.openBlock(),e.createElementBlock("div",Mt,[e.createElementVNode("div",{class:"mgm-empty-box"},[c[4]||(c[4]=e.createElementVNode("div",{class:"mgm-empty-title"},"还没有 AI 配置",-1)),c[5]||(c[5]=e.createElementVNode("div",{class:"mgm-empty-sub"},"添加一条服务商 + API Key,保存后即可在对话面板中选模型。",-1)),e.createElementVNode("button",{class:"mgm-btn mgm-primary",onClick:W},"+ 添加新配置")])])),N.value?(e.openBlock(),e.createElementBlock("div",Dt,e.toDisplayString(N.value),1)):e.createCommentVNode("v-if",!0)]))}},[["__scopeId","data-v-a1e0b542"]]),Lt={class:"modal-content"},Gt={class:"modal-body"},Ft={key:0,class:"settings-tabs"},Ot={key:0,class:"settings-tabs-filter-wrap"},zt=["onClick"],Ut={key:1,class:"settings-tabs-none"},jt={class:"settings-content"},Ht={key:0},qt={key:0,class:"group-title"},Wt=["title"],Jt=["title"],Kt=["onUpdate:modelValue"],Zt=["title"],Qt={class:"field-control"},Xt=["type","onUpdate:modelValue","placeholder"],Yt=["onUpdate:modelValue","min","max","step"],_t=["onUpdate:modelValue","onChange"],vt=["value"],er=["onUpdate:modelValue","placeholder"],nr={class:"slider-row"},tr=["onUpdate:modelValue","min","max","step"],rr={class:"slider-val"},or={class:"color-row"},lr=["onUpdate:modelValue"],ar={class:"color-code"},sr=["value","onInput","placeholder"],ir=["placeholder"],cr=["onUpdate:modelValue"],dr={key:0,class:"setting-hint"},pr={key:0,class:"settings-empty"},mr=U({__name:"SettingsModal",emits:["close"],setup(r,{emit:t}){const n=t,o=e.ref(""),l=e.ref(""),a=e.computed(()=>{const m=(b.state.pluginSchemas||[]).map(p=>({key:p.key,title:p.title||p.key,groups:d(p.fields||[])}));return m.length&&!o.value&&(o.value=m[0].key),m}),s=e.computed(()=>{const m=l.value.trim().toLowerCase();if(!m)return a.value;const p=a.value.find(u=>u.key===o.value),k=a.value.filter(u=>(u.title||u.key).toLowerCase().includes(m));return p&&!k.includes(p)&&k.unshift(p),k});function d(m){const p=[],k={};for(const u of m){const c=u.group||"";k[c]||(k[c]=[],p.push({title:c,fields:k[c]})),k[c].push(u)}return p}const i=e.ref(null);let h="";async function g(){try{i.value=await M.getModels()}catch{i.value=null}}function x(m){return m?(i.value&&i.value.models||{})[m]||[]:[]}function N(m,p){var k,u,c;if(p.optionsSource==="models"){const E=(k=y[m])==null?void 0:k[p.name],w=x((u=y.ai)==null?void 0:u.provider);return E&&!w.includes(E)?[...w,E]:w}if(p.optionsSource==="providers"){const E=i.value&&i.value.providers||[];if(E.length){const w=(c=y[m])==null?void 0:c[p.name];return w&&!E.includes(w)?[...E,w]:E}return p.options||[]}return p.options||[]}function B(m){if(!y.ai)return;const p=y.ai,k=m.linkFields||(m.linkField?[m.linkField]:[]);if(!k.length)return;const u=i.value||{},c=u.providerBaseURLs||{},E=u.providerKeys||{},w=p.provider,A=c[h];for(const L of k)if(L==="apiKey")p[L]=E[w]||"";else{const Ee=p[L];(Ee===void 0||Ee===""||A&&Ee===A)&&(p[L]=c[w]||"")}h=w}const y=e.reactive({}),T=e.ref("");function C(m){switch(m){case"checkbox":return!1;case"number":return 0;case"tags":return[];default:return""}}function $(){for(const u of Object.keys(y))delete y[u];const m=b.state.settings||{};h=m.provider||"";const p=m.pluginSettings||{};for(const u of b.state.pluginSchemas||[]){y[u.key]={};for(const c of u.fields||[]){let E;if(!(c.type==="project"||c.type==="provider-manager"||c.type==="model-params-manager"||c.type==="preset-manager")){if(c.binding)E=m[c.binding]!==void 0?m[c.binding]:c.default;else{const w=p[u.key]||{};E=w[c.name]!==void 0?w[c.name]:c.default}E===void 0&&(E=C(c.type)),c.type==="checkbox"&&(E=!!E),c.type==="number"&&(E=typeof E=="number"?E:Number(E)||0),c.type==="tags"&&(E=Array.isArray(E)?E:[]),y[u.key][c.name]=E}}}const k=(b.state.pluginSchemas||[]).some(u=>(u.fields||[]).some(c=>c.type==="project"));T.value="",k&&W()}function R(m,p){var u;const k=(u=y[m])==null?void 0:u[p.name];return Array.isArray(k)?k.join(", "):k||""}function O(m,p,k){y[m][p.name]=k.target.value.split(",").map(u=>u.trim()).filter(Boolean)}async function W(){try{const m=await M.getInstructions("project");T.value=m.content||""}catch{}}function z(){var m;$(),(m=b.state.settings)!=null&&m.theme&&b.applyTheme(b.state.settings.theme)}const F=()=>{z()};async function V(){try{const m=await M.apiGet("/settings");m&&m.settings&&(b.state.settings=m.settings,await g(),z())}catch{}}const f=async()=>{try{let m={};try{const c=await M.apiGet("/settings");m=c&&c.settings||{}}catch{}const p={...m},k={...m.pluginSettings||{}};let u=!1;for(const c of b.state.pluginSchemas||[]){const E=y[c.key]||{};for(const w of c.fields||[]){if(w.type==="project"){await M.saveInstructions("project",T.value);continue}if(w.type==="provider-manager"||w.type==="model-params-manager"||w.type==="preset-manager")continue;const A=E[w.name];w.binding?(w.name==="theme"&&A!==p[w.binding]&&(u=!0),p[w.binding]=A):(k[c.key]||(k[c.key]={}),k[c.key][w.name]=A)}}await M.apiPut("/settings",{settings:p,pluginSettings:k}),b.state.settings=p,u&&b.applyTheme(p.theme),window.$toast("设置已保存","success"),n("close")}catch(m){window.$toast("保存失败: "+m.message,"error")}};return $(),e.onMounted(async()=>{await g(),z()}),(m,p)=>(e.openBlock(),e.createElementBlock("div",{class:"modal-overlay",onClick:p[3]||(p[3]=e.withModifiers(k=>m.$emit("close"),["self"]))},[e.createElementVNode("div",Lt,[e.createElementVNode("h2",null,[e.createVNode(D,{name:"settings",size:18}),p[4]||(p[4]=e.createTextVNode(" 设置 ",-1)),e.createElementVNode("button",{class:"modal-close",onClick:p[0]||(p[0]=k=>m.$emit("close"))},"×")]),e.createElementVNode("div",Gt,[e.createCommentVNode(" ═══ 纯 schema 驱动:所有配置 tab 由插件 ctx.registerSettings 注册 ═══ "),a.value.length?(e.openBlock(),e.createElementBlock("div",Ft,[a.value.length>6?(e.openBlock(),e.createElementBlock("div",Ot,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":p[1]||(p[1]=k=>l.value=k),class:"settings-tabs-filter",type:"text",placeholder:"筛选设置…"},null,512),[[e.vModelText,l.value]])])):e.createCommentVNode("v-if",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.value,k=>(e.openBlock(),e.createElementBlock("button",{key:k.key,class:e.normalizeClass(["settings-tab",{active:o.value===k.key}]),onClick:u=>o.value=k.key},e.toDisplayString(k.title),11,zt))),128)),s.value.length===0?(e.openBlock(),e.createElementBlock("div",Ut,"无匹配设置")):e.createCommentVNode("v-if",!0)])):e.createCommentVNode("v-if",!0),e.createElementVNode("div",jt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,k=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:k.key},[o.value===k.key?(e.openBlock(),e.createElementBlock("div",Ht,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(k.groups,u=>(e.openBlock(),e.createElementBlock("div",{key:u.title||"__main",class:"setting-group"},[u.title?(e.openBlock(),e.createElementBlock("div",qt,e.toDisplayString(u.title),1)):e.createCommentVNode("v-if",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.fields,c=>(e.openBlock(),e.createElementBlock("div",{key:c.name,class:e.normalizeClass(["setting-row",{"row-toggle":c.type==="checkbox"}])},[e.createCommentVNode(" checkbox:label 与开关同行 "),c.type==="checkbox"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createElementVNode("label",{class:"field-label",title:c.hint},e.toDisplayString(c.label),9,Wt),e.createElementVNode("label",{class:"pp-switch",title:c.hint},[e.withDirectives(e.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":E=>y[k.key][c.name]=E},null,8,Kt),[[e.vModelCheckbox,y[k.key][c.name]]]),p[5]||(p[5]=e.createElementVNode("span",{class:"pp-switch-track"},null,-1))],8,Jt)],64)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createCommentVNode(" 其他类型:label 在上、控件在下、说明文字在控件下方(不挤占输入区) "),e.createElementVNode("label",{class:"field-label",title:c.hint},e.toDisplayString(c.label),9,Zt),e.createElementVNode("div",Qt,[e.createCommentVNode(" text / password "),c.type==="text"||c.type==="password"?e.withDirectives((e.openBlock(),e.createElementBlock("input",{key:0,class:"field-input",type:c.type==="password"?"password":"text","onUpdate:modelValue":E=>y[k.key][c.name]=E,placeholder:c.placeholder},null,8,Xt)),[[e.vModelDynamic,y[k.key][c.name]]]):c.type==="number"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createCommentVNode(" number "),e.withDirectives(e.createElementVNode("input",{class:"field-input",type:"number","onUpdate:modelValue":E=>y[k.key][c.name]=E,min:c.min,max:c.max,step:c.step},null,8,Yt),[[e.vModelText,y[k.key][c.name],void 0,{number:!0}]])],2112)):c.type==="select"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:2},[e.createCommentVNode(" select(optionsSource 驱动动态数据源:models=按服务商模型列表 / providers=服务商列表) "),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":E=>y[k.key][c.name]=E,class:"field-select",onChange:E=>B(c)},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N(k.key,c),E=>(e.openBlock(),e.createElementBlock("option",{key:E,value:E},e.toDisplayString(E),9,vt))),128))],40,_t),[[e.vModelSelect,y[k.key][c.name]]])],2112)):c.type==="textarea"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:3},[e.createCommentVNode(" textarea "),e.withDirectives(e.createElementVNode("textarea",{"onUpdate:modelValue":E=>y[k.key][c.name]=E,class:"field-textarea",rows:"4",placeholder:c.placeholder},null,8,er),[[e.vModelText,y[k.key][c.name]]])],2112)):c.type==="slider"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:4},[e.createCommentVNode(" slider "),e.createElementVNode("div",nr,[e.withDirectives(e.createElementVNode("input",{type:"range","onUpdate:modelValue":E=>y[k.key][c.name]=E,min:c.min!=null?c.min:0,max:c.max!=null?c.max:100,step:c.step||1},null,8,tr),[[e.vModelText,y[k.key][c.name],void 0,{number:!0}]]),e.createElementVNode("span",rr,e.toDisplayString(y[k.key][c.name]),1)])],2112)):c.type==="color"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:5},[e.createCommentVNode(" color "),e.createElementVNode("div",or,[e.withDirectives(e.createElementVNode("input",{type:"color","onUpdate:modelValue":E=>y[k.key][c.name]=E},null,8,lr),[[e.vModelText,y[k.key][c.name]]]),e.createElementVNode("code",ar,e.toDisplayString(y[k.key][c.name]),1)])],2112)):c.type==="tags"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:6},[e.createCommentVNode(" tags(逗号分隔数组) "),e.createElementVNode("input",{type:"text",class:"field-input",value:R(k.key,c),onInput:E=>O(k.key,c,E),placeholder:c.placeholder||"逗号分隔"},null,40,sr)],2112)):c.type==="project"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:7},[e.createCommentVNode(" project(平台特殊:项目级指令,经 /api/instructions 读写) "),e.withDirectives(e.createElementVNode("textarea",{"onUpdate:modelValue":p[2]||(p[2]=E=>T.value=E),class:"field-textarea",rows:"4",placeholder:c.placeholder},null,8,ir),[[e.vModelText,T.value]])],2112)):c.type==="provider-manager"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:8},[e.createCommentVNode(" provider-manager(服务商维护面板:CRUD /api/models,独立保存,不参与普通表单) "),e.createVNode(at,{"model-param-fields":c.modelParamFields||[],"model-editor":c.modelEditor||{},"protocol-label":c.protocolLabel||"LLM 协议","protocol-options":c.protocolOptions||[],"protocol-hint":c.protocolHint||"",onSaved:g},null,8,["model-param-fields","model-editor","protocol-label","protocol-options","protocol-hint"])],2112)):c.type==="preset-manager"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:9},[e.createCommentVNode(" preset-manager(AI 配置预设面板:CRUD /api/ai-presets,独立保存,不参与普通表单) "),e.createVNode(Rt,{"preset-fields":c.presetFields||[],onSaved:V},null,8,["preset-fields"])],2112)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:10},[e.createCommentVNode(" 兜底 text "),e.withDirectives(e.createElementVNode("input",{class:"field-input",type:"text","onUpdate:modelValue":E=>y[k.key][c.name]=E},null,8,cr),[[e.vModelText,y[k.key][c.name]]])],2112))]),c.hint?(e.openBlock(),e.createElementBlock("span",dr,e.toDisplayString(c.hint),1)):e.createCommentVNode("v-if",!0)],64))],2))),128))]))),128))])):e.createCommentVNode("v-if",!0)],64))),128)),a.value.length?e.createCommentVNode("v-if",!0):(e.openBlock(),e.createElementBlock("div",pr,"暂无配置项(等待插件注册…)"))])]),e.createElementVNode("div",{class:"modal-footer"},[e.createElementVNode("button",{class:"btn-secondary",onClick:F},"撤销"),e.createElementVNode("button",{class:"btn-primary",onClick:f},"保存设置")])])]))}},[["__scopeId","data-v-72d0a360"]]),gr={class:"modal-content sys-modal"},kr={class:"modal-header"},hr={class:"modal-body"},fr={key:0,class:"loading"},yr={key:1,class:"sys-info"},ur={class:"info-row"},Er={class:"info-row"},br={class:"info-row"},xr={class:"info-row"},Vr={class:"info-row"},Nr={class:"info-row"},wr={class:"modal-footer"},Tr=U({__name:"SystemModal",emits:["close"],setup(r,{emit:t}){const n=e.ref(!0),o=e.ref({});return e.onMounted(async()=>{try{o.value=await M.apiGet("/system/info")}catch{}n.value=!1}),(l,a)=>(e.openBlock(),e.createElementBlock("div",{class:"modal-overlay",onClick:a[2]||(a[2]=e.withModifiers(s=>l.$emit("close"),["self"]))},[e.createElementVNode("div",gr,[e.createElementVNode("div",kr,[a[3]||(a[3]=e.createElementVNode("h2",null,"ℹ 系统信息",-1)),e.createElementVNode("button",{class:"modal-close",onClick:a[0]||(a[0]=s=>l.$emit("close"))},"×")]),e.createElementVNode("div",hr,[n.value?(e.openBlock(),e.createElementBlock("div",fr,"加载中...")):(e.openBlock(),e.createElementBlock("div",yr,[e.createElementVNode("div",ur,[a[4]||(a[4]=e.createElementVNode("label",null,"主机名",-1)),e.createElementVNode("span",null,e.toDisplayString(o.value.hostname),1)]),e.createElementVNode("div",Er,[a[5]||(a[5]=e.createElementVNode("label",null,"当前目录",-1)),e.createElementVNode("span",null,e.toDisplayString(o.value.cwd),1)]),e.createElementVNode("div",br,[a[6]||(a[6]=e.createElementVNode("label",null,"操作系统",-1)),e.createElementVNode("span",null,e.toDisplayString(o.value.os),1)]),e.createElementVNode("div",xr,[a[7]||(a[7]=e.createElementVNode("label",null,"Go 版本",-1)),e.createElementVNode("span",null,e.toDisplayString(o.value.goos),1)]),e.createElementVNode("div",Vr,[a[8]||(a[8]=e.createElementVNode("label",null,"工作区",-1)),e.createElementVNode("span",null,e.toDisplayString(o.value.workspace),1)]),e.createElementVNode("div",Nr,[a[9]||(a[9]=e.createElementVNode("label",null,"文件夹",-1)),e.createElementVNode("span",null,e.toDisplayString((o.value.folders||[]).join(", ")),1)])]))]),e.createElementVNode("div",wr,[e.createElementVNode("button",{class:"btn-secondary",onClick:a[1]||(a[1]=s=>l.$emit("close"))},"关闭")])])]))}},[["__scopeId","data-v-c27b6ec9"]]),Br={class:"modal-content source-modal"},Sr={class:"modal-header"},Cr={class:"modal-footer"},Ir=U({__name:"SourceModal",emits:["close"],setup(r){return(t,n)=>(e.openBlock(),e.createElementBlock("div",{class:"modal-overlay",onClick:n[2]||(n[2]=e.withModifiers(o=>t.$emit("close"),["self"]))},[e.createElementVNode("div",Br,[e.createElementVNode("div",Sr,[n[3]||(n[3]=e.createElementVNode("h2",null,"⎔ 源代码管理",-1)),e.createElementVNode("button",{class:"modal-close",onClick:n[0]||(n[0]=o=>t.$emit("close"))},"×")]),n[4]||(n[4]=e.createElementVNode("div",{class:"modal-body"},[e.createElementVNode("p",{style:{color:"var(--text-muted)","text-align":"center","margin-top":"40px"}},[e.createTextVNode(" Git 集成开发中"),e.createElementVNode("br"),e.createElementVNode("br"),e.createTextVNode(" 功能规划:"),e.createElementVNode("br"),e.createTextVNode(" · Git 状态查看"),e.createElementVNode("br"),e.createTextVNode(" · 暂存/提交/推送"),e.createElementVNode("br"),e.createTextVNode(" · 分支管理"),e.createElementVNode("br"),e.createTextVNode(" · Diff 对比 ")])],-1)),e.createElementVNode("div",Cr,[e.createElementVNode("button",{class:"btn-secondary",onClick:n[1]||(n[1]=o=>t.$emit("close"))},"关闭")])])]))}},[["__scopeId","data-v-2e060397"]]),Ar=`# 功能介绍
3
3
 
4
4
  PairCode IDE 是一款纯 Web 端的 AI 辅助编程开发环境。你只需打开浏览器,在对话面板中用自然语言描述需求,AI 就能理解你的意图,直接生成代码、修改文件、执行命令、管理版本——把 IDE 从工具变为你的编程搭档。
5
5
 
@@ -23,11 +23,13 @@ PairCode IDE 是一款纯 Web 端的 AI 辅助编程开发环境。你只需打
23
23
 
24
24
  开启自主模式后,AI 能自己分析项目结构、扫描代码问题、制定修复计划并逐个执行。你可以在关键节点审核确认,其他步骤 AI 自动完成。执行进度实时可见,你可以随时暂停、中止或补充指令。
25
25
 
26
- **Agent 核心采用 deepseek-harness 双层循环架构**:
26
+ **Agent 核心采用双层循环(turn/step)架构**:
27
27
  - **turn / step 双层边界** — 每次工具执行都有独立的 step 事件(开始/结束/摘要),每轮用户交互是 turn,进度颗粒度清晰可追溯
28
28
  - **inbox 双队列** — 任务转向(next-step)与后续追问(next-turn)分队列消费,多轮交互不粘连
29
29
  - **消息组装与落盘对齐** — agentloop 编号与消息序列严格一致,历史恢复与实时流状态吻合
30
30
  - **历史注入精简** — 去掉冗余前缀标注与时间戳,系统提示内置多轮规则,长对话上下文更干净
31
+ - **段预算双闸门 + 自动续跑** — 单个执行段同时受「步数预算」与「工具调用预算」约束(默认各 120),任一达上限即结束本段并自动开启下一段继续干活,长任务不会半途停下;续跑段数上限可配(默认 20 段)。三项都在「设置 → Agent」里实时调整,改完即生效
32
+ - **会话交接** — 续跑或重新提问时若历史已很长,自动整理成一份「会话交接·提交消息」(相关性判断 + 目标 / 已完成 / 当前状态 / 关键决策 / 下一步),上下文不再无限膨胀;历史不长时则原样注入,不干扰缓存
31
33
 
32
34
  ---
33
35
 
@@ -106,7 +108,7 @@ AI 会自动执行对应的 Git 操作并返回结果。你也可以通过 Git
106
108
  - **终端协议文档** — PTY WebSocket 的初始化流程、控制消息格式、白名单限制等
107
109
  - **API 索引速查表** — 按功能分类列出所有 60+ API 端点,方便快速查找
108
110
 
109
- 所有 API 仅监听本地回环地址,安全可控。
111
+ 所有 API 监听所有网络接口(0.0.0.0),本机与局域网内设备均可访问;请勿将端口暴露到公网。
110
112
 
111
113
  ---
112
114
 
@@ -128,6 +130,8 @@ CodeGraph 将项目的代码结构构建成可查询的知识图谱,让 AI 理
128
130
  - 左侧对话列表展示所有历史记录,支持继续之前的话题
129
131
  - 不同工作区的对话自动隔离,各项目互不干扰
130
132
  - 支持向前翻页加载更多历史消息
133
+ - **长对话自动交接** — 历史过长时按需生成交接摘要(见「自主编程模式」),既保留任务连续性,又避免上下文膨胀拖慢响应
134
+ - **运行统计条** — 对话面板显示本轮耗时 / 步数 / 工具调用次数 / 输出速度,运行中实时刷新、结束后定格;断开连接会自动重连并补齐该会话的任务与消息
131
135
 
132
136
  ---
133
137
 
@@ -149,19 +153,19 @@ CodeGraph 将项目的代码结构构建成可查询的知识图谱,让 AI 理
149
153
  - **Skills(技能)** — 可复用的工作流程模板,AI 在对应场景中自动加载使用
150
154
  - **MCP(模型上下文协议)** — 标准化的工具扩展协议,可为 AI 添加自定义能力(如查询内部数据库、调用第三方 API)
151
155
  - **工具集(Toolset)** — 按项目需求组合的插件包,动态构建并固化到工作区,可导出/导入/发布市场
156
+ - **场景工具集(创造模式)** — 直接说 \`/创造 需求描述\`,AI 会先盘点现有能力、再组合出一个「场景」工具集(本质是工具面白名单),固化后可在对话面板一键切换,让 AI 只看到当前任务真正需要的工具
152
157
  - **内置市场** — 一键浏览和安装社区贡献的扩展(技能 / MCP / 插件工具集三类)
153
158
 
154
159
  ---
155
160
 
156
161
  ## 插件化自定义工具
157
162
 
158
- **通过 JS / TS / Go / Lua 插件扩展 AI 的工具集,一切皆插件。**
163
+ **通过 JS / TS 插件扩展 AI 的工具集,一切皆插件。**
159
164
 
160
- PairCode IDE 的工具体系全部插件化——内置功能(文件/搜索/Git/Web/记忆/任务/图谱等 21 组)以插件形态装配,你也可以编写自己的插件扩展能力:
165
+ PairCode IDE 的工具体系全部插件化——内置功能(文件 / 搜索 / 命令 / 网页 / 记忆 / 任务 / 代码图谱 / 办公文档 / 二进制分析等)以插件形态装配,你也可以编写自己的插件扩展能力:
161
166
 
162
- - **JS / TS 插件** — 通过 \`cordis_define\` 定义函数形态插件,支持 \`apply(ctx, config)\` 注入服务、timer 定时器、跨 goroutine 执行锁;TS 插件由内置编译器(esbuild 纯 Go)直接转译加载,无需 Node.js
163
- - **Go 插件** — 内置插件框架,核心功能组全部以 Go 插件装配,\`cordis_inspect\` 可查看工具归属,\`cordis_stop\` 卸载整组
164
- - **Lua 工具** — 支持 Lua 脚本自定义工具,封装常用命令组合与自定义数据处理逻辑
167
+ - **JS / TS 插件** — 通过 \`cordis(op=define)\` 定义函数形态插件,支持 \`apply(ctx, config)\` 注入服务、timer 定时器、跨 goroutine 执行锁;TS 插件由内置编译器(esbuild 纯 Go)直接转译加载,无需 Node.js
168
+ - **插件管理单入口** — \`cordis\` 按 \`op\` 分派:\`define\` 定义 / \`inspect\` 查看工具归属与运行时诊断 / \`run\`·\`stop\` 装卸 / \`services\`·\`query\` 查宿主服务与协议签名 / \`undefine\` 撤销
165
169
  - **沙箱防护** — VM 超时防护、schema 校验,插件异常不影响主进程
166
170
 
167
171
  ## 工具集生态
@@ -226,7 +230,7 @@ AI 会自动分解复杂任务为可追踪的子任务步骤,每步的执行
226
230
  - **本地运行** — 所有操作在本地计算机执行,不经过第三方云端
227
231
  - **路径隔离** — 文件操作限定在工作区目录范围内
228
232
  - **审批机制** — 写文件和执行命令等敏感操作需你确认
229
- - **本地地址** — IDE 服务仅监听本地回环地址,默认不对外暴露
233
+ - **监听地址** — IDE 服务监听所有接口(0.0.0.0),本机用 localhost 访问,局域网设备用本机 IP 访问
230
234
 
231
235
  ---
232
236
 
@@ -256,11 +260,11 @@ AI 会自动分解复杂任务为可追踪的子任务步骤,每步的执行
256
260
  | Ctrl+Shift+F | 全局搜索 |
257
261
  | Ctrl+Shift+T | 打开对话面板 |
258
262
  | Ctrl+Shift+C | 切换对话面板 |
259
- `,ur=`# API 文档\r
263
+ `,Pr=`# API 文档\r
260
264
  \r
261
265
  PairCode IDE 内置了一套完整的 HTTP REST API + WebSocket 实时通信协议,供 Web 前端与后端核心功能交互,也**支持第三方开发者基于本 API 进行二次开发**。所有 API 地址均以 \`/api\` 开头,返回 JSON 格式数据。\r
262
266
  \r
263
- > **安全提示**:所有 API 仅监听本地回环地址(127.0.0.1),默认不对外暴露。请勿将服务端口暴露到公网或局域网。\r
267
+ > **安全提示**:Web 服务监听所有接口(0.0.0.0),本机可用 \`http://localhost:{port}\` 访问,局域网内其他设备可用本机 IP 访问。请勿将服务端口暴露到公网,并注意防火墙与访问控制。\r
264
268
  \r
265
269
  ---\r
266
270
  \r
@@ -317,6 +321,11 @@ GET /api/health\r
317
321
  \r
318
322
  浏览、读写和管理工作区内的文件与目录。\r
319
323
  \r
324
+ > **路径语义(多项目工作区)**\r
325
+ > - **相对路径一律相对「主项目根」解析**(主项目 = 工作区第一个文件夹,不是进程 cwd);返回与记录的文件路径均为主项目根相对路径(跨项目时形如 \`../<项目名>/…\`)。\r
326
+ > - 访问**工作区其他文件夹(其他项目)**必须传**绝对路径**——相对路径不会自动跳到其他项目,越界会直接报「路径不在当前项目内」,请勿反复重试同一相对路径。\r
327
+ > - Agent 侧工具(\`read\`/\`write\`/\`glob\`/\`grep\`/\`exec_command\`)另有 \`project\` 参数(项目目录名 / 相对主项目的路径 / 绝对路径)可直接把解析根切到目标项目;HTTP 接口无此参数,用绝对路径等价。\r
328
+ \r
320
329
  ### 2.1 列出目录\r
321
330
  \r
322
331
  \`\`\`\r
@@ -326,7 +335,7 @@ GET /api/fs/list?path={目录路径}\r
326
335
  **参数:**\r
327
336
  | 参数 | 类型 | 必填 | 说明 |\r
328
337
  |------|------|------|------|\r
329
- | path | string | 否 | 目录路径,省略时返回工作区根目录 |\r
338
+ | path | string | 否 | 目录路径(相对主项目根解析;跨项目请传绝对路径),省略时返回主项目根目录 |\r
330
339
  \r
331
340
  **响应示例:**\r
332
341
  \`\`\`json\r
@@ -354,7 +363,7 @@ GET /api/fs/read?path={文件路径}\r
354
363
  **参数:**\r
355
364
  | 参数 | 类型 | 必填 | 说明 |\r
356
365
  |------|------|------|------|\r
357
- | path | string | 是 | 文件路径 |\r
366
+ | path | string | 是 | 文件路径(相对主项目根解析;跨项目请传绝对路径) |\r
358
367
  \r
359
368
  **响应:** 返回文件文本内容(字符串)。\r
360
369
  \r
@@ -376,7 +385,7 @@ POST /api/fs/write\r
376
385
  \r
377
386
  | 字段 | 类型 | 必填 | 说明 |\r
378
387
  |------|------|------|------|\r
379
- | path | string | 是 | 文件路径(相对于工作区或绝对路径) |\r
388
+ | path | string | 是 | 文件路径(相对主项目根解析;跨项目请传绝对路径) |\r
380
389
  | content | string | 是 | 文件内容(覆盖写入,自动创建目录) |\r
381
390
  \r
382
391
  **响应:** \`{"ok": true}\`\r
@@ -393,7 +402,7 @@ GET /api/fs/search?q={关键词}&path={搜索路径}\r
393
402
  | 参数 | 类型 | 必填 | 说明 |\r
394
403
  |------|------|------|------|\r
395
404
  | q | string | 是 | 搜索关键词 |\r
396
- | path | string | 否 | 搜索目录,省略时使用工作区根目录 |\r
405
+ | path | string | 否 | 搜索目录(相对主项目根解析;跨项目请传绝对路径),省略时使用主项目根 |\r
397
406
  \r
398
407
  **响应示例:**\r
399
408
  \`\`\`json\r
@@ -409,7 +418,16 @@ GET /api/fs/search?q={关键词}&path={搜索路径}\r
409
418
  | line | number | 行号 |\r
410
419
  | text | string | 匹配行的内容 |\r
411
420
  \r
412
- **自动忽略的目录:** \`.git\`、\`node_modules\`、\`vendor\`、\`.pair\`、\`__pycache__\`、\`bin\` 等。**仅搜索文本文件扩展名**(\`.go\` \`.js\` \`.ts\` \`.vue\` \`.html\` \`.css\` \`.json\` \`.md\` \`.py\` \`.rs\` \`.java\` 等 50+ 种)。\r
421
+ **自动忽略的目录**(与内核搜索忽略集 \`internal/agent/search.go\` 同源):\r
422
+ - 依赖库/模块库:\`node_modules\` \`bower_components\` \`jspm_packages\` \`vendor\` \`pods\` \`.pnpm-store\` \`.yarn\` \`.dart_tool\` \`.bundle\` \`venv\` \`.venv\` \`__pycache__\` \`.pytest_cache\` \`.mypy_cache\` \`.ruff_cache\` \`.tox\`\r
423
+ - 构建产物/缓存:\`dist\` \`build\` \`out\` \`target\` \`.next\` \`.nuxt\` \`.svelte-kit\` \`.output\` \`.angular\` \`.gradle\` \`.cache\` \`.turbo\` \`.parcel-cache\` \`.eslintcache\` \`coverage\` \`.nyc_output\` \`.terraform\`\r
424
+ - VCS/IDE:\`.git\` \`.svn\` \`.hg\` \`.idea\` \`.vscode\` \`.vs\`\r
425
+ - IDE 运行数据:\`.pair\` \`_temp\` \`tmp\` \`logs\` \`bin\` \`release\` \`obj\` \`screenshots\` \`gocache\` \`.agent-teams\` \`.verify-tmp\` \`.chrome-test\` \`源码备份\` 等\r
426
+ \r
427
+ > 本接口按**目录名任意深度**剪枝;Agent 工具(\`grep\`/\`glob\`,内核实现)对 IDE 运行数据目录更精细——\`_temp\`/\`bin\`/\`release\`/\`logs\`/\`screenshots\` 等仅当位于项目根第一层时才剪枝。\r
428
+ > 跳过只作用于**递归下降**:把 \`path\` 直接指进被忽略目录,仍可搜索其内容。可用设置项 \`ignoreDirs\` 追加自定义忽略目录名(实时生效,无需重启)。\r
429
+ \r
430
+ **仅搜索文本文件扩展名**(\`.go\` \`.js\` \`.ts\` \`.vue\` \`.html\` \`.css\` \`.json\` \`.md\` \`.py\` \`.rs\` \`.java\` 等 50+ 种)。\r
413
431
  \r
414
432
  ---\r
415
433
  \r
@@ -612,57 +630,78 @@ POST /api/workspace\r
612
630
  GET /api/settings\r
613
631
  \`\`\`\r
614
632
  \r
615
- **响应:** 返回完整 \`AppSettings\` 对象(字段较多,按需取用):\r
633
+ **响应:** 返回全局设置、插件配置描述与加载状态三部分:\r
634
+ \r
635
+ - \`settings\` — 全局设置对象(落盘 \`config/settings.json\`),只含**当前版本仍支持**的字段\r
636
+ - \`schemas\` — 各插件通过 \`ctx.registerSettings\` 注册的配置项描述(\`key\` / \`title\` / \`fields[]\`),\r
637
+ 设置面板按此动态渲染;插件配置的取值在 \`settings.pluginSettings.<插件key>\` 下\r
638
+ - \`loaded\` — 配置文件是否成功加载\r
616
639
  \r
617
640
  \`\`\`json\r
618
641
  {\r
619
- "provider": "deepseek",\r
620
- "baseURL": "https://api.deepseek.com/v1",\r
621
- "apiKey": "sk-xxx",\r
622
- "planModel": "deepseek-v4-pro",\r
623
- "executeModel": "deepseek-v4-flash",\r
624
- "reviewModel": "deepseek-v4-pro",\r
625
- "temperature": "0.3",\r
626
- "thinkingMode": "thinking",\r
627
- "maxTokens": 131072,\r
628
- "contextMaxTokens": 64000,\r
629
- "lastProject": "F:/projects/my-app",\r
630
- "workspaceFolders": ["F:/projects/my-app"],\r
631
- "recentProjects": ["F:/projects/app1"],\r
632
- "reviewMode": "auto",\r
633
- "reviewBlacklist": [],\r
634
- "reviewWhitelist": [],\r
635
- "autonomous": false,\r
636
- "autoCollapse": true,\r
637
- "maxIterations": 50,\r
638
- "maxParallelAgents": 3,\r
639
- "maxReviewRetries": 3,\r
640
- "autoIterateOnRejection": true,\r
641
- "requireHumanApprovalForDestructive": true,\r
642
- "aiReview": false,\r
643
- "autoCommit": true,\r
644
- "luaTools": true,\r
645
- "enableBenchmarking": true,\r
646
- "systemInstructions": "",\r
647
- "searxngUrl": "",\r
648
- "ignoreDirs": [],\r
649
- "defaultShell": "auto",\r
650
- "termFontSize": 13,\r
651
- "termEncoding": "auto",\r
652
- "theme": "dark",\r
653
- "fontFamily": "'Cascadia Code', Consolas, monospace",\r
654
- "editorFontSize": 14,\r
655
- "tabSize": 2,\r
656
- "wordWrap": false,\r
657
- "hideMinimap": false,\r
658
- "autoConnectMCP": true,\r
659
- "skillEnabledOverrides": {},\r
660
- "skillStatusOverrides": {},\r
661
- "mcpEnabledOverrides": {},\r
662
- "customProviders": []\r
642
+ "loaded": true,\r
643
+ "settings": {\r
644
+ "provider": "deepseek",\r
645
+ "baseURL": "https://api.deepseek.com/v1/chat/completions",\r
646
+ "apiKey": "sk-xxx",\r
647
+ "model": "deepseek-v4-flash",\r
648
+ "planModel": "deepseek-v4-pro",\r
649
+ "executeModel": "deepseek-v4-flash",\r
650
+ "reviewModel": "deepseek-v4-pro",\r
651
+ "preset": "默认",\r
652
+ "modelParams": {},\r
653
+ "temperature": "0.3",\r
654
+ "thinkingMode": "thinking",\r
655
+ "maxTokens": 131072,\r
656
+ "contextMaxTokens": 64000,\r
657
+ "lastProject": "F:/projects/my-app",\r
658
+ "workspaceFolders": ["F:/projects/my-app"],\r
659
+ "workspaceFolderLists": {"F:/projects/my-app": ["F:/projects/my-app"]},\r
660
+ "recentProjects": ["F:/projects/app1"],\r
661
+ "reviewMode": "auto",\r
662
+ "reviewBlacklist": [],\r
663
+ "reviewWhitelist": [],\r
664
+ "autonomous": false,\r
665
+ "autoIterateOnRejection": true,\r
666
+ "systemInstructions": "",\r
667
+ "ignoreDirs": [],\r
668
+ "theme": "dark",\r
669
+ "fontSize": 14,\r
670
+ "tabSize": 2,\r
671
+ "skillEnabledOverrides": {},\r
672
+ "skillStatusOverrides": {},\r
673
+ "pluginSettings": {\r
674
+ "agentloop": {\r
675
+ "stepBudget": 120,\r
676
+ "toolCallBudget": 120,\r
677
+ "maxToolBudgetSegments": 20\r
678
+ }\r
679
+ }\r
680
+ },\r
681
+ "schemas": [\r
682
+ {\r
683
+ "key": "agentloop",\r
684
+ "title": "Agent 循环(agentloop)",\r
685
+ "fields": [\r
686
+ {"name": "stepBudget", "label": "单段步数预算", "type": "number", "default": 120},\r
687
+ {"name": "toolCallBudget", "label": "单段工具调用预算", "type": "number", "default": 120},\r
688
+ {"name": "maxToolBudgetSegments", "label": "最大自动续跑段数", "type": "number", "default": 20}\r
689
+ ]\r
690
+ }\r
691
+ ]\r
663
692
  }\r
664
693
  \`\`\`\r
665
694
  \r
695
+ **段预算(双闸门)字段说明:**\r
696
+ \r
697
+ | 字段(\`pluginSettings.agentloop\`) | 默认 | 语义 |\r
698
+ |------|------|------|\r
699
+ | stepBudget | 120 | 单段步数预算(一步 = 一次模型调用;一次回复并列多个工具调用仍算 1 步)。0 或留空 = 默认,负数 = 不限 |\r
700
+ | toolCallBudget | 120 | 单段工具调用预算(仅统计实际执行,审批驳回 / 截断不计数)。0 或留空 = 默认,负数 = 不限 |\r
701
+ | maxToolBudgetSegments | 20 | 自动续跑段数上限(不允许「不限」,防失控)。0 / 留空 / 负数 = 默认 20 |\r
702
+ \r
703
+ > 任一闸门达上限即结束当前段并自动开启续跑段(同会话历史保留);修改后立即生效,无需重启。\r
704
+ \r
666
705
  ### 4.2 保存设置\r
667
706
  \r
668
707
  \`\`\`\r
@@ -694,7 +733,7 @@ GET /api/system/info\r
694
733
  "goos": "windows",\r
695
734
  "workspace": "F:/projects/my-app",\r
696
735
  "folders": ["F:/projects/my-app"],\r
697
- "version": "v1.1.2"\r
736
+ "version": "v1.6.1"\r
698
737
  }\r
699
738
  \`\`\`\r
700
739
  \r
@@ -2084,283 +2123,269 @@ ws://127.0.0.1:{port}/api/terminal/ws\r
2084
2123
  |------|------|\r
2085
2124
  | \`ws://host/ws\` | AI 事件流推送(思考/工具/结果/完成) |\r
2086
2125
  | \`ws://host/api/terminal/ws\` | PTY 终端双向 I/O |\r
2087
- `,Er=`# AI 工具文档
2088
-
2089
- PairCode IDE 中的 AI 助手拥有丰富的内置能力,可以像你使用 IDE 一样操作文件、搜索代码、运行命令、管理版本。你只需用自然语言告诉 AI 你想做什么,AI 会自动选择合适的工具来完成任务。
2090
-
2091
- 所有工具对 AI 完全开放,你无需记忆工具名称——只需描述需求,AI 自动判断该用什么。
2092
-
2093
- ---
2094
-
2095
- ## 一、代码阅读与搜索
2096
-
2097
- **浏览项目结构、搜索代码内容和定位符号定义,是 AI 理解你代码的基础能力。**
2098
-
2099
- AI 可以像你一样阅读和浏览项目代码:
2100
-
2101
- - 读取文件内容(可按行号范围读取部分内容)
2102
- - 列出目录下的文件和子目录
2103
- - 按关键词或正则表达式在文件内容中搜索
2104
- - 按通配符模式递归查找文件
2105
- - 搜索函数、类型、结构体等符号的定义位置
2106
- - 查看指定文件中所有检测到的符号
2107
- - 搜索某个符号在项目中的所有引用位置
2108
- - 列出项目中所有导出的公开符号
2109
- - 查看文件的导入依赖和反向依赖
2110
- - 分析修改某个文件后可能影响的其他文件
2111
- - 检测项目中的循环依赖
2112
-
2113
- ---
2114
-
2115
- ## 二、代码知识图谱 CodeGraph
2116
-
2117
- **AI 能理解你的代码结构和调用关系,而不仅仅是搜索文本。**
2118
-
2119
- CodeGraph 将项目的代码整体结构构建成可查询的知识图谱,让 AI 像理解知识一样理解你的代码:
2120
-
2121
- - 构建或更新项目的代码知识图谱
2122
- - 查看知识图谱的统计信息
2123
- - 按名称查找函数或方法的定义位置和签名
2124
- - 获取结构体或接口的完整层次结构(字段、方法、嵌入类型)
2125
- - 查询哪些函数调用了指定的某个函数
2126
- - 查询某个函数内部调用了哪些其他函数
2127
- - 分析修改某个函数或类型后可能影响的范围
2128
- - 在知识图谱中按名称搜索代码实体
2129
- - 查询代码实体的 Git 变更历史
2130
-
2131
- ---
2132
-
2133
- ## 三、文件操作
2134
-
2135
- **读写和编辑工作区内的文件,是 AI 帮你写代码的主要方式。**
2136
-
2137
- AI 可以直接在工作区中进行文件操作:
2138
-
2139
- - 将内容写入指定文件(覆盖模式,自动创建父目录)
2140
- - 精确替换文件中的一段文本
2141
- - 将文件或目录移动到新位置(也可用于重命名)
2142
- - 删除指定文件
2143
- - 将文件恢复到修改前的版本
2144
- - 查看某个文件的所有修改历史版本
2145
-
2146
- ---
2147
-
2148
- ## 四、命令执行
2149
-
2150
- **在工作区中运行命令,AI 也能用命令行来完成任务。**
2151
-
2152
- - 执行一条 shell 命令并等待结果返回
2153
- - 在后台启动一条长命令(如启动开发服务器)
2154
- - 读取后台进程累积的输出内容
2155
- - 停止正在运行的后台进程
2156
- - 直接执行一段代码(自动探测语言,写临时文件运行 Go / Python / Node.js 并返回结果)
2157
-
2158
- ---
2159
-
2160
- ## 五、网络与搜索
2161
-
2162
- **AI 可以联网获取信息或搜索资料。**
2163
-
2164
- - 抓取网页内容并提取纯文本
2165
- - 通过搜索引擎检索网络信息
2166
-
2167
- ---
2168
-
2169
- ## 六、网页验证与截图
2170
-
2171
- **AI 可以打开网页、截图并分析页面内容,用于验证前端效果。**
2172
-
2173
- - 在浏览器中打开网页,可输入文字、点击元素、检查控制台错误并截图
2174
- - 获取 JavaScript 渲染后的页面文本内容(适合单页应用)
2175
- - 截取桌面或指定窗口的屏幕
2176
- - 截取指定 URL 的网页
2177
-
2178
- ---
2179
-
2180
- ## 七、图像分析
2181
-
2182
- **AI 可以"看"图片并理解其中的内容。**
2183
-
2184
- - 读取图片文件内容(供支持视觉的模型直接理解图像)
2185
- - 分析图片中的颜色分布、色块区域和基本图形
2186
- - 从图片中识别文字,支持中英文混合识别
2187
-
2188
- ---
2189
-
2190
- ## 八、二进制分析
2191
-
2192
- **查看和分析二进制文件的内容,用于逆向工程或文件格式分析。**
2193
-
2194
- - 分析二进制文件的大小、类型和十六进制预览
2195
- - 将 Base64 编码的内容写入二进制文件
2196
- - 从二进制文件中提取可打印的字符串
2197
- - 在二进制文件中搜索指定的字节模式或文本
2198
- - 在二进制文件的指定位置写入字节补丁
2199
- - 解析可执行文件的结构(架构、入口、节区、导入导出)
2200
- - 计算文件的 MD5、SHA1、SHA256 哈希值
2201
- - 按块计算文件的香农熵(识别压缩或加密区域)
2202
-
2203
- ---
2204
-
2205
- ## 九、办公文档
2206
-
2207
- **读写常见的办公文档格式,包括表格、文档和 PDF。**
2208
-
2209
- - 读取 CSV 或 TSV 文件并以表格形式展示
2210
- - 将数据写入 CSV 或 TSV 文件
2211
- - 将 JSON 数组数据转为 Markdown 表格
2212
- - 对表格数据的数值列做统计(求和、均值、最大值等)
2213
- - 按文件扩展名分组统计代码行数
2214
- - 读取和生成 Word 文档
2215
- - 读取和创建 Excel 文件
2216
- - 提取 PDF 文件的文本内容(扫描型 PDF 自动进行 OCR 识别)
2217
- - 将 Markdown 文本转换为 HTML
2218
-
2219
- ---
2220
-
2221
- ## 十、Git 版本控制
2222
-
2223
- **在对话中完成 Git 操作,AI 可以帮你管理代码版本。**
2224
-
2225
- - 查看工作区的 Git 状态
2226
- - 查看文件的变更内容
2227
- - 查看最近的提交历史
2228
- - 查看某次提交的详情和改动
2229
- - 逐行查看文件的最后修改人和提交信息
2230
- - 将文件加入暂存区
2231
- - 提交已暂存的改动
2232
- - 列出、创建或删除分支
2233
- - 切换分支或恢复文件的修改
2234
- - 将工作区的改动暂存起来,稍后恢复
2235
-
2236
- ---
2237
-
2238
- ## 十一、调试器
2239
-
2240
- **AI 可以启动调试会话,设置断点并检查程序运行状态。**
2241
-
2242
- - 启动 Go 程序的调试会话
2243
- - 停止当前的调试会话
2244
- - 在指定文件的指定行设置断点
2245
- - 从暂停状态继续执行程序
2246
- - 单步跳过(不进入函数内部)
2247
- - 单步进入(进入函数调用内部)
2248
- - 单步跳出(执行到函数返回)
2249
- - 查看当前线程的调用栈
2250
- - 查看当前暂停点的变量值
2251
- - 在暂停状态下求值表达式
2252
- - 查看当前调试会话的状态
2253
-
2254
- ---
2255
-
2256
- ## 十二、项目知识库
2257
-
2258
- **将项目架构、模块职责和设计决策记录下来,让 AI 跨会话了解你的项目。**
2259
-
2260
- - 写入一条项目知识(如架构说明或设计决策)
2261
- - 读取某条项目知识的详细内容
2262
- - 列出知识库的所有条目概览
2263
- - 按关键词搜索知识库内容
2264
- - 删除某条项目知识
2265
- - 生成项目目录结构概览
2266
-
2267
- ---
2268
-
2269
- ## 十三、记忆系统
2270
-
2271
- **AI 可以记住你的偏好、历史决策和项目约束,跨对话持续积累。**
2272
-
2273
- - 写入一条持久记忆,AI 在后续对话中自动参考
2274
- - 读取某条记忆的详细内容
2275
- - 按关键词搜索已有记忆
2276
- - 列出所有历史记忆的摘要
2277
- - 删除一条过时的记忆
2278
- - 查询记忆库中的总条目数
2279
-
2280
- ---
2281
-
2282
- ## 十四、BUG 检测与修复
2283
-
2284
- **AI 可以自动发现代码中的问题并给出修复方案。**
2285
-
2286
- - 分析构建或测试的输出,提取错误位置和上下文
2287
- - 全量检测项目中的 BUG,自动运行编译和测试检查
2288
- - 自动检测 BUG 并生成修复方案,支持多次迭代修复
2289
-
2290
- ---
2291
-
2292
- ## 十五、任务与规划
2293
-
2294
- **AI 可以追踪任务进度和执行计划,确保复杂的多步骤任务有条不紊。**
2295
-
2296
- - 创建一个新的子任务并跟踪其状态
2297
- - 更新任务清单中各项任务的进度状态
2298
- - 维护和更新执行计划的步骤清单
2299
- - 任务全部完成后生成提交信息
2300
-
2301
- ---
2302
-
2303
- ## 十六、技能与 MCP 管理
2304
-
2305
- **管理和扩展 AI 的能力——技能是工作流模板,MCP 是标准化的工具扩展协议。**
2306
-
2307
- - 列出所有可用的技能及其激活模式
2308
- - 加载某个技能的完整内容供 AI 使用
2309
- - 加载技能的附加资源文件
2310
- - 创建或更新一个技能模板
2311
- - 删除一个项目级技能
2312
- - 列出已配置的 MCP 服务器
2313
- - 新增或删除 MCP 服务器扩展
2314
-
2315
- ---
2316
-
2317
- ## 十七、市场
2318
-
2319
- **浏览和安装来自公共市场的技能和 MCP 扩展。**
2320
-
2321
- - 在市场检索可安装的 MCP 服务器或技能
2322
- - 从市场安装指定的扩展
2323
-
2324
- ---
2325
-
2326
- ## 十八、插件管理
2327
-
2328
- **管理 JS / TS / Go / Lua 插件——一切皆插件,自定义和扩展 AI 的工具集。**
2329
-
2330
- - 定义一个函数形态的 JS/TS 插件(支持 apply(ctx, config) 注入服务、timer 定时器、跨 goroutine 执行锁)
2331
- - 查看已注册插件的详情(含工具归属:每个工具来自哪个插件,可整体卸载回收)
2332
- - 对插件执行查询(inspect 内部状态)
2333
- - 运行插件注册的服务或回调
2334
- - 列出 / 停止已注册的插件服务
2335
- - 撤销(undefine)一个已定义的插件
2336
- - 列出所有已创建的 Lua 自定义工具
2337
- - 创建一个新的 Lua 自定义工具
2338
- - 更新现有 Lua 工具的代码或参数
2339
- - 删除一个 Lua 自定义工具
2340
-
2341
- ---
2342
-
2343
- ## 十九、工具集管理
2344
-
2345
- **按项目需求动态组合工具集,固化/导出/导入,构建处理本身也插件化。**
2346
-
2347
- - 分析项目结构与需求,动态组合所需工具并创建工具集插件(固化到工作区 \`.pair/toolsets/\`)
2348
- - 列出当前项目可用的工具集
2349
- - 查看某个工具集的详细内容
2350
- - 导出工具集为 JSON(可提交 Git / 发布市场)
2351
- - 从 JSON 或文件导入工具集(project 工作区级 / user 全局级)
2352
- - 移除不再需要的工具集
2353
-
2354
- ---
2355
-
2356
- ## 二十、其他工具
2357
-
2358
- **辅助性工具,在特定场景下帮助 AI 更好地与你协作。**
2359
-
2360
- - **用户提问** — 当 AI 遇到关键决策点时,向你提问以澄清需求
2361
- - **任务委派** — 将复杂任务委托给子 AI 独立完成
2362
- - **资产清单** — 查看和使用已保存的经验胶囊和最佳实践
2363
- `,xr=`# 快捷键参考\r
2126
+ `,$r=`# AI 工具文档\r
2127
+ \r
2128
+ PairCode IDE 中的 AI 助手拥有丰富的内置能力,可以像你使用 IDE 一样操作文件、搜索代码、运行命令、管理版本。你只需用自然语言告诉 AI 你想做什么,AI 会自动选择合适的工具来完成任务。\r
2129
+ \r
2130
+ 所有工具对 AI 完全开放,你无需记忆工具名称——只需描述需求,AI 自动判断该用什么。\r
2131
+ \r
2132
+ ---\r
2133
+ \r
2134
+ ## 一、代码阅读与搜索\r
2135
+ \r
2136
+ **浏览项目结构、搜索代码内容和定位符号定义,是 AI 理解你代码的基础能力。**\r
2137
+ \r
2138
+ AI 可以像你一样阅读和浏览项目代码:\r
2139
+ \r
2140
+ - 读取文件内容(可按行号范围读取部分内容)\r
2141
+ - 列出目录下的文件和子目录\r
2142
+ - 按关键词或正则表达式在文件内容中搜索\r
2143
+ - 按通配符模式递归查找文件\r
2144
+ - 搜索函数、类型、结构体等符号的定义位置\r
2145
+ - 查看指定文件中所有检测到的符号\r
2146
+ - 搜索某个符号在项目中的所有引用位置\r
2147
+ - 列出项目中所有导出的公开符号\r
2148
+ - 查看文件的导入依赖和反向依赖\r
2149
+ - 分析修改某个文件后可能影响的其他文件\r
2150
+ - 检测项目中的循环依赖\r
2151
+ \r
2152
+ ---\r
2153
+ \r
2154
+ ## 二、代码知识图谱 CodeGraph\r
2155
+ \r
2156
+ **AI 能理解你的代码结构和调用关系,而不仅仅是搜索文本。**\r
2157
+ \r
2158
+ CodeGraph 将项目的代码整体结构构建成可查询的知识图谱,让 AI 像理解知识一样理解你的代码:\r
2159
+ \r
2160
+ - 构建或更新项目的代码知识图谱\r
2161
+ - 查看知识图谱的统计信息\r
2162
+ - 按名称查找函数或方法的定义位置和签名\r
2163
+ - 获取结构体或接口的完整层次结构(字段、方法、嵌入类型)\r
2164
+ - 查询哪些函数调用了指定的某个函数\r
2165
+ - 查询某个函数内部调用了哪些其他函数\r
2166
+ - 分析修改某个函数或类型后可能影响的范围\r
2167
+ - 在知识图谱中按名称搜索代码实体\r
2168
+ - 查询代码实体的 Git 变更历史\r
2169
+ \r
2170
+ ---\r
2171
+ \r
2172
+ ## 三、文件操作\r
2173
+ \r
2174
+ **读写和编辑工作区内的文件,是 AI 帮你写代码的主要方式。**\r
2175
+ \r
2176
+ AI 可以直接在工作区中进行文件操作:\r
2177
+ \r
2178
+ - 将内容写入指定文件(覆盖模式,自动创建父目录)\r
2179
+ - **对文件打补丁**(\`apply_patch\`):一次调用可含多个文件与四类操作(新增 / 更新 / 删除 / 移动),更新用上下文行定位(免行号、免转义)\r
2180
+ - 将文件或目录移动到新位置(也可用于重命名)\r
2181
+ - 删除指定文件\r
2182
+ - 将文件恢复到修改前的版本\r
2183
+ - 查看某个文件的所有修改历史版本\r
2184
+ \r
2185
+ > AI 修改文件时优先「打补丁」——只写变更部分,不做整文件覆盖,误改风险更低;每次修改前会自动留存快照,可随时回退。\r
2186
+ \r
2187
+ ---\r
2188
+ \r
2189
+ ## 四、命令执行\r
2190
+ \r
2191
+ **在工作区中运行命令,AI 也能用命令行来完成任务。**\r
2192
+ \r
2193
+ - 执行一条 shell 命令并等待结果返回\r
2194
+ - 在后台启动一条长命令(如启动开发服务器)\r
2195
+ - 读取后台进程累积的输出内容\r
2196
+ - 停止正在运行的后台进程\r
2197
+ - 直接执行一段代码(自动探测语言,写临时文件运行 Go / Python / Node.js 并返回结果)\r
2198
+ \r
2199
+ ---\r
2200
+ \r
2201
+ ## 五、网络与搜索\r
2202
+ \r
2203
+ **AI 可以联网获取信息或搜索资料。**\r
2204
+ \r
2205
+ - 抓取网页内容并提取纯文本\r
2206
+ - 通过搜索引擎检索网络信息\r
2207
+ \r
2208
+ ---\r
2209
+ \r
2210
+ ## 六、网页验证与截图\r
2211
+ \r
2212
+ **AI 可以打开网页、截图并分析页面内容,用于验证前端效果。**\r
2213
+ \r
2214
+ - 在浏览器中打开网页,可输入文字、点击元素、检查控制台错误并截图\r
2215
+ - 获取 JavaScript 渲染后的页面文本内容(适合单页应用)\r
2216
+ - 截屏并保存(单工具三形态:整个桌面 / 按窗口标题 / 按坐标区域)\r
2217
+ \r
2218
+ ---\r
2219
+ \r
2220
+ ## 七、图像分析\r
2221
+ \r
2222
+ **AI 可以「看」图片并理解其中的内容。**\r
2223
+ \r
2224
+ - 读取图片文件并把图片本身交给模型看(识别截图文字、分析界面布局、验证渲染效果、描述图表)\r
2225
+ - 路径可以没有扩展名(按文件内容识别格式);过大的图片由运行时自动降采样\r
2226
+ - 需要当前模型支持图片输入\r
2227
+ \r
2228
+ > 扫描型 PDF 的文字识别(OCR)由 PDF 读取工具自动处理,无需单独操作。\r
2229
+ \r
2230
+ ---\r
2231
+ \r
2232
+ ## 八、二进制分析\r
2233
+ \r
2234
+ **查看和分析二进制文件的内容,用于逆向工程或文件格式分析。**\r
2235
+ \r
2236
+ - 分析二进制文件的大小、类型和十六进制预览\r
2237
+ - 将 Base64 编码的内容写入二进制文件\r
2238
+ - 从二进制文件中提取可打印的字符串\r
2239
+ - 在二进制文件中搜索指定的字节模式或文本\r
2240
+ - 在二进制文件的指定位置写入字节补丁\r
2241
+ - 解析可执行文件的结构(架构、入口、节区、导入导出)\r
2242
+ - 计算文件的 MD5、SHA1、SHA256 哈希值\r
2243
+ - 按块计算文件的香农熵(识别压缩或加密区域)\r
2244
+ \r
2245
+ ---\r
2246
+ \r
2247
+ ## 九、办公文档\r
2248
+ \r
2249
+ **读写常见的办公文档格式,包括表格、文档和 PDF。**\r
2250
+ \r
2251
+ - 读取 CSV 或 TSV 文件并以表格形式展示\r
2252
+ - 将数据写入 CSV 或 TSV 文件\r
2253
+ - 将 JSON 数组数据转为 Markdown 表格\r
2254
+ - 对表格数据的数值列做统计(求和、均值、最大值等)\r
2255
+ - 按文件扩展名分组统计代码行数\r
2256
+ - 读取和生成 Word 文档\r
2257
+ - 读取和创建 Excel 文件\r
2258
+ - 提取 PDF 文件的文本内容(扫描型 PDF 自动进行 OCR 识别)\r
2259
+ - 将 Markdown 文本转换为 HTML\r
2260
+ \r
2261
+ ---\r
2262
+ \r
2263
+ ## 十、Git 版本控制\r
2264
+ \r
2265
+ **在对话中完成 Git 操作,AI 通过命令执行直接使用 git。**\r
2266
+ \r
2267
+ - 查看工作区状态、变更内容、提交历史与某次提交的详情\r
2268
+ - 逐行查看文件的最后修改人与提交信息\r
2269
+ - 暂存、提交、分支的列出创建与删除、切换分支或恢复文件修改\r
2270
+ - 将改动暂存起来稍后恢复(stash)、拉取与推送\r
2271
+ \r
2272
+ > 代码知识图谱另提供「查询代码实体的 Git 变更历史」,适合追溯某个符号的演化。\r
2273
+ \r
2274
+ ---\r
2275
+ \r
2276
+ ## 十一、项目知识库\r
2277
+ \r
2278
+ **将项目架构、模块职责和设计决策记录下来,让 AI 跨会话了解你的项目。**\r
2279
+ \r
2280
+ - 写入一条项目知识(如架构说明或设计决策)\r
2281
+ - 读取某条项目知识的详细内容\r
2282
+ - 列出知识库的所有条目概览\r
2283
+ - 按关键词搜索知识库内容\r
2284
+ - 删除某条项目知识\r
2285
+ - 生成项目目录结构概览\r
2286
+ \r
2287
+ ---\r
2288
+ \r
2289
+ ## 十二、记忆系统\r
2290
+ \r
2291
+ **AI 可以记住你的偏好、历史决策和项目约束,跨对话持续积累。**\r
2292
+ \r
2293
+ - 写入一条持久记忆,AI 在后续对话中自动参考\r
2294
+ - 读取某条记忆的详细内容\r
2295
+ - 按关键词搜索已有记忆\r
2296
+ - 列出所有历史记忆的摘要\r
2297
+ - 删除一条过时的记忆\r
2298
+ - 查询记忆库中的总条目数\r
2299
+ \r
2300
+ ---\r
2301
+ \r
2302
+ ## 十三、BUG 检测与修复\r
2303
+ \r
2304
+ **AI 可以自动发现代码中的问题并给出修复方案。**\r
2305
+ \r
2306
+ - 分析构建或测试的输出,提取错误位置和上下文\r
2307
+ - 全量检测项目中的 BUG,自动运行编译和测试检查\r
2308
+ - 自动检测 BUG 并生成修复方案,支持多次迭代修复\r
2309
+ \r
2310
+ ---\r
2311
+ \r
2312
+ ## 十四、任务与规划\r
2313
+ \r
2314
+ **AI 可以追踪任务进度和执行计划,确保复杂的多步骤任务有条不紊。**\r
2315
+ \r
2316
+ - 维护任务清单(全量替换,自动持久化到磁盘):新增 / 更新进度状态 / 标记完成或取消\r
2317
+ - 任务可声明依赖关系,形成可追踪的任务 DAG\r
2318
+ - **团队编排**:把任务 DAG 升级为带质量门禁的团队计划——依赖门禁、质量契约(目标 + 验收标准)、\r
2319
+ 两阶段批准(先出计划、你批准后再执行)、修复与复审自动派生,由 AI 自己按依赖顺序逐步执行\r
2320
+ - 随时检查任务完成进度,并获取「下一步做什么」的建议\r
2321
+ \r
2322
+ ---\r
2323
+ \r
2324
+ ## 十五、技能与 MCP 管理\r
2325
+ \r
2326
+ **管理和扩展 AI 的能力——技能是工作流模板,MCP 是标准化的工具扩展协议。**\r
2327
+ \r
2328
+ - 列出所有可用的技能及其激活模式\r
2329
+ - 加载某个技能的完整内容供 AI 使用\r
2330
+ - 加载技能的附加资源文件\r
2331
+ - 创建或更新一个技能模板\r
2332
+ - 删除一个项目级技能\r
2333
+ - 列出已配置的 MCP 服务器\r
2334
+ - 新增或删除 MCP 服务器扩展\r
2335
+ \r
2336
+ ---\r
2337
+ \r
2338
+ ## 十六、市场\r
2339
+ \r
2340
+ **浏览和安装来自公共市场的技能和 MCP 扩展。**\r
2341
+ \r
2342
+ - 在市场检索可安装的 MCP 服务器或技能\r
2343
+ - 从市场安装指定的扩展\r
2344
+ \r
2345
+ ---\r
2346
+ \r
2347
+ ## 十七、插件管理\r
2348
+ \r
2349
+ **管理 JS / TS 动态插件——一切皆插件,自定义和扩展 AI 的工具集。**\r
2350
+ \r
2351
+ 插件管理是单一入口(\`cordis\`),按 \`op\` 分派:\r
2352
+ \r
2353
+ - \`define\` 定义一个函数形态的 JS / TS 插件(支持 \`apply(ctx, config)\` 注入服务、timer 定时器、跨 goroutine 执行锁;TS 由内置编译器转译,无需 Node.js)\r
2354
+ - \`inspect\` 查看插件运行时诊断(工具归属、版本链、源码诊断)与插件自检摘要\r
2355
+ - \`run\` / \`stop\` 装载或停止插件(goja 沙箱求值并 apply,可传配置)\r
2356
+ - \`services\` 列出宿主服务与方法签名;\`query\` 按协议精确查询(平台 / provider / method)\r
2357
+ - \`undefine\` 撤销一个已定义的插件\r
2358
+ \r
2359
+ > 写插件前先用 \`services\` / \`query\` 查精确签名,不要凭记忆臆测 API。\r
2360
+ \r
2361
+ ---\r
2362
+ \r
2363
+ ## 十八、工具集管理\r
2364
+ \r
2365
+ **按项目需求动态组合工具集,固化/导出/导入,构建处理本身也插件化。**\r
2366
+ \r
2367
+ - 分析项目结构与需求,动态组合所需工具并创建工具集插件(固化到工作区 \`.pair/toolsets/\`)\r
2368
+ - 列出当前项目可用的工具集\r
2369
+ - 查看某个工具集的详细内容\r
2370
+ - 导出工具集为 JSON(可提交 Git / 发布市场)\r
2371
+ - 从 JSON 或文件导入工具集(project 工作区级 / user 全局级)\r
2372
+ - 移除不再需要的工具集\r
2373
+ - **创造模式**:用一句需求(\`/创造 需求描述\`)自主创建「场景」工具集——先盘点当前可用能力\r
2374
+ (插件与内置工具组),再组合成清单并固化到安装目录 \`.pair/toolsets/<场景名>.json\`;\r
2375
+ 场景 = 工具面白名单,在对话面板选择后该场景内的工具才对 AI 可见(支持中文场景名)\r
2376
+ \r
2377
+ ---\r
2378
+ \r
2379
+ ## 十九、其他工具\r
2380
+ \r
2381
+ **辅助性工具,在特定场景下帮助 AI 更好地与你协作。**\r
2382
+ \r
2383
+ - **用户提问** — 遇到关键决策点或需求歧义时向你提问(支持纯文本 / 单选 / 多选 / 选项内自定义输入)\r
2384
+ - **智能资源** — 统一检索经验胶囊、技能基因、记忆、项目知识库、技能与 MCP 服务器;可保存修复经验胶囊供后续复用\r
2385
+ - **运行统计** — 查看各工具的调用次数、成功率与最近调用记录,识别高频失败工具\r
2386
+ - **历史检索** — 按关键词搜索已完成对话(标题 / 摘要 / 标签 / 关键点)\r
2387
+ - **代码统计** — 按扩展名或目录分组统计代码行数(总行 / 代码行 / 注释行 / 空行),自动跳过依赖与构建产物\r
2388
+ `,Mr=`# 快捷键参考\r
2364
2389
  \r
2365
2390
  PairCode IDE 提供了丰富的快捷键,帮助你更高效地编写代码和管理项目。以下按功能分类列出所有可用的快捷键。\r
2366
2391
  \r
@@ -2439,188 +2464,277 @@ PairCode IDE 提供了丰富的快捷键,帮助你更高效地编写代码和
2439
2464
  | Ctrl+PageUp | 切换到上一个文件标签页 | 编辑器 |\r
2440
2465
  | Ctrl+PageDown | 切换到下一个文件标签页 | 编辑器 |\r
2441
2466
  | Ctrl+W | 关闭当前文件标签页 | 编辑器 |\r
2442
- `,br=`# 常见问题
2443
-
2444
- ## PairCode IDE 是什么?
2445
-
2446
- PairCode IDE 是一款 AI 原生的纯 Web 集成开发环境。与传统 IDE 不同,你只需用浏览器打开,在对话面板中用自然语言描述需求,AI 就能理解你的意图,自动完成代码编写、文件操作、命令执行等工作——让编程从手工操作转变为对话驱动。
2447
-
2448
- ## 需要安装桌面客户端吗?
2449
-
2450
- 不需要。PairCode IDE 是纯 Web 应用,你只需启动后台服务,然后用浏览器(推荐 Chrome、Edge、Firefox)访问即可。所有界面在浏览器中渲染,无需安装任何桌面客户端。
2451
-
2452
- ## AI 能做什么?
2453
-
2454
- AI 可以读写和编辑你的代码文件、在工作区中执行命令、搜索和浏览项目结构、管理 Git 版本控制、启动调试会话、处理图片和办公文档、搜索网络信息,还能截图验证网页效果。基本上,日常开发中你能做的事情,AI 都可以帮你完成。
2455
-
2456
- ## 如何让 AI 执行命令?
2457
-
2458
- 你可以在对话中直接告诉 AI 需要运行什么命令,例如"运行测试"或"启动项目"。AI 会自动在终端中执行并返回结果输出。涉及文件写入和命令执行的操作会先请求你的确认。
2459
-
2460
- ## 文件保存在哪里?
2461
-
2462
- 所有文件都保存在你本地的工作区目录中。PairCode IDE 直接读写你本地磁盘上的文件,不经过云端存储。你可以在文件浏览器中看到完整的项目目录结构,用系统的文件管理器也能找到它们。
2463
-
2464
- ## 如何切换 AI 模型?
2465
-
2466
- 在设置面板的"AI 模型"选项卡中,你可以选择不同的 AI 服务商和模型。支持接入 OpenAI、Claude 等多种主流模型后端。你可以为执行任务和制定规划分别配置不同的模型。
2467
-
2468
- ## 如何安装更多技能?
2469
-
2470
- 在市场中可以浏览和安装社区贡献的技能模板、MCP 扩展和工具集插件。技能是可复用的工作流程模板,MCP 扩展可以给 AI 添加新的能力,工具集是按项目需求组合的插件包(可通过 \`toolset_build\` 动态构建并固化到工作区)。打开市场面板,搜索你需要的功能,一键即可安装使用。
2471
-
2472
- ## 对话历史会丢失吗?
2473
-
2474
- 不会。每次对话都会自动保存在本地磁盘上,你可以随时在对话列表中查看历史记录、继续之前的对话或开启新话题。切换工作区时,各项目的对话会自动隔离,互不干扰。
2475
-
2476
- ## 如何保护隐私?
2477
-
2478
- 所有操作都在你的本地计算机上执行,代码和对话内容不会发送到外部服务器(AI 模型调用除外,你可以选择使用本地模型避免数据外出)。API 服务只监听本地回环地址,默认不对外暴露。文件操作限定在工作区范围内。
2479
-
2480
- ## 页面刷新后数据还在吗?
2481
-
2482
- 大部分数据都会保留:
2483
- - **对话历史** — 自动持久化到磁盘,刷新后完整恢复
2484
- - **打开的文件** — 刷新后自动重新打开
2485
- - **工作区状态** — 侧栏位置、面板大小等布局信息保存在浏览器中
2486
- - **设置** — 主题、AI 模型配置等设置持久化到磁盘
2487
-
2488
- ## 编辑器里的代码没有高亮怎么办?
2489
-
2490
- 编辑器会根据文件扩展名自动切换语言模式。如果文件扩展名不常见,代码高亮可能无法自动识别。建议确认文件扩展名是否被支持,或使用常见的扩展名保存文件。
2491
-
2492
- ## 什么是自主模式?和普通对话有什么区别?
2493
-
2494
- **普通模式**:你发一条指令,AI 执行并回复,然后等待你下一条指令。
2495
-
2496
- **自主模式**:你交给 AI 一个复杂任务(如"修复所有编译错误"),AI 会自动分解任务、逐个执行、迭代验证,直到全部完成。你不需要逐条发指令,只需在关键节点确认即可。
2497
-
2498
- ## 能让 AI 访问我的私有 API 吗?
2499
-
2500
- 可以通过 MCP(模型上下文协议)扩展来实现。在设置中添加自定义 MCP 服务器,AI 就能通过它访问你的私有 API、数据库或内部服务。
2501
-
2502
- ## 遇到问题怎么办?
2503
-
2504
- 你可以查看帮助菜单中的文档中心,里面有功能介绍、API 文档、工具文档和快捷键参考等详细资料。如果问题仍然无法解决,可以在对话中向 AI 描述你遇到的问题,它会尽力协助排查。
2505
- `,Vr=`# 快速开始
2506
-
2507
- 欢迎使用 PairCode IDE!以下指南将带你快速上手,从打开工作区到用 AI 写代码,只需几分钟。
2508
-
2509
- ---
2510
-
2511
- ## 打开 IDE
2512
-
2513
- PairCode IDE 是一个纯 Web 应用,启动后台服务后,直接在浏览器中访问对应地址即可使用。所有界面在浏览器中渲染,无需安装任何桌面客户端。
2514
-
2515
- > 建议使用 Chrome、Edge 或 Firefox 等现代浏览器获得最佳体验。
2516
-
2517
- ---
2518
-
2519
- ## 设置工作区
2520
-
2521
- 工作区是 IDE 操作的基础——所有文件操作、AI 对话和命令执行都将在这个目录范围内进行。
2522
-
2523
- 1. 点击左侧活动栏顶部的**文件图标**打开文件浏览器
2524
- 2. 在文件浏览器顶部输入你的项目文件夹的完整路径
2525
- 3. 按回车确认,IDE 会自动加载该目录下的所有文件和子目录
2526
-
2527
- 你也可以同时添加多个文件夹到同一个工作区中,方便跨目录浏览和管理代码。
2528
-
2529
- ---
2530
-
2531
- ## 与 AI 对话
2532
-
2533
- 右侧的**对话面板**是 PairCode IDE 的核心交互界面。你只需用自然语言描述需求,AI 就能理解并执行。
2534
-
2535
- 直接在输入框中输入你的需求,例如:
2536
-
2537
- - "创建一个 Go 文件,实现一个返回 JSON 的 HTTP 服务"
2538
- - "帮我优化这个函数,加上错误处理和参数校验"
2539
- - "搜索项目中所有调用了 Post 的地方"
2540
- - "运行项目中的所有测试,并告诉我哪些失败了"
2541
- - "把我的改动提交到 Git"
2542
-
2543
- 按 Enter 发送消息,Shift+Enter 换行。AI 会实时流式展示它的思考过程、工具调用和结果输出。
2544
-
2545
- ### 常用对话技巧
2546
-
2547
- | 技巧 | 说明 |
2548
- |------|------|
2549
- | **明确具体** | 越具体,AI 理解越准确。如"写一个函数"不如"写一个读取 JSON 配置文件的函数" |
2550
- | **分步沟通** | 复杂任务可以分步骤告诉 AI,先分析,再重构 |
2551
- | **提供上下文** | 在对话中粘贴错误信息或代码片段,AI 能给出更精准的修复方案 |
2552
- | **使用反馈** | 如果 AI 输出不满意,直接指出问题,AI 会调整方案重新尝试 |
2553
-
2554
- ---
2555
-
2556
- ## 编辑代码
2557
-
2558
- AI 生成的代码会直接写入到文件中。你也可以在编辑器中手动查看和修改代码:
2559
-
2560
- - **多标签页** — 同时打开多个文件,在标签栏切换
2561
- - **语法高亮** — 支持 Go、TypeScript、Python、Rust、Java、Vue 等主流语言
2562
- - **代码折叠** — 折叠函数和代码块,聚焦关键逻辑
2563
- - **Ctrl+S** — 保存当前文件的修改
2564
-
2565
- 你还可以在编辑器中查看二进制文件的十六进制内容,或直接预览图片文件。
2566
-
2567
- ---
2568
-
2569
- ## 运行与调试
2570
-
2571
- ### 使用内置终端
2572
-
2573
- 按 Ctrl+\\\` 打开 IDE 底部的终端面板,可以直接在工作区目录下运行命令。支持多标签页,方便在不同任务间切换。
2574
-
2575
- ### 让 AI 帮你运行
2576
-
2577
- 你也可以直接在对话中告诉 AI:"运行项目并告诉我结果"或"执行 npm test"。AI 会自动在终端中执行命令、读取输出,并根据结果决定下一步操作。
2578
-
2579
- ---
2580
-
2581
- ## 版本控制
2582
-
2583
- Git 操作完全融入 AI 对话流程。你用自然语言就能完成所有 Git 操作:
2584
-
2585
- - "查看当前仓库状态"
2586
- - "暂存所有修改并提交"
2587
- - "创建一个新分支并切换过去"
2588
- - "从远程拉取最新代码"
2589
-
2590
- 你也可以通过左侧 Git 面板查看文件变更的详细对比,逐行确认每次改动的具体内容。
2591
-
2592
- ---
2593
-
2594
- ## 个性化设置
2595
-
2596
- 点击活动栏的**齿轮图标**打开设置面板,你可以:
2597
-
2598
- - **AI 模型** — 选择不同的 AI 服务商和模型
2599
- - **外观主题** — 切换暗色、白色、暖色和暗夜紫四套主题
2600
- - **工作区管理** — 查看和切换最近使用的工作区
2601
- - **系统指令** — 自定义 AI 的行为指导原则
2602
-
2603
- ---
2604
-
2605
- ## 探索更多
2606
-
2607
- PairCode IDE 还有更多强大功能等待你探索。欢迎查阅帮助文档中的其他章节:
2608
-
2609
- - **功能介绍** — 了解所有功能模块的详细说明
2610
- - **工具文档** — 查看 AI 可使用的全部内置能力
2611
- - **快捷键参考** — 常用快捷键一览
2612
- - **API 文档** — 后端 HTTP API 接口说明
2613
- - **常见问题** — 常见问题与解答
2614
- `,Nr=`# 更新日志\r
2467
+ `,Dr=`# 常见问题\r
2468
+ \r
2469
+ ## PairCode IDE 是什么?\r
2470
+ \r
2471
+ PairCode IDE 是一款 AI 原生的纯 Web 集成开发环境。与传统 IDE 不同,你只需用浏览器打开,在对话面板中用自然语言描述需求,AI 就能理解你的意图,自动完成代码编写、文件操作、命令执行等工作——让编程从手工操作转变为对话驱动。\r
2472
+ \r
2473
+ ## 需要安装桌面客户端吗?\r
2474
+ \r
2475
+ 不需要。PairCode IDE 是纯 Web 应用,你只需启动后台服务,然后用浏览器(推荐 Chrome、Edge、Firefox)访问即可。所有界面在浏览器中渲染,无需安装任何桌面客户端。\r
2476
+ \r
2477
+ ## AI 能做什么?\r
2478
+ \r
2479
+ AI 可以读写和编辑你的代码文件、在工作区中执行命令、搜索和浏览项目结构、用 Git 管理版本、处理图片和办公文档、查阅网络资料,还能截图并验证网页效果。基本上,日常开发中你能做的事情,AI 都可以帮你完成。\r
2480
+ \r
2481
+ ## 如何让 AI 执行命令?\r
2482
+ \r
2483
+ 你可以在对话中直接告诉 AI 需要运行什么命令,例如"运行测试"或"启动项目"。AI 会自动在终端中执行并返回结果输出。涉及文件写入和命令执行的操作会先请求你的确认。\r
2484
+ \r
2485
+ ## 文件保存在哪里?\r
2486
+ \r
2487
+ 所有文件都保存在你本地的工作区目录中。PairCode IDE 直接读写你本地磁盘上的文件,不经过云端存储。你可以在文件浏览器中看到完整的项目目录结构,用系统的文件管理器也能找到它们。\r
2488
+ \r
2489
+ ## 如何切换 AI 模型?\r
2490
+ \r
2491
+ 在设置面板的"AI 模型"选项卡中,你可以选择不同的 AI 服务商和模型。支持接入 OpenAI、Claude 等多种主流模型后端。你可以为执行任务和制定规划分别配置不同的模型。\r
2492
+ \r
2493
+ ## 如何安装更多技能?\r
2494
+ \r
2495
+ 在市场中可以浏览和安装社区贡献的技能模板、MCP 扩展和工具集插件。技能是可复用的工作流程模板,MCP 扩展可以给 AI 添加新的能力,工具集是按项目需求组合的插件包(可通过 \`toolset_build\` 动态构建并固化到工作区)。打开市场面板,搜索你需要的功能,一键即可安装使用。\r
2496
+ \r
2497
+ ## 对话历史会丢失吗?\r
2498
+ \r
2499
+ 不会。每次对话都会自动保存在本地磁盘上,你可以随时在对话列表中查看历史记录、继续之前的对话或开启新话题。切换工作区时,各项目的对话会自动隔离,互不干扰。\r
2500
+ \r
2501
+ ## 如何保护隐私?\r
2502
+ \r
2503
+ 所有操作都在你的本地计算机上执行,代码和对话内容不会发送到外部服务器(AI 模型调用除外,你可以选择使用本地模型避免数据外出)。Web 服务监听所有接口(0.0.0.0),局域网内其他设备可通过本机 IP 访问;请勿将端口暴露到公网。文件操作限定在工作区范围内。\r
2504
+ \r
2505
+ ## 页面刷新后数据还在吗?\r
2506
+ \r
2507
+ 大部分数据都会保留:\r
2508
+ - **对话历史** — 自动持久化到磁盘,刷新后完整恢复\r
2509
+ - **打开的文件** — 刷新后自动重新打开\r
2510
+ - **工作区状态** — 侧栏位置、面板大小等布局信息保存在浏览器中\r
2511
+ - **设置** — 主题、AI 模型配置等设置持久化到磁盘\r
2512
+ \r
2513
+ ## 编辑器里的代码没有高亮怎么办?\r
2514
+ \r
2515
+ 编辑器会根据文件扩展名自动切换语言模式。如果文件扩展名不常见,代码高亮可能无法自动识别。建议确认文件扩展名是否被支持,或使用常见的扩展名保存文件。\r
2516
+ \r
2517
+ ## 什么是自主模式?和普通对话有什么区别?\r
2518
+ \r
2519
+ **普通模式**:你发一条指令,AI 执行并回复,然后等待你下一条指令。\r
2520
+ \r
2521
+ **自主模式**:你交给 AI 一个复杂任务(如"修复所有编译错误"),AI 会自动分解任务、逐个执行、迭代验证,直到全部完成。你不需要逐条发指令,只需在关键节点确认即可。\r
2522
+ \r
2523
+ 单个执行段有「步数预算」和「工具调用预算」(默认各 120,可在设置 → Agent 调整):任一达到上限,AI 会自动结束这一段并接着开下一段继续做(对话上下文保留),长任务不会因为预算用尽而停下,也不需要你手动催它继续。\r
2524
+ \r
2525
+ ## 能让 AI 访问我的私有 API 吗?\r
2526
+ \r
2527
+ 可以通过 MCP(模型上下文协议)扩展来实现。在设置中添加自定义 MCP 服务器,AI 就能通过它访问你的私有 API、数据库或内部服务。\r
2528
+ \r
2529
+ ## 遇到问题怎么办?\r
2530
+ \r
2531
+ 你可以查看帮助菜单中的文档中心,里面有功能介绍、API 文档、工具文档和快捷键参考等详细资料。如果问题仍然无法解决,可以在对话中向 AI 描述你遇到的问题,它会尽力协助排查。\r
2532
+ `,Rr=`# 快速开始\r
2533
+ \r
2534
+ 欢迎使用 PairCode IDE!以下指南将带你快速上手,从打开工作区到用 AI 写代码,只需几分钟。\r
2535
+ \r
2536
+ ---\r
2537
+ \r
2538
+ ## 打开 IDE\r
2539
+ \r
2540
+ PairCode IDE 是一个纯 Web 应用,启动后台服务后,直接在浏览器中访问对应地址即可使用。所有界面在浏览器中渲染,无需安装任何桌面客户端。\r
2541
+ \r
2542
+ > 建议使用 Chrome、Edge 或 Firefox 等现代浏览器获得最佳体验。\r
2543
+ \r
2544
+ ---\r
2545
+ \r
2546
+ ## 设置工作区\r
2547
+ \r
2548
+ 工作区是 IDE 操作的基础——所有文件操作、AI 对话和命令执行都将在这个目录范围内进行。\r
2549
+ \r
2550
+ 1. 点击左侧活动栏顶部的**文件图标**打开文件浏览器\r
2551
+ 2. 在文件浏览器顶部输入你的项目文件夹的完整路径\r
2552
+ 3. 按回车确认,IDE 会自动加载该目录下的所有文件和子目录\r
2553
+ \r
2554
+ 你也可以同时添加多个文件夹到同一个工作区中,方便跨目录浏览和管理代码。\r
2555
+ \r
2556
+ ---\r
2557
+ \r
2558
+ ## 与 AI 对话\r
2559
+ \r
2560
+ 右侧的**对话面板**是 PairCode IDE 的核心交互界面。你只需用自然语言描述需求,AI 就能理解并执行。\r
2561
+ \r
2562
+ 直接在输入框中输入你的需求,例如:\r
2563
+ \r
2564
+ - "创建一个 Go 文件,实现一个返回 JSON 的 HTTP 服务"\r
2565
+ - "帮我优化这个函数,加上错误处理和参数校验"\r
2566
+ - "搜索项目中所有调用了 Post 的地方"\r
2567
+ - "运行项目中的所有测试,并告诉我哪些失败了"\r
2568
+ - "把我的改动提交到 Git"\r
2569
+ \r
2570
+ 按 Enter 发送消息,Shift+Enter 换行。AI 会实时流式展示它的思考过程、工具调用和结果输出。\r
2571
+ \r
2572
+ ### 常用对话技巧\r
2573
+ \r
2574
+ | 技巧 | 说明 |\r
2575
+ |------|------|\r
2576
+ | **明确具体** | 越具体,AI 理解越准确。如"写一个函数"不如"写一个读取 JSON 配置文件的函数" |\r
2577
+ | **分步沟通** | 复杂任务可以分步骤告诉 AI,先分析,再重构 |\r
2578
+ | **提供上下文** | 在对话中粘贴错误信息或代码片段,AI 能给出更精准的修复方案 |\r
2579
+ | **使用反馈** | 如果 AI 输出不满意,直接指出问题,AI 会调整方案重新尝试 |\r
2580
+ \r
2581
+ ---\r
2582
+ \r
2583
+ ## 编辑代码\r
2584
+ \r
2585
+ AI 生成的代码会直接写入到文件中。你也可以在编辑器中手动查看和修改代码:\r
2586
+ \r
2587
+ - **多标签页** — 同时打开多个文件,在标签栏切换\r
2588
+ - **语法高亮** — 支持 Go、TypeScript、Python、Rust、Java、Vue 等主流语言\r
2589
+ - **代码折叠** — 折叠函数和代码块,聚焦关键逻辑\r
2590
+ - **Ctrl+S** — 保存当前文件的修改\r
2591
+ \r
2592
+ 你还可以在编辑器中查看二进制文件的十六进制内容,或直接预览图片文件。\r
2593
+ \r
2594
+ ---\r
2595
+ \r
2596
+ ## 运行与调试\r
2597
+ \r
2598
+ ### 使用内置终端\r
2599
+ \r
2600
+ 按 Ctrl+\\\` 打开 IDE 底部的终端面板,可以直接在工作区目录下运行命令。支持多标签页,方便在不同任务间切换。\r
2601
+ \r
2602
+ ### 让 AI 帮你运行\r
2603
+ \r
2604
+ 你也可以直接在对话中告诉 AI:"运行项目并告诉我结果"或"执行 npm test"。AI 会自动在终端中执行命令、读取输出,并根据结果决定下一步操作。\r
2605
+ \r
2606
+ ---\r
2607
+ \r
2608
+ ## 版本控制\r
2609
+ \r
2610
+ Git 操作完全融入 AI 对话流程。你用自然语言就能完成所有 Git 操作:\r
2611
+ \r
2612
+ - "查看当前仓库状态"\r
2613
+ - "暂存所有修改并提交"\r
2614
+ - "创建一个新分支并切换过去"\r
2615
+ - "从远程拉取最新代码"\r
2616
+ \r
2617
+ 你也可以通过左侧 Git 面板查看文件变更的详细对比,逐行确认每次改动的具体内容。\r
2618
+ \r
2619
+ ---\r
2620
+ \r
2621
+ ## 个性化设置\r
2622
+ \r
2623
+ 点击活动栏的**齿轮图标**打开设置面板,你可以:\r
2624
+ \r
2625
+ - **AI 模型** — 选择不同的 AI 服务商和模型\r
2626
+ - **外观主题** — 切换暗色、白色、暖色和暗夜紫四套主题\r
2627
+ - **工作区管理** — 查看和切换最近使用的工作区\r
2628
+ - **系统指令** — 自定义 AI 的行为指导原则\r
2629
+ - **Agent 预算** — 调整单段步数 / 工具调用预算与自动续跑段数上限,控制长任务的执行节奏\r
2630
+ \r
2631
+ ---\r
2632
+ \r
2633
+ ## 探索更多\r
2634
+ \r
2635
+ PairCode IDE 还有更多强大功能等待你探索。欢迎查阅帮助文档中的其他章节:\r
2636
+ \r
2637
+ - **功能介绍** — 了解所有功能模块的详细说明\r
2638
+ - **工具文档** — 查看 AI 可使用的全部内置能力\r
2639
+ - **快捷键参考** — 常用快捷键一览\r
2640
+ - **API 文档** — 后端 HTTP API 接口说明\r
2641
+ - **常见问题** — 常见问题与解答\r
2642
+ `,Lr=`# 更新日志\r
2615
2643
  \r
2616
2644
  > 所有 PairCode IDE 的重要变更均记录在此文件中。\r
2617
2645
  \r
2618
2646
  ---\r
2619
2647
  \r
2648
+ ## 未发布(开发中)\r
2649
+ \r
2650
+ ### 修复\r
2651
+ \r
2652
+ - **会话历史现在展示真实落盘数据(归档原文可见)** — 长会话的早期消息此前会被自动归档:原文逐字移入 \`{会话}.jsonl.archived.jsonl\`,主文件只留一行统计(「**历史归档**(共 N 条消息:用户 x/助手 y/工具 z)」),**前端展示线只读主文件**,于是归档前的真实历史再也翻不到,只剩那块没有内容的统计提示。现改为:归档时生成**真压缩摘要**(逐轮「用户任务 + 该轮结论 + 工具调用次数」,说明原文保留位置),供模型侧恢复上下文;而**展示线改为「归档原文 + 主文件」合并读取**,前端可一路向上滚动回翻到对话最早的真实消息(归档区消息用负序号标识,主文件消息保持原序号,回滚等语义不变)。归档区消息不支持回滚(会明确提示,避免误清空历史)。\r
2653
+ - **移除「背景上下文」折叠条(语义有歧义)** — 消息流里由系统注入的上下文消息(早期历史摘要、会话交接视图、历史遗留的背景快照)此前被统一渲染成「**背景上下文**(非当前任务)」折叠条,与用户真实消息混在一起、含义不清。现该类消息统一由后端识别并从展示历史中排除(模型侧仍可见,作为上下文的一部分),前端折叠条与其样式/识别逻辑整体移除;对话窗口只呈现用户真实消息与助手回复。\r
2654
+ \r
2655
+ ---\r
2656
+ \r
2657
+ ## 1.6.1 — 2026-09-13\r
2658
+ \r
2659
+ > 本版为 1.6.0 之后的修复与开发工具入库(含社区贡献 PR #1)。\r
2660
+ \r
2661
+ ### 修复\r
2662
+ \r
2663
+ - **专注模式 / 左栏 / 会话列表显隐统一入口(社区贡献)** — 侧栏、会话列表、编辑器显隐此前各自直接改状态:专注模式(Ctrl+K)只隐藏编辑器,组件内的 \`watch(focusMode)\` 还会覆盖「显式唤出侧栏」的用户意图;会话列表面板没有独立开关。现收归统一入口:\`setFocusMode()\` 进入专注时收起左栏与会话列表、退出时还原进入前的选择(专注态内手动切换会同步还原目标,退出时不被旧值覆盖);新增会话列表面板独立开关 **Ctrl+Shift+L**(选择持久化;专注态内切换属临时调整,不写入偏好);视图菜单与编辑器右键命令统一为「退出专注 → 显式显示侧栏」,靠语句顺序保证用户意图不被还原覆盖。\r
2664
+ - **插件装载较慢时历史消息不出现(社区贡献)** — 历史加载判定由「是否已存在非占位消息」改为「该会话是否加载过历史」:此前兜底定时器先写入快照/事件,切换会话即被判定为「已有内容」而跳过加载,历史永不出现。兜底提示文案同步澄清为「未在 N 毫秒内开始(插件装载较慢时的预期兜底)——先应用实时事件,历史随后加载」。\r
2665
+ - **网页验证(web_debug)白屏误报(社区贡献)** — 白屏 / DOM 探测脚本末尾写成了箭头函数立即调用形式,在表达式位置属语法错误,探测整体失败后文本长度恒为 0,**凡探不到文字的页面(Vue/React 根应用、Canvas/SVG 应用、文本位于不可见节点)一律误报「页面白屏」**。现改为纯函数表达式,并补 \`textContent\` 兜底、元素计数与探测失败可见化;白屏判定改按「探测失败 → 不判定;有文字 → 非白屏;无文字但 DOM 元素 ≥ 20 → 非白屏(仅提示文本不可提取);否则白屏」给出,「未提取到可见文本」与真正白屏分开表述。\r
2666
+ - **网页验证「可见 0 个」误报(社区贡献)** — 页面元素超过 5000 时探测会主动跳过可见性统计(性能保护),计数保持初值 0,报告据此输出误导性的「可见 0 个」,易被误读为页面异常。现严格区分「可见性未统计(元素过多)」与「真的是 0 个可见」。\r
2667
+ - **控制台日志占位符未替换(社区贡献)** — \`console.warn("x %d y %s", 1, "a")\` 此前被拼成 \`x %d y %s 1 a\`;现按浏览器 console 语义替换 \`%d/%i/%f/%s/%o/%O/%j\`(\`%c\` 丢弃对应样式参数,\`%%\` 还原为 \`%\`,参数不足保留原占位符,多余参数追加末尾)。\r
2668
+ - **服务监听地址说明与实际不符** — 服务已显式监听 \`0.0.0.0\`(支持局域网访问),应用内文档仍在提示「仅监听本地回环地址(127.0.0.1)」;现统一更新为「监听所有接口(0.0.0.0):本机用 \`localhost\` 访问、局域网内其他设备用本机 IP 访问;请勿将端口暴露到公网,并注意防火墙与访问控制」。\r
2669
+ \r
2670
+ ### 改进\r
2671
+ \r
2672
+ - **开发 / 诊断脚本入库(社区贡献)** — 把此前散落在临时目录、有长期价值的开发与诊断脚本与文档归档进 \`scripts/\`(\`pair-switch/\` 实例切换、\`github-sync/\` 五阶段仓库对齐、\`d-sync/\` 差异报告、web 验证夹具等),新增 \`scripts/README-dev-tools.md\` 说明各脚本用途;同批入库 \`scripts/deploy-pair-full.ps1\`(全量部署:清单校验 + 自动回滚)。\r
2673
+ \r
2674
+ ### 文档\r
2675
+ \r
2676
+ - 应用内「更新日志 / API 文档 / 功能介绍 / 常见问题」同步本版修复与监听地址说明;\`/api/system/info\` 版本示例更新为 \`v1.6.1\`。\r
2677
+ \r
2678
+ ---\r
2679
+ \r
2680
+ ## 1.6.0 — 2026-09-12\r
2681
+ \r
2682
+ > 本版汇总 v1.4.15 之后至 v1.6.0 的全部工作(含 1.5.x 期间未单独记录的变更)。\r
2683
+ \r
2684
+ ### 新增\r
2685
+ \r
2686
+ - **段预算双闸门 + 自动分段续跑** — 单段(一次 Run)同时受两道预算约束:**步数预算**(\`stepBudget\`,一步 = 一次 LLM 调用,一次回复并列多个工具调用仍算 1 步)与**工具调用预算**(\`toolCallBudget\`),**任一达上限即结束本段并自动开启续跑段**——同会话历史保留、压缩照常、目标续轮不受影响,长任务不再因单段预算耗尽而中断。续跑段数上限 \`maxToolBudgetSegments\`(默认 20;不允许「不限」,防失控)。三项均可在 **设置 → Agent** 实时配置(默认 120 / 120 / 20;0 或留空 = 默认,工具/步数预算负数 = 不限,超上限自动钳制),配置由插件注册、装配器透传,改完即生效无需重启。\r
2687
+ - **会话交接(提交消息)** — 续跑与新提交对话两个时机自动整理上下文:历史达阈值(≥ max(30% 窗口, 24K tokens) 或 ≥100 条)时生成「会话交接·提交消息」(相关性判断 高/部分/无关 + 目标 / 已完成 / 当前状态 / 关键决策 / 下一步),替代全量历史注入;未达阈值**逐字节原样注入**(缓存前缀零影响)。复用期内增量小则复用、超阈值刷新,并定期做极轻量语义复检(独立小请求,实测 ≈350 tokens),相关性变化时驱动保留深度(16 / 8 / 4 条)。落盘与展示**从不改写原文**(视图不入盘);\`PAIR_HANDOFF=0\` 可整体关闭。\r
2688
+ - **创造模式 \`/创造 <需求>\`** — 用一句需求自主创建「场景」工具集:能力盘点 → 组合(优先复用现有插件)→ 固化到 \`.pair/toolsets/<场景名>.json\`,对话面板「工具集」选择器即时可切换(支持中文场景名)。\r
2689
+ - **LLM 请求/响应追踪(llm-trace 插件)** — 逐请求落盘前缀命中分析(JSONL),可精确定位缓存前缀断裂点,用于长对话成本优化与问题定位。\r
2690
+ - **运行统计条** — 对话面板显示本轮耗时 / 步数 / 工具次数 / 输出 token / token 速度(运行中每秒刷新、结束后定格)。\r
2691
+ - **对话面板可靠性** — 切换对话自动拉取该会话任务(含会话切换竞态保护);WebSocket 断线自动重连并补偿拉取任务与消息。\r
2692
+ - **团队编排无成员化** — 任务 DAG(依赖门禁)、质量门禁(契约字段 / verdict / findings,修复 + 复审自动派生)、两阶段批准(staged → approve → running)、就绪任务提示(claim/update/approve/status 均返回「下一步」),由队长单 Agent 多步执行完成,不再派生成员会话。\r
2693
+ - **绕圈 / 死循环重复检测回归** — 识别模型重复相同调用或重复内容,避免无效空转。\r
2694
+ \r
2695
+ ### 变更 / 改进\r
2696
+ \r
2697
+ - **工具面收敛(单工具形态)** — project_info / memory / goal / load_skill / cordis / codegraph 关系查询等多工具组合并为「单工具 + \`op\` / \`mode\` 参数分派」,LLM 可见工具面显著缩小、误选率下降。\r
2698
+ - **\`apply_patch\` 统一编辑入口** — 补丁式编辑替代原 edit / multi_edit 系列(旧工具全链移除)。\r
2699
+ - **插件面精简** — 36 → 29:移除 tool-git(git 走 \`exec_command\`)/ tool-entryconfig / host-capability-probe / web-api;tool-vision → tool-web、tool-snapshot → tool-harness、tool-asset → tool-resource 合并。\r
2700
+ - **按需工具(deferred)机制移除** — 低频工具直接注册进 LLM 工具面(不再隐藏不可用),可见范围由场景白名单 + \`/命令\` 激活控制;\`/命令\` 激活的工具跨对话保持、每轮重注册。\r
2701
+ - **子 Agent 默认关闭** — 默认不注册 subagent 系列工具,需要时以 \`PAIR_ALLOW_SUBAGENTS=1\` 显式开启。\r
2702
+ - **「最大迭代数」配置项移除** — 段内迭代安全上限改为由预算派生(生效预算 + 5),段的收束交给双闸门 + 自动续跑,无需手工调参。\r
2703
+ - **配置项注册纪律** — 插件配置一律由插件自身 \`ctx.registerSettings\` 注册(存 \`pluginSettings.<插件>\`),不再新增全局设置顶层字段,避免设置面膨胀。\r
2704
+ - **任务按会话隔离** — 任务清单写入 \`ConvID\`,多会话共享任务文件不再互相覆盖。\r
2705
+ - **多项目寻址统一** — 工具相对路径一律相对主项目根解析,跨项目传 \`project\` 参数或绝对路径;搜索忽略目录统一真相源(依赖库 / 构建产物 / VCS / 缓存 + 项目根运行数据 + 用户自定义)。\r
2706
+ \r
2707
+ ### 修复\r
2708
+ \r
2709
+ - **写通道审核 P1:同工具不同参数被连带误驳回** — 驳回指纹由「仅工具名」改为「工具名 + 参数指纹(FNV-1a)」,某次驳回不再影响该工具其他参数的合法调用。\r
2710
+ - **写通道审核 P2/P3:写类工具送审字段为空导致必驳回** — Git 写类等工具参数为 files / message / target,后端审核只读 \`path\` / \`content\` 双空;现按工具形态归一化提取审核字段,AI 审核模式不再 100% 误驳回。\r
2711
+ - **长对话缓存前缀断裂** — 两处根因修复:① 兜底 user 占位符错位(改为末尾追加,反馈 / 压缩 / 新 Run 翻转场景不再整段 miss);② JS 路径压缩冷却不递减(补 \`tick()\` 推进与压缩事件补发,前端可见压缩提示)。\r
2712
+ - **多段续跑落盘丢消息** — 持久化基准由「固定原始历史」改为「可变底账」,第二段不再全量覆盖丢掉第一段新增消息。\r
2713
+ - **会话级工具集白名单污染全局** — 会话注册表改存值拷贝,多会话构建不再互踩(\`/api/tools\` 状态不再被最近一次会话改写)。\r
2714
+ - **\`/命令\` 二次执行不唤醒 agent** — 已激活的按需命令重复执行同样唤醒对话(此前只有结果卡片、对话不动)。\r
2715
+ \r
2716
+ ### 文档\r
2717
+ \r
2718
+ - 应用内文档(快速开始 / 功能介绍 / API 文档 / 工具文档 / 快捷键 / 常见问题 / 更新日志)与仓库 README 同步本版变化(双闸门配置、会话交接、创造模式、团队编排与工具面收敛)。\r
2719
+ \r
2720
+ ---\r
2721
+ \r
2722
+ ## 1.4.15 — 2026-09-02\r
2723
+ \r
2724
+ ### 修复\r
2725
+ - **模型切换报「对话不存在 / 会话不存在」** — 根因:打包管线缺失 vite 壳构建步骤(pipeline 只跑 build-ui 区域插件 + robocopy 同步旧 dist),打包复用过期前端产物,致 \`setConvModel\` 调用参数错位(5 参新调用打在 4 参旧签名上,workspaceRoot 被传成配置名「硅基flash」)→ 后端按错位 workspaceRoot 路由隔离 store 查无会话报 400\r
2726
+ - **packager.json pipeline 新增 \`build-ui-frontend\` 步骤** — 打包前显式构建 vite 壳(plugins-src/ui-app → .pair/assets/runtime/web),保证发布包前端产物始终来自新构建\r
2727
+ - **后端跨 store 兜底防误报** — SessionManager 新增 \`FindConversation\`(指定 workspaceRoot store 查不到时遍历已打开 store 找回),GET/PUT 会话接口在参数缺失/错位时不再误报「不存在」,会话级模型切换落盘到会话真实所属工作区\r
2728
+ \r
2729
+ ### 改进\r
2730
+ - 版本号整体提升至 v1.4.15(main.go 缺省 / packager.json / 前端 package.json)\r
2731
+ \r
2732
+ ---\r
2733
+ \r
2620
2734
  ## 1.2.1 — 2026-08-15\r
2621
2735
  \r
2622
2736
  ### 新增\r
2623
- - **按 deepseek-harness 设计重写 Agent 核心** — 双层循环(turn/step 边界事件、inbox 双队列对齐 next-step/next-turn),消息组装与落盘对齐 harness(agentloop 编号 ↔ 消息序列推导),系统提示精简为 harness 模式(\`WB_FULL_TOOLS=1\` 恢复全量工具)\r
2737
+ - **按双层循环范式重写 Agent 核心** — 双层循环(turn/step 边界事件、inbox 双队列对齐 next-step/next-turn),消息组装与落盘对齐事件模型(agentloop 编号 ↔ 消息序列推导),系统提示精简为基础工具集模式(\`WB_FULL_TOOLS=1\` 恢复全量工具)\r
2624
2738
  - **一切皆插件** — Go 插件框架 + goja JS 动态插件,goja 运行时完全内置(双仓库去除 replace),JS 插件沙箱支持 timer 服务(ctx.timeout/interval)与跨 goroutine 执行锁\r
2625
2739
  - **内置 TS 编译器** — esbuild 纯 Go 转译(无 CGO/npm 依赖),TS 插件可直接加载(\`cordis_define\` 支持 js/ts/自动探测),多文件 TS bundle(Build stdin + mock 包)\r
2626
2740
  - **工具全插件化** — 21 个内置功能插件(core/fs/git/web/shell/memory/task/project-info/codegraph/debug/vision/office/lsp 等),\`cordis_inspect\` 可见工具归属插件,Unload 可回收整组\r
@@ -2895,53 +3009,53 @@ PairCode IDE 还有更多强大功能等待你探索。欢迎查阅帮助文档
2895
3009
  - WebSocket 实时推送 AI 事件流\r
2896
3010
  - 内嵌前端资源(go:embed),单二进制分发\r
2897
3011
  - 纯本地运行,所有 API 仅监听本地回环地址\r
2898
- `;function ie(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var W=ie();function Ve(r){W=r}var J={exec:()=>null};function Q(r){let t=[];return n=>{let o=Math.max(0,Math.min(3,n-1)),l=t[o];return l||(l=r(o),t[o]=l),l}}function S(r,t=""){let n=typeof r=="string"?r:r.source,o={replace:(l,a)=>{let s=typeof a=="string"?a:a.source;return s=s.replace($.caret,"$1"),n=n.replace(l,s),o},getRegex:()=>new RegExp(n,t)};return o}var wr=((r="")=>{try{return!!new RegExp("(?<=1)(?<!1)"+r)}catch{return!1}})(),$={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:r=>new RegExp(`^( {0,3}${r})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:Q(r=>new RegExp(`^ {0,${r}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:Q(r=>new RegExp(`^ {0,${r}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)),fencesBeginRegex:Q(r=>new RegExp(`^ {0,${r}}(?:\`\`\`|~~~)`)),headingBeginRegex:Q(r=>new RegExp(`^ {0,${r}}#`)),htmlBeginRegex:Q(r=>new RegExp(`^ {0,${r}}<(?:[a-z].*>|!--)`,"i")),blockquoteBeginRegex:Q(r=>new RegExp(`^ {0,${r}}>`))},Tr=/^(?:[ \t]*(?:\n|$))+/,Sr=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Cr=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,_=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,Br=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,ce=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,Ne=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,we=S(Ne).replace(/bull/g,ce).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),Ir=S(Ne).replace(/bull/g,ce).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),de=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,Ar=/^[^\n]+/,pe=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,Pr=S(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",pe).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Mr=S(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,ce).getRegex(),ne="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",me=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,$r=S("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",me).replace("tag",ne).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Te=S(de).replace("hr",_).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",ne).getRegex(),Dr=S(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",Te).getRegex(),ge={blockquote:Dr,code:Sr,def:Pr,fences:Cr,heading:Br,hr:_,html:$r,lheading:we,list:Mr,newline:Tr,paragraph:Te,table:J,text:Ar},Se=S("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",_).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",ne).getRegex(),Rr={...ge,lheading:Ir,table:Se,paragraph:S(de).replace("hr",_).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",Se).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",ne).getRegex()},Gr={...ge,html:S(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",me).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:J,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:S(de).replace("hr",_).replace("heading",` *#{1,6} *[^
2899
- ]`).replace("lheading",we).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Lr=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Or=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Ce=/^( {2,}|\\)\n(?!\s*$)/,Fr=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,X=/[\p{P}\p{S}]/u,te=/[\s\p{P}\p{S}]/u,ke=/[^\s\p{P}\p{S}]/u,zr=S(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,te).getRegex(),Be=/(?!~)[\p{P}\p{S}]/u,Ur=/(?!~)[\s\p{P}\p{S}]/u,Hr=/(?:[^\s\p{P}\p{S}]|~)/u,jr=S(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",wr?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),Ie=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,Kr=S(Ie,"u").replace(/punct/g,X).getRegex(),qr=S(Ie,"u").replace(/punct/g,Be).getRegex(),Ae="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",Wr=S(Ae,"gu").replace(/notPunctSpace/g,ke).replace(/punctSpace/g,te).replace(/punct/g,X).getRegex(),Jr=S(Ae,"gu").replace(/notPunctSpace/g,Hr).replace(/punctSpace/g,Ur).replace(/punct/g,Be).getRegex(),Zr=S("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,ke).replace(/punctSpace/g,te).replace(/punct/g,X).getRegex(),Qr=S(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,X).getRegex(),Xr="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",Yr=S(Xr,"gu").replace(/notPunctSpace/g,ke).replace(/punctSpace/g,te).replace(/punct/g,X).getRegex(),_r=S(/\\(punct)/,"gu").replace(/punct/g,X).getRegex(),vr=S(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),el=S(me).replace("(?:-->|$)","-->").getRegex(),nl=S("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",el).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),re=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/,tl=S(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label",re).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),Pe=S(/^!?\[(label)\]\[(ref)\]/).replace("label",re).replace("ref",pe).getRegex(),Me=S(/^!?\[(ref)\](?:\[\])?/).replace("ref",pe).getRegex(),rl=S("reflink|nolink(?!\\()","g").replace("reflink",Pe).replace("nolink",Me).getRegex(),$e=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,he={_backpedal:J,anyPunctuation:_r,autolink:vr,blockSkip:jr,br:Ce,code:Or,del:J,delLDelim:J,delRDelim:J,emStrongLDelim:Kr,emStrongRDelimAst:Wr,emStrongRDelimUnd:Zr,escape:Lr,link:tl,nolink:Me,punctuation:zr,reflink:Pe,reflinkSearch:rl,tag:nl,text:Fr,url:J},ll={...he,link:S(/^!?\[(label)\]\((.*?)\)/).replace("label",re).getRegex(),reflink:S(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",re).getRegex()},fe={...he,emStrongRDelimAst:Jr,emStrongLDelim:qr,delLDelim:Qr,delRDelim:Yr,url:S(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",$e).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:S(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol",$e).getRegex()},ol={...fe,br:S(Ce).replace("{2,}","*").getRegex(),text:S(fe.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},le={normal:ge,gfm:Rr,pedantic:Gr},v={normal:he,gfm:fe,breaks:ol,pedantic:ll},al={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},De=r=>al[r];function H(r,t){if(t){if($.escapeTest.test(r))return r.replace($.escapeReplace,De)}else if($.escapeTestNoEncode.test(r))return r.replace($.escapeReplaceNoEncode,De);return r}function Re(r){try{r=encodeURI(r).replace($.percentDecode,"%")}catch{return null}return r}function Ge(r,t){var a;let n=r.replace($.findPipe,(s,d,i)=>{let f=!1,k=d;for(;--k>=0&&i[k]==="\\";)f=!f;return f?"|":" |"}),o=n.split($.splitPipe),l=0;if(o[0].trim()||o.shift(),o.length>0&&!((a=o.at(-1))!=null&&a.trim())&&o.pop(),t)if(o.length>t)o.splice(t);else for(;o.length<t;)o.push("");for(;l<o.length;l++)o[l]=o[l].trim().replace($.slashPipe,"|");return o}function q(r,t,n){let o=r.length;if(o===0)return"";let l=0;for(;l<o&&r.charAt(o-l-1)===t;)l++;return r.slice(0,o-l)}function Le(r){let t=r.split(`
2900
- `),n=t.length-1;for(;n>=0&&$.blankLine.test(t[n]);)n--;return t.length-n<=2?r:t.slice(0,n+1).join(`
2901
- `)}function sl(r,t){if(r.indexOf(t[1])===-1)return-1;let n=0;for(let o=0;o<r.length;o++)if(r[o]==="\\")o++;else if(r[o]===t[0])n++;else if(r[o]===t[1]&&(n--,n<0))return o;return n>0?-2:-1}function il(r,t=0){let n=t,o="";for(let l of r)if(l===" "){let a=4-n%4;o+=" ".repeat(a),n+=a}else o+=l,n++;return o}function Oe(r,t,n,o,l){let a=t.href,s=t.title||null,d=r[1].replace(l.other.outputLinkReplace,"$1");o.state.inLink=!0;let i={type:r[0].charAt(0)==="!"?"image":"link",raw:n,href:a,title:s,text:d,tokens:o.inlineTokens(d)};return o.state.inLink=!1,i}function cl(r,t,n){let o=r.match(n.other.indentCodeCompensation);if(o===null)return t;let l=o[1];return t.split(`
3012
+ `;function ce(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var Z=ce();function we(r){Z=r}var Q={exec:()=>null};function Y(r){let t=[];return n=>{let o=Math.max(0,Math.min(3,n-1)),l=t[o];return l||(l=r(o),t[o]=l),l}}function S(r,t=""){let n=typeof r=="string"?r:r.source,o={replace:(l,a)=>{let s=typeof a=="string"?a:a.source;return s=s.replace(G.caret,"$1"),n=n.replace(l,s),o},getRegex:()=>new RegExp(n,t)};return o}var Gr=((r="")=>{try{return!!new RegExp("(?<=1)(?<!1)"+r)}catch{return!1}})(),G={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:r=>new RegExp(`^( {0,3}${r})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:Y(r=>new RegExp(`^ {0,${r}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:Y(r=>new RegExp(`^ {0,${r}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)),fencesBeginRegex:Y(r=>new RegExp(`^ {0,${r}}(?:\`\`\`|~~~)`)),headingBeginRegex:Y(r=>new RegExp(`^ {0,${r}}#`)),htmlBeginRegex:Y(r=>new RegExp(`^ {0,${r}}<(?:[a-z].*>|!--)`,"i")),blockquoteBeginRegex:Y(r=>new RegExp(`^ {0,${r}}>`))},Fr=/^(?:[ \t]*(?:\n|$))+/,Or=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,zr=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,v=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,Ur=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,de=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,Te=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Be=S(Te).replace(/bull/g,de).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),jr=S(Te).replace(/bull/g,de).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),pe=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,Hr=/^[^\n]+/,me=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,qr=S(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",me).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Wr=S(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,de).getRegex(),te="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",ge=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,Jr=S("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",ge).replace("tag",te).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Se=S(pe).replace("hr",v).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",te).getRegex(),Kr=S(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",Se).getRegex(),ke={blockquote:Kr,code:Or,def:qr,fences:zr,heading:Ur,hr:v,html:Jr,lheading:Be,list:Wr,newline:Fr,paragraph:Se,table:Q,text:Hr},Ce=S("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",v).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",te).getRegex(),Zr={...ke,lheading:jr,table:Ce,paragraph:S(pe).replace("hr",v).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",Ce).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",te).getRegex()},Qr={...ke,html:S(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",ge).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Q,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:S(pe).replace("hr",v).replace("heading",` *#{1,6} *[^
3013
+ ]`).replace("lheading",Be).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Xr=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Yr=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Ie=/^( {2,}|\\)\n(?!\s*$)/,_r=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,_=/[\p{P}\p{S}]/u,re=/[\s\p{P}\p{S}]/u,he=/[^\s\p{P}\p{S}]/u,vr=S(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,re).getRegex(),Ae=/(?!~)[\p{P}\p{S}]/u,eo=/(?!~)[\s\p{P}\p{S}]/u,no=/(?:[^\s\p{P}\p{S}]|~)/u,to=S(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",Gr?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),Pe=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,ro=S(Pe,"u").replace(/punct/g,_).getRegex(),oo=S(Pe,"u").replace(/punct/g,Ae).getRegex(),$e="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",lo=S($e,"gu").replace(/notPunctSpace/g,he).replace(/punctSpace/g,re).replace(/punct/g,_).getRegex(),ao=S($e,"gu").replace(/notPunctSpace/g,no).replace(/punctSpace/g,eo).replace(/punct/g,Ae).getRegex(),so=S("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,he).replace(/punctSpace/g,re).replace(/punct/g,_).getRegex(),io=S(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,_).getRegex(),co="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",po=S(co,"gu").replace(/notPunctSpace/g,he).replace(/punctSpace/g,re).replace(/punct/g,_).getRegex(),mo=S(/\\(punct)/,"gu").replace(/punct/g,_).getRegex(),go=S(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),ko=S(ge).replace("(?:-->|$)","-->").getRegex(),ho=S("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",ko).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),oe=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/,fo=S(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label",oe).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),Me=S(/^!?\[(label)\]\[(ref)\]/).replace("label",oe).replace("ref",me).getRegex(),De=S(/^!?\[(ref)\](?:\[\])?/).replace("ref",me).getRegex(),yo=S("reflink|nolink(?!\\()","g").replace("reflink",Me).replace("nolink",De).getRegex(),Re=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,fe={_backpedal:Q,anyPunctuation:mo,autolink:go,blockSkip:to,br:Ie,code:Yr,del:Q,delLDelim:Q,delRDelim:Q,emStrongLDelim:ro,emStrongRDelimAst:lo,emStrongRDelimUnd:so,escape:Xr,link:fo,nolink:De,punctuation:vr,reflink:Me,reflinkSearch:yo,tag:ho,text:_r,url:Q},uo={...fe,link:S(/^!?\[(label)\]\((.*?)\)/).replace("label",oe).getRegex(),reflink:S(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",oe).getRegex()},ye={...fe,emStrongRDelimAst:ao,emStrongLDelim:oo,delLDelim:io,delRDelim:po,url:S(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",Re).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:S(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol",Re).getRegex()},Eo={...ye,br:S(Ie).replace("{2,}","*").getRegex(),text:S(ye.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},le={normal:ke,gfm:Zr,pedantic:Qr},ee={normal:fe,gfm:ye,breaks:Eo,pedantic:uo},bo={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Le=r=>bo[r];function q(r,t){if(t){if(G.escapeTest.test(r))return r.replace(G.escapeReplace,Le)}else if(G.escapeTestNoEncode.test(r))return r.replace(G.escapeReplaceNoEncode,Le);return r}function Ge(r){try{r=encodeURI(r).replace(G.percentDecode,"%")}catch{return null}return r}function Fe(r,t){var a;let n=r.replace(G.findPipe,(s,d,i)=>{let h=!1,g=d;for(;--g>=0&&i[g]==="\\";)h=!h;return h?"|":" |"}),o=n.split(G.splitPipe),l=0;if(o[0].trim()||o.shift(),o.length>0&&!((a=o.at(-1))!=null&&a.trim())&&o.pop(),t)if(o.length>t)o.splice(t);else for(;o.length<t;)o.push("");for(;l<o.length;l++)o[l]=o[l].trim().replace(G.slashPipe,"|");return o}function K(r,t,n){let o=r.length;if(o===0)return"";let l=0;for(;l<o&&r.charAt(o-l-1)===t;)l++;return r.slice(0,o-l)}function Oe(r){let t=r.split(`
3014
+ `),n=t.length-1;for(;n>=0&&G.blankLine.test(t[n]);)n--;return t.length-n<=2?r:t.slice(0,n+1).join(`
3015
+ `)}function xo(r,t){if(r.indexOf(t[1])===-1)return-1;let n=0;for(let o=0;o<r.length;o++)if(r[o]==="\\")o++;else if(r[o]===t[0])n++;else if(r[o]===t[1]&&(n--,n<0))return o;return n>0?-2:-1}function Vo(r,t=0){let n=t,o="";for(let l of r)if(l===" "){let a=4-n%4;o+=" ".repeat(a),n+=a}else o+=l,n++;return o}function ze(r,t,n,o,l){let a=t.href,s=t.title||null,d=r[1].replace(l.other.outputLinkReplace,"$1");o.state.inLink=!0;let i={type:r[0].charAt(0)==="!"?"image":"link",raw:n,href:a,title:s,text:d,tokens:o.inlineTokens(d)};return o.state.inLink=!1,i}function No(r,t,n){let o=r.match(n.other.indentCodeCompensation);if(o===null)return t;let l=o[1];return t.split(`
2902
3016
  `).map(a=>{let s=a.match(n.other.beginningSpace);if(s===null)return a;let[d]=s;return d.length>=l.length?a.slice(l.length):a}).join(`
2903
- `)}var oe=class{constructor(r){I(this,"options");I(this,"rules");I(this,"lexer");this.options=r||W}space(r){let t=this.rules.block.newline.exec(r);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(r){let t=this.rules.block.code.exec(r);if(t){let n=this.options.pedantic?t[0]:Le(t[0]),o=n.replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:n,codeBlockStyle:"indented",text:o}}}fences(r){let t=this.rules.block.fences.exec(r);if(t){let n=t[0],o=cl(n,t[3]||"",this.rules);return{type:"code",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:o}}}heading(r){let t=this.rules.block.heading.exec(r);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let o=q(n,"#");(this.options.pedantic||!o||this.rules.other.endingSpaceChar.test(o))&&(n=o.trim())}return{type:"heading",raw:q(t[0],`
2904
- `),depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(r){let t=this.rules.block.hr.exec(r);if(t)return{type:"hr",raw:q(t[0],`
2905
- `)}}blockquote(r){let t=this.rules.block.blockquote.exec(r);if(t){let n=q(t[0],`
3017
+ `)}var ae=class{constructor(r){P(this,"options");P(this,"rules");P(this,"lexer");this.options=r||Z}space(r){let t=this.rules.block.newline.exec(r);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(r){let t=this.rules.block.code.exec(r);if(t){let n=this.options.pedantic?t[0]:Oe(t[0]),o=n.replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:n,codeBlockStyle:"indented",text:o}}}fences(r){let t=this.rules.block.fences.exec(r);if(t){let n=t[0],o=No(n,t[3]||"",this.rules);return{type:"code",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:o}}}heading(r){let t=this.rules.block.heading.exec(r);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let o=K(n,"#");(this.options.pedantic||!o||this.rules.other.endingSpaceChar.test(o))&&(n=o.trim())}return{type:"heading",raw:K(t[0],`
3018
+ `),depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(r){let t=this.rules.block.hr.exec(r);if(t)return{type:"hr",raw:K(t[0],`
3019
+ `)}}blockquote(r){let t=this.rules.block.blockquote.exec(r);if(t){let n=K(t[0],`
2906
3020
  `).split(`
2907
- `),o="",l="",a=[];for(;n.length>0;){let s=!1,d=[],i;for(i=0;i<n.length;i++)if(this.rules.other.blockquoteStart.test(n[i]))d.push(n[i]),s=!0;else if(!s)d.push(n[i]);else break;n=n.slice(i);let f=d.join(`
2908
- `),k=f.replace(this.rules.other.blockquoteSetextReplace,`
3021
+ `),o="",l="",a=[];for(;n.length>0;){let s=!1,d=[],i;for(i=0;i<n.length;i++)if(this.rules.other.blockquoteStart.test(n[i]))d.push(n[i]),s=!0;else if(!s)d.push(n[i]);else break;n=n.slice(i);let h=d.join(`
3022
+ `),g=h.replace(this.rules.other.blockquoteSetextReplace,`
2909
3023
  $1`).replace(this.rules.other.blockquoteSetextReplace2,"");o=o?`${o}
2910
- ${f}`:f,l=l?`${l}
2911
- ${k}`:k;let b=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(k,a,!0),this.lexer.state.top=b,n.length===0)break;let u=a.at(-1);if((u==null?void 0:u.type)==="code")break;if((u==null?void 0:u.type)==="blockquote"){let w=u,x=w.raw+`
3024
+ ${h}`:h,l=l?`${l}
3025
+ ${g}`:g;let x=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(g,a,!0),this.lexer.state.top=x,n.length===0)break;let N=a.at(-1);if((N==null?void 0:N.type)==="code")break;if((N==null?void 0:N.type)==="blockquote"){let B=N,y=B.raw+`
2912
3026
  `+n.join(`
2913
- `),N=this.blockquote(x);a[a.length-1]=N,o=o.substring(0,o.length-w.raw.length)+N.raw,l=l.substring(0,l.length-w.text.length)+N.text;break}else if((u==null?void 0:u.type)==="list"){let w=u,x=w.raw+`
3027
+ `),T=this.blockquote(y);a[a.length-1]=T,o=o.substring(0,o.length-B.raw.length)+T.raw,l=l.substring(0,l.length-B.text.length)+T.text;break}else if((N==null?void 0:N.type)==="list"){let B=N,y=B.raw+`
2914
3028
  `+n.join(`
2915
- `),N=this.list(x);a[a.length-1]=N,o=o.substring(0,o.length-u.raw.length)+N.raw,l=l.substring(0,l.length-w.raw.length)+N.raw,n=x.substring(a.at(-1).raw.length).split(`
2916
- `);continue}}return{type:"blockquote",raw:o,tokens:a,text:l}}}list(r){let t=this.rules.block.list.exec(r);if(t){let n=t[1].trim(),o=n.length>1,l={type:"list",raw:"",ordered:o,start:o?+n.slice(0,-1):"",loose:!1,items:[]};n=o?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=o?n:"[*+-]");let a=this.rules.other.listItemRegex(n),s=!1;for(;r;){let i=!1,f="",k="";if(!(t=a.exec(r))||this.rules.block.hr.test(r))break;f=t[0],r=r.substring(f.length);let b=il(t[2].split(`
2917
- `,1)[0],t[1].length),u=r.split(`
2918
- `,1)[0],w=!b.trim(),x=0;if(this.options.pedantic?(x=2,k=b.trimStart()):w?x=t[1].length+1:(x=b.search(this.rules.other.nonSpaceChar),x=x>4?1:x,k=b.slice(x),x+=t[1].length),w&&this.rules.other.blankLine.test(u)&&(f+=u+`
2919
- `,r=r.substring(u.length+1),i=!0),!i){let N=this.rules.other.nextBulletRegex(x),T=this.rules.other.hrRegex(x),L=this.rules.other.fencesBeginRegex(x),M=this.rules.other.headingBeginRegex(x),D=this.rules.other.htmlBeginRegex(x),K=this.rules.other.blockquoteBeginRegex(x);for(;r;){let U=r.split(`
2920
- `,1)[0],R;if(u=U,this.options.pedantic?(u=u.replace(this.rules.other.listReplaceNesting," "),R=u):R=u.replace(this.rules.other.tabCharGlobal," "),L.test(u)||M.test(u)||D.test(u)||K.test(u)||N.test(u)||T.test(u))break;if(R.search(this.rules.other.nonSpaceChar)>=x||!u.trim())k+=`
2921
- `+R.slice(x);else{if(w||b.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||L.test(b)||M.test(b)||T.test(b))break;k+=`
2922
- `+u}w=!u.trim(),f+=U+`
2923
- `,r=r.substring(U.length+1),b=R.slice(x)}}l.loose||(s?l.loose=!0:this.rules.other.doubleBlankLine.test(f)&&(s=!0)),l.items.push({type:"list_item",raw:f,task:!!this.options.gfm&&this.rules.other.listIsTask.test(k),loose:!1,text:k,tokens:[]}),l.raw+=f}let d=l.items.at(-1);if(d)d.raw=d.raw.trimEnd(),d.text=d.text.trimEnd();else return;l.raw=l.raw.trimEnd();for(let i of l.items){this.lexer.state.top=!1,i.tokens=this.lexer.blockTokens(i.text,[]);let f=i.tokens[0];if(i.task&&((f==null?void 0:f.type)==="text"||(f==null?void 0:f.type)==="paragraph")){i.text=i.text.replace(this.rules.other.listReplaceTask,""),f.raw=f.raw.replace(this.rules.other.listReplaceTask,""),f.text=f.text.replace(this.rules.other.listReplaceTask,"");for(let b=this.lexer.inlineQueue.length-1;b>=0;b--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[b].src)){this.lexer.inlineQueue[b].src=this.lexer.inlineQueue[b].src.replace(this.rules.other.listReplaceTask,"");break}let k=this.rules.other.listTaskCheckbox.exec(i.raw);if(k){let b={type:"checkbox",raw:k[0]+" ",checked:k[0]!=="[ ]"};i.checked=b.checked,l.loose?i.tokens[0]&&["paragraph","text"].includes(i.tokens[0].type)&&"tokens"in i.tokens[0]&&i.tokens[0].tokens?(i.tokens[0].raw=b.raw+i.tokens[0].raw,i.tokens[0].text=b.raw+i.tokens[0].text,i.tokens[0].tokens.unshift(b)):i.tokens.unshift({type:"paragraph",raw:b.raw,text:b.raw,tokens:[b]}):i.tokens.unshift(b)}}else i.task&&(i.task=!1);if(!l.loose){let k=i.tokens.filter(u=>u.type==="space"),b=k.length>0&&k.some(u=>this.rules.other.anyLine.test(u.raw));l.loose=b}}if(l.loose)for(let i of l.items){i.loose=!0;for(let f of i.tokens)f.type==="text"&&(f.type="paragraph")}return l}}html(r){let t=this.rules.block.html.exec(r);if(t){let n=Le(t[0]);return{type:"html",block:!0,raw:n,pre:t[1]==="pre"||t[1]==="script"||t[1]==="style",text:n}}}def(r){let t=this.rules.block.def.exec(r);if(t){let n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),o=t[2]?t[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",l=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):t[3];return{type:"def",tag:n,raw:q(t[0],`
2924
- `),href:o,title:l}}}table(r){var s;let t=this.rules.block.table.exec(r);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=Ge(t[1]),o=t[2].replace(this.rules.other.tableAlignChars,"").split("|"),l=(s=t[3])!=null&&s.trim()?t[3].replace(this.rules.other.tableRowBlankLine,"").split(`
2925
- `):[],a={type:"table",raw:q(t[0],`
2926
- `),header:[],align:[],rows:[]};if(n.length===o.length){for(let d of o)this.rules.other.tableAlignRight.test(d)?a.align.push("right"):this.rules.other.tableAlignCenter.test(d)?a.align.push("center"):this.rules.other.tableAlignLeft.test(d)?a.align.push("left"):a.align.push(null);for(let d=0;d<n.length;d++)a.header.push({text:n[d],tokens:this.lexer.inline(n[d]),header:!0,align:a.align[d]});for(let d of l)a.rows.push(Ge(d,a.header.length).map((i,f)=>({text:i,tokens:this.lexer.inline(i),header:!1,align:a.align[f]})));return a}}lheading(r){let t=this.rules.block.lheading.exec(r);if(t){let n=t[1].trim();return{type:"heading",raw:q(t[0],`
3029
+ `),T=this.list(y);a[a.length-1]=T,o=o.substring(0,o.length-N.raw.length)+T.raw,l=l.substring(0,l.length-B.raw.length)+T.raw,n=y.substring(a.at(-1).raw.length).split(`
3030
+ `);continue}}return{type:"blockquote",raw:o,tokens:a,text:l}}}list(r){let t=this.rules.block.list.exec(r);if(t){let n=t[1].trim(),o=n.length>1,l={type:"list",raw:"",ordered:o,start:o?+n.slice(0,-1):"",loose:!1,items:[]};n=o?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=o?n:"[*+-]");let a=this.rules.other.listItemRegex(n),s=!1;for(;r;){let i=!1,h="",g="";if(!(t=a.exec(r))||this.rules.block.hr.test(r))break;h=t[0],r=r.substring(h.length);let x=Vo(t[2].split(`
3031
+ `,1)[0],t[1].length),N=r.split(`
3032
+ `,1)[0],B=!x.trim(),y=0;if(this.options.pedantic?(y=2,g=x.trimStart()):B?y=t[1].length+1:(y=x.search(this.rules.other.nonSpaceChar),y=y>4?1:y,g=x.slice(y),y+=t[1].length),B&&this.rules.other.blankLine.test(N)&&(h+=N+`
3033
+ `,r=r.substring(N.length+1),i=!0),!i){let T=this.rules.other.nextBulletRegex(y),C=this.rules.other.hrRegex(y),$=this.rules.other.fencesBeginRegex(y),R=this.rules.other.headingBeginRegex(y),O=this.rules.other.htmlBeginRegex(y),W=this.rules.other.blockquoteBeginRegex(y);for(;r;){let z=r.split(`
3034
+ `,1)[0],F;if(N=z,this.options.pedantic?(N=N.replace(this.rules.other.listReplaceNesting," "),F=N):F=N.replace(this.rules.other.tabCharGlobal," "),$.test(N)||R.test(N)||O.test(N)||W.test(N)||T.test(N)||C.test(N))break;if(F.search(this.rules.other.nonSpaceChar)>=y||!N.trim())g+=`
3035
+ `+F.slice(y);else{if(B||x.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||$.test(x)||R.test(x)||C.test(x))break;g+=`
3036
+ `+N}B=!N.trim(),h+=z+`
3037
+ `,r=r.substring(z.length+1),x=F.slice(y)}}l.loose||(s?l.loose=!0:this.rules.other.doubleBlankLine.test(h)&&(s=!0)),l.items.push({type:"list_item",raw:h,task:!!this.options.gfm&&this.rules.other.listIsTask.test(g),loose:!1,text:g,tokens:[]}),l.raw+=h}let d=l.items.at(-1);if(d)d.raw=d.raw.trimEnd(),d.text=d.text.trimEnd();else return;l.raw=l.raw.trimEnd();for(let i of l.items){this.lexer.state.top=!1,i.tokens=this.lexer.blockTokens(i.text,[]);let h=i.tokens[0];if(i.task&&((h==null?void 0:h.type)==="text"||(h==null?void 0:h.type)==="paragraph")){i.text=i.text.replace(this.rules.other.listReplaceTask,""),h.raw=h.raw.replace(this.rules.other.listReplaceTask,""),h.text=h.text.replace(this.rules.other.listReplaceTask,"");for(let x=this.lexer.inlineQueue.length-1;x>=0;x--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[x].src)){this.lexer.inlineQueue[x].src=this.lexer.inlineQueue[x].src.replace(this.rules.other.listReplaceTask,"");break}let g=this.rules.other.listTaskCheckbox.exec(i.raw);if(g){let x={type:"checkbox",raw:g[0]+" ",checked:g[0]!=="[ ]"};i.checked=x.checked,l.loose?i.tokens[0]&&["paragraph","text"].includes(i.tokens[0].type)&&"tokens"in i.tokens[0]&&i.tokens[0].tokens?(i.tokens[0].raw=x.raw+i.tokens[0].raw,i.tokens[0].text=x.raw+i.tokens[0].text,i.tokens[0].tokens.unshift(x)):i.tokens.unshift({type:"paragraph",raw:x.raw,text:x.raw,tokens:[x]}):i.tokens.unshift(x)}}else i.task&&(i.task=!1);if(!l.loose){let g=i.tokens.filter(N=>N.type==="space"),x=g.length>0&&g.some(N=>this.rules.other.anyLine.test(N.raw));l.loose=x}}if(l.loose)for(let i of l.items){i.loose=!0;for(let h of i.tokens)h.type==="text"&&(h.type="paragraph")}return l}}html(r){let t=this.rules.block.html.exec(r);if(t){let n=Oe(t[0]);return{type:"html",block:!0,raw:n,pre:t[1]==="pre"||t[1]==="script"||t[1]==="style",text:n}}}def(r){let t=this.rules.block.def.exec(r);if(t){let n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),o=t[2]?t[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",l=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):t[3];return{type:"def",tag:n,raw:K(t[0],`
3038
+ `),href:o,title:l}}}table(r){var s;let t=this.rules.block.table.exec(r);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=Fe(t[1]),o=t[2].replace(this.rules.other.tableAlignChars,"").split("|"),l=(s=t[3])!=null&&s.trim()?t[3].replace(this.rules.other.tableRowBlankLine,"").split(`
3039
+ `):[],a={type:"table",raw:K(t[0],`
3040
+ `),header:[],align:[],rows:[]};if(n.length===o.length){for(let d of o)this.rules.other.tableAlignRight.test(d)?a.align.push("right"):this.rules.other.tableAlignCenter.test(d)?a.align.push("center"):this.rules.other.tableAlignLeft.test(d)?a.align.push("left"):a.align.push(null);for(let d=0;d<n.length;d++)a.header.push({text:n[d],tokens:this.lexer.inline(n[d]),header:!0,align:a.align[d]});for(let d of l)a.rows.push(Fe(d,a.header.length).map((i,h)=>({text:i,tokens:this.lexer.inline(i),header:!1,align:a.align[h]})));return a}}lheading(r){let t=this.rules.block.lheading.exec(r);if(t){let n=t[1].trim();return{type:"heading",raw:K(t[0],`
2927
3041
  `),depth:t[2].charAt(0)==="="?1:2,text:n,tokens:this.lexer.inline(n)}}}paragraph(r){let t=this.rules.block.paragraph.exec(r);if(t){let n=t[1].charAt(t[1].length-1)===`
2928
- `?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(r){let t=this.rules.block.text.exec(r);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(r){let t=this.rules.inline.escape.exec(r);if(t)return{type:"escape",raw:t[0],text:t[1]}}tag(r){let t=this.rules.inline.tag.exec(r);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(r){let t=this.rules.inline.link.exec(r);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let a=q(n.slice(0,-1),"\\");if((n.length-a.length)%2===0)return}else{let a=sl(t[2],"()");if(a===-2)return;if(a>-1){let s=(t[0].indexOf("!")===0?5:4)+t[1].length+a;t[2]=t[2].substring(0,a),t[0]=t[0].substring(0,s).trim(),t[3]=""}}let o=t[2],l="";if(this.options.pedantic){let a=this.rules.other.pedanticHrefTitle.exec(o);a&&(o=a[1],l=a[3])}else l=t[3]?t[3].slice(1,-1):"";return o=o.trim(),this.rules.other.startAngleBracket.test(o)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?o=o.slice(1):o=o.slice(1,-1)),Oe(t,{href:o&&o.replace(this.rules.inline.anyPunctuation,"$1"),title:l&&l.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer,this.rules)}}reflink(r,t){let n;if((n=this.rules.inline.reflink.exec(r))||(n=this.rules.inline.nolink.exec(r))){let o=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),l=t[o.toLowerCase()];if(!l){let a=n[0].charAt(0);return{type:"text",raw:a,text:a}}return Oe(n,l,n[0],this.lexer,this.rules)}}emStrong(r,t,n=""){let o=this.rules.inline.emStrongLDelim.exec(r);if(!(!o||!o[1]&&!o[2]&&!o[3]&&!o[4]||o[4]&&n.match(this.rules.other.unicodeAlphaNumeric))&&(!(o[1]||o[3])||!n||this.rules.inline.punctuation.exec(n))){let l=[...o[0]].length-1,a,s,d=l,i=0,f=o[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(f.lastIndex=0,t=t.slice(-1*r.length+l);(o=f.exec(t))!==null;){if(a=o[1]||o[2]||o[3]||o[4]||o[5]||o[6],!a)continue;if(s=[...a].length,o[3]||o[4]){d+=s;continue}else if((o[5]||o[6])&&l%3&&!((l+s)%3)){i+=s;continue}if(d-=s,d>0)continue;s=Math.min(s,s+d+i);let k=[...o[0]][0].length,b=r.slice(0,l+o.index+k+s);if(Math.min(l,s)%2){let w=b.slice(1,-1);return{type:"em",raw:b,text:w,tokens:this.lexer.inlineTokens(w)}}let u=b.slice(2,-2);return{type:"strong",raw:b,text:u,tokens:this.lexer.inlineTokens(u)}}}}codespan(r){let t=this.rules.inline.code.exec(r);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal," "),o=this.rules.other.nonSpaceChar.test(n),l=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return o&&l&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:t[0],text:n}}}br(r){let t=this.rules.inline.br.exec(r);if(t)return{type:"br",raw:t[0]}}del(r,t,n=""){let o=this.rules.inline.delLDelim.exec(r);if(o&&(!o[1]||!n||this.rules.inline.punctuation.exec(n))){let l=[...o[0]].length-1,a,s,d=l,i=this.rules.inline.delRDelim;for(i.lastIndex=0,t=t.slice(-1*r.length+l);(o=i.exec(t))!==null;){if(a=o[1]||o[2]||o[3]||o[4]||o[5]||o[6],!a||(s=[...a].length,s!==l))continue;if(o[3]||o[4]){d+=s;continue}if(d-=s,d>0)continue;s=Math.min(s,s+d);let f=[...o[0]][0].length,k=r.slice(0,l+o.index+f+s),b=k.slice(l,-l);return{type:"del",raw:k,text:b,tokens:this.lexer.inlineTokens(b)}}}}autolink(r){let t=this.rules.inline.autolink.exec(r);if(t){let n,o;return t[2]==="@"?(n=t[1],o="mailto:"+n):(n=t[1],o=n),{type:"link",raw:t[0],text:n,href:o,tokens:[{type:"text",raw:n,text:n}]}}}url(r){var n;let t;if(t=this.rules.inline.url.exec(r)){let o,l;if(t[2]==="@")o=t[0],l="mailto:"+o;else{let a;do a=t[0],t[0]=((n=this.rules.inline._backpedal.exec(t[0]))==null?void 0:n[0])??"";while(a!==t[0]);o=t[0],t[1]==="www."?l="http://"+t[0]:l=t[0]}return{type:"link",raw:t[0],text:o,href:l,tokens:[{type:"text",raw:o,text:o}]}}}inlineText(r){let t=this.rules.inline.text.exec(r);if(t){let n=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:t[0],escaped:n}}}},F=class ue{constructor(t){I(this,"tokens");I(this,"options");I(this,"state");I(this,"inlineQueue");I(this,"tokenizer");this.tokens=[],this.tokens.links=Object.create(null),this.options=t||W,this.options.tokenizer=this.options.tokenizer||new oe,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let n={other:$,block:le.normal,inline:v.normal};this.options.pedantic?(n.block=le.pedantic,n.inline=v.pedantic):this.options.gfm&&(n.block=le.gfm,this.options.breaks?n.inline=v.breaks:n.inline=v.gfm),this.tokenizer.rules=n}static get rules(){return{block:le,inline:v}}static lex(t,n){return new ue(n).lex(t)}static lexInline(t,n){return new ue(n).inlineTokens(t)}lex(t){t=t.replace($.carriageReturn,`
2929
- `),this.blockTokens(t,this.tokens);for(let n=0;n<this.inlineQueue.length;n++){let o=this.inlineQueue[n];this.inlineTokens(o.src,o.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(t,n=[],o=!1){var a,s,d;this.tokenizer.lexer=this,this.options.pedantic&&(t=t.replace($.tabCharGlobal," ").replace($.spaceLine,""));let l=1/0;for(;t;){if(t.length<l)l=t.length;else{this.infiniteLoopError(t.charCodeAt(0));break}let i;if((s=(a=this.options.extensions)==null?void 0:a.block)!=null&&s.some(k=>(i=k.call({lexer:this},t,n))?(t=t.substring(i.raw.length),n.push(i),!0):!1))continue;if(i=this.tokenizer.space(t)){t=t.substring(i.raw.length);let k=n.at(-1);i.raw.length===1&&k!==void 0?k.raw+=`
2930
- `:n.push(i);continue}if(i=this.tokenizer.code(t)){t=t.substring(i.raw.length);let k=n.at(-1);(k==null?void 0:k.type)==="paragraph"||(k==null?void 0:k.type)==="text"?(k.raw+=(k.raw.endsWith(`
3042
+ `?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(r){let t=this.rules.block.text.exec(r);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(r){let t=this.rules.inline.escape.exec(r);if(t)return{type:"escape",raw:t[0],text:t[1]}}tag(r){let t=this.rules.inline.tag.exec(r);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(r){let t=this.rules.inline.link.exec(r);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let a=K(n.slice(0,-1),"\\");if((n.length-a.length)%2===0)return}else{let a=xo(t[2],"()");if(a===-2)return;if(a>-1){let s=(t[0].indexOf("!")===0?5:4)+t[1].length+a;t[2]=t[2].substring(0,a),t[0]=t[0].substring(0,s).trim(),t[3]=""}}let o=t[2],l="";if(this.options.pedantic){let a=this.rules.other.pedanticHrefTitle.exec(o);a&&(o=a[1],l=a[3])}else l=t[3]?t[3].slice(1,-1):"";return o=o.trim(),this.rules.other.startAngleBracket.test(o)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?o=o.slice(1):o=o.slice(1,-1)),ze(t,{href:o&&o.replace(this.rules.inline.anyPunctuation,"$1"),title:l&&l.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer,this.rules)}}reflink(r,t){let n;if((n=this.rules.inline.reflink.exec(r))||(n=this.rules.inline.nolink.exec(r))){let o=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),l=t[o.toLowerCase()];if(!l){let a=n[0].charAt(0);return{type:"text",raw:a,text:a}}return ze(n,l,n[0],this.lexer,this.rules)}}emStrong(r,t,n=""){let o=this.rules.inline.emStrongLDelim.exec(r);if(!(!o||!o[1]&&!o[2]&&!o[3]&&!o[4]||o[4]&&n.match(this.rules.other.unicodeAlphaNumeric))&&(!(o[1]||o[3])||!n||this.rules.inline.punctuation.exec(n))){let l=[...o[0]].length-1,a,s,d=l,i=0,h=o[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(h.lastIndex=0,t=t.slice(-1*r.length+l);(o=h.exec(t))!==null;){if(a=o[1]||o[2]||o[3]||o[4]||o[5]||o[6],!a)continue;if(s=[...a].length,o[3]||o[4]){d+=s;continue}else if((o[5]||o[6])&&l%3&&!((l+s)%3)){i+=s;continue}if(d-=s,d>0)continue;s=Math.min(s,s+d+i);let g=[...o[0]][0].length,x=r.slice(0,l+o.index+g+s);if(Math.min(l,s)%2){let B=x.slice(1,-1);return{type:"em",raw:x,text:B,tokens:this.lexer.inlineTokens(B)}}let N=x.slice(2,-2);return{type:"strong",raw:x,text:N,tokens:this.lexer.inlineTokens(N)}}}}codespan(r){let t=this.rules.inline.code.exec(r);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal," "),o=this.rules.other.nonSpaceChar.test(n),l=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return o&&l&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:t[0],text:n}}}br(r){let t=this.rules.inline.br.exec(r);if(t)return{type:"br",raw:t[0]}}del(r,t,n=""){let o=this.rules.inline.delLDelim.exec(r);if(o&&(!o[1]||!n||this.rules.inline.punctuation.exec(n))){let l=[...o[0]].length-1,a,s,d=l,i=this.rules.inline.delRDelim;for(i.lastIndex=0,t=t.slice(-1*r.length+l);(o=i.exec(t))!==null;){if(a=o[1]||o[2]||o[3]||o[4]||o[5]||o[6],!a||(s=[...a].length,s!==l))continue;if(o[3]||o[4]){d+=s;continue}if(d-=s,d>0)continue;s=Math.min(s,s+d);let h=[...o[0]][0].length,g=r.slice(0,l+o.index+h+s),x=g.slice(l,-l);return{type:"del",raw:g,text:x,tokens:this.lexer.inlineTokens(x)}}}}autolink(r){let t=this.rules.inline.autolink.exec(r);if(t){let n,o;return t[2]==="@"?(n=t[1],o="mailto:"+n):(n=t[1],o=n),{type:"link",raw:t[0],text:n,href:o,tokens:[{type:"text",raw:n,text:n}]}}}url(r){var n;let t;if(t=this.rules.inline.url.exec(r)){let o,l;if(t[2]==="@")o=t[0],l="mailto:"+o;else{let a;do a=t[0],t[0]=((n=this.rules.inline._backpedal.exec(t[0]))==null?void 0:n[0])??"";while(a!==t[0]);o=t[0],t[1]==="www."?l="http://"+t[0]:l=t[0]}return{type:"link",raw:t[0],text:o,href:l,tokens:[{type:"text",raw:o,text:o}]}}}inlineText(r){let t=this.rules.inline.text.exec(r);if(t){let n=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:t[0],escaped:n}}}},j=class be{constructor(t){P(this,"tokens");P(this,"options");P(this,"state");P(this,"inlineQueue");P(this,"tokenizer");this.tokens=[],this.tokens.links=Object.create(null),this.options=t||Z,this.options.tokenizer=this.options.tokenizer||new ae,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let n={other:G,block:le.normal,inline:ee.normal};this.options.pedantic?(n.block=le.pedantic,n.inline=ee.pedantic):this.options.gfm&&(n.block=le.gfm,this.options.breaks?n.inline=ee.breaks:n.inline=ee.gfm),this.tokenizer.rules=n}static get rules(){return{block:le,inline:ee}}static lex(t,n){return new be(n).lex(t)}static lexInline(t,n){return new be(n).inlineTokens(t)}lex(t){t=t.replace(G.carriageReturn,`
3043
+ `),this.blockTokens(t,this.tokens);for(let n=0;n<this.inlineQueue.length;n++){let o=this.inlineQueue[n];this.inlineTokens(o.src,o.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(t,n=[],o=!1){var a,s,d;this.tokenizer.lexer=this,this.options.pedantic&&(t=t.replace(G.tabCharGlobal," ").replace(G.spaceLine,""));let l=1/0;for(;t;){if(t.length<l)l=t.length;else{this.infiniteLoopError(t.charCodeAt(0));break}let i;if((s=(a=this.options.extensions)==null?void 0:a.block)!=null&&s.some(g=>(i=g.call({lexer:this},t,n))?(t=t.substring(i.raw.length),n.push(i),!0):!1))continue;if(i=this.tokenizer.space(t)){t=t.substring(i.raw.length);let g=n.at(-1);i.raw.length===1&&g!==void 0?g.raw+=`
3044
+ `:n.push(i);continue}if(i=this.tokenizer.code(t)){t=t.substring(i.raw.length);let g=n.at(-1);(g==null?void 0:g.type)==="paragraph"||(g==null?void 0:g.type)==="text"?(g.raw+=(g.raw.endsWith(`
2931
3045
  `)?"":`
2932
- `)+i.raw,k.text+=`
2933
- `+i.text,this.inlineQueue.at(-1).src=k.text):n.push(i);continue}if(i=this.tokenizer.fences(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.heading(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.hr(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.blockquote(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.list(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.html(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.def(t)){t=t.substring(i.raw.length);let k=n.at(-1);(k==null?void 0:k.type)==="paragraph"||(k==null?void 0:k.type)==="text"?(k.raw+=(k.raw.endsWith(`
3046
+ `)+i.raw,g.text+=`
3047
+ `+i.text,this.inlineQueue.at(-1).src=g.text):n.push(i);continue}if(i=this.tokenizer.fences(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.heading(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.hr(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.blockquote(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.list(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.html(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.def(t)){t=t.substring(i.raw.length);let g=n.at(-1);(g==null?void 0:g.type)==="paragraph"||(g==null?void 0:g.type)==="text"?(g.raw+=(g.raw.endsWith(`
2934
3048
  `)?"":`
2935
- `)+i.raw,k.text+=`
2936
- `+i.raw,this.inlineQueue.at(-1).src=k.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title},n.push(i));continue}if(i=this.tokenizer.table(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.lheading(t)){t=t.substring(i.raw.length),n.push(i);continue}let f=t;if((d=this.options.extensions)!=null&&d.startBlock){let k=1/0,b=t.slice(1),u;this.options.extensions.startBlock.forEach(w=>{u=w.call({lexer:this},b),typeof u=="number"&&u>=0&&(k=Math.min(k,u))}),k<1/0&&k>=0&&(f=t.substring(0,k+1))}if(this.state.top&&(i=this.tokenizer.paragraph(f))){let k=n.at(-1);o&&(k==null?void 0:k.type)==="paragraph"?(k.raw+=(k.raw.endsWith(`
3049
+ `)+i.raw,g.text+=`
3050
+ `+i.raw,this.inlineQueue.at(-1).src=g.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title},n.push(i));continue}if(i=this.tokenizer.table(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.lheading(t)){t=t.substring(i.raw.length),n.push(i);continue}let h=t;if((d=this.options.extensions)!=null&&d.startBlock){let g=1/0,x=t.slice(1),N;this.options.extensions.startBlock.forEach(B=>{N=B.call({lexer:this},x),typeof N=="number"&&N>=0&&(g=Math.min(g,N))}),g<1/0&&g>=0&&(h=t.substring(0,g+1))}if(this.state.top&&(i=this.tokenizer.paragraph(h))){let g=n.at(-1);o&&(g==null?void 0:g.type)==="paragraph"?(g.raw+=(g.raw.endsWith(`
2937
3051
  `)?"":`
2938
- `)+i.raw,k.text+=`
2939
- `+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=k.text):n.push(i),o=f.length!==t.length,t=t.substring(i.raw.length);continue}if(i=this.tokenizer.text(t)){t=t.substring(i.raw.length);let k=n.at(-1);(k==null?void 0:k.type)==="text"?(k.raw+=(k.raw.endsWith(`
3052
+ `)+i.raw,g.text+=`
3053
+ `+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=g.text):n.push(i),o=h.length!==t.length,t=t.substring(i.raw.length);continue}if(i=this.tokenizer.text(t)){t=t.substring(i.raw.length);let g=n.at(-1);(g==null?void 0:g.type)==="text"?(g.raw+=(g.raw.endsWith(`
2940
3054
  `)?"":`
2941
- `)+i.raw,k.text+=`
2942
- `+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=k.text):n.push(i);continue}if(t){this.infiniteLoopError(t.charCodeAt(0));break}}return this.state.top=!0,n}inline(t,n=[]){return this.inlineQueue.push({src:t,tokens:n}),n}inlineTokens(t,n=[]){var f,k,b,u,w;this.tokenizer.lexer=this;let o=t,l=null;if(this.tokens.links){let x=Object.keys(this.tokens.links);if(x.length>0)for(;(l=this.tokenizer.rules.inline.reflinkSearch.exec(o))!==null;)x.includes(l[0].slice(l[0].lastIndexOf("[")+1,-1))&&(o=o.slice(0,l.index)+"["+"a".repeat(l[0].length-2)+"]"+o.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(l=this.tokenizer.rules.inline.anyPunctuation.exec(o))!==null;)o=o.slice(0,l.index)+"++"+o.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let a;for(;(l=this.tokenizer.rules.inline.blockSkip.exec(o))!==null;)a=l[2]?l[2].length:0,o=o.slice(0,l.index+a)+"["+"a".repeat(l[0].length-a-2)+"]"+o.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);o=((k=(f=this.options.hooks)==null?void 0:f.emStrongMask)==null?void 0:k.call({lexer:this},o))??o;let s=!1,d="",i=1/0;for(;t;){if(t.length<i)i=t.length;else{this.infiniteLoopError(t.charCodeAt(0));break}s||(d=""),s=!1;let x;if((u=(b=this.options.extensions)==null?void 0:b.inline)!=null&&u.some(T=>(x=T.call({lexer:this},t,n))?(t=t.substring(x.raw.length),n.push(x),!0):!1))continue;if(x=this.tokenizer.escape(t)){t=t.substring(x.raw.length),n.push(x);continue}if(x=this.tokenizer.tag(t)){t=t.substring(x.raw.length),n.push(x);continue}if(x=this.tokenizer.link(t)){t=t.substring(x.raw.length),n.push(x);continue}if(x=this.tokenizer.reflink(t,this.tokens.links)){t=t.substring(x.raw.length);let T=n.at(-1);x.type==="text"&&(T==null?void 0:T.type)==="text"?(T.raw+=x.raw,T.text+=x.text):n.push(x);continue}if(x=this.tokenizer.emStrong(t,o,d)){t=t.substring(x.raw.length),n.push(x);continue}if(x=this.tokenizer.codespan(t)){t=t.substring(x.raw.length),n.push(x);continue}if(x=this.tokenizer.br(t)){t=t.substring(x.raw.length),n.push(x);continue}if(x=this.tokenizer.del(t,o,d)){t=t.substring(x.raw.length),n.push(x);continue}if(x=this.tokenizer.autolink(t)){t=t.substring(x.raw.length),n.push(x);continue}if(!this.state.inLink&&(x=this.tokenizer.url(t))){t=t.substring(x.raw.length),n.push(x);continue}let N=t;if((w=this.options.extensions)!=null&&w.startInline){let T=1/0,L=t.slice(1),M;this.options.extensions.startInline.forEach(D=>{M=D.call({lexer:this},L),typeof M=="number"&&M>=0&&(T=Math.min(T,M))}),T<1/0&&T>=0&&(N=t.substring(0,T+1))}if(x=this.tokenizer.inlineText(N)){t=t.substring(x.raw.length),x.raw.slice(-1)!=="_"&&(d=x.raw.slice(-1)),s=!0;let T=n.at(-1);(T==null?void 0:T.type)==="text"?(T.raw+=x.raw,T.text+=x.text):n.push(x);continue}if(t){this.infiniteLoopError(t.charCodeAt(0));break}}return n}infiniteLoopError(t){let n="Infinite loop on byte: "+t;if(this.options.silent)console.error(n);else throw new Error(n)}},ae=class{constructor(r){I(this,"options");I(this,"parser");this.options=r||W}space(r){return""}code({text:r,lang:t,escaped:n}){var a;let o=(a=(t||"").match($.notSpaceStart))==null?void 0:a[0],l=r.replace($.endingNewline,"")+`
2943
- `;return o?'<pre><code class="language-'+H(o)+'">'+(n?l:H(l,!0))+`</code></pre>
2944
- `:"<pre><code>"+(n?l:H(l,!0))+`</code></pre>
3055
+ `)+i.raw,g.text+=`
3056
+ `+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=g.text):n.push(i);continue}if(t){this.infiniteLoopError(t.charCodeAt(0));break}}return this.state.top=!0,n}inline(t,n=[]){return this.inlineQueue.push({src:t,tokens:n}),n}inlineTokens(t,n=[]){var h,g,x,N,B;this.tokenizer.lexer=this;let o=t,l=null;if(this.tokens.links){let y=Object.keys(this.tokens.links);if(y.length>0)for(;(l=this.tokenizer.rules.inline.reflinkSearch.exec(o))!==null;)y.includes(l[0].slice(l[0].lastIndexOf("[")+1,-1))&&(o=o.slice(0,l.index)+"["+"a".repeat(l[0].length-2)+"]"+o.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(l=this.tokenizer.rules.inline.anyPunctuation.exec(o))!==null;)o=o.slice(0,l.index)+"++"+o.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let a;for(;(l=this.tokenizer.rules.inline.blockSkip.exec(o))!==null;)a=l[2]?l[2].length:0,o=o.slice(0,l.index+a)+"["+"a".repeat(l[0].length-a-2)+"]"+o.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);o=((g=(h=this.options.hooks)==null?void 0:h.emStrongMask)==null?void 0:g.call({lexer:this},o))??o;let s=!1,d="",i=1/0;for(;t;){if(t.length<i)i=t.length;else{this.infiniteLoopError(t.charCodeAt(0));break}s||(d=""),s=!1;let y;if((N=(x=this.options.extensions)==null?void 0:x.inline)!=null&&N.some(C=>(y=C.call({lexer:this},t,n))?(t=t.substring(y.raw.length),n.push(y),!0):!1))continue;if(y=this.tokenizer.escape(t)){t=t.substring(y.raw.length),n.push(y);continue}if(y=this.tokenizer.tag(t)){t=t.substring(y.raw.length),n.push(y);continue}if(y=this.tokenizer.link(t)){t=t.substring(y.raw.length),n.push(y);continue}if(y=this.tokenizer.reflink(t,this.tokens.links)){t=t.substring(y.raw.length);let C=n.at(-1);y.type==="text"&&(C==null?void 0:C.type)==="text"?(C.raw+=y.raw,C.text+=y.text):n.push(y);continue}if(y=this.tokenizer.emStrong(t,o,d)){t=t.substring(y.raw.length),n.push(y);continue}if(y=this.tokenizer.codespan(t)){t=t.substring(y.raw.length),n.push(y);continue}if(y=this.tokenizer.br(t)){t=t.substring(y.raw.length),n.push(y);continue}if(y=this.tokenizer.del(t,o,d)){t=t.substring(y.raw.length),n.push(y);continue}if(y=this.tokenizer.autolink(t)){t=t.substring(y.raw.length),n.push(y);continue}if(!this.state.inLink&&(y=this.tokenizer.url(t))){t=t.substring(y.raw.length),n.push(y);continue}let T=t;if((B=this.options.extensions)!=null&&B.startInline){let C=1/0,$=t.slice(1),R;this.options.extensions.startInline.forEach(O=>{R=O.call({lexer:this},$),typeof R=="number"&&R>=0&&(C=Math.min(C,R))}),C<1/0&&C>=0&&(T=t.substring(0,C+1))}if(y=this.tokenizer.inlineText(T)){t=t.substring(y.raw.length),y.raw.slice(-1)!=="_"&&(d=y.raw.slice(-1)),s=!0;let C=n.at(-1);(C==null?void 0:C.type)==="text"?(C.raw+=y.raw,C.text+=y.text):n.push(y);continue}if(t){this.infiniteLoopError(t.charCodeAt(0));break}}return n}infiniteLoopError(t){let n="Infinite loop on byte: "+t;if(this.options.silent)console.error(n);else throw new Error(n)}},se=class{constructor(r){P(this,"options");P(this,"parser");this.options=r||Z}space(r){return""}code({text:r,lang:t,escaped:n}){var a;let o=(a=(t||"").match(G.notSpaceStart))==null?void 0:a[0],l=r.replace(G.endingNewline,"")+`
3057
+ `;return o?'<pre><code class="language-'+q(o)+'">'+(n?l:q(l,!0))+`</code></pre>
3058
+ `:"<pre><code>"+(n?l:q(l,!0))+`</code></pre>
2945
3059
  `}blockquote({tokens:r}){return`<blockquote>
2946
3060
  ${this.parser.parse(r)}</blockquote>
2947
3061
  `}html({text:r}){return r}def(r){return""}heading({tokens:r,depth:t}){return`<h${t}>${this.parser.parseInline(r)}</h${t}>
@@ -2957,5 +3071,5 @@ ${this.parser.parse(r)}</blockquote>
2957
3071
  `}tablerow({text:r}){return`<tr>
2958
3072
  ${r}</tr>
2959
3073
  `}tablecell(r){let t=this.parser.parseInline(r.tokens),n=r.header?"th":"td";return(r.align?`<${n} align="${r.align}">`:`<${n}>`)+t+`</${n}>
2960
- `}strong({tokens:r}){return`<strong>${this.parser.parseInline(r)}</strong>`}em({tokens:r}){return`<em>${this.parser.parseInline(r)}</em>`}codespan({text:r}){return`<code>${H(r,!0)}</code>`}br(r){return"<br>"}del({tokens:r}){return`<del>${this.parser.parseInline(r)}</del>`}link({href:r,title:t,tokens:n}){let o=this.parser.parseInline(n),l=Re(r);if(l===null)return o;r=l;let a='<a href="'+r+'"';return t&&(a+=' title="'+H(t)+'"'),a+=">"+o+"</a>",a}image({href:r,title:t,text:n,tokens:o}){o&&(n=this.parser.parseInline(o,this.parser.textRenderer));let l=Re(r);if(l===null)return H(n);r=l;let a=`<img src="${r}" alt="${H(n)}"`;return t&&(a+=` title="${H(t)}"`),a+=">",a}text(r){return"tokens"in r&&r.tokens?this.parser.parseInline(r.tokens):"escaped"in r&&r.escaped?r.text:H(r.text)}},ye=class{strong({text:r}){return r}em({text:r}){return r}codespan({text:r}){return r}del({text:r}){return r}html({text:r}){return r}text({text:r}){return r}link({text:r}){return""+r}image({text:r}){return""+r}br(){return""}checkbox({raw:r}){return r}},z=class Ee{constructor(t){I(this,"options");I(this,"renderer");I(this,"textRenderer");this.options=t||W,this.options.renderer=this.options.renderer||new ae,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new ye}static parse(t,n){return new Ee(n).parse(t)}static parseInline(t,n){return new Ee(n).parseInline(t)}parse(t){var o,l;this.renderer.parser=this;let n="";for(let a=0;a<t.length;a++){let s=t[a];if((l=(o=this.options.extensions)==null?void 0:o.renderers)!=null&&l[s.type]){let i=s,f=this.options.extensions.renderers[i.type].call({parser:this},i);if(f!==!1||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(i.type)){n+=f||"";continue}}let d=s;switch(d.type){case"space":{n+=this.renderer.space(d);break}case"hr":{n+=this.renderer.hr(d);break}case"heading":{n+=this.renderer.heading(d);break}case"code":{n+=this.renderer.code(d);break}case"table":{n+=this.renderer.table(d);break}case"blockquote":{n+=this.renderer.blockquote(d);break}case"list":{n+=this.renderer.list(d);break}case"checkbox":{n+=this.renderer.checkbox(d);break}case"html":{n+=this.renderer.html(d);break}case"def":{n+=this.renderer.def(d);break}case"paragraph":{n+=this.renderer.paragraph(d);break}case"text":{n+=this.renderer.text(d);break}default:{let i='Token with "'+d.type+'" type was not found.';if(this.options.silent)return console.error(i),"";throw new Error(i)}}}return n}parseInline(t,n=this.renderer){var l,a;this.renderer.parser=this;let o="";for(let s=0;s<t.length;s++){let d=t[s];if((a=(l=this.options.extensions)==null?void 0:l.renderers)!=null&&a[d.type]){let f=this.options.extensions.renderers[d.type].call({parser:this},d);if(f!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(d.type)){o+=f||"";continue}}let i=d;switch(i.type){case"escape":{o+=n.text(i);break}case"html":{o+=n.html(i);break}case"link":{o+=n.link(i);break}case"image":{o+=n.image(i);break}case"checkbox":{o+=n.checkbox(i);break}case"strong":{o+=n.strong(i);break}case"em":{o+=n.em(i);break}case"codespan":{o+=n.codespan(i);break}case"br":{o+=n.br(i);break}case"del":{o+=n.del(i);break}case"text":{o+=n.text(i);break}default:{let f='Token with "'+i.type+'" type was not found.';if(this.options.silent)return console.error(f),"";throw new Error(f)}}}return o}},ee=(se=class{constructor(r){I(this,"options");I(this,"block");this.options=r||W}preprocess(r){return r}postprocess(r){return r}processAllTokens(r){return r}emStrongMask(r){return r}provideLexer(r=this.block){return r?F.lex:F.lexInline}provideParser(r=this.block){return r?z.parse:z.parseInline}},I(se,"passThroughHooks",new Set(["preprocess","postprocess","processAllTokens","emStrongMask"])),I(se,"passThroughHooksRespectAsync",new Set(["preprocess","postprocess","processAllTokens"])),se),dl=class{constructor(...r){I(this,"defaults",ie());I(this,"options",this.setOptions);I(this,"parse",this.parseMarkdown(!0));I(this,"parseInline",this.parseMarkdown(!1));I(this,"Parser",z);I(this,"Renderer",ae);I(this,"TextRenderer",ye);I(this,"Lexer",F);I(this,"Tokenizer",oe);I(this,"Hooks",ee);this.use(...r)}walkTokens(r,t){var o,l;let n=[];for(let a of r)switch(n=n.concat(t.call(this,a)),a.type){case"table":{let s=a;for(let d of s.header)n=n.concat(this.walkTokens(d.tokens,t));for(let d of s.rows)for(let i of d)n=n.concat(this.walkTokens(i.tokens,t));break}case"list":{let s=a;n=n.concat(this.walkTokens(s.items,t));break}default:{let s=a;(l=(o=this.defaults.extensions)==null?void 0:o.childTokens)!=null&&l[s.type]?this.defaults.extensions.childTokens[s.type].forEach(d=>{let i=s[d].flat(1/0);n=n.concat(this.walkTokens(i,t))}):s.tokens&&(n=n.concat(this.walkTokens(s.tokens,t)))}}return n}use(...r){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return r.forEach(n=>{let o={...n};if(o.async=this.defaults.async||o.async||!1,n.extensions&&(n.extensions.forEach(l=>{if(!l.name)throw new Error("extension name required");if("renderer"in l){let a=t.renderers[l.name];a?t.renderers[l.name]=function(...s){let d=l.renderer.apply(this,s);return d===!1&&(d=a.apply(this,s)),d}:t.renderers[l.name]=l.renderer}if("tokenizer"in l){if(!l.level||l.level!=="block"&&l.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let a=t[l.level];a?a.unshift(l.tokenizer):t[l.level]=[l.tokenizer],l.start&&(l.level==="block"?t.startBlock?t.startBlock.push(l.start):t.startBlock=[l.start]:l.level==="inline"&&(t.startInline?t.startInline.push(l.start):t.startInline=[l.start]))}"childTokens"in l&&l.childTokens&&(t.childTokens[l.name]=l.childTokens)}),o.extensions=t),n.renderer){let l=this.defaults.renderer||new ae(this.defaults);for(let a in n.renderer){if(!(a in l))throw new Error(`renderer '${a}' does not exist`);if(["options","parser"].includes(a))continue;let s=a,d=n.renderer[s],i=l[s];l[s]=(...f)=>{let k=d.apply(l,f);return k===!1&&(k=i.apply(l,f)),k||""}}o.renderer=l}if(n.tokenizer){let l=this.defaults.tokenizer||new oe(this.defaults);for(let a in n.tokenizer){if(!(a in l))throw new Error(`tokenizer '${a}' does not exist`);if(["options","rules","lexer"].includes(a))continue;let s=a,d=n.tokenizer[s],i=l[s];l[s]=(...f)=>{let k=d.apply(l,f);return k===!1&&(k=i.apply(l,f)),k}}o.tokenizer=l}if(n.hooks){let l=this.defaults.hooks||new ee;for(let a in n.hooks){if(!(a in l))throw new Error(`hook '${a}' does not exist`);if(["options","block"].includes(a))continue;let s=a,d=n.hooks[s],i=l[s];ee.passThroughHooks.has(a)?l[s]=f=>{if(this.defaults.async&&ee.passThroughHooksRespectAsync.has(a))return(async()=>{let b=await d.call(l,f);return i.call(l,b)})();let k=d.call(l,f);return i.call(l,k)}:l[s]=(...f)=>{if(this.defaults.async)return(async()=>{let b=await d.apply(l,f);return b===!1&&(b=await i.apply(l,f)),b})();let k=d.apply(l,f);return k===!1&&(k=i.apply(l,f)),k}}o.hooks=l}if(n.walkTokens){let l=this.defaults.walkTokens,a=n.walkTokens;o.walkTokens=function(s){let d=[];return d.push(a.call(this,s)),l&&(d=d.concat(l.call(this,s))),d}}this.defaults={...this.defaults,...o}}),this}setOptions(r){return this.defaults={...this.defaults,...r},this}lexer(r,t){return F.lex(r,t??this.defaults)}parser(r,t){return z.parse(r,t??this.defaults)}parseMarkdown(r){return(t,n)=>{let o={...n},l={...this.defaults,...o},a=this.onError(!!l.silent,!!l.async);if(this.defaults.async===!0&&o.async===!1)return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof t>"u"||t===null)return a(new Error("marked(): input parameter is undefined or null"));if(typeof t!="string")return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(t)+", string expected"));if(l.hooks&&(l.hooks.options=l,l.hooks.block=r),l.async)return(async()=>{let s=l.hooks?await l.hooks.preprocess(t):t,d=await(l.hooks?await l.hooks.provideLexer(r):r?F.lex:F.lexInline)(s,l),i=l.hooks?await l.hooks.processAllTokens(d):d;l.walkTokens&&await Promise.all(this.walkTokens(i,l.walkTokens));let f=await(l.hooks?await l.hooks.provideParser(r):r?z.parse:z.parseInline)(i,l);return l.hooks?await l.hooks.postprocess(f):f})().catch(a);try{l.hooks&&(t=l.hooks.preprocess(t));let s=(l.hooks?l.hooks.provideLexer(r):r?F.lex:F.lexInline)(t,l);l.hooks&&(s=l.hooks.processAllTokens(s)),l.walkTokens&&this.walkTokens(s,l.walkTokens);let d=(l.hooks?l.hooks.provideParser(r):r?z.parse:z.parseInline)(s,l);return l.hooks&&(d=l.hooks.postprocess(d)),d}catch(s){return a(s)}}}onError(r,t){return n=>{if(n.message+=`
2961
- Please report this to https://github.com/markedjs/marked.`,r){let o="<p>An error occurred:</p><pre>"+H(n.message+"",!0)+"</pre>";return t?Promise.resolve(o):o}if(t)return Promise.reject(n);throw n}}},Z=new dl;function C(r,t){return Z.parse(r,t)}C.options=C.setOptions=function(r){return Z.setOptions(r),C.defaults=Z.defaults,Ve(C.defaults),C},C.getDefaults=ie,C.defaults=W,C.use=function(...r){return Z.use(...r),C.defaults=Z.defaults,Ve(C.defaults),C},C.walkTokens=function(r,t){return Z.walkTokens(r,t)},C.parseInline=Z.parseInline,C.Parser=z,C.parser=z.parse,C.Renderer=ae,C.TextRenderer=ye,C.Lexer=F,C.lexer=F.lex,C.Tokenizer=oe,C.Hooks=ee,C.parse=C,C.options,C.setOptions,C.use,C.walkTokens,C.parseInline,z.parse,F.lex;const pl={class:"modal-content help-modal"},ml={class:"modal-header"},gl={class:"header-actions"},kl={class:"modal-body"},hl={class:"doc-sidebar"},fl={class:"doc-sidebar-group"},yl={class:"doc-sidebar-header"},ul=["onClick"],El={class:"doc-sidebar-group"},xl={class:"doc-sidebar-header"},bl={class:"doc-content"},Vl=["innerHTML"],Nl=["innerHTML"],wl=["innerHTML"],Tl=["innerHTML"],Sl=["innerHTML"],Cl=["innerHTML"],Bl=["innerHTML"],Il={class:"doc-pagination"},Al=["disabled"],Pl={class:"page-info"},Ml=["disabled"],$l=O({__name:"HelpModal",props:{initialDoc:{type:String,default:"getting-started"}},emits:["close","openAbout"],setup(r,{emit:t}){const n=r,o=e.ref(n.initialDoc),l=e.ref(""),a=e.ref(null),s=[{id:"getting-started",title:"快速开始",icon:"home"},{id:"features",title:"功能介绍",icon:"info"},{id:"api",title:"API 文档",icon:"code"},{id:"tools",title:"工具文档",icon:"tool"},{id:"shortcuts",title:"快捷键",icon:"keyboard"},{id:"faq",title:"常见问题",icon:"help"}],d=e.ref(s),i=e.computed(()=>[...d.value,{id:"changelog",title:"更新日志",icon:"activity"}]),f=e.computed(()=>i.value.findIndex(h=>h.id===o.value)),k=e.computed(()=>f.value>0),b=e.computed(()=>f.value<i.value.length-1);function u(){const h=l.value.toLowerCase().trim();if(!h){d.value=s;return}d.value=s.filter(p=>p.title.toLowerCase().includes(h)||p.id.includes(h)),d.value.length>0&&!d.value.find(p=>p.id===o.value)&&(o.value=d.value[0].id)}const w=h=>C(h,{breaks:!0,gfm:!0}).replace(/<table>/g,'<table class="doc-table">'),x=e.computed(()=>w(br)),N=e.computed(()=>w(Vr)),T=e.computed(()=>w(yr)),L=e.computed(()=>w(ur)),M=e.computed(()=>w(Er)),D=e.computed(()=>w(xr)),K=e.computed(()=>w(Nr));function U(){var h;k.value&&(o.value=i.value[f.value-1].id,(h=a.value)==null||h.scrollTo(0,0))}function R(){var h;b.value&&(o.value=i.value[f.value+1].id,(h=a.value)==null||h.scrollTo(0,0))}return e.onMounted(()=>{u()}),(h,p)=>(e.openBlock(),e.createElementBlock("div",{class:"modal-overlay",onClick:p[3]||(p[3]=e.withModifiers(m=>h.$emit("close"),["self"]))},[e.createElementVNode("div",pl,[e.createCommentVNode(" 头部 "),e.createElementVNode("div",ml,[e.createElementVNode("h2",null,[e.createVNode(P,{name:"book-open",size:18}),p[4]||(p[4]=e.createTextVNode(" 帮助文档",-1))]),e.createElementVNode("div",gl,[e.createElementVNode("button",{class:"btn-about",onClick:p[0]||(p[0]=m=>h.$emit("openAbout")),title:"关于 PairCode"},[e.createVNode(P,{name:"info",size:14}),p[5]||(p[5]=e.createTextVNode(" 关于 ",-1))]),e.createElementVNode("button",{class:"modal-close",onClick:p[1]||(p[1]=m=>h.$emit("close"))},"×")])]),e.createCommentVNode(" 主体 "),e.createElementVNode("div",kl,[e.createCommentVNode(" 侧边导航 "),e.createElementVNode("div",hl,[e.createCommentVNode(" 文档中心分组 "),e.createElementVNode("div",fl,[e.createElementVNode("div",yl,[e.createVNode(P,{name:"book",size:14}),p[6]||(p[6]=e.createElementVNode("span",null,"文档中心",-1))]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,m=>(e.openBlock(),e.createElementBlock("div",{key:m.id,class:e.normalizeClass(["doc-nav-item",{active:o.value===m.id}]),onClick:E=>o.value=m.id},[e.createVNode(P,{name:m.icon,size:16},null,8,["name"]),e.createElementVNode("span",null,e.toDisplayString(m.title),1)],10,ul))),128))]),e.createCommentVNode(" 更新日志 "),e.createElementVNode("div",El,[e.createElementVNode("div",xl,[e.createVNode(P,{name:"clock",size:14}),p[7]||(p[7]=e.createElementVNode("span",null,"其他",-1))]),e.createElementVNode("div",{class:e.normalizeClass(["doc-nav-item",{active:o.value==="changelog"}]),onClick:p[2]||(p[2]=m=>o.value="changelog")},[e.createVNode(P,{name:"activity",size:16}),p[8]||(p[8]=e.createElementVNode("span",null,"更新日志",-1))],2)])]),e.createCommentVNode(" 文档内容 "),e.createElementVNode("div",bl,[e.createElementVNode("div",{class:"doc-content-inner",ref_key:"contentRef",ref:a},[o.value==="faq"?(e.openBlock(),e.createElementBlock("div",{key:0,class:"doc-markdown",innerHTML:x.value},null,8,Vl)):o.value==="getting-started"?(e.openBlock(),e.createElementBlock("div",{key:1,class:"doc-markdown",innerHTML:N.value},null,8,Nl)):o.value==="features"?(e.openBlock(),e.createElementBlock("div",{key:2,class:"doc-markdown",innerHTML:T.value},null,8,wl)):o.value==="api"?(e.openBlock(),e.createElementBlock("div",{key:3,class:"doc-markdown",innerHTML:L.value},null,8,Tl)):o.value==="tools"?(e.openBlock(),e.createElementBlock("div",{key:4,class:"doc-markdown",innerHTML:M.value},null,8,Sl)):o.value==="shortcuts"?(e.openBlock(),e.createElementBlock("div",{key:5,class:"doc-markdown",innerHTML:D.value},null,8,Cl)):o.value==="changelog"?(e.openBlock(),e.createElementBlock("div",{key:6,class:"doc-markdown",innerHTML:K.value},null,8,Bl)):e.createCommentVNode("v-if",!0)],512),e.createCommentVNode(" 底部翻页 "),e.createElementVNode("div",Il,[e.createElementVNode("button",{class:"page-btn",onClick:U,disabled:!k.value},[e.createVNode(P,{name:"chevron-left",size:14}),p[9]||(p[9]=e.createTextVNode(" 上一页 ",-1))],8,Al),e.createElementVNode("span",Pl,e.toDisplayString(f.value+1)+" / "+e.toDisplayString(i.value.length),1),e.createElementVNode("button",{class:"page-btn",onClick:R,disabled:!b.value},[p[10]||(p[10]=e.createTextVNode(" 下一页 ",-1)),e.createVNode(P,{name:"chevron-right",size:14})],8,Ml)])])])])]))}},[["__scopeId","data-v-667c64dc"]]),Dl="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='512'%20height='512'%20viewBox='0%200%20512%20512'%3e%3cdefs%3e%3c!--%20背景渐变(深色科技风)%20--%3e%3clinearGradient%20id='bgGrad'%20x1='0'%20y1='0'%20x2='1'%20y2='1'%3e%3cstop%20offset='0%25'%20stop-color='%230a1628'/%3e%3cstop%20offset='100%25'%20stop-color='%230d1f2e'/%3e%3c/linearGradient%3e%3c!--%20左侧尖括号渐变(科技蓝)%20--%3e%3clinearGradient%20id='leftBracket'%20x1='0'%20y1='0'%20x2='0'%20y2='1'%3e%3cstop%20offset='0%25'%20stop-color='%2300d4ff'/%3e%3cstop%20offset='100%25'%20stop-color='%230077b6'/%3e%3c/linearGradient%3e%3c!--%20右侧尖括号渐变(科技绿)%20--%3e%3clinearGradient%20id='rightBracket'%20x1='0'%20y1='0'%20x2='0'%20y2='1'%3e%3cstop%20offset='0%25'%20stop-color='%2300e676'/%3e%3cstop%20offset='100%25'%20stop-color='%2300c853'/%3e%3c/linearGradient%3e%3c!--%20中间连接线(蓝绿渐变)%20--%3e%3clinearGradient%20id='connector'%20x1='0'%20y1='0'%20x2='1'%20y2='0'%3e%3cstop%20offset='0%25'%20stop-color='%2300d4ff'/%3e%3cstop%20offset='50%25'%20stop-color='%2300e5ff'/%3e%3cstop%20offset='100%25'%20stop-color='%2300e676'/%3e%3c/linearGradient%3e%3c!--%20外发光%20--%3e%3cfilter%20id='glow'%3e%3cfeGaussianBlur%20stdDeviation='4'%20result='blur'/%3e%3cfeMerge%3e%3cfeMergeNode%20in='blur'/%3e%3cfeMergeNode%20in='SourceGraphic'/%3e%3c/feMerge%3e%3c/filter%3e%3cfilter%20id='softGlow'%3e%3cfeGaussianBlur%20stdDeviation='8'%20result='blur'/%3e%3cfeMerge%3e%3cfeMergeNode%20in='blur'/%3e%3cfeMergeNode%20in='SourceGraphic'/%3e%3c/feMerge%3e%3c/filter%3e%3c/defs%3e%3c!--%20圆角方形背景(深色科技底)%20--%3e%3crect%20x='32'%20y='32'%20width='448'%20height='448'%20rx='96'%20ry='96'%20fill='url(%23bgGrad)'%20stroke='%231a3a4a'%20stroke-width='2'/%3e%3c!--%20左侧%20%3c%20尖括号(三段式直线%20—%20科技蓝,代表代码输入/开发者)%20--%3e%3cpath%20d='M180%20150%20L96%20256%20L180%20362'%20stroke='url(%23leftBracket)'%20stroke-width='40'%20stroke-linejoin='round'%20fill='none'%20filter='url(%23glow)'/%3e%3c!--%20右侧%20%3e%20尖括号(三段式直线%20—%20科技绿,代表代码输出/AI伙伴)%20--%3e%3cpath%20d='M332%20150%20L416%20256%20L332%20362'%20stroke='url(%23rightBracket)'%20stroke-width='40'%20stroke-linejoin='round'%20fill='none'%20filter='url(%23glow)'/%3e%3c!--%20中间「=」连接线已移除(图标只留%20%3c%20%3e%20尖括号%20+%20中心%20AI%20核心光点)。%20--%3e%3c!--%20中心光点(代表%20AI%20核心%20—%20亮青色)%20--%3e%3ccircle%20cx='256'%20cy='256'%20r='18'%20fill='transparent'%20stroke='%2300e5ff'%20stroke-width='3'%20opacity='0.6'/%3e%3ccircle%20cx='256'%20cy='256'%20r='8'%20fill='%2300e5ff'%20opacity='0.9'%3e%3canimate%20attributeName='opacity'%20values='0.6;1;0.6'%20dur='2s'%20repeatCount='indefinite'/%3e%3c/circle%3e%3c/svg%3e",Rl={class:"modal-content about-modal"},Gl={class:"modal-header"},Ll={class:"modal-body"},Ol={class:"about-left-col"},Fl={class:"about-hero"},zl={class:"about-logo"},Ul=["src"],Hl={class:"about-version"},jl={class:"about-right-col"},Kl={class:"about-section"},ql={class:"feature-list"},Wl={class:"about-section"},Jl={key:0,class:"sys-info"},Zl={class:"info-row"},Ql={class:"info-row"},Xl={class:"info-row"},Yl={class:"info-path"},_l={class:"info-row"},vl={key:1,class:"loading-info"},eo={class:"modal-footer"},no=O({__name:"AboutModal",props:{showHelpBtn:{type:Boolean,default:!0}},emits:["close","openHelp"],setup(r,{emit:t}){const n=e.ref(""),o=e.ref({}),l=e.ref(!0);return e.onMounted(async()=>{try{const a=await A.apiGet("/system/info");o.value=a,a.version&&(n.value=a.version)}catch{}l.value=!1}),(a,s)=>(e.openBlock(),e.createElementBlock("div",{class:"modal-overlay",onClick:s[3]||(s[3]=e.withModifiers(d=>a.$emit("close"),["self"]))},[e.createElementVNode("div",Rl,[e.createElementVNode("div",Gl,[e.createElementVNode("h2",null,[e.createVNode(P,{name:"info",size:18}),s[4]||(s[4]=e.createTextVNode(" 关于 PairCode",-1))]),e.createElementVNode("button",{class:"modal-close",onClick:s[0]||(s[0]=d=>a.$emit("close"))},"×")]),e.createElementVNode("div",Ll,[e.createCommentVNode(" 左列:Logo + 描述 + 技术栈 "),e.createElementVNode("div",Ol,[e.createCommentVNode(" Logo + 标题 "),e.createElementVNode("div",Fl,[e.createElementVNode("div",zl,[e.createElementVNode("img",{src:e.unref(Dl),class:"about-logo-img",alt:"PairCode"},null,8,Ul)]),s[5]||(s[5]=e.createElementVNode("div",{class:"about-title"},"PairCode IDE",-1)),e.createElementVNode("div",Hl,"版本 "+e.toDisplayString(n.value),1)]),e.createCommentVNode(" 描述 "),s[6]||(s[6]=e.createElementVNode("div",{class:"about-section"},[e.createElementVNode("p",{class:"about-description"}," PairCode IDE 是一款纯 Web 端的 AI 辅助编程集成开发环境, 专为浏览器而设计。无需安装任何桌面客户端或本地 IDE 软件, 打开浏览器即可开始编程。它将 AI 对话能力深度融入编码工作流, 你只需用自然语言描述需求,AI 就能自动理解上下文、读写文件、执行命令、 管理版本控制。从代码生成到项目运维,在同一个浏览器窗口中全部完成。 ")],-1)),e.createCommentVNode(" 技术栈 "),s[7]||(s[7]=e.createStaticVNode('<div class="about-section" data-v-cdb64a03><div class="section-title" data-v-cdb64a03>技术栈</div><div class="tech-stack" data-v-cdb64a03><span class="tech-badge" data-v-cdb64a03>Go</span><span class="tech-badge" data-v-cdb64a03>Vue 3</span><span class="tech-badge" data-v-cdb64a03>WebSocket</span><span class="tech-badge" data-v-cdb64a03>CodeMirror</span><span class="tech-badge" data-v-cdb64a03>插件化工具</span><span class="tech-badge" data-v-cdb64a03>TS 编译器</span><span class="tech-badge" data-v-cdb64a03>MCP</span><span class="tech-badge" data-v-cdb64a03>CodeGraph</span><span class="tech-badge" data-v-cdb64a03>DAP</span></div></div>',1))]),e.createCommentVNode(" 右列:特性 + 系统信息 "),e.createElementVNode("div",jl,[e.createCommentVNode(" 特性亮点 "),e.createElementVNode("div",Kl,[s[18]||(s[18]=e.createElementVNode("div",{class:"section-title"},"主要特性",-1)),e.createElementVNode("ul",ql,[e.createElementVNode("li",null,[e.createVNode(P,{name:"bot",size:14,color:"var(--accent)"}),s[8]||(s[8]=e.createTextVNode(" AI 对话编程 — 用自然语言与 AI 对话,自动生成与重构代码",-1))]),e.createElementVNode("li",null,[e.createVNode(P,{name:"file",size:14,color:"var(--accent)"}),s[9]||(s[9]=e.createTextVNode(" 智能代码编辑器 — 多语言语法高亮,浏览器中流畅编辑",-1))]),e.createElementVNode("li",null,[e.createVNode(P,{name:"git-branch",size:14,color:"var(--accent)"}),s[10]||(s[10]=e.createTextVNode(" Git 版本控制 — 在对话中完成全部 Git 操作",-1))]),e.createElementVNode("li",null,[e.createVNode(P,{name:"terminal",size:14,color:"var(--accent)"}),s[11]||(s[11]=e.createTextVNode(" 内置终端 — 无需离开浏览器即可执行命令",-1))]),e.createElementVNode("li",null,[e.createVNode(P,{name:"search",size:14,color:"var(--accent)"}),s[12]||(s[12]=e.createTextVNode(" 全局搜索 — 快速搜索文件与代码内容",-1))]),e.createElementVNode("li",null,[e.createVNode(P,{name:"settings",size:14,color:"var(--accent)"}),s[13]||(s[13]=e.createTextVNode(" 自主 Agent 模式 — AI 主动分析项目并自动执行任务",-1))]),e.createElementVNode("li",null,[e.createVNode(P,{name:"grid",size:14,color:"var(--accent)"}),s[14]||(s[14]=e.createTextVNode(" 对话历史管理 — 自动保存、回溯与继续历史对话",-1))]),e.createElementVNode("li",null,[e.createVNode(P,{name:"tool",size:14,color:"var(--accent)"}),s[15]||(s[15]=e.createTextVNode(" Skills / MCP 扩展 — 通过技能市场扩展 IDE 能力",-1))]),e.createElementVNode("li",null,[e.createVNode(P,{name:"code",size:14,color:"var(--accent)"}),s[16]||(s[16]=e.createTextVNode(" 内置调试器 — 支持 Go 程序的断点、单步和变量查看",-1))]),e.createElementVNode("li",null,[e.createVNode(P,{name:"image",size:14,color:"var(--accent)"}),s[17]||(s[17]=e.createTextVNode(" 网页验证 — 打开 URL、截图、分析页面效果",-1))])])]),e.createCommentVNode(" 系统信息 "),e.createElementVNode("div",Wl,[s[23]||(s[23]=e.createElementVNode("div",{class:"section-title"},"系统信息",-1)),l.value?(e.openBlock(),e.createElementBlock("div",vl,"加载中...")):(e.openBlock(),e.createElementBlock("div",Jl,[e.createElementVNode("div",Zl,[s[19]||(s[19]=e.createElementVNode("span",{class:"info-label"},"主机名",-1)),e.createElementVNode("span",null,e.toDisplayString(o.value.hostname),1)]),e.createElementVNode("div",Ql,[s[20]||(s[20]=e.createElementVNode("span",{class:"info-label"},"操作系统",-1)),e.createElementVNode("span",null,e.toDisplayString(o.value.os),1)]),e.createElementVNode("div",Xl,[s[21]||(s[21]=e.createElementVNode("span",{class:"info-label"},"工作区",-1)),e.createElementVNode("span",Yl,e.toDisplayString(o.value.workspace),1)]),e.createElementVNode("div",_l,[s[22]||(s[22]=e.createElementVNode("span",{class:"info-label"},"平台信息",-1)),e.createElementVNode("span",null,e.toDisplayString(o.value.goos),1)])]))])])]),e.createCommentVNode(" 底部 "),e.createElementVNode("div",eo,[r.showHelpBtn?(e.openBlock(),e.createElementBlock("button",{key:0,class:"btn-primary",onClick:s[1]||(s[1]=d=>a.$emit("openHelp"))},[e.createVNode(P,{name:"book-open",size:14}),s[24]||(s[24]=e.createTextVNode(" 查看帮助文档 ",-1))])):e.createCommentVNode("v-if",!0),e.createElementVNode("button",{class:"btn-secondary",onClick:s[2]||(s[2]=d=>a.$emit("close"))},"关闭")])])]))}},[["__scopeId","data-v-cdb64a03"]]),to={class:"toast-container"},ro={class:"dlg-box",style:{"max-width":"400px"}},lo={class:"dlg-title"},oo={class:"dlg-body"},ao={class:"dlg-actions"},so={class:"dlg-box",style:{"max-width":"420px"}},io={class:"dlg-title"},co={class:"dlg-body",style:{display:"flex","flex-direction":"column",gap:"8px"}},po={style:{"font-size":"13px",color:"var(--text-secondary)"}},mo=["placeholder"],go={class:"dlg-actions"},ko={class:"dlg-box",style:{"max-width":"400px"}},ho={class:"dlg-title"},fo={class:"dlg-body",style:{"white-space":"pre-line"}},yo=O({__name:"GlobalDialogs",setup(r){const t=e.ref(null);e.watch(()=>y.dialogState.show,l=>{l&&y.dialogState.type==="prompt"&&e.nextTick(()=>{var a,s;(a=t.value)==null||a.focus(),(s=t.value)==null||s.select()})});function n(){if(y.dialogState.type==="prompt"){const l=y.dialogState.inputValue;y.dialogState.show=!1,y.dialogState.resolve&&y.dialogState.resolve(l)}else if(y.dialogState.type==="confirm"&&y.dialogState.checkboxLabel){const a=y.dialogState.checkboxValue;y.dialogState.show=!1,y.dialogState.resolve&&y.dialogState.resolve({confirmed:!0,checked:a})}else y.dialogState.show=!1,y.dialogState.resolve&&y.dialogState.resolve(!0);y.dialogState.resolve=null}function o(){y.dialogState.type==="confirm"&&y.dialogState.checkboxLabel?(y.dialogState.show=!1,y.dialogState.resolve&&y.dialogState.resolve({confirmed:!1,checked:y.dialogState.checkboxValue})):y.dialogState.type==="prompt"?(y.dialogState.show=!1,y.dialogState.resolve&&y.dialogState.resolve(null)):(y.dialogState.show=!1,y.dialogState.resolve&&y.dialogState.resolve(!1)),y.dialogState.resolve=null}return(l,a)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createCommentVNode(" Toast 通知区域 "),e.createElementVNode("div",to,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(y.dialogState).toasts,s=>(e.openBlock(),e.createElementBlock("div",{key:s.id,class:e.normalizeClass(["toast-item","toast-"+(s.type||"info")])},e.toDisplayString(s.message),3))),128))]),e.createCommentVNode(" Confirm 对话框 "),e.unref(y.dialogState).show&&e.unref(y.dialogState).type==="confirm"?(e.openBlock(),e.createElementBlock("div",{key:0,class:"dlg-overlay",onClick:e.withModifiers(o,["self"])},[e.createElementVNode("div",ro,[e.createElementVNode("div",lo,e.toDisplayString(e.unref(y.dialogState).title),1),e.createElementVNode("div",oo,e.toDisplayString(e.unref(y.dialogState).message),1),e.unref(y.dialogState).checkboxLabel?(e.openBlock(),e.createElementBlock("label",{key:0,class:"dlg-checkbox",onClick:a[1]||(a[1]=e.withModifiers(()=>{},["stop"]))},[e.withDirectives(e.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":a[0]||(a[0]=s=>e.unref(y.dialogState).checkboxValue=s)},null,512),[[e.vModelCheckbox,e.unref(y.dialogState).checkboxValue]]),e.createElementVNode("span",null,e.toDisplayString(e.unref(y.dialogState).checkboxLabel),1)])):e.createCommentVNode("v-if",!0),e.createElementVNode("div",ao,[e.createElementVNode("button",{class:"dlg-btn",onClick:o},e.toDisplayString(e.unref(y.dialogState).cancelText),1),e.createElementVNode("button",{class:"dlg-btn primary",onClick:n},e.toDisplayString(e.unref(y.dialogState).confirmText),1)])])])):e.createCommentVNode("v-if",!0),e.createCommentVNode(" Prompt 对话框 "),e.unref(y.dialogState).show&&e.unref(y.dialogState).type==="prompt"?(e.openBlock(),e.createElementBlock("div",{key:1,class:"dlg-overlay",onClick:e.withModifiers(o,["self"])},[e.createElementVNode("div",so,[e.createElementVNode("div",io,e.toDisplayString(e.unref(y.dialogState).title),1),e.createElementVNode("div",co,[e.createElementVNode("span",po,e.toDisplayString(e.unref(y.dialogState).message),1),e.withDirectives(e.createElementVNode("input",{ref_key:"promptInputRef",ref:t,"onUpdate:modelValue":a[2]||(a[2]=s=>e.unref(y.dialogState).inputValue=s),placeholder:e.unref(y.dialogState).inputPlaceholder,class:"dlg-input",onKeyup:[e.withKeys(n,["enter"]),e.withKeys(o,["escape"])]},null,40,mo),[[e.vModelText,e.unref(y.dialogState).inputValue]])]),e.createElementVNode("div",go,[e.createElementVNode("button",{class:"dlg-btn",onClick:o},e.toDisplayString(e.unref(y.dialogState).cancelText),1),e.createElementVNode("button",{class:"dlg-btn primary",onClick:n},e.toDisplayString(e.unref(y.dialogState).confirmText),1)])])])):e.createCommentVNode("v-if",!0),e.createCommentVNode(" Alert 信息框 "),e.unref(y.dialogState).show&&e.unref(y.dialogState).type==="alert"?(e.openBlock(),e.createElementBlock("div",{key:2,class:"dlg-overlay",onClick:e.withModifiers(n,["self"])},[e.createElementVNode("div",ko,[e.createElementVNode("div",ho,e.toDisplayString(e.unref(y.dialogState).title),1),e.createElementVNode("div",fo,e.toDisplayString(e.unref(y.dialogState).message),1),e.createElementVNode("div",{class:"dlg-actions"},[e.createElementVNode("button",{class:"dlg-btn primary",onClick:n},"确定")])])])):e.createCommentVNode("v-if",!0)],64))}},[["__scopeId","data-v-0271e4ae"]]),uo=O({__name:"UiModals",setup(r){const t=e.ref(null);let n=null;function o(){y.showAbout.value=!1,y.showHelp.value=!0,y.helpDocTarget.value="getting-started"}function l(){y.showHelp.value=!1,y.showAbout.value=!0}return e.onMounted(()=>{n=xe.mountListSlot(t,"overlay",{isActive:a=>xe.isOverlayActive("overlay",a)})}),e.onUnmounted(()=>{n&&(n(),n=null)}),(a,s)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[e.unref(y.showSettings)?(e.openBlock(),e.createBlock(vt,{key:0,onClose:s[0]||(s[0]=d=>y.showSettings.value=!1)})):e.createCommentVNode("v-if",!0),e.unref(y.showSystem)?(e.openBlock(),e.createBlock(mr,{key:1,onClose:s[1]||(s[1]=d=>y.showSystem.value=!1)})):e.createCommentVNode("v-if",!0),e.unref(y.showSource)?(e.openBlock(),e.createBlock(fr,{key:2,onClose:s[2]||(s[2]=d=>y.showSource.value=!1)})):e.createCommentVNode("v-if",!0),e.unref(y.showHelp)?(e.openBlock(),e.createBlock($l,{key:3,onClose:s[3]||(s[3]=d=>y.showHelp.value=!1),onOpenAbout:l,initialDoc:e.unref(y.helpDocTarget)},null,8,["initialDoc"])):e.createCommentVNode("v-if",!0),e.unref(y.showAbout)?(e.openBlock(),e.createBlock(no,{key:4,onClose:s[4]||(s[4]=d=>y.showAbout.value=!1),onOpenHelp:o})):e.createCommentVNode("v-if",!0),e.createVNode(yo),e.createCommentVNode(" ★ overlay 槽位(list 型):插件注册的浮动层条目叠加渲染(badge/toast/status pill 等) "),e.createElementVNode("div",{ref_key:"overlaySlotEl",ref:t,class:"plugin-overlay-host"},null,512)],64))}},[["__scopeId","data-v-519b8494"]]);function Eo(r){const t=e.createApp(uo);return t.mount(r),()=>{t.unmount()}}return j.mount=Eo,Object.defineProperty(j,Symbol.toStringTag,{value:"Module"}),j})({},window.__PAIRCODE_CORE.Vue,window.__PAIRCODE_CORE.uiState,window.__PAIRCODE_CORE.pluginRuntime,window.__PAIRCODE_CORE.api);
3074
+ `}strong({tokens:r}){return`<strong>${this.parser.parseInline(r)}</strong>`}em({tokens:r}){return`<em>${this.parser.parseInline(r)}</em>`}codespan({text:r}){return`<code>${q(r,!0)}</code>`}br(r){return"<br>"}del({tokens:r}){return`<del>${this.parser.parseInline(r)}</del>`}link({href:r,title:t,tokens:n}){let o=this.parser.parseInline(n),l=Ge(r);if(l===null)return o;r=l;let a='<a href="'+r+'"';return t&&(a+=' title="'+q(t)+'"'),a+=">"+o+"</a>",a}image({href:r,title:t,text:n,tokens:o}){o&&(n=this.parser.parseInline(o,this.parser.textRenderer));let l=Ge(r);if(l===null)return q(n);r=l;let a=`<img src="${r}" alt="${q(n)}"`;return t&&(a+=` title="${q(t)}"`),a+=">",a}text(r){return"tokens"in r&&r.tokens?this.parser.parseInline(r.tokens):"escaped"in r&&r.escaped?r.text:q(r.text)}},ue=class{strong({text:r}){return r}em({text:r}){return r}codespan({text:r}){return r}del({text:r}){return r}html({text:r}){return r}text({text:r}){return r}link({text:r}){return""+r}image({text:r}){return""+r}br(){return""}checkbox({raw:r}){return r}},H=class xe{constructor(t){P(this,"options");P(this,"renderer");P(this,"textRenderer");this.options=t||Z,this.options.renderer=this.options.renderer||new se,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new ue}static parse(t,n){return new xe(n).parse(t)}static parseInline(t,n){return new xe(n).parseInline(t)}parse(t){var o,l;this.renderer.parser=this;let n="";for(let a=0;a<t.length;a++){let s=t[a];if((l=(o=this.options.extensions)==null?void 0:o.renderers)!=null&&l[s.type]){let i=s,h=this.options.extensions.renderers[i.type].call({parser:this},i);if(h!==!1||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(i.type)){n+=h||"";continue}}let d=s;switch(d.type){case"space":{n+=this.renderer.space(d);break}case"hr":{n+=this.renderer.hr(d);break}case"heading":{n+=this.renderer.heading(d);break}case"code":{n+=this.renderer.code(d);break}case"table":{n+=this.renderer.table(d);break}case"blockquote":{n+=this.renderer.blockquote(d);break}case"list":{n+=this.renderer.list(d);break}case"checkbox":{n+=this.renderer.checkbox(d);break}case"html":{n+=this.renderer.html(d);break}case"def":{n+=this.renderer.def(d);break}case"paragraph":{n+=this.renderer.paragraph(d);break}case"text":{n+=this.renderer.text(d);break}default:{let i='Token with "'+d.type+'" type was not found.';if(this.options.silent)return console.error(i),"";throw new Error(i)}}}return n}parseInline(t,n=this.renderer){var l,a;this.renderer.parser=this;let o="";for(let s=0;s<t.length;s++){let d=t[s];if((a=(l=this.options.extensions)==null?void 0:l.renderers)!=null&&a[d.type]){let h=this.options.extensions.renderers[d.type].call({parser:this},d);if(h!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(d.type)){o+=h||"";continue}}let i=d;switch(i.type){case"escape":{o+=n.text(i);break}case"html":{o+=n.html(i);break}case"link":{o+=n.link(i);break}case"image":{o+=n.image(i);break}case"checkbox":{o+=n.checkbox(i);break}case"strong":{o+=n.strong(i);break}case"em":{o+=n.em(i);break}case"codespan":{o+=n.codespan(i);break}case"br":{o+=n.br(i);break}case"del":{o+=n.del(i);break}case"text":{o+=n.text(i);break}default:{let h='Token with "'+i.type+'" type was not found.';if(this.options.silent)return console.error(h),"";throw new Error(h)}}}return o}},ne=(ie=class{constructor(r){P(this,"options");P(this,"block");this.options=r||Z}preprocess(r){return r}postprocess(r){return r}processAllTokens(r){return r}emStrongMask(r){return r}provideLexer(r=this.block){return r?j.lex:j.lexInline}provideParser(r=this.block){return r?H.parse:H.parseInline}},P(ie,"passThroughHooks",new Set(["preprocess","postprocess","processAllTokens","emStrongMask"])),P(ie,"passThroughHooksRespectAsync",new Set(["preprocess","postprocess","processAllTokens"])),ie),wo=class{constructor(...r){P(this,"defaults",ce());P(this,"options",this.setOptions);P(this,"parse",this.parseMarkdown(!0));P(this,"parseInline",this.parseMarkdown(!1));P(this,"Parser",H);P(this,"Renderer",se);P(this,"TextRenderer",ue);P(this,"Lexer",j);P(this,"Tokenizer",ae);P(this,"Hooks",ne);this.use(...r)}walkTokens(r,t){var o,l;let n=[];for(let a of r)switch(n=n.concat(t.call(this,a)),a.type){case"table":{let s=a;for(let d of s.header)n=n.concat(this.walkTokens(d.tokens,t));for(let d of s.rows)for(let i of d)n=n.concat(this.walkTokens(i.tokens,t));break}case"list":{let s=a;n=n.concat(this.walkTokens(s.items,t));break}default:{let s=a;(l=(o=this.defaults.extensions)==null?void 0:o.childTokens)!=null&&l[s.type]?this.defaults.extensions.childTokens[s.type].forEach(d=>{let i=s[d].flat(1/0);n=n.concat(this.walkTokens(i,t))}):s.tokens&&(n=n.concat(this.walkTokens(s.tokens,t)))}}return n}use(...r){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return r.forEach(n=>{let o={...n};if(o.async=this.defaults.async||o.async||!1,n.extensions&&(n.extensions.forEach(l=>{if(!l.name)throw new Error("extension name required");if("renderer"in l){let a=t.renderers[l.name];a?t.renderers[l.name]=function(...s){let d=l.renderer.apply(this,s);return d===!1&&(d=a.apply(this,s)),d}:t.renderers[l.name]=l.renderer}if("tokenizer"in l){if(!l.level||l.level!=="block"&&l.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let a=t[l.level];a?a.unshift(l.tokenizer):t[l.level]=[l.tokenizer],l.start&&(l.level==="block"?t.startBlock?t.startBlock.push(l.start):t.startBlock=[l.start]:l.level==="inline"&&(t.startInline?t.startInline.push(l.start):t.startInline=[l.start]))}"childTokens"in l&&l.childTokens&&(t.childTokens[l.name]=l.childTokens)}),o.extensions=t),n.renderer){let l=this.defaults.renderer||new se(this.defaults);for(let a in n.renderer){if(!(a in l))throw new Error(`renderer '${a}' does not exist`);if(["options","parser"].includes(a))continue;let s=a,d=n.renderer[s],i=l[s];l[s]=(...h)=>{let g=d.apply(l,h);return g===!1&&(g=i.apply(l,h)),g||""}}o.renderer=l}if(n.tokenizer){let l=this.defaults.tokenizer||new ae(this.defaults);for(let a in n.tokenizer){if(!(a in l))throw new Error(`tokenizer '${a}' does not exist`);if(["options","rules","lexer"].includes(a))continue;let s=a,d=n.tokenizer[s],i=l[s];l[s]=(...h)=>{let g=d.apply(l,h);return g===!1&&(g=i.apply(l,h)),g}}o.tokenizer=l}if(n.hooks){let l=this.defaults.hooks||new ne;for(let a in n.hooks){if(!(a in l))throw new Error(`hook '${a}' does not exist`);if(["options","block"].includes(a))continue;let s=a,d=n.hooks[s],i=l[s];ne.passThroughHooks.has(a)?l[s]=h=>{if(this.defaults.async&&ne.passThroughHooksRespectAsync.has(a))return(async()=>{let x=await d.call(l,h);return i.call(l,x)})();let g=d.call(l,h);return i.call(l,g)}:l[s]=(...h)=>{if(this.defaults.async)return(async()=>{let x=await d.apply(l,h);return x===!1&&(x=await i.apply(l,h)),x})();let g=d.apply(l,h);return g===!1&&(g=i.apply(l,h)),g}}o.hooks=l}if(n.walkTokens){let l=this.defaults.walkTokens,a=n.walkTokens;o.walkTokens=function(s){let d=[];return d.push(a.call(this,s)),l&&(d=d.concat(l.call(this,s))),d}}this.defaults={...this.defaults,...o}}),this}setOptions(r){return this.defaults={...this.defaults,...r},this}lexer(r,t){return j.lex(r,t??this.defaults)}parser(r,t){return H.parse(r,t??this.defaults)}parseMarkdown(r){return(t,n)=>{let o={...n},l={...this.defaults,...o},a=this.onError(!!l.silent,!!l.async);if(this.defaults.async===!0&&o.async===!1)return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof t>"u"||t===null)return a(new Error("marked(): input parameter is undefined or null"));if(typeof t!="string")return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(t)+", string expected"));if(l.hooks&&(l.hooks.options=l,l.hooks.block=r),l.async)return(async()=>{let s=l.hooks?await l.hooks.preprocess(t):t,d=await(l.hooks?await l.hooks.provideLexer(r):r?j.lex:j.lexInline)(s,l),i=l.hooks?await l.hooks.processAllTokens(d):d;l.walkTokens&&await Promise.all(this.walkTokens(i,l.walkTokens));let h=await(l.hooks?await l.hooks.provideParser(r):r?H.parse:H.parseInline)(i,l);return l.hooks?await l.hooks.postprocess(h):h})().catch(a);try{l.hooks&&(t=l.hooks.preprocess(t));let s=(l.hooks?l.hooks.provideLexer(r):r?j.lex:j.lexInline)(t,l);l.hooks&&(s=l.hooks.processAllTokens(s)),l.walkTokens&&this.walkTokens(s,l.walkTokens);let d=(l.hooks?l.hooks.provideParser(r):r?H.parse:H.parseInline)(s,l);return l.hooks&&(d=l.hooks.postprocess(d)),d}catch(s){return a(s)}}}onError(r,t){return n=>{if(n.message+=`
3075
+ Please report this to https://github.com/markedjs/marked.`,r){let o="<p>An error occurred:</p><pre>"+q(n.message+"",!0)+"</pre>";return t?Promise.resolve(o):o}if(t)return Promise.reject(n);throw n}}},X=new wo;function I(r,t){return X.parse(r,t)}I.options=I.setOptions=function(r){return X.setOptions(r),I.defaults=X.defaults,we(I.defaults),I},I.getDefaults=ce,I.defaults=Z,I.use=function(...r){return X.use(...r),I.defaults=X.defaults,we(I.defaults),I},I.walkTokens=function(r,t){return X.walkTokens(r,t)},I.parseInline=X.parseInline,I.Parser=H,I.parser=H.parse,I.Renderer=se,I.TextRenderer=ue,I.Lexer=j,I.lexer=j.lex,I.Tokenizer=ae,I.Hooks=ne,I.parse=I,I.options,I.setOptions,I.use,I.walkTokens,I.parseInline,H.parse,j.lex;const To={class:"modal-content help-modal"},Bo={class:"modal-header"},So={class:"header-actions"},Co={class:"modal-body"},Io={class:"doc-sidebar"},Ao={class:"doc-sidebar-group"},Po={class:"doc-sidebar-header"},$o=["onClick"],Mo={class:"doc-sidebar-group"},Do={class:"doc-sidebar-header"},Ro={class:"doc-content"},Lo=["innerHTML"],Go=["innerHTML"],Fo=["innerHTML"],Oo=["innerHTML"],zo=["innerHTML"],Uo=["innerHTML"],jo=["innerHTML"],Ho={class:"doc-pagination"},qo=["disabled"],Wo={class:"page-info"},Jo=["disabled"],Ko=U({__name:"HelpModal",props:{initialDoc:{type:String,default:"getting-started"}},emits:["close","openAbout"],setup(r,{emit:t}){const n=r,o=e.ref(n.initialDoc),l=e.ref(""),a=e.ref(null),s=[{id:"getting-started",title:"快速开始",icon:"home"},{id:"features",title:"功能介绍",icon:"info"},{id:"api",title:"API 文档",icon:"code"},{id:"tools",title:"工具文档",icon:"tool"},{id:"shortcuts",title:"快捷键",icon:"keyboard"},{id:"faq",title:"常见问题",icon:"help"}],d=e.ref(s),i=e.computed(()=>[...d.value,{id:"changelog",title:"更新日志",icon:"activity"}]),h=e.computed(()=>i.value.findIndex(V=>V.id===o.value)),g=e.computed(()=>h.value>0),x=e.computed(()=>h.value<i.value.length-1);function N(){const V=l.value.toLowerCase().trim();if(!V){d.value=s;return}d.value=s.filter(f=>f.title.toLowerCase().includes(V)||f.id.includes(V)),d.value.length>0&&!d.value.find(f=>f.id===o.value)&&(o.value=d.value[0].id)}const B=V=>I(V,{breaks:!0,gfm:!0}).replace(/<table>/g,'<table class="doc-table">'),y=e.computed(()=>B(Dr)),T=e.computed(()=>B(Rr)),C=e.computed(()=>B(Ar)),$=e.computed(()=>B(Pr)),R=e.computed(()=>B($r)),O=e.computed(()=>B(Mr)),W=e.computed(()=>B(Lr));function z(){var V;g.value&&(o.value=i.value[h.value-1].id,(V=a.value)==null||V.scrollTo(0,0))}function F(){var V;x.value&&(o.value=i.value[h.value+1].id,(V=a.value)==null||V.scrollTo(0,0))}return e.onMounted(()=>{N()}),(V,f)=>(e.openBlock(),e.createElementBlock("div",{class:"modal-overlay",onClick:f[3]||(f[3]=e.withModifiers(m=>V.$emit("close"),["self"]))},[e.createElementVNode("div",To,[e.createCommentVNode(" 头部 "),e.createElementVNode("div",Bo,[e.createElementVNode("h2",null,[e.createVNode(D,{name:"book-open",size:18}),f[4]||(f[4]=e.createTextVNode(" 帮助文档",-1))]),e.createElementVNode("div",So,[e.createElementVNode("button",{class:"btn-about",onClick:f[0]||(f[0]=m=>V.$emit("openAbout")),title:"关于 PairCode"},[e.createVNode(D,{name:"info",size:14}),f[5]||(f[5]=e.createTextVNode(" 关于 ",-1))]),e.createElementVNode("button",{class:"modal-close",onClick:f[1]||(f[1]=m=>V.$emit("close"))},"×")])]),e.createCommentVNode(" 主体 "),e.createElementVNode("div",Co,[e.createCommentVNode(" 侧边导航 "),e.createElementVNode("div",Io,[e.createCommentVNode(" 文档中心分组 "),e.createElementVNode("div",Ao,[e.createElementVNode("div",Po,[e.createVNode(D,{name:"book",size:14}),f[6]||(f[6]=e.createElementVNode("span",null,"文档中心",-1))]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,m=>(e.openBlock(),e.createElementBlock("div",{key:m.id,class:e.normalizeClass(["doc-nav-item",{active:o.value===m.id}]),onClick:p=>o.value=m.id},[e.createVNode(D,{name:m.icon,size:16},null,8,["name"]),e.createElementVNode("span",null,e.toDisplayString(m.title),1)],10,$o))),128))]),e.createCommentVNode(" 更新日志 "),e.createElementVNode("div",Mo,[e.createElementVNode("div",Do,[e.createVNode(D,{name:"clock",size:14}),f[7]||(f[7]=e.createElementVNode("span",null,"其他",-1))]),e.createElementVNode("div",{class:e.normalizeClass(["doc-nav-item",{active:o.value==="changelog"}]),onClick:f[2]||(f[2]=m=>o.value="changelog")},[e.createVNode(D,{name:"activity",size:16}),f[8]||(f[8]=e.createElementVNode("span",null,"更新日志",-1))],2)])]),e.createCommentVNode(" 文档内容 "),e.createElementVNode("div",Ro,[e.createElementVNode("div",{class:"doc-content-inner",ref_key:"contentRef",ref:a},[o.value==="faq"?(e.openBlock(),e.createElementBlock("div",{key:0,class:"doc-markdown",innerHTML:y.value},null,8,Lo)):o.value==="getting-started"?(e.openBlock(),e.createElementBlock("div",{key:1,class:"doc-markdown",innerHTML:T.value},null,8,Go)):o.value==="features"?(e.openBlock(),e.createElementBlock("div",{key:2,class:"doc-markdown",innerHTML:C.value},null,8,Fo)):o.value==="api"?(e.openBlock(),e.createElementBlock("div",{key:3,class:"doc-markdown",innerHTML:$.value},null,8,Oo)):o.value==="tools"?(e.openBlock(),e.createElementBlock("div",{key:4,class:"doc-markdown",innerHTML:R.value},null,8,zo)):o.value==="shortcuts"?(e.openBlock(),e.createElementBlock("div",{key:5,class:"doc-markdown",innerHTML:O.value},null,8,Uo)):o.value==="changelog"?(e.openBlock(),e.createElementBlock("div",{key:6,class:"doc-markdown",innerHTML:W.value},null,8,jo)):e.createCommentVNode("v-if",!0)],512),e.createCommentVNode(" 底部翻页 "),e.createElementVNode("div",Ho,[e.createElementVNode("button",{class:"page-btn",onClick:z,disabled:!g.value},[e.createVNode(D,{name:"chevron-left",size:14}),f[9]||(f[9]=e.createTextVNode(" 上一页 ",-1))],8,qo),e.createElementVNode("span",Wo,e.toDisplayString(h.value+1)+" / "+e.toDisplayString(i.value.length),1),e.createElementVNode("button",{class:"page-btn",onClick:F,disabled:!x.value},[f[10]||(f[10]=e.createTextVNode(" 下一页 ",-1)),e.createVNode(D,{name:"chevron-right",size:14})],8,Jo)])])])])]))}},[["__scopeId","data-v-203b7be1"]]),Zo="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='512'%20height='512'%20viewBox='0%200%20512%20512'%3e%3cdefs%3e%3c!--%20背景渐变(深色科技风)%20--%3e%3clinearGradient%20id='bgGrad'%20x1='0'%20y1='0'%20x2='1'%20y2='1'%3e%3cstop%20offset='0%25'%20stop-color='%230a1628'/%3e%3cstop%20offset='100%25'%20stop-color='%230d1f2e'/%3e%3c/linearGradient%3e%3c!--%20左侧尖括号渐变(科技蓝)%20--%3e%3clinearGradient%20id='leftBracket'%20x1='0'%20y1='0'%20x2='0'%20y2='1'%3e%3cstop%20offset='0%25'%20stop-color='%2300d4ff'/%3e%3cstop%20offset='100%25'%20stop-color='%230077b6'/%3e%3c/linearGradient%3e%3c!--%20右侧尖括号渐变(科技绿)%20--%3e%3clinearGradient%20id='rightBracket'%20x1='0'%20y1='0'%20x2='0'%20y2='1'%3e%3cstop%20offset='0%25'%20stop-color='%2300e676'/%3e%3cstop%20offset='100%25'%20stop-color='%2300c853'/%3e%3c/linearGradient%3e%3c!--%20中间连接线(蓝绿渐变)%20--%3e%3clinearGradient%20id='connector'%20x1='0'%20y1='0'%20x2='1'%20y2='0'%3e%3cstop%20offset='0%25'%20stop-color='%2300d4ff'/%3e%3cstop%20offset='50%25'%20stop-color='%2300e5ff'/%3e%3cstop%20offset='100%25'%20stop-color='%2300e676'/%3e%3c/linearGradient%3e%3c!--%20外发光%20--%3e%3cfilter%20id='glow'%3e%3cfeGaussianBlur%20stdDeviation='4'%20result='blur'/%3e%3cfeMerge%3e%3cfeMergeNode%20in='blur'/%3e%3cfeMergeNode%20in='SourceGraphic'/%3e%3c/feMerge%3e%3c/filter%3e%3cfilter%20id='softGlow'%3e%3cfeGaussianBlur%20stdDeviation='8'%20result='blur'/%3e%3cfeMerge%3e%3cfeMergeNode%20in='blur'/%3e%3cfeMergeNode%20in='SourceGraphic'/%3e%3c/feMerge%3e%3c/filter%3e%3c/defs%3e%3c!--%20圆角方形背景(深色科技底)%20--%3e%3crect%20x='32'%20y='32'%20width='448'%20height='448'%20rx='96'%20ry='96'%20fill='url(%23bgGrad)'%20stroke='%231a3a4a'%20stroke-width='2'/%3e%3c!--%20左侧%20%3c%20尖括号(三段式直线%20—%20科技蓝,代表代码输入/开发者)%20--%3e%3cpath%20d='M180%20150%20L96%20256%20L180%20362'%20stroke='url(%23leftBracket)'%20stroke-width='40'%20stroke-linejoin='round'%20fill='none'%20filter='url(%23glow)'/%3e%3c!--%20右侧%20%3e%20尖括号(三段式直线%20—%20科技绿,代表代码输出/AI伙伴)%20--%3e%3cpath%20d='M332%20150%20L416%20256%20L332%20362'%20stroke='url(%23rightBracket)'%20stroke-width='40'%20stroke-linejoin='round'%20fill='none'%20filter='url(%23glow)'/%3e%3c!--%20中间「=」连接线已移除(图标只留%20%3c%20%3e%20尖括号%20+%20中心%20AI%20核心光点)。%20--%3e%3c!--%20中心光点(代表%20AI%20核心%20—%20亮青色)%20--%3e%3ccircle%20cx='256'%20cy='256'%20r='18'%20fill='transparent'%20stroke='%2300e5ff'%20stroke-width='3'%20opacity='0.6'/%3e%3ccircle%20cx='256'%20cy='256'%20r='8'%20fill='%2300e5ff'%20opacity='0.9'%3e%3canimate%20attributeName='opacity'%20values='0.6;1;0.6'%20dur='2s'%20repeatCount='indefinite'/%3e%3c/circle%3e%3c/svg%3e",Qo={class:"modal-content about-modal"},Xo={class:"modal-header"},Yo={class:"modal-body"},_o={class:"about-left-col"},vo={class:"about-hero"},el={class:"about-logo"},nl=["src"],tl={class:"about-version"},rl={class:"about-right-col"},ol={class:"about-section"},ll={class:"feature-list"},al={class:"about-section"},sl={key:0,class:"sys-info"},il={class:"info-row"},cl={class:"info-row"},dl={class:"info-row"},pl={class:"info-path"},ml={class:"info-row"},gl={key:1,class:"loading-info"},kl={class:"modal-footer"},hl=U({__name:"AboutModal",props:{showHelpBtn:{type:Boolean,default:!0}},emits:["close","openHelp"],setup(r,{emit:t}){const n=e.ref(""),o=e.ref({}),l=e.ref(!0);return e.onMounted(async()=>{try{const a=await M.apiGet("/system/info");o.value=a,a.version&&(n.value=a.version)}catch{}l.value=!1}),(a,s)=>(e.openBlock(),e.createElementBlock("div",{class:"modal-overlay",onClick:s[3]||(s[3]=e.withModifiers(d=>a.$emit("close"),["self"]))},[e.createElementVNode("div",Qo,[e.createElementVNode("div",Xo,[e.createElementVNode("h2",null,[e.createVNode(D,{name:"info",size:18}),s[4]||(s[4]=e.createTextVNode(" 关于 PairCode",-1))]),e.createElementVNode("button",{class:"modal-close",onClick:s[0]||(s[0]=d=>a.$emit("close"))},"×")]),e.createElementVNode("div",Yo,[e.createCommentVNode(" 左列:Logo + 描述 + 技术栈 "),e.createElementVNode("div",_o,[e.createCommentVNode(" Logo + 标题 "),e.createElementVNode("div",vo,[e.createElementVNode("div",el,[e.createElementVNode("img",{src:e.unref(Zo),class:"about-logo-img",alt:"PairCode"},null,8,nl)]),s[5]||(s[5]=e.createElementVNode("div",{class:"about-title"},"PairCode IDE",-1)),e.createElementVNode("div",tl,"版本 "+e.toDisplayString(n.value),1)]),e.createCommentVNode(" 描述 "),s[6]||(s[6]=e.createElementVNode("div",{class:"about-section"},[e.createElementVNode("p",{class:"about-description"}," PairCode IDE 是一款纯 Web 端的 AI 辅助编程集成开发环境, 专为浏览器而设计。无需安装任何桌面客户端或本地 IDE 软件, 打开浏览器即可开始编程。它将 AI 对话能力深度融入编码工作流, 你只需用自然语言描述需求,AI 就能自动理解上下文、读写文件、执行命令、 管理版本控制。从代码生成到项目运维,在同一个浏览器窗口中全部完成。 ")],-1)),e.createCommentVNode(" 技术栈 "),s[7]||(s[7]=e.createStaticVNode('<div class="about-section" data-v-e61d5ebd><div class="section-title" data-v-e61d5ebd>技术栈</div><div class="tech-stack" data-v-e61d5ebd><span class="tech-badge" data-v-e61d5ebd>Go</span><span class="tech-badge" data-v-e61d5ebd>Vue 3</span><span class="tech-badge" data-v-e61d5ebd>WebSocket</span><span class="tech-badge" data-v-e61d5ebd>CodeMirror</span><span class="tech-badge" data-v-e61d5ebd>插件化工具</span><span class="tech-badge" data-v-e61d5ebd>TS 编译器</span><span class="tech-badge" data-v-e61d5ebd>MCP</span><span class="tech-badge" data-v-e61d5ebd>CodeGraph</span><span class="tech-badge" data-v-e61d5ebd>DAP</span></div></div>',1))]),e.createCommentVNode(" 右列:特性 + 系统信息 "),e.createElementVNode("div",rl,[e.createCommentVNode(" 特性亮点 "),e.createElementVNode("div",ol,[s[18]||(s[18]=e.createElementVNode("div",{class:"section-title"},"主要特性",-1)),e.createElementVNode("ul",ll,[e.createElementVNode("li",null,[e.createVNode(D,{name:"bot",size:14,color:"var(--accent)"}),s[8]||(s[8]=e.createTextVNode(" AI 对话编程 — 用自然语言与 AI 对话,自动生成与重构代码",-1))]),e.createElementVNode("li",null,[e.createVNode(D,{name:"file",size:14,color:"var(--accent)"}),s[9]||(s[9]=e.createTextVNode(" 智能代码编辑器 — 多语言语法高亮,浏览器中流畅编辑",-1))]),e.createElementVNode("li",null,[e.createVNode(D,{name:"git-branch",size:14,color:"var(--accent)"}),s[10]||(s[10]=e.createTextVNode(" Git 版本控制 — 在对话中完成全部 Git 操作",-1))]),e.createElementVNode("li",null,[e.createVNode(D,{name:"terminal",size:14,color:"var(--accent)"}),s[11]||(s[11]=e.createTextVNode(" 内置终端 — 无需离开浏览器即可执行命令",-1))]),e.createElementVNode("li",null,[e.createVNode(D,{name:"search",size:14,color:"var(--accent)"}),s[12]||(s[12]=e.createTextVNode(" 全局搜索 — 快速搜索文件与代码内容",-1))]),e.createElementVNode("li",null,[e.createVNode(D,{name:"settings",size:14,color:"var(--accent)"}),s[13]||(s[13]=e.createTextVNode(" 自主 Agent 模式 — AI 主动分析项目并自动执行任务",-1))]),e.createElementVNode("li",null,[e.createVNode(D,{name:"grid",size:14,color:"var(--accent)"}),s[14]||(s[14]=e.createTextVNode(" 对话历史管理 — 自动保存、回溯与继续历史对话",-1))]),e.createElementVNode("li",null,[e.createVNode(D,{name:"tool",size:14,color:"var(--accent)"}),s[15]||(s[15]=e.createTextVNode(" Skills / MCP 扩展 — 通过技能市场扩展 IDE 能力",-1))]),e.createElementVNode("li",null,[e.createVNode(D,{name:"code",size:14,color:"var(--accent)"}),s[16]||(s[16]=e.createTextVNode(" 内置调试器 — 支持 Go 程序的断点、单步和变量查看",-1))]),e.createElementVNode("li",null,[e.createVNode(D,{name:"image",size:14,color:"var(--accent)"}),s[17]||(s[17]=e.createTextVNode(" 网页验证 — 打开 URL、截图、分析页面效果",-1))])])]),e.createCommentVNode(" 系统信息 "),e.createElementVNode("div",al,[s[23]||(s[23]=e.createElementVNode("div",{class:"section-title"},"系统信息",-1)),l.value?(e.openBlock(),e.createElementBlock("div",gl,"加载中...")):(e.openBlock(),e.createElementBlock("div",sl,[e.createElementVNode("div",il,[s[19]||(s[19]=e.createElementVNode("span",{class:"info-label"},"主机名",-1)),e.createElementVNode("span",null,e.toDisplayString(o.value.hostname),1)]),e.createElementVNode("div",cl,[s[20]||(s[20]=e.createElementVNode("span",{class:"info-label"},"操作系统",-1)),e.createElementVNode("span",null,e.toDisplayString(o.value.os),1)]),e.createElementVNode("div",dl,[s[21]||(s[21]=e.createElementVNode("span",{class:"info-label"},"工作区",-1)),e.createElementVNode("span",pl,e.toDisplayString(o.value.workspace),1)]),e.createElementVNode("div",ml,[s[22]||(s[22]=e.createElementVNode("span",{class:"info-label"},"平台信息",-1)),e.createElementVNode("span",null,e.toDisplayString(o.value.goos),1)])]))])])]),e.createCommentVNode(" 底部 "),e.createElementVNode("div",kl,[r.showHelpBtn?(e.openBlock(),e.createElementBlock("button",{key:0,class:"btn-primary",onClick:s[1]||(s[1]=d=>a.$emit("openHelp"))},[e.createVNode(D,{name:"book-open",size:14}),s[24]||(s[24]=e.createTextVNode(" 查看帮助文档 ",-1))])):e.createCommentVNode("v-if",!0),e.createElementVNode("button",{class:"btn-secondary",onClick:s[2]||(s[2]=d=>a.$emit("close"))},"关闭")])])]))}},[["__scopeId","data-v-e61d5ebd"]]),fl={class:"toast-container"},yl={class:"dlg-box",style:{"max-width":"400px"}},ul={class:"dlg-title"},El={class:"dlg-body"},bl={class:"dlg-actions"},xl={class:"dlg-box",style:{"max-width":"420px"}},Vl={class:"dlg-title"},Nl={class:"dlg-body",style:{display:"flex","flex-direction":"column",gap:"8px"}},wl={style:{"font-size":"13px",color:"var(--text-secondary)"}},Tl=["placeholder"],Bl={class:"dlg-actions"},Sl={class:"dlg-box",style:{"max-width":"400px"}},Cl={class:"dlg-title"},Il={class:"dlg-body",style:{"white-space":"pre-line"}},Al=U({__name:"GlobalDialogs",setup(r){const t=e.ref(null);e.watch(()=>b.dialogState.show,l=>{l&&b.dialogState.type==="prompt"&&e.nextTick(()=>{var a,s;(a=t.value)==null||a.focus(),(s=t.value)==null||s.select()})});function n(){if(b.dialogState.type==="prompt"){const l=b.dialogState.inputValue;b.dialogState.show=!1,b.dialogState.resolve&&b.dialogState.resolve(l)}else if(b.dialogState.type==="confirm"&&b.dialogState.checkboxLabel){const a=b.dialogState.checkboxValue;b.dialogState.show=!1,b.dialogState.resolve&&b.dialogState.resolve({confirmed:!0,checked:a})}else b.dialogState.show=!1,b.dialogState.resolve&&b.dialogState.resolve(!0);b.dialogState.resolve=null}function o(){b.dialogState.type==="confirm"&&b.dialogState.checkboxLabel?(b.dialogState.show=!1,b.dialogState.resolve&&b.dialogState.resolve({confirmed:!1,checked:b.dialogState.checkboxValue})):b.dialogState.type==="prompt"?(b.dialogState.show=!1,b.dialogState.resolve&&b.dialogState.resolve(null)):(b.dialogState.show=!1,b.dialogState.resolve&&b.dialogState.resolve(!1)),b.dialogState.resolve=null}return(l,a)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createCommentVNode(" Toast 通知区域 "),e.createElementVNode("div",fl,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(b.dialogState).toasts,s=>(e.openBlock(),e.createElementBlock("div",{key:s.id,class:e.normalizeClass(["toast-item","toast-"+(s.type||"info")])},e.toDisplayString(s.message),3))),128))]),e.createCommentVNode(" Confirm 对话框 "),e.unref(b.dialogState).show&&e.unref(b.dialogState).type==="confirm"?(e.openBlock(),e.createElementBlock("div",{key:0,class:"dlg-overlay",onClick:e.withModifiers(o,["self"])},[e.createElementVNode("div",yl,[e.createElementVNode("div",ul,e.toDisplayString(e.unref(b.dialogState).title),1),e.createElementVNode("div",El,e.toDisplayString(e.unref(b.dialogState).message),1),e.unref(b.dialogState).checkboxLabel?(e.openBlock(),e.createElementBlock("label",{key:0,class:"dlg-checkbox",onClick:a[1]||(a[1]=e.withModifiers(()=>{},["stop"]))},[e.withDirectives(e.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":a[0]||(a[0]=s=>e.unref(b.dialogState).checkboxValue=s)},null,512),[[e.vModelCheckbox,e.unref(b.dialogState).checkboxValue]]),e.createElementVNode("span",null,e.toDisplayString(e.unref(b.dialogState).checkboxLabel),1)])):e.createCommentVNode("v-if",!0),e.createElementVNode("div",bl,[e.createElementVNode("button",{class:"dlg-btn",onClick:o},e.toDisplayString(e.unref(b.dialogState).cancelText),1),e.createElementVNode("button",{class:"dlg-btn primary",onClick:n},e.toDisplayString(e.unref(b.dialogState).confirmText),1)])])])):e.createCommentVNode("v-if",!0),e.createCommentVNode(" Prompt 对话框 "),e.unref(b.dialogState).show&&e.unref(b.dialogState).type==="prompt"?(e.openBlock(),e.createElementBlock("div",{key:1,class:"dlg-overlay",onClick:e.withModifiers(o,["self"])},[e.createElementVNode("div",xl,[e.createElementVNode("div",Vl,e.toDisplayString(e.unref(b.dialogState).title),1),e.createElementVNode("div",Nl,[e.createElementVNode("span",wl,e.toDisplayString(e.unref(b.dialogState).message),1),e.withDirectives(e.createElementVNode("input",{ref_key:"promptInputRef",ref:t,"onUpdate:modelValue":a[2]||(a[2]=s=>e.unref(b.dialogState).inputValue=s),placeholder:e.unref(b.dialogState).inputPlaceholder,class:"dlg-input",onKeyup:[e.withKeys(n,["enter"]),e.withKeys(o,["escape"])]},null,40,Tl),[[e.vModelText,e.unref(b.dialogState).inputValue]])]),e.createElementVNode("div",Bl,[e.createElementVNode("button",{class:"dlg-btn",onClick:o},e.toDisplayString(e.unref(b.dialogState).cancelText),1),e.createElementVNode("button",{class:"dlg-btn primary",onClick:n},e.toDisplayString(e.unref(b.dialogState).confirmText),1)])])])):e.createCommentVNode("v-if",!0),e.createCommentVNode(" Alert 信息框 "),e.unref(b.dialogState).show&&e.unref(b.dialogState).type==="alert"?(e.openBlock(),e.createElementBlock("div",{key:2,class:"dlg-overlay",onClick:e.withModifiers(n,["self"])},[e.createElementVNode("div",Sl,[e.createElementVNode("div",Cl,e.toDisplayString(e.unref(b.dialogState).title),1),e.createElementVNode("div",Il,e.toDisplayString(e.unref(b.dialogState).message),1),e.createElementVNode("div",{class:"dlg-actions"},[e.createElementVNode("button",{class:"dlg-btn primary",onClick:n},"确定")])])])):e.createCommentVNode("v-if",!0)],64))}},[["__scopeId","data-v-0271e4ae"]]),Pl=U({__name:"UiModals",setup(r){const t=e.ref(null);let n=null;function o(){b.showAbout.value=!1,b.showHelp.value=!0,b.helpDocTarget.value="getting-started"}function l(){b.showHelp.value=!1,b.showAbout.value=!0}return e.onMounted(()=>{n=Ve.mountListSlot(t,"overlay",{isActive:a=>Ve.isOverlayActive("overlay",a)})}),e.onUnmounted(()=>{n&&(n(),n=null)}),(a,s)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[e.unref(b.showSettings)?(e.openBlock(),e.createBlock(mr,{key:0,onClose:s[0]||(s[0]=d=>b.showSettings.value=!1)})):e.createCommentVNode("v-if",!0),e.unref(b.showSystem)?(e.openBlock(),e.createBlock(Tr,{key:1,onClose:s[1]||(s[1]=d=>b.showSystem.value=!1)})):e.createCommentVNode("v-if",!0),e.unref(b.showSource)?(e.openBlock(),e.createBlock(Ir,{key:2,onClose:s[2]||(s[2]=d=>b.showSource.value=!1)})):e.createCommentVNode("v-if",!0),e.unref(b.showHelp)?(e.openBlock(),e.createBlock(Ko,{key:3,onClose:s[3]||(s[3]=d=>b.showHelp.value=!1),onOpenAbout:l,initialDoc:e.unref(b.helpDocTarget)},null,8,["initialDoc"])):e.createCommentVNode("v-if",!0),e.unref(b.showAbout)?(e.openBlock(),e.createBlock(hl,{key:4,onClose:s[4]||(s[4]=d=>b.showAbout.value=!1),onOpenHelp:o})):e.createCommentVNode("v-if",!0),e.createVNode(Al),e.createCommentVNode(" ★ overlay 槽位(list 型):插件注册的浮动层条目叠加渲染(badge/toast/status pill 等) "),e.createElementVNode("div",{ref_key:"overlaySlotEl",ref:t,class:"plugin-overlay-host"},null,512)],64))}},[["__scopeId","data-v-519b8494"]]);function $l(r){const t=e.createApp(Pl);return t.mount(r),()=>{t.unmount()}}return J.mount=$l,Object.defineProperty(J,Symbol.toStringTag,{value:"Module"}),J})({},window.__PAIRCODE_CORE.Vue,window.__PAIRCODE_CORE.uiState,window.__PAIRCODE_CORE.pluginRuntime,window.__PAIRCODE_CORE.api);