@qfei-design/make-ai-assistant 0.2.3 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PUBLIC_API.md +17 -3
- package/README.md +44 -4
- package/dist/react/artifact-renderer.d.ts +4 -2
- package/dist/react/artifact-templates.d.ts +3 -0
- package/dist/react/index.d.ts +1 -0
- package/dist/react/make-ai-assistant.d.ts +2 -0
- package/dist/react/theme.d.ts +45 -0
- package/dist/react.cjs +4 -4
- package/dist/react.mjs +829 -658
- package/dist/styles.css +125 -51
- package/package.json +1 -1
package/PUBLIC_API.md
CHANGED
|
@@ -40,13 +40,16 @@ Fetch SSE 实现时,从 `/sse` 入口导入 `createSseAssistantTransport`。
|
|
|
40
40
|
- `MakeAiAssistant`:默认右侧居中浮动入口与右侧抽屉;支持受控开关、自定义 launcher,以及
|
|
41
41
|
`brandName` 对默认“{品牌名} AI 助手”标题的覆盖。`title` 可覆盖完整标题;`assistantName` /
|
|
42
42
|
`userName` / `userAvatarUrl` 可显示当前登录人的名称和头像;未传入时用户侧不显示身份信息。
|
|
43
|
-
`subtitle`
|
|
44
|
-
|
|
43
|
+
`subtitle` 用于显示宿主传入的当前对象(兼容移除旧接入中的“只读分析 ·”前缀);`privacyNotice`
|
|
44
|
+
会在对象右侧的问号 Tooltip 中展示,并根据图标与可用视口选择相邻方向,而非单独的广播行。头栏默认高度为 50px,可通过 `headerHeight` 或
|
|
45
45
|
`--make-ai-header-height` 覆盖。浮动入口位置可通过
|
|
46
46
|
`--make-ai-launcher-top`、`--make-ai-launcher-right` 和 `--make-ai-launcher-mobile-right` 覆盖。
|
|
47
47
|
桌面端抽屉可从左边缘 12px 热区向左拖宽,初始计算宽度(默认 432px,或宿主的
|
|
48
|
-
`--make-ai-drawer-width
|
|
48
|
+
`--make-ai-drawer-width`)同时作为拖拽下限;热区激活时展示 2px 主题色提示线,宿主可通过
|
|
49
|
+
`--make-ai-drawer-resize-line` 覆盖其颜色;手柄支持左右方向键微调。小于 560px 的视口保持全宽,
|
|
49
50
|
不提供宽度调整。
|
|
51
|
+
面板按自身容器宽度适配:达到 560px 时扩展内容区间距和阅读宽度,达到 760px 时 Markdown 表格
|
|
52
|
+
优先按可用宽度分列并换行;宿主可使用 `--make-ai-panel-gutter-wide` 覆盖扩展状态内边距。
|
|
50
53
|
首次打开后关闭抽屉只隐藏 Drawer,不卸载 `AssistantPanel`,不会中断正在进行的生成。
|
|
51
54
|
重新打开时会恢复消息滚动意图;空闲时聚焦输入框,生成中聚焦停止按钮。
|
|
52
55
|
省略 `suggestions` 时显示包内默认推荐问题,传入 `[]` 时隐藏推荐问题。
|
|
@@ -62,6 +65,17 @@ Fetch SSE 实现时,从 `/sse` 入口导入 `createSseAssistantTransport`。
|
|
|
62
65
|
- `ReactArtifactTemplateRegistry`
|
|
63
66
|
- `formatArtifactValue`
|
|
64
67
|
|
|
68
|
+
`MakeAiAssistant`、`AssistantPanel` 和 `ArtifactRenderer` 均支持 `theme?: MakeAiTheme`。`primary` 为必填,
|
|
69
|
+
其余可选字段包括 `primaryHover`、`onPrimary`、`background`、`surface`、`surfaceStrong`、`text`、
|
|
70
|
+
`textSecondary`、`border`、`overlay` 和 `onOverlay`。主题仅写入组件根节点的局部
|
|
71
|
+
`--make-ai-theme-*` 变量,不覆盖宿主全局样式。颜色优先级为 `theme` 属性 >
|
|
72
|
+
`--make-ai-theme-*` 变量 > 其他 `--make-ai-*` 覆盖变量 > 宿主 `--make-color-*` 变量 > 包内默认值;传入
|
|
73
|
+
`theme` 后,未提供的可选颜色也会由 `primary` 派生,确保 AI 包不混入宿主另一套颜色。边框、表面、阴影、
|
|
74
|
+
Tooltip、强调图标和拖拽线均会跟随主题主色,语义成功/告警/错误色保持独立。主色偏浅时,宿主应提供有足够对比度的
|
|
75
|
+
`onPrimary`。`ArtifactRenderer` 的平台内置模板会将主题变量
|
|
76
|
+
直接写入既有 Artifact 根节点,不新增 DOM 包装;自定义模板可从 `ArtifactTemplateRenderContext.theme` 与
|
|
77
|
+
`themeStyle` 读取同一主题并应用到自身根节点。
|
|
78
|
+
|
|
65
79
|
`ArtifactRenderer`、`AssistantPanel` 和 `MakeAiAssistant` 支持 `onActionError`。当宿主
|
|
66
80
|
`onAction` 同步抛错或返回 rejected Promise 时,包会把错误、动作和上下文交还给
|
|
67
81
|
`onActionError`;未提供回调时只记录不含敏感上下文的失败日志,不产生未处理的
|
package/README.md
CHANGED
|
@@ -18,6 +18,7 @@ export function AppAssistant() {
|
|
|
18
18
|
return (
|
|
19
19
|
<MakeAiAssistant
|
|
20
20
|
brandName="销售管理"
|
|
21
|
+
theme={{ primary: "#0f8277" }}
|
|
21
22
|
context={{
|
|
22
23
|
app: { id: "sales-app", name: "销售管理" },
|
|
23
24
|
location: { pathname: window.location.pathname },
|
|
@@ -45,12 +46,51 @@ export function AppAssistant() {
|
|
|
45
46
|
覆盖默认的 `Make` 品牌,面板会显示为“{品牌名} AI 助手”;传入 `title` 时则使用完整标题覆盖。
|
|
46
47
|
`assistantName` 可覆盖 AI 消息显示名称。这些显示配置只用于 React UI,不会随会话上下文发送到
|
|
47
48
|
AI transport;进度和可重试错误会显示在对应的 AI 回合中。
|
|
48
|
-
`subtitle` 用于展示宿主传入的当前对象;未传入时回退为当前 App
|
|
49
|
-
`privacyNotice`
|
|
50
|
-
|
|
49
|
+
`subtitle` 用于展示宿主传入的当前对象;未传入时回退为当前 App 名称,并兼容移除旧接入中的“只读分析 ·”前缀。宿主传入
|
|
50
|
+
`privacyNotice` 时,面板会在当前对象右侧显示可聚焦的问号图标,鼠标悬浮或键盘聚焦后会根据图标与可用视口选择相邻方向展示该提示;
|
|
51
|
+
不传入或传入空白内容时不显示图标。标题右侧紧随标题展示“只读”状态标签,长标题会省略显示并保留原文
|
|
51
52
|
`title` 属性。头栏默认高度为 50px,可通过 `headerHeight` 属性或 `--make-ai-header-height` 主题变量覆盖。
|
|
52
53
|
|
|
53
|
-
|
|
54
|
+
## Theme integration
|
|
55
|
+
|
|
56
|
+
`MakeAiAssistant`、`AssistantPanel` 和 `ArtifactRenderer` 都支持同一个 `theme` 属性。传入宿主主色后,
|
|
57
|
+
入口、图标、只读标签、焦点、主操作、进度点、结构化结果、边框、浅色表面、浮层阴影及抽屉拖拽线会从该主色派生,
|
|
58
|
+
避免与宿主应用主题割裂;成功、告警和错误仍使用独立语义色。
|
|
59
|
+
|
|
60
|
+
```tsx
|
|
61
|
+
import type { MakeAiTheme } from "@qfei-design/make-ai-assistant/react";
|
|
62
|
+
|
|
63
|
+
const hostTheme: MakeAiTheme = {
|
|
64
|
+
primary: "#0f8277",
|
|
65
|
+
primaryHover: "#09685f",
|
|
66
|
+
onPrimary: "#f7fffc",
|
|
67
|
+
background: "#f5fbf8",
|
|
68
|
+
surface: "#eef8f4",
|
|
69
|
+
surfaceStrong: "#dff2eb",
|
|
70
|
+
text: "#173f38",
|
|
71
|
+
textSecondary: "#3c685f",
|
|
72
|
+
border: "#b8d8cf",
|
|
73
|
+
overlay: "#123f37",
|
|
74
|
+
onOverlay: "#f7fffc",
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
<MakeAiAssistant theme={hostTheme} {...assistantProps} />;
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
`primary` 为必填项;其余字段可省略并直接由主色派生,因此传入 `theme` 后不会再混入宿主已有的其他颜色变量。
|
|
81
|
+
若主色偏浅,请传入具有足够对比度的
|
|
82
|
+
`onPrimary`。优先级为 `theme` 属性 > `--make-ai-theme-*` 变量 > 其他 `--make-ai-*` 变量 >
|
|
83
|
+
宿主 `--make-color-*` 变量 > 包内默认值。
|
|
84
|
+
不使用 React 属性时,也可在组件外层设置 `--make-ai-theme-primary`、`--make-ai-theme-primary-hover`、
|
|
85
|
+
`--make-ai-theme-on-primary`、`--make-ai-theme-bg`、`--make-ai-theme-surface`、`--make-ai-theme-text` 和
|
|
86
|
+
`--make-ai-theme-surface-strong`、`--make-ai-theme-text-secondary`、`--make-ai-theme-border`、
|
|
87
|
+
`--make-ai-theme-overlay`、`--make-ai-theme-on-overlay`;这些变量只在 AI 包的命名空间内生效。
|
|
88
|
+
平台内置 Artifact 会把主题变量直接写入原有根节点,不增加布局或 DOM 层级;自定义模板如返回自定义组件或
|
|
89
|
+
Fragment,可从 `renderContext.themeStyle` 取到同一组变量并应用到自身根节点。
|
|
90
|
+
|
|
91
|
+
桌面端抽屉默认宽度为 432px,且该初始宽度是用户拖拽时的最小宽度。鼠标移至抽屉左边缘的 12px 热区时才会显示 2px 主题色拖拽提示线(可通过 `--make-ai-drawer-resize-line` 覆盖),可向左拖宽;获得焦点后也可用左、右方向键以 16px 调整宽度。小于 560px 的视口保持全宽展示,不显示拖拽手柄。
|
|
92
|
+
|
|
93
|
+
面板使用容器查询而非页面视口响应宽度:抽屉达到 560px 时会增加内边距、正文可读宽度和结构化内容密度;达到 760px 时 Markdown 表格会优先按可用宽度分列并换行。宿主可通过 `--make-ai-panel-gutter-wide` 覆盖扩展抽屉的内边距。
|
|
54
94
|
|
|
55
95
|
成功的 AI 回答会显示仅含图标的复制按钮,鼠标悬浮或键盘聚焦时显示“复制”提示,按钮保留
|
|
56
96
|
“复制回答”的无障碍名称;复制只处理该回答的文本内容,失败时会在本地 UI 内提示,不会把回答正文写入日志。AI 回答正文会按标题、
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
2
|
import { type ArtifactActionErrorHandler, type ArtifactActionHandler, type ArtifactTemplateRegistry, type MakeAiArtifact, type MakeAssistantHostContext } from "../core/index.js";
|
|
3
3
|
import type { ArtifactTemplateRenderContext } from "./artifact-templates.js";
|
|
4
|
+
import { type MakeAiTheme } from "./theme.js";
|
|
4
5
|
export interface ArtifactRendererProps {
|
|
5
6
|
artifact: MakeAiArtifact;
|
|
6
7
|
context: MakeAssistantHostContext;
|
|
@@ -8,5 +9,6 @@ export interface ArtifactRendererProps {
|
|
|
8
9
|
onAction?: ArtifactActionHandler;
|
|
9
10
|
onActionError?: ArtifactActionErrorHandler;
|
|
10
11
|
fallback?: (artifact: MakeAiArtifact) => ReactNode;
|
|
12
|
+
theme?: MakeAiTheme;
|
|
11
13
|
}
|
|
12
|
-
export declare function ArtifactRenderer({ artifact, context, fallback, onAction, onActionError, registry, }: ArtifactRendererProps):
|
|
14
|
+
export declare function ArtifactRenderer({ artifact, context, fallback, onAction, onActionError, registry, theme, }: ArtifactRendererProps): ReactNode;
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
2
|
import { type ArtifactActionErrorHandler, type ArtifactActionHandler, type ArtifactTemplate, type ArtifactTemplateRegistry, type MakeAssistantHostContext } from "../core/index.js";
|
|
3
|
+
import type { MakeAiTheme, MakeAiThemeStyle } from "./theme.js";
|
|
3
4
|
export interface ArtifactTemplateRenderContext {
|
|
4
5
|
context: MakeAssistantHostContext;
|
|
5
6
|
onAction?: ArtifactActionHandler;
|
|
6
7
|
onActionError?: ArtifactActionErrorHandler;
|
|
8
|
+
theme?: MakeAiTheme;
|
|
9
|
+
themeStyle?: MakeAiThemeStyle;
|
|
7
10
|
}
|
|
8
11
|
export type ReactArtifactTemplate = ArtifactTemplate<ReactNode, ArtifactTemplateRenderContext>;
|
|
9
12
|
export type ReactArtifactTemplateRegistry = ArtifactTemplateRegistry<ReactNode, ArtifactTemplateRenderContext>;
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { type ReactNode } from "react";
|
|
2
2
|
import { type ArtifactActionHandler, type ArtifactActionErrorHandler, type AssistantTransport, type MakeAssistantHostContext } from "../core/index.js";
|
|
3
3
|
import { type ReactArtifactTemplateRegistry } from "./artifact-templates.js";
|
|
4
|
+
import { type MakeAiTheme } from "./theme.js";
|
|
4
5
|
export interface AssistantPanelProps {
|
|
5
6
|
context: MakeAssistantHostContext;
|
|
6
7
|
transport: AssistantTransport;
|
|
7
8
|
registry?: ReactArtifactTemplateRegistry;
|
|
8
9
|
brandName?: string;
|
|
9
10
|
assistantName?: string;
|
|
11
|
+
theme?: MakeAiTheme;
|
|
10
12
|
privacyNotice?: string;
|
|
11
13
|
headerHeight?: number | string;
|
|
12
14
|
userName?: string;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { CSSProperties } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* 宿主传入的 AI 助手主题。未提供的字段会继续使用 CSS 主题变量与默认值。
|
|
4
|
+
*/
|
|
5
|
+
export interface MakeAiTheme {
|
|
6
|
+
/** 宿主主色,用于入口、强调、焦点与主要操作。 */
|
|
7
|
+
primary: string;
|
|
8
|
+
/** 主色的悬浮态;未提供时由主色与文字色自动混合。 */
|
|
9
|
+
primaryHover?: string;
|
|
10
|
+
/** 主色背景上的前景色;主色偏浅时应显式传入深色。 */
|
|
11
|
+
onPrimary?: string;
|
|
12
|
+
/** 面板基础背景色。 */
|
|
13
|
+
background?: string;
|
|
14
|
+
/** 卡片、输入框等承载内容的表面色。 */
|
|
15
|
+
surface?: string;
|
|
16
|
+
/** 禁用态、头像底色和轨道等更深一层的表面色。 */
|
|
17
|
+
surfaceStrong?: string;
|
|
18
|
+
/** 主文字色。 */
|
|
19
|
+
text?: string;
|
|
20
|
+
/** 辅助说明、次要标签和坐标文字色。 */
|
|
21
|
+
textSecondary?: string;
|
|
22
|
+
/** 分隔线与边框色。 */
|
|
23
|
+
border?: string;
|
|
24
|
+
/** Tooltip 等高对比浮层背景色。 */
|
|
25
|
+
overlay?: string;
|
|
26
|
+
/** 浮层背景上的前景色。 */
|
|
27
|
+
onOverlay?: string;
|
|
28
|
+
}
|
|
29
|
+
export type MakeAiThemeStyle = CSSProperties & {
|
|
30
|
+
"--make-ai-theme-bg"?: string;
|
|
31
|
+
"--make-ai-theme-border"?: string;
|
|
32
|
+
"--make-ai-theme-on-primary"?: string;
|
|
33
|
+
"--make-ai-theme-primary"?: string;
|
|
34
|
+
"--make-ai-theme-primary-hover"?: string;
|
|
35
|
+
"--make-ai-theme-surface"?: string;
|
|
36
|
+
"--make-ai-theme-surface-strong"?: string;
|
|
37
|
+
"--make-ai-theme-text"?: string;
|
|
38
|
+
"--make-ai-theme-text-secondary"?: string;
|
|
39
|
+
"--make-ai-theme-overlay"?: string;
|
|
40
|
+
"--make-ai-theme-on-overlay"?: string;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* 将公开主题输入收敛为局部 CSS 变量,避免修改宿主全局主题。
|
|
44
|
+
*/
|
|
45
|
+
export declare const createMakeAiThemeStyle: (theme: MakeAiTheme | undefined) => MakeAiThemeStyle | undefined;
|
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"),q=require("./index.cjs"),u=require("react"),d=require("./conversation-Cv1wdvCR.cjs");function Ye({artifact:s,context:t,fallback:a,onAction:r,onActionError:n,registry:i}){const c=q.resolveArtifactTemplate(i,s,t);if(!c)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 h={context:t,onAction:r,onActionError:n};return c.template.render(s,t,h)}const U=(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,n={maximumFractionDigits:r??2,minimumFractionDigits:r};t?.style==="currency"&&t.currency?(n.style="currency",n.currency=t.currency):t?.style==="percent"&&(n.style="percent");try{const i=t?.style==="percent"?s/100:s;return`${new Intl.NumberFormat(a,n).format(i)}${t?.unit??""}`}catch{return`${s}${t?.unit??""}`}},Ge=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}},Qe=(s,t,a)=>{if(!a.onAction)return;const r=i=>{console.error("[make-ai-assistant] host action error handler failed",{actionId:s.id,artifactId:t.artifact.id,errorType:i instanceof Error?i.name:typeof i,intent:s.intent})},n=i=>{if(a.onActionError){try{Promise.resolve(a.onActionError(i,s,t)).catch(r)}catch(c){r(c)}return}console.error("[make-ai-assistant] host action failed",{actionId:s.id,artifactId:t.artifact.id,errorType:i instanceof Error?i.name:typeof i,intent:s.intent})};try{Promise.resolve(a.onAction(s,t)).catch(n)}catch(i){n(i)}},ae=(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:()=>Qe(a,{artifact:s,context:t.context},t),children:[a.label,e.jsx("span",{"aria-hidden":"true",children:"→"})]},a.id))}):null,ne=(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]}),ys=({artifact:s,renderContext:t})=>{const a=s.data.delta,r=a?U(a.value,a.format==="percent"?{style:"percent"}:void 0,t.context.locale):void 0;return ne(s,e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"make-ai-artifact__metric-value",children:U(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,ae(s,t)]}),"make-ai-artifact--metric")},ks=({artifact:s,renderContext:t})=>ne(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:U(a.value,a.format,t.context.locale)}),a.hint?e.jsx("small",{children:a.hint}):null]},a.id))}),ae(s,t)]}),"make-ai-artifact--comparison"),bs=({artifact:s,renderContext:t})=>{const a=s.data.series.flatMap(c=>c.points.map(h=>h.y)),{max:r,min:n}=Ge(a),i=r-n||1;return ne(s,e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"make-ai-artifact__trend",children:s.data.series.map(c=>e.jsxs("div",{className:"make-ai-artifact__trend-series",children:[e.jsx("div",{className:"make-ai-artifact__trend-label",children:c.label}),e.jsx("div",{className:"make-ai-artifact__trend-bars",children:c.points.map((h,I)=>{const g=18+(h.y-n)/i*70;return e.jsxs("div",{className:"make-ai-artifact__trend-point",children:[e.jsx("span",{"aria-label":`${h.x}: ${U(h.y,c.format,t.context.locale)}`,className:"make-ai-artifact__trend-bar",role:"img",style:{height:`${g}%`},title:`${h.x}: ${U(h.y,c.format,t.context.locale)}`}),e.jsx("small",{children:h.x})]},`${h.x}-${I}`)})})]},c.id))}),ae(s,t)]}),"make-ai-artifact--trend")},ws=({artifact:s,renderContext:t})=>{const{max:a}=Ge(s.data.items.map(n=>Math.abs(n.value))),r=Math.max(a,1);return ne(s,e.jsxs(e.Fragment,{children:[e.jsx("ol",{className:"make-ai-artifact__ranking",children:s.data.items.map((n,i)=>e.jsxs("li",{children:[e.jsx("span",{className:"make-ai-artifact__rank",children:i+1}),e.jsxs("span",{className:"make-ai-artifact__ranking-label",children:[e.jsx("span",{children:n.label}),n.description?e.jsx("small",{children:n.description}):null]}),e.jsx("span",{className:"make-ai-artifact__ranking-track","aria-hidden":"true",children:e.jsx("span",{style:{width:`${Math.abs(n.value)/r*100}%`}})}),e.jsx("strong",{children:U(n.value,n.format,t.context.locale)})]},n.id))}),ae(s,t)]}),"make-ai-artifact--ranking")},Ns=(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}},Ms=({artifact:s,renderContext:t})=>ne(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=Ns(s,a),n=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(i=>e.jsxs("span",{children:[e.jsx("small",{children:i.label}),U(a.values[i.key],i.format,t.context.locale)]},i.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:()=>Qe(r,{artifact:s,context:t.context},t),children:n},a.id):e.jsx("div",{className:"make-ai-artifact__record",children:n},a.id)})}),s.data.total!==void 0?e.jsxs("p",{className:"make-ai-artifact__record-total",children:["共 ",s.data.total," 条"]}):null,ae(s,t)]}),"make-ai-artifact--record-list"),Ts=({artifact:s,renderContext:t})=>ne(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})]}),ae(s,t)]}),"make-ai-artifact--notice"),te=(s,t,a)=>({id:s,kinds:[t],priority:0,render:a}),Es=[te("platform.metric.default","metric",(s,t,a)=>e.jsx(ys,{artifact:s,renderContext:a})),te("platform.comparison.default","comparison",(s,t,a)=>e.jsx(ks,{artifact:s,renderContext:a})),te("platform.trend.default","trend",(s,t,a)=>e.jsx(bs,{artifact:s,renderContext:a})),te("platform.ranking.default","ranking",(s,t,a)=>e.jsx(ws,{artifact:s,renderContext:a})),te("platform.record-list.default","record-list",(s,t,a)=>e.jsx(Ms,{artifact:s,renderContext:a})),te("platform.notice.default","notice",(s,t,a)=>e.jsx(Ts,{artifact:s,renderContext:a}))],Je=q.createArtifactTemplateRegistry(Es).templates,es=(s=Je)=>q.createArtifactTemplateRegistry(s),Ss=s=>`${s}-${Date.now()}-${Math.random().toString(36).slice(2,9)}`,Rs="Make",Cs=["总结当前页面数据","找出需要关注的记录","列出我有权限查看的数据对象"],ss=(s,t)=>t??`${s?.trim()||Rs} AI 助手`,$s=s=>s??Cs,Ls=432,Ue=16,qe=(s,t,a)=>Math.min(Math.max(s,Math.min(t,a)),a),Fs=s=>typeof s=="number"?Number.isFinite(s)?`${s}px`:void 0:s?.trim()||void 0;class j extends Error{}const ve=(s,t)=>{if(!(typeof s!="object"||s===null))return s[t]},Os=s=>{const t=ve(s,"status");return typeof t=="number"?t:ve(ve(s,"response"),"status")},Ds=s=>{const t=ve(s,"code"),a=Os(s),r=s instanceof Error?s.message:"",n=[t,r].filter(I=>typeof I=="string").join(" ").toLowerCase(),c=globalThis.navigator?.onLine===!1||/network|fetch|timeout|offline|connection|网络|连接|超时/.test(n),h=typeof a=="number"&&a>=500||/server|service|服务器|服务异常/.test(n);return c?{actionLabel:"重新连接",description:"请检查网络后再试。",kind:"network",label:"网络连接",title:"网络连接不可用"}:h?{actionLabel:"重新加载",description:"服务暂时未能响应,请稍后重试。",kind:"service",label:"服务异常",title:"服务暂时不可用"}:{actionLabel:"重新加载",description:"请稍后重试;若问题持续出现,请联系管理员。",kind:"unknown",label:"加载异常",title:"暂时无法加载对话"}},He=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})}},Ps=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")},ts=()=>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"})]}),Ks=()=>e.jsx("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:e.jsx("path",{d:"m6 6 12 12M18 6 6 18"})}),Vs=()=>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"})]}),Ws=()=>e.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[e.jsx("path",{d:"M20 11a8 8 0 0 0-14.7-4.4L4 8"}),e.jsx("path",{d:"M4 4v4h4"}),e.jsx("path",{d:"M4 13a8 8 0 0 0 14.7 4.4L20 16"}),e.jsx("path",{d:"M20 20v-4h-4"})]}),Bs=()=>e.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[e.jsx("circle",{cx:"12",cy:"12",r:"8"}),e.jsx("path",{d:"M9.8 9.4a2.35 2.35 0 1 1 3.93 1.73c-.96.86-1.73 1.42-1.73 2.87"}),e.jsx("path",{d:"M12 17h.01"})]}),zs=()=>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"})]}),Us=()=>e.jsx("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:e.jsx("path",{d:"M12 5v14M5 12h14"})}),qs=()=>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"})]}),as=()=>e.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[e.jsx("path",{d:"M20 11a8 8 0 0 0-14.7-4.4L4 8"}),e.jsx("path",{d:"M4 4v4h4"}),e.jsx("path",{d:"M4 13a8 8 0 0 0 14.7 4.4L20 16"}),e.jsx("path",{d:"M20 20v-4h-4"})]}),Hs=()=>e.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[e.jsx("circle",{cx:"12",cy:"12",r:"8"}),e.jsx("path",{d:"M12 8v4.5"}),e.jsx("path",{d:"M12 16h.01"})]}),je=({className:s=""})=>e.jsx("span",{className:`make-ai-assistant__avatar ${s}`.trim(),"aria-hidden":"true",children:e.jsx(ts,{})}),Zs=({src:s})=>s?e.jsx("span",{className:"make-ai-assistant__user-avatar","aria-hidden":"true",children:e.jsx("img",{alt:"",src:s})}):null,Xs=({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(Zs,{src:s})]})},ke=s=>{const t=s.trim();if(!(!t.startsWith("|")||!t.endsWith("|")))return t.slice(1,-1).split("|").map(a=>a.trim())},Ys=s=>s.length>0&&s.every(t=>/^:?-{3,}:?$/.test(t)),Gs=(s,t)=>{const a=ke(s[t]??""),r=ke(s[t+1]??"");if(!a||!r||a.length!==r.length||!Ys(r))return;const n=[];let i=t+2;for(;i<s.length;){const c=ke(s[i]??"");if(!c||c.length!==a.length)break;n.push(c),i+=1}return{headers:a,lastIndex:i-1,rows:n}},Qs=s=>{const t=[],a=[],r=[],n=[],i=s.replace(/\r\n?/g,`
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),l=require("react"),G=require("./index.cjs"),m=require("./conversation-Cv1wdvCR.cjs"),ht=e=>e?.trim()||void 0,O=(e,s)=>ht(e)??s,Ce=e=>{const s=ht(e?.primary);if(s)return{"--make-ai-theme-primary":s,"--make-ai-theme-primary-hover":O(e?.primaryHover,"color-mix(in srgb, var(--make-ai-theme-primary) 84%, var(--make-ai-theme-text))"),"--make-ai-theme-on-primary":O(e?.onPrimary,"#fcfcff"),"--make-ai-theme-bg":O(e?.background,"color-mix(in srgb, var(--make-ai-theme-primary) 2%, #fcfcff)"),"--make-ai-theme-surface":O(e?.surface,"color-mix(in srgb, var(--make-ai-theme-primary) 4%, var(--make-ai-theme-bg))"),"--make-ai-theme-surface-strong":O(e?.surfaceStrong,"color-mix(in srgb, var(--make-ai-theme-primary) 8%, var(--make-ai-theme-bg))"),"--make-ai-theme-text":O(e?.text,"color-mix(in srgb, var(--make-ai-theme-primary) 12%, #252631)"),"--make-ai-theme-text-secondary":O(e?.textSecondary,"color-mix(in srgb, var(--make-ai-theme-text) 74%, var(--make-ai-theme-primary))"),"--make-ai-theme-border":O(e?.border,"color-mix(in srgb, var(--make-ai-theme-primary) 14%, var(--make-ai-theme-bg))"),"--make-ai-theme-overlay":O(e?.overlay,"color-mix(in srgb, var(--make-ai-theme-text) 88%, var(--make-ai-theme-primary))"),"--make-ai-theme-on-overlay":O(e?.onOverlay,"#fcfcff")}},ot=(e,s)=>!s||!l.isValidElement(e)||typeof e.type!="string"?e:l.cloneElement(e,{style:{...e.props.style,...s}});function ft({artifact:e,context:s,fallback:a,onAction:r,onActionError:n,registry:i,theme:c}){const p=Ce(c),v=G.resolveArtifactTemplate(i,e,s);if(!v){const T=a?a(e):t.jsxs("section",{className:"make-ai-artifact make-ai-artifact--unsupported",role:"status",children:[t.jsx("strong",{children:"暂不支持展示此结果"}),t.jsxs("span",{children:["结果类型:",e.kind]})]});return ot(T,p)}const f={context:s,onAction:r,onActionError:n,theme:c,themeStyle:p},w=v.template.render(e,s,f);return ot(w,p)}const Y=(e,s,a)=>{if(e==null||e==="")return"—";if(typeof e=="boolean")return e?"是":"否";if(typeof e!="number")return`${e}${s?.unit??""}`;const r=s?.precision,n={maximumFractionDigits:r??2,minimumFractionDigits:r};s?.style==="currency"&&s.currency?(n.style="currency",n.currency=s.currency):s?.style==="percent"&&(n.style="percent");try{const i=s?.style==="percent"?e/100:e;return`${new Intl.NumberFormat(a,n).format(i)}${s?.unit??""}`}catch{return`${e}${s?.unit??""}`}},gt=e=>{let s=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(const r of e)s=Math.min(s,r),a=Math.max(a,r);return Number.isFinite(s)&&Number.isFinite(a)?{min:s,max:a}:{min:0,max:0}},xt=(e,s,a)=>{if(!a.onAction)return;const r=i=>{console.error("[make-ai-assistant] host action error handler failed",{actionId:e.id,artifactId:s.artifact.id,errorType:i instanceof Error?i.name:typeof i,intent:e.intent})},n=i=>{if(a.onActionError){try{Promise.resolve(a.onActionError(i,e,s)).catch(r)}catch(c){r(c)}return}console.error("[make-ai-assistant] host action failed",{actionId:e.id,artifactId:s.artifact.id,errorType:i instanceof Error?i.name:typeof i,intent:e.intent})};try{Promise.resolve(a.onAction(e,s)).catch(n)}catch(i){n(i)}},oe=(e,s)=>e.actions?.length&&s.onAction?t.jsx("div",{className:"make-ai-artifact__actions",children:e.actions.map(a=>t.jsxs("button",{className:`make-ai-artifact__action make-ai-artifact__action--${a.appearance??"link"}`,type:"button",onClick:()=>xt(a,{artifact:e,context:s.context},s),children:[a.label,t.jsx("span",{"aria-hidden":"true",children:"→"})]},a.id))}):null,ce=(e,s,a="",r)=>t.jsxs("section",{"aria-label":e.title??`${e.kind} result`,className:`make-ai-artifact ${a}`.trim(),"data-artifact-density":e.presentation?.density,"data-artifact-kind":e.kind,style:r,children:[e.title?t.jsx("h4",{className:"make-ai-artifact__title",children:e.title}):null,e.summary?t.jsx("p",{className:"make-ai-artifact__summary",children:e.summary}):null,s]}),Bt=({artifact:e,renderContext:s})=>{const a=e.data.delta,r=a?Y(a.value,a.format==="percent"?{style:"percent"}:void 0,s.context.locale):void 0;return ce(e,t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"make-ai-artifact__metric-value",children:Y(e.data.value,e.data.format,s.context.locale)}),a?t.jsxs("div",{className:`make-ai-artifact__delta make-ai-artifact__delta--${a.direction??"flat"}`,children:[t.jsx("span",{"aria-hidden":"true",children:a.direction==="up"?"↗":a.direction==="down"?"↘":"→"}),t.jsx("span",{children:r}),a.label?t.jsx("span",{children:a.label}):null]}):null,e.data.context?t.jsx("p",{className:"make-ai-artifact__context",children:e.data.context}):null,oe(e,s)]}),"make-ai-artifact--metric",s.themeStyle)},Wt=({artifact:e,renderContext:s})=>ce(e,t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"make-ai-artifact__comparison",children:e.data.items.map(a=>t.jsxs("div",{className:"make-ai-artifact__comparison-item",children:[t.jsx("span",{children:a.label}),t.jsx("strong",{children:Y(a.value,a.format,s.context.locale)}),a.hint?t.jsx("small",{children:a.hint}):null]},a.id))}),oe(e,s)]}),"make-ai-artifact--comparison",s.themeStyle),zt=({artifact:e,renderContext:s})=>{const a=e.data.series.flatMap(c=>c.points.map(p=>p.y)),{max:r,min:n}=gt(a),i=r-n||1;return ce(e,t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"make-ai-artifact__trend",children:e.data.series.map(c=>t.jsxs("div",{className:"make-ai-artifact__trend-series",children:[t.jsx("div",{className:"make-ai-artifact__trend-label",children:c.label}),t.jsx("div",{className:"make-ai-artifact__trend-bars",children:c.points.map((p,v)=>{const f=18+(p.y-n)/i*70;return t.jsxs("div",{className:"make-ai-artifact__trend-point",children:[t.jsx("span",{"aria-label":`${p.x}: ${Y(p.y,c.format,s.context.locale)}`,className:"make-ai-artifact__trend-bar",role:"img",style:{height:`${f}%`},title:`${p.x}: ${Y(p.y,c.format,s.context.locale)}`}),t.jsx("small",{children:p.x})]},`${p.x}-${v}`)})})]},c.id))}),oe(e,s)]}),"make-ai-artifact--trend",s.themeStyle)},Ut=({artifact:e,renderContext:s})=>{const{max:a}=gt(e.data.items.map(n=>Math.abs(n.value))),r=Math.max(a,1);return ce(e,t.jsxs(t.Fragment,{children:[t.jsx("ol",{className:"make-ai-artifact__ranking",children:e.data.items.map((n,i)=>t.jsxs("li",{children:[t.jsx("span",{className:"make-ai-artifact__rank",children:i+1}),t.jsxs("span",{className:"make-ai-artifact__ranking-label",children:[t.jsx("span",{children:n.label}),n.description?t.jsx("small",{children:n.description}):null]}),t.jsx("span",{className:"make-ai-artifact__ranking-track","aria-hidden":"true",children:t.jsx("span",{style:{width:`${Math.abs(n.value)/r*100}%`}})}),t.jsx("strong",{children:Y(n.value,n.format,s.context.locale)})]},n.id))}),oe(e,s)]}),"make-ai-artifact--ranking",s.themeStyle)},qt=(e,s)=>s.action??{id:`open-${s.id}`,label:s.title??s.id,intent:"open-record",target:{entityKey:e.data.entity.key,recordId:s.id}},Xt=({artifact:e,renderContext:s})=>ce(e,t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"make-ai-artifact__record-list",children:e.data.records.length===0?t.jsx("p",{className:"make-ai-artifact__empty",children:"没有符合条件的记录"}):e.data.records.map(a=>{const r=qt(e,a),n=t.jsxs(t.Fragment,{children:[t.jsx("strong",{children:a.title??a.id}),t.jsx("span",{className:"make-ai-artifact__record-values",children:e.data.columns.map(i=>t.jsxs("span",{children:[t.jsx("small",{children:i.label}),Y(a.values[i.key],i.format,s.context.locale)]},i.key))}),s.onAction?t.jsx("span",{"aria-hidden":"true",children:"›"}):null]});return s.onAction?t.jsx("button",{className:"make-ai-artifact__record",type:"button",onClick:()=>xt(r,{artifact:e,context:s.context},s),children:n},a.id):t.jsx("div",{className:"make-ai-artifact__record",children:n},a.id)})}),e.data.total!==void 0?t.jsxs("p",{className:"make-ai-artifact__record-total",children:["共 ",e.data.total," 条"]}):null,oe(e,s)]}),"make-ai-artifact--record-list",s.themeStyle),Yt=({artifact:e,renderContext:s})=>ce(e,t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:`make-ai-artifact__notice make-ai-artifact__notice--${e.data.tone}`,children:[t.jsx("span",{"aria-hidden":"true",children:e.data.tone==="success"?"✓":e.data.tone==="warning"?"!":e.data.tone==="danger"?"×":"i"}),t.jsx("p",{children:e.data.body})]}),oe(e,s)]}),"make-ai-artifact--notice",s.themeStyle),ie=(e,s,a)=>({id:e,kinds:[s],priority:0,render:a}),Gt=[ie("platform.metric.default","metric",(e,s,a)=>t.jsx(Bt,{artifact:e,renderContext:a})),ie("platform.comparison.default","comparison",(e,s,a)=>t.jsx(Wt,{artifact:e,renderContext:a})),ie("platform.trend.default","trend",(e,s,a)=>t.jsx(zt,{artifact:e,renderContext:a})),ie("platform.ranking.default","ranking",(e,s,a)=>t.jsx(Ut,{artifact:e,renderContext:a})),ie("platform.record-list.default","record-list",(e,s,a)=>t.jsx(Xt,{artifact:e,renderContext:a})),ie("platform.notice.default","notice",(e,s,a)=>t.jsx(Yt,{artifact:e,renderContext:a}))],_t=G.createArtifactTemplateRegistry(Gt).templates,vt=(e=_t)=>G.createArtifactTemplateRegistry(e),Zt=e=>`${e}-${Date.now()}-${Math.random().toString(36).slice(2,9)}`,Qt="Make",Jt=["总结当前页面数据","找出需要关注的记录","列出我有权限查看的数据对象"],jt=(e,s)=>s??`${e?.trim()||Qt} AI 助手`,es=e=>e??Jt,ts=/^只读分析\s*[·•]\s*/u,ss=(e,s)=>e?.trim().replace(ts,"").trim()||`当前对象:${s??"未命名应用"}`,as=432,ct=16,F=16,fe=8,lt=(e,s,a)=>Math.min(Math.max(e,Math.min(s,a)),a),dt=(e,s,a)=>Math.min(Math.max(e,s),Math.max(s,a)),ns=(e,s,a,r)=>{const n=Math.min(Math.max(s.width,1),Math.max(1,r-F*2)),i=Math.min(Math.max(s.height,1),Math.max(1,a-F*2)),c=e.left+e.width/2,p=e.top+e.height/2,f=[{left:e.right+fe,placement:"right",top:p-i/2},{left:e.left-fe-n,placement:"left",top:p-i/2},{left:c-n/2,placement:"bottom",top:e.bottom+fe},{left:c-n/2,placement:"top",top:e.top-fe-i}].find(({left:w,top:T})=>w>=F&&T>=F&&w+n<=r-F&&T+i<=a-F);return f||{left:dt(c-n/2,F,r-F-n),placement:"bottom",top:dt(e.bottom+fe,F,a-F-i)}},rs=e=>typeof e=="number"?Number.isFinite(e)?`${e}px`:void 0:e?.trim()||void 0;class k extends Error{}const we=(e,s)=>{if(!(typeof e!="object"||e===null))return e[s]},is=e=>{const s=we(e,"status");return typeof s=="number"?s:we(we(e,"response"),"status")},os=e=>{const s=we(e,"code"),a=is(e),r=e instanceof Error?e.message:"",n=[s,r].filter(v=>typeof v=="string").join(" ").toLowerCase(),c=globalThis.navigator?.onLine===!1||/network|fetch|timeout|offline|connection|网络|连接|超时/.test(n),p=typeof a=="number"&&a>=500||/server|service|服务器|服务异常/.test(n);return c?{actionLabel:"重新连接",description:"请检查网络后再试。",kind:"network",label:"网络连接",title:"网络连接不可用"}:p?{actionLabel:"重新加载",description:"服务暂时未能响应,请稍后重试。",kind:"service",label:"服务异常",title:"服务暂时不可用"}:{actionLabel:"重新加载",description:"请稍后重试;若问题持续出现,请联系管理员。",kind:"unknown",label:"加载异常",title:"暂时无法加载对话"}},mt=e=>{try{const s=e?.return?.();if(!s)return;Promise.resolve(s).catch(a=>{console.error("[make-ai-assistant] transport iterator close failed",{errorType:a instanceof Error?a.name:typeof a})})}catch(s){console.error("[make-ai-assistant] transport iterator close failed",{errorType:s instanceof Error?s.name:typeof s})}},cs=async e=>{if(globalThis.navigator?.clipboard?.writeText){await globalThis.navigator.clipboard.writeText(e);return}if(typeof document>"u"||!document.body)throw new Error("Clipboard API is unavailable");const s=document.createElement("textarea");s.value=e,s.setAttribute("readonly",""),s.style.position="fixed",s.style.inset="0 auto auto 0",s.style.opacity="0",document.body.append(s),s.select();const a=document.execCommand("copy");if(s.remove(),!a)throw new Error("Clipboard copy failed")},yt=()=>t.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[t.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"}),t.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"})]}),ls=()=>t.jsx("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:t.jsx("path",{d:"m6 6 12 12M18 6 6 18"})}),ds=()=>t.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[t.jsx("path",{d:"M8 8h10v12H8z"}),t.jsx("path",{d:"M6 16H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]}),ms=()=>t.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[t.jsx("path",{d:"M20 11a8 8 0 0 0-14.7-4.4L4 8"}),t.jsx("path",{d:"M4 4v4h4"}),t.jsx("path",{d:"M4 13a8 8 0 0 0 14.7 4.4L20 16"}),t.jsx("path",{d:"M20 20v-4h-4"})]}),us=()=>t.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[t.jsx("circle",{cx:"12",cy:"12",r:"8"}),t.jsx("path",{d:"M9.8 9.4a2.35 2.35 0 1 1 3.93 1.73c-.96.86-1.73 1.42-1.73 2.87"}),t.jsx("path",{d:"M12 17h.01"})]}),ps=()=>t.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[t.jsx("path",{d:"M12 4v11"}),t.jsx("path",{d:"m7 10 5 5 5-5"}),t.jsx("path",{d:"M5 20h14"})]}),hs=()=>t.jsx("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:t.jsx("path",{d:"M12 5v14M5 12h14"})}),fs=()=>t.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[t.jsx("path",{d:"m4 4 17 8-17 8 3-8-3-8Z"}),t.jsx("path",{d:"M7 12h14"})]}),At=()=>t.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[t.jsx("path",{d:"M20 11a8 8 0 0 0-14.7-4.4L4 8"}),t.jsx("path",{d:"M4 4v4h4"}),t.jsx("path",{d:"M4 13a8 8 0 0 0 14.7 4.4L20 16"}),t.jsx("path",{d:"M20 20v-4h-4"})]}),gs=()=>t.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",children:[t.jsx("circle",{cx:"12",cy:"12",r:"8"}),t.jsx("path",{d:"M12 8v4.5"}),t.jsx("path",{d:"M12 16h.01"})]}),Te=({className:e=""})=>t.jsx("span",{className:`make-ai-assistant__avatar ${e}`.trim(),"aria-hidden":"true",children:t.jsx(yt,{})}),xs=({src:e})=>e?t.jsx("span",{className:"make-ai-assistant__user-avatar","aria-hidden":"true",children:t.jsx("img",{alt:"",src:e})}):null,_s=({userAvatarUrl:e,userName:s})=>{const a=s?.trim();return!a&&!e?null:t.jsxs("div",{className:"make-ai-assistant__message-identity",children:[a?t.jsx("span",{className:"make-ai-assistant__message-sender",children:a}):null,t.jsx(xs,{src:e})]})},Se=e=>{const s=e.trim();if(!(!s.startsWith("|")||!s.endsWith("|")))return s.slice(1,-1).split("|").map(a=>a.trim())},vs=e=>e.length>0&&e.every(s=>/^:?-{3,}:?$/.test(s)),js=(e,s)=>{const a=Se(e[s]??""),r=Se(e[s+1]??"");if(!a||!r||a.length!==r.length||!vs(r))return;const n=[];let i=s+2;for(;i<e.length;){const c=Se(e[i]??"");if(!c||c.length!==a.length)break;n.push(c),i+=1}return{headers:a,lastIndex:i-1,rows:n}},ys=e=>{const s=[],a=[],r=[],n=[],i=e.replace(/\r\n?/g,`
|
|
2
2
|
`).split(`
|
|
3
|
-
`),c=()=>{const
|
|
4
|
-
`).trim();a.length=0,
|
|
5
|
-
`).trim();n.length=0,g&&t.push({type:"pre",text:g})};for(let g=0;g<i.length;g+=1){const L=i[g]??"",E=L.trim();if(!E){c(),h(),I();continue}const R=Gs(i,g);if(R){c(),h(),I(),t.push({headers:R.headers,rows:R.rows,type:"table"}),g=R.lastIndex;continue}const x=/^(#{1,6})\s+(.+)$/.exec(E);if(x){c(),h(),I();const F=(x[2]??"").replace(/\s+#+\s*$/,"").trim();F&&t.push({type:"heading",level:x[1]?.length,text:F});continue}if(/^\s*\|.+\|\s*$/.test(L)){c(),h(),n.push(L.trim());continue}const b=/^\s*[-*]\s+(.+)$/.exec(L);if(b){c(),I(),r.push(b[1]?.trim()??"");continue}h(),I(),a.push(E)}return c(),h(),I(),t},ue=s=>{const t=[],a=/(\*\*[^*]+\*\*|`[^`]+`)/g;let r=0;for(const n of s.matchAll(a)){const i=n[0],c=n.index??0;c>r&&t.push(s.slice(r,c)),i.startsWith("**")?t.push(e.jsx("strong",{children:i.slice(2,-2)},`${c}-strong`)):t.push(e.jsx("code",{children:i.slice(1,-1)},`${c}-code`)),r=c+i.length}return r<s.length&&t.push(s.slice(r)),t},Js=({content:s})=>{const t=Qs(s);return t.length?e.jsx("div",{className:"make-ai-assistant__bubble make-ai-assistant__assistant-text",children:t.map((a,r)=>{if(a.type==="heading"){const n=a.level<=2?"h3":"h4";return e.jsx(n,{className:`make-ai-assistant__markdown-heading make-ai-assistant__markdown-heading--${a.level}`,children:ue(a.text)},`${r}-heading`)}return a.type==="paragraph"?e.jsx("p",{children:ue(a.text)},`${r}-paragraph`):a.type==="pre"?e.jsx("pre",{children:e.jsx("code",{children:a.text})},`${r}-pre`):a.type==="table"?e.jsx("div",{"aria-label":"表格内容,可横向滚动",className:"make-ai-assistant__markdown-table-scroll",role:"region",tabIndex:0,children:e.jsxs("table",{className:"make-ai-assistant__markdown-table",children:[e.jsx("thead",{children:e.jsx("tr",{children:a.headers.map((n,i)=>e.jsx("th",{scope:"col",children:ue(n)},`${i}-${n}`))})}),e.jsx("tbody",{children:a.rows.map((n,i)=>e.jsx("tr",{children:n.map((c,h)=>e.jsx("td",{children:ue(c)},`${h}-${c}`))},`${i}-${n.join("|")}`))})]})},`${r}-table`):e.jsx("ul",{children:a.items.map((n,i)=>e.jsx("li",{children:ue(n)},`${i}-${n}`))},`${r}-list`)})}):null},ns=({assistantName:s})=>e.jsxs("div",{className:"make-ai-assistant__message-identity",children:[e.jsx(je,{className:"make-ai-assistant__avatar--message"}),e.jsx("span",{className:"make-ai-assistant__message-sender",children:s})]}),rs=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}},et=s=>{for(let t=s.messages.length-1;t>=0;t-=1)if(s.messages[t].role==="user")return t;return-1},is=s=>{const t=et(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}},st=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}},tt=s=>{for(let t=s.messages.length-1;t>=0;t-=1){const a=s.messages[t];if(a.role==="user")return a}},at=(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)}},nt=s=>s.scrollHeight-s.scrollTop-s.clientHeight<=48,Ze=(s="smooth")=>globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches?"auto":s,be=(s,t)=>{typeof s.scrollTo=="function"?s.scrollTo({top:s.scrollHeight,behavior:t}):s.scrollTop=s.scrollHeight},os=({error:s,onRetry:t})=>e.jsxs("div",{className:"make-ai-assistant__message-status make-ai-assistant__message-status--error","data-error-presentation":"request-failed",role:"alert",children:[e.jsxs("div",{className:"make-ai-assistant__message-status-header",children:[e.jsx("span",{className:"make-ai-assistant__message-status-icon","aria-hidden":"true",children:e.jsx(Hs,{})}),e.jsx("strong",{children:"请求未完成"})]}),e.jsx("span",{className:"make-ai-assistant__message-status-message",children:s.message}),s.retryable&&t?e.jsxs("button",{className:"make-ai-assistant__retry",type:"button",onClick:t,children:[e.jsx(as,{}),"重新发送"]}):null]}),rt=({error:s,onRetry:t})=>{const a=Ds(s);return e.jsxs("section",{"aria-live":"assertive",className:"make-ai-assistant__load-failure","data-load-failure-kind":a.kind,role:"alert",children:[e.jsx("span",{className:"make-ai-assistant__load-failure-icon","aria-hidden":"true",children:e.jsxs("svg",{viewBox:"0 0 24 24",children:[e.jsx("path",{d:"M5 12a7 7 0 0 1 13.4-2.8A4.5 4.5 0 0 1 18 18H7.5A4.5 4.5 0 0 1 5 12Z"}),e.jsx("path",{d:"m9.2 14.8 5.6-5.6M9.2 9.2l5.6 5.6"})]})}),e.jsxs("div",{className:"make-ai-assistant__load-failure-copy",children:[e.jsx("span",{className:"make-ai-assistant__load-failure-label",children:a.label}),e.jsx("h3",{children:a.title}),e.jsx("p",{children:a.description})]}),e.jsxs("button",{className:"make-ai-assistant__retry make-ai-assistant__retry--primary",type:"button",onClick:t,children:[e.jsx(as,{}),a.actionLabel]})]})},cs=({active:s,steps:t})=>{if(!s||!t?.length)return null;const a=t[t.length-1]??"处理中";return e.jsxs("details",{className:"make-ai-assistant__process",open:!0,children:[e.jsxs("summary",{children:[e.jsxs("span",{className:"make-ai-assistant__progress",role:"status",children:[e.jsx("span",{"aria-hidden":"true"}),e.jsx("span",{children:a})]}),e.jsxs("span",{className:"make-ai-assistant__process-count",children:[t.length," 步"]})]}),e.jsx("ol",{children:t.map((r,n)=>e.jsxs("li",{"data-step-active":n===t.length-1?!0:void 0,children:[e.jsx("span",{"aria-hidden":"true"}),e.jsx("span",{children:r})]},`${n}-${r}`))})]})},it=({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","data-tooltip":"复制",type:"button",onClick:t,children:e.jsx(Vs,{})}):null,a?e.jsx("button",{"aria-label":"重新生成",className:"make-ai-assistant__reply-action make-ai-assistant__reply-regenerate","data-tooltip":"重新生成",type:"button",onClick:a,children:e.jsx(Ws,{})}):null,s?e.jsx("span",{className:"make-ai-assistant__reply-feedback","data-copy-status":s.status,role:"status",children:s.message}):null]}),Xe=({assistantName:s,error:t,onRetry:a,progress:r})=>{const n=t?"error":"progress";return t?.message??r?.message?e.jsx("article",{"aria-label":`${s}的${n==="error"?"错误消息":"状态消息"}`,className:`make-ai-assistant__message make-ai-assistant__message--assistant make-ai-assistant__message--${n}`,"data-message-role":"assistant","data-message-state":n,children:e.jsxs("div",{className:"make-ai-assistant__message-turn",children:[e.jsx(ns,{assistantName:s}),e.jsx("div",{className:"make-ai-assistant__message-stack",children:t?e.jsx(os,{error:t,onRetry:a}):e.jsx(cs,{active:!0,steps:r?.steps})})]})}):null},ot=(s,t,a,r,n,i,c,h,I,g,L,E,R)=>{const x=is(s),b=rs(s),F=st(s);let T;return s.messages.map(m=>{const w=m.role==="assistant",K=T;w||(T=m);const y=m.id===b,Y=m.id===x?s.error:void 0,C=m.error??Y,O=!w&&!!(h?.trim()||I),f=w?i:h?.trim()||"用户",S=w&&m.status==="complete"&&!C&&(m.content.trim()||m.id===F);return e.jsx("article",{"aria-label":`${f}的消息`,className:`make-ai-assistant__message make-ai-assistant__message--${m.role}`,"data-message-role":m.role,"data-message-state":C?"error":void 0,"data-message-status":m.status,"data-message-has-identity":w||O?!0:void 0,children:e.jsxs("div",{className:"make-ai-assistant__message-turn",children:[w?e.jsx(ns,{assistantName:i}):O?e.jsx(Xs,{userAvatarUrl:I,userName:h}):null,e.jsxs("div",{className:"make-ai-assistant__message-stack",children:[m.content?w?e.jsx(Js,{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":`${i}正在思考`,children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]}):null,w?e.jsx(cs,{active:y&&s.status==="streaming",steps:m.progressSteps}):null,C?e.jsx(os,{error:C,onRetry:Y?c:void 0}):null,m.artifacts.map(D=>e.jsx(Ye,{artifact:D,context:t,onAction:r,onActionError:n,registry:a},D.id)),S?e.jsx(it,{copyFeedback:g?.messageId===m.id?{message:g.message,status:g.status}:void 0,onCopy:m.content.trim()?()=>E(m.id,m.content):void 0,onRegenerate:L&&m.id===F&&K?()=>R({userMessage:K,assistantMessage:m}):void 0}):null]})]})},m.id)})};function ls({assistantName:s="AI 助手",brandName:t,context:a,onAction:r,onActionError:n,onClose:i,onNewConversation:c,headerHeight:h,privacyNotice:I,registry:g,subtitle:L,suggestions:E,title:R,transport:x,userAvatarUrl:b,userName:F,visible:T}){const m=ss(t,R),w=I?.trim(),K=L?.trim()||`当前对象:${a.app.name??"未命名应用"}`,y=Fs(h),Y=y?{"--make-ai-internal-header-height":y}:void 0,[C,O]=u.useState(""),[f,S]=u.useState(d.createAssistantConversationState),D=u.useRef(f);D.current=f;const[H,Z]=u.useState(void 0),[re,V]=u.useState(void 0),[p,A]=u.useState(0),[N,X]=u.useState(()=>x.loadConversation?"loading":"ready"),[ds,Ae]=u.useState(void 0),[us,W]=u.useState(!1),G=u.useRef(void 0),Q=u.useRef(void 0),J=u.useRef(0),we=u.useRef(null),ie=u.useRef(null),Ne=u.useRef(null),Me=u.useRef(null),B=u.useRef(!0),Te=u.useRef(a.app.id),Ee=u.useRef(T),Se=u.useMemo(()=>g??es(),[g]),Re=u.useMemo(()=>$s(E),[E]),me=o=>{const _=G.current,v=Q.current?.iterator;return!_&&!v?!1:(J.current+=1,G.current=void 0,Q.current=void 0,console.info("[make-ai-assistant] local run cancellation requested",{reason:o}),_?.abort(),He(v),!0)};u.useEffect(()=>()=>{me("unmount")},[]),u.useEffect(()=>{const o=x.loadConversation,_=Te.current!==a.app.id;if(Te.current=a.app.id,me("reinitialize"),_&&(O(""),B.current=!0),Z(void 0),V(void 0),W(!1),S(d.createAssistantConversationState()),!o){Ae(void 0),X("ready");return}const v=new AbortController;return Ae(void 0),X("loading"),console.info("[make-ai-assistant] conversation load start",{appId:a.app.id}),o.call(x,a,{signal:v.signal}).then(k=>{v.signal.aborted||(S(d.createAssistantConversationState(k)),X("ready"),console.info("[make-ai-assistant] conversation load success",{appId:a.app.id,messageCount:k.messages.length}))}).catch(k=>{v.signal.aborted||(console.error("[make-ai-assistant] conversation load failed",{appId:a.app.id,errorType:k instanceof Error?k.name:typeof k}),Ae(k),X("error"))}),()=>v.abort()},[a.app.id,p,x]),u.useEffect(()=>{const o=ie.current;if(!o||!B.current)return;W(!1);const _=requestAnimationFrame(()=>{if(!B.current)return;const v=f.status==="streaming"||globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches?"auto":"smooth";be(o,v)});return()=>cancelAnimationFrame(_)},[f.messages,f.progress,f.status]),u.useEffect(()=>{const o=T&&!Ee.current;if(Ee.current=T,!o)return;const _=requestAnimationFrame(()=>{const v=ie.current;if(v&&B.current){W(!1);const oe=D.current.status==="streaming"?"auto":Ze();be(v,oe)}else v&&W(D.current.messages.length>0);const k=Ne.current;(k&&!k.disabled?k:Me.current??we.current?.querySelector("button:not(:disabled)"))?.focus()});return()=>cancelAnimationFrame(_)},[T]);const ms=()=>{const o=ie.current;if(!o)return;const _=nt(o);B.current=_,W(!_&&D.current.messages.length>0)},hs=()=>{const o=ie.current;if(!o)return;B.current=!0,W(!1);const _=Ze();be(o,_)},Ce=async(o,_)=>{const v=o.trim(),k=D.current,P=_?.regenerateFrom,oe=x.regenerate;if(!v||N!=="ready"||k.status==="streaming"||G.current||P&&!oe)return;if(d.countCodePointsUpTo(v,d.MAKE_AI_CONVERSATION_LIMITS.messageCharacters)>d.MAKE_AI_CONVERSATION_LIMITS.messageCharacters){Z(`输入内容过长,请控制在 ${d.MAKE_AI_CONVERSATION_LIMITS.messageCharacters} 个字符以内`);return}const fe={id:P?.userMessage.id??Ss("user"),content:v},ge=P?at(k,P.userMessage.id):d.appendUserMessage(k,fe),xe=new AbortController,ee=J.current+1;J.current=ee,G.current=xe,Z(void 0),V(void 0),W(!B.current&&k.messages.length>0),P||O(""),S(ge);try{let z=!1,M,Fe=0,Oe=0,De=0,Ie=0,ce=0;const le=new Map,Pe=new Set,Ke=new Set([...ge.messages.map(_e=>_e.id),fe.id]),de=new Set,Ve=q.createArtifactCapabilities(Se),We={signal:xe.signal};let ye;if(P){if(!oe)throw new j("当前 AI 助手不支持重新生成");ye=oe({threadId:ge.threadId,message:fe,assistantMessage:{id:P.assistantMessage.id,content:P.assistantMessage.content},context:a,capabilities:Ve},We)}else ye=x.run({threadId:ge.threadId,message:fe,context:a,capabilities:Ve},We);const Be=ye[Symbol.asyncIterator]();for(Q.current={iterator:Be,requestVersion:ee};;){const _e=await Be.next();if(J.current!==ee||_e.done)break;let l;try{l=d.parseAssistantEvent(_e.value)}catch($){throw new j($ instanceof Error?$.message:"Invalid assistant event")}if(l.type==="message.start"){if(M!==void 0&&M!==l.runId)throw new j("AI 助手响应 run id 不一致");if(M??=l.runId,Oe+=1,Oe>d.MAKE_AI_CONVERSATION_LIMITS.assistantMessagesPerRun)throw new j("AI 助手单次响应消息数量超过限制");if(Ke.has(l.messageId))throw new j("AI 助手响应包含重复的 message id");Ke.add(l.messageId),de.add(l.messageId),le.set(l.messageId,0)}if(l.type==="message.delta"){if(!de.has(l.messageId))throw new j("AI 助手响应事件顺序无效");const $=le.get(l.messageId)??0,se=d.countCodePointsUpTo(l.delta,d.MAKE_AI_CONVERSATION_LIMITS.messageCharacters-ce);if(ce+se>d.MAKE_AI_CONVERSATION_LIMITS.messageCharacters)throw new j("AI 助手响应文本超过大小限制");ce+=se,le.set(l.messageId,$+se)}if(l.type==="message.replace"){if(!de.has(l.messageId))throw new j("AI 助手响应事件顺序无效");const $=le.get(l.messageId)??0,se=d.countCodePointsUpTo(l.content,d.MAKE_AI_CONVERSATION_LIMITS.messageCharacters),ze=ce-$+se;if(ze>d.MAKE_AI_CONVERSATION_LIMITS.messageCharacters)throw new j("AI 助手响应文本超过大小限制");ce=ze,le.set(l.messageId,se)}if(l.type==="run.progress"){if(M!==void 0&&M!==l.runId)throw new j("AI 助手响应 run id 不一致");if(M??=l.runId,De+=1,De>d.MAKE_AI_CONVERSATION_LIMITS.progressStepsPerRun)throw new j("AI 助手处理过程数量超过限制");const $=d.countCodePointsUpTo(l.message,d.MAKE_AI_CONVERSATION_LIMITS.progressCharactersPerRun-Ie);if(Ie+$>d.MAKE_AI_CONVERSATION_LIMITS.progressCharactersPerRun)throw new j("AI 助手处理过程文本超过大小限制");Ie+=$}if(l.type==="artifact"){if(!de.has(l.messageId))throw new j("AI 助手响应事件顺序无效");if(Fe+=1,Fe>d.MAKE_AI_CONVERSATION_LIMITS.artifactsPerRun)throw new j("AI 助手单次响应 Artifact 数量超过限制");if(Pe.has(l.artifact.id))throw new j("AI 助手响应包含重复的 Artifact id");Pe.add(l.artifact.id)}if(l.type==="message.complete"&&!de.delete(l.messageId))throw new j("AI 助手响应事件顺序无效");if(l.type==="run.complete"&&M!==void 0&&M!==l.runId)throw new j("AI 助手响应 run id 不一致");if(l.type==="run.cancelled"&&l.runId!==void 0&&M!==void 0&&M!==l.runId)throw new j("AI 助手响应 run id 不一致");if(S($=>d.reduceAssistantEvent($,l)),l.type==="error"||l.type==="run.cancelled"||l.type==="run.complete"){z=!0;break}}if(!z)throw new j("AI 助手流式响应在终止事件前结束")}catch(z){if(J.current!==ee)return;if(xe.signal.aborted){S(M=>d.reduceAssistantEvent(M,{type:"run.cancelled"}));return}console.error("[make-ai-assistant] assistant run failed",{appId:a.app.id,errorType:z instanceof Error?z.name:typeof z}),S(M=>d.reduceAssistantEvent(M,{type:"error",code:"TRANSPORT_ERROR",message:z instanceof j?z.message:"连接失败,请重试",retryable:!0}))}finally{J.current===ee&&G.current===xe&&(G.current=void 0),Q.current?.requestVersion===ee&&(He(Q.current.iterator),Q.current=void 0)}},he=o=>Ce(o),ps=o=>Ce(o.userMessage.content,{regenerateFrom:o}),fs=async(o,_)=>{try{await Ps(_),V({messageId:o,message:"已复制",status:"success"})}catch(v){console.error("[make-ai-assistant] copy answer failed",{errorType:v instanceof Error?v.name:typeof v}),V({messageId:o,message:"复制失败",status:"error"})}},gs=o=>{o.preventDefault(),he(C)},xs=o=>{o.key==="Enter"&&!o.shiftKey&&!o.nativeEvent.isComposing&&(o.preventDefault(),he(C))},_s=()=>{me("stop")&&S(o=>d.reduceAssistantEvent(o,{type:"run.cancelled"}))},vs=()=>{me("new-conversation"),O(""),Z(void 0),V(void 0),W(!1),B.current=!0,S(d.createAssistantConversationState()),c?.()},$e=x.features?.remoteCancellation===!1?"停止接收":"停止生成",js=rs(f),As=is(f),pe=tt(f),Is=typeof x.regenerate=="function"&&x.features?.regeneration!==!1,Le=()=>{pe&&he(pe.content)};return e.jsxs("section",{className:"make-ai-assistant make-ai-assistant__panel",ref:we,style:Y,children:[e.jsxs("header",{className:"make-ai-assistant__header",children:[e.jsx(je,{}),e.jsxs("div",{className:"make-ai-assistant__header-content",children:[e.jsxs("div",{className:"make-ai-assistant__header-title-row",children:[e.jsx("h2",{className:"make-ai-assistant__header-title",title:m,children:m}),e.jsx("span",{className:"make-ai-assistant__read-only-tag",children:"只读"})]}),e.jsxs("div",{className:"make-ai-assistant__header-context",children:[e.jsx("p",{title:K,children:K}),w?e.jsx("span",{"aria-label":`使用提示:${w}`,className:"make-ai-assistant__header-context-help","data-tooltip":w,role:"note",tabIndex:0,children:e.jsx(Bs,{})}):null]})]}),e.jsxs("div",{className:"make-ai-assistant__header-actions",children:[x.features?.newConversation!==!1?e.jsx("button",{"aria-label":"新建对话",className:"make-ai-assistant__icon-button",type:"button",onClick:vs,children:e.jsx(Us,{})}):null,i?e.jsx("button",{"aria-label":`关闭 ${m}`,className:"make-ai-assistant__icon-button",type:"button",onClick:i,children:e.jsx(Ks,{})}):null]})]}),e.jsxs("div",{className:"make-ai-assistant__body","aria-live":"polite","aria-relevant":"additions text",ref:ie,role:"log",onScroll:ms,children:[N==="loading"?e.jsxs("div",{className:"make-ai-assistant__empty",role:"status",children:[e.jsx(je,{}),e.jsx("h3",{children:"正在恢复对话"}),e.jsx("p",{children:"正在读取当前 App 的历史消息…"})]}):N==="error"?e.jsx("div",{className:"make-ai-assistant__empty",children:e.jsx(rt,{error:ds,onRetry:()=>A(o=>o+1)})}):f.messages.length===0?e.jsxs("div",{className:"make-ai-assistant__empty",children:[e.jsx(je,{}),e.jsx("h3",{children:"有什么可以帮你?"}),e.jsx("p",{children:"我会结合当前 App、页面位置和宿主允许的上下文回答,并把过程与结果分开展示。"})]}):ot(f,a,Se,r,n,s,pe?Le:void 0,F,b,re,Is,(o,_)=>{fs(o,_)},o=>{ps(o)}),f.progress&&!js?e.jsx(Xe,{assistantName:s,progress:f.progress}):null,f.error&&!As?e.jsx(Xe,{assistantName:s,error:f.error,onRetry:pe?Le:void 0}):null]}),us?e.jsx("button",{"aria-label":"回到最新消息",className:"make-ai-assistant__back-to-latest",type:"button",onClick:hs,children:e.jsx(zs,{})}):null,e.jsxs("footer",{className:"make-ai-assistant__composer-region",children:[N==="ready"&&Re.length>0&&f.messages.length===0?e.jsx("div",{className:"make-ai-assistant__suggestions","aria-label":"推荐问题",children:Re.map((o,_)=>e.jsx("button",{type:"button",onClick:()=>{he(o)},children:o},`${_}-${o}`))}):null,e.jsxs("form",{className:"make-ai-assistant__composer",onSubmit:gs,children:[e.jsx("textarea",{"aria-label":`向 ${s} 提问`,"aria-describedby":H?"make-ai-composer-error":void 0,"aria-invalid":H?!0:void 0,autoFocus:!0,disabled:N!=="ready"||f.status==="streaming",placeholder:`询问当前 ${a.app.name??"App"} 中的数据…`,ref:Ne,rows:2,value:C,onChange:o=>{O(o.currentTarget.value),Z(void 0)},onKeyDown:xs}),f.status==="streaming"?e.jsx("button",{"aria-label":$e,className:"make-ai-assistant__send make-ai-assistant__send--stop","data-tooltip":$e,ref:Me,type:"button",onClick:_s,children:e.jsx("span",{"aria-hidden":"true"})}):e.jsx("button",{"aria-label":"发送",className:"make-ai-assistant__send",disabled:N!=="ready"||!C.trim(),type:"submit",children:e.jsx(qs,{})})]}),H?e.jsx("p",{id:"make-ai-composer-error",role:"alert",children:H}):null,e.jsx("p",{children:"AI 生成的结果可能存在偏差,重要数据请核对明细。"})]})]})}function ct(s){return e.jsx(ls,{...s,visible:!0})}function lt({defaultOpen:s=!1,hideLauncher:t=!1,launcher:a,onOpenChange:r,open:n,...i}){const c=ss(i.brandName,i.title),[h,I]=u.useState(s),[g,L]=u.useState(()=>s||n===!0),E=u.useRef(null),R=u.useRef(null),x=u.useRef(void 0),[b,F]=u.useState(),[T,m]=u.useState(Ls),[w,K]=u.useState(!1),y=n??h,Y=typeof window>"u"?void 0:window.innerWidth,C=b===void 0?void 0:{"--make-ai-internal-drawer-width":`${b}px`},O=()=>{if(b!==void 0)return b;const p=R.current?.getBoundingClientRect().width;return p&&Number.isFinite(p)&&p>0?p:T},f=()=>typeof window>"u"?Number.POSITIVE_INFINITY:window.innerWidth,S=p=>{if(p.button!==0)return;const A=O(),N=b===void 0?A:T;m(N),x.current={minimumWidth:N,pointerId:p.pointerId,startWidth:A,startX:p.clientX},K(!0),typeof p.currentTarget.setPointerCapture=="function"&&p.currentTarget.setPointerCapture(p.pointerId),p.preventDefault()},D=p=>{const A=x.current;if(!A||A.pointerId!==p.pointerId)return;const N=qe(A.startWidth+A.startX-p.clientX,A.minimumWidth,f());F(N)},H=p=>{const A=x.current;!A||A.pointerId!==p.pointerId||(x.current=void 0,K(!1))},Z=p=>{const A=p.key==="ArrowLeft"?Ue:p.key==="ArrowRight"?-Ue:void 0;if(A===void 0)return;p.preventDefault();const N=O(),X=b===void 0?N:T;m(X),F(qe(N+A,X,f()))},re=p=>{n===void 0&&I(p),r?.(p),p||requestAnimationFrame(()=>E.current?.focus())},V=()=>re(!y);return u.useEffect(()=>{y&&L(!0)},[y]),u.useEffect(()=>{if(!y)return;const p=A=>{A.key==="Escape"&&(re(!1),requestAnimationFrame(()=>E.current?.focus()))};return document.addEventListener("keydown",p),()=>document.removeEventListener("keydown",p)},[r,y]),e.jsxs("div",{className:"make-ai-assistant","data-open":y||void 0,children:[!t&&(!y||a)?a?a({open:y,toggle:V}):e.jsxs("button",{"aria-label":y?`关闭 ${c}`:`打开 ${c}`,"aria-expanded":y,className:"make-ai-assistant__launcher",ref:E,type:"button",onClick:V,children:[e.jsx("span",{className:"make-ai-assistant__launcher-orbit","aria-hidden":"true"}),e.jsx(ts,{})]}):null,g?e.jsxs("aside",{"aria-label":c,"aria-modal":"false",className:"make-ai-assistant__drawer","data-resizing":w||void 0,hidden:!y,ref:R,role:"dialog",style:C,children:[e.jsx("div",{"aria-label":"调整对话框宽度","aria-orientation":"vertical","aria-valuemax":Y,"aria-valuemin":T,"aria-valuenow":b??T,className:"make-ai-assistant__drawer-resize-handle",role:"separator",tabIndex:0,onKeyDown:Z,onPointerCancel:H,onPointerDown:S,onPointerMove:D,onPointerUp:H}),e.jsx(ls,{...i,onClose:()=>re(!1),visible:y})]}):null]})}exports.createArtifactCapabilities=q.createArtifactCapabilities;exports.createArtifactTemplateRegistry=q.createArtifactTemplateRegistry;exports.extendArtifactTemplateRegistry=q.extendArtifactTemplateRegistry;exports.resolveArtifactTemplate=q.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=Ye;exports.AssistantPanel=ct;exports.MakeAiAssistant=lt;exports.createPlatformArtifactRegistry=es;exports.formatArtifactValue=U;exports.platformArtifactTemplates=Je;
|
|
3
|
+
`),c=()=>{const f=a.join(`
|
|
4
|
+
`).trim();a.length=0,f&&s.push({type:"paragraph",text:f})},p=()=>{r.length&&s.push({type:"list",items:r.splice(0)})},v=()=>{const f=n.join(`
|
|
5
|
+
`).trim();n.length=0,f&&s.push({type:"pre",text:f})};for(let f=0;f<i.length;f+=1){const w=i[f]??"",T=w.trim();if(!T){c(),p(),v();continue}const S=js(i,f);if(S){c(),p(),v(),s.push({headers:S.headers,rows:S.rows,type:"table"}),f=S.lastIndex;continue}const M=/^(#{1,6})\s+(.+)$/.exec(T);if(M){c(),p(),v();const P=(M[2]??"").replace(/\s+#+\s*$/,"").trim();P&&s.push({type:"heading",level:M[1]?.length,text:P});continue}if(/^\s*\|.+\|\s*$/.test(w)){c(),p(),n.push(w.trim());continue}const _=/^\s*[-*]\s+(.+)$/.exec(w);if(_){c(),v(),r.push(_[1]?.trim()??"");continue}p(),v(),a.push(T)}return c(),p(),v(),s},ge=e=>{const s=[],a=/(\*\*[^*]+\*\*|`[^`]+`)/g;let r=0;for(const n of e.matchAll(a)){const i=n[0],c=n.index??0;c>r&&s.push(e.slice(r,c)),i.startsWith("**")?s.push(t.jsx("strong",{children:i.slice(2,-2)},`${c}-strong`)):s.push(t.jsx("code",{children:i.slice(1,-1)},`${c}-code`)),r=c+i.length}return r<e.length&&s.push(e.slice(r)),s},As=({content:e})=>{const s=ys(e);return s.length?t.jsx("div",{className:"make-ai-assistant__bubble make-ai-assistant__assistant-text",children:s.map((a,r)=>{if(a.type==="heading"){const n=a.level<=2?"h3":"h4";return t.jsx(n,{className:`make-ai-assistant__markdown-heading make-ai-assistant__markdown-heading--${a.level}`,children:ge(a.text)},`${r}-heading`)}return a.type==="paragraph"?t.jsx("p",{children:ge(a.text)},`${r}-paragraph`):a.type==="pre"?t.jsx("pre",{children:t.jsx("code",{children:a.text})},`${r}-pre`):a.type==="table"?t.jsx("div",{"aria-label":"表格内容,可横向滚动",className:"make-ai-assistant__markdown-table-scroll",role:"region",tabIndex:0,children:t.jsxs("table",{className:"make-ai-assistant__markdown-table",children:[t.jsx("thead",{children:t.jsx("tr",{children:a.headers.map((n,i)=>t.jsx("th",{scope:"col",children:ge(n)},`${i}-${n}`))})}),t.jsx("tbody",{children:a.rows.map((n,i)=>t.jsx("tr",{children:n.map((c,p)=>t.jsx("td",{children:ge(c)},`${p}-${c}`))},`${i}-${n.join("|")}`))})]})},`${r}-table`):t.jsx("ul",{children:a.items.map((n,i)=>t.jsx("li",{children:ge(n)},`${i}-${n}`))},`${r}-list`)})}):null},kt=({assistantName:e})=>t.jsxs("div",{className:"make-ai-assistant__message-identity",children:[t.jsx(Te,{className:"make-ai-assistant__avatar--message"}),t.jsx("span",{className:"make-ai-assistant__message-sender",children:e})]}),It=e=>{for(let s=e.messages.length-1;s>=0;s-=1){const a=e.messages[s];if(a.role==="assistant"&&a.status==="streaming")return a.id}},ks=e=>{for(let s=e.messages.length-1;s>=0;s-=1)if(e.messages[s].role==="user")return s;return-1},bt=e=>{const s=ks(e);if(!(s<0))for(let a=e.messages.length-1;a>s;a-=1){const r=e.messages[a];if(r.role==="assistant")return r.id}},Is=e=>{if(e.status==="idle")for(let s=e.messages.length-1;s>=0;s-=1){const a=e.messages[s];if(a.role==="assistant"&&a.status==="complete")return a.id}},bs=e=>{for(let s=e.messages.length-1;s>=0;s-=1){const a=e.messages[s];if(a.role==="user")return a}},ws=(e,s)=>{const a=e.messages.findIndex(r=>r.id===s&&r.role==="user");return{...e,error:void 0,progress:void 0,status:"streaming",messages:a<0?e.messages:e.messages.slice(0,a+1)}},Ts=e=>e.scrollHeight-e.scrollTop-e.clientHeight<=48,ut=(e="smooth")=>globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches?"auto":e,Re=(e,s)=>{typeof e.scrollTo=="function"?e.scrollTo({top:e.scrollHeight,behavior:s}):e.scrollTop=e.scrollHeight},wt=({error:e,onRetry:s})=>t.jsxs("div",{className:"make-ai-assistant__message-status make-ai-assistant__message-status--error","data-error-presentation":"request-failed",role:"alert",children:[t.jsxs("div",{className:"make-ai-assistant__message-status-header",children:[t.jsx("span",{className:"make-ai-assistant__message-status-icon","aria-hidden":"true",children:t.jsx(gs,{})}),t.jsx("strong",{children:"请求未完成"})]}),t.jsx("span",{className:"make-ai-assistant__message-status-message",children:e.message}),e.retryable&&s?t.jsxs("button",{className:"make-ai-assistant__retry",type:"button",onClick:s,children:[t.jsx(At,{}),"重新发送"]}):null]}),Ns=({error:e,onRetry:s})=>{const a=os(e);return t.jsxs("section",{"aria-live":"assertive",className:"make-ai-assistant__load-failure","data-load-failure-kind":a.kind,role:"alert",children:[t.jsx("span",{className:"make-ai-assistant__load-failure-icon","aria-hidden":"true",children:t.jsxs("svg",{viewBox:"0 0 24 24",children:[t.jsx("path",{d:"M5 12a7 7 0 0 1 13.4-2.8A4.5 4.5 0 0 1 18 18H7.5A4.5 4.5 0 0 1 5 12Z"}),t.jsx("path",{d:"m9.2 14.8 5.6-5.6M9.2 9.2l5.6 5.6"})]})}),t.jsxs("div",{className:"make-ai-assistant__load-failure-copy",children:[t.jsx("span",{className:"make-ai-assistant__load-failure-label",children:a.label}),t.jsx("h3",{children:a.title}),t.jsx("p",{children:a.description})]}),t.jsxs("button",{className:"make-ai-assistant__retry make-ai-assistant__retry--primary",type:"button",onClick:s,children:[t.jsx(At,{}),a.actionLabel]})]})},Tt=({active:e,steps:s})=>{if(!e||!s?.length)return null;const a=s[s.length-1]??"处理中";return t.jsxs("details",{className:"make-ai-assistant__process",open:!0,children:[t.jsxs("summary",{children:[t.jsxs("span",{className:"make-ai-assistant__progress",role:"status",children:[t.jsx("span",{"aria-hidden":"true"}),t.jsx("span",{children:a})]}),t.jsxs("span",{className:"make-ai-assistant__process-count",children:[s.length," 步"]})]}),t.jsx("ol",{children:s.map((r,n)=>t.jsxs("li",{"data-step-active":n===s.length-1?!0:void 0,children:[t.jsx("span",{"aria-hidden":"true"}),t.jsx("span",{children:r})]},`${n}-${r}`))})]})},Ms=({copyFeedback:e,onCopy:s,onRegenerate:a})=>!s&&!a?null:t.jsxs("div",{className:"make-ai-assistant__reply-actions","aria-label":"回复操作",children:[s?t.jsx("button",{"aria-label":"复制回答",className:"make-ai-assistant__reply-action make-ai-assistant__reply-copy","data-tooltip":"复制",type:"button",onClick:s,children:t.jsx(ds,{})}):null,a?t.jsx("button",{"aria-label":"重新生成",className:"make-ai-assistant__reply-action make-ai-assistant__reply-regenerate","data-tooltip":"重新生成",type:"button",onClick:a,children:t.jsx(ms,{})}):null,e?t.jsx("span",{className:"make-ai-assistant__reply-feedback","data-copy-status":e.status,role:"status",children:e.message}):null]}),pt=({assistantName:e,error:s,onRetry:a,progress:r})=>{const n=s?"error":"progress";return s?.message??r?.message?t.jsx("article",{"aria-label":`${e}的${n==="error"?"错误消息":"状态消息"}`,className:`make-ai-assistant__message make-ai-assistant__message--assistant make-ai-assistant__message--${n}`,"data-message-role":"assistant","data-message-state":n,children:t.jsxs("div",{className:"make-ai-assistant__message-turn",children:[t.jsx(kt,{assistantName:e}),t.jsx("div",{className:"make-ai-assistant__message-stack",children:s?t.jsx(wt,{error:s,onRetry:a}):t.jsx(Tt,{active:!0,steps:r?.steps})})]})}):null},Es=(e,s,a,r,n,i,c,p,v,f,w,T,S,M)=>{const _=bt(e),P=It(e),C=Is(e);let $;return e.messages.map(h=>{const A=h.role==="assistant",I=$;A||($=h);const Z=h.id===P,Q=h.id===_?e.error:void 0,W=h.error??Q,L=!A&&!!(v?.trim()||f),D=A?c:v?.trim()||"用户",j=A&&h.status==="complete"&&!W&&(h.content.trim()||h.id===C);return t.jsx("article",{"aria-label":`${D}的消息`,className:`make-ai-assistant__message make-ai-assistant__message--${h.role}`,"data-message-role":h.role,"data-message-state":W?"error":void 0,"data-message-status":h.status,"data-message-has-identity":A||L?!0:void 0,children:t.jsxs("div",{className:"make-ai-assistant__message-turn",children:[A?t.jsx(kt,{assistantName:c}):L?t.jsx(_s,{userAvatarUrl:f,userName:v}):null,t.jsxs("div",{className:"make-ai-assistant__message-stack",children:[h.content?A?t.jsx(As,{content:h.content}):t.jsx("div",{className:"make-ai-assistant__bubble",children:h.content}):h.status==="streaming"?t.jsxs("div",{className:"make-ai-assistant__typing","aria-label":`${c}正在思考`,children:[t.jsx("span",{}),t.jsx("span",{}),t.jsx("span",{})]}):null,A?t.jsx(Tt,{active:Z&&e.status==="streaming",steps:h.progressSteps}):null,W?t.jsx(wt,{error:W,onRetry:Q?p:void 0}):null,h.artifacts.map(E=>t.jsx(ft,{artifact:E,context:s,onAction:n,onActionError:i,registry:a,theme:r},E.id)),j?t.jsx(Ms,{copyFeedback:w?.messageId===h.id?{message:w.message,status:w.status}:void 0,onCopy:h.content.trim()?()=>S(h.id,h.content):void 0,onRegenerate:T&&h.id===C&&I?()=>M({userMessage:I,assistantMessage:h}):void 0}):null]})]})},h.id)})};function Nt({assistantName:e="AI 助手",brandName:s,context:a,onAction:r,onActionError:n,onClose:i,onNewConversation:c,headerHeight:p,privacyNotice:v,registry:f,subtitle:w,suggestions:T,title:S,theme:M,transport:_,userAvatarUrl:P,userName:C,visible:$}){const h=jt(s,S),A=v?.trim(),I=ss(w,a.app.name),Z=rs(p),Q=Ce(M),W=Q||Z?{...Q,...Z?{"--make-ai-internal-header-height":Z}:{}}:void 0,[L,D]=l.useState(""),[j,E]=l.useState(m.createAssistantConversationState),z=l.useRef(j);z.current=j;const[J,V]=l.useState(void 0),[xe,u]=l.useState(void 0),[b,K]=l.useState(0),[H,_e]=l.useState(()=>_.loadConversation?"loading":"ready"),[Mt,Ne]=l.useState(void 0),[Et,U]=l.useState(!1),[ee,$e]=l.useState(!1),[le,Le]=l.useState(void 0),te=l.useRef(void 0),se=l.useRef(void 0),ae=l.useRef(0),Oe=l.useRef(null),de=l.useRef(null),Fe=l.useRef(null),Pe=l.useRef(null),De=l.useRef(null),Ve=l.useRef(null),q=l.useRef(!0),Ke=l.useRef(a.app.id),He=l.useRef($),Be=l.useId(),We=l.useMemo(()=>f??vt(),[f]),ze=l.useMemo(()=>es(T),[T]),Ue=()=>{const o=Pe.current,x=De.current;if(!o||!x||typeof window>"u")return;const g=ns(o.getBoundingClientRect(),x.getBoundingClientRect(),window.innerHeight,window.innerWidth);Le(y=>y?.left===g.left&&y.top===g.top&&y.placement===g.placement?y:g)},qe=()=>$e(!0),Xe=()=>$e(!1),St=le?{left:`${le.left}px`,top:`${le.top}px`}:void 0;l.useLayoutEffect(()=>{if(!ee||!A){Le(void 0);return}Ue()},[ee,A]),l.useEffect(()=>{if(!ee||!A)return;const o=()=>Ue();return window.addEventListener("resize",o),window.addEventListener("scroll",o,!0),()=>{window.removeEventListener("resize",o),window.removeEventListener("scroll",o,!0)}},[ee,A]);const ve=o=>{const x=te.current,g=se.current?.iterator;return!x&&!g?!1:(ae.current+=1,te.current=void 0,se.current=void 0,console.info("[make-ai-assistant] local run cancellation requested",{reason:o}),x?.abort(),mt(g),!0)};l.useEffect(()=>()=>{ve("unmount")},[]),l.useEffect(()=>{const o=_.loadConversation,x=Ke.current!==a.app.id;if(Ke.current=a.app.id,ve("reinitialize"),x&&(D(""),q.current=!0),V(void 0),u(void 0),U(!1),E(m.createAssistantConversationState()),!o){Ne(void 0),_e("ready");return}const g=new AbortController;return Ne(void 0),_e("loading"),console.info("[make-ai-assistant] conversation load start",{appId:a.app.id}),o.call(_,a,{signal:g.signal}).then(y=>{g.signal.aborted||(E(m.createAssistantConversationState(y)),_e("ready"),console.info("[make-ai-assistant] conversation load success",{appId:a.app.id,messageCount:y.messages.length}))}).catch(y=>{g.signal.aborted||(console.error("[make-ai-assistant] conversation load failed",{appId:a.app.id,errorType:y instanceof Error?y.name:typeof y}),Ne(y),_e("error"))}),()=>g.abort()},[a.app.id,b,_]),l.useEffect(()=>{const o=de.current;if(!o||!q.current)return;U(!1);const x=requestAnimationFrame(()=>{if(!q.current)return;const g=j.status==="streaming"||globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches?"auto":"smooth";Re(o,g)});return()=>cancelAnimationFrame(x)},[j.messages,j.progress,j.status]),l.useEffect(()=>{const o=$&&!He.current;if(He.current=$,!o)return;const x=requestAnimationFrame(()=>{const g=de.current;if(g&&q.current){U(!1);const me=z.current.status==="streaming"?"auto":ut();Re(g,me)}else g&&U(z.current.messages.length>0);const y=Fe.current;(y&&!y.disabled?y:Ve.current??Oe.current?.querySelector("button:not(:disabled)"))?.focus()});return()=>cancelAnimationFrame(x)},[$]);const Rt=()=>{const o=de.current;if(!o)return;const x=Ts(o);q.current=x,U(!x&&z.current.messages.length>0)},Ct=()=>{const o=de.current;if(!o)return;q.current=!0,U(!1);const x=ut();Re(o,x)},Ye=async(o,x)=>{const g=o.trim(),y=z.current,B=x?.regenerateFrom,me=_.regenerate;if(!g||H!=="ready"||y.status==="streaming"||te.current||B&&!me)return;if(m.countCodePointsUpTo(g,m.MAKE_AI_CONVERSATION_LIMITS.messageCharacters)>m.MAKE_AI_CONVERSATION_LIMITS.messageCharacters){V(`输入内容过长,请控制在 ${m.MAKE_AI_CONVERSATION_LIMITS.messageCharacters} 个字符以内`);return}const Ae={id:B?.userMessage.id??Zt("user"),content:g},ke=B?ws(y,B.userMessage.id):m.appendUserMessage(y,Ae),Ie=new AbortController,ne=ae.current+1;ae.current=ne,te.current=Ie,V(void 0),u(void 0),U(!q.current&&y.messages.length>0),B||D(""),E(ke);try{let X=!1,N,Qe=0,Je=0,et=0,Me=0,ue=0;const pe=new Map,tt=new Set,st=new Set([...ke.messages.map(be=>be.id),Ae.id]),he=new Set,at=G.createArtifactCapabilities(We),nt={signal:Ie.signal};let Ee;if(B){if(!me)throw new k("当前 AI 助手不支持重新生成");Ee=me({threadId:ke.threadId,message:Ae,assistantMessage:{id:B.assistantMessage.id,content:B.assistantMessage.content},context:a,capabilities:at},nt)}else Ee=_.run({threadId:ke.threadId,message:Ae,context:a,capabilities:at},nt);const rt=Ee[Symbol.asyncIterator]();for(se.current={iterator:rt,requestVersion:ne};;){const be=await rt.next();if(ae.current!==ne||be.done)break;let d;try{d=m.parseAssistantEvent(be.value)}catch(R){throw new k(R instanceof Error?R.message:"Invalid assistant event")}if(d.type==="message.start"){if(N!==void 0&&N!==d.runId)throw new k("AI 助手响应 run id 不一致");if(N??=d.runId,Je+=1,Je>m.MAKE_AI_CONVERSATION_LIMITS.assistantMessagesPerRun)throw new k("AI 助手单次响应消息数量超过限制");if(st.has(d.messageId))throw new k("AI 助手响应包含重复的 message id");st.add(d.messageId),he.add(d.messageId),pe.set(d.messageId,0)}if(d.type==="message.delta"){if(!he.has(d.messageId))throw new k("AI 助手响应事件顺序无效");const R=pe.get(d.messageId)??0,re=m.countCodePointsUpTo(d.delta,m.MAKE_AI_CONVERSATION_LIMITS.messageCharacters-ue);if(ue+re>m.MAKE_AI_CONVERSATION_LIMITS.messageCharacters)throw new k("AI 助手响应文本超过大小限制");ue+=re,pe.set(d.messageId,R+re)}if(d.type==="message.replace"){if(!he.has(d.messageId))throw new k("AI 助手响应事件顺序无效");const R=pe.get(d.messageId)??0,re=m.countCodePointsUpTo(d.content,m.MAKE_AI_CONVERSATION_LIMITS.messageCharacters),it=ue-R+re;if(it>m.MAKE_AI_CONVERSATION_LIMITS.messageCharacters)throw new k("AI 助手响应文本超过大小限制");ue=it,pe.set(d.messageId,re)}if(d.type==="run.progress"){if(N!==void 0&&N!==d.runId)throw new k("AI 助手响应 run id 不一致");if(N??=d.runId,et+=1,et>m.MAKE_AI_CONVERSATION_LIMITS.progressStepsPerRun)throw new k("AI 助手处理过程数量超过限制");const R=m.countCodePointsUpTo(d.message,m.MAKE_AI_CONVERSATION_LIMITS.progressCharactersPerRun-Me);if(Me+R>m.MAKE_AI_CONVERSATION_LIMITS.progressCharactersPerRun)throw new k("AI 助手处理过程文本超过大小限制");Me+=R}if(d.type==="artifact"){if(!he.has(d.messageId))throw new k("AI 助手响应事件顺序无效");if(Qe+=1,Qe>m.MAKE_AI_CONVERSATION_LIMITS.artifactsPerRun)throw new k("AI 助手单次响应 Artifact 数量超过限制");if(tt.has(d.artifact.id))throw new k("AI 助手响应包含重复的 Artifact id");tt.add(d.artifact.id)}if(d.type==="message.complete"&&!he.delete(d.messageId))throw new k("AI 助手响应事件顺序无效");if(d.type==="run.complete"&&N!==void 0&&N!==d.runId)throw new k("AI 助手响应 run id 不一致");if(d.type==="run.cancelled"&&d.runId!==void 0&&N!==void 0&&N!==d.runId)throw new k("AI 助手响应 run id 不一致");if(E(R=>m.reduceAssistantEvent(R,d)),d.type==="error"||d.type==="run.cancelled"||d.type==="run.complete"){X=!0;break}}if(!X)throw new k("AI 助手流式响应在终止事件前结束")}catch(X){if(ae.current!==ne)return;if(Ie.signal.aborted){E(N=>m.reduceAssistantEvent(N,{type:"run.cancelled"}));return}console.error("[make-ai-assistant] assistant run failed",{appId:a.app.id,errorType:X instanceof Error?X.name:typeof X}),E(N=>m.reduceAssistantEvent(N,{type:"error",code:"TRANSPORT_ERROR",message:X instanceof k?X.message:"连接失败,请重试",retryable:!0}))}finally{ae.current===ne&&te.current===Ie&&(te.current=void 0),se.current?.requestVersion===ne&&(mt(se.current.iterator),se.current=void 0)}},je=o=>Ye(o),$t=o=>Ye(o.userMessage.content,{regenerateFrom:o}),Lt=async(o,x)=>{try{await cs(x),u({messageId:o,message:"已复制",status:"success"})}catch(g){console.error("[make-ai-assistant] copy answer failed",{errorType:g instanceof Error?g.name:typeof g}),u({messageId:o,message:"复制失败",status:"error"})}},Ot=o=>{o.preventDefault(),je(L)},Ft=o=>{o.key==="Enter"&&!o.shiftKey&&!o.nativeEvent.isComposing&&(o.preventDefault(),je(L))},Pt=()=>{ve("stop")&&E(o=>m.reduceAssistantEvent(o,{type:"run.cancelled"}))},Dt=()=>{ve("new-conversation"),D(""),V(void 0),u(void 0),U(!1),q.current=!0,E(m.createAssistantConversationState()),c?.()},Ge=_.features?.remoteCancellation===!1?"停止接收":"停止生成",Vt=It(j),Kt=bt(j),ye=bs(j),Ht=typeof _.regenerate=="function"&&_.features?.regeneration!==!1,Ze=()=>{ye&&je(ye.content)};return t.jsxs("section",{className:"make-ai-assistant make-ai-assistant__panel",ref:Oe,style:W,children:[t.jsxs("header",{className:"make-ai-assistant__header",children:[t.jsx(Te,{}),t.jsxs("div",{className:"make-ai-assistant__header-content",children:[t.jsxs("div",{className:"make-ai-assistant__header-title-row",children:[t.jsx("h2",{className:"make-ai-assistant__header-title",title:h,children:h}),t.jsx("span",{className:"make-ai-assistant__read-only-tag",children:"只读"})]}),t.jsxs("div",{className:"make-ai-assistant__header-context",children:[t.jsx("p",{title:I,children:I}),A?t.jsxs(t.Fragment,{children:[t.jsx("span",{"aria-describedby":Be,"aria-label":`使用提示:${A}`,className:"make-ai-assistant__header-context-help","data-tooltip":A,ref:Pe,role:"note",tabIndex:0,onBlur:Xe,onFocus:qe,onPointerEnter:qe,onPointerLeave:Xe,children:t.jsx(us,{})}),t.jsx("span",{"aria-hidden":!ee,className:"make-ai-assistant__header-context-tooltip","data-placement":le?.placement,"data-positioned":le?!0:void 0,"data-visible":ee||void 0,id:Be,ref:De,role:"tooltip",style:St,children:A})]}):null]})]}),t.jsxs("div",{className:"make-ai-assistant__header-actions",children:[_.features?.newConversation!==!1?t.jsx("button",{"aria-label":"新建对话",className:"make-ai-assistant__icon-button",type:"button",onClick:Dt,children:t.jsx(hs,{})}):null,i?t.jsx("button",{"aria-label":`关闭 ${h}`,className:"make-ai-assistant__icon-button",type:"button",onClick:i,children:t.jsx(ls,{})}):null]})]}),t.jsxs("div",{className:"make-ai-assistant__body","aria-live":"polite","aria-relevant":"additions text",ref:de,role:"log",onScroll:Rt,children:[H==="loading"?t.jsxs("div",{className:"make-ai-assistant__empty",role:"status",children:[t.jsx(Te,{}),t.jsx("h3",{children:"正在恢复对话"}),t.jsx("p",{children:"正在读取当前 App 的历史消息…"})]}):H==="error"?t.jsx("div",{className:"make-ai-assistant__empty",children:t.jsx(Ns,{error:Mt,onRetry:()=>K(o=>o+1)})}):j.messages.length===0?t.jsxs("div",{className:"make-ai-assistant__empty",children:[t.jsx(Te,{}),t.jsx("h3",{children:"有什么可以帮你?"}),t.jsx("p",{children:"我会结合当前 App、页面位置和宿主允许的上下文回答,并把过程与结果分开展示。"})]}):Es(j,a,We,M,r,n,e,ye?Ze:void 0,C,P,xe,Ht,(o,x)=>{Lt(o,x)},o=>{$t(o)}),j.progress&&!Vt?t.jsx(pt,{assistantName:e,progress:j.progress}):null,j.error&&!Kt?t.jsx(pt,{assistantName:e,error:j.error,onRetry:ye?Ze:void 0}):null]}),Et?t.jsx("button",{"aria-label":"回到最新消息",className:"make-ai-assistant__back-to-latest",type:"button",onClick:Ct,children:t.jsx(ps,{})}):null,t.jsxs("footer",{className:"make-ai-assistant__composer-region",children:[H==="ready"&&ze.length>0&&j.messages.length===0?t.jsx("div",{className:"make-ai-assistant__suggestions","aria-label":"推荐问题",children:ze.map((o,x)=>t.jsx("button",{type:"button",onClick:()=>{je(o)},children:o},`${x}-${o}`))}):null,t.jsxs("form",{className:"make-ai-assistant__composer",onSubmit:Ot,children:[t.jsx("textarea",{"aria-label":`向 ${e} 提问`,"aria-describedby":J?"make-ai-composer-error":void 0,"aria-invalid":J?!0:void 0,autoFocus:!0,disabled:H!=="ready"||j.status==="streaming",placeholder:`询问当前 ${a.app.name??"App"} 中的数据…`,ref:Fe,rows:2,value:L,onChange:o=>{D(o.currentTarget.value),V(void 0)},onKeyDown:Ft}),j.status==="streaming"?t.jsx("button",{"aria-label":Ge,className:"make-ai-assistant__send make-ai-assistant__send--stop","data-tooltip":Ge,ref:Ve,type:"button",onClick:Pt,children:t.jsx("span",{"aria-hidden":"true"})}):t.jsx("button",{"aria-label":"发送",className:"make-ai-assistant__send",disabled:H!=="ready"||!L.trim(),type:"submit",children:t.jsx(fs,{})})]}),J?t.jsx("p",{id:"make-ai-composer-error",role:"alert",children:J}):null,t.jsx("p",{children:"AI 生成的结果可能存在偏差,重要数据请核对明细。"})]})]})}function Ss(e){return t.jsx(Nt,{...e,visible:!0})}function Rs({defaultOpen:e=!1,hideLauncher:s=!1,launcher:a,onOpenChange:r,open:n,...i}){const c=jt(i.brandName,i.title),[p,v]=l.useState(e),[f,w]=l.useState(()=>e||n===!0),T=l.useRef(null),S=l.useRef(null),M=l.useRef(void 0),[_,P]=l.useState(),[C,$]=l.useState(as),[h,A]=l.useState(!1),I=n??p,Z=Ce(i.theme),Q=typeof window>"u"?void 0:window.innerWidth,W=_===void 0?void 0:{"--make-ai-internal-drawer-width":`${_}px`},L=()=>{if(_!==void 0)return _;const u=S.current?.getBoundingClientRect().width;return u&&Number.isFinite(u)&&u>0?u:C},D=()=>typeof window>"u"?Number.POSITIVE_INFINITY:window.innerWidth,j=u=>{if(u.button!==0)return;const b=L(),K=_===void 0?b:C;$(K),M.current={minimumWidth:K,pointerId:u.pointerId,startWidth:b,startX:u.clientX},A(!0),typeof u.currentTarget.setPointerCapture=="function"&&u.currentTarget.setPointerCapture(u.pointerId),u.preventDefault()},E=u=>{const b=M.current;if(!b||b.pointerId!==u.pointerId)return;const K=lt(b.startWidth+b.startX-u.clientX,b.minimumWidth,D());P(K)},z=u=>{const b=M.current;!b||b.pointerId!==u.pointerId||(M.current=void 0,A(!1))},J=u=>{const b=u.key==="ArrowLeft"?ct:u.key==="ArrowRight"?-ct:void 0;if(b===void 0)return;u.preventDefault();const K=L(),H=_===void 0?K:C;$(H),P(lt(K+b,H,D()))},V=u=>{n===void 0&&v(u),r?.(u),u||requestAnimationFrame(()=>T.current?.focus())},xe=()=>V(!I);return l.useEffect(()=>{I&&w(!0)},[I]),l.useEffect(()=>{if(!I)return;const u=b=>{b.key==="Escape"&&(V(!1),requestAnimationFrame(()=>T.current?.focus()))};return document.addEventListener("keydown",u),()=>document.removeEventListener("keydown",u)},[r,I]),t.jsxs("div",{className:"make-ai-assistant","data-open":I||void 0,style:Z,children:[!s&&(!I||a)?a?a({open:I,toggle:xe}):t.jsxs("button",{"aria-label":I?`关闭 ${c}`:`打开 ${c}`,"aria-expanded":I,className:"make-ai-assistant__launcher",ref:T,type:"button",onClick:xe,children:[t.jsx("span",{className:"make-ai-assistant__launcher-orbit","aria-hidden":"true"}),t.jsx(yt,{})]}):null,f?t.jsxs("aside",{"aria-label":c,"aria-modal":"false",className:"make-ai-assistant__drawer","data-resizing":h||void 0,hidden:!I,ref:S,role:"dialog",style:W,children:[t.jsx("div",{"aria-label":"调整对话框宽度","aria-orientation":"vertical","aria-valuemax":Q,"aria-valuemin":C,"aria-valuenow":_??C,className:"make-ai-assistant__drawer-resize-handle",role:"separator",tabIndex:0,onKeyDown:J,onPointerCancel:z,onPointerDown:j,onPointerMove:E,onPointerUp:z}),t.jsx(Nt,{...i,onClose:()=>V(!1),visible:I})]}):null]})}exports.createArtifactCapabilities=G.createArtifactCapabilities;exports.createArtifactTemplateRegistry=G.createArtifactTemplateRegistry;exports.extendArtifactTemplateRegistry=G.extendArtifactTemplateRegistry;exports.resolveArtifactTemplate=G.resolveArtifactTemplate;exports.MAKE_AI_ARTIFACT_KINDS=m.MAKE_AI_ARTIFACT_KINDS;exports.MAKE_AI_ARTIFACT_LIMITS=m.MAKE_AI_ARTIFACT_LIMITS;exports.MAKE_AI_ARTIFACT_SCHEMA_VERSION=m.MAKE_AI_ARTIFACT_SCHEMA_VERSION;exports.MAKE_AI_CONVERSATION_LIMITS=m.MAKE_AI_CONVERSATION_LIMITS;exports.appendUserMessage=m.appendUserMessage;exports.createAssistantConversationState=m.createAssistantConversationState;exports.parseArtifact=m.parseArtifact;exports.parseAssistantEvent=m.parseAssistantEvent;exports.reduceAssistantEvent=m.reduceAssistantEvent;exports.validateArtifact=m.validateArtifact;exports.ArtifactRenderer=ft;exports.AssistantPanel=Ss;exports.MakeAiAssistant=Rs;exports.createPlatformArtifactRegistry=vt;exports.formatArtifactValue=Y;exports.platformArtifactTemplates=_t;
|