@szjy/ai-coms 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +262 -24
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +629 -547
- package/dist/index.umd.js +2 -2
- package/dist/packages/common/custom-render/index.d.ts +5 -0
- package/dist/packages/common/custom-render/routeLinkRender.d.ts +45 -0
- package/dist/packages/components/AiChat/src/index.vue.d.ts +21 -0
- package/dist/style.css +2 -2
- package/package.json +1 -1
package/dist/index.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(
|
|
2
|
-
`)).getReader();console.log("reader from response:",t),c({error:0,reader:t})}else c({error:1,reader:null})}).catch(s=>{c({error:1,reader:null})})}):{error:1,reader:null}}let j=null;function le(){return j||(window.markdownit?j=new window.markdownit({html:!0,linkify:!0,typographer:!0}):console.log("markdownit is not loaded"),j)}const I=(r,n)=>{const i=r.__vccOpts||r;for(const[c,s]of n)i[c]=s;return i},ie=["src","alt"],U=I({__name:"SvgIcon",props:{name:{type:String,required:!0},size:{type:[Number,String],default:16},color:{type:String,default:""},className:{type:String,default:""},basePath:{type:String,default:"/icons/"}},setup(r){const n=r,i=e.computed(()=>{if(n.name.startsWith("http://")||n.name.startsWith("https://")||n.name.startsWith("/"))return n.name;const t=n.name.endsWith(".svg")?n.name:`${n.name}.svg`;return`${n.basePath}${t}`}),c=e.computed(()=>{const t=typeof n.size=="number"?`${n.size}px`:n.size;return{width:t,height:t,display:"inline-flex",justifyContent:"center",alignItems:"center"}}),s=e.computed(()=>{const t={width:"100%",height:"100%"};return n.color&&(t.filter=`drop-shadow(0 0 0 ${n.color})`),t});return(t,f)=>(e.openBlock(),e.createElementBlock("div",{class:"svg-icon-wrapper",style:e.normalizeStyle(c.value)},[e.createElementVNode("img",{src:i.value,alt:r.name,class:e.normalizeClass(["svg-icon",r.className]),style:e.normalizeStyle(s.value)},null,14,ie)],4))}},[["__scopeId","data-v-490b11c1"]]),ce=async r=>{if(navigator.clipboard&&navigator.permissions)await navigator.clipboard.writeText(r);else{const n=document.createElement("textArea");n.value=r,n.style.width=0,n.style.position="fixed",n.style.left="-999px",n.style.top="10px",n.setAttribute("readonly","readonly"),document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n)}},de=["innerHTML"],ue=I({__name:"Previewer",props:{reader:null,model:"szjy",scrollToBottomFn:null,displayText:""},emits:["failed","completed","updating"],setup(r,{expose:n,emit:i}){const{appContext:c}=e.getCurrentInstance(),{$message:s}=c.config.globalProperties,t=r,f=e.ref(t.displayText||""),S=e.ref(""),g=e.ref(!0),b=e.ref(!1),T=e.ref(!!t.displayText),E=i,$=e.ref(null);let x=null;const B=e.computed(()=>j?j.render(f.value):f.value),P=()=>{t.reader&&t.reader.cancel(),b.value=!0,a.value=!1,u(),T.value=!0,E("completed",f.value),g.value=!1,x&&(cancelAnimationFrame(x),x=null)},R=e.computed(()=>`${B.value}`),m=e.ref(!1),d=()=>{m.value=!0},u=()=>{m.value=!1},a=e.ref(!1),o=async()=>{if(!t.reader)return;const w=new TextDecoder("utf-8");for(g.value=!0;!b.value;)try{if(!t.reader){a.value=!0;break}const{value:l,done:h}=await t.reader.read();if(!t.reader){a.value=!0;break}if(h){a.value=!0;break}const k=M[t.model];if(!k)break;const N=k.call(M,l,w);if(N.done){a.value=!0;break}S.value+=N.content,x===null&&_()}catch(l){a.value=!0,console.log(3333,l),E("failed",l),P();break}finally{u()}},y=async()=>{t.scrollToBottomFn&&t.scrollToBottomFn()},p=(w=()=>{},l=()=>{})=>{if(S.value.length>0){const h=S.value.substring(0,10);f.value+=h,S.value=S.value.substring(10),w()}else l()},_=()=>{if(b.value&&x){cancelAnimationFrame(x),x=null,g.value=!1;return}a.value?p(()=>{x=requestAnimationFrame(_),E("updating",null)},()=>{E("completed",f.value),g.value=!1,T.value=!0,e.nextTick(()=>{a.value=!1}),x=null}):(p(),x=requestAnimationFrame(_)),y()};e.watch(()=>t.reader,()=>{t.reader&&o()},{immediate:!0,deep:!0}),e.onUnmounted(()=>{P()}),n({abortReader:P,initializeStart:d,initializeEnd:u}),e.computed(()=>m.value?!0:(!t.reader||!g||f.value,!1));const v=async()=>{try{const w=f.value;await ce(w),s.success("复制成功")}catch(w){console.error("复制失败:",w),s.error("复制失败")}};return(w,l)=>(e.openBlock(),e.createBlock(e.Transition,{name:"fade"},{default:e.withCtx(()=>[R.value?(e.openBlock(),e.createElementBlock("div",{key:0,ref_key:"refWrapperContent",ref:$,"text-16":"",class:"w-full h-full overflow-y-auto relative","p-24px":""},[e.createElementVNode("div",{class:"markdown-wrapper",innerHTML:R.value},null,8,de),T.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"copy-btn-wrapper",onClick:v},[e.createVNode(U,{name:"/images/svg/copy.svg",color:"#666666"}),l[0]||(l[0]=e.createElementVNode("span",{class:"copy-text"},"复制",-1))])):e.createCommentVNode("",!0)],512)):e.createCommentVNode("",!0)]),_:1}))}},[["__scopeId","data-v-e07fd8c0"]]),fe={class:"panel-header"},me={class:"header-actions"},pe={class:"header-title"},he={class:"action-icons"},ye={class:"body-content"},ge={key:0,class:"welcome-content"},we={class:"subtitle"},be={class:"highlight"},ke={class:"quick-questions"},ve=["onClick"],Se={key:1,class:"message-content user-content"},_e={class:"panel-footer"},xe={key:0,src:Q,alt:"加载中",class:"loading-icon"},Ne={class:"input-box"},Ce=["src"],Ee=I({__name:"ChatPanel",props:{modelValue:{type:Boolean,default:!1},token:{type:String,default:""},identifier:{type:String,default:""},baseUrl:{type:String,default:""},title:{type:String,default:"数智AI助理"}},emits:["update:modelValue","submit"],setup(r,{emit:n}){const{appContext:i}=e.getCurrentInstance(),{$message:c}=i.config.globalProperties,s=K("llmName")||"szjy",t=e.computed(()=>oe.find(h=>h.modelName===s)),f=r,S=n,g=e.ref(""),b=e.ref(null),T=e.ref(!1),E=e.ref([]),$=e.ref(["什么是AI助理,能做什么?","当前项目的基本情况?","当前项目的进度情况?","当前项目的参建方有哪些?","数智建管平台有哪些功能?能做什么?"]),x=e.ref([]),B=e.ref(!1),P=e.ref(null),R=()=>{e.nextTick(()=>{if(P.value){const h=P.value,k=h.scrollHeight,N=h.scrollTop,z=h.clientHeight;k-N-z<100?h.scrollTop=k:h.scrollTo({top:k})}})},m=e.ref(!1),d=e.computed(()=>m.value?"/images/ai-stop.png":"/images/ai-send.png"),u=(h,k)=>{console.log("onFailedReader",h,k),B.value=!1;const N=w();N&&N.initializeEnd(),c.error("转换失败,请重试"),m.value=!1,setTimeout(()=>{b.value&&b.value.focus()})},a=(h,k)=>{B.value=!1,m.value=!1,R(),k&&E.value[h]&&(E.value[h].displayText=k),setTimeout(()=>{b.value&&b.value.focus()})},o=h=>{m.value=!0},y=()=>{m.value=!1,S("update:modelValue",!1),T.value=!1,E.value=[]},p=e.ref(!1),_=()=>{p.value=!p.value},v=h=>{g.value=h,l()},w=()=>{for(let h=x.value.length-1;h>=0;h--)if(x.value[h])return x.value[h];return null},l=async()=>{if(console.log("stylizingLoading:",B.value),B.value){const C=w();console.log("lastPreviewer:",C),C&&(console.log("abortReader"),C.abortReader());return}if(!g.value.trim()){console.log("no input, return"),b.value.focus();return}E.value.push({type:"user",content:g.value}),m.value=!0,T.value=!0,S("submit",g.value),R();const h=g.value;g.value="";const k=E.value.length;x.value[k]&&x.value[k].initializeStart(),B.value=!0,E.value.push({type:"ai"});const{error:N,reader:z}=await se(t.value,{text:h,token:f.token,identifier:f.identifier,baseUrl:f.baseUrl});if(N){console.log(45455,N),u(k,N);return}z&&(E.value[k].reader=z)};return(h,k)=>{const N=e.resolveComponent("el-icon"),z=e.resolveComponent("el-input");return e.openBlock(),e.createBlock(e.Transition,{name:"slide"},{default:e.withCtx(()=>[r.modelValue?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["ai-panel",{"drawer-mode":p.value}])},[e.createElementVNode("div",fe,[e.createElementVNode("div",me,[e.createElementVNode("div",pe,e.toDisplayString(r.title),1),e.createElementVNode("div",he,[e.createVNode(N,{class:"action-icon",onClick:_},{default:e.withCtx(()=>[e.createVNode(U,{name:"/images/svg/drawer-layout.svg",color:"#999999"})]),_:1}),e.createVNode(N,{class:"action-icon",onClick:y},{default:e.withCtx(()=>[e.createVNode(U,{name:"/images/svg/close.svg",color:"#999999"})]),_:1})])])]),e.createElementVNode("div",ye,[T.value?(e.openBlock(),e.createElementBlock("div",{key:1,class:"chat-messages",ref_key:"messageContainerRef",ref:P},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(E.value,(C,L)=>(e.openBlock(),e.createElementBlock("div",{key:L,class:e.normalizeClass(["message-item",C.type==="user"?"user-message":"ai-message"])},[C.type==="ai"?(e.openBlock(),e.createBlock(ue,{key:0,ref_for:!0,ref:V=>x.value[L]=V,reader:C.reader,"onUpdate:reader":V=>C.reader=V,model:e.unref(s),displayText:C.displayText,scrollToBottomFn:R,onFailed:V=>u(L,V),onCompleted:V=>a(L,V),onUpdating:()=>o()},null,8,["reader","onUpdate:reader","model","displayText","onFailed","onCompleted","onUpdating"])):(e.openBlock(),e.createElementBlock("div",Se,e.toDisplayString(C.content),1))],2))),128))],512)):(e.openBlock(),e.createElementBlock("div",ge,[k[2]||(k[2]=e.createElementVNode("div",{class:"title"},[e.createElementVNode("img",{src:H,alt:"AI助手",class:"panel-icon"}),e.createElementVNode("h3",{class:"title-text"},"Hi, 您好")],-1)),e.createElementVNode("div",we,[k[1]||(k[1]=e.createTextVNode(" 我是")),e.createElementVNode("span",be,e.toDisplayString(r.title),1)]),e.createElementVNode("div",ke,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList($.value,(C,L)=>(e.openBlock(),e.createElementBlock("div",{key:L,class:"question-item",onClick:V=>v(C)},[e.createElementVNode("span",null,e.toDisplayString(C),1),e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(U,{name:"/images/svg/arrow-right.svg",color:"#999999"})]),_:1})],8,ve))),128))])]))]),e.createElementVNode("div",_e,[m.value?(e.openBlock(),e.createElementBlock("img",xe)):e.createCommentVNode("",!0),e.createElementVNode("div",Ne,[e.createVNode(z,{modelValue:g.value,"onUpdate:modelValue":k[0]||(k[0]=C=>g.value=C),ref_key:"refInputTextString",ref:b,placeholder:"请输入您的问题",autofocus:"",onKeyup:e.withKeys(l,["enter"])},{append:e.withCtx(()=>[e.createElementVNode("div",{class:"send-icon-box",onClick:l},[e.createElementVNode("img",{src:d.value,alt:"发送",class:"send-icon"},null,8,Ce)])]),_:1},8,["modelValue"])])])],2)):e.createCommentVNode("",!0)]),_:1})}}},[["__scopeId","data-v-cf96dd03"]]);var F={exports:{}};(function(r,n){(function(i,c){r.exports=c()})(window,function(){return function(i){var c={};function s(t){if(c[t])return c[t].exports;var f=c[t]={i:t,l:!1,exports:{}};return i[t].call(f.exports,f,f.exports,s),f.l=!0,f.exports}return s.m=i,s.c=c,s.d=function(t,f,S){s.o(t,f)||Object.defineProperty(t,f,{enumerable:!0,get:S})},s.r=function(t){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},s.t=function(t,f){if(1&f&&(t=s(t)),8&f||4&f&&typeof t=="object"&&t&&t.__esModule)return t;var S=Object.create(null);if(s.r(S),Object.defineProperty(S,"default",{enumerable:!0,value:t}),2&f&&typeof t!="string")for(var g in t)s.d(S,g,(function(b){return t[b]}).bind(null,g));return S},s.n=function(t){var f=t&&t.__esModule?function(){return t.default}:function(){return t};return s.d(f,"a",f),f},s.o=function(t,f){return Object.prototype.hasOwnProperty.call(t,f)},s.p="",s(s.s=0)}([function(i,c,s){function t(m,d,u,a){u.push(m),a.push([].concat(d[m]||[]))}function f(m,d){if(!m)throw new Error("[getMaxDepsChain] dep 参数不能为空");var u=[],a=[],o=[];for(t(m,d,a,o);a.length;){var y=o.pop();if(y&&y.length){var p=y.shift();if(o.push(y),~a.indexOf(p))throw new Error("[getMaxDepsChain][loop] 存在循环依赖,请检查依赖关系; nextName: "+p+", mainStack: "+a);t(p,d,a,o)}else u.push([].concat(a)),a.pop()}return u.reduce(function(_,v){return v.length>_.length?v:_},[])}function S(m){if(!m)throw new Error("[depsParser] 入参不能为空");var d={};m.forEach(function(a){d[a.name]=a.deps||[]});var u=[];return m.forEach(function(a){var o=f(a.name,d).length-1;a.priority=o,u[o]=(u[o]||[]).concat(a)}),u}s.r(c),s.d(c,"loadScript",function(){return $}),s.d(c,"loadScripts",function(){return x}),s.d(c,"dynamicLoadScripts",function(){return B}),s.d(c,"createScriptsLoadIterator",function(){return P}),s.d(c,"loadScriptsQueue",function(){return R}),s.d(c,"getMaxDepsChain",function(){return f}),s.d(c,"depsParser",function(){return S});var g=function(){return(g=Object.assign||function(m){for(var d,u=1,a=arguments.length;u<a;u++)for(var o in d=arguments[u])Object.prototype.hasOwnProperty.call(d,o)&&(m[o]=d[o]);return m}).apply(this,arguments)},b=function(m,d,u,a){return new(u||(u=Promise))(function(o,y){function p(w){try{v(a.next(w))}catch(l){y(l)}}function _(w){try{v(a.throw(w))}catch(l){y(l)}}function v(w){var l;w.done?o(w.value):(l=w.value,l instanceof u?l:new u(function(h){h(l)})).then(p,_)}v((a=a.apply(m,[])).next())})},T=function(m,d){var u,a,o,y,p={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return y={next:_(0),throw:_(1),return:_(2)},typeof Symbol=="function"&&(y[Symbol.iterator]=function(){return this}),y;function _(v){return function(w){return function(l){if(u)throw new TypeError("Generator is already executing.");for(;p;)try{if(u=1,a&&(o=2&l[0]?a.return:l[0]?a.throw||((o=a.return)&&o.call(a),0):a.next)&&!(o=o.call(a,l[1])).done)return o;switch(a=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return p.label++,{value:l[1],done:!1};case 5:p.label++,a=l[1],l=[0];continue;case 7:l=p.ops.pop(),p.trys.pop();continue;default:if(o=p.trys,!((o=o.length>0&&o[o.length-1])||l[0]!==6&&l[0]!==2)){p=0;continue}if(l[0]===3&&(!o||l[1]>o[0]&&l[1]<o[3])){p.label=l[1];break}if(l[0]===6&&p.label<o[1]){p.label=o[1],o=l;break}if(o&&p.label<o[2]){p.label=o[2],p.ops.push(l);break}o[2]&&p.ops.pop(),p.trys.pop();continue}l=d.call(m,p)}catch(h){l=[6,h],a=0}finally{u=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}([v,w])}}},E=function(m){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var d,u=m[Symbol.asyncIterator];return u?u.call(m):(m=typeof __values=="function"?__values(m):m[Symbol.iterator](),d={},a("next"),a("throw"),a("return"),d[Symbol.asyncIterator]=function(){return this},d);function a(o){d[o]=m[o]&&function(y){return new Promise(function(p,_){(function(v,w,l,h){Promise.resolve(h).then(function(k){v({value:k,done:l})},w)})(p,_,(y=m[o](y)).done,y.value)})}}};function $(m,d){return d===void 0&&(d=!1),new Promise(function(u,a){var o=d?document.head:document.body,y=document.createElement("script");y.type="text/javascript",y.src=m,y.crossOrigin="anonymous",y.onreadystatechange=u,y.onload=u,y.onerror=a,o.appendChild(y)})}var x=function(m,d){return d===void 0&&(d={}),b(void 0,void 0,void 0,function(){var u,a,o,y,p;return T(this,function(_){switch(_.label){case 0:return u=d.baseUrl,a=u===void 0?"":u,o=d.lastLoadResult,y=d.inHead,p=y!==void 0&&y,[4,Promise.all(m.map(function(v){return b(void 0,void 0,void 0,function(){var w,l,h,k,N,z,C,L;return T(this,function(V){switch(V.label){case 0:return w=v.name,l=v.path,h=v.deps,(C={})[w]=!0,k=C,(L={})[w]=!1,N=L,window[w]?[2,k]:[3,1];case 1:return z=!0,h&&o&&[].concat(h).forEach(function(je){o[je]!==!1&&(z=!0)}),z?[4,$(l.indexOf("http")===0||l.indexOf("//:")===0?l:a+l,p).then(function(){return k}).catch(function(){return N})]:[3,3];case 2:return[2,V.sent()];case 3:return[2,N]}})})}))];case 1:return[2,_.sent()]}})})},B=function(m,d){return d===void 0&&(d={}),function(){var u=[].concat(S(m));return{next:function(){if(u.length){var a=u.shift();return x(a,d).then(function(o){return{value:o,done:!1}})}return Promise.resolve({done:!0})}}}},P=function(m,d){var u;return d===void 0&&(d={}),(u={})[Symbol.asyncIterator]=B(m,d),u},R=function(m,d){return d===void 0&&(d={}),b(void 0,void 0,void 0,function(){var u,a,o,y,p,_;return T(this,function(v){switch(v.label){case 0:v.trys.push([0,5,6,11]),u=E(P(m,d)),v.label=1;case 1:return[4,u.next()];case 2:if((a=v.sent()).done)return[3,4];o=a.value,d.lastLoadResult=d.lastLoadResult||{},console.log("current load: ",o),o.forEach(function(w){d.lastLoadResult=g(g({},d.lastLoadResult),w)}),v.label=3;case 3:return[3,1];case 4:return[3,11];case 5:return y=v.sent(),p={error:y},[3,11];case 6:return v.trys.push([6,,9,10]),a&&!a.done&&(_=u.return)?[4,_.call(u)]:[3,8];case 7:v.sent(),v.label=8;case 8:return[3,10];case 9:if(p)throw p.error;return[7];case 10:return[7];case 11:return[2,d.lastLoadResult]}})})}}])})})(F);var Te=F.exports;const Ve={key:0,class:"ai-assistant"},Be={name:"AiChat"},Pe=e.defineComponent({...Be,props:{token:{type:String,default:""},identifier:{type:String,default:""},baseUrl:{type:String,default:""},title:{type:String,default:"数智AI助理"}},setup(r){const n=e.ref(!1),i=e.ref(!1),c=()=>{n.value=!n.value},s=()=>{i.value=!0,n.value=!1},t=g=>{console.log("用户输入:",g)},f=[{name:"markdownit",path:"markdown-it.min.js"},{name:"hljs",path:"highlight.11.11.1.min.js"}];let S={};return Te.loadScriptsQueue(f,{baseUrl:"/scripts/ai/",lastLoadResult:S,inHead:!1}).then(g=>{if(console.log("load ai deps: ",g),window.markdownit){const b=window.markdownit();console.log("markdownit: ",b),le()}}),(g,b)=>i.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Ve,[e.createVNode(Ee,{modelValue:n.value,"onUpdate:modelValue":b[0]||(b[0]=T=>n.value=T),onSubmit:t,token:r.token,identifier:r.identifier,baseUrl:r.baseUrl,title:r.title},null,8,["modelValue","token","identifier","baseUrl","title"]),e.createElementVNode("div",{class:"ai-icon",onClick:c},[e.createElementVNode("div",{class:"close-icon",onClick:e.withModifiers(s,["stop"])},b[1]||(b[1]=[e.createElementVNode("svg",{viewBox:"0 0 1024 1024",width:"8",height:"8"},[e.createElementVNode("path",{d:"M512 456.310154L94.247385 38.557538a39.384615 39.384615 0 0 0-55.689847 55.689847L456.310154 512 38.557538 929.752615a39.384615 39.384615 0 0 0 55.689847 55.689847L512 567.689846l417.752615 417.752616c15.163077 15.163077 40.526769 15.163077 55.689847 0s15.163077-40.526769 0-55.689847L567.689846 512l417.752616-417.752615a39.384615 39.384615 0 0 0-55.689847-55.689847L512 456.310154z",fill:"currentColor"})],-1)])),b[2]||(b[2]=e.createElementVNode("img",{src:W,alt:"AI助手"},null,-1)),b[3]||(b[3]=e.createElementVNode("span",{class:"ai-icon-text"},"AI助手",-1))])]))}}),D=I(Pe,[["__scopeId","data-v-4b85f480"]]),J=Object.freeze(Object.defineProperty({__proto__:null,SzAiChat:D},Symbol.toStringTag,{value:"Module"})),A=function(r){if(!A.installed){A.installed=!0;for(let n in J){const i=Reflect.get(J,n);r.component(i.name,i)}}},ze="0.1.2",Oe="Sz";function Le({componentPrefix:r=Oe,components:n=[]}={}){const i=[];function c(t,f,S){t.component(r+f)||t.component(r+f,S)}function s(t){i.includes(t)||(i.push(t),n.forEach(f=>{const{name:S,alias:g}=f;c(t,S,f),g&&g.forEach(b=>{c(t,b,f)})}))}return{version:ze,componentPrefix:r,install:s}}const Re={install(r){A(r)}};O.SzAiChat=D,O.create=Le,O.default=Re,Object.defineProperties(O,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
1
|
+
(function(R,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(R=typeof globalThis<"u"?globalThis:R||self,e(R["szjy-ai-coms"]={},R.Vue))})(this,function(R,e){"use strict";const K="/images/ai-round.png",X="/images/ai-sqrt.png",G="/images/bars-loading.svg";function Y(n,r=location.href){return new URLSearchParams(new URL(r).search).get(n)}function Z(n){return n.startsWith("http://")||n.startsWith("https://")?n:`${location.protocol}//${location.host}${n}`}async function ee(n){const r=new URL("http://localhost:11434/api/chat"),a={};Object.keys(a).forEach(o=>{r.searchParams.append(o,a[o])});const s=new Request(r,{mode:"cors",method:"post",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:"llama3",stream:!0,messages:[{role:"system",content:"全程使用中文回答问题。"},{role:"user",content:n}]})});return fetch(s)}async function te(n,r){const a=new URL(`${location.origin}/spark/v1/chat/completions`),s={};Object.keys(s).forEach(t=>{a.searchParams.append(t,s[t])});const o=new Request(a,{method:"post",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify({model:"generalv4.0Ultra",stream:!0,messages:[{role:"user",content:n}]})});return fetch(o)}async function ne(n,r){const a=new URL(`${location.origin}/siliconflow/v1/chat/completions`),s={};Object.keys(s).forEach(t=>{a.searchParams.append(t,s[t])});const o=new Request(a,{method:"post",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify({model:"Qwen/Qwen1.5-110B-Chat",stream:!0,messages:[{role:"user",content:n}]})});return fetch(o)}async function re(n,r){const a=new URL(`${location.origin}/moonshot/v1/chat/completions`),s={};Object.keys(s).forEach(t=>{a.searchParams.append(t,s[t])});const o=new Request(a,{method:"post",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify({model:"moonshot-v1-8k",stream:!0,messages:[{role:"system",content:"你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不可翻译成其他语言。"},{role:"user",content:n}]})});return fetch(o)}async function oe(n,r){const a=new URL(`${location.origin}/dashscope/compatible-mode/v1/chat/completions`),s={};Object.keys(s).forEach(t=>{a.searchParams.append(t,s[t])});const o=new Request(a,{method:"post",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify({model:"qwq-32b-preview",stream:!0,messages:[{role:"system",content:"全程使用中文回答问题"},{role:"user",content:n}]})});return fetch(o)}async function ae(n,r,a,s=""){const o=Z(s),t=new URL(`${o}/support/${a}/a`),c={};Object.keys(c).forEach(g=>{t.searchParams.append(g,c[g])});const y=new Request(t,{method:"post",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify({content:n})});return fetch(y)}const se=n=>{if(n.startsWith("data:")){const r=n.substring(5).trim();if(r==="[DONE]")return{done:!0};try{return JSON.parse(r)}catch(a){console.error("JSON parsing error:",a)}}return null},le=[{label:"模拟数据模型",modelName:"standard",api:null},{label:"Spark 星火大模型",modelName:"spark",api:te},{label:"Ollama 3 大模型",modelName:"ollama3",api:ee},{label:"SiliconFlow 硅基流动大模型",modelName:"siliconflow",api:ne},{label:"Kimi Moonshot 月之暗面大模型",modelName:"moonshot",api:re},{label:"通义千问大模型",modelName:"dashscope",api:oe},{label:"数智建管大模型",modelName:"szjy",api:ae}],A={standard(n,r){let a="";return n instanceof Uint8Array?a=r.decode(n,{stream:!0}):a=n,{content:a}},spark(n){const r=se(n);return r.done?{done:!0}:{content:r.choices[0].delta.content||""}},siliconflow(n){return this.spark(n)},moonshot(n){return this.spark(n)},dashscope(n){return this.spark(n)},szjy(n){return this.spark(n)},ollama3(n){return{content:JSON.parse(n).message.content}}},M=(n,r,a)=>{const s=n.split(a);return s.slice(0,-1).forEach(o=>{o.trim()!==""&&r.enqueue(o)}),s[s.length-1]},ie=n=>{let r="";return new TransformStream({transform(a,s){if(r+=a,r.trim().startsWith("data:"))r=M(r,s,n);else try{JSON.parse(r),r=M(r,s,n)}catch{s.enqueue(a),r=""}},flush(a){r.trim()!==""&&a.enqueue(r)}})};async function ce(n,r){const a=n.api;return a?new Promise(s=>{a(r.text,r.token,r.identifier,r.baseUrl).then(o=>{if(o.body){const t=o.body.pipeThrough(new TextDecoderStream).pipeThrough(ie(`
|
|
2
|
+
`)).getReader();console.log("reader from response:",t),s({error:0,reader:t})}else s({error:1,reader:null})}).catch(o=>{s({error:1,reader:null})})}):{error:1,reader:null}}let I=null;function de(){return I||(window.markdownit?I=new window.markdownit({html:!0,linkify:!0,typographer:!0}):console.log("markdownit is not loaded"),I)}const q=(n,r)=>{const a=n.__vccOpts||n;for(const[s,o]of r)a[s]=o;return a},ue=["src","alt"],$=q({__name:"SvgIcon",props:{name:{type:String,required:!0},size:{type:[Number,String],default:16},color:{type:String,default:""},className:{type:String,default:""},basePath:{type:String,default:"/icons/"}},setup(n){const r=n,a=e.computed(()=>{if(r.name.startsWith("http://")||r.name.startsWith("https://")||r.name.startsWith("/"))return r.name;const t=r.name.endsWith(".svg")?r.name:`${r.name}.svg`;return`${r.basePath}${t}`}),s=e.computed(()=>{const t=typeof r.size=="number"?`${r.size}px`:r.size;return{width:t,height:t,display:"inline-flex",justifyContent:"center",alignItems:"center"}}),o=e.computed(()=>{const t={width:"100%",height:"100%"};return r.color&&(t.filter=`drop-shadow(0 0 0 ${r.color})`),t});return(t,c)=>(e.openBlock(),e.createElementBlock("div",{class:"svg-icon-wrapper",style:e.normalizeStyle(s.value)},[e.createElementVNode("img",{src:a.value,alt:n.name,class:e.normalizeClass(["svg-icon",n.className]),style:e.normalizeStyle(o.value)},null,14,ue)],4))}},[["__scopeId","data-v-490b11c1"]]),fe=async n=>{if(navigator.clipboard&&navigator.permissions)await navigator.clipboard.writeText(n);else{const r=document.createElement("textArea");r.value=n,r.style.width=0,r.style.position="fixed",r.style.left="-999px",r.style.top="10px",r.setAttribute("readonly","readonly"),document.body.appendChild(r),r.select(),document.execCommand("copy"),document.body.removeChild(r)}},me=["innerHTML"],pe={__name:"Previewer",props:{reader:null,model:"szjy",scrollToBottomFn:null,displayText:"",messagePostRender:{type:Function,default:null}},emits:["failed","completed","updating"],setup(n,{expose:r,emit:a}){const{appContext:s}=e.getCurrentInstance(),{$message:o}=s.config.globalProperties,t=n,c=e.ref(t.displayText||""),y=e.ref(""),g=e.ref(!0),b=e.ref(!1),E=e.ref(!!t.displayText),T=a,z=e.ref(null);let _=null;const V=e.computed(()=>I?I.render(c.value):c.value),B=()=>{t.reader&&t.reader.cancel(),b.value=!0,i.value=!1,f(),E.value=!0,T("completed",c.value),g.value=!1,_&&(cancelAnimationFrame(_),_=null)},j=e.computed(()=>`${V.value}`),m=e.ref(!1),u=()=>{m.value=!0},f=()=>{m.value=!1},i=e.ref(!1),l=async()=>{if(!t.reader)return;const k=new TextDecoder("utf-8");for(g.value=!0;!b.value;)try{if(!t.reader){i.value=!0;break}const{value:d,done:h}=await t.reader.read();if(!t.reader){i.value=!0;break}if(h){i.value=!0;break}const v=A[t.model];if(!v)break;const N=v.call(A,d,k);if(N.done){i.value=!0;break}y.value+=N.content,_===null&&S()}catch(d){i.value=!0,console.log(3333,d),T("failed",d),B();break}finally{f()}},w=async()=>{t.scrollToBottomFn&&t.scrollToBottomFn()},p=(k=()=>{},d=()=>{})=>{if(y.value.length>0){const h=y.value.substring(0,10);c.value+=h,y.value=y.value.substring(10),k()}else d()},S=()=>{if(b.value&&_){cancelAnimationFrame(_),_=null,g.value=!1;return}i.value?p(()=>{_=requestAnimationFrame(S),T("updating",null)},()=>{T("completed",c.value),g.value=!1,E.value=!0,e.nextTick(()=>{if(i.value=!1,t.messagePostRender&&z.value)try{t.messagePostRender(z.value,c.value)}catch(k){console.error("messagePostRender 执行失败:",k)}}),_=null}):(p(),_=requestAnimationFrame(S)),w()};e.watch(()=>t.reader,()=>{t.reader&&l()},{immediate:!0,deep:!0}),e.onUnmounted(()=>{B()}),r({abortReader:B,initializeStart:u,initializeEnd:f}),e.computed(()=>m.value?!0:(!t.reader||!g||c.value,!1));const x=async()=>{try{const k=c.value;await fe(k),o.success("复制成功")}catch(k){console.error("复制失败:",k),o.error("复制失败")}};return(k,d)=>(e.openBlock(),e.createBlock(e.Transition,{name:"fade"},{default:e.withCtx(()=>[j.value?(e.openBlock(),e.createElementBlock("div",{key:0,ref_key:"refWrapperContent",ref:z,"text-16":"",class:"w-full h-full overflow-y-auto relative","p-24px":""},[e.createElementVNode("div",{class:"markdown-wrapper",innerHTML:j.value},null,8,me),E.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"ai-copy-btn-wrapper",onClick:x},[e.createVNode($,{name:"/images/svg/copy.svg",color:"#666666"}),d[0]||(d[0]=e.createElementVNode("span",{class:"copy-text"},"复制",-1))])):e.createCommentVNode("",!0)],512)):e.createCommentVNode("",!0)]),_:1}))}},he={class:"panel-header"},ge={class:"header-actions"},ye={class:"header-title"},we={class:"action-icons"},be={class:"body-content"},ke={key:0,class:"welcome-content"},ve={class:"subtitle"},xe={class:"highlight"},Se={class:"quick-questions"},_e=["onClick"],Ne={key:1,class:"message-content user-content"},Ce={class:"panel-footer"},Ee={key:0,src:G,alt:"加载中",class:"loading-icon"},Te={class:"input-box"},Re=["src"],Pe={__name:"ChatPanel",props:{modelValue:{type:Boolean,default:!1},token:{type:String,default:""},identifier:{type:String,default:""},baseUrl:{type:String,default:""},title:{type:String,default:"数智AI助理"},messagePostRender:{type:Function,default:null}},emits:["update:modelValue","submit"],setup(n,{emit:r}){const{appContext:a}=e.getCurrentInstance(),{$message:s}=a.config.globalProperties,o=Y("llmName")||"szjy",t=e.computed(()=>le.find(h=>h.modelName===o)),c=n,y=r,g=e.ref(""),b=e.ref(null),E=e.ref(!1),T=e.ref([]),z=e.ref(["什么是AI助理,能做什么?","当前项目的基本情况?","当前项目的进度情况?","当前项目的参建方有哪些?","数智建管平台有哪些功能?能做什么?"]),_=e.ref([]),V=e.ref(!1),B=e.ref(null),j=()=>{e.nextTick(()=>{if(B.value){const h=B.value,v=h.scrollHeight,N=h.scrollTop,L=h.clientHeight;v-N-L<100?h.scrollTop=v:h.scrollTo({top:v})}})},m=e.ref(!1),u=e.computed(()=>m.value?"/images/ai-stop.png":"/images/ai-send.png"),f=(h,v)=>{console.log("onFailedReader",h,v),V.value=!1;const N=k();N&&N.initializeEnd(),s.error("转换失败,请重试"),m.value=!1,setTimeout(()=>{b.value&&b.value.focus()})},i=(h,v)=>{V.value=!1,m.value=!1,j(),v&&T.value[h]&&(T.value[h].displayText=v),setTimeout(()=>{b.value&&b.value.focus()})},l=h=>{m.value=!0},w=()=>{m.value=!1,y("update:modelValue",!1),E.value=!1,T.value=[]},p=e.ref(!1),S=()=>{p.value=!p.value},x=h=>{g.value=h,d()},k=()=>{for(let h=_.value.length-1;h>=0;h--)if(_.value[h])return _.value[h];return null},d=async()=>{if(console.log("stylizingLoading:",V.value),V.value){const C=k();console.log("lastPreviewer:",C),C&&(console.log("abortReader"),C.abortReader());return}if(!g.value.trim()){console.log("no input, return"),b.value.focus();return}T.value.push({type:"user",content:g.value}),m.value=!0,E.value=!0,y("submit",g.value),j();const h=g.value;g.value="";const v=T.value.length;_.value[v]&&_.value[v].initializeStart(),V.value=!0,T.value.push({type:"ai"});const{error:N,reader:L}=await ce(t.value,{text:h,token:c.token,identifier:c.identifier,baseUrl:c.baseUrl});if(N){console.log(45455,N),f(v,N);return}L&&(T.value[v].reader=L)};return(h,v)=>{const N=e.resolveComponent("el-icon"),L=e.resolveComponent("el-input");return e.openBlock(),e.createBlock(e.Transition,{name:"slide"},{default:e.withCtx(()=>[n.modelValue?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["ai-panel",{"drawer-mode":p.value}])},[e.createElementVNode("div",he,[e.createElementVNode("div",ge,[e.createElementVNode("div",ye,e.toDisplayString(n.title),1),e.createElementVNode("div",we,[e.createVNode(N,{class:"action-icon",onClick:S},{default:e.withCtx(()=>[e.createVNode($,{name:"/images/svg/drawer-layout.svg",color:"#999999"})]),_:1}),e.createVNode(N,{class:"action-icon",onClick:w},{default:e.withCtx(()=>[e.createVNode($,{name:"/images/svg/close.svg",color:"#999999"})]),_:1})])])]),e.createElementVNode("div",be,[E.value?(e.openBlock(),e.createElementBlock("div",{key:1,class:"chat-messages",ref_key:"messageContainerRef",ref:B},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(T.value,(C,O)=>(e.openBlock(),e.createElementBlock("div",{key:O,class:e.normalizeClass(["message-item",C.type==="user"?"user-message":"ai-message"])},[C.type==="ai"?(e.openBlock(),e.createBlock(pe,{key:0,ref_for:!0,ref:P=>_.value[O]=P,reader:C.reader,"onUpdate:reader":P=>C.reader=P,model:e.unref(o),displayText:C.displayText,scrollToBottomFn:j,messagePostRender:n.messagePostRender,onFailed:P=>f(O,P),onCompleted:P=>i(O,P),onUpdating:()=>l()},null,8,["reader","onUpdate:reader","model","displayText","messagePostRender","onFailed","onCompleted","onUpdating"])):(e.openBlock(),e.createElementBlock("div",Ne,e.toDisplayString(C.content),1))],2))),128))],512)):(e.openBlock(),e.createElementBlock("div",ke,[v[2]||(v[2]=e.createElementVNode("div",{class:"title"},[e.createElementVNode("img",{src:X,alt:"AI助手",class:"panel-icon"}),e.createElementVNode("h3",{class:"title-text"},"Hi, 您好")],-1)),e.createElementVNode("div",ve,[v[1]||(v[1]=e.createTextVNode(" 我是",-1)),e.createElementVNode("span",xe,e.toDisplayString(n.title),1)]),e.createElementVNode("div",Se,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(z.value,(C,O)=>(e.openBlock(),e.createElementBlock("div",{key:O,class:"question-item",onClick:P=>x(C)},[e.createElementVNode("span",null,e.toDisplayString(C),1),e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode($,{name:"/images/svg/arrow-right.svg",color:"#999999"})]),_:1})],8,_e))),128))])]))]),e.createElementVNode("div",Ce,[m.value?(e.openBlock(),e.createElementBlock("img",Ee)):e.createCommentVNode("",!0),e.createElementVNode("div",Te,[e.createVNode(L,{modelValue:g.value,"onUpdate:modelValue":v[0]||(v[0]=C=>g.value=C),ref_key:"refInputTextString",ref:b,placeholder:"请输入您的问题",autofocus:"",onKeyup:e.withKeys(d,["enter"])},{append:e.withCtx(()=>[e.createElementVNode("div",{class:"send-icon-box",onClick:d},[e.createElementVNode("img",{src:u.value,alt:"发送",class:"send-icon"},null,8,Re)])]),_:1},8,["modelValue"])])])],2)):e.createCommentVNode("",!0)]),_:1})}}};var F={exports:{}};(function(n,r){(function(a,s){n.exports=s()})(window,function(){return function(a){var s={};function o(t){if(s[t])return s[t].exports;var c=s[t]={i:t,l:!1,exports:{}};return a[t].call(c.exports,c,c.exports,o),c.l=!0,c.exports}return o.m=a,o.c=s,o.d=function(t,c,y){o.o(t,c)||Object.defineProperty(t,c,{enumerable:!0,get:y})},o.r=function(t){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.t=function(t,c){if(1&c&&(t=o(t)),8&c||4&c&&typeof t=="object"&&t&&t.__esModule)return t;var y=Object.create(null);if(o.r(y),Object.defineProperty(y,"default",{enumerable:!0,value:t}),2&c&&typeof t!="string")for(var g in t)o.d(y,g,(function(b){return t[b]}).bind(null,g));return y},o.n=function(t){var c=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(c,"a",c),c},o.o=function(t,c){return Object.prototype.hasOwnProperty.call(t,c)},o.p="",o(o.s=0)}([function(a,s,o){function t(m,u,f,i){f.push(m),i.push([].concat(u[m]||[]))}function c(m,u){if(!m)throw new Error("[getMaxDepsChain] dep 参数不能为空");var f=[],i=[],l=[];for(t(m,u,i,l);i.length;){var w=l.pop();if(w&&w.length){var p=w.shift();if(l.push(w),~i.indexOf(p))throw new Error("[getMaxDepsChain][loop] 存在循环依赖,请检查依赖关系; nextName: "+p+", mainStack: "+i);t(p,u,i,l)}else f.push([].concat(i)),i.pop()}return f.reduce(function(S,x){return x.length>S.length?x:S},[])}function y(m){if(!m)throw new Error("[depsParser] 入参不能为空");var u={};m.forEach(function(i){u[i.name]=i.deps||[]});var f=[];return m.forEach(function(i){var l=c(i.name,u).length-1;i.priority=l,f[l]=(f[l]||[]).concat(i)}),f}o.r(s),o.d(s,"loadScript",function(){return z}),o.d(s,"loadScripts",function(){return _}),o.d(s,"dynamicLoadScripts",function(){return V}),o.d(s,"createScriptsLoadIterator",function(){return B}),o.d(s,"loadScriptsQueue",function(){return j}),o.d(s,"getMaxDepsChain",function(){return c}),o.d(s,"depsParser",function(){return y});var g=function(){return(g=Object.assign||function(m){for(var u,f=1,i=arguments.length;f<i;f++)for(var l in u=arguments[f])Object.prototype.hasOwnProperty.call(u,l)&&(m[l]=u[l]);return m}).apply(this,arguments)},b=function(m,u,f,i){return new(f||(f=Promise))(function(l,w){function p(k){try{x(i.next(k))}catch(d){w(d)}}function S(k){try{x(i.throw(k))}catch(d){w(d)}}function x(k){var d;k.done?l(k.value):(d=k.value,d instanceof f?d:new f(function(h){h(d)})).then(p,S)}x((i=i.apply(m,[])).next())})},E=function(m,u){var f,i,l,w,p={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]};return w={next:S(0),throw:S(1),return:S(2)},typeof Symbol=="function"&&(w[Symbol.iterator]=function(){return this}),w;function S(x){return function(k){return function(d){if(f)throw new TypeError("Generator is already executing.");for(;p;)try{if(f=1,i&&(l=2&d[0]?i.return:d[0]?i.throw||((l=i.return)&&l.call(i),0):i.next)&&!(l=l.call(i,d[1])).done)return l;switch(i=0,l&&(d=[2&d[0],l.value]),d[0]){case 0:case 1:l=d;break;case 4:return p.label++,{value:d[1],done:!1};case 5:p.label++,i=d[1],d=[0];continue;case 7:d=p.ops.pop(),p.trys.pop();continue;default:if(l=p.trys,!((l=l.length>0&&l[l.length-1])||d[0]!==6&&d[0]!==2)){p=0;continue}if(d[0]===3&&(!l||d[1]>l[0]&&d[1]<l[3])){p.label=d[1];break}if(d[0]===6&&p.label<l[1]){p.label=l[1],l=d;break}if(l&&p.label<l[2]){p.label=l[2],p.ops.push(d);break}l[2]&&p.ops.pop(),p.trys.pop();continue}d=u.call(m,p)}catch(h){d=[6,h],i=0}finally{f=l=0}if(5&d[0])throw d[1];return{value:d[0]?d[1]:void 0,done:!0}}([x,k])}}},T=function(m){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var u,f=m[Symbol.asyncIterator];return f?f.call(m):(m=typeof __values=="function"?__values(m):m[Symbol.iterator](),u={},i("next"),i("throw"),i("return"),u[Symbol.asyncIterator]=function(){return this},u);function i(l){u[l]=m[l]&&function(w){return new Promise(function(p,S){(function(x,k,d,h){Promise.resolve(h).then(function(v){x({value:v,done:d})},k)})(p,S,(w=m[l](w)).done,w.value)})}}};function z(m,u){return u===void 0&&(u=!1),new Promise(function(f,i){var l=u?document.head:document.body,w=document.createElement("script");w.type="text/javascript",w.src=m,w.crossOrigin="anonymous",w.onreadystatechange=f,w.onload=f,w.onerror=i,l.appendChild(w)})}var _=function(m,u){return u===void 0&&(u={}),b(void 0,void 0,void 0,function(){var f,i,l,w,p;return E(this,function(S){switch(S.label){case 0:return f=u.baseUrl,i=f===void 0?"":f,l=u.lastLoadResult,w=u.inHead,p=w!==void 0&&w,[4,Promise.all(m.map(function(x){return b(void 0,void 0,void 0,function(){var k,d,h,v,N,L,C,O;return E(this,function(P){switch(P.label){case 0:return k=x.name,d=x.path,h=x.deps,(C={})[k]=!0,v=C,(O={})[k]=!1,N=O,window[k]?[2,v]:[3,1];case 1:return L=!0,h&&l&&[].concat(h).forEach(function(qe){l[qe]!==!1&&(L=!0)}),L?[4,z(d.indexOf("http")===0||d.indexOf("//:")===0?d:i+d,p).then(function(){return v}).catch(function(){return N})]:[3,3];case 2:return[2,P.sent()];case 3:return[2,N]}})})}))];case 1:return[2,S.sent()]}})})},V=function(m,u){return u===void 0&&(u={}),function(){var f=[].concat(y(m));return{next:function(){if(f.length){var i=f.shift();return _(i,u).then(function(l){return{value:l,done:!1}})}return Promise.resolve({done:!0})}}}},B=function(m,u){var f;return u===void 0&&(u={}),(f={})[Symbol.asyncIterator]=V(m,u),f},j=function(m,u){return u===void 0&&(u={}),b(void 0,void 0,void 0,function(){var f,i,l,w,p,S;return E(this,function(x){switch(x.label){case 0:x.trys.push([0,5,6,11]),f=T(B(m,u)),x.label=1;case 1:return[4,f.next()];case 2:if((i=x.sent()).done)return[3,4];l=i.value,u.lastLoadResult=u.lastLoadResult||{},console.log("current load: ",l),l.forEach(function(k){u.lastLoadResult=g(g({},u.lastLoadResult),k)}),x.label=3;case 3:return[3,1];case 4:return[3,11];case 5:return w=x.sent(),p={error:w},[3,11];case 6:return x.trys.push([6,,9,10]),i&&!i.done&&(S=f.return)?[4,S.call(f)]:[3,8];case 7:x.sent(),x.label=8;case 8:return[3,10];case 9:if(p)throw p.error;return[7];case 10:return[7];case 11:return[2,u.lastLoadResult]}})})}}])})})(F);var Ve=F.exports;const Be={key:0,class:"ai-assistant"},Le={name:"AiChat"},Oe=e.defineComponent({...Le,props:{token:{type:String,default:""},identifier:{type:String,default:""},baseUrl:{type:String,default:""},title:{type:String,default:"数智AI助理"},messagePostRender:{type:Function,default:null}},setup(n){const r=e.ref(!1),a=e.ref(!1),s=()=>{r.value=!r.value},o=()=>{a.value=!0,r.value=!1},t=g=>{console.log("用户输入:",g)},c=[{name:"markdownit",path:"markdown-it.min.js"},{name:"hljs",path:"highlight.11.11.1.min.js"}];let y={};return Ve.loadScriptsQueue(c,{baseUrl:"/scripts/ai/",lastLoadResult:y,inHead:!1}).then(g=>{if(console.log("load ai deps: ",g),window.markdownit){const b=window.markdownit();console.log("markdownit: ",b),de()}}),(g,b)=>a.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Be,[e.createVNode(Pe,{modelValue:r.value,"onUpdate:modelValue":b[0]||(b[0]=E=>r.value=E),onSubmit:t,token:n.token,identifier:n.identifier,baseUrl:n.baseUrl,title:n.title,messagePostRender:n.messagePostRender},null,8,["modelValue","token","identifier","baseUrl","title","messagePostRender"]),e.createElementVNode("div",{class:"ai-icon",onClick:s},[e.createElementVNode("div",{class:"close-icon",onClick:e.withModifiers(o,["stop"])},[...b[1]||(b[1]=[e.createElementVNode("svg",{viewBox:"0 0 1024 1024",width:"8",height:"8"},[e.createElementVNode("path",{d:"M512 456.310154L94.247385 38.557538a39.384615 39.384615 0 0 0-55.689847 55.689847L456.310154 512 38.557538 929.752615a39.384615 39.384615 0 0 0 55.689847 55.689847L512 567.689846l417.752615 417.752616c15.163077 15.163077 40.526769 15.163077 55.689847 0s15.163077-40.526769 0-55.689847L567.689846 512l417.752616-417.752615a39.384615 39.384615 0 0 0-55.689847-55.689847L512 456.310154z",fill:"currentColor"})],-1)])]),b[2]||(b[2]=e.createElementVNode("img",{src:K,alt:"AI助手"},null,-1)),b[3]||(b[3]=e.createElementVNode("span",{class:"ai-icon-text"},"AI助手",-1))])]))}}),D=q(Oe,[["__scopeId","data-v-a4639f2d"]]),W=Object.freeze(Object.defineProperty({__proto__:null,SzAiChat:D},Symbol.toStringTag,{value:"Module"})),U=function(n){if(!U.installed){U.installed=!0;for(let r in W){const a=Reflect.get(W,r);n.component(a.name,a)}}},ze=n=>{console.log(`点击了路由链接: ${n}`)},je={color:"#536fec",fontWeight:"bold",textDecoration:"underline",cursor:"pointer",padding:"0 3px"},H=n=>{const r=/#router:([^#]+)#/g,a=[];let s=0,o;for(;(o=r.exec(n))!==null;){o.index>s&&a.push({text:n.substring(s,o.index)});const t=o[1];a.push({text:t,routeName:t}),s=r.lastIndex}return s<n.length&&a.push({text:n.substring(s)}),a},J=(n,r,a={})=>{const{onRouteClick:s=ze,linkStyle:o={}}=a,t=document.createElement("a");t.href="#",t.textContent=n;const c={...je,...o};return Object.assign(t.style,c),t.addEventListener("click",y=>{y.preventDefault(),s(r)}),t},Q=n=>{const r=/#router:([^#]+)#/g,a=[],s=document.createTreeWalker(n,NodeFilter.SHOW_TEXT,null);let o=s.nextNode();for(;o;){const t=o,c=t.textContent||"";if(r.test(c)){r.lastIndex=0;const y=H(c);y.length>0&&a.push({node:t,replacements:y})}o=s.nextNode()}return a},Ie=(n,r,a={})=>{Q(n).forEach(({node:o,replacements:t})=>{var y;const c=document.createDocumentFragment();t.forEach(({text:g,routeName:b})=>{if(b){const E=J(g,b,a);c.appendChild(E)}else c.appendChild(document.createTextNode(g))}),(y=o.parentNode)==null||y.replaceChild(c,o)})},$e="0.1.3",Ue="Sz";function Ae({componentPrefix:n=Ue,components:r=[]}={}){const a=[];function s(t,c,y){t.component(n+c)||t.component(n+c,y)}function o(t){a.includes(t)||(a.push(t),r.forEach(c=>{const{name:y,alias:g}=c;s(t,y,c),g&&g.forEach(b=>{s(t,b,c)})}))}return{version:$e,componentPrefix:n,install:o}}const Me={install(n){U(n)}};R.SzAiChat=D,R.create=Ae,R.createRouteLink=J,R.default=Me,R.findRouteTextNodes=Q,R.parseRouteMarkers=H,R.routeLinkRender=Ie,Object.defineProperties(R,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 路由链接渲染器
|
|
3
|
+
* 将 #router:xxx# 格式的文本替换为可点击的路由链接
|
|
4
|
+
*/
|
|
5
|
+
export interface RouteLinkOptions {
|
|
6
|
+
/** 路由跳转处理函数,接收路由名称作为参数 */
|
|
7
|
+
onRouteClick?: (routeName: string) => void;
|
|
8
|
+
/** 链接样式配置 */
|
|
9
|
+
linkStyle?: Partial<CSSStyleDeclaration>;
|
|
10
|
+
}
|
|
11
|
+
export interface RouteReplacement {
|
|
12
|
+
text: string;
|
|
13
|
+
routeName?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 解析文本中的路由标记,返回替换数组
|
|
17
|
+
* @param text - 要解析的文本
|
|
18
|
+
* @returns 替换数组
|
|
19
|
+
*/
|
|
20
|
+
export declare const parseRouteMarkers: (text: string) => RouteReplacement[];
|
|
21
|
+
/**
|
|
22
|
+
* 创建路由链接元素
|
|
23
|
+
* @param text - 链接文本
|
|
24
|
+
* @param routeName - 路由名称
|
|
25
|
+
* @param options - 配置选项
|
|
26
|
+
* @returns 链接元素
|
|
27
|
+
*/
|
|
28
|
+
export declare const createRouteLink: (text: string, routeName: string, options?: RouteLinkOptions) => HTMLAnchorElement;
|
|
29
|
+
/**
|
|
30
|
+
* 查找容器中包含路由标记的文本节点
|
|
31
|
+
* @param container - 容器元素
|
|
32
|
+
* @returns 需要替换的节点信息数组
|
|
33
|
+
*/
|
|
34
|
+
export declare const findRouteTextNodes: (container: HTMLElement) => {
|
|
35
|
+
node: Node;
|
|
36
|
+
replacements: RouteReplacement[];
|
|
37
|
+
}[];
|
|
38
|
+
/**
|
|
39
|
+
* 路由链接渲染器主函数
|
|
40
|
+
* 将容器中的 #router:xxx# 格式文本替换为可点击的路由链接
|
|
41
|
+
* @param container - 消息容器的 DOM 元素
|
|
42
|
+
* @param _textContent - 消息的文本内容(可选,用于兼容性,当前未使用)
|
|
43
|
+
* @param options - 配置选项
|
|
44
|
+
*/
|
|
45
|
+
export declare const routeLinkRender: (container: HTMLElement, _textContent?: string, options?: RouteLinkOptions) => void;
|
|
@@ -15,6 +15,16 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
|
|
|
15
15
|
type: StringConstructor;
|
|
16
16
|
default: string;
|
|
17
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* 消息后处理回调函数
|
|
20
|
+
* 在 AI 消息渲染完成后调用,可用于自定义处理渲染后的内容
|
|
21
|
+
* @param container - 消息容器的 DOM 元素
|
|
22
|
+
* @param textContent - 消息的文本内容
|
|
23
|
+
*/
|
|
24
|
+
messagePostRender: {
|
|
25
|
+
type: FunctionConstructor;
|
|
26
|
+
default: null;
|
|
27
|
+
};
|
|
18
28
|
}>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
|
|
19
29
|
token: {
|
|
20
30
|
type: StringConstructor;
|
|
@@ -32,10 +42,21 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
|
|
|
32
42
|
type: StringConstructor;
|
|
33
43
|
default: string;
|
|
34
44
|
};
|
|
45
|
+
/**
|
|
46
|
+
* 消息后处理回调函数
|
|
47
|
+
* 在 AI 消息渲染完成后调用,可用于自定义处理渲染后的内容
|
|
48
|
+
* @param container - 消息容器的 DOM 元素
|
|
49
|
+
* @param textContent - 消息的文本内容
|
|
50
|
+
*/
|
|
51
|
+
messagePostRender: {
|
|
52
|
+
type: FunctionConstructor;
|
|
53
|
+
default: null;
|
|
54
|
+
};
|
|
35
55
|
}>> & Readonly<{}>, {
|
|
36
56
|
token: string;
|
|
37
57
|
identifier: string;
|
|
38
58
|
baseUrl: string;
|
|
39
59
|
title: string;
|
|
60
|
+
messagePostRender: Function;
|
|
40
61
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
|
|
41
62
|
export default _default;
|
package/dist/style.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
.svg-icon-wrapper[data-v-490b11c1]{position:relative;overflow:hidden;vertical-align:middle}.svg-icon[data-v-490b11c1]{width:1em;height:1em;fill:currentColor;vertical-align:middle;display:inline-block}.copy-btn-wrapper
|
|
1
|
+
.svg-icon-wrapper[data-v-490b11c1]{position:relative;overflow:hidden;vertical-align:middle}.svg-icon[data-v-490b11c1]{width:1em;height:1em;fill:currentColor;vertical-align:middle;display:inline-block}.ai-copy-btn-wrapper{cursor:pointer;width:74px;height:24px;border-radius:12px;box-sizing:border-box;padding:10px 14px;border:1px solid #D9D9D9;display:flex;align-items:center;justify-content:center;font-size:12px;color:#666;line-height:20px;text-align:justify;margin-top:6px}.ai-copy-btn-wrapper .copy-text{margin-left:4px}.markdown-wrapper{line-height:1.2}.markdown-wrapper h1{font-size:2em}.markdown-wrapper h2{font-size:1.5em}.markdown-wrapper h3{font-size:1.25em}.markdown-wrapper h4{font-size:1em}.markdown-wrapper h5{font-size:.875em}.markdown-wrapper h6{font-size:.85em}.markdown-wrapper h1,.markdown-wrapper h2,.markdown-wrapper h3,.markdown-wrapper h4,.markdown-wrapper h5,.markdown-wrapper h6{margin:0 auto;line-height:1.25}.markdown-wrapper ul,.markdown-wrapper ol{padding-left:1.5em;line-height:.8}.markdown-wrapper ul,.markdown-wrapper li,.markdown-wrapper ol{list-style-position:outside;white-space:normal}.markdown-wrapper ul{list-style-type:disc}.markdown-wrapper ol{list-style-type:decimal}.markdown-wrapper li{line-height:1.5}.markdown-wrapper ol ol,.markdown-wrapper ul ul{padding-left:20px}.markdown-wrapper hr{margin:16px 0}.markdown-wrapper a{color:#536fec;font-weight:bolder;text-decoration:underline;padding:0 3px}.markdown-wrapper p{line-height:1.4}.markdown-wrapper p>code{--at-apply: "bg-#e5e5e5";--at-apply: whitespace-pre mx-4px px-6px py-3px rounded-5px}.markdown-wrapper p img{display:inline-block}.markdown-wrapper li>p{line-height:2}.markdown-wrapper strong{font-weight:700}.markdown-wrapper blockquote{padding:10px;margin:20px 0;border-left:5px solid #ccc;background-color:#f9f9f9;color:#555}.markdown-wrapper blockquote>p{margin:0}.ai-panel{margin-right:20px;width:400px;height:804px;background:#fff;border-radius:8px;box-shadow:0 8px 24px #00000026;display:flex;flex-direction:column;overflow:hidden;background-image:url(/images/ai-panel-bg.png);background-size:100% auto;background-position:top;background-repeat:no-repeat;position:relative;transition:all .3s ease}.ai-panel :deep(.el-input-group__append){box-sizing:border-box}.ai-panel.drawer-mode{position:fixed;right:0;top:0;bottom:0;height:100vh;margin:0;border-radius:0;z-index:2000}.ai-panel .panel-header{padding:20px;background:transparent}.ai-panel .panel-header .header-actions{display:flex;justify-content:space-between;gap:12px;align-items:center}.ai-panel .panel-header .header-actions .header-title{font-family:PingFangSC,PingFang SC;font-weight:700;font-size:16px;color:#333;line-height:24px;text-align:left;font-style:normal}.ai-panel .panel-header .header-actions .action-icons{display:flex;gap:12px}.ai-panel .panel-header .header-actions .action-icon{font-size:20px;color:#666;cursor:pointer}.ai-panel .panel-header .header-actions .action-icon:hover{color:#333}.ai-panel .body-content{flex:1;overflow:hidden;padding:20px;display:flex;flex-direction:column}.ai-panel .body-content .welcome-content .title{display:flex;flex-direction:column;align-items:center;margin-bottom:8px}.ai-panel .body-content .welcome-content .title .panel-icon{width:64px;height:64px;margin-bottom:16px}.ai-panel .body-content .welcome-content .title .title-text{margin:0;font-size:24px;color:#333;font-weight:500}.ai-panel .body-content .welcome-content .subtitle{text-align:center;font-size:28px;color:#333;line-height:36px;letter-spacing:2px;margin-bottom:20px}.ai-panel .body-content .welcome-content .subtitle .highlight{margin-left:2px;background:linear-gradient(270deg,#e236ffcc,#0a84ff);-webkit-background-clip:text;color:transparent;font-weight:bolder}.ai-panel .body-content .quick-questions .question-item{padding:12px 16px;background:#f5f7fa;border-radius:8px;margin-bottom:12px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;transition:all .3s}.ai-panel .body-content .quick-questions .question-item:hover{background:#e8f4ff;transform:translate(4px)}.ai-panel .body-content .quick-questions .question-item span{font-size:14px;color:#333}.ai-panel .body-content .quick-questions .question-item .el-icon{color:#666}.ai-panel .body-content .chat-messages{flex:1;overflow-y:auto;overflow-x:hidden;height:100%;display:flex;flex-direction:column}.ai-panel .body-content .chat-messages::-webkit-scrollbar{width:0;background:transparent}.ai-panel .body-content .chat-messages{scrollbar-width:none;-ms-overflow-style:none}.ai-panel .body-content .chat-messages .message-item{display:flex;align-items:flex-start;margin-bottom:20px;gap:12px}.ai-panel .body-content .chat-messages .message-item .message-avatar{width:40px;height:40px;border-radius:20px;flex-shrink:0}.ai-panel .body-content .chat-messages .message-item .user-avatar{background:#0a84ff;color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px}.ai-panel .body-content .chat-messages .message-item .message-content{padding:12px 16px;border-radius:2px;max-width:70%;word-break:break-word}.ai-panel .body-content .chat-messages .message-item.ai-message .message-content{background:#f5f7fa}.ai-panel .body-content .chat-messages .message-item.user-message{flex-direction:row-reverse}.ai-panel .body-content .chat-messages .message-item.user-message .message-content{background:#f1f2f3;border-radius:4px 4px 0;color:#333;font-size:14px}.ai-panel .panel-footer{padding:24px;background:#fff;position:relative}.ai-panel .panel-footer .loading-icon{position:absolute;top:-13px}.ai-panel .panel-footer .input-box .el-input-group{height:40px;border-radius:4px}.ai-panel .panel-footer .input-box :deep(.el-input__wrapper){box-shadow:none}.ai-panel .panel-footer .input-box :deep(.el-input-group__append){box-shadow:none;background:transparent;padding:8px 12px}.ai-panel .panel-footer .input-box .send-icon-box{display:flex;align-items:center;justify-content:center;cursor:pointer}/*!
|
|
2
2
|
Theme: Default
|
|
3
3
|
Description: Original highlight.js style
|
|
4
4
|
Author: (c) Ivan Sagalaev <maniac@softwaremaniacs.org>
|
|
@@ -6,4 +6,4 @@
|
|
|
6
6
|
Website: https://highlightjs.org/
|
|
7
7
|
License: see project LICENSE
|
|
8
8
|
Touched: 2021
|
|
9
|
-
*/pre code.hljs[data-v-
|
|
9
|
+
*/pre code.hljs[data-v-a4639f2d]{display:block;overflow-x:auto;padding:1em}code.hljs[data-v-a4639f2d]{padding:3px 5px}.hljs[data-v-a4639f2d]{background:#f3f3f3;color:#444}.hljs-comment[data-v-a4639f2d]{color:#697070}.hljs-punctuation[data-v-a4639f2d],.hljs-tag[data-v-a4639f2d]{color:#444a}.hljs-tag .hljs-attr[data-v-a4639f2d],.hljs-tag .hljs-name[data-v-a4639f2d]{color:#444}.hljs-attribute[data-v-a4639f2d],.hljs-doctag[data-v-a4639f2d],.hljs-keyword[data-v-a4639f2d],.hljs-meta .hljs-keyword[data-v-a4639f2d],.hljs-name[data-v-a4639f2d],.hljs-selector-tag[data-v-a4639f2d]{font-weight:700}.hljs-deletion[data-v-a4639f2d],.hljs-number[data-v-a4639f2d],.hljs-quote[data-v-a4639f2d],.hljs-selector-class[data-v-a4639f2d],.hljs-selector-id[data-v-a4639f2d],.hljs-string[data-v-a4639f2d],.hljs-template-tag[data-v-a4639f2d],.hljs-type[data-v-a4639f2d]{color:#800}.hljs-section[data-v-a4639f2d],.hljs-title[data-v-a4639f2d]{color:#800;font-weight:700}.hljs-link[data-v-a4639f2d],.hljs-operator[data-v-a4639f2d],.hljs-regexp[data-v-a4639f2d],.hljs-selector-attr[data-v-a4639f2d],.hljs-selector-pseudo[data-v-a4639f2d],.hljs-symbol[data-v-a4639f2d],.hljs-template-variable[data-v-a4639f2d],.hljs-variable[data-v-a4639f2d]{color:#ab5656}.hljs-literal[data-v-a4639f2d]{color:#695}.hljs-addition[data-v-a4639f2d],.hljs-built_in[data-v-a4639f2d],.hljs-bullet[data-v-a4639f2d],.hljs-code[data-v-a4639f2d]{color:#397300}.hljs-meta[data-v-a4639f2d]{color:#1f7199}.hljs-meta .hljs-string[data-v-a4639f2d]{color:#38a}.hljs-emphasis[data-v-a4639f2d]{font-style:italic}.hljs-strong[data-v-a4639f2d]{font-weight:700}.ai-assistant{box-sizing:border-box;position:fixed;right:20px;bottom:40px;z-index:1000;display:flex;align-items:flex-end}.ai-assistant div{box-sizing:border-box}.ai-assistant .ai-icon{box-sizing:border-box;display:flex;flex-direction:column;align-items:center;cursor:pointer;width:44px;padding:6px;transition:all .3s;height:114px;background-color:#fff;box-shadow:0 4px 16px 4px #00000008,0 2px 8px #0000000d,0 0 4px -2px #00000014;border-radius:22px;border:1px solid transparent;background-image:linear-gradient(#fff,#fff),linear-gradient(180deg,#60fffc,#0a84ff);background-origin:border-box;background-clip:padding-box,border-box}.ai-assistant .ai-icon:hover{transform:translateY(-2px);box-shadow:0 4px 16px #00000026}.ai-assistant .ai-icon img{width:32px;height:32px;margin-bottom:6px}.ai-assistant .ai-icon .ai-icon-text{display:inline-block;width:20px;font-size:16px;line-height:18px;font-weight:700;color:#333}.ai-assistant .ai-icon:hover .close-icon{display:flex}.ai-assistant .ai-icon .close-icon{display:none;position:absolute;top:-6px;right:-6px;width:16px;height:16px;background:#fff;border-radius:50%;align-items:center;justify-content:center;box-shadow:0 2px 4px #0000001a;color:#666;cursor:pointer;z-index:1}.ai-assistant .ai-icon .close-icon:hover{color:#333;background:#f5f5f5}
|