@qfei-design/make-ai-assistant 0.1.4 → 0.1.5
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/PUBLIC_API.md +30 -9
- package/README.md +17 -2
- package/dist/{conversation-Dy2Sghjv.js → conversation-B7eGUXi-.js} +241 -198
- package/dist/conversation-Cv1wdvCR.cjs +1 -0
- package/dist/core/conversation.d.ts +11 -0
- package/dist/core/types.d.ts +2 -0
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +2 -2
- package/dist/make-app.cjs +1 -1
- package/dist/make-app.mjs +7 -6
- package/dist/make-console.cjs +1 -1
- package/dist/make-console.mjs +56 -55
- package/dist/react.cjs +1 -1
- package/dist/react.mjs +618 -440
- package/dist/sse.cjs +1 -1
- package/dist/sse.mjs +1 -1
- package/dist/styles.css +218 -5
- package/package.json +1 -1
- package/dist/conversation-Yku9Lzj_.cjs +0 -1
package/dist/react.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),E=require("./index.cjs"),h=require("react"),c=require("./conversation-Yku9Lzj_.cjs");function ue({artifact:s,context:a,fallback:t,onAction:l,onActionError:i,registry:r}){const m=E.resolveArtifactTemplate(r,s,a);if(!m)return t?t(s):e.jsxs("section",{className:"make-ai-artifact make-ai-artifact--unsupported",role:"status",children:[e.jsx("strong",{children:"暂不支持展示此结果"}),e.jsxs("span",{children:["结果类型:",s.kind]})]});const u={context:a,onAction:l,onActionError:i};return m.template.render(s,a,u)}const T=(s,a,t)=>{if(s==null||s==="")return"—";if(typeof s=="boolean")return s?"是":"否";if(typeof s!="number")return`${s}${a?.unit??""}`;const l=a?.precision,i={maximumFractionDigits:l??2,minimumFractionDigits:l};a?.style==="currency"&&a.currency?(i.style="currency",i.currency=a.currency):a?.style==="percent"&&(i.style="percent");try{const r=a?.style==="percent"?s/100:s;return`${new Intl.NumberFormat(t,i).format(r)}${a?.unit??""}`}catch{return`${s}${a?.unit??""}`}},pe=s=>{let a=Number.POSITIVE_INFINITY,t=Number.NEGATIVE_INFINITY;for(const l of s)a=Math.min(a,l),t=Math.max(t,l);return Number.isFinite(a)&&Number.isFinite(t)?{min:a,max:t}:{min:0,max:0}},he=(s,a,t)=>{if(!t.onAction)return;const l=r=>{console.error("[make-ai-assistant] host action error handler failed",{actionId:s.id,artifactId:a.artifact.id,errorType:r instanceof Error?r.name:typeof r,intent:s.intent})},i=r=>{if(t.onActionError){try{Promise.resolve(t.onActionError(r,s,a)).catch(l)}catch(m){l(m)}return}console.error("[make-ai-assistant] host action failed",{actionId:s.id,artifactId:a.artifact.id,errorType:r instanceof Error?r.name:typeof r,intent:s.intent})};try{Promise.resolve(t.onAction(s,a)).catch(i)}catch(r){i(r)}},D=(s,a)=>s.actions?.length&&a.onAction?e.jsx("div",{className:"make-ai-artifact__actions",children:s.actions.map(t=>e.jsxs("button",{className:`make-ai-artifact__action make-ai-artifact__action--${t.appearance??"link"}`,type:"button",onClick:()=>he(t,{artifact:s,context:a.context},a),children:[t.label,e.jsx("span",{"aria-hidden":"true",children:"→"})]},t.id))}):null,P=(s,a,t="")=>e.jsxs("section",{"aria-label":s.title??`${s.kind} result`,className:`make-ai-artifact ${t}`.trim(),"data-artifact-density":s.presentation?.density,"data-artifact-kind":s.kind,children:[s.title?e.jsx("h4",{className:"make-ai-artifact__title",children:s.title}):null,s.summary?e.jsx("p",{className:"make-ai-artifact__summary",children:s.summary}):null,a]}),$e=({artifact:s,renderContext:a})=>{const t=s.data.delta,l=t?T(t.value,t.format==="percent"?{style:"percent"}:void 0,a.context.locale):void 0;return P(s,e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"make-ai-artifact__metric-value",children:T(s.data.value,s.data.format,a.context.locale)}),t?e.jsxs("div",{className:`make-ai-artifact__delta make-ai-artifact__delta--${t.direction??"flat"}`,children:[e.jsx("span",{"aria-hidden":"true",children:t.direction==="up"?"↗":t.direction==="down"?"↘":"→"}),e.jsx("span",{children:l}),t.label?e.jsx("span",{children:t.label}):null]}):null,s.data.context?e.jsx("p",{className:"make-ai-artifact__context",children:s.data.context}):null,D(s,a)]}),"make-ai-artifact--metric")},Fe=({artifact:s,renderContext:a})=>P(s,e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"make-ai-artifact__comparison",children:s.data.items.map(t=>e.jsxs("div",{className:"make-ai-artifact__comparison-item",children:[e.jsx("span",{children:t.label}),e.jsx("strong",{children:T(t.value,t.format,a.context.locale)}),t.hint?e.jsx("small",{children:t.hint}):null]},t.id))}),D(s,a)]}),"make-ai-artifact--comparison"),Oe=({artifact:s,renderContext:a})=>{const t=s.data.series.flatMap(m=>m.points.map(u=>u.y)),{max:l,min:i}=pe(t),r=l-i||1;return P(s,e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"make-ai-artifact__trend",children:s.data.series.map(m=>e.jsxs("div",{className:"make-ai-artifact__trend-series",children:[e.jsx("div",{className:"make-ai-artifact__trend-label",children:m.label}),e.jsx("div",{className:"make-ai-artifact__trend-bars",children:m.points.map((u,M)=>{const v=18+(u.y-i)/r*70;return e.jsxs("div",{className:"make-ai-artifact__trend-point",children:[e.jsx("span",{"aria-label":`${u.x}: ${T(u.y,m.format,a.context.locale)}`,className:"make-ai-artifact__trend-bar",role:"img",style:{height:`${v}%`},title:`${u.x}: ${T(u.y,m.format,a.context.locale)}`}),e.jsx("small",{children:u.x})]},`${u.x}-${M}`)})})]},m.id))}),D(s,a)]}),"make-ai-artifact--trend")},Ke=({artifact:s,renderContext:a})=>{const{max:t}=pe(s.data.items.map(i=>Math.abs(i.value))),l=Math.max(t,1);return P(s,e.jsxs(e.Fragment,{children:[e.jsx("ol",{className:"make-ai-artifact__ranking",children:s.data.items.map((i,r)=>e.jsxs("li",{children:[e.jsx("span",{className:"make-ai-artifact__rank",children:r+1}),e.jsxs("span",{className:"make-ai-artifact__ranking-label",children:[e.jsx("span",{children:i.label}),i.description?e.jsx("small",{children:i.description}):null]}),e.jsx("span",{className:"make-ai-artifact__ranking-track","aria-hidden":"true",children:e.jsx("span",{style:{width:`${Math.abs(i.value)/l*100}%`}})}),e.jsx("strong",{children:T(i.value,i.format,a.context.locale)})]},i.id))}),D(s,a)]}),"make-ai-artifact--ranking")},Ve=(s,a)=>a.action??{id:`open-${a.id}`,label:a.title??a.id,intent:"open-record",target:{entityKey:s.data.entity.key,recordId:a.id}},Le=({artifact:s,renderContext:a})=>P(s,e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"make-ai-artifact__record-list",children:s.data.records.length===0?e.jsx("p",{className:"make-ai-artifact__empty",children:"没有符合条件的记录"}):s.data.records.map(t=>{const l=Ve(s,t),i=e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:t.title??t.id}),e.jsx("span",{className:"make-ai-artifact__record-values",children:s.data.columns.map(r=>e.jsxs("span",{children:[e.jsx("small",{children:r.label}),T(t.values[r.key],r.format,a.context.locale)]},r.key))}),a.onAction?e.jsx("span",{"aria-hidden":"true",children:"›"}):null]});return a.onAction?e.jsx("button",{className:"make-ai-artifact__record",type:"button",onClick:()=>he(l,{artifact:s,context:a.context},a),children:i},t.id):e.jsx("div",{className:"make-ai-artifact__record",children:i},t.id)})}),s.data.total!==void 0?e.jsxs("p",{className:"make-ai-artifact__record-total",children:["共 ",s.data.total," 条"]}):null,D(s,a)]}),"make-ai-artifact--record-list"),De=({artifact:s,renderContext:a})=>P(s,e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:`make-ai-artifact__notice make-ai-artifact__notice--${s.data.tone}`,children:[e.jsx("span",{"aria-hidden":"true",children:s.data.tone==="success"?"✓":s.data.tone==="warning"?"!":s.data.tone==="danger"?"×":"i"}),e.jsx("p",{children:s.data.body})]}),D(s,a)]}),"make-ai-artifact--notice"),L=(s,a,t)=>({id:s,kinds:[a],priority:0,render:t}),Pe=[L("platform.metric.default","metric",(s,a,t)=>e.jsx($e,{artifact:s,renderContext:t})),L("platform.comparison.default","comparison",(s,a,t)=>e.jsx(Fe,{artifact:s,renderContext:t})),L("platform.trend.default","trend",(s,a,t)=>e.jsx(Oe,{artifact:s,renderContext:t})),L("platform.ranking.default","ranking",(s,a,t)=>e.jsx(Ke,{artifact:s,renderContext:t})),L("platform.record-list.default","record-list",(s,a,t)=>e.jsx(Le,{artifact:s,renderContext:t})),L("platform.notice.default","notice",(s,a,t)=>e.jsx(De,{artifact:s,renderContext:t}))],_e=E.createArtifactTemplateRegistry(Pe).templates,fe=(s=_e)=>E.createArtifactTemplateRegistry(s),qe=s=>`${s}-${Date.now()}-${Math.random().toString(36).slice(2,9)}`,Ue="Make",ge=(s,a)=>a??`${s?.trim()||Ue} AI 助手`;class _ extends Error{}const de=s=>{try{const a=s?.return?.();if(!a)return;Promise.resolve(a).catch(t=>{console.error("[make-ai-assistant] transport iterator close failed",{errorType:t instanceof Error?t.name:typeof t})})}catch(a){console.error("[make-ai-assistant] transport iterator close failed",{errorType:a instanceof Error?a.name:typeof a})}},xe=()=>e.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[e.jsx("path",{d:"M12 2.8c.5 4.4 2.8 6.8 7.2 7.2-4.4.5-6.8 2.8-7.2 7.2-.5-4.4-2.8-6.8-7.2-7.2 4.4-.5 6.8-2.8 7.2-7.2Z"}),e.jsx("path",{d:"M18.3 16.1c.2 1.8 1.2 2.8 3 3-1.8.2-2.8 1.2-3 3-.2-1.8-1.2-2.8-3-3 1.8-.2 2.8-1.2 3-3Z"})]}),He=()=>e.jsx("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:e.jsx("path",{d:"m6 6 12 12M18 6 6 18"})}),ze=()=>e.jsx("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:e.jsx("path",{d:"M12 5v14M5 12h14"})}),Be=()=>e.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[e.jsx("path",{d:"m4 4 17 8-17 8 3-8-3-8Z"}),e.jsx("path",{d:"M7 12h14"})]}),B=({className:s=""})=>e.jsx("span",{className:`make-ai-assistant__avatar ${s}`.trim(),"aria-hidden":"true",children:e.jsx(xe,{})}),Ze=({src:s})=>s?e.jsx("span",{className:"make-ai-assistant__user-avatar","aria-hidden":"true",children:e.jsx("img",{alt:"",src:s})}):null,Ae=({assistantName:s})=>e.jsxs("div",{className:"make-ai-assistant__message-identity",children:[e.jsx(B,{className:"make-ai-assistant__avatar--message"}),e.jsx("span",{className:"make-ai-assistant__message-sender",children:s})]}),je=s=>{for(let a=s.messages.length-1;a>=0;a-=1){const t=s.messages[a];if(t.role==="assistant"&&t.status==="streaming")return t.id}},Ye=s=>{for(let a=s.messages.length-1;a>=0;a-=1)if(s.messages[a].role==="user")return a;return-1},ve=s=>{const a=Ye(s);if(!(a<0))for(let t=s.messages.length-1;t>a;t-=1){const l=s.messages[t];if(l.role==="assistant")return l.id}},Ie=({error:s,onRetry:a})=>e.jsxs("div",{className:"make-ai-assistant__message-status make-ai-assistant__message-status--error",role:"alert",children:[e.jsx("strong",{children:"本次请求未完成"}),e.jsx("span",{children:s.message}),s.retryable&&a?e.jsx("button",{className:"make-ai-assistant__retry",type:"button",onClick:a,children:"重新发送"}):null]}),me=({assistantName:s,error:a,onRetry:t,progress:l})=>{const i=a?"error":"progress",r=a?.message??l;return r?e.jsx("article",{"aria-label":`${s}的${i==="error"?"错误消息":"状态消息"}`,className:`make-ai-assistant__message make-ai-assistant__message--assistant make-ai-assistant__message--${i}`,"data-message-role":"assistant","data-message-state":i,children:e.jsxs("div",{className:"make-ai-assistant__message-turn",children:[e.jsx(Ae,{assistantName:s}),e.jsx("div",{className:"make-ai-assistant__message-stack",children:a?e.jsx(Ie,{error:a,onRetry:t}):e.jsxs("div",{className:"make-ai-assistant__progress",role:"status",children:[e.jsx("span",{"aria-hidden":"true"}),e.jsx("span",{children:r})]})})]})}):null},Ge=(s,a,t,l,i,r,m,u,M)=>{const v=ve(s),g=je(s);return s.messages.map(d=>{const S=d.role==="assistant",I=d.id===g,y=d.id===v&&s.error,w=S?r:u;return e.jsx("article",{"aria-label":`${w}的消息`,className:`make-ai-assistant__message make-ai-assistant__message--${d.role}`,"data-message-role":d.role,"data-message-state":y?"error":void 0,"data-message-status":d.status,children:e.jsxs("div",{className:"make-ai-assistant__message-turn",children:[S?e.jsx(Ae,{assistantName:r}):e.jsxs("div",{className:"make-ai-assistant__message-identity",children:[e.jsx("span",{className:"make-ai-assistant__message-sender",children:w}),e.jsx(Ze,{src:M})]}),e.jsxs("div",{className:"make-ai-assistant__message-stack",children:[d.content?e.jsx("div",{className:"make-ai-assistant__bubble",children:d.content}):d.status==="streaming"?e.jsxs("div",{className:"make-ai-assistant__typing","aria-label":`${r}正在思考`,children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]}):null,I&&s.progress?e.jsxs("div",{className:"make-ai-assistant__progress",role:"status",children:[e.jsx("span",{"aria-hidden":"true"}),e.jsx("span",{children:s.progress.message})]}):null,y?e.jsx(Ie,{error:y,onRetry:m}):null,d.artifacts.map(C=>e.jsx(ue,{artifact:C,context:a,onAction:l,onActionError:i,registry:t},C.id))]})]})},d.id)})};function ke({assistantName:s="AI 助手",brandName:a,context:t,onAction:l,onActionError:i,onClose:r,onNewConversation:m,registry:u,subtitle:M,suggestions:v=[],title:g,transport:d,userAvatarUrl:S,userName:I="你"}){const y=ge(a,g),[w,C]=h.useState(""),[p,N]=h.useState(c.createAssistantConversationState),[Z,q]=h.useState(void 0),[ye,Ne]=h.useState(0),[R,Y]=h.useState(()=>d.loadConversation?"loading":"ready"),$=h.useRef(void 0),F=h.useRef(void 0),O=h.useRef(0),ee=h.useRef(null),G=h.useRef(!0),se=h.useRef(t.app.id),ae=h.useMemo(()=>u??fe(),[u]),J=n=>{const A=$.current,x=F.current?.iterator;return!A&&!x?!1:(O.current+=1,$.current=void 0,F.current=void 0,console.info("[make-ai-assistant] local run cancellation requested",{reason:n}),A?.abort(),de(x),!0)};h.useEffect(()=>()=>{J("unmount")},[]),h.useEffect(()=>{const n=d.loadConversation,A=se.current!==t.app.id;if(se.current=t.app.id,J("reinitialize"),A&&(C(""),G.current=!0),q(void 0),N(c.createAssistantConversationState()),!n){Y("ready");return}const x=new AbortController;return Y("loading"),console.info("[make-ai-assistant] conversation load start",{appId:t.app.id}),n.call(d,t,{signal:x.signal}).then(j=>{x.signal.aborted||(N(c.createAssistantConversationState(j)),Y("ready"),console.info("[make-ai-assistant] conversation load success",{appId:t.app.id,messageCount:j.messages.length}))}).catch(j=>{x.signal.aborted||(console.error("[make-ai-assistant] conversation load failed",{appId:t.app.id,errorType:j instanceof Error?j.name:typeof j}),Y("error"))}),()=>x.abort()},[t.app.id,ye,d]),h.useEffect(()=>{const n=ee.current;if(!n||!G.current)return;const A=requestAnimationFrame(()=>{if(!G.current)return;const x=p.status==="streaming"||window.matchMedia?.("(prefers-reduced-motion: reduce)").matches?"auto":"smooth";typeof n.scrollTo=="function"?n.scrollTo({top:n.scrollHeight,behavior:x}):n.scrollTop=n.scrollHeight});return()=>cancelAnimationFrame(A)},[p.messages,p.status]);const be=()=>{const n=ee.current;n&&(G.current=n.scrollHeight-n.scrollTop-n.clientHeight<=48)},Q=async n=>{const A=n.trim();if(!A||R!=="ready"||p.status==="streaming"||$.current)return;if(c.countCodePointsUpTo(A,c.MAKE_AI_CONVERSATION_LIMITS.messageCharacters)>c.MAKE_AI_CONVERSATION_LIMITS.messageCharacters){q(`输入内容过长,请控制在 ${c.MAKE_AI_CONVERSATION_LIMITS.messageCharacters} 个字符以内`);return}const x={id:qe("user"),content:A},j=new AbortController,K=O.current+1;O.current=K,$.current=j,q(void 0),C(""),N(k=>c.appendUserMessage(k,x));try{let k=!1,f,re=0,ne=0,U=0;const H=new Map,ie=new Set,oe=new Set([...p.messages.map(X=>X.id),x.id]),z=new Set,ce=d.run({threadId:p.threadId,message:x,context:t,capabilities:E.createArtifactCapabilities(ae)},{signal:j.signal})[Symbol.asyncIterator]();for(F.current={iterator:ce,requestVersion:K};;){const X=await ce.next();if(O.current!==K||X.done)break;let o;try{o=c.parseAssistantEvent(X.value)}catch(b){throw new _(b instanceof Error?b.message:"Invalid assistant event")}if(o.type==="message.start"){if(f!==void 0&&f!==o.runId)throw new _("AI 助手响应 run id 不一致");if(f??=o.runId,ne+=1,ne>c.MAKE_AI_CONVERSATION_LIMITS.assistantMessagesPerRun)throw new _("AI 助手单次响应消息数量超过限制");if(oe.has(o.messageId))throw new _("AI 助手响应包含重复的 message id");oe.add(o.messageId),z.add(o.messageId),H.set(o.messageId,0)}if(o.type==="message.delta"){if(!z.has(o.messageId))throw new _("AI 助手响应事件顺序无效");const b=H.get(o.messageId)??0,V=c.countCodePointsUpTo(o.delta,c.MAKE_AI_CONVERSATION_LIMITS.messageCharacters-U);if(U+V>c.MAKE_AI_CONVERSATION_LIMITS.messageCharacters)throw new _("AI 助手响应文本超过大小限制");U+=V,H.set(o.messageId,b+V)}if(o.type==="message.replace"){if(!z.has(o.messageId))throw new _("AI 助手响应事件顺序无效");const b=H.get(o.messageId)??0,V=c.countCodePointsUpTo(o.content,c.MAKE_AI_CONVERSATION_LIMITS.messageCharacters),le=U-b+V;if(le>c.MAKE_AI_CONVERSATION_LIMITS.messageCharacters)throw new _("AI 助手响应文本超过大小限制");U=le,H.set(o.messageId,V)}if(o.type==="run.progress"){if(f!==void 0&&f!==o.runId)throw new _("AI 助手响应 run id 不一致");f??=o.runId}if(o.type==="artifact"){if(!z.has(o.messageId))throw new _("AI 助手响应事件顺序无效");if(re+=1,re>c.MAKE_AI_CONVERSATION_LIMITS.artifactsPerRun)throw new _("AI 助手单次响应 Artifact 数量超过限制");if(ie.has(o.artifact.id))throw new _("AI 助手响应包含重复的 Artifact id");ie.add(o.artifact.id)}if(o.type==="message.complete"&&!z.delete(o.messageId))throw new _("AI 助手响应事件顺序无效");if(o.type==="run.complete"&&f!==void 0&&f!==o.runId)throw new _("AI 助手响应 run id 不一致");if(o.type==="run.cancelled"&&o.runId!==void 0&&f!==void 0&&f!==o.runId)throw new _("AI 助手响应 run id 不一致");if(N(b=>c.reduceAssistantEvent(b,o)),o.type==="error"||o.type==="run.cancelled"||o.type==="run.complete"){k=!0;break}}if(!k)throw new _("AI 助手流式响应在终止事件前结束")}catch(k){if(O.current!==K)return;if(j.signal.aborted){N(f=>c.reduceAssistantEvent(f,{type:"run.cancelled"}));return}console.error("[make-ai-assistant] assistant run failed",{appId:t.app.id,errorType:k instanceof Error?k.name:typeof k}),N(f=>c.reduceAssistantEvent(f,{type:"error",code:"TRANSPORT_ERROR",message:k instanceof _?k.message:"连接失败,请重试",retryable:!0}))}finally{O.current===K&&$.current===j&&($.current=void 0),F.current?.requestVersion===K&&(de(F.current.iterator),F.current=void 0)}},Te=n=>{n.preventDefault(),Q(w)},Ee=n=>{n.key==="Enter"&&!n.shiftKey&&!n.nativeEvent.isComposing&&(n.preventDefault(),Q(w))},Me=()=>{J("stop")&&N(n=>c.reduceAssistantEvent(n,{type:"run.cancelled"}))},Se=()=>{J("new-conversation"),C(""),q(void 0),N(c.createAssistantConversationState()),m?.()},we=d.features?.remoteCancellation===!1?"停止接收":"停止生成",Ce=je(p),Re=ve(p),W=[...p.messages].reverse().find(n=>n.role==="user"),te=()=>{W&&Q(W.content)};return e.jsxs("section",{className:"make-ai-assistant make-ai-assistant__panel",children:[e.jsxs("header",{className:"make-ai-assistant__header",children:[e.jsx(B,{}),e.jsxs("div",{children:[e.jsx("h2",{children:y}),e.jsx("p",{children:M??`当前应用:${t.app.name??"未命名应用"}`})]}),e.jsxs("div",{className:"make-ai-assistant__header-actions",children:[d.features?.newConversation!==!1?e.jsx("button",{"aria-label":"新建对话",className:"make-ai-assistant__icon-button",type:"button",onClick:Se,children:e.jsx(ze,{})}):null,r?e.jsx("button",{"aria-label":`关闭 ${y}`,className:"make-ai-assistant__icon-button",type:"button",onClick:r,children:e.jsx(He,{})}):null]})]}),e.jsxs("div",{className:"make-ai-assistant__privacy-note",role:"note",children:[e.jsx("span",{"aria-hidden":"true",children:"◇"}),"当前页面上下文会随请求发送,数据权限以宿主服务端校验结果为准"]}),e.jsxs("div",{className:"make-ai-assistant__body","aria-live":"polite","aria-relevant":"additions text",ref:ee,role:"log",onScroll:be,children:[R==="loading"?e.jsxs("div",{className:"make-ai-assistant__empty",role:"status",children:[e.jsx(B,{}),e.jsx("h3",{children:"正在恢复对话"}),e.jsx("p",{children:"正在读取当前 App 的历史消息…"})]}):R==="error"?e.jsxs("div",{className:"make-ai-assistant__empty",role:"alert",children:[e.jsx(B,{}),e.jsx("h3",{children:"暂时无法加载对话"}),e.jsx("p",{children:"请检查网络后重试。"}),e.jsx("button",{className:"make-ai-assistant__retry",type:"button",onClick:()=>Ne(n=>n+1),children:"重新加载"})]}):p.messages.length===0?e.jsxs("div",{className:"make-ai-assistant__empty",children:[e.jsx(B,{}),e.jsx("h3",{children:"有什么可以帮你?"}),e.jsx("p",{children:"我会结合当前 App 和页面上下文理解问题,并用适合的方式展示结果。"})]}):Ge(p,t,ae,l,i,s,W?te:void 0,I,S),p.progress&&!Ce?e.jsx(me,{assistantName:s,progress:p.progress.message}):null,p.error&&!Re?e.jsx(me,{assistantName:s,error:p.error,onRetry:W?te:void 0}):null]}),e.jsxs("footer",{className:"make-ai-assistant__composer-region",children:[R==="ready"&&v.length>0&&p.messages.length===0?e.jsx("div",{className:"make-ai-assistant__suggestions","aria-label":"推荐问题",children:v.map((n,A)=>e.jsx("button",{type:"button",onClick:()=>{Q(n)},children:n},`${A}-${n}`))}):null,e.jsxs("form",{className:"make-ai-assistant__composer",onSubmit:Te,children:[e.jsx("textarea",{"aria-label":`向 ${s} 提问`,"aria-describedby":Z?"make-ai-composer-error":void 0,"aria-invalid":Z?!0:void 0,autoFocus:!0,disabled:R!=="ready"||p.status==="streaming",placeholder:`询问当前 ${t.app.name??"App"} 中的数据…`,rows:2,value:w,onChange:n=>{C(n.currentTarget.value),q(void 0)},onKeyDown:Ee}),p.status==="streaming"?e.jsx("button",{"aria-label":we,className:"make-ai-assistant__send make-ai-assistant__send--stop",type:"button",onClick:Me,children:e.jsx("span",{"aria-hidden":"true"})}):e.jsx("button",{"aria-label":"发送",className:"make-ai-assistant__send",disabled:R!=="ready"||!w.trim(),type:"submit",children:e.jsx(Be,{})})]}),Z?e.jsx("p",{id:"make-ai-composer-error",role:"alert",children:Z}):null,e.jsx("p",{children:"AI 生成的结果可能存在偏差,重要数据请核对明细。"})]})]})}function Je({defaultOpen:s=!1,hideLauncher:a=!1,launcher:t,onOpenChange:l,open:i,...r}){const m=ge(r.brandName,r.title),[u,M]=h.useState(s),v=h.useRef(null),g=i??u,d=I=>{i===void 0&&M(I),l?.(I),I||requestAnimationFrame(()=>v.current?.focus())},S=()=>d(!g);return h.useEffect(()=>{if(!g)return;const I=y=>{y.key==="Escape"&&(d(!1),requestAnimationFrame(()=>v.current?.focus()))};return document.addEventListener("keydown",I),()=>document.removeEventListener("keydown",I)},[l,g]),e.jsxs("div",{className:"make-ai-assistant","data-open":g||void 0,children:[!a&&(!g||t)?t?t({open:g,toggle:S}):e.jsxs("button",{"aria-label":g?`关闭 ${m}`:`打开 ${m}`,"aria-expanded":g,className:"make-ai-assistant__launcher",ref:v,type:"button",onClick:S,children:[e.jsx("span",{className:"make-ai-assistant__launcher-orbit","aria-hidden":"true"}),e.jsx(xe,{})]}):null,g?e.jsx("aside",{"aria-label":m,"aria-modal":"false",className:"make-ai-assistant__drawer",role:"dialog",children:e.jsx(ke,{...r,onClose:()=>d(!1)})}):null]})}exports.createArtifactCapabilities=E.createArtifactCapabilities;exports.createArtifactTemplateRegistry=E.createArtifactTemplateRegistry;exports.extendArtifactTemplateRegistry=E.extendArtifactTemplateRegistry;exports.resolveArtifactTemplate=E.resolveArtifactTemplate;exports.MAKE_AI_ARTIFACT_KINDS=c.MAKE_AI_ARTIFACT_KINDS;exports.MAKE_AI_ARTIFACT_LIMITS=c.MAKE_AI_ARTIFACT_LIMITS;exports.MAKE_AI_ARTIFACT_SCHEMA_VERSION=c.MAKE_AI_ARTIFACT_SCHEMA_VERSION;exports.MAKE_AI_CONVERSATION_LIMITS=c.MAKE_AI_CONVERSATION_LIMITS;exports.appendUserMessage=c.appendUserMessage;exports.createAssistantConversationState=c.createAssistantConversationState;exports.parseArtifact=c.parseArtifact;exports.parseAssistantEvent=c.parseAssistantEvent;exports.reduceAssistantEvent=c.reduceAssistantEvent;exports.validateArtifact=c.validateArtifact;exports.ArtifactRenderer=ue;exports.AssistantPanel=ke;exports.MakeAiAssistant=Je;exports.createPlatformArtifactRegistry=fe;exports.formatArtifactValue=T;exports.platformArtifactTemplates=_e;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),S=require("./index.cjs"),m=require("react"),l=require("./conversation-Cv1wdvCR.cjs");function Se({artifact:s,context:t,fallback:a,onAction:o,onActionError:i,registry:d}){const u=S.resolveArtifactTemplate(d,s,t);if(!u)return a?a(s):e.jsxs("section",{className:"make-ai-artifact make-ai-artifact--unsupported",role:"status",children:[e.jsx("strong",{children:"暂不支持展示此结果"}),e.jsxs("span",{children:["结果类型:",s.kind]})]});const f={context:t,onAction:o,onActionError:i};return u.template.render(s,t,f)}const E=(s,t,a)=>{if(s==null||s==="")return"—";if(typeof s=="boolean")return s?"是":"否";if(typeof s!="number")return`${s}${t?.unit??""}`;const o=t?.precision,i={maximumFractionDigits:o??2,minimumFractionDigits:o};t?.style==="currency"&&t.currency?(i.style="currency",i.currency=t.currency):t?.style==="percent"&&(i.style="percent");try{const d=t?.style==="percent"?s/100:s;return`${new Intl.NumberFormat(a,i).format(d)}${t?.unit??""}`}catch{return`${s}${t?.unit??""}`}},we=s=>{let t=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(const o of s)t=Math.min(t,o),a=Math.max(a,o);return Number.isFinite(t)&&Number.isFinite(a)?{min:t,max:a}:{min:0,max:0}},Ce=(s,t,a)=>{if(!a.onAction)return;const o=d=>{console.error("[make-ai-assistant] host action error handler failed",{actionId:s.id,artifactId:t.artifact.id,errorType:d instanceof Error?d.name:typeof d,intent:s.intent})},i=d=>{if(a.onActionError){try{Promise.resolve(a.onActionError(d,s,t)).catch(o)}catch(u){o(u)}return}console.error("[make-ai-assistant] host action failed",{actionId:s.id,artifactId:t.artifact.id,errorType:d instanceof Error?d.name:typeof d,intent:s.intent})};try{Promise.resolve(a.onAction(s,t)).catch(i)}catch(d){i(d)}},Z=(s,t)=>s.actions?.length&&t.onAction?e.jsx("div",{className:"make-ai-artifact__actions",children:s.actions.map(a=>e.jsxs("button",{className:`make-ai-artifact__action make-ai-artifact__action--${a.appearance??"link"}`,type:"button",onClick:()=>Ce(a,{artifact:s,context:t.context},t),children:[a.label,e.jsx("span",{"aria-hidden":"true",children:"→"})]},a.id))}):null,Y=(s,t,a="")=>e.jsxs("section",{"aria-label":s.title??`${s.kind} result`,className:`make-ai-artifact ${a}`.trim(),"data-artifact-density":s.presentation?.density,"data-artifact-kind":s.kind,children:[s.title?e.jsx("h4",{className:"make-ai-artifact__title",children:s.title}):null,s.summary?e.jsx("p",{className:"make-ai-artifact__summary",children:s.summary}):null,t]}),ts=({artifact:s,renderContext:t})=>{const a=s.data.delta,o=a?E(a.value,a.format==="percent"?{style:"percent"}:void 0,t.context.locale):void 0;return Y(s,e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"make-ai-artifact__metric-value",children:E(s.data.value,s.data.format,t.context.locale)}),a?e.jsxs("div",{className:`make-ai-artifact__delta make-ai-artifact__delta--${a.direction??"flat"}`,children:[e.jsx("span",{"aria-hidden":"true",children:a.direction==="up"?"↗":a.direction==="down"?"↘":"→"}),e.jsx("span",{children:o}),a.label?e.jsx("span",{children:a.label}):null]}):null,s.data.context?e.jsx("p",{className:"make-ai-artifact__context",children:s.data.context}):null,Z(s,t)]}),"make-ai-artifact--metric")},as=({artifact:s,renderContext:t})=>Y(s,e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"make-ai-artifact__comparison",children:s.data.items.map(a=>e.jsxs("div",{className:"make-ai-artifact__comparison-item",children:[e.jsx("span",{children:a.label}),e.jsx("strong",{children:E(a.value,a.format,t.context.locale)}),a.hint?e.jsx("small",{children:a.hint}):null]},a.id))}),Z(s,t)]}),"make-ai-artifact--comparison"),rs=({artifact:s,renderContext:t})=>{const a=s.data.series.flatMap(u=>u.points.map(f=>f.y)),{max:o,min:i}=we(a),d=o-i||1;return Y(s,e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"make-ai-artifact__trend",children:s.data.series.map(u=>e.jsxs("div",{className:"make-ai-artifact__trend-series",children:[e.jsx("div",{className:"make-ai-artifact__trend-label",children:u.label}),e.jsx("div",{className:"make-ai-artifact__trend-bars",children:u.points.map((f,w)=>{const I=18+(f.y-i)/d*70;return e.jsxs("div",{className:"make-ai-artifact__trend-point",children:[e.jsx("span",{"aria-label":`${f.x}: ${E(f.y,u.format,t.context.locale)}`,className:"make-ai-artifact__trend-bar",role:"img",style:{height:`${I}%`},title:`${f.x}: ${E(f.y,u.format,t.context.locale)}`}),e.jsx("small",{children:f.x})]},`${f.x}-${w}`)})})]},u.id))}),Z(s,t)]}),"make-ai-artifact--trend")},ns=({artifact:s,renderContext:t})=>{const{max:a}=we(s.data.items.map(i=>Math.abs(i.value))),o=Math.max(a,1);return Y(s,e.jsxs(e.Fragment,{children:[e.jsx("ol",{className:"make-ai-artifact__ranking",children:s.data.items.map((i,d)=>e.jsxs("li",{children:[e.jsx("span",{className:"make-ai-artifact__rank",children:d+1}),e.jsxs("span",{className:"make-ai-artifact__ranking-label",children:[e.jsx("span",{children:i.label}),i.description?e.jsx("small",{children:i.description}):null]}),e.jsx("span",{className:"make-ai-artifact__ranking-track","aria-hidden":"true",children:e.jsx("span",{style:{width:`${Math.abs(i.value)/o*100}%`}})}),e.jsx("strong",{children:E(i.value,i.format,t.context.locale)})]},i.id))}),Z(s,t)]}),"make-ai-artifact--ranking")},is=(s,t)=>t.action??{id:`open-${t.id}`,label:t.title??t.id,intent:"open-record",target:{entityKey:s.data.entity.key,recordId:t.id}},os=({artifact:s,renderContext:t})=>Y(s,e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"make-ai-artifact__record-list",children:s.data.records.length===0?e.jsx("p",{className:"make-ai-artifact__empty",children:"没有符合条件的记录"}):s.data.records.map(a=>{const o=is(s,a),i=e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:a.title??a.id}),e.jsx("span",{className:"make-ai-artifact__record-values",children:s.data.columns.map(d=>e.jsxs("span",{children:[e.jsx("small",{children:d.label}),E(a.values[d.key],d.format,t.context.locale)]},d.key))}),t.onAction?e.jsx("span",{"aria-hidden":"true",children:"›"}):null]});return t.onAction?e.jsx("button",{className:"make-ai-artifact__record",type:"button",onClick:()=>Ce(o,{artifact:s,context:t.context},t),children:i},a.id):e.jsx("div",{className:"make-ai-artifact__record",children:i},a.id)})}),s.data.total!==void 0?e.jsxs("p",{className:"make-ai-artifact__record-total",children:["共 ",s.data.total," 条"]}):null,Z(s,t)]}),"make-ai-artifact--record-list"),cs=({artifact:s,renderContext:t})=>Y(s,e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:`make-ai-artifact__notice make-ai-artifact__notice--${s.data.tone}`,children:[e.jsx("span",{"aria-hidden":"true",children:s.data.tone==="success"?"✓":s.data.tone==="warning"?"!":s.data.tone==="danger"?"×":"i"}),e.jsx("p",{children:s.data.body})]}),Z(s,t)]}),"make-ai-artifact--notice"),G=(s,t,a)=>({id:s,kinds:[t],priority:0,render:a}),ls=[G("platform.metric.default","metric",(s,t,a)=>e.jsx(ts,{artifact:s,renderContext:a})),G("platform.comparison.default","comparison",(s,t,a)=>e.jsx(as,{artifact:s,renderContext:a})),G("platform.trend.default","trend",(s,t,a)=>e.jsx(rs,{artifact:s,renderContext:a})),G("platform.ranking.default","ranking",(s,t,a)=>e.jsx(ns,{artifact:s,renderContext:a})),G("platform.record-list.default","record-list",(s,t,a)=>e.jsx(os,{artifact:s,renderContext:a})),G("platform.notice.default","notice",(s,t,a)=>e.jsx(cs,{artifact:s,renderContext:a}))],Re=S.createArtifactTemplateRegistry(ls).templates,$e=(s=Re)=>S.createArtifactTemplateRegistry(s),ds=s=>`${s}-${Date.now()}-${Math.random().toString(36).slice(2,9)}`,ms="Make",us=["总结当前页面数据","找出需要关注的记录","列出我有权限查看的数据对象"],Oe=(s,t)=>t??`${s?.trim()||ms} AI 助手`,ps=s=>s??us;class p extends Error{}const Me=s=>{try{const t=s?.return?.();if(!t)return;Promise.resolve(t).catch(a=>{console.error("[make-ai-assistant] transport iterator close failed",{errorType:a instanceof Error?a.name:typeof a})})}catch(t){console.error("[make-ai-assistant] transport iterator close failed",{errorType:t instanceof Error?t.name:typeof t})}},hs=async s=>{if(globalThis.navigator?.clipboard?.writeText){await globalThis.navigator.clipboard.writeText(s);return}if(typeof document>"u"||!document.body)throw new Error("Clipboard API is unavailable");const t=document.createElement("textarea");t.value=s,t.setAttribute("readonly",""),t.style.position="fixed",t.style.inset="0 auto auto 0",t.style.opacity="0",document.body.append(t),t.select();const a=document.execCommand("copy");if(t.remove(),!a)throw new Error("Clipboard copy failed")},Fe=()=>e.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[e.jsx("path",{d:"M12 2.8c.5 4.4 2.8 6.8 7.2 7.2-4.4.5-6.8 2.8-7.2 7.2-.5-4.4-2.8-6.8-7.2-7.2 4.4-.5 6.8-2.8 7.2-7.2Z"}),e.jsx("path",{d:"M18.3 16.1c.2 1.8 1.2 2.8 3 3-1.8.2-2.8 1.2-3 3-.2-1.8-1.2-2.8-3-3 1.8-.2 2.8-1.2 3-3Z"})]}),fs=()=>e.jsx("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:e.jsx("path",{d:"m6 6 12 12M18 6 6 18"})}),gs=()=>e.jsx("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:e.jsx("path",{d:"M12 5v14M5 12h14"})}),_s=()=>e.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[e.jsx("path",{d:"m4 4 17 8-17 8 3-8-3-8Z"}),e.jsx("path",{d:"M7 12h14"})]}),X=({className:s=""})=>e.jsx("span",{className:`make-ai-assistant__avatar ${s}`.trim(),"aria-hidden":"true",children:e.jsx(Fe,{})}),As=({src:s})=>s?e.jsx("span",{className:"make-ai-assistant__user-avatar","aria-hidden":"true",children:e.jsx("img",{alt:"",src:s})}):null,Le=({assistantName:s})=>e.jsxs("div",{className:"make-ai-assistant__message-identity",children:[e.jsx(X,{className:"make-ai-assistant__avatar--message"}),e.jsx("span",{className:"make-ai-assistant__message-sender",children:s})]}),Ke=s=>{for(let t=s.messages.length-1;t>=0;t-=1){const a=s.messages[t];if(a.role==="assistant"&&a.status==="streaming")return a.id}},xs=s=>{for(let t=s.messages.length-1;t>=0;t-=1)if(s.messages[t].role==="user")return t;return-1},Ve=s=>{const t=xs(s);if(!(t<0))for(let a=s.messages.length-1;a>t;a-=1){const o=s.messages[a];if(o.role==="assistant")return o.id}},vs=s=>{if(s.status==="idle")for(let t=s.messages.length-1;t>=0;t-=1){const a=s.messages[t];if(a.role==="assistant"&&a.status==="complete")return a.id}},Is=s=>{for(let t=s.messages.length-1;t>=0;t-=1){const a=s.messages[t];if(a.role==="user")return a}},js=(s,t)=>{const a=s.messages.findIndex(o=>o.id===t&&o.role==="user");return{...s,error:void 0,progress:void 0,status:"streaming",messages:a<0?s.messages:s.messages.slice(0,a+1)}},ys=s=>s.scrollHeight-s.scrollTop-s.clientHeight<=48,ks=(s="smooth")=>globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches?"auto":s,Pe=({error:s,onRetry:t})=>e.jsxs("div",{className:"make-ai-assistant__message-status make-ai-assistant__message-status--error",role:"alert",children:[e.jsx("strong",{children:"本次请求未完成"}),e.jsx("span",{children:s.message}),s.retryable&&t?e.jsx("button",{className:"make-ai-assistant__retry",type:"button",onClick:t,children:"重新发送"}):null]}),Ue=({active:s,steps:t})=>{if(!t?.length)return null;const a=t[t.length-1]??"处理中";return e.jsxs("details",{className:"make-ai-assistant__process",open:s,children:[e.jsxs("summary",{children:[s?e.jsxs("span",{className:"make-ai-assistant__progress",role:"status",children:[e.jsx("span",{"aria-hidden":"true"}),e.jsx("span",{children:a})]}):e.jsx("span",{className:"make-ai-assistant__process-title",children:"处理过程"}),e.jsxs("span",{className:"make-ai-assistant__process-count",children:[t.length," 步"]})]}),e.jsx("ol",{children:t.map((o,i)=>e.jsxs("li",{"data-step-active":s&&i===t.length-1?!0:void 0,children:[e.jsx("span",{"aria-hidden":"true"}),e.jsx("span",{children:o})]},`${i}-${o}`))})]})},bs=({copyFeedback:s,onCopy:t,onRegenerate:a})=>!t&&!a?null:e.jsxs("div",{className:"make-ai-assistant__reply-actions","aria-label":"回复操作",children:[t?e.jsx("button",{type:"button",onClick:t,children:"复制回答"}):null,a?e.jsx("button",{type:"button",onClick:a,children:"重新生成"}):null,s?e.jsx("span",{className:"make-ai-assistant__reply-feedback","data-copy-status":s.status,role:"status",children:s.message}):null]}),Ee=({assistantName:s,error:t,onRetry:a,progress:o})=>{const i=t?"error":"progress";return t?.message??o?.message?e.jsx("article",{"aria-label":`${s}的${i==="error"?"错误消息":"状态消息"}`,className:`make-ai-assistant__message make-ai-assistant__message--assistant make-ai-assistant__message--${i}`,"data-message-role":"assistant","data-message-state":i,children:e.jsxs("div",{className:"make-ai-assistant__message-turn",children:[e.jsx(Le,{assistantName:s}),e.jsx("div",{className:"make-ai-assistant__message-stack",children:t?e.jsx(Pe,{error:t,onRetry:a}):e.jsx(Ue,{active:!0,steps:o?.steps})})]})}):null},Ns=(s,t,a,o,i,d,u,f,w,I,v,_,O)=>{const k=Ve(s),F=Ke(s),C=vs(s);let R;return s.messages.map(n=>{const A=n.role==="assistant",L=R;A||(R=n);const K=n.id===F,b=n.id===k?s.error:void 0,V=n.error??b,N=A?d:f,de=A&&n.status==="complete"&&!V&&(n.content.trim()||n.id===C);return e.jsx("article",{"aria-label":`${N}的消息`,className:`make-ai-assistant__message make-ai-assistant__message--${n.role}`,"data-message-role":n.role,"data-message-state":V?"error":void 0,"data-message-status":n.status,children:e.jsxs("div",{className:"make-ai-assistant__message-turn",children:[A?e.jsx(Le,{assistantName:d}):e.jsxs("div",{className:"make-ai-assistant__message-identity",children:[e.jsx("span",{className:"make-ai-assistant__message-sender",children:N}),e.jsx(As,{src:w})]}),e.jsxs("div",{className:"make-ai-assistant__message-stack",children:[n.content?e.jsx("div",{className:"make-ai-assistant__bubble",children:n.content}):n.status==="streaming"?e.jsxs("div",{className:"make-ai-assistant__typing","aria-label":`${d}正在思考`,children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]}):null,A?e.jsx(Ue,{active:K&&s.status==="streaming",steps:n.progressSteps}):null,V?e.jsx(Pe,{error:V,onRetry:b?u:void 0}):null,n.artifacts.map(ee=>e.jsx(Se,{artifact:ee,context:t,onAction:o,onActionError:i,registry:a},ee.id)),de?e.jsx(bs,{copyFeedback:I?.messageId===n.id?{message:I.message,status:I.status}:void 0,onCopy:n.content.trim()?()=>_(n.id,n.content):void 0,onRegenerate:v&&n.id===C&&L?()=>O({userMessage:L,assistantMessage:n}):void 0}):null]})]})},n.id)})};function De({assistantName:s="AI 助手",brandName:t,context:a,onAction:o,onActionError:i,onClose:d,onNewConversation:u,registry:f,subtitle:w,suggestions:I,title:v,transport:_,userAvatarUrl:O,userName:k="你"}){const F=Oe(t,v),[C,R]=m.useState(""),[n,A]=m.useState(l.createAssistantConversationState),L=m.useRef(n);L.current=n;const[K,b]=m.useState(void 0),[V,N]=m.useState(void 0),[de,ee]=m.useState(0),[P,se]=m.useState(()=>_.loadConversation?"loading":"ready"),[qe,U]=m.useState(!1),D=m.useRef(void 0),q=m.useRef(void 0),B=m.useRef(0),te=m.useRef(null),$=m.useRef(!0),he=m.useRef(a.app.id),fe=m.useMemo(()=>f??$e(),[f]),ge=m.useMemo(()=>ps(I),[I]),ae=r=>{const h=D.current,g=q.current?.iterator;return!h&&!g?!1:(B.current+=1,D.current=void 0,q.current=void 0,console.info("[make-ai-assistant] local run cancellation requested",{reason:r}),h?.abort(),Me(g),!0)};m.useEffect(()=>()=>{ae("unmount")},[]),m.useEffect(()=>{const r=_.loadConversation,h=he.current!==a.app.id;if(he.current=a.app.id,ae("reinitialize"),h&&(R(""),$.current=!0),b(void 0),N(void 0),U(!1),A(l.createAssistantConversationState()),!r){se("ready");return}const g=new AbortController;return se("loading"),console.info("[make-ai-assistant] conversation load start",{appId:a.app.id}),r.call(_,a,{signal:g.signal}).then(j=>{g.signal.aborted||(A(l.createAssistantConversationState(j)),se("ready"),console.info("[make-ai-assistant] conversation load success",{appId:a.app.id,messageCount:j.messages.length}))}).catch(j=>{g.signal.aborted||(console.error("[make-ai-assistant] conversation load failed",{appId:a.app.id,errorType:j instanceof Error?j.name:typeof j}),se("error"))}),()=>g.abort()},[a.app.id,de,_]),m.useEffect(()=>{const r=te.current;if(!r||!$.current)return;U(!1);const h=requestAnimationFrame(()=>{if(!$.current)return;const g=n.status==="streaming"||globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches?"auto":"smooth";typeof r.scrollTo=="function"?r.scrollTo({top:r.scrollHeight,behavior:g}):r.scrollTop=r.scrollHeight});return()=>cancelAnimationFrame(h)},[n.messages,n.progress,n.status]);const Be=()=>{const r=te.current;if(!r)return;const h=ys(r);$.current=h,U(!h&&L.current.messages.length>0)},He=()=>{const r=te.current;if(!r)return;$.current=!0,U(!1);const h=ks();typeof r.scrollTo=="function"?r.scrollTo({top:r.scrollHeight,behavior:h}):r.scrollTop=r.scrollHeight},_e=async(r,h)=>{const g=r.trim(),j=L.current,T=h?.regenerateFrom,me=_.regenerate;if(!g||P!=="ready"||j.status==="streaming"||D.current||T&&!me)return;if(l.countCodePointsUpTo(g,l.MAKE_AI_CONVERSATION_LIMITS.messageCharacters)>l.MAKE_AI_CONVERSATION_LIMITS.messageCharacters){b(`输入内容过长,请控制在 ${l.MAKE_AI_CONVERSATION_LIMITS.messageCharacters} 个字符以内`);return}const ie={id:T?.userMessage.id??ds("user"),content:g},oe=T?js(j,T.userMessage.id):l.appendUserMessage(j,ie),ce=new AbortController,H=B.current+1;B.current=H,D.current=ce,b(void 0),N(void 0),U(!$.current&&j.messages.length>0),T||R(""),A(oe);try{let M=!1,x,xe=0,ve=0,Ie=0,ue=0,J=0;const Q=new Map,je=new Set,ye=new Set([...oe.messages.map(le=>le.id),ie.id]),W=new Set,ke=S.createArtifactCapabilities(fe),be={signal:ce.signal};let pe;if(T){if(!me)throw new p("当前 AI 助手不支持重新生成");pe=me({threadId:oe.threadId,message:ie,assistantMessage:{id:T.assistantMessage.id,content:T.assistantMessage.content},context:a,capabilities:ke},be)}else pe=_.run({threadId:oe.threadId,message:ie,context:a,capabilities:ke},be);const Ne=pe[Symbol.asyncIterator]();for(q.current={iterator:Ne,requestVersion:H};;){const le=await Ne.next();if(B.current!==H||le.done)break;let c;try{c=l.parseAssistantEvent(le.value)}catch(y){throw new p(y instanceof Error?y.message:"Invalid assistant event")}if(c.type==="message.start"){if(x!==void 0&&x!==c.runId)throw new p("AI 助手响应 run id 不一致");if(x??=c.runId,ve+=1,ve>l.MAKE_AI_CONVERSATION_LIMITS.assistantMessagesPerRun)throw new p("AI 助手单次响应消息数量超过限制");if(ye.has(c.messageId))throw new p("AI 助手响应包含重复的 message id");ye.add(c.messageId),W.add(c.messageId),Q.set(c.messageId,0)}if(c.type==="message.delta"){if(!W.has(c.messageId))throw new p("AI 助手响应事件顺序无效");const y=Q.get(c.messageId)??0,z=l.countCodePointsUpTo(c.delta,l.MAKE_AI_CONVERSATION_LIMITS.messageCharacters-J);if(J+z>l.MAKE_AI_CONVERSATION_LIMITS.messageCharacters)throw new p("AI 助手响应文本超过大小限制");J+=z,Q.set(c.messageId,y+z)}if(c.type==="message.replace"){if(!W.has(c.messageId))throw new p("AI 助手响应事件顺序无效");const y=Q.get(c.messageId)??0,z=l.countCodePointsUpTo(c.content,l.MAKE_AI_CONVERSATION_LIMITS.messageCharacters),Te=J-y+z;if(Te>l.MAKE_AI_CONVERSATION_LIMITS.messageCharacters)throw new p("AI 助手响应文本超过大小限制");J=Te,Q.set(c.messageId,z)}if(c.type==="run.progress"){if(x!==void 0&&x!==c.runId)throw new p("AI 助手响应 run id 不一致");if(x??=c.runId,Ie+=1,Ie>l.MAKE_AI_CONVERSATION_LIMITS.progressStepsPerRun)throw new p("AI 助手处理过程数量超过限制");const y=l.countCodePointsUpTo(c.message,l.MAKE_AI_CONVERSATION_LIMITS.progressCharactersPerRun-ue);if(ue+y>l.MAKE_AI_CONVERSATION_LIMITS.progressCharactersPerRun)throw new p("AI 助手处理过程文本超过大小限制");ue+=y}if(c.type==="artifact"){if(!W.has(c.messageId))throw new p("AI 助手响应事件顺序无效");if(xe+=1,xe>l.MAKE_AI_CONVERSATION_LIMITS.artifactsPerRun)throw new p("AI 助手单次响应 Artifact 数量超过限制");if(je.has(c.artifact.id))throw new p("AI 助手响应包含重复的 Artifact id");je.add(c.artifact.id)}if(c.type==="message.complete"&&!W.delete(c.messageId))throw new p("AI 助手响应事件顺序无效");if(c.type==="run.complete"&&x!==void 0&&x!==c.runId)throw new p("AI 助手响应 run id 不一致");if(c.type==="run.cancelled"&&c.runId!==void 0&&x!==void 0&&x!==c.runId)throw new p("AI 助手响应 run id 不一致");if(A(y=>l.reduceAssistantEvent(y,c)),c.type==="error"||c.type==="run.cancelled"||c.type==="run.complete"){M=!0;break}}if(!M)throw new p("AI 助手流式响应在终止事件前结束")}catch(M){if(B.current!==H)return;if(ce.signal.aborted){A(x=>l.reduceAssistantEvent(x,{type:"run.cancelled"}));return}console.error("[make-ai-assistant] assistant run failed",{appId:a.app.id,errorType:M instanceof Error?M.name:typeof M}),A(x=>l.reduceAssistantEvent(x,{type:"error",code:"TRANSPORT_ERROR",message:M instanceof p?M.message:"连接失败,请重试",retryable:!0}))}finally{B.current===H&&D.current===ce&&(D.current=void 0),q.current?.requestVersion===H&&(Me(q.current.iterator),q.current=void 0)}},re=r=>_e(r),ze=r=>_e(r.userMessage.content,{regenerateFrom:r}),Ge=async(r,h)=>{try{await hs(h),N({messageId:r,message:"已复制",status:"success"})}catch(g){console.error("[make-ai-assistant] copy answer failed",{errorType:g instanceof Error?g.name:typeof g}),N({messageId:r,message:"复制失败",status:"error"})}},Ze=r=>{r.preventDefault(),re(C)},Ye=r=>{r.key==="Enter"&&!r.shiftKey&&!r.nativeEvent.isComposing&&(r.preventDefault(),re(C))},Je=()=>{ae("stop")&&A(r=>l.reduceAssistantEvent(r,{type:"run.cancelled"}))},Qe=()=>{ae("new-conversation"),R(""),b(void 0),N(void 0),U(!1),$.current=!0,A(l.createAssistantConversationState()),u?.()},We=_.features?.remoteCancellation===!1?"停止接收":"停止生成",Xe=Ke(n),es=Ve(n),ne=Is(n),ss=typeof _.regenerate=="function"&&_.features?.regeneration!==!1,Ae=()=>{ne&&re(ne.content)};return e.jsxs("section",{className:"make-ai-assistant make-ai-assistant__panel",children:[e.jsxs("header",{className:"make-ai-assistant__header",children:[e.jsx(X,{}),e.jsxs("div",{children:[e.jsx("h2",{children:F}),e.jsx("p",{children:w??`当前应用:${a.app.name??"未命名应用"}`})]}),e.jsxs("div",{className:"make-ai-assistant__header-actions",children:[_.features?.newConversation!==!1?e.jsx("button",{"aria-label":"新建对话",className:"make-ai-assistant__icon-button",type:"button",onClick:Qe,children:e.jsx(gs,{})}):null,d?e.jsx("button",{"aria-label":`关闭 ${F}`,className:"make-ai-assistant__icon-button",type:"button",onClick:d,children:e.jsx(fs,{})}):null]})]}),e.jsxs("div",{className:"make-ai-assistant__privacy-note",role:"note",children:[e.jsx("span",{"aria-hidden":"true",children:"◇"}),"当前页面上下文会随请求发送,数据权限以宿主服务端校验结果为准"]}),e.jsxs("div",{className:"make-ai-assistant__body","aria-live":"polite","aria-relevant":"additions text",ref:te,role:"log",onScroll:Be,children:[P==="loading"?e.jsxs("div",{className:"make-ai-assistant__empty",role:"status",children:[e.jsx(X,{}),e.jsx("h3",{children:"正在恢复对话"}),e.jsx("p",{children:"正在读取当前 App 的历史消息…"})]}):P==="error"?e.jsxs("div",{className:"make-ai-assistant__empty",role:"alert",children:[e.jsx(X,{}),e.jsx("h3",{children:"暂时无法加载对话"}),e.jsx("p",{children:"请检查网络后重试。"}),e.jsx("button",{className:"make-ai-assistant__retry",type:"button",onClick:()=>ee(r=>r+1),children:"重新加载"})]}):n.messages.length===0?e.jsxs("div",{className:"make-ai-assistant__empty",children:[e.jsx(X,{}),e.jsx("h3",{children:"有什么可以帮你?"}),e.jsx("p",{children:"我会结合当前 App、页面位置和宿主允许的上下文回答,并把过程与结果分开展示。"})]}):Ns(n,a,fe,o,i,s,ne?Ae:void 0,k,O,V,ss,(r,h)=>{Ge(r,h)},r=>{ze(r)}),n.progress&&!Xe?e.jsx(Ee,{assistantName:s,progress:n.progress}):null,n.error&&!es?e.jsx(Ee,{assistantName:s,error:n.error,onRetry:ne?Ae:void 0}):null]}),qe?e.jsx("button",{"aria-label":"回到最新消息",className:"make-ai-assistant__back-to-latest",type:"button",onClick:He,children:"回到最新消息"}):null,e.jsxs("footer",{className:"make-ai-assistant__composer-region",children:[P==="ready"&&ge.length>0&&n.messages.length===0?e.jsx("div",{className:"make-ai-assistant__suggestions","aria-label":"推荐问题",children:ge.map((r,h)=>e.jsx("button",{type:"button",onClick:()=>{re(r)},children:r},`${h}-${r}`))}):null,e.jsxs("form",{className:"make-ai-assistant__composer",onSubmit:Ze,children:[e.jsx("textarea",{"aria-label":`向 ${s} 提问`,"aria-describedby":K?"make-ai-composer-error":void 0,"aria-invalid":K?!0:void 0,autoFocus:!0,disabled:P!=="ready"||n.status==="streaming",placeholder:`询问当前 ${a.app.name??"App"} 中的数据…`,rows:2,value:C,onChange:r=>{R(r.currentTarget.value),b(void 0)},onKeyDown:Ye}),n.status==="streaming"?e.jsx("button",{"aria-label":We,className:"make-ai-assistant__send make-ai-assistant__send--stop",type:"button",onClick:Je,children:e.jsx("span",{"aria-hidden":"true"})}):e.jsx("button",{"aria-label":"发送",className:"make-ai-assistant__send",disabled:P!=="ready"||!C.trim(),type:"submit",children:e.jsx(_s,{})})]}),K?e.jsx("p",{id:"make-ai-composer-error",role:"alert",children:K}):null,e.jsx("p",{children:"AI 生成的结果可能存在偏差,重要数据请核对明细。"})]})]})}function Ts({defaultOpen:s=!1,hideLauncher:t=!1,launcher:a,onOpenChange:o,open:i,...d}){const u=Oe(d.brandName,d.title),[f,w]=m.useState(s),I=m.useRef(null),v=i??f,_=k=>{i===void 0&&w(k),o?.(k),k||requestAnimationFrame(()=>I.current?.focus())},O=()=>_(!v);return m.useEffect(()=>{if(!v)return;const k=F=>{F.key==="Escape"&&(_(!1),requestAnimationFrame(()=>I.current?.focus()))};return document.addEventListener("keydown",k),()=>document.removeEventListener("keydown",k)},[o,v]),e.jsxs("div",{className:"make-ai-assistant","data-open":v||void 0,children:[!t&&(!v||a)?a?a({open:v,toggle:O}):e.jsxs("button",{"aria-label":v?`关闭 ${u}`:`打开 ${u}`,"aria-expanded":v,className:"make-ai-assistant__launcher",ref:I,type:"button",onClick:O,children:[e.jsx("span",{className:"make-ai-assistant__launcher-orbit","aria-hidden":"true"}),e.jsx(Fe,{})]}):null,v?e.jsx("aside",{"aria-label":u,"aria-modal":"false",className:"make-ai-assistant__drawer",role:"dialog",children:e.jsx(De,{...d,onClose:()=>_(!1)})}):null]})}exports.createArtifactCapabilities=S.createArtifactCapabilities;exports.createArtifactTemplateRegistry=S.createArtifactTemplateRegistry;exports.extendArtifactTemplateRegistry=S.extendArtifactTemplateRegistry;exports.resolveArtifactTemplate=S.resolveArtifactTemplate;exports.MAKE_AI_ARTIFACT_KINDS=l.MAKE_AI_ARTIFACT_KINDS;exports.MAKE_AI_ARTIFACT_LIMITS=l.MAKE_AI_ARTIFACT_LIMITS;exports.MAKE_AI_ARTIFACT_SCHEMA_VERSION=l.MAKE_AI_ARTIFACT_SCHEMA_VERSION;exports.MAKE_AI_CONVERSATION_LIMITS=l.MAKE_AI_CONVERSATION_LIMITS;exports.appendUserMessage=l.appendUserMessage;exports.createAssistantConversationState=l.createAssistantConversationState;exports.parseArtifact=l.parseArtifact;exports.parseAssistantEvent=l.parseAssistantEvent;exports.reduceAssistantEvent=l.reduceAssistantEvent;exports.validateArtifact=l.validateArtifact;exports.ArtifactRenderer=Se;exports.AssistantPanel=De;exports.MakeAiAssistant=Ts;exports.createPlatformArtifactRegistry=$e;exports.formatArtifactValue=E;exports.platformArtifactTemplates=Re;
|