@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.
- package/assets/ui-modals.css +1 -1
- package/assets/ui-modals.js +667 -553
- package/client.js +5 -5
- package/package.json +19 -1
package/assets/ui-modals.js
CHANGED
|
@@ -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
|
|
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
|
|
163
|
+
**通过 JS / TS 插件扩展 AI 的工具集,一切皆插件。**
|
|
159
164
|
|
|
160
|
-
PairCode IDE
|
|
165
|
+
PairCode IDE 的工具体系全部插件化——内置功能(文件 / 搜索 / 命令 / 网页 / 记忆 / 任务 / 代码图谱 / 办公文档 / 二进制分析等)以插件形态装配,你也可以编写自己的插件扩展能力:
|
|
161
166
|
|
|
162
|
-
- **JS / TS 插件** — 通过 \`
|
|
163
|
-
-
|
|
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
|
-
-
|
|
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
|
-
`,
|
|
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
|
-
>
|
|
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 | 否 |
|
|
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 | 是 |
|
|
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 | 是 |
|
|
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 | 否 |
|
|
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
|
-
|
|
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
|
-
**响应:**
|
|
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
|
-
"
|
|
620
|
-
"
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
"
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
-
|
|
2155
|
-
-
|
|
2156
|
-
-
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
-
|
|
2176
|
-
-
|
|
2177
|
-
|
|
2178
|
-
|
|
2179
|
-
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
|
|
2184
|
-
|
|
2185
|
-
-
|
|
2186
|
-
-
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
-
-
|
|
2198
|
-
-
|
|
2199
|
-
-
|
|
2200
|
-
-
|
|
2201
|
-
-
|
|
2202
|
-
|
|
2203
|
-
|
|
2204
|
-
|
|
2205
|
-
|
|
2206
|
-
|
|
2207
|
-
|
|
2208
|
-
|
|
2209
|
-
|
|
2210
|
-
|
|
2211
|
-
|
|
2212
|
-
-
|
|
2213
|
-
-
|
|
2214
|
-
-
|
|
2215
|
-
-
|
|
2216
|
-
-
|
|
2217
|
-
-
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
-
|
|
2229
|
-
-
|
|
2230
|
-
-
|
|
2231
|
-
-
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
-
|
|
2243
|
-
-
|
|
2244
|
-
-
|
|
2245
|
-
-
|
|
2246
|
-
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
2271
|
-
|
|
2272
|
-
|
|
2273
|
-
|
|
2274
|
-
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
-
|
|
2278
|
-
-
|
|
2279
|
-
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
|
|
2292
|
-
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
|
|
2301
|
-
|
|
2302
|
-
|
|
2303
|
-
|
|
2304
|
-
|
|
2305
|
-
|
|
2306
|
-
|
|
2307
|
-
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
|
|
2312
|
-
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
|
|
2317
|
-
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
-
|
|
2331
|
-
-
|
|
2332
|
-
-
|
|
2333
|
-
-
|
|
2334
|
-
-
|
|
2335
|
-
|
|
2336
|
-
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
-
|
|
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
|
-
`,
|
|
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
|
|
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 模型调用除外,你可以选择使用本地模型避免数据外出)。
|
|
2479
|
-
|
|
2480
|
-
##
|
|
2481
|
-
|
|
2482
|
-
|
|
2483
|
-
- **对话历史** —
|
|
2484
|
-
- **打开的文件** —
|
|
2485
|
-
- **工作区状态** —
|
|
2486
|
-
- **设置** — 主题、AI
|
|
2487
|
-
|
|
2488
|
-
##
|
|
2489
|
-
|
|
2490
|
-
|
|
2491
|
-
|
|
2492
|
-
##
|
|
2493
|
-
|
|
2494
|
-
**普通模式**:你发一条指令,AI
|
|
2495
|
-
|
|
2496
|
-
**自主模式**:你交给 AI 一个复杂任务(如"修复所有编译错误"),AI
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
|
|
2500
|
-
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
|
|
2519
|
-
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
- "
|
|
2540
|
-
- "
|
|
2541
|
-
- "
|
|
2542
|
-
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
|
2550
|
-
|
|
2551
|
-
|
|
|
2552
|
-
|
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
|
|
2557
|
-
|
|
2558
|
-
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
-
|
|
2563
|
-
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
|
|
2575
|
-
|
|
2576
|
-
|
|
2577
|
-
|
|
2578
|
-
|
|
2579
|
-
|
|
2580
|
-
|
|
2581
|
-
|
|
2582
|
-
|
|
2583
|
-
|
|
2584
|
-
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
- "
|
|
2588
|
-
- "
|
|
2589
|
-
|
|
2590
|
-
|
|
2591
|
-
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
|
|
2599
|
-
|
|
2600
|
-
-
|
|
2601
|
-
-
|
|
2602
|
-
|
|
2603
|
-
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
-
|
|
2613
|
-
-
|
|
2614
|
-
|
|
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
|
-
-
|
|
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
|
|
2899
|
-
]`).replace("lheading",
|
|
2900
|
-
`),n=t.length-1;for(;n>=0
|
|
2901
|
-
`)}function
|
|
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={"&":"&","<":"<",">":">",'"':""","'":"'"},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
|
|
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:
|
|
2905
|
-
`)}}blockquote(r){let t=this.rules.block.blockquote.exec(r);if(t){let n=
|
|
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
|
|
2908
|
-
`),
|
|
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
|
-
${
|
|
2911
|
-
${
|
|
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
|
-
`),
|
|
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
|
-
`),
|
|
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,
|
|
2917
|
-
`,1)[0],t[1].length),
|
|
2918
|
-
`,1)[0],
|
|
2919
|
-
`,r=r.substring(
|
|
2920
|
-
`,1)[0],
|
|
2921
|
-
`+
|
|
2922
|
-
`+
|
|
2923
|
-
`,r=r.substring(
|
|
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=
|
|
2925
|
-
`):[],a={type:"table",raw:
|
|
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(
|
|
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=
|
|
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(
|
|
2930
|
-
`:n.push(i);continue}if(i=this.tokenizer.code(t)){t=t.substring(i.raw.length);let
|
|
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,
|
|
2933
|
-
`+i.text,this.inlineQueue.at(-1).src=
|
|
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,
|
|
2936
|
-
`+i.raw,this.inlineQueue.at(-1).src=
|
|
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,
|
|
2939
|
-
`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=
|
|
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,
|
|
2942
|
-
`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=
|
|
2943
|
-
`;return o?'<pre><code class="language-'+
|
|
2944
|
-
`:"<pre><code>"+(n?l:
|
|
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>${
|
|
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);
|