zen-gitsync 2.16.6 → 2.16.8
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/package.json +1 -1
- package/src/cli/ai/modelSetup.js +594 -594
- package/src/cli/ai/modelSetup.test.js +496 -496
- package/src/cli/ai/platformGuard.js +200 -200
- package/src/cli/ai/platformGuard.test.js +253 -253
- package/src/gitCommit.js +484 -484
- package/src/ui/public/assets/AgentView-8-xsOmE6.css +1 -0
- package/src/ui/public/assets/AgentView-DSmUynN-.js +4 -0
- package/src/ui/public/assets/AppVersionBadge-CS7Trvp-.css +1 -0
- package/src/ui/public/assets/AppVersionBadge-CcFagCnq.js +2 -0
- package/src/ui/public/assets/BranchSelector-B0eLkAdv.css +1 -0
- package/src/ui/public/assets/BranchSelector-DcYVBQJh.js +1 -0
- package/src/ui/public/assets/CommitForm-CkTI8Xyz.js +6 -0
- package/src/ui/public/assets/CommitForm-DdK8dymc.css +1 -0
- package/src/ui/public/assets/CommonDialog-BFyhw0Qj.js +1 -0
- package/src/ui/public/assets/CommonDialog-ChSKsEz2.css +1 -0
- package/src/ui/public/assets/EditorView-BVod-rjn.css +1 -0
- package/src/ui/public/assets/EditorView-DuHkBSc3.js +0 -0
- package/src/ui/public/assets/FlowExecutionViewer-C063Qjmk.js +1 -0
- package/src/ui/public/assets/FlowExecutionViewer-jNHI5zdm.css +1 -0
- package/src/ui/public/assets/FlowOrchestrationWorkspace-BeJRId5G.js +21 -0
- package/src/ui/public/assets/FlowOrchestrationWorkspace-CYGp-PqS.css +1 -0
- package/src/ui/public/assets/LogList-CeFFytjB.css +1 -0
- package/src/ui/public/assets/LogList-GSeER4cv.js +15 -0
- package/src/ui/public/assets/MindmapView-BQTqx842.css +1 -0
- package/src/ui/public/assets/MindmapView-p7szLCtQ.js +2 -0
- package/src/ui/public/assets/MonitorView-Be6KEUCe.js +1 -0
- package/src/ui/public/assets/MonitorView-TaS4kL0Y.css +1 -0
- package/src/ui/public/assets/ProjectStartupButton-F1k5Km2p.js +1 -0
- package/src/ui/public/assets/ProjectStartupButton-QLPltCK5.css +1 -0
- package/src/ui/public/assets/RemoteRepoCard-BRGNlbeO.css +1 -0
- package/src/ui/public/assets/RemoteRepoCard-CSMFlWDl.js +5 -0
- package/src/ui/public/assets/SourceMapView-BNRjvgzH.css +1 -0
- package/src/ui/public/assets/SourceMapView-Dg5NP_gR.js +3 -0
- package/src/ui/public/assets/{SvgIcon-BQ6bR7l0.css → SvgIcon-CDNsk4-Q.css} +1 -1
- package/src/ui/public/assets/SvgIcon-CYZGHQAE.js +1 -0
- package/src/ui/public/assets/UserInputNode-3OAXiGVh.js +1 -0
- package/src/ui/public/assets/UserInputNode-BVgQkB2l.css +1 -0
- package/src/ui/public/assets/WorkbenchView-8xyxdWAg.js +28 -0
- package/src/ui/public/assets/{WorkbenchView-CQfjF0Gr.css → WorkbenchView-DbF4hH5s.css} +1 -1
- package/src/ui/public/assets/_plugin-vue_export-helper-DgLDQTWK.js +15 -0
- package/src/ui/public/assets/{configStore-CmG77GNj.js → configStore-D5t05s4G.js} +1 -1
- package/src/ui/public/assets/element-plus-CyGhXd7X.js +25 -0
- package/src/ui/public/assets/element-plus-D3Dn7nX0.css +1 -0
- package/src/ui/public/assets/{flow-mindmap-D26cYDAD.js → flow-mindmap-CUvJaYn2.js} +1 -1
- package/src/ui/public/assets/index--onqtBRQ.css +1 -0
- package/src/ui/public/assets/index-DDGvh1mp.js +68 -0
- package/src/ui/public/assets/socket-io-BSgn8Jx2.js +1 -0
- package/src/ui/public/assets/vendor-DVvq7qtS.css +1 -0
- package/src/ui/public/assets/{vendor-lXqgobGS.js → vendor-jF--I87-.js} +88 -37
- package/src/ui/public/assets/vue-flow-CWmfpfPN.js +39 -0
- package/src/ui/public/favicon.svg +75 -75
- package/src/ui/public/index.html +31 -31
- package/src/ui/public/logo.svg +74 -74
- package/src/ui/server/middleware/requestLogger.js +53 -53
- package/src/ui/server/routes/branchStatus.js +105 -105
- package/src/ui/server/routes/fileOpen.js +3 -2
- package/src/ui/server/routes/fs.js +791 -791
- package/src/ui/server/routes/git/diff.js +426 -426
- package/src/ui/server/routes/git/diffUtils.js +149 -149
- package/src/ui/server/routes/git/stash.js +550 -550
- package/src/ui/server/routes/git/tags.js +176 -176
- package/src/ui/server/routes/git.js +181 -181
- package/src/ui/server/routes/gitOps.js +1255 -1255
- package/src/ui/server/routes/process.js +86 -86
- package/src/ui/server/routes/status.js +67 -67
- package/src/ui/server/routes/workbench/pdfText.js +145 -145
- package/src/ui/server/utils/createSavePortToFile.js +48 -48
- package/src/ui/server/utils/instanceRegistry.js +282 -282
- package/src/ui/server/utils/startServerOnAvailablePort.js +116 -116
- package/src/utils/index.js +1173 -1173
- package/src/ui/public/assets/AgentView-D3ltcW16.js +0 -4
- package/src/ui/public/assets/AgentView-DJBC9U8b.css +0 -1
- package/src/ui/public/assets/AppVersionBadge-DEzojWz9.js +0 -2
- package/src/ui/public/assets/AppVersionBadge-Dj6H729N.css +0 -1
- package/src/ui/public/assets/BranchSelector-T_rJm-JY.css +0 -1
- package/src/ui/public/assets/BranchSelector-YgVQRusR.js +0 -1
- package/src/ui/public/assets/CommitForm-B9xoh9cE.js +0 -6
- package/src/ui/public/assets/CommitForm-CUvl0VcF.css +0 -1
- package/src/ui/public/assets/CommonDialog-Cyh3xu0p.css +0 -1
- package/src/ui/public/assets/CommonDialog-DB4V4CKn.js +0 -1
- package/src/ui/public/assets/EditorView-CRYGVw_r.css +0 -1
- package/src/ui/public/assets/EditorView-CsjhdSd_.js +0 -0
- package/src/ui/public/assets/FlowExecutionViewer-B5kh7VxS.css +0 -1
- package/src/ui/public/assets/FlowExecutionViewer-Blax8J71.js +0 -1
- package/src/ui/public/assets/FlowOrchestrationWorkspace-BAQDU9Jd.css +0 -1
- package/src/ui/public/assets/FlowOrchestrationWorkspace-Dm85yYLO.js +0 -21
- package/src/ui/public/assets/LogList-DJYpDUTZ.css +0 -1
- package/src/ui/public/assets/LogList-WxAgsMg0.js +0 -7
- package/src/ui/public/assets/MindmapView-CS2t30Ko.css +0 -1
- package/src/ui/public/assets/MindmapView-_FKSYPEk.js +0 -1
- package/src/ui/public/assets/MonitorView-CynFYBMr.js +0 -1
- package/src/ui/public/assets/MonitorView-DxFogQIt.css +0 -1
- package/src/ui/public/assets/ProjectStartupButton-B5vk2Lu0.js +0 -1
- package/src/ui/public/assets/ProjectStartupButton-B7zvqRj_.css +0 -1
- package/src/ui/public/assets/RemoteRepoCard-B_iW7EZK.js +0 -1
- package/src/ui/public/assets/RemoteRepoCard-d0klonVb.css +0 -1
- package/src/ui/public/assets/SourceMapView-0fHVZr1r.js +0 -3
- package/src/ui/public/assets/SourceMapView-DG_a_076.css +0 -1
- package/src/ui/public/assets/SvgIcon-Ch_wHlf9.js +0 -1
- package/src/ui/public/assets/UserInputNode-DDtvv9Iq.css +0 -1
- package/src/ui/public/assets/UserInputNode-LbWvYQcA.js +0 -1
- package/src/ui/public/assets/WorkbenchView-CYucXDsF.js +0 -12
- package/src/ui/public/assets/_plugin-vue_export-helper-7QfI9jF6.js +0 -15
- package/src/ui/public/assets/ai-chat-ui-BqgKQovY.js +0 -45
- package/src/ui/public/assets/ai-chat-ui-BwlJovCq.css +0 -1
- package/src/ui/public/assets/element-plus-CQrjg9us.css +0 -1
- package/src/ui/public/assets/element-plus-DjpeTxOl.js +0 -24
- package/src/ui/public/assets/index-CmQSuclp.js +0 -38
- package/src/ui/public/assets/index-hGb6cPd0.css +0 -1
- package/src/ui/public/assets/socket-io-z4n873W1.js +0 -1
- package/src/ui/public/assets/vendor-CdOLCu7-.css +0 -1
- package/src/ui/public/assets/vue-flow-CIbkTMWF.js +0 -39
- package/src/ui/server/.claude/codediff.txt +0 -8
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import{Cn as e,Fn as t,Jn as n,Ln as r,Mn as i,Sn as a,Tn as o,Vn as s,Xn as c,Zn as l,_n as u,_r as d,ar as f,gn as p,hn as m,ln as h,mn as g,mr as _,on as v,sn as y,sr as b,tn as x,un as S,vn as C,xn as w,zn as T}from"./element-plus-DjpeTxOl.js";import{n as E,r as D}from"./vendor-lXqgobGS.js";function O(e){if(!e||e<0)return`0 B`;let t=[`B`,`KB`,`MB`,`GB`,`TB`],n=Math.min(Math.floor(Math.log(e)/Math.log(1024)),t.length-1),r=e/1024**n,i=+(r<10&&n>0);return`${r.toFixed(i)} ${t[n]}`}function k(e){return/^image\//i.test(e)}function A(e=`acu`){return`${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var j=[`javascript`,`typescript`,`python`,`bash`,`shell`,`json`,`html`,`css`,`vue`,`markdown`,`sql`,`go`,`rust`,`java`,`cpp`,`c`,`yaml`,`jsx`,`tsx`,`xml`],M=null,N=null,P=b(!1);function F(){return M?Promise.resolve(M):(N||=E({themes:[`github-light`,`github-dark`],langs:j}).then(e=>(M=e,P.value=!0,e)).catch(e=>(console.warn(`[ai-chat-ui] Shiki 加载失败,代码块将降级为纯文本:`,e),null)),N)}F();var I=new D({html:!1,linkify:!0,breaks:!0,typographer:!0,highlight(e,t){if(M&&t)try{return M.codeToHtml(e,{lang:t,themes:{light:`github-light`,dark:`github-dark`},defaultColor:!1})}catch{}return``}}),ee=I.renderer.rules.link_open||((e,t,n,r,i)=>i.renderToken(e,t,n));I.renderer.rules.link_open=(e,t,n,r,i)=>{let a=e[t],o=a.attrGet(`href`)||``;return/^https?:\/\//i.test(o)&&(a.attrSet(`target`,`_blank`),a.attrSet(`rel`,`noopener noreferrer`)),ee(e,t,n,r,i)},I.renderer.rules.image=(e,t,n,r,i)=>{let a=e[t];return a.attrSet(`loading`,`lazy`),a.attrSet(`class`,`acu-md-img`),i.renderToken(e,t,n)},I.renderer.rules.fence=(e,t)=>{let n=e[t],r=n.info.trim(),i=r?r.split(/\s+/)[0]:``,a=n.content,o=i||`text`,s=encodeURIComponent(a),c=``;if(M&&i)try{c=M.codeToHtml(a,{lang:i,themes:{light:`github-light`,dark:`github-dark`},defaultColor:!1})}catch{c=``}return c||=`<pre class="shiki acu-code-fallback"><code>${I.utils.escapeHtml(a)}</code></pre>`,`<div class="acu-code-block"><div class="acu-code-header"><span class="acu-code-lang">${I.utils.escapeHtml(o)}</span><button type="button" class="acu-code-copy" data-code="${s}" aria-label="复制代码"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg><span class="acu-code-copy-label">复制</span></button></div>${c}</div>`};var L=/<think>/g,R=[`</think>`,`</think>`];function z(e){if(!e)return{reasoning:``,content:``};let t=[],n=0;for(;n<e.length;){L.lastIndex=n;let r=L.exec(e);if(!r)break;let i=r.index+r[0].length,a=e.slice(i),o=-1,s=0;for(let e of R){let t=a.indexOf(e);t!==-1&&(o===-1||t<o)&&(o=t,s=e.length)}if(o===-1)break;let c=a.slice(0,o).trim();c&&t.push(c),n=i+o+s}return t.length===0?{reasoning:``,content:e}:{reasoning:t.join(`
|
|
2
|
-
|
|
3
|
-
`),content:e.replace(/<think>[\s\S]*?<\/think>/g,``).trim()}}I.block.ruler.before(`paragraph`,`think_block`,(e,t,n,r)=>{let i=e.bMarks[t]+e.tShift[t],a=e.eMarks[t],o=e.src.slice(i,a);L.lastIndex=i;let s=L.exec(o);if(!s)return!1;let c=s.index;if(r)return!0;let l=-1,u=``,d=-1;for(let r=t;r<n;r++){let n=e.bMarks[r]+e.tShift[r],a=e.eMarks[r],o=e.src.slice(n,a),s=r===t?i+c+7:0;for(let e of R){let t=o.indexOf(e,s);t!==-1&&(d===-1||t<d)&&(d=t,u=e,l=r)}if(l!==-1)break}if(l<0)return!1;let f=[];for(let n=t;n<=l;n++){let r=e.bMarks[n]+e.tShift[n],i=e.eMarks[n],a=e.src.slice(r,i);n===t&&(a=a.slice(c+7)),n===l&&(a=a.slice(0,a.indexOf(u))),f.push(a)}let p=f.join(`
|
|
4
|
-
`).trim(),m=e.push(`think_block`,``,0);return m.content=p,m.map=[t,l+1],m.markup=`<think>`,m.block=!0,e.line=l+1,!0});var B=I.renderer.rules.think_block||((e,t)=>{let n=e[t];return`<div class="acu-thinking acu-thinking-md"><button type="button" class="acu-thinking-header"><span class="acu-thinking-icon"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M9.5 2A4.5 4.5 0 0 0 5 6.5c0 .5.08.98.22 1.43A4 4 0 0 0 6 16a3.5 3.5 0 0 0 5 3.05"/><path d="M14.5 2A4.5 4.5 0 0 1 19 6.5c0 .5-.08.98-.22 1.43A4 4 0 0 1 18 16a3.5 3.5 0 0 1-5 3.05"/><path d="M12 4v16"/></svg></span><span class="acu-thinking-title">已深度思考</span></button><div class="acu-thinking-body">${n.content.trim()?I.render(n.content):``}</div></div>`});I.renderer.rules.think_block=B;function te(){return{render(e){return I.render(e||``)},renderInline(e){return I.renderInline(e||``)},ensureHighlighter:F}}var ne=o({__name:`MarkdownRenderer`,props:{source:{type:String,required:!0}},setup(e,{expose:r}){r();let i=e,{render:a}=te(),o=b(``),s=b(null),c=0;function l(){cancelAnimationFrame(c),c=requestAnimationFrame(()=>{o.value=a(i.source)})}n(()=>i.source,l,{immediate:!0}),n(P,e=>{e&&l()}),t(()=>cancelAnimationFrame(c));function u(e){let t=e.target.closest(`.acu-code-copy`);if(!t)return;let n=t.getAttribute(`data-code`)||``,r=decodeURIComponent(n),i=t.querySelector(`.acu-code-copy-label`);(navigator.clipboard?.writeText(r)??Promise.reject(Error(`clipboard unavailable`))).then(()=>{t.classList.add(`is-copied`),i&&(i.textContent=`已复制`),setTimeout(()=>{t.classList.remove(`is-copied`),i&&(i.textContent=`复制`)},1500)}).catch(()=>{t.classList.add(`is-error`),i&&(i.textContent=`失败`),setTimeout(()=>{t.classList.remove(`is-error`),i&&(i.textContent=`复制`)},1500)})}let d={props:i,render:a,html:o,root:s,get rafId(){return c},set rafId(e){c=e},scheduleRender:l,onCodeCopyClick:u};return Object.defineProperty(d,"__isScriptSetup",{enumerable:!1,value:!0}),d}}),V=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},re=[`innerHTML`];function H(e,t,n,r,i,a){return T(),C(S,null,[u(`
|
|
5
|
-
Markdown 渲染容器。
|
|
6
|
-
- v-html 输出 markdown-it 解析结果(已禁原始 HTML,安全)
|
|
7
|
-
- 事件委托处理代码块复制按钮
|
|
8
|
-
- 样式为非 scoped(带 .acu-md 前缀隔离),因 v-html 内容无法被 scoped 命中
|
|
9
|
-
`),m(`div`,{ref:`root`,class:`acu-md`,innerHTML:r.html,onClick:r.onCodeCopyClick},null,8,re)],2112)}var U=V(ne,[[`render`,H],[`__file`,`E:/workspace/github_workspace/chat-ui/src/components/MarkdownRenderer/MarkdownRenderer.vue`]]),W=o({__name:`ThinkingBlock`,props:{content:{type:String,required:!0,default:``},streaming:{type:Boolean,required:!1,default:!1},defaultExpanded:{type:Boolean,required:!1,default:void 0}},setup(e,{expose:t}){t();let r=e,i=b(r.defaultExpanded===void 0?r.streaming:r.defaultExpanded);n(()=>r.streaming,e=>{e&&(i.value=!0)});function a(){i.value=!i.value}let o={props:r,expanded:i,toggle:a,MarkdownRenderer:U};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}}),G=[`aria-expanded`],K={class:`acu-thinking-title`},q={key:0,class:`acu-typing-dots`,"aria-hidden":`true`},J={class:`acu-thinking-body`},Y={key:0,class:`acu-cursor`,"aria-hidden":`true`};function X(t,n,r,i,a,o){return T(),C(S,null,[u(`\r
|
|
10
|
-
思考(reasoning)内容块。\r
|
|
11
|
-
- streaming:默认展开,标题显示"思考中"+三点动画,正文带流式光标\r
|
|
12
|
-
- done:可折叠,标题显示"已深度思考",默认折叠\r
|
|
13
|
-
- 样式区别于正式回答:弱化配色、左侧细线、更小字号\r
|
|
14
|
-
`),m(`div`,{class:_([`acu-thinking`,{"is-streaming":r.streaming}])},[m(`button`,{type:`button`,class:`acu-thinking-header`,"aria-expanded":i.expanded,onClick:i.toggle},[n[2]||=w(`<span class="acu-thinking-icon" data-v-a703af34><!-- 思考图标:大脑/灵感线框 --><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" data-v-a703af34><path d="M9.5 2A4.5 4.5 0 0 0 5 6.5c0 .5.08.98.22 1.43A4 4 0 0 0 6 16a3.5 3.5 0 0 0 5 3.05" data-v-a703af34></path><path d="M14.5 2A4.5 4.5 0 0 1 19 6.5c0 .5-.08.98-.22 1.43A4 4 0 0 1 18 16a3.5 3.5 0 0 1-5 3.05" data-v-a703af34></path><path d="M12 4v16" data-v-a703af34></path></svg></span>`,1),m(`span`,K,d(r.streaming?`思考中`:`已深度思考`),1),r.streaming?(T(),C(`span`,q,[...n[0]||=[m(`span`,null,null,-1),m(`span`,null,null,-1),m(`span`,null,null,-1)]])):(T(),C(`svg`,{key:1,class:_([`acu-thinking-chevron`,{"is-open":i.expanded}]),viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[...n[1]||=[m(`polyline`,{points:`6 9 12 15 18 9`},null,-1)]],2))],8,G),e(x,{name:`acu-collapse`,persisted:``},{default:c(()=>[l(m(`div`,J,[e(i.MarkdownRenderer,{source:r.content},null,8,[`source`]),r.streaming&&r.content?(T(),C(`span`,Y)):u(`v-if`,!0)],512),[[y,i.expanded]])]),_:1})],2)],2112)}var ie=V(W,[[`render`,X],[`__scopeId`,`data-v-a703af34`],[`__file`,`E:/workspace/github_workspace/chat-ui/src/components/ThinkingBlock/ThinkingBlock.vue`]]),ae=o({__name:`ToolCallBlock`,props:{toolCall:{type:Object,required:!0}},setup(e,{expose:t}){t();let n=e,r=b(!1),i=g(()=>n.toolCall.status||`pending`);function a(e){try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}}let o={props:n,expanded:r,status:i,formatArgs:a};return Object.defineProperty(o,"__isScriptSetup",{enumerable:!1,value:!0}),o}}),oe={class:`acu-toolcall`},se={key:0,class:`acu-spin`,viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`},ce={key:1,viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},le={key:2,viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`},ue={key:3,viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},de={class:`acu-toolcall-name`},fe={key:0,class:`acu-toolcall-args`},pe={key:0,class:`acu-toolcall-body`},me={key:0,class:`acu-toolcall-section`},he={class:`acu-toolcall-pre`},ge={key:1,class:`acu-toolcall-section`};function _e(t,n,r,i,a,o){return T(),C(S,null,[u(`\r
|
|
15
|
-
工具调用块:渲染 LLM 的 function call 及其执行结果。\r
|
|
16
|
-
- 折叠式:默认收起,点击展开查看参数和结果\r
|
|
17
|
-
- 状态图标:running 旋转、done 勾、error 叉\r
|
|
18
|
-
- 工具名 + 参数预览 → 结果(可滚动)\r
|
|
19
|
-
`),m(`div`,oe,[m(`button`,{type:`button`,class:_([`acu-toolcall-header`,{expanded:i.expanded}]),onClick:n[0]||=e=>i.expanded=!i.expanded},[u(` 状态图标 `),m(`span`,{class:_([`acu-toolcall-status`,`is-${i.status}`])},[i.status===`running`?(T(),C(`svg`,se,[...n[1]||=[m(`path`,{d:`M21 12a9 9 0 1 1-6.219-8.56`},null,-1)]])):i.status===`done`?(T(),C(`svg`,ce,[...n[2]||=[m(`polyline`,{points:`20 6 9 17 4 12`},null,-1)]])):i.status===`error`?(T(),C(`svg`,le,[...n[3]||=[m(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`},null,-1),m(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`},null,-1)]])):(T(),C(`svg`,ue,[...n[4]||=[m(`circle`,{cx:`12`,cy:`12`,r:`10`},null,-1),m(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`12`},null,-1),m(`line`,{x1:`12`,y1:`16`,x2:`12.01`,y2:`16`},null,-1)]]))],2),u(` 工具图标 `),n[6]||=m(`span`,{class:`acu-toolcall-icon`},[m(`svg`,{viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[m(`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`})])],-1),u(` 工具名 + 参数预览 `),m(`span`,de,d(r.toolCall.name),1),r.toolCall.argsPreview?(T(),C(`span`,fe,d(r.toolCall.argsPreview),1)):u(`v-if`,!0),u(` 展开/收起箭头 `),(T(),C(`svg`,{class:_([`acu-toolcall-chevron`,{expanded:i.expanded}]),viewBox:`0 0 24 24`,width:`12`,height:`12`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[...n[5]||=[m(`polyline`,{points:`6 9 12 15 18 9`},null,-1)]],2))],2),u(` 展开内容 `),e(x,{name:`acu-toolcall-slide`},{default:c(()=>[i.expanded?(T(),C(`div`,pe,[u(` 参数 `),r.toolCall.arguments?(T(),C(`div`,me,[n[7]||=m(`div`,{class:`acu-toolcall-section-label`},`参数`,-1),m(`pre`,he,d(i.formatArgs(r.toolCall.arguments)),1)])):u(`v-if`,!0),u(` 结果 `),r.toolCall.result===void 0?u(`v-if`,!0):(T(),C(`div`,ge,[n[8]||=m(`div`,{class:`acu-toolcall-section-label`},`结果`,-1),m(`pre`,{class:_([`acu-toolcall-pre acu-toolcall-result`,`is-${i.status}`])},d(r.toolCall.result),3)]))])):u(`v-if`,!0)]),_:1})])],2112)}var ve=V(ae,[[`render`,_e],[`__scopeId`,`data-v-f93fe4d7`],[`__file`,`E:/workspace/github_workspace/chat-ui/src/components/ToolCallBlock/ToolCallBlock.vue`]]),ye=o({__name:`MessageBubble`,props:{message:{type:Object,required:!0},assistantName:{type:String,required:!1,default:`AI 助手`},assistantAvatar:{type:String,required:!1,default:``},userAvatar:{type:String,required:!1,default:``},showAvatar:{type:Boolean,required:!1,default:!0}},emits:[`retry`],setup(e,{expose:t}){t();let n=e,r=g(()=>n.message.avatar||n.assistantAvatar),i=g(()=>n.userAvatar),a=g(()=>{var e;return!!((e=n.message.attachments)!=null&&e.length)}),o=g(()=>{var e;return!!((e=n.message.toolCalls)!=null&&e.length)}),s=g(()=>{let e=n.message.content||``;return e?n.message.reasoningStatus===`streaming`?{reasoning:``,content:e.replace(/<think>[\s\S]*?<\/think>/g,``).trim()}:z(e):{reasoning:``,content:``}}),c=g(()=>s.value.reasoning),l=g(()=>s.value.content),u={props:n,resolvedAssistantAvatar:r,resolvedUserAvatar:i,hasAttachments:a,hasToolCalls:o,splitContent:s,inlineReasoning:c,renderedContent:l,effectiveReasoning:g(()=>n.message.reasoning||c.value),isStreamingContent:g(()=>n.message.role===`assistant`&&n.message.status===`streaming`&&!!l.value),get formatFileSize(){return O},get isImageType(){return k},MarkdownRenderer:U,ThinkingBlock:ie,ToolCallBlock:ve};return Object.defineProperty(u,"__isScriptSetup",{enumerable:!1,value:!0}),u}}),be={key:0,class:`acu-avatar acu-avatar--left`},xe=[`src`],Se={key:1,viewBox:`0 0 24 24`,width:`18`,height:`18`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`},Ce={class:`acu-bubble-main`},we={key:0,class:`acu-bubble-name`},Te={key:0,class:`acu-att-thumb`},Ee=[`src`,`alt`],De={key:1,class:`acu-att-file`},Oe={class:`acu-att-file-info`},ke=[`title`],Ae={class:`acu-att-file-size`},je={key:1,class:`acu-bubble-toolcalls`},Me={key:2,class:`acu-bubble-content`},Ne={key:0,class:`acu-cursor`,"aria-hidden":`true`},Pe={key:4,class:`acu-bubble-error`},Fe={key:1,class:`acu-avatar acu-avatar--right`},Ie=[`src`],Le={key:1,viewBox:`0 0 24 24`,width:`18`,height:`18`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`};function Re(t,n,r,i,a,o){return T(),C(S,null,[u(`\r
|
|
20
|
-
单条消息气泡。\r
|
|
21
|
-
- user:右对齐,主色气泡,头像在右\r
|
|
22
|
-
- assistant:左对齐,浅色气泡 + 头像 + 名称;含思考块、Markdown 正文、流式光标、附件\r
|
|
23
|
-
`),m(`div`,{class:_([`acu-bubble-row`,`is-${r.message.role}`])},[u(` ===== 左侧头像(仅 assistant) ===== `),r.message.role===`assistant`&&r.showAvatar?(T(),C(`div`,be,[i.resolvedAssistantAvatar?(T(),C(`img`,{key:0,src:i.resolvedAssistantAvatar,alt:``},null,8,xe)):(T(),C(`svg`,Se,[...n[1]||=[m(`path`,{d:`M12 3l1.9 4.6L18.5 9.5l-4.6 1.9L12 16l-1.9-4.6L5.5 9.5l4.6-1.9L12 3z`},null,-1),m(`path`,{d:`M19 14l.8 1.9L21.7 17l-1.9.8L19 19.7l-.8-1.9L16.3 17l1.9-.8L19 14z`},null,-1)]]))])):u(`v-if`,!0),u(` ===== 中间内容区 ===== `),m(`div`,Ce,[u(` assistant 名称 `),r.message.role===`assistant`?(T(),C(`div`,we,d(r.assistantName),1)):u(`v-if`,!0),u(` 附件(user 显示在正文上方) `),i.hasAttachments?(T(),C(`div`,{key:1,class:_([`acu-attachments`,`is-${r.message.role}`])},[(T(!0),C(S,null,s(r.message.attachments,e=>(T(),C(S,{key:e.id},[i.isImageType(e.type)&&e.preview?(T(),C(`div`,Te,[m(`img`,{src:e.preview,alt:e.name,loading:`lazy`},null,8,Ee)])):(T(),C(`div`,De,[n[2]||=m(`span`,{class:`acu-att-file-icon`},[m(`svg`,{viewBox:`0 0 24 24`,width:`16`,height:`16`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[m(`path`,{d:`M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z`}),m(`polyline`,{points:`14 2 14 8 20 8`})])],-1),m(`span`,Oe,[m(`span`,{class:`cu-att-file-name`,title:e.name},d(e.name),9,ke),m(`span`,Ae,d(i.formatFileSize(e.size)),1)])]))],64))),128))],2)):u(`v-if`,!0),u(` 气泡内容区 `),m(`div`,{class:_([`acu-bubble`,`is-${r.message.role}`])},[u(` 思考块(仅 assistant) `),r.message.role===`assistant`&&i.effectiveReasoning?(T(),p(i.ThinkingBlock,{key:0,content:i.effectiveReasoning,streaming:r.message.reasoningStatus===`streaming`},null,8,[`content`,`streaming`])):u(`v-if`,!0),u(` 工具调用列表(仅 assistant) `),i.hasToolCalls?(T(),C(`div`,je,[(T(!0),C(S,null,s(r.message.toolCalls,e=>(T(),p(i.ToolCallBlock,{key:e.id,"tool-call":e},null,8,[`tool-call`]))),128))])):u(`v-if`,!0),u(` 正文 `),i.renderedContent?(T(),C(`div`,Me,[e(i.MarkdownRenderer,{source:i.renderedContent},null,8,[`source`]),i.isStreamingContent?(T(),C(`span`,Ne)):u(`v-if`,!0)])):r.message.role===`assistant`&&r.message.status===`pending`?(T(),C(S,{key:3},[u(` pending:等待响应 `),n[3]||=m(`div`,{class:`acu-pending`},[m(`span`,{class:`acu-typing-dots`,"aria-label":`正在思考`},[m(`span`),m(`span`),m(`span`)])],-1)],2112)):u(`v-if`,!0),u(` 错误态 `),r.message.status===`error`?(T(),C(`div`,Pe,[n[4]||=m(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[m(`circle`,{cx:`12`,cy:`12`,r:`10`}),m(`line`,{x1:`12`,y1:`8`,x2:`12`,y2:`12`}),m(`line`,{x1:`12`,y1:`16`,x2:`12.01`,y2:`16`})],-1),m(`span`,null,d(r.message.error||`生成失败,请重试`),1),m(`button`,{type:`button`,class:`acu-retry-btn`,onClick:n[0]||=e=>t.$emit(`retry`,r.message)},`重试`)])):u(`v-if`,!0)],2)]),u(` ===== 右侧头像(仅 user) ===== `),r.message.role===`user`&&r.showAvatar?(T(),C(`div`,Fe,[i.resolvedUserAvatar?(T(),C(`img`,{key:0,src:i.resolvedUserAvatar,alt:``},null,8,Ie)):(T(),C(`svg`,Le,[...n[5]||=[m(`path`,{d:`M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2`},null,-1),m(`circle`,{cx:`12`,cy:`7`,r:`4`},null,-1)]]))])):u(`v-if`,!0)],2)],2112)}var ze=V(ye,[[`render`,Re],[`__scopeId`,`data-v-db9217ed`],[`__file`,`E:/workspace/github_workspace/chat-ui/src/components/MessageBubble/MessageBubble.vue`]]),Be=o({__name:`FollowupSuggestions`,props:{items:{type:Array,required:!1,default:()=>[]},title:{type:String,required:!1,default:`继续追问`},loading:{type:Boolean,required:!1,default:!1}},emits:[`select`],setup(e,{expose:t}){t();let n=e,r={props:n,visible:g(()=>n.loading||n.items&&n.items.length>0)};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),Ve={key:0,class:`acu-followup-title`},He={key:0},Ue={key:1,class:`acu-followup-loading`},We={class:`acu-followup-list`},Ge=[`onClick`],Ke={class:`acu-followup-item-label`};function qe(e,t,n,r,i,o){return T(),C(S,null,[u(`
|
|
24
|
-
追问建议列表(豆包风格)。
|
|
25
|
-
位于 assistant 气泡下方、独立区域,与气泡左对齐。
|
|
26
|
-
竖排胶囊卡片:浅灰描边、悬停主色、文字 + 右箭头。
|
|
27
|
-
`),r.visible?(T(),C(`div`,{key:0,class:_([`acu-followup`,{"is-loading":n.loading}])},[n.title||n.loading?(T(),C(`div`,Ve,[n.loading?(T(),C(`span`,Ue,[...t[0]||=[m(`span`,{class:`acu-followup-dot`},null,-1),m(`span`,{class:`acu-followup-dot`},null,-1),m(`span`,{class:`acu-followup-dot`},null,-1),a(` 正在生成追问… `,-1)]])):(T(),C(`span`,He,d(n.title),1))])):u(`v-if`,!0),m(`div`,We,[(T(!0),C(S,null,s(n.items,n=>(T(),C(`button`,{key:n.id,type:`button`,class:`acu-followup-item`,onClick:t=>e.$emit(`select`,n)},[m(`span`,Ke,d(n.label),1),t[1]||=m(`svg`,{class:`acu-followup-item-arrow`,viewBox:`0 0 24 24`,width:`14`,height:`14`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"aria-hidden":`true`},[m(`line`,{x1:`7`,y1:`17`,x2:`17`,y2:`7`}),m(`polyline`,{points:`7 7 17 7 17 17`})],-1)],8,Ge))),128))])],2)):u(`v-if`,!0)],2112)}var Je=V(Be,[[`render`,qe],[`__scopeId`,`data-v-702b25c8`],[`__file`,`E:/workspace/github_workspace/chat-ui/src/components/FollowupSuggestions/FollowupSuggestions.vue`]]),Z=80,Ye=o({__name:`MessageList`,props:{messages:{type:Array,required:!0},assistantName:{type:String,required:!1,default:`AI 助手`},assistantAvatar:{type:String,required:!1,default:``},userAvatar:{type:String,required:!1,default:``},showAvatar:{type:Boolean,required:!1,default:!0},followup:{type:[Object,Array],required:!1,default:void 0}},emits:[`retry`,`followup-select`],setup(e,{expose:t,emit:a}){let o=e,s=a,c=g(()=>{if(o.followup)return Array.isArray(o.followup)?{items:o.followup,mode:`latest`,autoSend:!0}:o.followup}),l=g(()=>c.value?.title??`继续追问`),u=g(()=>c.value?.mode??`latest`),d=g(()=>c.value?.showDuringStreaming??!1),p=f({}),m=g(()=>{for(let e=o.messages.length-1;e>=0;e--){let t=o.messages[e];if(t.role===`assistant`&&t.status===`done`)return t.id}return null});function h(e){return e.role!==`assistant`||e.status===`error`?!1:e.status===`streaming`||e.status===`pending`?d.value:u.value===`latest`?e.id===m.value:e.status===`done`}let _=0;async function v(e){let t=c.value;if(!t||typeof t.provider!=`function`)return;if(t.items&&t.items.length){p[e.id]={items:t.items,loading:!1};return}let n=++_;p[e.id]={items:[],loading:!0};try{let r=await t.provider(e,o.messages);if(n!==_)return;let i=Array.isArray(r)?r:[];p[e.id]={items:i,loading:!1}}catch(t){if(n!==_)return;p[e.id]={items:[],loading:!1},console.warn(`[ai-chat-ui] followup provider error:`,t)}}n(()=>o.messages.map(e=>`${e.id}:${e.status}:${e.content.length}`).join(`|`),()=>{x()},{immediate:!0});function y(){let e=new Set;for(let t of o.messages)h(t)&&e.add(t.id);for(let t of Object.keys(p))e.has(t)||delete p[t]}function x(){let e=c.value;if(!e){for(let e of Object.keys(p))delete p[e];return}if(e.items&&e.items.length){for(let t of o.messages)h(t)&&(p[t.id]={items:e.items,loading:!1});y();return}if(typeof e.provider==`function`){for(let e of o.messages)h(e)&&!p[e.id]&&v(e);y()}}n(()=>o.followup,()=>{for(let e of Object.keys(p))delete p[e];_++,x()});let S=b(null),C=b(!0);function w(){let e=S.value;e&&(C.value=e.scrollHeight-e.scrollTop-e.clientHeight<Z)}function T(e=!1){let t=S.value;t&&(t.scrollTo({top:t.scrollHeight,behavior:e?`smooth`:`auto`}),C.value=!0)}function E(){let e=o.messages[o.messages.length-1];return e?`${o.messages.length}:${e.id}:${e.content.length}:${e.reasoning?.length??0}`:``}n(E,()=>{C.value&&i(()=>T(!1))}),n(()=>o.messages.length,()=>{i(()=>T(!1))}),r(()=>T(!1)),t({scrollToBottom:T});let D={props:o,emit:s,followupConfig:c,followupTitle:l,followupMode:u,showDuringStreaming:d,followupMap:p,lastDoneAssistantId:m,shouldRenderFollowup:h,get runToken(){return _},set runToken(e){_=e},runProviderFor:v,cleanup:y,recomputeFollowups:x,scrollRef:S,atBottom:C,THRESHOLD:Z,handleScroll:w,scrollToBottom:T,contentSignature:E,MessageBubble:ze,FollowupSuggestions:Je};return Object.defineProperty(D,"__isScriptSetup",{enumerable:!1,value:!0}),D}}),Xe={class:`acu-message-list-inner`};function Ze(t,n,r,i,a,o){return T(),C(S,null,[u(`
|
|
28
|
-
消息列表。
|
|
29
|
-
- 流式输出时自动滚动到底部(仅当用户已在底部附近,避免打断阅读)
|
|
30
|
-
- 提供"回到底部"浮动按钮
|
|
31
|
-
- 可选:渲染追问建议(每条 assistant 完成后,调用 followupProvider 或取静态 followupItems)
|
|
32
|
-
`),m(`div`,{ref:`scrollRef`,class:`acu-message-list`,onScroll:i.handleScroll},[m(`div`,Xe,[(T(!0),C(S,null,s(r.messages,a=>(T(),C(S,{key:a.id},[e(i.MessageBubble,{message:a,"assistant-name":r.assistantName,"assistant-avatar":r.assistantAvatar,"user-avatar":r.userAvatar,"show-avatar":r.showAvatar,onRetry:n[0]||=e=>t.$emit(`retry`,e)},null,8,[`message`,`assistant-name`,`assistant-avatar`,`user-avatar`,`show-avatar`]),u(` 追问建议:assistant 气泡下方独立区域(豆包风格) `),i.shouldRenderFollowup(a)?(T(),p(i.FollowupSuggestions,{key:0,items:i.followupMap[a.id]?.items??[],title:i.followupTitle,loading:i.followupMap[a.id]?.loading??!1,onSelect:e=>t.$emit(`followup-select`,e,a)},null,8,[`items`,`title`,`loading`,`onSelect`])):u(`v-if`,!0)],64))),128))]),e(x,{name:`acu-fade`,persisted:``},{default:c(()=>[l(m(`button`,{type:`button`,class:`acu-scroll-btn`,"aria-label":`回到底部`,onClick:n[1]||=e=>i.scrollToBottom(!0)},[...n[2]||=[m(`svg`,{viewBox:`0 0 24 24`,width:`18`,height:`18`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[m(`polyline`,{points:`6 9 12 15 18 9`})],-1)]],512),[[y,!i.atBottom&&r.messages.length>0]])]),_:1})],544)],2112)}var Qe=V(Ye,[[`render`,Ze],[`__scopeId`,`data-v-0555ca65`],[`__file`,`E:/workspace/github_workspace/chat-ui/src/components/MessageList/MessageList.vue`]]),$e=o({__name:`WelcomeScreen`,props:{title:{type:String,required:!1,default:`你好,有什么可以帮你?`},description:{type:String,required:!1,default:`试着问我任何问题,或选择下方的话题开始对话。`},questions:{type:Array,required:!1,default:()=>[]}},emits:[`select`],setup(e,{expose:t}){t();let n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),et={class:`acu-welcome`},tt={class:`acu-welcome-inner`},nt={class:`acu-welcome-title`},rt={key:0,class:`acu-welcome-desc`},it={key:1,class:`acu-welcome-grid`},at=[`onClick`],ot={class:`acu-preset-q-body`},st={class:`acu-preset-q-label`},ct={key:0,class:`acu-preset-q-prompt`};function lt(e,t,n,r,i,a){return T(),C(S,null,[u(`
|
|
33
|
-
开场白 + 预设问题。
|
|
34
|
-
无消息时居中展示,点击预设问题触发发送。
|
|
35
|
-
`),m(`div`,et,[m(`div`,tt,[t[1]||=w(`<div class="acu-welcome-logo" data-v-4684d034><svg viewBox="0 0 24 24" width="28" height="28" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" data-v-4684d034><path d="M12 3l1.9 4.6L18.5 9.5l-4.6 1.9L12 16l-1.9-4.6L5.5 9.5l4.6-1.9L12 3z" data-v-4684d034></path><path d="M19 14l.8 1.9L21.7 17l-1.9.8L19 19.7l-.8-1.9L16.3 17l1.9-.8L19 14z" data-v-4684d034></path><path d="M5 15l.6 1.5L7.1 17l-1.5.6L5 19.1l-.6-1.5L2.9 17l1.5-.6L5 15z" data-v-4684d034></path></svg></div>`,1),m(`h2`,nt,d(n.title),1),n.description?(T(),C(`p`,rt,d(n.description),1)):u(`v-if`,!0),n.questions.length?(T(),C(`div`,it,[(T(!0),C(S,null,s(n.questions,n=>(T(),C(`button`,{key:n.id,type:`button`,class:`acu-preset-q`,onClick:t=>e.$emit(`select`,n)},[m(`span`,ot,[m(`span`,st,d(n.label),1),n.prompt?(T(),C(`span`,ct,d(n.prompt),1)):u(`v-if`,!0)]),t[0]||=m(`svg`,{class:`acu-preset-q-arrow`,viewBox:`0 0 24 24`,width:`16`,height:`16`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[m(`line`,{x1:`7`,y1:`17`,x2:`17`,y2:`7`}),m(`polyline`,{points:`7 7 17 7 17 17`})],-1)],8,at))),128))])):u(`v-if`,!0)])])],2112)}var ut=V($e,[[`render`,lt],[`__scopeId`,`data-v-4684d034`],[`__file`,`E:/workspace/github_workspace/chat-ui/src/components/WelcomeScreen/WelcomeScreen.vue`]]),dt=o({__name:`ChatInput`,props:{placeholder:{type:String,required:!1,default:`输入消息,Enter 发送,Shift+Enter 换行`},disabled:{type:Boolean,required:!1,default:!1},uploadConfig:{type:Object,required:!1,default:()=>({})},maxLength:{type:Number,required:!1,default:4e3}},emits:[`send`],setup(e,{expose:t,emit:n}){let a=e,o=n,s=b(``),c=b([]),l=b(null),u=b(null),d=b(!1),f=b(!1),p=0,m=g(()=>({enabled:!0,multiple:!0,accept:``,maxCount:10,maxSize:20*1024*1024,...a.uploadConfig})),h=g(()=>m.value.enabled),_=g(()=>s.value.trim().length>0||c.value.length>0);function v(e){e.key===`Enter`&&!e.shiftKey&&!f.value&&!e.isComposing&&(e.preventDefault(),C())}function y(){f.value=!0}function x(){f.value=!1}function S(){let e=l.value;e&&(e.style.height=`auto`,e.style.height=Math.min(e.scrollHeight,200)+`px`,e.style.overflowY=e.scrollHeight>200?`auto`:`hidden`)}function C(){if(!_.value||a.disabled)return;let e=s.value.trim();!e&&c.value.length===0||(o(`send`,{text:e,files:[...c.value]}),s.value=``,c.value=[],i(()=>{var e;S(),(e=l.value)==null||e.focus()}))}function w(){var e;(e=u.value)==null||e.click()}function T(e){let t=e.target;t.files&&E(Array.from(t.files)),t.value=``}function E(e){let t=m.value;for(let n of e){if(t.maxCount&&c.value.length>=t.maxCount)break;if(t.maxSize&&n.size>t.maxSize)continue;let e={file:n,id:A(`file`)};k(n.type)&&(e.preview=URL.createObjectURL(n)),c.value.push(e)}}function D(e){let t=c.value.findIndex(t=>t.id===e);if(t>=0){let e=c.value[t];e.preview&&URL.revokeObjectURL(e.preview),c.value.splice(t,1)}}function O(e){var t;a.disabled||!h.value||(t=e.dataTransfer)!=null&&t.types.includes(`Files`)&&(p++,d.value=!0)}function j(){p=Math.max(0,p-1),p===0&&(d.value=!1)}function M(e){var t;if(p=0,d.value=!1,a.disabled||!h.value)return;let n=(t=e.dataTransfer)!=null&&t.files?Array.from(e.dataTransfer.files):[];n.length&&E(n)}r(()=>S()),t({focus:()=>l.value?.focus(),clear:()=>{s.value=``,c.value=[],i(S)}});let N={props:a,emit:o,draft:s,pendingFiles:c,textareaRef:l,fileInputRef:u,isDragging:d,isComposing:f,get dragCounter(){return p},set dragCounter(e){p=e},uploadConfig:m,uploadEnabled:h,canSend:_,onKeydown:v,onCompositionStart:y,onCompositionEnd:x,autoResize:S,onSend:C,triggerFileInput:w,onFileChange:T,addFiles:E,removeFile:D,onDragEnter:O,onDragLeave:j,onDrop:M};return Object.defineProperty(N,"__isScriptSetup",{enumerable:!1,value:!0}),N}}),ft={key:0,class:`acu-input-drop-hint`},pt={key:1,class:`acu-input-attachments`},mt={key:0,class:`acu-input-att-thumb`},ht=[`src`,`alt`],gt={key:1,class:`acu-input-att-file`},_t=[`title`],vt=[`onClick`],yt={class:`acu-input-row`},bt=[`disabled`],Q=[`accept`,`multiple`],xt=[`placeholder`,`disabled`],St=[`disabled`];function Ct(e,t,n,r,i,a){return T(),C(S,null,[u(`
|
|
36
|
-
输入框:自适应高度 textarea + 附件上传(按钮 / 拖拽)+ 预览 + 发送。
|
|
37
|
-
- Enter 发送,Shift+Enter 换行;中文输入法 composing 期间不触发
|
|
38
|
-
- 附件:图片生成缩略图,其他显示文件卡片,可移除
|
|
39
|
-
- 拖拽文件进入高亮
|
|
40
|
-
`),m(`div`,{class:_([`acu-input-wrap`,{"is-dragging":r.isDragging,"is-disabled":n.disabled}]),onDragenter:r.onDragEnter,onDragover:t[1]||=h(()=>{},[`prevent`]),onDragleave:r.onDragLeave,onDrop:h(r.onDrop,[`prevent`])},[u(` 拖拽提示遮罩 `),r.isDragging?(T(),C(`div`,ft,[...t[2]||=[m(`svg`,{viewBox:`0 0 24 24`,width:`22`,height:`22`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[m(`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`}),m(`polyline`,{points:`17 8 12 3 7 8`}),m(`line`,{x1:`12`,y1:`3`,x2:`12`,y2:`15`})],-1),m(`span`,null,`松开以添加文件`,-1)]])):u(`v-if`,!0),u(` 附件预览 `),r.pendingFiles.length?(T(),C(`div`,pt,[(T(!0),C(S,null,s(r.pendingFiles,e=>(T(),C(`div`,{key:e.id,class:`acu-input-att`},[e.preview?(T(),C(`div`,mt,[m(`img`,{src:e.preview,alt:e.file.name},null,8,ht)])):(T(),C(`div`,gt,[t[3]||=m(`svg`,{viewBox:`0 0 24 24`,width:`18`,height:`18`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.7`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[m(`path`,{d:`M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z`}),m(`polyline`,{points:`14 2 14 8 20 8`})],-1),m(`span`,{class:`acu-input-att-name`,title:e.file.name},d(e.file.name),9,_t)])),m(`button`,{type:`button`,class:`acu-input-att-remove`,"aria-label":`移除`,onClick:t=>r.removeFile(e.id)},[...t[4]||=[m(`svg`,{viewBox:`0 0 24 24`,width:`12`,height:`12`,fill:`none`,stroke:`currentColor`,"stroke-width":`2.4`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[m(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),m(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})],-1)]],8,vt)]))),128))])):u(`v-if`,!0),m(`div`,yt,[r.uploadEnabled?(T(),C(`button`,{key:0,type:`button`,class:`acu-input-icon-btn`,disabled:n.disabled,"aria-label":`添加附件`,onClick:r.triggerFileInput},[...t[5]||=[m(`svg`,{viewBox:`0 0 24 24`,width:`20`,height:`20`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[m(`path`,{d:`M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48`})],-1)]],8,bt)):u(`v-if`,!0),m(`input`,{ref:`fileInputRef`,type:`file`,class:`acu-input-file`,accept:r.uploadConfig.accept,multiple:r.uploadConfig.multiple,onChange:r.onFileChange},null,40,Q),l(m(`textarea`,{ref:`textareaRef`,"onUpdate:modelValue":t[0]||=e=>r.draft=e,class:`acu-input-textarea`,placeholder:n.placeholder,rows:1,disabled:n.disabled,onKeydown:r.onKeydown,onInput:r.autoResize,onCompositionstart:r.onCompositionStart,onCompositionend:r.onCompositionEnd},null,40,xt),[[v,r.draft]]),m(`button`,{type:`button`,class:`acu-input-send`,disabled:!r.canSend||n.disabled,"aria-label":`发送`,onClick:r.onSend},[...t[6]||=[m(`svg`,{viewBox:`0 0 24 24`,width:`20`,height:`20`,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},[m(`line`,{x1:`12`,y1:`19`,x2:`12`,y2:`5`}),m(`polyline`,{points:`5 12 12 5 19 12`})],-1)]],8,St)])],34)],2112)}var $=V(dt,[[`render`,Ct],[`__scopeId`,`data-v-1c9b7238`],[`__file`,`E:/workspace/github_workspace/chat-ui/src/components/ChatInput/ChatInput.vue`]]),wt=o({__name:`ChatContainer`,props:{messages:{type:Array,required:!0},presetQuestions:{type:Array,required:!1,default:()=>[]},welcomeTitle:{type:String,required:!1,default:`你好,有什么可以帮你?`},welcomeDescription:{type:String,required:!1,default:`试着问我任何问题,或选择下方的话题开始对话。`},assistantName:{type:String,required:!1,default:`AI 助手`},assistantAvatar:{type:String,required:!1,default:``},userAvatar:{type:String,required:!1,default:``},showAvatar:{type:Boolean,required:!1,default:!0},theme:{type:String,required:!1,default:`light`},placeholder:{type:String,required:!1,default:`输入消息,Enter 发送,Shift+Enter 换行`},disabled:{type:Boolean,required:!1,default:!1},uploadConfig:{type:Object,required:!1,default:()=>({})},followup:{type:[Array,Object],required:!1,default:void 0}},emits:[`send`,`retry`,`select`,`followup-select`],setup(e,{expose:n,emit:i}){let a=e,o=i,s=b(null),c=b(!1),l=null;function u(e){c.value=e.matches}let d=g(()=>a.theme===`auto`?c.value?`dark`:`light`:a.theme);r(()=>{typeof window<`u`&&window.matchMedia&&(l=window.matchMedia(`(prefers-color-scheme: dark)`),u(l),l.addEventListener(`change`,u))}),t(()=>{l&&l.removeEventListener(`change`,u)});function f(e){o(`send`,e)}function p(e){o(`select`,e)}function m(e,t){o(`followup-select`,e,t);let n=a.followup;(Array.isArray(n)||n?.autoSend!==!1)&&o(`send`,{text:e.prompt,files:[]})}n({scrollToBottom:e=>s.value?.scrollToBottom(e)});let h={props:a,emit:o,listRef:s,systemDark:c,get mq(){return l},set mq(e){l=e},updateSystemDark:u,resolvedTheme:d,onSend:f,onSelectPreset:p,onFollowupSelect:m,MessageList:Qe,WelcomeScreen:ut,ChatInput:$};return Object.defineProperty(h,"__isScriptSetup",{enumerable:!1,value:!0}),h}}),Tt=[`data-theme`],Et={class:`acu-chat-body`},Dt={class:`acu-chat-footer`};function Ot(t,n,r,i,a,o){return T(),C(S,null,[u(`
|
|
41
|
-
对话容器:对外主组件,组合 MessageList / WelcomeScreen / ChatInput。
|
|
42
|
-
- 主题:theme="light" | "dark" | "auto"(auto 跟随系统)
|
|
43
|
-
- 消息为空时展示开场白 + 预设问题
|
|
44
|
-
- 透传 send / retry / select 事件
|
|
45
|
-
`),m(`div`,{class:`acu-root acu-chat`,"data-theme":i.resolvedTheme},[m(`div`,Et,[r.messages.length?(T(),p(i.MessageList,{key:1,ref:`listRef`,messages:r.messages,"assistant-name":r.assistantName,"assistant-avatar":r.assistantAvatar,"user-avatar":r.userAvatar,"show-avatar":r.showAvatar,followup:r.followup,onRetry:n[0]||=e=>t.$emit(`retry`,e),onFollowupSelect:i.onFollowupSelect},null,8,[`messages`,`assistant-name`,`assistant-avatar`,`user-avatar`,`show-avatar`,`followup`])):(T(),p(i.WelcomeScreen,{key:0,title:r.welcomeTitle,description:r.welcomeDescription,questions:r.presetQuestions,onSelect:i.onSelectPreset},null,8,[`title`,`description`,`questions`]))]),m(`div`,Dt,[e(i.ChatInput,{placeholder:r.placeholder,disabled:r.disabled,"upload-config":r.uploadConfig,onSend:i.onSend},null,8,[`placeholder`,`disabled`,`upload-config`])])],8,Tt)],2112)}var kt=V(wt,[[`render`,Ot],[`__scopeId`,`data-v-3eb80329`],[`__file`,`E:/workspace/github_workspace/chat-ui/src/components/ChatContainer/ChatContainer.vue`]]);export{z as a,$ as i,A as n,kt as r,U as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root,[data-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--acu-bg:#fff;--acu-surface:#f7f7f8;--acu-surface-2:#ededf0;--acu-surface-hover:#f0f0f3;--acu-text:#18181b;--acu-text-secondary:#52525b;--acu-text-muted:#a1a1aa;--acu-border:#e7e7ea;--acu-border-strong:#d4d4d8;--acu-primary:#6366f1;--acu-primary-hover:#5457e5;--acu-primary-active:#4f46e5;--acu-primary-contrast:#fff;--acu-primary-soft:#6366f117;--acu-primary-soft-hover:#6366f124;--acu-bubble-user-bg:#6366f1;--acu-bubble-user-text:#fff;--acu-bubble-assistant-bg:#f7f7f8;--acu-bubble-assistant-text:#18181b;--acu-thinking-bg:#fafafa;--acu-thinking-text:#71717a;--acu-thinking-border:#ececef;--acu-thinking-icon:#a1a1aa;--acu-code-bg:#f6f8fa;--acu-code-text:#24292f;--acu-code-border:#e4e4e7;--acu-code-inline-bg:#afb8c133;--acu-code-header-bg:#eceef1;--acu-error:#ef4444;--acu-error-soft:#ef44441a;--acu-success:#10b981;--acu-warning:#f59e0b;--acu-shadow-sm:0 1px 2px #18181b0d;--acu-shadow:0 4px 16px #18181b14;--acu-shadow-lg:0 12px 32px #18181b1f;--acu-radius-xs:4px;--acu-radius-sm:8px;--acu-radius:12px;--acu-radius-lg:16px;--acu-radius-xl:20px;--acu-radius-full:9999px;--acu-space-1:4px;--acu-space-2:8px;--acu-space-3:12px;--acu-space-4:16px;--acu-space-5:20px;--acu-space-6:24px;--acu-space-8:32px;--acu-font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;--acu-font-mono:"SFMono-Regular", "JetBrains Mono", Menlo, Consolas, "Liberation Mono", monospace;--acu-font-size-xs:12px;--acu-font-size-sm:13px;--acu-font-size-base:14px;--acu-font-size-md:15px;--acu-font-size-lg:16px;--acu-font-size-xl:18px;--acu-line-height:1.65;--acu-duration-fast:.12s;--acu-duration:.2s;--acu-easing:cubic-bezier(.4, 0, .2, 1);--acu-max-width:768px;--acu-avatar-size:32px}[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--acu-bg:#18181b;--acu-surface:#27272a;--acu-surface-2:#34343a;--acu-surface-hover:#2f2f35;--acu-text:#f4f4f5;--acu-text-secondary:#a1a1aa;--acu-text-muted:#71717a;--acu-border:#323236;--acu-border-strong:#52525b;--acu-primary:#818cf8;--acu-primary-hover:#6366f1;--acu-primary-active:#5457e5;--acu-primary-contrast:#18181b;--acu-primary-soft:#818cf824;--acu-primary-soft-hover:#818cf838;--acu-bubble-user-bg:#6366f1;--acu-bubble-user-text:#fff;--acu-bubble-assistant-bg:#27272a;--acu-bubble-assistant-text:#f4f4f5;--acu-thinking-bg:#1f1f23;--acu-thinking-text:#a1a1aa;--acu-thinking-border:#2e2e33;--acu-thinking-icon:#71717a;--acu-code-bg:#0d1117;--acu-code-text:#e6edf3;--acu-code-border:#30363d;--acu-code-inline-bg:#6e768166;--acu-code-header-bg:#161b22;--acu-error:#f87171;--acu-error-soft:#f8717124;--acu-success:#34d399;--acu-warning:#fbbf24;--acu-shadow-sm:0 1px 2px #0000004d;--acu-shadow:0 4px 16px #0006;--acu-shadow-lg:0 12px 32px #00000080}.acu-root,.acu-root *,.acu-root :before,.acu-root :after{box-sizing:border-box}.acu-root{font-family:var(--acu-font-sans);font-size:var(--acu-font-size-base);line-height:var(--acu-line-height);color:var(--acu-text);background:var(--acu-bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizelegibility}.acu-root a{color:var(--acu-primary);text-decoration:none}.acu-root a:hover{text-decoration:underline}.acu-transition{transition:all var(--acu-duration) var(--acu-easing)}.acu-cursor{vertical-align:text-bottom;background:var(--acu-primary);border-radius:1px;width:7px;height:1.05em;margin-left:2px;animation:1s steps(2,start) infinite acu-blink;display:inline-block}@keyframes acu-blink{to{opacity:0}}.acu-typing-dots{align-items:center;gap:4px;display:inline-flex}.acu-typing-dots span{background:var(--acu-thinking-icon);border-radius:50%;width:6px;height:6px;animation:1.4s ease-in-out infinite both acu-bounce}.acu-typing-dots span:first-child{animation-delay:-.32s}.acu-typing-dots span:nth-child(2){animation-delay:-.16s}@keyframes acu-bounce{0%,80%,to{opacity:.5;transform:scale(.6)}40%{opacity:1;transform:scale(1)}}@keyframes acu-pulse{0%,to{opacity:.55}50%{opacity:1}}.acu-thinking{margin-bottom:var(--acu-space-3);border:1px solid var(--acu-thinking-border);border-radius:var(--acu-radius);background:var(--acu-thinking-bg);overflow:hidden}.acu-thinking.is-streaming{border-color:var(--acu-primary-soft)}.acu-thinking-header{align-items:center;gap:var(--acu-space-2);width:100%;padding:var(--acu-space-2) var(--acu-space-3);color:var(--acu-thinking-text);font-size:var(--acu-font-size-sm);cursor:pointer;transition:background-color var(--acu-duration-fast) var(--acu-easing);background:0 0;border:none;font-family:inherit;display:flex}.acu-thinking-header:hover{background:var(--acu-surface-hover)}.acu-thinking-icon{color:var(--acu-thinking-icon);flex-shrink:0;display:inline-flex}.is-streaming .acu-thinking-icon{color:var(--acu-primary);animation:acu-pulse 2s var(--acu-easing) infinite}.acu-thinking-title{letter-spacing:.01em;font-weight:500}.acu-thinking-chevron{color:var(--acu-text-muted);transition:transform var(--acu-duration) var(--acu-easing);flex-shrink:0;margin-left:auto}.acu-thinking-chevron.is-open{transform:rotate(180deg)}.acu-thinking-body{padding:0 var(--acu-space-3) var(--acu-space-3);border-top:1px dashed var(--acu-thinking-border);color:var(--acu-thinking-text);font-size:var(--acu-font-size-sm);line-height:1.7}.acu-thinking-md .acu-thinking-body{padding-top:var(--acu-space-2);border-top:none}@media (prefers-reduced-motion:reduce){.acu-root *{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.acu-md{font-size:var(--acu-font-size-md);line-height:var(--acu-line-height);color:var(--acu-bubble-assistant-text);word-wrap:break-word;overflow-wrap:anywhere}.acu-md>:first-child{margin-top:0}.acu-md>:last-child{margin-bottom:0}.acu-md p{margin:0 0 var(--acu-space-3)}.acu-md h1,.acu-md h2,.acu-md h3,.acu-md h4,.acu-md h5,.acu-md h6{margin:var(--acu-space-6) 0 var(--acu-space-3);font-weight:650;line-height:1.3}.acu-md h1{font-size:1.5em}.acu-md h2{font-size:1.32em}.acu-md h3{font-size:1.18em}.acu-md h4{font-size:1.06em}.acu-md ul,.acu-md ol{margin:0 0 var(--acu-space-3);padding-left:1.5em}.acu-md li{margin:var(--acu-space-1) 0}.acu-md li::marker{color:var(--acu-text-muted)}.acu-md ul ul,.acu-md ol ol,.acu-md ul ol,.acu-md ol ul{margin:var(--acu-space-1) 0}.acu-md li.task-list-item{margin-left:-1.4em;list-style:none}.acu-md a{color:var(--acu-primary);border-bottom:1px solid var(--acu-primary-soft);transition:border-color var(--acu-duration) var(--acu-easing);text-decoration:none}.acu-md a:hover{border-bottom-color:var(--acu-primary)}.acu-md strong{font-weight:650}.acu-md em{font-style:italic}.acu-md del{color:var(--acu-text-muted)}.acu-md hr{margin:var(--acu-space-5) 0;border:none;border-top:1px solid var(--acu-border)}.acu-md blockquote{margin:0 0 var(--acu-space-3);padding:var(--acu-space-1) var(--acu-space-4);border-left:3px solid var(--acu-primary);background:var(--acu-primary-soft);border-radius:0 var(--acu-radius-sm) var(--acu-radius-sm) 0;color:var(--acu-text-secondary)}.acu-md blockquote>:last-child{margin-bottom:0}.acu-md code:not(pre code){font-family:var(--acu-font-mono);background:var(--acu-code-inline-bg);color:var(--acu-text);border-radius:var(--acu-radius-xs);margin:0 .1em;padding:.15em .4em;font-size:.88em}.acu-md table{width:100%;margin:0 0 var(--acu-space-3);border-collapse:collapse;border-radius:var(--acu-radius-sm);scrollbar-width:thin;scrollbar-color:var(--acu-border-strong) transparent;font-size:.95em;display:block;overflow:auto hidden}.acu-md table::-webkit-scrollbar{width:6px;height:6px}.acu-md table::-webkit-scrollbar-track{background:0 0}.acu-md table::-webkit-scrollbar-thumb{background-color:var(--acu-border-strong);border-radius:3px}.acu-md table::-webkit-scrollbar-thumb:hover{background-color:var(--acu-text-muted)}.acu-md th,.acu-md td{padding:var(--acu-space-2) var(--acu-space-3);border:1px solid var(--acu-border);text-align:left}.acu-md th{background:var(--acu-surface);font-weight:600}.acu-md tbody tr:nth-child(2n){background:var(--acu-surface)}.acu-md img.acu-md-img{border-radius:var(--acu-radius-sm);vertical-align:middle;max-width:100%}.acu-md .acu-code-block{margin:0 0 var(--acu-space-3);border:1px solid var(--acu-code-border);border-radius:var(--acu-radius);background:var(--acu-code-bg);overflow:hidden}.acu-md .acu-code-header{padding:0 var(--acu-space-3);background:var(--acu-code-header-bg);border-bottom:1px solid var(--acu-code-border);justify-content:space-between;align-items:center;height:34px;display:flex}.acu-md .acu-code-lang{font-family:var(--acu-font-mono);font-size:var(--acu-font-size-xs);color:var(--acu-text-muted);text-transform:lowercase;letter-spacing:.02em}.acu-md .acu-code-copy{color:var(--acu-text-muted);font-size:var(--acu-font-size-xs);border-radius:var(--acu-radius-xs);cursor:pointer;transition:all var(--acu-duration-fast) var(--acu-easing);background:0 0;border:none;align-items:center;gap:4px;padding:3px 8px;font-family:inherit;display:inline-flex}.acu-md .acu-code-copy svg{display:block}.acu-md .acu-code-copy:hover{background:var(--acu-surface-2);color:var(--acu-text)}.acu-md .acu-code-copy.is-copied{color:var(--acu-success)}.acu-md .acu-code-copy.is-error{color:var(--acu-error)}.acu-md .shiki{padding:var(--acu-space-4);font-family:var(--acu-font-mono);font-size:var(--acu-font-size-sm);scrollbar-width:thin;scrollbar-color:var(--acu-border-strong) transparent;margin:0;line-height:1.6;overflow-x:auto;background:var(--acu-code-bg)!important}.acu-md .shiki::-webkit-scrollbar{width:8px;height:8px}.acu-md .shiki::-webkit-scrollbar-track{background:0 0}.acu-md .shiki::-webkit-scrollbar-thumb{background-color:var(--acu-border-strong);border-radius:4px}.acu-md .shiki::-webkit-scrollbar-thumb:hover{background-color:var(--acu-text-muted)}.acu-md .shiki code{background:0 0;padding:0;font-family:inherit}.acu-md .shiki,.acu-md .shiki span{color:var(--shiki-light,inherit);font-style:var(--shiki-light-font-style,normal);font-weight:var(--shiki-light-font-weight,normal);-webkit-text-decoration:var(--shiki-light-text-decoration,none);text-decoration:var(--shiki-light-text-decoration,none)}[data-theme=dark] .acu-md .shiki,[data-theme=dark] .acu-md .shiki span{color:var(--shiki-dark,inherit);font-style:var(--shiki-dark-font-style,normal);font-weight:var(--shiki-dark-font-weight,normal);-webkit-text-decoration:var(--shiki-dark-text-decoration,none);text-decoration:var(--shiki-dark-text-decoration,none)}.acu-md .acu-code-fallback{color:var(--acu-code-text)}.acu-thinking-header[data-v-a703af34]{outline:none}.acu-thinking-header[data-v-a703af34]:focus-visible{box-shadow:0 0 0 2px var(--acu-bg),0 0 0 4px var(--acu-primary)}.acu-collapse-enter-active[data-v-a703af34],.acu-collapse-leave-active[data-v-a703af34]{transition:opacity var(--acu-duration) var(--acu-easing),transform var(--acu-duration) var(--acu-easing)}.acu-collapse-enter-from[data-v-a703af34],.acu-collapse-leave-to[data-v-a703af34]{opacity:0;transform:translateY(-4px)}.acu-thinking-body[data-v-a703af34] .acu-md{font-size:var(--acu-font-size-sm);color:var(--acu-thinking-text);opacity:.92}.acu-thinking-body[data-v-a703af34] .acu-md p{margin-bottom:var(--acu-space-2)}.acu-toolcall[data-v-f93fe4d7]{border:1px solid var(--acu-border);border-radius:var(--acu-radius-sm);margin:var(--acu-space-1) 0;background:var(--acu-surface);overflow:hidden}.acu-toolcall-header[data-v-f93fe4d7]{align-items:center;gap:var(--acu-space-2);cursor:pointer;width:100%;font-family:inherit;font-size:var(--acu-font-size-sm);color:var(--acu-text-secondary);transition:background var(--acu-duration-fast) var(--acu-easing);background:0 0;border:none;padding:6px 10px;display:flex}.acu-toolcall-header[data-v-f93fe4d7]:hover{background:var(--acu-surface-2)}.acu-toolcall-status[data-v-f93fe4d7]{flex-shrink:0;justify-content:center;align-items:center;width:18px;height:18px;display:inline-flex}.acu-toolcall-status.is-running[data-v-f93fe4d7]{color:var(--acu-primary)}.acu-toolcall-status.is-done[data-v-f93fe4d7]{color:var(--acu-success)}.acu-toolcall-status.is-error[data-v-f93fe4d7]{color:var(--acu-error)}.acu-toolcall-status.is-pending[data-v-f93fe4d7]{color:var(--acu-text-muted)}.acu-toolcall-icon[data-v-f93fe4d7]{color:var(--acu-text-muted);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.acu-toolcall-name[data-v-f93fe4d7]{color:var(--acu-text);flex-shrink:0;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:12px;font-weight:600}.acu-toolcall-args[data-v-f93fe4d7]{color:var(--acu-text-muted);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:12px;overflow:hidden}.acu-toolcall-chevron[data-v-f93fe4d7]{color:var(--acu-text-muted);transition:transform var(--acu-duration-fast) var(--acu-easing);flex-shrink:0;margin-left:auto}.acu-toolcall-chevron.expanded[data-v-f93fe4d7]{transform:rotate(180deg)}.acu-toolcall-body[data-v-f93fe4d7]{border-top:1px solid var(--acu-border);padding:var(--acu-space-2) var(--acu-space-3);background:var(--acu-surface-2)}.acu-toolcall-section+.acu-toolcall-section[data-v-f93fe4d7]{margin-top:var(--acu-space-2)}.acu-toolcall-section-label[data-v-f93fe4d7]{color:var(--acu-text-muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:4px;font-size:11px}.acu-toolcall-pre[data-v-f93fe4d7]{background:var(--acu-surface);border-radius:var(--acu-radius-xs);white-space:pre-wrap;word-break:break-all;max-height:300px;color:var(--acu-text);margin:0;padding:8px 10px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:12px;line-height:1.5;overflow-y:auto}.acu-toolcall-pre.is-error[data-v-f93fe4d7]{color:var(--acu-error)}.acu-toolcall-slide-enter-active[data-v-f93fe4d7],.acu-toolcall-slide-leave-active[data-v-f93fe4d7]{transition:all var(--acu-duration-fast) var(--acu-easing);overflow:hidden}.acu-toolcall-slide-enter-from[data-v-f93fe4d7],.acu-toolcall-slide-leave-to[data-v-f93fe4d7]{opacity:0;max-height:0;padding-top:0;padding-bottom:0}.acu-spin[data-v-f93fe4d7]{animation:.8s linear infinite acu-spin-f93fe4d7}@keyframes acu-spin-f93fe4d7{to{transform:rotate(360deg)}}.acu-bubble-row[data-v-db9217ed]{gap:var(--acu-space-3);align-items:flex-start;display:flex}.acu-bubble-row.is-user[data-v-db9217ed]{justify-content:flex-end}.acu-avatar[data-v-db9217ed]{width:var(--acu-avatar-size);height:var(--acu-avatar-size);border-radius:var(--acu-radius-full);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex;overflow:hidden}.acu-avatar img[data-v-db9217ed]{object-fit:cover;width:100%;height:100%}.acu-avatar--left[data-v-db9217ed]{background:var(--acu-surface-2);color:var(--acu-text-secondary)}.acu-avatar--right[data-v-db9217ed]{background:var(--acu-primary-soft);color:var(--acu-primary)}.acu-bubble-main[data-v-db9217ed]{flex-direction:column;min-width:0;max-width:min(680px,78%);display:flex}.is-user .acu-bubble-main[data-v-db9217ed]{align-items:flex-end}.acu-bubble-name[data-v-db9217ed]{font-size:var(--acu-font-size-xs);color:var(--acu-text-muted);margin-bottom:var(--acu-space-1);padding-left:2px}.acu-bubble[data-v-db9217ed]{padding:var(--acu-space-3) var(--acu-space-4);border-radius:var(--acu-radius-lg);font-size:var(--acu-font-size-md);line-height:var(--acu-line-height);word-break:break-word;max-width:100%;position:relative}.acu-bubble.is-assistant[data-v-db9217ed]{background:var(--acu-bubble-assistant-bg);color:var(--acu-bubble-assistant-text);border-top-left-radius:var(--acu-radius-xs)}.acu-bubble.is-user[data-v-db9217ed]{background:var(--acu-bubble-user-bg);color:var(--acu-bubble-user-text);border-top-right-radius:var(--acu-radius-xs)}.acu-bubble-content[data-v-db9217ed] .acu-md{color:inherit;font-size:var(--acu-font-size-md)}.acu-bubble-toolcalls[data-v-db9217ed]{margin-bottom:var(--acu-space-2)}.acu-attachments[data-v-db9217ed]{gap:var(--acu-space-2);margin-bottom:var(--acu-space-2);flex-wrap:wrap;display:flex}.acu-attachments.is-user[data-v-db9217ed]{justify-content:flex-end}.acu-att-thumb[data-v-db9217ed]{border-radius:var(--acu-radius);border:1px solid var(--acu-border);background:var(--acu-surface);width:88px;height:88px;overflow:hidden}.acu-att-thumb img[data-v-db9217ed]{object-fit:cover;width:100%;height:100%}.acu-att-file[data-v-db9217ed]{align-items:center;gap:var(--acu-space-2);padding:var(--acu-space-2) var(--acu-space-3);background:var(--acu-surface);border:1px solid var(--acu-border);border-radius:var(--acu-radius-sm);max-width:220px;display:inline-flex}.acu-att-file-icon[data-v-db9217ed]{color:var(--acu-text-muted);flex-shrink:0}.acu-att-file-info[data-v-db9217ed]{flex-direction:column;min-width:0;display:flex}.acu-att-file-name[data-v-db9217ed]{font-size:var(--acu-font-size-sm);color:var(--acu-text);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.acu-att-file-size[data-v-db9217ed]{font-size:var(--acu-font-size-xs);color:var(--acu-text-muted)}.acu-pending[data-v-db9217ed]{padding:var(--acu-space-1) 0}.acu-bubble-error[data-v-db9217ed]{align-items:center;gap:var(--acu-space-2);margin-top:var(--acu-space-2);padding:var(--acu-space-2) var(--acu-space-3);background:var(--acu-error-soft);color:var(--acu-error);border-radius:var(--acu-radius-sm);font-size:var(--acu-font-size-sm);display:flex}.acu-retry-btn[data-v-db9217ed]{color:inherit;border-radius:var(--acu-radius-xs);font-size:var(--acu-font-size-xs);cursor:pointer;transition:opacity var(--acu-duration-fast) var(--acu-easing);background:0 0;border:1px solid;margin-left:auto;padding:2px 10px;font-family:inherit}.acu-retry-btn[data-v-db9217ed]:hover{opacity:.75}.acu-followup[data-v-702b25c8]{padding-left:calc(var(--acu-avatar-size) + var(--acu-space-3));margin-top:var(--acu-space-3);margin-bottom:var(--acu-space-2);width:fit-content;max-width:min(680px,78%);animation:acu-followup-in-702b25c8 .28s var(--acu-easing) both;align-self:flex-start}.acu-followup-title[data-v-702b25c8]{font-size:var(--acu-font-size-xs);color:var(--acu-text-muted);margin-bottom:var(--acu-space-2);letter-spacing:.02em}.acu-followup-loading[data-v-702b25c8]{align-items:center;gap:4px;display:inline-flex}.acu-followup-dot[data-v-702b25c8]{background:var(--acu-primary);border-radius:50%;width:4px;height:4px;animation:1.2s ease-in-out infinite both acu-followup-bounce-702b25c8}.acu-followup-dot[data-v-702b25c8]:first-child{animation-delay:-.32s}.acu-followup-dot[data-v-702b25c8]:nth-child(2){animation-delay:-.16s}.acu-followup-list[data-v-702b25c8]{align-items:flex-start;gap:var(--acu-space-2);flex-direction:column;width:fit-content;max-width:100%;display:flex}.acu-followup-item[data-v-702b25c8]{align-items:center;gap:var(--acu-space-3);font-family:inherit;font-size:var(--acu-font-size-sm);color:var(--acu-text-secondary);background:var(--acu-bg);border:1px solid var(--acu-border);border-radius:var(--acu-radius);cursor:pointer;text-align:left;width:auto;max-width:100%;transition:all var(--acu-duration) var(--acu-easing);outline:none;padding:10px 14px;display:inline-flex}.acu-followup-item[data-v-702b25c8]:focus-visible{box-shadow:0 0 0 2px var(--acu-bg),0 0 0 4px var(--acu-primary)}.acu-followup-item[data-v-702b25c8]:hover{color:var(--acu-primary);background:var(--acu-primary-soft);border-color:var(--acu-primary)}.acu-followup-item:hover .acu-followup-item-arrow[data-v-702b25c8]{color:var(--acu-primary);transform:translate(2px,-2px)}.acu-followup-item[data-v-702b25c8]:active{transform:translateY(.5px)}.acu-followup-item-label[data-v-702b25c8]{white-space:nowrap;text-overflow:ellipsis;max-width:540px;overflow:hidden}.acu-followup-item-arrow[data-v-702b25c8]{color:var(--acu-text-muted);transition:transform var(--acu-duration) var(--acu-easing),color var(--acu-duration) var(--acu-easing);flex-shrink:0}@keyframes acu-followup-in-702b25c8{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes acu-followup-bounce-702b25c8{0%,80%,to{opacity:.4;transform:scale(.6)}40%{opacity:1;transform:scale(1)}}@media (prefers-reduced-motion:reduce){.acu-followup[data-v-702b25c8]{animation:none}}.acu-message-list[data-v-0555ca65]{scrollbar-width:thin;scrollbar-color:var(--acu-border-strong) transparent;flex:1;min-height:0;position:relative;overflow:hidden auto}.acu-message-list[data-v-0555ca65]::-webkit-scrollbar{width:6px;height:6px}.acu-message-list[data-v-0555ca65]::-webkit-scrollbar-track{background:0 0}.acu-message-list[data-v-0555ca65]::-webkit-scrollbar-thumb{background-color:var(--acu-border-strong);border-radius:3px}.acu-message-list[data-v-0555ca65]::-webkit-scrollbar-thumb:hover{background-color:var(--acu-text-muted)}.acu-message-list[data-v-0555ca65]{scroll-behavior:auto}.acu-message-list-inner[data-v-0555ca65]{gap:var(--acu-space-5);max-width:var(--acu-max-width);width:100%;padding:var(--acu-space-5) var(--acu-space-4) var(--acu-space-6);flex-direction:column;margin:0 auto;display:flex}.acu-scroll-btn[data-v-0555ca65]{bottom:var(--acu-space-3);border:1px solid var(--acu-border);background:var(--acu-bg);width:36px;height:36px;color:var(--acu-text-secondary);border-radius:var(--acu-radius-full);cursor:pointer;box-shadow:var(--acu-shadow);transition:all var(--acu-duration) var(--acu-easing);z-index:2;justify-content:center;align-items:center;margin:0 auto;display:inline-flex;position:sticky;left:50%;transform:translate(-50%)}.acu-scroll-btn[data-v-0555ca65]:hover{color:var(--acu-primary);border-color:var(--acu-primary)}.acu-fade-enter-active[data-v-0555ca65],.acu-fade-leave-active[data-v-0555ca65]{transition:opacity var(--acu-duration) var(--acu-easing),transform var(--acu-duration) var(--acu-easing)}.acu-fade-enter-from[data-v-0555ca65],.acu-fade-leave-to[data-v-0555ca65]{opacity:0;transform:translate(-50%,6px)}.acu-welcome[data-v-4684d034]{padding:var(--acu-space-8) var(--acu-space-4);flex:1;justify-content:center;align-items:center;min-height:0;display:flex}.acu-welcome-inner[data-v-4684d034]{text-align:center;flex-direction:column;align-items:center;width:100%;max-width:640px;display:flex}.acu-welcome-logo[data-v-4684d034]{border-radius:var(--acu-radius-lg);background:linear-gradient(135deg,var(--acu-primary-soft),var(--acu-surface));width:56px;height:56px;color:var(--acu-primary);margin-bottom:var(--acu-space-5);box-shadow:var(--acu-shadow-sm);justify-content:center;align-items:center;display:inline-flex}.acu-welcome-title[data-v-4684d034]{color:var(--acu-text);margin:0 0 var(--acu-space-2);letter-spacing:-.01em;font-size:22px;font-weight:650}.acu-welcome-desc[data-v-4684d034]{font-size:var(--acu-font-size-md);color:var(--acu-text-secondary);margin:0 0 var(--acu-space-6);max-width:440px}.acu-welcome-grid[data-v-4684d034]{gap:var(--acu-space-3);grid-template-columns:repeat(2,1fr);width:100%;display:grid}@media (width<=560px){.acu-welcome-grid[data-v-4684d034]{grid-template-columns:1fr}}.acu-preset-q[data-v-4684d034]{justify-content:space-between;align-items:flex-start;gap:var(--acu-space-3);padding:var(--acu-space-4);text-align:left;background:var(--acu-surface);border:1px solid var(--acu-border);border-radius:var(--acu-radius);cursor:pointer;transition:all var(--acu-duration) var(--acu-easing);outline:none;font-family:inherit;display:flex}.acu-preset-q[data-v-4684d034]:focus-visible{box-shadow:0 0 0 2px var(--acu-bg),0 0 0 4px var(--acu-primary)}.acu-preset-q[data-v-4684d034]:hover{border-color:var(--acu-primary);background:var(--acu-primary-soft);box-shadow:var(--acu-shadow-sm);transform:translateY(-1px)}.acu-preset-q:hover .acu-preset-q-arrow[data-v-4684d034]{color:var(--acu-primary);transform:translate(2px,-2px)}.acu-preset-q-body[data-v-4684d034]{flex-direction:column;gap:2px;min-width:0;display:flex}.acu-preset-q-label[data-v-4684d034]{font-size:var(--acu-font-size-md);color:var(--acu-text);font-weight:550}.acu-preset-q-prompt[data-v-4684d034]{font-size:var(--acu-font-size-xs);color:var(--acu-text-muted);-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.acu-preset-q-arrow[data-v-4684d034]{color:var(--acu-text-muted);transition:transform var(--acu-duration) var(--acu-easing),color var(--acu-duration) var(--acu-easing);flex-shrink:0;margin-top:2px}.acu-input-wrap[data-v-1c9b7238]{max-width:var(--acu-max-width);background:var(--acu-surface);border:1px solid var(--acu-border);border-radius:var(--acu-radius-lg);width:100%;padding:var(--acu-space-2);transition:border-color var(--acu-duration) var(--acu-easing),box-shadow var(--acu-duration) var(--acu-easing),background-color var(--acu-duration) var(--acu-easing);margin:0 auto;position:relative}.acu-input-wrap[data-v-1c9b7238]:focus-within{border-color:var(--acu-primary);box-shadow:0 0 0 3px var(--acu-primary-soft)}.acu-input-wrap.is-dragging[data-v-1c9b7238]{border-color:var(--acu-primary);background:var(--acu-primary-soft);box-shadow:0 0 0 3px var(--acu-primary-soft)}.acu-input-wrap.is-disabled[data-v-1c9b7238]{opacity:.6;pointer-events:none}.acu-input-drop-hint[data-v-1c9b7238]{justify-content:center;align-items:center;gap:var(--acu-space-2);color:var(--acu-primary);font-size:var(--acu-font-size-sm);pointer-events:none;z-index:1;flex-direction:column;font-weight:500;display:flex;position:absolute;inset:0}.acu-input-attachments[data-v-1c9b7238]{gap:var(--acu-space-2);padding:var(--acu-space-2) var(--acu-space-2) 0;flex-wrap:wrap;display:flex}.acu-input-att[data-v-1c9b7238]{display:inline-flex;position:relative}.acu-input-att-thumb[data-v-1c9b7238]{border-radius:var(--acu-radius-sm);border:1px solid var(--acu-border);width:56px;height:56px;overflow:hidden}.acu-input-att-thumb img[data-v-1c9b7238]{object-fit:cover;width:100%;height:100%}.acu-input-att-file[data-v-1c9b7238]{align-items:center;gap:var(--acu-space-2);padding:var(--acu-space-2) var(--acu-space-3);background:var(--acu-bg);border:1px solid var(--acu-border);border-radius:var(--acu-radius-sm);color:var(--acu-text-secondary);max-width:180px;display:inline-flex}.acu-input-att-name[data-v-1c9b7238]{font-size:var(--acu-font-size-xs);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.acu-input-att-remove[data-v-1c9b7238]{border-radius:var(--acu-radius-full);background:var(--acu-text);width:18px;height:18px;color:var(--acu-bg);cursor:pointer;box-shadow:var(--acu-shadow-sm);transition:transform var(--acu-duration-fast) var(--acu-easing);border:none;justify-content:center;align-items:center;display:inline-flex;position:absolute;top:-6px;right:-6px}.acu-input-att-remove[data-v-1c9b7238]:hover{transform:scale(1.12)}.acu-input-row[data-v-1c9b7238]{align-items:flex-end;gap:var(--acu-space-2);padding:var(--acu-space-1) var(--acu-space-1) 0;display:flex}.acu-input-icon-btn[data-v-1c9b7238]{width:36px;height:36px;color:var(--acu-text-muted);border-radius:var(--acu-radius-sm);cursor:pointer;transition:all var(--acu-duration-fast) var(--acu-easing);background:0 0;border:none;outline:none;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.acu-input-icon-btn[data-v-1c9b7238]:focus-visible{box-shadow:0 0 0 2px var(--acu-bg),0 0 0 4px var(--acu-primary)}.acu-input-icon-btn[data-v-1c9b7238]:hover:not(:disabled){background:var(--acu-surface-2);color:var(--acu-text)}.acu-input-file[data-v-1c9b7238]{display:none}.acu-input-textarea[data-v-1c9b7238]{resize:none;min-height:36px;max-height:200px;font-family:inherit;font-size:var(--acu-font-size-md);color:var(--acu-text);scrollbar-width:thin;scrollbar-color:var(--acu-border-strong) transparent;background:0 0;border:none;outline:none;flex:1;padding:8px 4px;line-height:1.5}.acu-input-textarea[data-v-1c9b7238]::-webkit-scrollbar{width:4px;height:4px}.acu-input-textarea[data-v-1c9b7238]::-webkit-scrollbar-track{background:0 0}.acu-input-textarea[data-v-1c9b7238]::-webkit-scrollbar-thumb{background-color:var(--acu-border-strong);border-radius:2px}.acu-input-textarea[data-v-1c9b7238]::-webkit-scrollbar-thumb:hover{background-color:var(--acu-text-muted)}.acu-input-textarea[data-v-1c9b7238]::placeholder{color:var(--acu-text-muted)}.acu-input-textarea[data-v-1c9b7238]:disabled{cursor:not-allowed}.acu-input-send[data-v-1c9b7238]{background:var(--acu-primary);width:36px;height:36px;color:var(--acu-primary-contrast);border-radius:var(--acu-radius-sm);cursor:pointer;transition:all var(--acu-duration-fast) var(--acu-easing);border:none;outline:none;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.acu-input-send[data-v-1c9b7238]:focus-visible{box-shadow:0 0 0 2px var(--acu-bg),0 0 0 4px var(--acu-primary)}.acu-input-send[data-v-1c9b7238]:hover:not(:disabled){background:var(--acu-primary-hover)}.acu-input-send[data-v-1c9b7238]:active:not(:disabled){background:var(--acu-primary-active)}.acu-input-send[data-v-1c9b7238]:disabled{background:var(--acu-surface-2);color:var(--acu-text-muted);cursor:not-allowed}.acu-chat[data-v-3eb80329]{background:var(--acu-bg);flex-direction:column;height:100%;min-height:0;display:flex}.acu-chat-body[data-v-3eb80329]{flex-direction:column;flex:1;min-height:0;display:flex}.acu-chat-footer[data-v-3eb80329]{padding:var(--acu-space-3) var(--acu-space-4) var(--acu-space-4);background:linear-gradient(to top,var(--acu-bg) 70%,transparent);flex-shrink:0}
|