@qfei-design/make-ai-assistant 0.1.5 → 0.1.7

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 CHANGED
@@ -39,12 +39,12 @@ Fetch SSE 实现时,从 `/sse` 入口导入 `createSseAssistantTransport`。
39
39
 
40
40
  - `MakeAiAssistant`:默认浮动入口与右侧抽屉;支持受控开关、自定义 launcher,以及
41
41
  `brandName` 对默认“{品牌名} AI 助手”标题的覆盖。`title` 可覆盖完整标题;`assistantName` /
42
- `userName` 可覆盖双方消息显示名称,`userAvatarUrl` 可显示当前登录人头像。省略
43
- `suggestions` 时显示包内默认推荐问题,传入 `[]` 时隐藏推荐问题。
42
+ `userName` / `userAvatarUrl` 可显示当前登录人的名称和头像;未传入时用户侧不显示身份信息。
43
+ 省略 `suggestions` 时显示包内默认推荐问题,传入 `[]` 时隐藏推荐问题。
44
44
  - `AssistantPanel`:不带 Drawer 的嵌入式会话面板;支持 `brandName`、`title`、`assistantName` /
45
- `userName` / `userAvatarUrl`。默认品牌为“Make”,默认显示“AI 助手”和“你”。这些字段只参与
46
- 本地 React 渲染,不会进入 transport 请求。嵌入式面板包含复制回答、可选安全重新生成、
47
- 回到最新消息、可折叠处理步骤、错误重试、键盘提交与 reduced-motion 处理。
45
+ `userName` / `userAvatarUrl`。默认品牌为“Make”,默认显示“AI 助手”;用户侧默认不展示名称或头像。
46
+ 这些字段只参与本地 React 渲染,不会进入 transport 请求。嵌入式面板包含图标化复制回答、
47
+ 可选安全重新生成、图标化回到最新消息、可折叠处理步骤、错误重试、键盘提交与 reduced-motion 处理。
48
48
  - `ArtifactRenderer`:注册表驱动的单 Artifact 渲染器。
49
49
  - `createPlatformArtifactRegistry`
50
50
  - `platformArtifactTemplates`
@@ -58,11 +58,15 @@ Fetch SSE 实现时,从 `/sse` 入口导入 `createSseAssistantTransport`。
58
58
  Promise rejection。`onActionError` 自身同步抛错或返回 rejected Promise 时也会被包隔离,
59
59
  不会污染宿主的全局未处理异常。
60
60
 
61
- 成功回答的“复制回答”只复制该 assistant message 的文本内容;复制失败只在本地 UI 反馈并记录
62
- 不含回答正文的错误类型。只有当 `transport.regenerate()` 存在且 `features.regeneration`
63
- 没有显式关闭时,“重新生成”才会显示;它会复用该回答前一条用户消息和旧 assistant message
64
- 发起替换请求,并在当前 UI 中替换旧回答,不额外插入重复的用户气泡。用户滚离底部时,UI 不会
65
- 强制自动跳到底部,而是显示“回到最新消息”按钮。
61
+ 成功回答的复制操作以图标按钮展示,保留“复制回答”的无障碍名称,只复制该 assistant message
62
+ 的文本内容;复制失败只在本地 UI 反馈并记录不含回答正文的错误类型。AI 回答正文会按段落、
63
+ 列表、强调、反引号代码片段和 Markdown 表格行做轻量结构化展示;该渲染不执行 HTML、JSX、
64
+ CSS JavaScript。默认内容字号为 12px,Markdown-like 回答正文默认字号为 11px,可通过
65
+ `--make-ai-font-size-body` 和 `--make-ai-font-size-markdown` 覆盖。只有当
66
+ `transport.regenerate()` 存在且 `features.regeneration` 没有显式关闭时,“重新生成”才会显示;
67
+ 它会复用该回答前一条用户消息和旧 assistant message 发起替换请求,并在当前 UI 中替换旧回答,
68
+ 不额外插入重复的用户气泡。用户滚离底部时,UI 不会强制自动跳到底部,而是显示仅含图标且保留
69
+ “回到最新消息”无障碍名称的按钮。
66
70
 
67
71
  ## AssistantTransport
68
72
 
package/README.md CHANGED
@@ -35,15 +35,20 @@ export function AppAssistant() {
35
35
 
36
36
  `MakeAiAssistant` 默认渲染右下角动效入口和右侧抽屉。宿主可以使用 `open` / `onOpenChange` 受控管理开关,也可以用 `AssistantPanel` 嵌入自己的容器。
37
37
 
38
- 默认会话会以“你”和“AI 助手”区分双方消息。宿主可通过 `brandName` 覆盖默认的 `Make`
39
- 品牌,面板会显示为“{品牌名} AI 助手”;传入 `title` 时则使用完整标题覆盖。`userName` 与
40
- `assistantName` 可覆盖双方消息显示名称,`userAvatarUrl` 可展示当前登录人的头像。这些显示配置
41
- 只用于 React UI,不会随会话上下文发送到 AI transport;进度和可重试错误会显示在对应的 AI 回合中。
42
-
43
- 成功的 AI 回答会显示“复制回答”;复制只处理该回答的文本内容,失败时会在本地 UI 内提示,
44
- 不会把回答正文写入日志。只有当宿主 transport 实现可安全替换旧回答的 `regenerate()` 时,
45
- UI 才显示“重新生成”,并复用该回答前一条用户问题替换旧回答,不额外插入重复的用户气泡。
46
- 用户滚离底部后,面板会显示“回到最新消息”,避免在阅读历史时强制跳到底部。
38
+ 默认会话会显示“AI 助手”身份;用户侧默认不显示名称,宿主传入 `userName`
39
+ `userAvatarUrl` 后才会在用户气泡上方展示当前登录人的名称或头像。宿主可通过 `brandName`
40
+ 覆盖默认的 `Make` 品牌,面板会显示为“{品牌名} AI 助手”;传入 `title` 时则使用完整标题覆盖。
41
+ `assistantName` 可覆盖 AI 消息显示名称。这些显示配置只用于 React UI,不会随会话上下文发送到
42
+ AI transport;进度和可重试错误会显示在对应的 AI 回合中。
43
+
44
+ 成功的 AI 回答会显示仅含图标的复制按钮,按钮保留“复制回答”的无障碍名称;复制只处理该
45
+ 回答的文本内容,失败时会在本地 UI 内提示,不会把回答正文写入日志。AI 回答正文会按段落、
46
+ 列表、强调、代码片段和 Markdown 表格行做轻量结构化展示,不执行 HTML,也不引入 Markdown
47
+ 运行时依赖。默认内容字号为 12px,Markdown-like 回答正文默认字号为 11px,宿主可通过
48
+ `--make-ai-font-size-body` 与 `--make-ai-font-size-markdown` 覆盖。只有当宿主 transport
49
+ 实现可安全替换旧回答的 `regenerate()` 时,UI 才显示“重新生成”,并复用该回答前一条用户问题
50
+ 替换旧回答,不额外插入重复的用户气泡。用户滚离底部后,面板会显示仅含图标的“回到最新消息”
51
+ 按钮,避免在阅读历史时强制跳到底部。
47
52
 
48
53
  `run.progress` 会累积为可折叠的处理步骤。流式生成中步骤默认展开,完成后默认折叠并保留在
49
54
  对应 AI 回合下;这些过程文本不进入最终回答正文。单次处理步骤最多 50 条且累计 20,000 字符,
package/dist/react.cjs CHANGED
@@ -1 +1,5 @@
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;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),C=require("./index.cjs"),p=require("react"),d=require("./conversation-Cv1wdvCR.cjs");function we({artifact:s,context:t,fallback:a,onAction:r,onActionError:i,registry:o}){const m=C.resolveArtifactTemplate(o,s,t);if(!m)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 u={context:t,onAction:r,onActionError:i};return m.template.render(s,t,u)}const w=(s,t,a)=>{if(s==null||s==="")return"—";if(typeof s=="boolean")return s?"是":"否";if(typeof s!="number")return`${s}${t?.unit??""}`;const r=t?.precision,i={maximumFractionDigits:r??2,minimumFractionDigits:r};t?.style==="currency"&&t.currency?(i.style="currency",i.currency=t.currency):t?.style==="percent"&&(i.style="percent");try{const o=t?.style==="percent"?s/100:s;return`${new Intl.NumberFormat(a,i).format(o)}${t?.unit??""}`}catch{return`${s}${t?.unit??""}`}},Ce=s=>{let t=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(const r of s)t=Math.min(t,r),a=Math.max(a,r);return Number.isFinite(t)&&Number.isFinite(a)?{min:t,max:a}:{min:0,max:0}},Re=(s,t,a)=>{if(!a.onAction)return;const r=o=>{console.error("[make-ai-assistant] host action error handler failed",{actionId:s.id,artifactId:t.artifact.id,errorType:o instanceof Error?o.name:typeof o,intent:s.intent})},i=o=>{if(a.onActionError){try{Promise.resolve(a.onActionError(o,s,t)).catch(r)}catch(m){r(m)}return}console.error("[make-ai-assistant] host action failed",{actionId:s.id,artifactId:t.artifact.id,errorType:o instanceof Error?o.name:typeof o,intent:s.intent})};try{Promise.resolve(a.onAction(s,t)).catch(i)}catch(o){i(o)}},G=(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:()=>Re(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]}),as=({artifact:s,renderContext:t})=>{const a=s.data.delta,r=a?w(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:w(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:r}),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,G(s,t)]}),"make-ai-artifact--metric")},ns=({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:w(a.value,a.format,t.context.locale)}),a.hint?e.jsx("small",{children:a.hint}):null]},a.id))}),G(s,t)]}),"make-ai-artifact--comparison"),rs=({artifact:s,renderContext:t})=>{const a=s.data.series.flatMap(m=>m.points.map(u=>u.y)),{max:r,min:i}=Ce(a),o=r-i||1;return Y(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,f)=>{const v=18+(u.y-i)/o*70;return e.jsxs("div",{className:"make-ai-artifact__trend-point",children:[e.jsx("span",{"aria-label":`${u.x}: ${w(u.y,m.format,t.context.locale)}`,className:"make-ai-artifact__trend-bar",role:"img",style:{height:`${v}%`},title:`${u.x}: ${w(u.y,m.format,t.context.locale)}`}),e.jsx("small",{children:u.x})]},`${u.x}-${f}`)})})]},m.id))}),G(s,t)]}),"make-ai-artifact--trend")},is=({artifact:s,renderContext:t})=>{const{max:a}=Ce(s.data.items.map(i=>Math.abs(i.value))),r=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,o)=>e.jsxs("li",{children:[e.jsx("span",{className:"make-ai-artifact__rank",children:o+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)/r*100}%`}})}),e.jsx("strong",{children:w(i.value,i.format,t.context.locale)})]},i.id))}),G(s,t)]}),"make-ai-artifact--ranking")},os=(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}},cs=({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 r=os(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(o=>e.jsxs("span",{children:[e.jsx("small",{children:o.label}),w(a.values[o.key],o.format,t.context.locale)]},o.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:()=>Re(r,{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,G(s,t)]}),"make-ai-artifact--record-list"),ls=({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})]}),G(s,t)]}),"make-ai-artifact--notice"),Z=(s,t,a)=>({id:s,kinds:[t],priority:0,render:a}),ds=[Z("platform.metric.default","metric",(s,t,a)=>e.jsx(as,{artifact:s,renderContext:a})),Z("platform.comparison.default","comparison",(s,t,a)=>e.jsx(ns,{artifact:s,renderContext:a})),Z("platform.trend.default","trend",(s,t,a)=>e.jsx(rs,{artifact:s,renderContext:a})),Z("platform.ranking.default","ranking",(s,t,a)=>e.jsx(is,{artifact:s,renderContext:a})),Z("platform.record-list.default","record-list",(s,t,a)=>e.jsx(cs,{artifact:s,renderContext:a})),Z("platform.notice.default","notice",(s,t,a)=>e.jsx(ls,{artifact:s,renderContext:a}))],$e=C.createArtifactTemplateRegistry(ds).templates,Le=(s=$e)=>C.createArtifactTemplateRegistry(s),ms=s=>`${s}-${Date.now()}-${Math.random().toString(36).slice(2,9)}`,us="Make",ps=["总结当前页面数据","找出需要关注的记录","列出我有权限查看的数据对象"],Oe=(s,t)=>t??`${s?.trim()||us} AI 助手`,hs=s=>s??ps;class h 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})}},fs=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"})]}),gs=()=>e.jsx("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:e.jsx("path",{d:"m6 6 12 12M18 6 6 18"})}),_s=()=>e.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[e.jsx("path",{d:"M8 8h10v12H8z"}),e.jsx("path",{d:"M6 16H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]}),xs=()=>e.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[e.jsx("path",{d:"M5 10v4"}),e.jsx("path",{d:"M8 9v6l6 3V6L8 9Z"}),e.jsx("path",{d:"M17 9.2a4.2 4.2 0 0 1 0 5.6"}),e.jsx("path",{d:"M19.4 6.8a7.6 7.6 0 0 1 0 10.4"})]}),As=()=>e.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[e.jsx("path",{d:"M12 4v11"}),e.jsx("path",{d:"m7 10 5 5 5-5"}),e.jsx("path",{d:"M5 20h14"})]}),js=()=>e.jsx("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:e.jsx("path",{d:"M12 5v14M5 12h14"})}),vs=()=>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,{})}),Is=({src:s})=>s?e.jsx("span",{className:"make-ai-assistant__user-avatar","aria-hidden":"true",children:e.jsx("img",{alt:"",src:s})}):null,ys=({userAvatarUrl:s,userName:t})=>{const a=t?.trim();return!a&&!s?null:e.jsxs("div",{className:"make-ai-assistant__message-identity",children:[a?e.jsx("span",{className:"make-ai-assistant__message-sender",children:a}):null,e.jsx(Is,{src:s})]})},ks=s=>{const t=[],a=[],r=[],i=[],o=()=>{const f=a.join(`
2
+ `).trim();a.length=0,f&&t.push({type:"paragraph",text:f})},m=()=>{r.length&&t.push({type:"list",items:r.splice(0)})},u=()=>{const f=i.join(`
3
+ `).trim();i.length=0,f&&t.push({type:"pre",text:f})};for(const f of s.replace(/\r\n?/g,`
4
+ `).split(`
5
+ `)){const v=f.trim();if(!v){o(),m(),u();continue}if(/^\s*\|.+\|\s*$/.test(f)){o(),m(),i.push(f.trim());continue}const A=/^\s*[-*]\s+(.+)$/.exec(f);if(A){o(),u(),r.push(A[1]?.trim()??"");continue}m(),u(),a.push(v)}return o(),m(),u(),t},Ee=s=>{const t=[],a=/(\*\*[^*]+\*\*|`[^`]+`)/g;let r=0;for(const i of s.matchAll(a)){const o=i[0],m=i.index??0;m>r&&t.push(s.slice(r,m)),o.startsWith("**")?t.push(e.jsx("strong",{children:o.slice(2,-2)},`${m}-strong`)):t.push(e.jsx("code",{children:o.slice(1,-1)},`${m}-code`)),r=m+o.length}return r<s.length&&t.push(s.slice(r)),t},bs=({content:s})=>{const t=ks(s);return t.length?e.jsx("div",{className:"make-ai-assistant__bubble make-ai-assistant__assistant-text",children:t.map((a,r)=>a.type==="paragraph"?e.jsx("p",{children:Ee(a.text)},`${r}-paragraph`):a.type==="pre"?e.jsx("pre",{children:e.jsx("code",{children:a.text})},`${r}-pre`):e.jsx("ul",{children:a.items.map((i,o)=>e.jsx("li",{children:Ee(i)},`${o}-${i}`))},`${r}-list`))}):null},Ke=({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})]}),Ve=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}},Ns=s=>{for(let t=s.messages.length-1;t>=0;t-=1)if(s.messages[t].role==="user")return t;return-1},Pe=s=>{const t=Ns(s);if(!(t<0))for(let a=s.messages.length-1;a>t;a-=1){const r=s.messages[a];if(r.role==="assistant")return r.id}},Ts=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}},Ms=s=>{for(let t=s.messages.length-1;t>=0;t-=1){const a=s.messages[t];if(a.role==="user")return a}},Es=(s,t)=>{const a=s.messages.findIndex(r=>r.id===t&&r.role==="user");return{...s,error:void 0,progress:void 0,status:"streaming",messages:a<0?s.messages:s.messages.slice(0,a+1)}},Ss=s=>s.scrollHeight-s.scrollTop-s.clientHeight<=48,ws=(s="smooth")=>globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches?"auto":s,De=({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((r,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:r})]},`${i}-${r}`))})]})},Cs=({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",{"aria-label":"复制回答",className:"make-ai-assistant__reply-action make-ai-assistant__reply-copy",type:"button",onClick:t,children:e.jsx(_s,{})}):null,a?e.jsx("button",{className:"make-ai-assistant__reply-action make-ai-assistant__reply-regenerate",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]}),Se=({assistantName:s,error:t,onRetry:a,progress:r})=>{const i=t?"error":"progress";return t?.message??r?.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(Ke,{assistantName:s}),e.jsx("div",{className:"make-ai-assistant__message-stack",children:t?e.jsx(De,{error:t,onRetry:a}):e.jsx(Ue,{active:!0,steps:r?.steps})})]})}):null},Rs=(s,t,a,r,i,o,m,u,f,v,A,j,O)=>{const b=Pe(s),F=Ve(s),R=Ts(s);let $;return s.messages.map(c=>{const _=c.role==="assistant",K=$;_||($=c);const V=c.id===F,T=c.id===b?s.error:void 0,P=c.error??T,M=!_&&!!(u?.trim()||f),le=_?o:u?.trim()||"用户",de=_&&c.status==="complete"&&!P&&(c.content.trim()||c.id===R);return e.jsx("article",{"aria-label":`${le}的消息`,className:`make-ai-assistant__message make-ai-assistant__message--${c.role}`,"data-message-role":c.role,"data-message-state":P?"error":void 0,"data-message-status":c.status,"data-message-has-identity":_||M?!0:void 0,children:e.jsxs("div",{className:"make-ai-assistant__message-turn",children:[_?e.jsx(Ke,{assistantName:o}):M?e.jsx(ys,{userAvatarUrl:f,userName:u}):null,e.jsxs("div",{className:"make-ai-assistant__message-stack",children:[c.content?_?e.jsx(bs,{content:c.content}):e.jsx("div",{className:"make-ai-assistant__bubble",children:c.content}):c.status==="streaming"?e.jsxs("div",{className:"make-ai-assistant__typing","aria-label":`${o}正在思考`,children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]}):null,_?e.jsx(Ue,{active:V&&s.status==="streaming",steps:c.progressSteps}):null,P?e.jsx(De,{error:P,onRetry:T?m:void 0}):null,c.artifacts.map(N=>e.jsx(we,{artifact:N,context:t,onAction:r,onActionError:i,registry:a},N.id)),de?e.jsx(Cs,{copyFeedback:v?.messageId===c.id?{message:v.message,status:v.status}:void 0,onCopy:c.content.trim()?()=>j(c.id,c.content):void 0,onRegenerate:A&&c.id===R&&K?()=>O({userMessage:K,assistantMessage:c}):void 0}):null]})]})},c.id)})};function Be({assistantName:s="AI 助手",brandName:t,context:a,onAction:r,onActionError:i,onClose:o,onNewConversation:m,registry:u,subtitle:f,suggestions:v,title:A,transport:j,userAvatarUrl:O,userName:b}){const F=Oe(t,A),[R,$]=p.useState(""),[c,_]=p.useState(d.createAssistantConversationState),K=p.useRef(c);K.current=c;const[V,T]=p.useState(void 0),[P,M]=p.useState(void 0),[le,de]=p.useState(0),[N,ee]=p.useState(()=>j.loadConversation?"loading":"ready"),[qe,D]=p.useState(!1),U=p.useRef(void 0),B=p.useRef(void 0),q=p.useRef(0),se=p.useRef(null),L=p.useRef(!0),he=p.useRef(a.app.id),fe=p.useMemo(()=>u??Le(),[u]),ge=p.useMemo(()=>hs(v),[v]),te=n=>{const g=U.current,x=B.current?.iterator;return!g&&!x?!1:(q.current+=1,U.current=void 0,B.current=void 0,console.info("[make-ai-assistant] local run cancellation requested",{reason:n}),g?.abort(),Me(x),!0)};p.useEffect(()=>()=>{te("unmount")},[]),p.useEffect(()=>{const n=j.loadConversation,g=he.current!==a.app.id;if(he.current=a.app.id,te("reinitialize"),g&&($(""),L.current=!0),T(void 0),M(void 0),D(!1),_(d.createAssistantConversationState()),!n){ee("ready");return}const x=new AbortController;return ee("loading"),console.info("[make-ai-assistant] conversation load start",{appId:a.app.id}),n.call(j,a,{signal:x.signal}).then(y=>{x.signal.aborted||(_(d.createAssistantConversationState(y)),ee("ready"),console.info("[make-ai-assistant] conversation load success",{appId:a.app.id,messageCount:y.messages.length}))}).catch(y=>{x.signal.aborted||(console.error("[make-ai-assistant] conversation load failed",{appId:a.app.id,errorType:y instanceof Error?y.name:typeof y}),ee("error"))}),()=>x.abort()},[a.app.id,le,j]),p.useEffect(()=>{const n=se.current;if(!n||!L.current)return;D(!1);const g=requestAnimationFrame(()=>{if(!L.current)return;const x=c.status==="streaming"||globalThis.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(g)},[c.messages,c.progress,c.status]);const He=()=>{const n=se.current;if(!n)return;const g=Ss(n);L.current=g,D(!g&&K.current.messages.length>0)},ze=()=>{const n=se.current;if(!n)return;L.current=!0,D(!1);const g=ws();typeof n.scrollTo=="function"?n.scrollTo({top:n.scrollHeight,behavior:g}):n.scrollTop=n.scrollHeight},_e=async(n,g)=>{const x=n.trim(),y=K.current,E=g?.regenerateFrom,me=j.regenerate;if(!x||N!=="ready"||y.status==="streaming"||U.current||E&&!me)return;if(d.countCodePointsUpTo(x,d.MAKE_AI_CONVERSATION_LIMITS.messageCharacters)>d.MAKE_AI_CONVERSATION_LIMITS.messageCharacters){T(`输入内容过长,请控制在 ${d.MAKE_AI_CONVERSATION_LIMITS.messageCharacters} 个字符以内`);return}const re={id:E?.userMessage.id??ms("user"),content:x},ie=E?Es(y,E.userMessage.id):d.appendUserMessage(y,re),oe=new AbortController,H=q.current+1;q.current=H,U.current=oe,T(void 0),M(void 0),D(!L.current&&y.messages.length>0),E||$(""),_(ie);try{let S=!1,I,Ae=0,je=0,ve=0,ue=0,W=0;const J=new Map,Ie=new Set,ye=new Set([...ie.messages.map(ce=>ce.id),re.id]),Q=new Set,ke=C.createArtifactCapabilities(fe),be={signal:oe.signal};let pe;if(E){if(!me)throw new h("当前 AI 助手不支持重新生成");pe=me({threadId:ie.threadId,message:re,assistantMessage:{id:E.assistantMessage.id,content:E.assistantMessage.content},context:a,capabilities:ke},be)}else pe=j.run({threadId:ie.threadId,message:re,context:a,capabilities:ke},be);const Ne=pe[Symbol.asyncIterator]();for(B.current={iterator:Ne,requestVersion:H};;){const ce=await Ne.next();if(q.current!==H||ce.done)break;let l;try{l=d.parseAssistantEvent(ce.value)}catch(k){throw new h(k instanceof Error?k.message:"Invalid assistant event")}if(l.type==="message.start"){if(I!==void 0&&I!==l.runId)throw new h("AI 助手响应 run id 不一致");if(I??=l.runId,je+=1,je>d.MAKE_AI_CONVERSATION_LIMITS.assistantMessagesPerRun)throw new h("AI 助手单次响应消息数量超过限制");if(ye.has(l.messageId))throw new h("AI 助手响应包含重复的 message id");ye.add(l.messageId),Q.add(l.messageId),J.set(l.messageId,0)}if(l.type==="message.delta"){if(!Q.has(l.messageId))throw new h("AI 助手响应事件顺序无效");const k=J.get(l.messageId)??0,z=d.countCodePointsUpTo(l.delta,d.MAKE_AI_CONVERSATION_LIMITS.messageCharacters-W);if(W+z>d.MAKE_AI_CONVERSATION_LIMITS.messageCharacters)throw new h("AI 助手响应文本超过大小限制");W+=z,J.set(l.messageId,k+z)}if(l.type==="message.replace"){if(!Q.has(l.messageId))throw new h("AI 助手响应事件顺序无效");const k=J.get(l.messageId)??0,z=d.countCodePointsUpTo(l.content,d.MAKE_AI_CONVERSATION_LIMITS.messageCharacters),Te=W-k+z;if(Te>d.MAKE_AI_CONVERSATION_LIMITS.messageCharacters)throw new h("AI 助手响应文本超过大小限制");W=Te,J.set(l.messageId,z)}if(l.type==="run.progress"){if(I!==void 0&&I!==l.runId)throw new h("AI 助手响应 run id 不一致");if(I??=l.runId,ve+=1,ve>d.MAKE_AI_CONVERSATION_LIMITS.progressStepsPerRun)throw new h("AI 助手处理过程数量超过限制");const k=d.countCodePointsUpTo(l.message,d.MAKE_AI_CONVERSATION_LIMITS.progressCharactersPerRun-ue);if(ue+k>d.MAKE_AI_CONVERSATION_LIMITS.progressCharactersPerRun)throw new h("AI 助手处理过程文本超过大小限制");ue+=k}if(l.type==="artifact"){if(!Q.has(l.messageId))throw new h("AI 助手响应事件顺序无效");if(Ae+=1,Ae>d.MAKE_AI_CONVERSATION_LIMITS.artifactsPerRun)throw new h("AI 助手单次响应 Artifact 数量超过限制");if(Ie.has(l.artifact.id))throw new h("AI 助手响应包含重复的 Artifact id");Ie.add(l.artifact.id)}if(l.type==="message.complete"&&!Q.delete(l.messageId))throw new h("AI 助手响应事件顺序无效");if(l.type==="run.complete"&&I!==void 0&&I!==l.runId)throw new h("AI 助手响应 run id 不一致");if(l.type==="run.cancelled"&&l.runId!==void 0&&I!==void 0&&I!==l.runId)throw new h("AI 助手响应 run id 不一致");if(_(k=>d.reduceAssistantEvent(k,l)),l.type==="error"||l.type==="run.cancelled"||l.type==="run.complete"){S=!0;break}}if(!S)throw new h("AI 助手流式响应在终止事件前结束")}catch(S){if(q.current!==H)return;if(oe.signal.aborted){_(I=>d.reduceAssistantEvent(I,{type:"run.cancelled"}));return}console.error("[make-ai-assistant] assistant run failed",{appId:a.app.id,errorType:S instanceof Error?S.name:typeof S}),_(I=>d.reduceAssistantEvent(I,{type:"error",code:"TRANSPORT_ERROR",message:S instanceof h?S.message:"连接失败,请重试",retryable:!0}))}finally{q.current===H&&U.current===oe&&(U.current=void 0),B.current?.requestVersion===H&&(Me(B.current.iterator),B.current=void 0)}},ae=n=>_e(n),Ze=n=>_e(n.userMessage.content,{regenerateFrom:n}),Ge=async(n,g)=>{try{await fs(g),M({messageId:n,message:"已复制",status:"success"})}catch(x){console.error("[make-ai-assistant] copy answer failed",{errorType:x instanceof Error?x.name:typeof x}),M({messageId:n,message:"复制失败",status:"error"})}},Ye=n=>{n.preventDefault(),ae(R)},We=n=>{n.key==="Enter"&&!n.shiftKey&&!n.nativeEvent.isComposing&&(n.preventDefault(),ae(R))},Je=()=>{te("stop")&&_(n=>d.reduceAssistantEvent(n,{type:"run.cancelled"}))},Qe=()=>{te("new-conversation"),$(""),T(void 0),M(void 0),D(!1),L.current=!0,_(d.createAssistantConversationState()),m?.()},Xe=j.features?.remoteCancellation===!1?"停止接收":"停止生成",es=Ve(c),ss=Pe(c),ne=Ms(c),ts=typeof j.regenerate=="function"&&j.features?.regeneration!==!1,xe=()=>{ne&&ae(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:f??`当前应用:${a.app.name??"未命名应用"}`})]}),e.jsxs("div",{className:"make-ai-assistant__header-actions",children:[j.features?.newConversation!==!1?e.jsx("button",{"aria-label":"新建对话",className:"make-ai-assistant__icon-button",type:"button",onClick:Qe,children:e.jsx(js,{})}):null,o?e.jsx("button",{"aria-label":`关闭 ${F}`,className:"make-ai-assistant__icon-button",type:"button",onClick:o,children:e.jsx(gs,{})}):null]})]}),e.jsxs("div",{className:"make-ai-assistant__privacy-note",role:"note",children:[e.jsx("span",{className:"make-ai-assistant__privacy-icon","aria-hidden":"true",children:e.jsx(xs,{})}),e.jsx("span",{children:"当前页面上下文会随请求发送,最终以宿主服务端对当前登录人的权限校验为准"})]}),e.jsxs("div",{className:"make-ai-assistant__body","aria-live":"polite","aria-relevant":"additions text",ref:se,role:"log",onScroll:He,children:[N==="loading"?e.jsxs("div",{className:"make-ai-assistant__empty",role:"status",children:[e.jsx(X,{}),e.jsx("h3",{children:"正在恢复对话"}),e.jsx("p",{children:"正在读取当前 App 的历史消息…"})]}):N==="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:()=>de(n=>n+1),children:"重新加载"})]}):c.messages.length===0?e.jsxs("div",{className:"make-ai-assistant__empty",children:[e.jsx(X,{}),e.jsx("h3",{children:"有什么可以帮你?"}),e.jsx("p",{children:"我会结合当前 App、页面位置和宿主允许的上下文回答,并把过程与结果分开展示。"})]}):Rs(c,a,fe,r,i,s,ne?xe:void 0,b,O,P,ts,(n,g)=>{Ge(n,g)},n=>{Ze(n)}),c.progress&&!es?e.jsx(Se,{assistantName:s,progress:c.progress}):null,c.error&&!ss?e.jsx(Se,{assistantName:s,error:c.error,onRetry:ne?xe:void 0}):null]}),qe?e.jsx("button",{"aria-label":"回到最新消息",className:"make-ai-assistant__back-to-latest",type:"button",onClick:ze,children:e.jsx(As,{})}):null,e.jsxs("footer",{className:"make-ai-assistant__composer-region",children:[N==="ready"&&ge.length>0&&c.messages.length===0?e.jsx("div",{className:"make-ai-assistant__suggestions","aria-label":"推荐问题",children:ge.map((n,g)=>e.jsx("button",{type:"button",onClick:()=>{ae(n)},children:n},`${g}-${n}`))}):null,e.jsxs("form",{className:"make-ai-assistant__composer",onSubmit:Ye,children:[e.jsx("textarea",{"aria-label":`向 ${s} 提问`,"aria-describedby":V?"make-ai-composer-error":void 0,"aria-invalid":V?!0:void 0,autoFocus:!0,disabled:N!=="ready"||c.status==="streaming",placeholder:`询问当前 ${a.app.name??"App"} 中的数据…`,rows:2,value:R,onChange:n=>{$(n.currentTarget.value),T(void 0)},onKeyDown:We}),c.status==="streaming"?e.jsx("button",{"aria-label":Xe,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:N!=="ready"||!R.trim(),type:"submit",children:e.jsx(vs,{})})]}),V?e.jsx("p",{id:"make-ai-composer-error",role:"alert",children:V}):null,e.jsx("p",{children:"AI 生成的结果可能存在偏差,重要数据请核对明细。"})]})]})}function $s({defaultOpen:s=!1,hideLauncher:t=!1,launcher:a,onOpenChange:r,open:i,...o}){const m=Oe(o.brandName,o.title),[u,f]=p.useState(s),v=p.useRef(null),A=i??u,j=b=>{i===void 0&&f(b),r?.(b),b||requestAnimationFrame(()=>v.current?.focus())},O=()=>j(!A);return p.useEffect(()=>{if(!A)return;const b=F=>{F.key==="Escape"&&(j(!1),requestAnimationFrame(()=>v.current?.focus()))};return document.addEventListener("keydown",b),()=>document.removeEventListener("keydown",b)},[r,A]),e.jsxs("div",{className:"make-ai-assistant","data-open":A||void 0,children:[!t&&(!A||a)?a?a({open:A,toggle:O}):e.jsxs("button",{"aria-label":A?`关闭 ${m}`:`打开 ${m}`,"aria-expanded":A,className:"make-ai-assistant__launcher",ref:v,type:"button",onClick:O,children:[e.jsx("span",{className:"make-ai-assistant__launcher-orbit","aria-hidden":"true"}),e.jsx(Fe,{})]}):null,A?e.jsx("aside",{"aria-label":m,"aria-modal":"false",className:"make-ai-assistant__drawer",role:"dialog",children:e.jsx(Be,{...o,onClose:()=>j(!1)})}):null]})}exports.createArtifactCapabilities=C.createArtifactCapabilities;exports.createArtifactTemplateRegistry=C.createArtifactTemplateRegistry;exports.extendArtifactTemplateRegistry=C.extendArtifactTemplateRegistry;exports.resolveArtifactTemplate=C.resolveArtifactTemplate;exports.MAKE_AI_ARTIFACT_KINDS=d.MAKE_AI_ARTIFACT_KINDS;exports.MAKE_AI_ARTIFACT_LIMITS=d.MAKE_AI_ARTIFACT_LIMITS;exports.MAKE_AI_ARTIFACT_SCHEMA_VERSION=d.MAKE_AI_ARTIFACT_SCHEMA_VERSION;exports.MAKE_AI_CONVERSATION_LIMITS=d.MAKE_AI_CONVERSATION_LIMITS;exports.appendUserMessage=d.appendUserMessage;exports.createAssistantConversationState=d.createAssistantConversationState;exports.parseArtifact=d.parseArtifact;exports.parseAssistantEvent=d.parseAssistantEvent;exports.reduceAssistantEvent=d.reduceAssistantEvent;exports.validateArtifact=d.validateArtifact;exports.ArtifactRenderer=we;exports.AssistantPanel=Be;exports.MakeAiAssistant=$s;exports.createPlatformArtifactRegistry=Le;exports.formatArtifactValue=w;exports.platformArtifactTemplates=$e;