@qfei-design/make-ai-assistant 0.1.6 → 0.1.8

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