@zhama/a2ui-core 0.1.0 → 0.2.0
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/README.md +95 -22
- package/dist/builders/index.cjs +3 -496
- package/dist/builders/index.d.cts +8 -13
- package/dist/builders/index.d.ts +8 -13
- package/dist/builders/index.js +3 -445
- package/dist/index.cjs +3 -869
- package/dist/index.d.cts +3 -41
- package/dist/index.d.ts +3 -41
- package/dist/index.js +3 -802
- package/dist/primitives-nmkVz-tB.d.cts +80 -0
- package/dist/primitives-nmkVz-tB.d.ts +80 -0
- package/dist/types/index.cjs +2 -22
- package/dist/types/index.d.cts +3 -79
- package/dist/types/index.d.ts +3 -79
- package/dist/types/index.js +2 -15
- package/dist/utils/index.cjs +1 -0
- package/dist/utils/index.d.cts +40 -0
- package/dist/utils/index.d.ts +40 -0
- package/dist/utils/index.js +1 -0
- package/dist/validators/index.cjs +1 -313
- package/dist/validators/index.d.cts +1 -0
- package/dist/validators/index.d.ts +1 -0
- package/dist/validators/index.js +1 -308
- package/package.json +80 -53
- package/dist/builders/index.cjs.map +0 -1
- package/dist/builders/index.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/types/index.cjs.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/validators/index.cjs.map +0 -1
- package/dist/validators/index.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,89 +1,116 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhama/a2ui-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "A2UI Protocol Core Library - Framework-agnostic TypeScript types and builders for A2UI protocol",
|
|
5
|
-
"author": "Zhama",
|
|
6
|
-
"license": "MIT",
|
|
7
5
|
"type": "module",
|
|
8
|
-
"main": "
|
|
9
|
-
"module": "
|
|
10
|
-
"types": "
|
|
6
|
+
"main": "dist/index.cjs",
|
|
7
|
+
"module": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
11
9
|
"exports": {
|
|
12
10
|
".": {
|
|
13
|
-
"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
"require": {
|
|
18
|
-
"types": "./dist/index.d.cts",
|
|
19
|
-
"default": "./dist/index.cjs"
|
|
20
|
-
}
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs",
|
|
14
|
+
"default": "./dist/index.js"
|
|
21
15
|
},
|
|
22
16
|
"./types": {
|
|
23
|
-
"
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
"require": {
|
|
28
|
-
"types": "./dist/types/index.d.cts",
|
|
29
|
-
"default": "./dist/types/index.cjs"
|
|
30
|
-
}
|
|
17
|
+
"types": "./dist/types/index.d.ts",
|
|
18
|
+
"import": "./dist/types/index.js",
|
|
19
|
+
"require": "./dist/types/index.cjs",
|
|
20
|
+
"default": "./dist/types/index.js"
|
|
31
21
|
},
|
|
32
22
|
"./builders": {
|
|
33
|
-
"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
"require": {
|
|
38
|
-
"types": "./dist/builders/index.d.cts",
|
|
39
|
-
"default": "./dist/builders/index.cjs"
|
|
40
|
-
}
|
|
23
|
+
"types": "./dist/builders/index.d.ts",
|
|
24
|
+
"import": "./dist/builders/index.js",
|
|
25
|
+
"require": "./dist/builders/index.cjs",
|
|
26
|
+
"default": "./dist/builders/index.js"
|
|
41
27
|
},
|
|
42
28
|
"./validators": {
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
29
|
+
"types": "./dist/validators/index.d.ts",
|
|
30
|
+
"import": "./dist/validators/index.js",
|
|
31
|
+
"require": "./dist/validators/index.cjs",
|
|
32
|
+
"default": "./dist/validators/index.js"
|
|
33
|
+
},
|
|
34
|
+
"./utils": {
|
|
35
|
+
"types": "./dist/utils/index.d.ts",
|
|
36
|
+
"import": "./dist/utils/index.js",
|
|
37
|
+
"require": "./dist/utils/index.cjs",
|
|
38
|
+
"default": "./dist/utils/index.js"
|
|
51
39
|
}
|
|
52
40
|
},
|
|
53
41
|
"files": [
|
|
54
|
-
"dist",
|
|
55
|
-
"
|
|
42
|
+
"dist/**/*.js",
|
|
43
|
+
"dist/**/*.cjs",
|
|
44
|
+
"dist/**/*.d.ts",
|
|
45
|
+
"dist/**/*.d.cts"
|
|
56
46
|
],
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"access": "public"
|
|
49
|
+
},
|
|
57
50
|
"scripts": {
|
|
58
51
|
"build": "tsup",
|
|
59
52
|
"dev": "tsup --watch",
|
|
53
|
+
"lint": "eslint src",
|
|
54
|
+
"lint:fix": "eslint src --fix",
|
|
55
|
+
"format": "prettier --write .",
|
|
56
|
+
"format:check": "prettier --check .",
|
|
57
|
+
"type-check": "tsc --noEmit",
|
|
60
58
|
"test": "vitest run",
|
|
61
59
|
"test:watch": "vitest",
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
60
|
+
"test:ui": "vitest --ui",
|
|
61
|
+
"test:coverage": "vitest run --coverage",
|
|
62
|
+
"clean": "rm -rf dist",
|
|
63
|
+
"prepublishOnly": "pnpm run clean && pnpm run build",
|
|
64
|
+
"prepack": "pnpm run type-check && pnpm run lint"
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
|
-
"@
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"
|
|
67
|
+
"@eslint/js": "^9.15.0",
|
|
68
|
+
"@types/node": "^22.16.5",
|
|
69
|
+
"@vitest/coverage-v8": "^4.0.16",
|
|
70
|
+
"@vitest/ui": "^4.0.16",
|
|
71
|
+
"eslint": "^9.15.0",
|
|
72
|
+
"eslint-config-prettier": "^9.1.0",
|
|
73
|
+
"eslint-plugin-import": "^2.31.0",
|
|
74
|
+
"eslint-plugin-prettier": "^5.2.1",
|
|
75
|
+
"globals": "^15.12.0",
|
|
76
|
+
"prettier": "^3.3.3",
|
|
77
|
+
"tsup": "^8.3.5",
|
|
78
|
+
"typescript": "^5.7.3",
|
|
79
|
+
"typescript-eslint": "^8.15.0",
|
|
80
|
+
"vitest": "^4.0.16"
|
|
72
81
|
},
|
|
73
82
|
"keywords": [
|
|
74
83
|
"a2ui",
|
|
75
84
|
"agent-to-ui",
|
|
85
|
+
"ai",
|
|
86
|
+
"artificial-intelligence",
|
|
87
|
+
"llm",
|
|
88
|
+
"large-language-model",
|
|
76
89
|
"protocol",
|
|
90
|
+
"ui-generation",
|
|
91
|
+
"dynamic-ui",
|
|
77
92
|
"typescript",
|
|
78
|
-
"
|
|
79
|
-
"streaming-ui"
|
|
93
|
+
"google-a2ui",
|
|
94
|
+
"streaming-ui",
|
|
95
|
+
"agent"
|
|
80
96
|
],
|
|
97
|
+
"author": {
|
|
98
|
+
"name": "Zhama AI",
|
|
99
|
+
"email": "support@zhama.com",
|
|
100
|
+
"url": "https://zhama.com"
|
|
101
|
+
},
|
|
102
|
+
"license": "MIT",
|
|
81
103
|
"repository": {
|
|
82
104
|
"type": "git",
|
|
83
|
-
"url": "https://github.com/zhama/a2ui-core"
|
|
105
|
+
"url": "git+https://github.com/zhama/a2ui-core.git"
|
|
106
|
+
},
|
|
107
|
+
"bugs": {
|
|
108
|
+
"url": "https://github.com/zhama/a2ui-core/issues",
|
|
109
|
+
"email": "support@zhama.com"
|
|
84
110
|
},
|
|
111
|
+
"homepage": "https://github.com/zhama/a2ui-core#readme",
|
|
85
112
|
"engines": {
|
|
86
|
-
"node": ">=18.0.0"
|
|
113
|
+
"node": ">=18.0.0",
|
|
114
|
+
"pnpm": ">=8.0.0"
|
|
87
115
|
}
|
|
88
116
|
}
|
|
89
|
-
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/builders/id-generator.ts","../../src/builders/component-builder.ts","../../src/types/messages.ts","../../src/builders/data-model-builder.ts","../../src/builders/message-builder.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * ID Generator\n *\n * 生成唯一的组件 ID\n */\n\nlet componentIdCounter = 0;\n\n/**\n * 生成唯一的组件 ID\n *\n * @param prefix - ID 前缀\n * @returns 唯一的组件 ID\n *\n * @example\n * generateId('text'); // 'text_1703123456789_0'\n * generateId('btn'); // 'btn_1703123456789_1'\n */\nexport function generateId(prefix = 'comp'): string {\n return `${prefix}_${Date.now()}_${componentIdCounter++}`;\n}\n\n/**\n * 重置 ID 计数器\n * 在渲染新场景时调用,确保 ID 从 0 开始\n */\nexport function resetIdCounter(): void {\n componentIdCounter = 0;\n}\n\n/**\n * 获取当前计数器值(用于测试)\n */\nexport function getIdCounter(): number {\n return componentIdCounter;\n}\n\n","/**\n * Component Builder\n *\n * 提供 A2UI 组件定义的构建工具函数\n * 用于创建符合 A2UI v0.9 协议的组件结构\n */\n\nimport type {\n ComponentInstance,\n Action,\n TextComponent,\n ImageComponent,\n RowComponent,\n ListComponent,\n DividerComponent,\n TextFieldComponent,\n ChoicePickerComponent,\n ChildrenProperty,\n StringOrPath,\n NumberOrPath,\n BooleanOrPath,\n StringArrayOrPath,\n} from '../types';\nimport { generateId } from './id-generator';\n\n// ============================================================================\n// 类型定义\n// ============================================================================\n\n/**\n * 组件构建选项基类\n */\nexport interface ComponentOptions {\n /** 组件 ID(可选,自动生成) */\n id?: string;\n /** 在 Row/Column 中的权重 */\n weight?: number;\n}\n\n/**\n * Text 组件选项\n */\nexport interface TextOptions extends ComponentOptions {\n usageHint?: TextComponent['usageHint'];\n}\n\n/**\n * Image 组件选项\n */\nexport interface ImageOptions extends ComponentOptions {\n fit?: ImageComponent['fit'];\n usageHint?: ImageComponent['usageHint'];\n}\n\n/**\n * Icon 组件选项\n */\nexport interface IconOptions extends ComponentOptions {}\n\n/**\n * Video 组件选项\n */\nexport interface VideoOptions extends ComponentOptions {}\n\n/**\n * AudioPlayer 组件选项\n */\nexport interface AudioPlayerOptions extends ComponentOptions {\n description?: StringOrPath;\n}\n\n/**\n * 布局组件选项\n */\nexport interface LayoutOptions extends ComponentOptions {\n alignment?: RowComponent['alignment'];\n distribution?: RowComponent['distribution'];\n}\n\n/**\n * List 组件选项\n */\nexport interface ListOptions extends ComponentOptions {\n direction?: ListComponent['direction'];\n alignment?: ListComponent['alignment'];\n}\n\n/**\n * Card 组件选项\n */\nexport interface CardOptions extends ComponentOptions {}\n\n/**\n * Tabs 组件选项\n */\nexport interface TabsOptions extends ComponentOptions {}\n\n/**\n * Tab 项目\n */\nexport interface TabItem {\n title: string;\n childId: string;\n}\n\n/**\n * Divider 组件选项\n */\nexport interface DividerOptions extends ComponentOptions {\n axis?: DividerComponent['axis'];\n}\n\n/**\n * Modal 组件选项\n */\nexport interface ModalOptions extends ComponentOptions {}\n\n/**\n * Button 组件选项\n */\nexport interface ButtonOptions extends ComponentOptions {\n primary?: boolean;\n}\n\n/**\n * CheckBox 组件选项\n */\nexport interface CheckBoxOptions extends ComponentOptions {}\n\n/**\n * TextField 组件选项\n */\nexport interface TextFieldOptions extends ComponentOptions {\n usageHint?: TextFieldComponent['usageHint'];\n validationRegexp?: string;\n}\n\n/**\n * DateTimeInput 组件选项\n */\nexport interface DateTimeInputOptions extends ComponentOptions {\n enableDate?: boolean;\n enableTime?: boolean;\n outputFormat?: string;\n label?: StringOrPath;\n}\n\n/**\n * ChoicePicker 组件选项\n */\nexport interface ChoicePickerOptions extends ComponentOptions {\n label?: StringOrPath;\n}\n\n/**\n * Slider 组件选项\n */\nexport interface SliderOptions extends ComponentOptions {\n label?: StringOrPath;\n min?: number;\n max?: number;\n}\n\n// ============================================================================\n// 内容组件\n// ============================================================================\n\n/**\n * 创建 Text 组件\n *\n * @param text - 文本内容或数据路径\n * @param options - 组件选项\n *\n * @example\n * // 静态文本\n * text('Hello World', { usageHint: 'h1' });\n *\n * // 数据绑定\n * text({ path: '/user/name' });\n */\nexport function text(content: StringOrPath, options: TextOptions = {}): ComponentInstance {\n const { id = generateId('text'), weight, usageHint } = options;\n return {\n id,\n component: 'Text',\n text: content,\n ...(weight !== undefined && { weight }),\n ...(usageHint && { usageHint }),\n };\n}\n\n/**\n * 创建 Image 组件\n *\n * @param url - 图片 URL 或数据路径\n * @param options - 组件选项\n */\nexport function image(url: StringOrPath, options: ImageOptions = {}): ComponentInstance {\n const { id = generateId('image'), weight, fit, usageHint } = options;\n return {\n id,\n component: 'Image',\n url,\n ...(weight !== undefined && { weight }),\n ...(fit && { fit }),\n ...(usageHint && { usageHint }),\n };\n}\n\n/**\n * 创建 Icon 组件\n *\n * @param name - 图标名称或数据路径\n * @param options - 组件选项\n */\nexport function icon(name: StringOrPath, options: IconOptions = {}): ComponentInstance {\n const { id = generateId('icon'), weight } = options;\n return {\n id,\n component: 'Icon',\n name,\n ...(weight !== undefined && { weight }),\n };\n}\n\n/**\n * 创建 Video 组件\n *\n * @param url - 视频 URL 或数据路径\n * @param options - 组件选项\n */\nexport function video(url: StringOrPath, options: VideoOptions = {}): ComponentInstance {\n const { id = generateId('video'), weight } = options;\n return {\n id,\n component: 'Video',\n url,\n ...(weight !== undefined && { weight }),\n };\n}\n\n/**\n * 创建 AudioPlayer 组件\n *\n * @param url - 音频 URL 或数据路径\n * @param options - 组件选项\n */\nexport function audioPlayer(url: StringOrPath, options: AudioPlayerOptions = {}): ComponentInstance {\n const { id = generateId('audio'), weight, description } = options;\n return {\n id,\n component: 'AudioPlayer',\n url,\n ...(weight !== undefined && { weight }),\n ...(description && { description }),\n };\n}\n\n// ============================================================================\n// 布局组件\n// ============================================================================\n\n/**\n * 创建 Row 组件(水平布局)\n *\n * @param children - 子组件 ID 列表或动态模板\n * @param options - 布局选项\n *\n * @example\n * // 静态子组件\n * row(['text1', 'text2', 'button1']);\n *\n * // 动态模板\n * row({ componentId: 'itemTemplate', path: '/items' });\n */\nexport function row(children: ChildrenProperty, options: LayoutOptions = {}): ComponentInstance {\n const { id = generateId('row'), weight, alignment, distribution } = options;\n return {\n id,\n component: 'Row',\n children,\n ...(weight !== undefined && { weight }),\n ...(alignment && { alignment }),\n ...(distribution && { distribution }),\n };\n}\n\n/**\n * 创建 Column 组件(垂直布局)\n *\n * @param children - 子组件 ID 列表或动态模板\n * @param options - 布局选项\n */\nexport function column(children: ChildrenProperty, options: LayoutOptions = {}): ComponentInstance {\n const { id = generateId('column'), weight, alignment, distribution } = options;\n return {\n id,\n component: 'Column',\n children,\n ...(weight !== undefined && { weight }),\n ...(alignment && { alignment }),\n ...(distribution && { distribution }),\n };\n}\n\n/**\n * 创建 List 组件\n *\n * @param children - 子组件 ID 列表或动态模板\n * @param options - 列表选项\n */\nexport function list(children: ChildrenProperty, options: ListOptions = {}): ComponentInstance {\n const { id = generateId('list'), weight, direction, alignment } = options;\n return {\n id,\n component: 'List',\n children,\n ...(weight !== undefined && { weight }),\n ...(direction && { direction }),\n ...(alignment && { alignment }),\n };\n}\n\n/**\n * 创建 Card 组件\n *\n * @param childId - 子组件 ID\n * @param options - 卡片选项\n */\nexport function card(childId: string, options: CardOptions = {}): ComponentInstance {\n const { id = generateId('card'), weight } = options;\n return {\n id,\n component: 'Card',\n child: childId,\n ...(weight !== undefined && { weight }),\n };\n}\n\n/**\n * 创建 Tabs 组件\n *\n * @param items - 标签项列表\n * @param options - Tabs 选项\n */\nexport function tabs(items: TabItem[], options: TabsOptions = {}): ComponentInstance {\n const { id = generateId('tabs'), weight } = options;\n return {\n id,\n component: 'Tabs',\n tabItems: items.map(item => ({\n title: item.title,\n child: item.childId,\n })),\n ...(weight !== undefined && { weight }),\n };\n}\n\n/**\n * 创建 Divider 组件\n *\n * @param options - 分割线选项\n */\nexport function divider(options: DividerOptions = {}): ComponentInstance {\n const { id = generateId('divider'), weight, axis } = options;\n return {\n id,\n component: 'Divider',\n ...(weight !== undefined && { weight }),\n ...(axis && { axis }),\n };\n}\n\n/**\n * 创建 Modal 组件\n *\n * @param entryPointChildId - 触发模态框的组件 ID\n * @param contentChildId - 模态框内容组件 ID\n * @param options - Modal 选项\n */\nexport function modal(\n entryPointChildId: string,\n contentChildId: string,\n options: ModalOptions = {}\n): ComponentInstance {\n const { id = generateId('modal'), weight } = options;\n return {\n id,\n component: 'Modal',\n entryPointChild: entryPointChildId,\n contentChild: contentChildId,\n ...(weight !== undefined && { weight }),\n };\n}\n\n// ============================================================================\n// 交互组件\n// ============================================================================\n\n/**\n * 创建 Button 组件\n *\n * @param childId - 按钮内容组件 ID(通常是 Text)\n * @param action - 点击时触发的操作\n * @param options - 按钮选项\n */\nexport function button(\n childId: string,\n action: Action,\n options: ButtonOptions = {}\n): ComponentInstance {\n const { id = generateId('button'), weight, primary } = options;\n return {\n id,\n component: 'Button',\n child: childId,\n action,\n ...(weight !== undefined && { weight }),\n ...(primary !== undefined && { primary }),\n };\n}\n\n/**\n * 创建 CheckBox 组件\n *\n * @param label - 标签\n * @param value - 值(布尔值或数据路径)\n * @param options - 选项\n */\nexport function checkbox(\n label: StringOrPath,\n value: BooleanOrPath,\n options: CheckBoxOptions = {}\n): ComponentInstance {\n const { id = generateId('checkbox'), weight } = options;\n return {\n id,\n component: 'CheckBox',\n label,\n value,\n ...(weight !== undefined && { weight }),\n };\n}\n\n/**\n * 创建 TextField 组件\n *\n * @param label - 标签\n * @param textValue - 值(可选)\n * @param options - 选项\n */\nexport function textField(\n label: StringOrPath,\n textValue?: StringOrPath,\n options: TextFieldOptions = {}\n): ComponentInstance {\n const { id = generateId('textfield'), weight, usageHint, validationRegexp } = options;\n return {\n id,\n component: 'TextField',\n label,\n ...(textValue !== undefined && { text: textValue }),\n ...(weight !== undefined && { weight }),\n ...(usageHint && { usageHint }),\n ...(validationRegexp && { validationRegexp }),\n };\n}\n\n/**\n * 创建 DateTimeInput 组件\n *\n * @param value - 值(ISO 8601 格式字符串或数据路径)\n * @param options - 选项\n */\nexport function dateTimeInput(\n value: StringOrPath,\n options: DateTimeInputOptions = {}\n): ComponentInstance {\n const { id = generateId('datetime'), weight, enableDate, enableTime, outputFormat, label } = options;\n return {\n id,\n component: 'DateTimeInput',\n value,\n ...(weight !== undefined && { weight }),\n ...(enableDate !== undefined && { enableDate }),\n ...(enableTime !== undefined && { enableTime }),\n ...(outputFormat && { outputFormat }),\n ...(label && { label }),\n };\n}\n\n/**\n * 创建 ChoicePicker 组件\n *\n * @param optionsList - 选项列表\n * @param value - 当前选中值\n * @param usageHint - 使用提示\n * @param options - 组件选项\n */\nexport function choicePicker(\n optionsList: Array<{ label: StringOrPath; value: string }>,\n value: StringArrayOrPath,\n usageHint: ChoicePickerComponent['usageHint'],\n options: ChoicePickerOptions = {}\n): ComponentInstance {\n const { id = generateId('choice'), weight, label } = options;\n return {\n id,\n component: 'ChoicePicker',\n options: optionsList,\n value,\n usageHint,\n ...(weight !== undefined && { weight }),\n ...(label && { label }),\n };\n}\n\n/**\n * 创建 Slider 组件\n *\n * @param value - 当前值\n * @param options - 选项\n */\nexport function slider(\n value: NumberOrPath,\n options: SliderOptions = {}\n): ComponentInstance {\n const { id = generateId('slider'), weight, label, min, max } = options;\n return {\n id,\n component: 'Slider',\n value,\n ...(weight !== undefined && { weight }),\n ...(label && { label }),\n ...(min !== undefined && { min }),\n ...(max !== undefined && { max }),\n };\n}\n\n// ============================================================================\n// 便捷组件构建器\n// ============================================================================\n\n/**\n * 创建带文本的按钮(返回按钮和文本组件)\n *\n * @param buttonText - 按钮文本\n * @param action - 点击操作\n * @param options - 按钮选项\n * @returns 包含按钮和文本组件的数组\n */\nexport function textButton(\n buttonText: string,\n action: Action,\n options: ButtonOptions & { textId?: string } = {}\n): [ComponentInstance, ComponentInstance] {\n const textId = options.textId ?? generateId('btn_text');\n const textComp = text(buttonText, { id: textId });\n const buttonComp = button(textId, action, options);\n return [textComp, buttonComp];\n}\n\n/**\n * 创建标题组件\n */\nexport function h1(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'h1' });\n}\n\nexport function h2(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'h2' });\n}\n\nexport function h3(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'h3' });\n}\n\nexport function h4(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'h4' });\n}\n\nexport function h5(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'h5' });\n}\n\nexport function caption(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'caption' });\n}\n\nexport function body(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'body' });\n}\n\n","/**\n * A2UI Message Types\n *\n * 服务器到客户端的消息类型定义\n * Based on A2UI v0.9 specification\n */\n\nimport type { ComponentInstance } from './components';\n\n// ============================================================================\n// Theme\n// ============================================================================\n\n/**\n * A2UI 主题配置\n */\nexport interface Theme {\n /**\n * 主要字体\n */\n font?: string;\n /**\n * 主题色(十六进制格式,如 '#00BFFF')\n */\n primaryColor?: string;\n /**\n * 其他自定义样式\n */\n [key: string]: string | undefined;\n}\n\n// ============================================================================\n// v0.9 消息格式\n// ============================================================================\n\n/**\n * CreateSurface 消息 - 创建新的 UI Surface\n */\nexport interface CreateSurfaceMessage {\n createSurface: {\n /**\n * Surface 唯一标识符\n */\n surfaceId: string;\n /**\n * 组件目录 ID\n * @example \"https://a2ui.dev/specification/0.9/standard_catalog_definition.json\"\n */\n catalogId: string;\n };\n}\n\n/**\n * UpdateComponents 消息 - 更新 Surface 中的组件\n */\nexport interface UpdateComponentsMessage {\n updateComponents: {\n /**\n * Surface 唯一标识符\n */\n surfaceId: string;\n /**\n * 组件列表(扁平化,通过 ID 引用建立关系)\n */\n components: ComponentInstance[];\n };\n}\n\n/**\n * UpdateDataModel 消息 - 更新数据模型\n */\nexport interface UpdateDataModelMessage {\n updateDataModel: {\n /**\n * Surface 唯一标识符\n */\n surfaceId: string;\n /**\n * 数据路径(可选,默认为根路径)\n * @example \"/user/name\"\n */\n path?: string;\n /**\n * 操作类型\n */\n op?: 'add' | 'replace' | 'remove';\n /**\n * 数据值(add/replace 操作需要)\n */\n value?: unknown;\n };\n}\n\n/**\n * DeleteSurface 消息 - 删除 Surface\n */\nexport interface DeleteSurfaceMessage {\n deleteSurface: {\n /**\n * 要删除的 Surface ID\n */\n surfaceId: string;\n };\n}\n\n/**\n * v0.9 服务器到客户端消息\n */\nexport type ServerToClientMessageV09 =\n | CreateSurfaceMessage\n | UpdateComponentsMessage\n | UpdateDataModelMessage\n | DeleteSurfaceMessage;\n\n// ============================================================================\n// v0.8 消息格式(兼容性)\n// ============================================================================\n\n/**\n * BeginRendering 消息 (v0.8) - 开始渲染\n */\nexport interface BeginRenderingMessage {\n beginRendering: {\n /**\n * Surface ID\n */\n surfaceId: string;\n /**\n * 根组件 ID\n */\n root: string;\n /**\n * 样式配置\n */\n styles?: Theme;\n };\n}\n\n/**\n * SurfaceUpdate 消息 (v0.8) - 更新组件\n */\nexport interface SurfaceUpdateMessage {\n surfaceUpdate: {\n surfaceId: string;\n components: ComponentInstanceV08[];\n };\n}\n\n/**\n * v0.8 组件实例格式\n */\nexport interface ComponentInstanceV08 {\n id: string;\n weight?: number;\n component: Record<string, unknown>;\n}\n\n/**\n * DataModelUpdate 消息 (v0.8) - 更新数据模型\n */\nexport interface DataModelUpdateMessage {\n dataModelUpdate: {\n surfaceId: string;\n path?: string;\n contents: ValueMap[];\n };\n}\n\n/**\n * DeleteSurface 消息 (v0.8)\n */\nexport interface DeleteSurfaceMessageV08 {\n deleteSurface: {\n surfaceId: string;\n };\n}\n\n/**\n * v0.8 ValueMap 格式\n */\nexport interface ValueMap {\n key: string;\n valueString?: string;\n valueNumber?: number;\n valueBoolean?: boolean;\n valueMap?: ValueMap[];\n}\n\n/**\n * v0.8 服务器到客户端消息\n */\nexport type ServerToClientMessageV08 =\n | BeginRenderingMessage\n | SurfaceUpdateMessage\n | DataModelUpdateMessage\n | DeleteSurfaceMessageV08;\n\n// ============================================================================\n// 通用消息类型\n// ============================================================================\n\n/**\n * 服务器到客户端消息(支持 v0.8 和 v0.9)\n */\nexport type ServerToClientMessage = ServerToClientMessageV08 | ServerToClientMessageV09;\n\n/**\n * 判断是否为 v0.9 消息\n */\nexport function isV09Message(message: ServerToClientMessage): message is ServerToClientMessageV09 {\n return 'createSurface' in message || 'updateComponents' in message || 'updateDataModel' in message;\n}\n\n/**\n * 判断是否为 v0.8 消息\n */\nexport function isV08Message(message: ServerToClientMessage): message is ServerToClientMessageV08 {\n return 'beginRendering' in message || 'surfaceUpdate' in message || 'dataModelUpdate' in message;\n}\n\n// ============================================================================\n// 客户端到服务器消息\n// ============================================================================\n\n/**\n * 用户操作事件\n */\nexport interface UserActionEvent {\n /**\n * 操作名称\n */\n actionName: string;\n /**\n * 触发组件的 ID\n */\n sourceComponentId: string;\n /**\n * 时间戳(ISO 8601 格式)\n */\n timestamp: string;\n /**\n * 操作上下文(解析后的值)\n */\n context?: Record<string, unknown>;\n}\n\n/**\n * 数据变更事件\n */\nexport interface DataChangeEvent {\n /**\n * Surface ID\n */\n surfaceId: string;\n /**\n * 数据路径\n */\n path: string;\n /**\n * 新值\n */\n value: unknown;\n /**\n * 触发组件的 ID\n */\n sourceComponentId: string;\n}\n\n/**\n * 客户端到服务器消息\n */\nexport type ClientToServerMessage =\n | { userAction: UserActionEvent }\n | { dataChange: DataChangeEvent };\n\n// ============================================================================\n// 数据类型\n// ============================================================================\n\n/**\n * 数据模型值类型\n */\nexport type DataValue =\n | string\n | number\n | boolean\n | null\n | DataObject\n | DataArray;\n\n/**\n * 数据对象\n */\nexport interface DataObject {\n [key: string]: DataValue;\n}\n\n/**\n * 数据数组\n */\nexport type DataArray = DataValue[];\n\n/**\n * A2UI 标准 Catalog ID\n */\nexport const STANDARD_CATALOG_ID = 'https://a2ui.dev/specification/0.9/standard_catalog_definition.json';\n\n/**\n * A2UI 扩展 URI (v0.8)\n */\nexport const A2UI_EXTENSION_URI_V08 = 'https://a2ui.org/a2a-extension/a2ui/v0.8';\n\n/**\n * A2UI 扩展 URI (v0.9)\n */\nexport const A2UI_EXTENSION_URI = 'https://a2ui.dev/specification/0.9';\n\n/**\n * A2UI MIME 类型\n */\nexport const A2UI_MIME_TYPE = 'application/json+a2ui';\n\n","/**\n * Data Model Builder\n *\n * 提供 DataModel 相关的构建工具函数\n * 符合 A2UI 协议的 ValueMap 格式\n */\n\nimport type { ValueMap, DataValue, DataObject } from '../types';\n\n/**\n * 路径映射表类型\n */\nexport type PathMappings = Record<string, string>;\n\n/**\n * 默认路径映射\n */\nexport const DEFAULT_PATH_MAPPINGS: PathMappings = {};\n\n/**\n * 将 JavaScript 对象转换为 A2UI ValueMap 格式\n *\n * @param obj - JavaScript 对象\n * @param prefix - 路径前缀(用于嵌套对象的 key 生成)\n *\n * @example\n * objectToValueMap({ name: 'John', age: 30 });\n * // Returns: [\n * // { key: '/name', valueString: 'John' },\n * // { key: '/age', valueNumber: 30 }\n * // ]\n */\nexport function objectToValueMap(obj: DataObject, prefix = ''): ValueMap[] {\n const entries: ValueMap[] = [];\n\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}/${key}` : `/${key}`;\n entries.push(valueToValueMap(fullKey, value));\n }\n\n return entries;\n}\n\n/**\n * 将单个值转换为 A2UI ValueMap 格式\n *\n * @param key - 数据路径/键\n * @param value - JavaScript 值\n */\nexport function valueToValueMap(key: string, value: DataValue): ValueMap {\n if (value === null || value === undefined) {\n return { key, valueString: '' };\n }\n\n if (typeof value === 'string') {\n return { key, valueString: value };\n }\n\n if (typeof value === 'number') {\n return { key, valueNumber: value };\n }\n\n if (typeof value === 'boolean') {\n return { key, valueBoolean: value };\n }\n\n if (Array.isArray(value)) {\n return {\n key,\n valueMap: value.map((item, index) => valueToValueMap(String(index), item)),\n };\n }\n\n if (typeof value === 'object') {\n const nestedMaps: ValueMap[] = [];\n for (const [k, v] of Object.entries(value)) {\n nestedMaps.push(valueToValueMap(k, v as DataValue));\n }\n return { key, valueMap: nestedMaps };\n }\n\n return { key, valueString: String(value) };\n}\n\n/**\n * 规范化路径格式\n * - 将 . 分隔符转换为 /\n * - 确保路径以 / 开头\n * - 可选路径映射\n *\n * @param path - 原始路径\n * @param pathMappings - 可选路径映射表\n *\n * @example\n * normalizePath('user.name'); // '/user/name'\n * normalizePath('/user/name'); // '/user/name'\n * normalizePath('stats.count', { stats: 'progress' }); // '/progress/count'\n */\nexport function normalizePath(path: string, pathMappings: PathMappings = {}): string {\n // 1. 将 . 分隔符转换为 /\n let normalizedPath = path.replace(/\\./g, '/');\n\n // 2. 确保路径以 / 开头\n if (!normalizedPath.startsWith('/')) {\n normalizedPath = `/${normalizedPath}`;\n }\n\n // 3. 应用路径映射\n for (const [from, to] of Object.entries(pathMappings)) {\n const fromPattern = new RegExp(`^/${from}(/|$)`);\n if (fromPattern.test(normalizedPath)) {\n normalizedPath = normalizedPath.replace(fromPattern, `/${to}$1`);\n }\n }\n\n return normalizedPath;\n}\n\n/**\n * 更新数据项定义\n */\nexport interface UpdateDataItem {\n /** 数据路径 */\n path: string;\n /** 新值 */\n value: DataValue;\n /** 值类型(可选,用于类型提示) */\n valueType?: 'string' | 'number' | 'boolean' | 'list' | 'map';\n /** 操作类型(可选,用于增量更新) */\n operation?: 'set' | 'increment' | 'decrement' | 'append' | 'remove';\n}\n\n/**\n * 将更新数据项数组转换为 ValueMap\n *\n * @param updates - 更新数据项\n * @param basePath - 基础路径\n * @param pathMappings - 可选路径映射表\n */\nexport function updatesToValueMap(\n updates: UpdateDataItem[],\n basePath = '',\n pathMappings: PathMappings = DEFAULT_PATH_MAPPINGS\n): ValueMap[] {\n const entries: ValueMap[] = [];\n\n for (const update of updates) {\n const rawPath = update.path.startsWith('/') ? update.path : `${basePath}/${update.path}`;\n const normalizedPath = normalizePath(rawPath, pathMappings);\n\n if (update.value !== null && typeof update.value === 'object' && !Array.isArray(update.value)) {\n const flattenedEntries = flattenObjectToValueMap(\n update.value as DataObject,\n normalizedPath\n );\n entries.push(...flattenedEntries);\n } else {\n entries.push(valueToValueMap(normalizedPath, update.value));\n }\n }\n\n return entries;\n}\n\n/**\n * 将嵌套对象扁平化为 ValueMap 条目\n *\n * @param obj - 要扁平化的对象\n * @param basePath - 基础路径\n */\nexport function flattenObjectToValueMap(\n obj: DataObject,\n basePath: string\n): ValueMap[] {\n const entries: ValueMap[] = [];\n\n for (const [key, value] of Object.entries(obj)) {\n const fullPath = `${basePath}/${key}`;\n\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n const nestedEntries = flattenObjectToValueMap(value as DataObject, fullPath);\n entries.push(...nestedEntries);\n } else {\n entries.push(valueToValueMap(fullPath, value as DataValue));\n }\n }\n\n return entries;\n}\n\n/**\n * 从 ValueMap 数组中提取普通 JavaScript 对象\n *\n * @param valueMaps - ValueMap 数组\n * @returns JavaScript 对象\n */\nexport function valueMapToObject(valueMaps: ValueMap[]): DataObject {\n const result: DataObject = {};\n\n for (const valueMap of valueMaps) {\n const key = valueMap.key.startsWith('/') ? valueMap.key.slice(1) : valueMap.key;\n \n if (valueMap.valueString !== undefined) {\n result[key] = valueMap.valueString;\n } else if (valueMap.valueNumber !== undefined) {\n result[key] = valueMap.valueNumber;\n } else if (valueMap.valueBoolean !== undefined) {\n result[key] = valueMap.valueBoolean;\n } else if (valueMap.valueMap !== undefined) {\n result[key] = valueMapToObject(valueMap.valueMap);\n }\n }\n\n return result;\n}\n\n","/**\n * Message Builder\n *\n * 提供 A2UI 协议消息的构建工具函数\n * 支持 v0.8 和 v0.9 两种消息格式\n */\n\nimport type {\n // v0.9\n CreateSurfaceMessage,\n UpdateComponentsMessage,\n UpdateDataModelMessage,\n DeleteSurfaceMessage,\n ServerToClientMessageV09,\n // v0.8\n BeginRenderingMessage,\n SurfaceUpdateMessage,\n DataModelUpdateMessage,\n ServerToClientMessageV08,\n ComponentInstanceV08,\n ValueMap,\n // Common\n ComponentInstance,\n DataObject,\n DataValue,\n} from '../types';\nimport { STANDARD_CATALOG_ID } from '../types';\nimport { objectToValueMap, valueToValueMap } from './data-model-builder';\n\n// ============================================================================\n// v0.9 消息构建器\n// ============================================================================\n\n/**\n * 创建 CreateSurface 消息 (v0.9)\n *\n * @param surfaceId - Surface ID\n * @param catalogId - Catalog ID(默认为标准目录)\n */\nexport function createSurface(\n surfaceId: string,\n catalogId: string = STANDARD_CATALOG_ID\n): CreateSurfaceMessage {\n return {\n createSurface: {\n surfaceId,\n catalogId,\n },\n };\n}\n\n/**\n * 创建 UpdateComponents 消息 (v0.9)\n *\n * @param surfaceId - Surface ID\n * @param components - 组件列表\n */\nexport function updateComponents(\n surfaceId: string,\n components: ComponentInstance[]\n): UpdateComponentsMessage {\n return {\n updateComponents: {\n surfaceId,\n components,\n },\n };\n}\n\n/**\n * 创建 UpdateDataModel 消息 (v0.9)\n *\n * @param surfaceId - Surface ID\n * @param value - 数据值\n * @param path - 数据路径(可选)\n * @param op - 操作类型(默认为 replace)\n */\nexport function updateDataModel(\n surfaceId: string,\n value: unknown,\n path?: string,\n op: 'add' | 'replace' | 'remove' = 'replace'\n): UpdateDataModelMessage {\n return {\n updateDataModel: {\n surfaceId,\n ...(path && { path }),\n op,\n ...(op !== 'remove' && { value }),\n },\n };\n}\n\n/**\n * 创建 DeleteSurface 消息 (v0.9)\n *\n * @param surfaceId - 要删除的 Surface ID\n */\nexport function deleteSurface(surfaceId: string): DeleteSurfaceMessage {\n return {\n deleteSurface: {\n surfaceId,\n },\n };\n}\n\n/**\n * 创建完整的 v0.9 消息序列\n *\n * @param options - 选项\n * @returns 消息数组(可直接作为 JSONL 流发送)\n */\nexport function createV09Messages(options: {\n surfaceId: string;\n catalogId?: string;\n components: ComponentInstance[];\n dataModel?: DataObject;\n}): ServerToClientMessageV09[] {\n const { surfaceId, catalogId = STANDARD_CATALOG_ID, components, dataModel } = options;\n\n const messages: ServerToClientMessageV09[] = [\n createSurface(surfaceId, catalogId),\n updateComponents(surfaceId, components),\n ];\n\n if (dataModel) {\n messages.push(updateDataModel(surfaceId, dataModel));\n }\n\n return messages;\n}\n\n// ============================================================================\n// v0.8 消息构建器\n// ============================================================================\n\n/**\n * 创建 BeginRendering 消息 (v0.8)\n *\n * @param rootId - 根组件 ID\n * @param surfaceId - Surface ID\n * @param styles - 样式配置\n */\nexport function beginRendering(\n rootId: string,\n surfaceId = '@default',\n styles?: Record<string, string>\n): BeginRenderingMessage {\n return {\n beginRendering: {\n surfaceId,\n root: rootId,\n ...(styles && { styles }),\n },\n };\n}\n\n/**\n * 创建 SurfaceUpdate 消息 (v0.8)\n *\n * @param components - 组件定义数组\n * @param surfaceId - Surface ID\n */\nexport function surfaceUpdate(\n components: ComponentInstanceV08[],\n surfaceId = '@default'\n): SurfaceUpdateMessage {\n return {\n surfaceUpdate: {\n surfaceId,\n components,\n },\n };\n}\n\n/**\n * 创建 DataModelUpdate 消息 (v0.8)\n *\n * @param contents - ValueMap 数组\n * @param surfaceId - Surface ID\n * @param path - 数据路径(可选)\n */\nexport function dataModelUpdate(\n contents: ValueMap[],\n surfaceId = '@default',\n path?: string\n): DataModelUpdateMessage {\n return {\n dataModelUpdate: {\n surfaceId,\n contents,\n ...(path && { path }),\n },\n };\n}\n\n/**\n * 创建 DataModel 初始化消息 (v0.8)\n *\n * @param data - 初始数据对象\n * @param surfaceId - Surface ID\n */\nexport function dataModelInit(\n data: DataObject,\n surfaceId = '@default'\n): DataModelUpdateMessage {\n return dataModelUpdate(objectToValueMap(data), surfaceId);\n}\n\n/**\n * 创建路径更新消息 (v0.8)\n *\n * @param path - 数据路径\n * @param value - 新值\n * @param surfaceId - Surface ID\n */\nexport function pathUpdate(\n path: string,\n value: DataValue,\n surfaceId = '@default'\n): DataModelUpdateMessage {\n return {\n dataModelUpdate: {\n surfaceId,\n path,\n contents: [valueToValueMap('', value)],\n },\n };\n}\n\n/**\n * 创建 DeleteSurface 消息 (v0.8)\n *\n * @param surfaceId - 要删除的 Surface ID\n */\nexport function deleteSurfaceV08(surfaceId: string): { deleteSurface: { surfaceId: string } } {\n return {\n deleteSurface: {\n surfaceId,\n },\n };\n}\n\n/**\n * 创建完整的 v0.8 消息数组\n *\n * @param options - 选项\n * @returns 消息数组\n */\nexport function createV08Messages(options: {\n rootId: string;\n components: ComponentInstanceV08[];\n dataModel?: DataObject;\n surfaceId?: string;\n styles?: Record<string, string>;\n}): ServerToClientMessageV08[] {\n const { rootId, components, dataModel, surfaceId = '@default', styles } = options;\n\n const messages: ServerToClientMessageV08[] = [\n surfaceUpdate(components, surfaceId),\n ];\n\n if (dataModel) {\n messages.push(dataModelInit(dataModel, surfaceId));\n }\n\n messages.push(beginRendering(rootId, surfaceId, styles));\n\n return messages;\n}\n\n// ============================================================================\n// 通用消息工具\n// ============================================================================\n\n/**\n * 将消息数组转换为 JSONL 格式字符串\n *\n * @param messages - 消息数组\n * @returns JSONL 格式字符串\n */\nexport function messagesToJsonl(messages: Array<ServerToClientMessageV08 | ServerToClientMessageV09>): string {\n return messages.map(msg => JSON.stringify(msg)).join('\\n');\n}\n\n/**\n * 从 JSONL 格式字符串解析消息数组\n *\n * @param jsonl - JSONL 格式字符串\n * @returns 消息数组\n */\nexport function jsonlToMessages(jsonl: string): Array<ServerToClientMessageV08 | ServerToClientMessageV09> {\n return jsonl\n .split('\\n')\n .filter(line => line.trim())\n .map(line => JSON.parse(line) as ServerToClientMessageV08 | ServerToClientMessageV09);\n}\n\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/builders/id-generator.ts","../../src/builders/component-builder.ts","../../src/types/messages.ts","../../src/builders/data-model-builder.ts","../../src/builders/message-builder.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * ID Generator\n *\n * 生成唯一的组件 ID\n */\n\nlet componentIdCounter = 0;\n\n/**\n * 生成唯一的组件 ID\n *\n * @param prefix - ID 前缀\n * @returns 唯一的组件 ID\n *\n * @example\n * generateId('text'); // 'text_1703123456789_0'\n * generateId('btn'); // 'btn_1703123456789_1'\n */\nexport function generateId(prefix = 'comp'): string {\n return `${prefix}_${Date.now()}_${componentIdCounter++}`;\n}\n\n/**\n * 重置 ID 计数器\n * 在渲染新场景时调用,确保 ID 从 0 开始\n */\nexport function resetIdCounter(): void {\n componentIdCounter = 0;\n}\n\n/**\n * 获取当前计数器值(用于测试)\n */\nexport function getIdCounter(): number {\n return componentIdCounter;\n}\n\n","/**\n * Component Builder\n *\n * 提供 A2UI 组件定义的构建工具函数\n * 用于创建符合 A2UI v0.9 协议的组件结构\n */\n\nimport type {\n ComponentInstance,\n Action,\n TextComponent,\n ImageComponent,\n RowComponent,\n ListComponent,\n DividerComponent,\n TextFieldComponent,\n ChoicePickerComponent,\n ChildrenProperty,\n StringOrPath,\n NumberOrPath,\n BooleanOrPath,\n StringArrayOrPath,\n} from '../types';\nimport { generateId } from './id-generator';\n\n// ============================================================================\n// 类型定义\n// ============================================================================\n\n/**\n * 组件构建选项基类\n */\nexport interface ComponentOptions {\n /** 组件 ID(可选,自动生成) */\n id?: string;\n /** 在 Row/Column 中的权重 */\n weight?: number;\n}\n\n/**\n * Text 组件选项\n */\nexport interface TextOptions extends ComponentOptions {\n usageHint?: TextComponent['usageHint'];\n}\n\n/**\n * Image 组件选项\n */\nexport interface ImageOptions extends ComponentOptions {\n fit?: ImageComponent['fit'];\n usageHint?: ImageComponent['usageHint'];\n}\n\n/**\n * Icon 组件选项\n */\nexport interface IconOptions extends ComponentOptions {}\n\n/**\n * Video 组件选项\n */\nexport interface VideoOptions extends ComponentOptions {}\n\n/**\n * AudioPlayer 组件选项\n */\nexport interface AudioPlayerOptions extends ComponentOptions {\n description?: StringOrPath;\n}\n\n/**\n * 布局组件选项\n */\nexport interface LayoutOptions extends ComponentOptions {\n alignment?: RowComponent['alignment'];\n distribution?: RowComponent['distribution'];\n}\n\n/**\n * List 组件选项\n */\nexport interface ListOptions extends ComponentOptions {\n direction?: ListComponent['direction'];\n alignment?: ListComponent['alignment'];\n}\n\n/**\n * Card 组件选项\n */\nexport interface CardOptions extends ComponentOptions {}\n\n/**\n * Tabs 组件选项\n */\nexport interface TabsOptions extends ComponentOptions {}\n\n/**\n * Tab 项目\n */\nexport interface TabItem {\n title: string;\n childId: string;\n}\n\n/**\n * Divider 组件选项\n */\nexport interface DividerOptions extends ComponentOptions {\n axis?: DividerComponent['axis'];\n}\n\n/**\n * Modal 组件选项\n */\nexport interface ModalOptions extends ComponentOptions {}\n\n/**\n * Button 组件选项\n */\nexport interface ButtonOptions extends ComponentOptions {\n primary?: boolean;\n}\n\n/**\n * CheckBox 组件选项\n */\nexport interface CheckBoxOptions extends ComponentOptions {}\n\n/**\n * TextField 组件选项\n */\nexport interface TextFieldOptions extends ComponentOptions {\n usageHint?: TextFieldComponent['usageHint'];\n validationRegexp?: string;\n}\n\n/**\n * DateTimeInput 组件选项\n */\nexport interface DateTimeInputOptions extends ComponentOptions {\n enableDate?: boolean;\n enableTime?: boolean;\n outputFormat?: string;\n label?: StringOrPath;\n}\n\n/**\n * ChoicePicker 组件选项\n */\nexport interface ChoicePickerOptions extends ComponentOptions {\n label?: StringOrPath;\n}\n\n/**\n * Slider 组件选项\n */\nexport interface SliderOptions extends ComponentOptions {\n label?: StringOrPath;\n min?: number;\n max?: number;\n}\n\n// ============================================================================\n// 内容组件\n// ============================================================================\n\n/**\n * 创建 Text 组件\n *\n * @param text - 文本内容或数据路径\n * @param options - 组件选项\n *\n * @example\n * // 静态文本\n * text('Hello World', { usageHint: 'h1' });\n *\n * // 数据绑定\n * text({ path: '/user/name' });\n */\nexport function text(content: StringOrPath, options: TextOptions = {}): ComponentInstance {\n const { id = generateId('text'), weight, usageHint } = options;\n return {\n id,\n component: 'Text',\n text: content,\n ...(weight !== undefined && { weight }),\n ...(usageHint && { usageHint }),\n };\n}\n\n/**\n * 创建 Image 组件\n *\n * @param url - 图片 URL 或数据路径\n * @param options - 组件选项\n */\nexport function image(url: StringOrPath, options: ImageOptions = {}): ComponentInstance {\n const { id = generateId('image'), weight, fit, usageHint } = options;\n return {\n id,\n component: 'Image',\n url,\n ...(weight !== undefined && { weight }),\n ...(fit && { fit }),\n ...(usageHint && { usageHint }),\n };\n}\n\n/**\n * 创建 Icon 组件\n *\n * @param name - 图标名称或数据路径\n * @param options - 组件选项\n */\nexport function icon(name: StringOrPath, options: IconOptions = {}): ComponentInstance {\n const { id = generateId('icon'), weight } = options;\n return {\n id,\n component: 'Icon',\n name,\n ...(weight !== undefined && { weight }),\n };\n}\n\n/**\n * 创建 Video 组件\n *\n * @param url - 视频 URL 或数据路径\n * @param options - 组件选项\n */\nexport function video(url: StringOrPath, options: VideoOptions = {}): ComponentInstance {\n const { id = generateId('video'), weight } = options;\n return {\n id,\n component: 'Video',\n url,\n ...(weight !== undefined && { weight }),\n };\n}\n\n/**\n * 创建 AudioPlayer 组件\n *\n * @param url - 音频 URL 或数据路径\n * @param options - 组件选项\n */\nexport function audioPlayer(url: StringOrPath, options: AudioPlayerOptions = {}): ComponentInstance {\n const { id = generateId('audio'), weight, description } = options;\n return {\n id,\n component: 'AudioPlayer',\n url,\n ...(weight !== undefined && { weight }),\n ...(description && { description }),\n };\n}\n\n// ============================================================================\n// 布局组件\n// ============================================================================\n\n/**\n * 创建 Row 组件(水平布局)\n *\n * @param children - 子组件 ID 列表或动态模板\n * @param options - 布局选项\n *\n * @example\n * // 静态子组件\n * row(['text1', 'text2', 'button1']);\n *\n * // 动态模板\n * row({ componentId: 'itemTemplate', path: '/items' });\n */\nexport function row(children: ChildrenProperty, options: LayoutOptions = {}): ComponentInstance {\n const { id = generateId('row'), weight, alignment, distribution } = options;\n return {\n id,\n component: 'Row',\n children,\n ...(weight !== undefined && { weight }),\n ...(alignment && { alignment }),\n ...(distribution && { distribution }),\n };\n}\n\n/**\n * 创建 Column 组件(垂直布局)\n *\n * @param children - 子组件 ID 列表或动态模板\n * @param options - 布局选项\n */\nexport function column(children: ChildrenProperty, options: LayoutOptions = {}): ComponentInstance {\n const { id = generateId('column'), weight, alignment, distribution } = options;\n return {\n id,\n component: 'Column',\n children,\n ...(weight !== undefined && { weight }),\n ...(alignment && { alignment }),\n ...(distribution && { distribution }),\n };\n}\n\n/**\n * 创建 List 组件\n *\n * @param children - 子组件 ID 列表或动态模板\n * @param options - 列表选项\n */\nexport function list(children: ChildrenProperty, options: ListOptions = {}): ComponentInstance {\n const { id = generateId('list'), weight, direction, alignment } = options;\n return {\n id,\n component: 'List',\n children,\n ...(weight !== undefined && { weight }),\n ...(direction && { direction }),\n ...(alignment && { alignment }),\n };\n}\n\n/**\n * 创建 Card 组件\n *\n * @param childId - 子组件 ID\n * @param options - 卡片选项\n */\nexport function card(childId: string, options: CardOptions = {}): ComponentInstance {\n const { id = generateId('card'), weight } = options;\n return {\n id,\n component: 'Card',\n child: childId,\n ...(weight !== undefined && { weight }),\n };\n}\n\n/**\n * 创建 Tabs 组件\n *\n * @param items - 标签项列表\n * @param options - Tabs 选项\n */\nexport function tabs(items: TabItem[], options: TabsOptions = {}): ComponentInstance {\n const { id = generateId('tabs'), weight } = options;\n return {\n id,\n component: 'Tabs',\n tabItems: items.map(item => ({\n title: item.title,\n child: item.childId,\n })),\n ...(weight !== undefined && { weight }),\n };\n}\n\n/**\n * 创建 Divider 组件\n *\n * @param options - 分割线选项\n */\nexport function divider(options: DividerOptions = {}): ComponentInstance {\n const { id = generateId('divider'), weight, axis } = options;\n return {\n id,\n component: 'Divider',\n ...(weight !== undefined && { weight }),\n ...(axis && { axis }),\n };\n}\n\n/**\n * 创建 Modal 组件\n *\n * @param entryPointChildId - 触发模态框的组件 ID\n * @param contentChildId - 模态框内容组件 ID\n * @param options - Modal 选项\n */\nexport function modal(\n entryPointChildId: string,\n contentChildId: string,\n options: ModalOptions = {}\n): ComponentInstance {\n const { id = generateId('modal'), weight } = options;\n return {\n id,\n component: 'Modal',\n entryPointChild: entryPointChildId,\n contentChild: contentChildId,\n ...(weight !== undefined && { weight }),\n };\n}\n\n// ============================================================================\n// 交互组件\n// ============================================================================\n\n/**\n * 创建 Button 组件\n *\n * @param childId - 按钮内容组件 ID(通常是 Text)\n * @param action - 点击时触发的操作\n * @param options - 按钮选项\n */\nexport function button(\n childId: string,\n action: Action,\n options: ButtonOptions = {}\n): ComponentInstance {\n const { id = generateId('button'), weight, primary } = options;\n return {\n id,\n component: 'Button',\n child: childId,\n action,\n ...(weight !== undefined && { weight }),\n ...(primary !== undefined && { primary }),\n };\n}\n\n/**\n * 创建 CheckBox 组件\n *\n * @param label - 标签\n * @param value - 值(布尔值或数据路径)\n * @param options - 选项\n */\nexport function checkbox(\n label: StringOrPath,\n value: BooleanOrPath,\n options: CheckBoxOptions = {}\n): ComponentInstance {\n const { id = generateId('checkbox'), weight } = options;\n return {\n id,\n component: 'CheckBox',\n label,\n value,\n ...(weight !== undefined && { weight }),\n };\n}\n\n/**\n * 创建 TextField 组件\n *\n * @param label - 标签\n * @param textValue - 值(可选)\n * @param options - 选项\n */\nexport function textField(\n label: StringOrPath,\n textValue?: StringOrPath,\n options: TextFieldOptions = {}\n): ComponentInstance {\n const { id = generateId('textfield'), weight, usageHint, validationRegexp } = options;\n return {\n id,\n component: 'TextField',\n label,\n ...(textValue !== undefined && { text: textValue }),\n ...(weight !== undefined && { weight }),\n ...(usageHint && { usageHint }),\n ...(validationRegexp && { validationRegexp }),\n };\n}\n\n/**\n * 创建 DateTimeInput 组件\n *\n * @param value - 值(ISO 8601 格式字符串或数据路径)\n * @param options - 选项\n */\nexport function dateTimeInput(\n value: StringOrPath,\n options: DateTimeInputOptions = {}\n): ComponentInstance {\n const { id = generateId('datetime'), weight, enableDate, enableTime, outputFormat, label } = options;\n return {\n id,\n component: 'DateTimeInput',\n value,\n ...(weight !== undefined && { weight }),\n ...(enableDate !== undefined && { enableDate }),\n ...(enableTime !== undefined && { enableTime }),\n ...(outputFormat && { outputFormat }),\n ...(label && { label }),\n };\n}\n\n/**\n * 创建 ChoicePicker 组件\n *\n * @param optionsList - 选项列表\n * @param value - 当前选中值\n * @param usageHint - 使用提示\n * @param options - 组件选项\n */\nexport function choicePicker(\n optionsList: Array<{ label: StringOrPath; value: string }>,\n value: StringArrayOrPath,\n usageHint: ChoicePickerComponent['usageHint'],\n options: ChoicePickerOptions = {}\n): ComponentInstance {\n const { id = generateId('choice'), weight, label } = options;\n return {\n id,\n component: 'ChoicePicker',\n options: optionsList,\n value,\n usageHint,\n ...(weight !== undefined && { weight }),\n ...(label && { label }),\n };\n}\n\n/**\n * 创建 Slider 组件\n *\n * @param value - 当前值\n * @param options - 选项\n */\nexport function slider(\n value: NumberOrPath,\n options: SliderOptions = {}\n): ComponentInstance {\n const { id = generateId('slider'), weight, label, min, max } = options;\n return {\n id,\n component: 'Slider',\n value,\n ...(weight !== undefined && { weight }),\n ...(label && { label }),\n ...(min !== undefined && { min }),\n ...(max !== undefined && { max }),\n };\n}\n\n// ============================================================================\n// 便捷组件构建器\n// ============================================================================\n\n/**\n * 创建带文本的按钮(返回按钮和文本组件)\n *\n * @param buttonText - 按钮文本\n * @param action - 点击操作\n * @param options - 按钮选项\n * @returns 包含按钮和文本组件的数组\n */\nexport function textButton(\n buttonText: string,\n action: Action,\n options: ButtonOptions & { textId?: string } = {}\n): [ComponentInstance, ComponentInstance] {\n const textId = options.textId ?? generateId('btn_text');\n const textComp = text(buttonText, { id: textId });\n const buttonComp = button(textId, action, options);\n return [textComp, buttonComp];\n}\n\n/**\n * 创建标题组件\n */\nexport function h1(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'h1' });\n}\n\nexport function h2(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'h2' });\n}\n\nexport function h3(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'h3' });\n}\n\nexport function h4(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'h4' });\n}\n\nexport function h5(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'h5' });\n}\n\nexport function caption(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'caption' });\n}\n\nexport function body(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'body' });\n}\n\n","/**\n * A2UI Message Types\n *\n * 服务器到客户端的消息类型定义\n * Based on A2UI v0.9 specification\n */\n\nimport type { ComponentInstance } from './components';\n\n// ============================================================================\n// Theme\n// ============================================================================\n\n/**\n * A2UI 主题配置\n */\nexport interface Theme {\n /**\n * 主要字体\n */\n font?: string;\n /**\n * 主题色(十六进制格式,如 '#00BFFF')\n */\n primaryColor?: string;\n /**\n * 其他自定义样式\n */\n [key: string]: string | undefined;\n}\n\n// ============================================================================\n// v0.9 消息格式\n// ============================================================================\n\n/**\n * CreateSurface 消息 - 创建新的 UI Surface\n */\nexport interface CreateSurfaceMessage {\n createSurface: {\n /**\n * Surface 唯一标识符\n */\n surfaceId: string;\n /**\n * 组件目录 ID\n * @example \"https://a2ui.dev/specification/0.9/standard_catalog_definition.json\"\n */\n catalogId: string;\n };\n}\n\n/**\n * UpdateComponents 消息 - 更新 Surface 中的组件\n */\nexport interface UpdateComponentsMessage {\n updateComponents: {\n /**\n * Surface 唯一标识符\n */\n surfaceId: string;\n /**\n * 组件列表(扁平化,通过 ID 引用建立关系)\n */\n components: ComponentInstance[];\n };\n}\n\n/**\n * UpdateDataModel 消息 - 更新数据模型\n */\nexport interface UpdateDataModelMessage {\n updateDataModel: {\n /**\n * Surface 唯一标识符\n */\n surfaceId: string;\n /**\n * 数据路径(可选,默认为根路径)\n * @example \"/user/name\"\n */\n path?: string;\n /**\n * 操作类型\n */\n op?: 'add' | 'replace' | 'remove';\n /**\n * 数据值(add/replace 操作需要)\n */\n value?: unknown;\n };\n}\n\n/**\n * DeleteSurface 消息 - 删除 Surface\n */\nexport interface DeleteSurfaceMessage {\n deleteSurface: {\n /**\n * 要删除的 Surface ID\n */\n surfaceId: string;\n };\n}\n\n/**\n * v0.9 服务器到客户端消息\n */\nexport type ServerToClientMessageV09 =\n | CreateSurfaceMessage\n | UpdateComponentsMessage\n | UpdateDataModelMessage\n | DeleteSurfaceMessage;\n\n// ============================================================================\n// v0.8 消息格式(兼容性)\n// ============================================================================\n\n/**\n * BeginRendering 消息 (v0.8) - 开始渲染\n */\nexport interface BeginRenderingMessage {\n beginRendering: {\n /**\n * Surface ID\n */\n surfaceId: string;\n /**\n * 根组件 ID\n */\n root: string;\n /**\n * 样式配置\n */\n styles?: Theme;\n };\n}\n\n/**\n * SurfaceUpdate 消息 (v0.8) - 更新组件\n */\nexport interface SurfaceUpdateMessage {\n surfaceUpdate: {\n surfaceId: string;\n components: ComponentInstanceV08[];\n };\n}\n\n/**\n * v0.8 组件实例格式\n */\nexport interface ComponentInstanceV08 {\n id: string;\n weight?: number;\n component: Record<string, unknown>;\n}\n\n/**\n * DataModelUpdate 消息 (v0.8) - 更新数据模型\n */\nexport interface DataModelUpdateMessage {\n dataModelUpdate: {\n surfaceId: string;\n path?: string;\n contents: ValueMap[];\n };\n}\n\n/**\n * DeleteSurface 消息 (v0.8)\n */\nexport interface DeleteSurfaceMessageV08 {\n deleteSurface: {\n surfaceId: string;\n };\n}\n\n/**\n * v0.8 ValueMap 格式\n */\nexport interface ValueMap {\n key: string;\n valueString?: string;\n valueNumber?: number;\n valueBoolean?: boolean;\n valueMap?: ValueMap[];\n}\n\n/**\n * v0.8 服务器到客户端消息\n */\nexport type ServerToClientMessageV08 =\n | BeginRenderingMessage\n | SurfaceUpdateMessage\n | DataModelUpdateMessage\n | DeleteSurfaceMessageV08;\n\n// ============================================================================\n// 通用消息类型\n// ============================================================================\n\n/**\n * 服务器到客户端消息(支持 v0.8 和 v0.9)\n */\nexport type ServerToClientMessage = ServerToClientMessageV08 | ServerToClientMessageV09;\n\n/**\n * 判断是否为 v0.9 消息\n */\nexport function isV09Message(message: ServerToClientMessage): message is ServerToClientMessageV09 {\n return 'createSurface' in message || 'updateComponents' in message || 'updateDataModel' in message;\n}\n\n/**\n * 判断是否为 v0.8 消息\n */\nexport function isV08Message(message: ServerToClientMessage): message is ServerToClientMessageV08 {\n return 'beginRendering' in message || 'surfaceUpdate' in message || 'dataModelUpdate' in message;\n}\n\n// ============================================================================\n// 客户端到服务器消息\n// ============================================================================\n\n/**\n * 用户操作事件\n */\nexport interface UserActionEvent {\n /**\n * 操作名称\n */\n actionName: string;\n /**\n * 触发组件的 ID\n */\n sourceComponentId: string;\n /**\n * 时间戳(ISO 8601 格式)\n */\n timestamp: string;\n /**\n * 操作上下文(解析后的值)\n */\n context?: Record<string, unknown>;\n}\n\n/**\n * 数据变更事件\n */\nexport interface DataChangeEvent {\n /**\n * Surface ID\n */\n surfaceId: string;\n /**\n * 数据路径\n */\n path: string;\n /**\n * 新值\n */\n value: unknown;\n /**\n * 触发组件的 ID\n */\n sourceComponentId: string;\n}\n\n/**\n * 客户端到服务器消息\n */\nexport type ClientToServerMessage =\n | { userAction: UserActionEvent }\n | { dataChange: DataChangeEvent };\n\n// ============================================================================\n// 数据类型\n// ============================================================================\n\n/**\n * 数据模型值类型\n */\nexport type DataValue =\n | string\n | number\n | boolean\n | null\n | DataObject\n | DataArray;\n\n/**\n * 数据对象\n */\nexport interface DataObject {\n [key: string]: DataValue;\n}\n\n/**\n * 数据数组\n */\nexport type DataArray = DataValue[];\n\n/**\n * A2UI 标准 Catalog ID\n */\nexport const STANDARD_CATALOG_ID = 'https://a2ui.dev/specification/0.9/standard_catalog_definition.json';\n\n/**\n * A2UI 扩展 URI (v0.8)\n */\nexport const A2UI_EXTENSION_URI_V08 = 'https://a2ui.org/a2a-extension/a2ui/v0.8';\n\n/**\n * A2UI 扩展 URI (v0.9)\n */\nexport const A2UI_EXTENSION_URI = 'https://a2ui.dev/specification/0.9';\n\n/**\n * A2UI MIME 类型\n */\nexport const A2UI_MIME_TYPE = 'application/json+a2ui';\n\n","/**\n * Data Model Builder\n *\n * 提供 DataModel 相关的构建工具函数\n * 符合 A2UI 协议的 ValueMap 格式\n */\n\nimport type { ValueMap, DataValue, DataObject } from '../types';\n\n/**\n * 路径映射表类型\n */\nexport type PathMappings = Record<string, string>;\n\n/**\n * 默认路径映射\n */\nexport const DEFAULT_PATH_MAPPINGS: PathMappings = {};\n\n/**\n * 将 JavaScript 对象转换为 A2UI ValueMap 格式\n *\n * @param obj - JavaScript 对象\n * @param prefix - 路径前缀(用于嵌套对象的 key 生成)\n *\n * @example\n * objectToValueMap({ name: 'John', age: 30 });\n * // Returns: [\n * // { key: '/name', valueString: 'John' },\n * // { key: '/age', valueNumber: 30 }\n * // ]\n */\nexport function objectToValueMap(obj: DataObject, prefix = ''): ValueMap[] {\n const entries: ValueMap[] = [];\n\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}/${key}` : `/${key}`;\n entries.push(valueToValueMap(fullKey, value));\n }\n\n return entries;\n}\n\n/**\n * 将单个值转换为 A2UI ValueMap 格式\n *\n * @param key - 数据路径/键\n * @param value - JavaScript 值\n */\nexport function valueToValueMap(key: string, value: DataValue): ValueMap {\n if (value === null || value === undefined) {\n return { key, valueString: '' };\n }\n\n if (typeof value === 'string') {\n return { key, valueString: value };\n }\n\n if (typeof value === 'number') {\n return { key, valueNumber: value };\n }\n\n if (typeof value === 'boolean') {\n return { key, valueBoolean: value };\n }\n\n if (Array.isArray(value)) {\n return {\n key,\n valueMap: value.map((item, index) => valueToValueMap(String(index), item)),\n };\n }\n\n if (typeof value === 'object') {\n const nestedMaps: ValueMap[] = [];\n for (const [k, v] of Object.entries(value)) {\n nestedMaps.push(valueToValueMap(k, v as DataValue));\n }\n return { key, valueMap: nestedMaps };\n }\n\n return { key, valueString: String(value) };\n}\n\n/**\n * 规范化路径格式\n * - 将 . 分隔符转换为 /\n * - 确保路径以 / 开头\n * - 可选路径映射\n *\n * @param path - 原始路径\n * @param pathMappings - 可选路径映射表\n *\n * @example\n * normalizePath('user.name'); // '/user/name'\n * normalizePath('/user/name'); // '/user/name'\n * normalizePath('stats.count', { stats: 'progress' }); // '/progress/count'\n */\nexport function normalizePath(path: string, pathMappings: PathMappings = {}): string {\n // 1. 将 . 分隔符转换为 /\n let normalizedPath = path.replace(/\\./g, '/');\n\n // 2. 确保路径以 / 开头\n if (!normalizedPath.startsWith('/')) {\n normalizedPath = `/${normalizedPath}`;\n }\n\n // 3. 应用路径映射\n for (const [from, to] of Object.entries(pathMappings)) {\n const fromPattern = new RegExp(`^/${from}(/|$)`);\n if (fromPattern.test(normalizedPath)) {\n normalizedPath = normalizedPath.replace(fromPattern, `/${to}$1`);\n }\n }\n\n return normalizedPath;\n}\n\n/**\n * 更新数据项定义\n */\nexport interface UpdateDataItem {\n /** 数据路径 */\n path: string;\n /** 新值 */\n value: DataValue;\n /** 值类型(可选,用于类型提示) */\n valueType?: 'string' | 'number' | 'boolean' | 'list' | 'map';\n /** 操作类型(可选,用于增量更新) */\n operation?: 'set' | 'increment' | 'decrement' | 'append' | 'remove';\n}\n\n/**\n * 将更新数据项数组转换为 ValueMap\n *\n * @param updates - 更新数据项\n * @param basePath - 基础路径\n * @param pathMappings - 可选路径映射表\n */\nexport function updatesToValueMap(\n updates: UpdateDataItem[],\n basePath = '',\n pathMappings: PathMappings = DEFAULT_PATH_MAPPINGS\n): ValueMap[] {\n const entries: ValueMap[] = [];\n\n for (const update of updates) {\n const rawPath = update.path.startsWith('/') ? update.path : `${basePath}/${update.path}`;\n const normalizedPath = normalizePath(rawPath, pathMappings);\n\n if (update.value !== null && typeof update.value === 'object' && !Array.isArray(update.value)) {\n const flattenedEntries = flattenObjectToValueMap(\n update.value as DataObject,\n normalizedPath\n );\n entries.push(...flattenedEntries);\n } else {\n entries.push(valueToValueMap(normalizedPath, update.value));\n }\n }\n\n return entries;\n}\n\n/**\n * 将嵌套对象扁平化为 ValueMap 条目\n *\n * @param obj - 要扁平化的对象\n * @param basePath - 基础路径\n */\nexport function flattenObjectToValueMap(\n obj: DataObject,\n basePath: string\n): ValueMap[] {\n const entries: ValueMap[] = [];\n\n for (const [key, value] of Object.entries(obj)) {\n const fullPath = `${basePath}/${key}`;\n\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n const nestedEntries = flattenObjectToValueMap(value as DataObject, fullPath);\n entries.push(...nestedEntries);\n } else {\n entries.push(valueToValueMap(fullPath, value as DataValue));\n }\n }\n\n return entries;\n}\n\n/**\n * 从 ValueMap 数组中提取普通 JavaScript 对象\n *\n * @param valueMaps - ValueMap 数组\n * @returns JavaScript 对象\n */\nexport function valueMapToObject(valueMaps: ValueMap[]): DataObject {\n const result: DataObject = {};\n\n for (const valueMap of valueMaps) {\n const key = valueMap.key.startsWith('/') ? valueMap.key.slice(1) : valueMap.key;\n \n if (valueMap.valueString !== undefined) {\n result[key] = valueMap.valueString;\n } else if (valueMap.valueNumber !== undefined) {\n result[key] = valueMap.valueNumber;\n } else if (valueMap.valueBoolean !== undefined) {\n result[key] = valueMap.valueBoolean;\n } else if (valueMap.valueMap !== undefined) {\n result[key] = valueMapToObject(valueMap.valueMap);\n }\n }\n\n return result;\n}\n\n","/**\n * Message Builder\n *\n * 提供 A2UI 协议消息的构建工具函数\n * 支持 v0.8 和 v0.9 两种消息格式\n */\n\nimport type {\n // v0.9\n CreateSurfaceMessage,\n UpdateComponentsMessage,\n UpdateDataModelMessage,\n DeleteSurfaceMessage,\n ServerToClientMessageV09,\n // v0.8\n BeginRenderingMessage,\n SurfaceUpdateMessage,\n DataModelUpdateMessage,\n ServerToClientMessageV08,\n ComponentInstanceV08,\n ValueMap,\n // Common\n ComponentInstance,\n DataObject,\n DataValue,\n} from '../types';\nimport { STANDARD_CATALOG_ID } from '../types';\nimport { objectToValueMap, valueToValueMap } from './data-model-builder';\n\n// ============================================================================\n// v0.9 消息构建器\n// ============================================================================\n\n/**\n * 创建 CreateSurface 消息 (v0.9)\n *\n * @param surfaceId - Surface ID\n * @param catalogId - Catalog ID(默认为标准目录)\n */\nexport function createSurface(\n surfaceId: string,\n catalogId: string = STANDARD_CATALOG_ID\n): CreateSurfaceMessage {\n return {\n createSurface: {\n surfaceId,\n catalogId,\n },\n };\n}\n\n/**\n * 创建 UpdateComponents 消息 (v0.9)\n *\n * @param surfaceId - Surface ID\n * @param components - 组件列表\n */\nexport function updateComponents(\n surfaceId: string,\n components: ComponentInstance[]\n): UpdateComponentsMessage {\n return {\n updateComponents: {\n surfaceId,\n components,\n },\n };\n}\n\n/**\n * 创建 UpdateDataModel 消息 (v0.9)\n *\n * @param surfaceId - Surface ID\n * @param value - 数据值\n * @param path - 数据路径(可选)\n * @param op - 操作类型(默认为 replace)\n */\nexport function updateDataModel(\n surfaceId: string,\n value: unknown,\n path?: string,\n op: 'add' | 'replace' | 'remove' = 'replace'\n): UpdateDataModelMessage {\n return {\n updateDataModel: {\n surfaceId,\n ...(path && { path }),\n op,\n ...(op !== 'remove' && { value }),\n },\n };\n}\n\n/**\n * 创建 DeleteSurface 消息 (v0.9)\n *\n * @param surfaceId - 要删除的 Surface ID\n */\nexport function deleteSurface(surfaceId: string): DeleteSurfaceMessage {\n return {\n deleteSurface: {\n surfaceId,\n },\n };\n}\n\n/**\n * 创建完整的 v0.9 消息序列\n *\n * @param options - 选项\n * @returns 消息数组(可直接作为 JSONL 流发送)\n */\nexport function createV09Messages(options: {\n surfaceId: string;\n catalogId?: string;\n components: ComponentInstance[];\n dataModel?: DataObject;\n}): ServerToClientMessageV09[] {\n const { surfaceId, catalogId = STANDARD_CATALOG_ID, components, dataModel } = options;\n\n const messages: ServerToClientMessageV09[] = [\n createSurface(surfaceId, catalogId),\n updateComponents(surfaceId, components),\n ];\n\n if (dataModel) {\n messages.push(updateDataModel(surfaceId, dataModel));\n }\n\n return messages;\n}\n\n// ============================================================================\n// v0.8 消息构建器\n// ============================================================================\n\n/**\n * 创建 BeginRendering 消息 (v0.8)\n *\n * @param rootId - 根组件 ID\n * @param surfaceId - Surface ID\n * @param styles - 样式配置\n */\nexport function beginRendering(\n rootId: string,\n surfaceId = '@default',\n styles?: Record<string, string>\n): BeginRenderingMessage {\n return {\n beginRendering: {\n surfaceId,\n root: rootId,\n ...(styles && { styles }),\n },\n };\n}\n\n/**\n * 创建 SurfaceUpdate 消息 (v0.8)\n *\n * @param components - 组件定义数组\n * @param surfaceId - Surface ID\n */\nexport function surfaceUpdate(\n components: ComponentInstanceV08[],\n surfaceId = '@default'\n): SurfaceUpdateMessage {\n return {\n surfaceUpdate: {\n surfaceId,\n components,\n },\n };\n}\n\n/**\n * 创建 DataModelUpdate 消息 (v0.8)\n *\n * @param contents - ValueMap 数组\n * @param surfaceId - Surface ID\n * @param path - 数据路径(可选)\n */\nexport function dataModelUpdate(\n contents: ValueMap[],\n surfaceId = '@default',\n path?: string\n): DataModelUpdateMessage {\n return {\n dataModelUpdate: {\n surfaceId,\n contents,\n ...(path && { path }),\n },\n };\n}\n\n/**\n * 创建 DataModel 初始化消息 (v0.8)\n *\n * @param data - 初始数据对象\n * @param surfaceId - Surface ID\n */\nexport function dataModelInit(\n data: DataObject,\n surfaceId = '@default'\n): DataModelUpdateMessage {\n return dataModelUpdate(objectToValueMap(data), surfaceId);\n}\n\n/**\n * 创建路径更新消息 (v0.8)\n *\n * @param path - 数据路径\n * @param value - 新值\n * @param surfaceId - Surface ID\n */\nexport function pathUpdate(\n path: string,\n value: DataValue,\n surfaceId = '@default'\n): DataModelUpdateMessage {\n return {\n dataModelUpdate: {\n surfaceId,\n path,\n contents: [valueToValueMap('', value)],\n },\n };\n}\n\n/**\n * 创建 DeleteSurface 消息 (v0.8)\n *\n * @param surfaceId - 要删除的 Surface ID\n */\nexport function deleteSurfaceV08(surfaceId: string): { deleteSurface: { surfaceId: string } } {\n return {\n deleteSurface: {\n surfaceId,\n },\n };\n}\n\n/**\n * 创建完整的 v0.8 消息数组\n *\n * @param options - 选项\n * @returns 消息数组\n */\nexport function createV08Messages(options: {\n rootId: string;\n components: ComponentInstanceV08[];\n dataModel?: DataObject;\n surfaceId?: string;\n styles?: Record<string, string>;\n}): ServerToClientMessageV08[] {\n const { rootId, components, dataModel, surfaceId = '@default', styles } = options;\n\n const messages: ServerToClientMessageV08[] = [\n surfaceUpdate(components, surfaceId),\n ];\n\n if (dataModel) {\n messages.push(dataModelInit(dataModel, surfaceId));\n }\n\n messages.push(beginRendering(rootId, surfaceId, styles));\n\n return messages;\n}\n\n// ============================================================================\n// 通用消息工具\n// ============================================================================\n\n/**\n * 将消息数组转换为 JSONL 格式字符串\n *\n * @param messages - 消息数组\n * @returns JSONL 格式字符串\n */\nexport function messagesToJsonl(messages: Array<ServerToClientMessageV08 | ServerToClientMessageV09>): string {\n return messages.map(msg => JSON.stringify(msg)).join('\\n');\n}\n\n/**\n * 从 JSONL 格式字符串解析消息数组\n *\n * @param jsonl - JSONL 格式字符串\n * @returns 消息数组\n */\nexport function jsonlToMessages(jsonl: string): Array<ServerToClientMessageV08 | ServerToClientMessageV09> {\n return jsonl\n .split('\\n')\n .filter(line => line.trim())\n .map(line => JSON.parse(line) as ServerToClientMessageV08 | ServerToClientMessageV09);\n}\n\n"]}
|
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/messages.ts","../src/builders/id-generator.ts","../src/builders/component-builder.ts","../src/builders/data-model-builder.ts","../src/builders/message-builder.ts","../src/validators/message-validator.ts","../src/utils/index.ts"],"names":["path","createSurface","updateComponents","updateDataModel","deleteSurface","beginRendering","surfaceUpdate","dataModelUpdate"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * A2UI Message Types\n *\n * 服务器到客户端的消息类型定义\n * Based on A2UI v0.9 specification\n */\n\nimport type { ComponentInstance } from './components';\n\n// ============================================================================\n// Theme\n// ============================================================================\n\n/**\n * A2UI 主题配置\n */\nexport interface Theme {\n /**\n * 主要字体\n */\n font?: string;\n /**\n * 主题色(十六进制格式,如 '#00BFFF')\n */\n primaryColor?: string;\n /**\n * 其他自定义样式\n */\n [key: string]: string | undefined;\n}\n\n// ============================================================================\n// v0.9 消息格式\n// ============================================================================\n\n/**\n * CreateSurface 消息 - 创建新的 UI Surface\n */\nexport interface CreateSurfaceMessage {\n createSurface: {\n /**\n * Surface 唯一标识符\n */\n surfaceId: string;\n /**\n * 组件目录 ID\n * @example \"https://a2ui.dev/specification/0.9/standard_catalog_definition.json\"\n */\n catalogId: string;\n };\n}\n\n/**\n * UpdateComponents 消息 - 更新 Surface 中的组件\n */\nexport interface UpdateComponentsMessage {\n updateComponents: {\n /**\n * Surface 唯一标识符\n */\n surfaceId: string;\n /**\n * 组件列表(扁平化,通过 ID 引用建立关系)\n */\n components: ComponentInstance[];\n };\n}\n\n/**\n * UpdateDataModel 消息 - 更新数据模型\n */\nexport interface UpdateDataModelMessage {\n updateDataModel: {\n /**\n * Surface 唯一标识符\n */\n surfaceId: string;\n /**\n * 数据路径(可选,默认为根路径)\n * @example \"/user/name\"\n */\n path?: string;\n /**\n * 操作类型\n */\n op?: 'add' | 'replace' | 'remove';\n /**\n * 数据值(add/replace 操作需要)\n */\n value?: unknown;\n };\n}\n\n/**\n * DeleteSurface 消息 - 删除 Surface\n */\nexport interface DeleteSurfaceMessage {\n deleteSurface: {\n /**\n * 要删除的 Surface ID\n */\n surfaceId: string;\n };\n}\n\n/**\n * v0.9 服务器到客户端消息\n */\nexport type ServerToClientMessageV09 =\n | CreateSurfaceMessage\n | UpdateComponentsMessage\n | UpdateDataModelMessage\n | DeleteSurfaceMessage;\n\n// ============================================================================\n// v0.8 消息格式(兼容性)\n// ============================================================================\n\n/**\n * BeginRendering 消息 (v0.8) - 开始渲染\n */\nexport interface BeginRenderingMessage {\n beginRendering: {\n /**\n * Surface ID\n */\n surfaceId: string;\n /**\n * 根组件 ID\n */\n root: string;\n /**\n * 样式配置\n */\n styles?: Theme;\n };\n}\n\n/**\n * SurfaceUpdate 消息 (v0.8) - 更新组件\n */\nexport interface SurfaceUpdateMessage {\n surfaceUpdate: {\n surfaceId: string;\n components: ComponentInstanceV08[];\n };\n}\n\n/**\n * v0.8 组件实例格式\n */\nexport interface ComponentInstanceV08 {\n id: string;\n weight?: number;\n component: Record<string, unknown>;\n}\n\n/**\n * DataModelUpdate 消息 (v0.8) - 更新数据模型\n */\nexport interface DataModelUpdateMessage {\n dataModelUpdate: {\n surfaceId: string;\n path?: string;\n contents: ValueMap[];\n };\n}\n\n/**\n * DeleteSurface 消息 (v0.8)\n */\nexport interface DeleteSurfaceMessageV08 {\n deleteSurface: {\n surfaceId: string;\n };\n}\n\n/**\n * v0.8 ValueMap 格式\n */\nexport interface ValueMap {\n key: string;\n valueString?: string;\n valueNumber?: number;\n valueBoolean?: boolean;\n valueMap?: ValueMap[];\n}\n\n/**\n * v0.8 服务器到客户端消息\n */\nexport type ServerToClientMessageV08 =\n | BeginRenderingMessage\n | SurfaceUpdateMessage\n | DataModelUpdateMessage\n | DeleteSurfaceMessageV08;\n\n// ============================================================================\n// 通用消息类型\n// ============================================================================\n\n/**\n * 服务器到客户端消息(支持 v0.8 和 v0.9)\n */\nexport type ServerToClientMessage = ServerToClientMessageV08 | ServerToClientMessageV09;\n\n/**\n * 判断是否为 v0.9 消息\n */\nexport function isV09Message(message: ServerToClientMessage): message is ServerToClientMessageV09 {\n return 'createSurface' in message || 'updateComponents' in message || 'updateDataModel' in message;\n}\n\n/**\n * 判断是否为 v0.8 消息\n */\nexport function isV08Message(message: ServerToClientMessage): message is ServerToClientMessageV08 {\n return 'beginRendering' in message || 'surfaceUpdate' in message || 'dataModelUpdate' in message;\n}\n\n// ============================================================================\n// 客户端到服务器消息\n// ============================================================================\n\n/**\n * 用户操作事件\n */\nexport interface UserActionEvent {\n /**\n * 操作名称\n */\n actionName: string;\n /**\n * 触发组件的 ID\n */\n sourceComponentId: string;\n /**\n * 时间戳(ISO 8601 格式)\n */\n timestamp: string;\n /**\n * 操作上下文(解析后的值)\n */\n context?: Record<string, unknown>;\n}\n\n/**\n * 数据变更事件\n */\nexport interface DataChangeEvent {\n /**\n * Surface ID\n */\n surfaceId: string;\n /**\n * 数据路径\n */\n path: string;\n /**\n * 新值\n */\n value: unknown;\n /**\n * 触发组件的 ID\n */\n sourceComponentId: string;\n}\n\n/**\n * 客户端到服务器消息\n */\nexport type ClientToServerMessage =\n | { userAction: UserActionEvent }\n | { dataChange: DataChangeEvent };\n\n// ============================================================================\n// 数据类型\n// ============================================================================\n\n/**\n * 数据模型值类型\n */\nexport type DataValue =\n | string\n | number\n | boolean\n | null\n | DataObject\n | DataArray;\n\n/**\n * 数据对象\n */\nexport interface DataObject {\n [key: string]: DataValue;\n}\n\n/**\n * 数据数组\n */\nexport type DataArray = DataValue[];\n\n/**\n * A2UI 标准 Catalog ID\n */\nexport const STANDARD_CATALOG_ID = 'https://a2ui.dev/specification/0.9/standard_catalog_definition.json';\n\n/**\n * A2UI 扩展 URI (v0.8)\n */\nexport const A2UI_EXTENSION_URI_V08 = 'https://a2ui.org/a2a-extension/a2ui/v0.8';\n\n/**\n * A2UI 扩展 URI (v0.9)\n */\nexport const A2UI_EXTENSION_URI = 'https://a2ui.dev/specification/0.9';\n\n/**\n * A2UI MIME 类型\n */\nexport const A2UI_MIME_TYPE = 'application/json+a2ui';\n\n","/**\n * ID Generator\n *\n * 生成唯一的组件 ID\n */\n\nlet componentIdCounter = 0;\n\n/**\n * 生成唯一的组件 ID\n *\n * @param prefix - ID 前缀\n * @returns 唯一的组件 ID\n *\n * @example\n * generateId('text'); // 'text_1703123456789_0'\n * generateId('btn'); // 'btn_1703123456789_1'\n */\nexport function generateId(prefix = 'comp'): string {\n return `${prefix}_${Date.now()}_${componentIdCounter++}`;\n}\n\n/**\n * 重置 ID 计数器\n * 在渲染新场景时调用,确保 ID 从 0 开始\n */\nexport function resetIdCounter(): void {\n componentIdCounter = 0;\n}\n\n/**\n * 获取当前计数器值(用于测试)\n */\nexport function getIdCounter(): number {\n return componentIdCounter;\n}\n\n","/**\n * Component Builder\n *\n * 提供 A2UI 组件定义的构建工具函数\n * 用于创建符合 A2UI v0.9 协议的组件结构\n */\n\nimport type {\n ComponentInstance,\n Action,\n TextComponent,\n ImageComponent,\n RowComponent,\n ListComponent,\n DividerComponent,\n TextFieldComponent,\n ChoicePickerComponent,\n ChildrenProperty,\n StringOrPath,\n NumberOrPath,\n BooleanOrPath,\n StringArrayOrPath,\n} from '../types';\nimport { generateId } from './id-generator';\n\n// ============================================================================\n// 类型定义\n// ============================================================================\n\n/**\n * 组件构建选项基类\n */\nexport interface ComponentOptions {\n /** 组件 ID(可选,自动生成) */\n id?: string;\n /** 在 Row/Column 中的权重 */\n weight?: number;\n}\n\n/**\n * Text 组件选项\n */\nexport interface TextOptions extends ComponentOptions {\n usageHint?: TextComponent['usageHint'];\n}\n\n/**\n * Image 组件选项\n */\nexport interface ImageOptions extends ComponentOptions {\n fit?: ImageComponent['fit'];\n usageHint?: ImageComponent['usageHint'];\n}\n\n/**\n * Icon 组件选项\n */\nexport interface IconOptions extends ComponentOptions {}\n\n/**\n * Video 组件选项\n */\nexport interface VideoOptions extends ComponentOptions {}\n\n/**\n * AudioPlayer 组件选项\n */\nexport interface AudioPlayerOptions extends ComponentOptions {\n description?: StringOrPath;\n}\n\n/**\n * 布局组件选项\n */\nexport interface LayoutOptions extends ComponentOptions {\n alignment?: RowComponent['alignment'];\n distribution?: RowComponent['distribution'];\n}\n\n/**\n * List 组件选项\n */\nexport interface ListOptions extends ComponentOptions {\n direction?: ListComponent['direction'];\n alignment?: ListComponent['alignment'];\n}\n\n/**\n * Card 组件选项\n */\nexport interface CardOptions extends ComponentOptions {}\n\n/**\n * Tabs 组件选项\n */\nexport interface TabsOptions extends ComponentOptions {}\n\n/**\n * Tab 项目\n */\nexport interface TabItem {\n title: string;\n childId: string;\n}\n\n/**\n * Divider 组件选项\n */\nexport interface DividerOptions extends ComponentOptions {\n axis?: DividerComponent['axis'];\n}\n\n/**\n * Modal 组件选项\n */\nexport interface ModalOptions extends ComponentOptions {}\n\n/**\n * Button 组件选项\n */\nexport interface ButtonOptions extends ComponentOptions {\n primary?: boolean;\n}\n\n/**\n * CheckBox 组件选项\n */\nexport interface CheckBoxOptions extends ComponentOptions {}\n\n/**\n * TextField 组件选项\n */\nexport interface TextFieldOptions extends ComponentOptions {\n usageHint?: TextFieldComponent['usageHint'];\n validationRegexp?: string;\n}\n\n/**\n * DateTimeInput 组件选项\n */\nexport interface DateTimeInputOptions extends ComponentOptions {\n enableDate?: boolean;\n enableTime?: boolean;\n outputFormat?: string;\n label?: StringOrPath;\n}\n\n/**\n * ChoicePicker 组件选项\n */\nexport interface ChoicePickerOptions extends ComponentOptions {\n label?: StringOrPath;\n}\n\n/**\n * Slider 组件选项\n */\nexport interface SliderOptions extends ComponentOptions {\n label?: StringOrPath;\n min?: number;\n max?: number;\n}\n\n// ============================================================================\n// 内容组件\n// ============================================================================\n\n/**\n * 创建 Text 组件\n *\n * @param text - 文本内容或数据路径\n * @param options - 组件选项\n *\n * @example\n * // 静态文本\n * text('Hello World', { usageHint: 'h1' });\n *\n * // 数据绑定\n * text({ path: '/user/name' });\n */\nexport function text(content: StringOrPath, options: TextOptions = {}): ComponentInstance {\n const { id = generateId('text'), weight, usageHint } = options;\n return {\n id,\n component: 'Text',\n text: content,\n ...(weight !== undefined && { weight }),\n ...(usageHint && { usageHint }),\n };\n}\n\n/**\n * 创建 Image 组件\n *\n * @param url - 图片 URL 或数据路径\n * @param options - 组件选项\n */\nexport function image(url: StringOrPath, options: ImageOptions = {}): ComponentInstance {\n const { id = generateId('image'), weight, fit, usageHint } = options;\n return {\n id,\n component: 'Image',\n url,\n ...(weight !== undefined && { weight }),\n ...(fit && { fit }),\n ...(usageHint && { usageHint }),\n };\n}\n\n/**\n * 创建 Icon 组件\n *\n * @param name - 图标名称或数据路径\n * @param options - 组件选项\n */\nexport function icon(name: StringOrPath, options: IconOptions = {}): ComponentInstance {\n const { id = generateId('icon'), weight } = options;\n return {\n id,\n component: 'Icon',\n name,\n ...(weight !== undefined && { weight }),\n };\n}\n\n/**\n * 创建 Video 组件\n *\n * @param url - 视频 URL 或数据路径\n * @param options - 组件选项\n */\nexport function video(url: StringOrPath, options: VideoOptions = {}): ComponentInstance {\n const { id = generateId('video'), weight } = options;\n return {\n id,\n component: 'Video',\n url,\n ...(weight !== undefined && { weight }),\n };\n}\n\n/**\n * 创建 AudioPlayer 组件\n *\n * @param url - 音频 URL 或数据路径\n * @param options - 组件选项\n */\nexport function audioPlayer(url: StringOrPath, options: AudioPlayerOptions = {}): ComponentInstance {\n const { id = generateId('audio'), weight, description } = options;\n return {\n id,\n component: 'AudioPlayer',\n url,\n ...(weight !== undefined && { weight }),\n ...(description && { description }),\n };\n}\n\n// ============================================================================\n// 布局组件\n// ============================================================================\n\n/**\n * 创建 Row 组件(水平布局)\n *\n * @param children - 子组件 ID 列表或动态模板\n * @param options - 布局选项\n *\n * @example\n * // 静态子组件\n * row(['text1', 'text2', 'button1']);\n *\n * // 动态模板\n * row({ componentId: 'itemTemplate', path: '/items' });\n */\nexport function row(children: ChildrenProperty, options: LayoutOptions = {}): ComponentInstance {\n const { id = generateId('row'), weight, alignment, distribution } = options;\n return {\n id,\n component: 'Row',\n children,\n ...(weight !== undefined && { weight }),\n ...(alignment && { alignment }),\n ...(distribution && { distribution }),\n };\n}\n\n/**\n * 创建 Column 组件(垂直布局)\n *\n * @param children - 子组件 ID 列表或动态模板\n * @param options - 布局选项\n */\nexport function column(children: ChildrenProperty, options: LayoutOptions = {}): ComponentInstance {\n const { id = generateId('column'), weight, alignment, distribution } = options;\n return {\n id,\n component: 'Column',\n children,\n ...(weight !== undefined && { weight }),\n ...(alignment && { alignment }),\n ...(distribution && { distribution }),\n };\n}\n\n/**\n * 创建 List 组件\n *\n * @param children - 子组件 ID 列表或动态模板\n * @param options - 列表选项\n */\nexport function list(children: ChildrenProperty, options: ListOptions = {}): ComponentInstance {\n const { id = generateId('list'), weight, direction, alignment } = options;\n return {\n id,\n component: 'List',\n children,\n ...(weight !== undefined && { weight }),\n ...(direction && { direction }),\n ...(alignment && { alignment }),\n };\n}\n\n/**\n * 创建 Card 组件\n *\n * @param childId - 子组件 ID\n * @param options - 卡片选项\n */\nexport function card(childId: string, options: CardOptions = {}): ComponentInstance {\n const { id = generateId('card'), weight } = options;\n return {\n id,\n component: 'Card',\n child: childId,\n ...(weight !== undefined && { weight }),\n };\n}\n\n/**\n * 创建 Tabs 组件\n *\n * @param items - 标签项列表\n * @param options - Tabs 选项\n */\nexport function tabs(items: TabItem[], options: TabsOptions = {}): ComponentInstance {\n const { id = generateId('tabs'), weight } = options;\n return {\n id,\n component: 'Tabs',\n tabItems: items.map(item => ({\n title: item.title,\n child: item.childId,\n })),\n ...(weight !== undefined && { weight }),\n };\n}\n\n/**\n * 创建 Divider 组件\n *\n * @param options - 分割线选项\n */\nexport function divider(options: DividerOptions = {}): ComponentInstance {\n const { id = generateId('divider'), weight, axis } = options;\n return {\n id,\n component: 'Divider',\n ...(weight !== undefined && { weight }),\n ...(axis && { axis }),\n };\n}\n\n/**\n * 创建 Modal 组件\n *\n * @param entryPointChildId - 触发模态框的组件 ID\n * @param contentChildId - 模态框内容组件 ID\n * @param options - Modal 选项\n */\nexport function modal(\n entryPointChildId: string,\n contentChildId: string,\n options: ModalOptions = {}\n): ComponentInstance {\n const { id = generateId('modal'), weight } = options;\n return {\n id,\n component: 'Modal',\n entryPointChild: entryPointChildId,\n contentChild: contentChildId,\n ...(weight !== undefined && { weight }),\n };\n}\n\n// ============================================================================\n// 交互组件\n// ============================================================================\n\n/**\n * 创建 Button 组件\n *\n * @param childId - 按钮内容组件 ID(通常是 Text)\n * @param action - 点击时触发的操作\n * @param options - 按钮选项\n */\nexport function button(\n childId: string,\n action: Action,\n options: ButtonOptions = {}\n): ComponentInstance {\n const { id = generateId('button'), weight, primary } = options;\n return {\n id,\n component: 'Button',\n child: childId,\n action,\n ...(weight !== undefined && { weight }),\n ...(primary !== undefined && { primary }),\n };\n}\n\n/**\n * 创建 CheckBox 组件\n *\n * @param label - 标签\n * @param value - 值(布尔值或数据路径)\n * @param options - 选项\n */\nexport function checkbox(\n label: StringOrPath,\n value: BooleanOrPath,\n options: CheckBoxOptions = {}\n): ComponentInstance {\n const { id = generateId('checkbox'), weight } = options;\n return {\n id,\n component: 'CheckBox',\n label,\n value,\n ...(weight !== undefined && { weight }),\n };\n}\n\n/**\n * 创建 TextField 组件\n *\n * @param label - 标签\n * @param textValue - 值(可选)\n * @param options - 选项\n */\nexport function textField(\n label: StringOrPath,\n textValue?: StringOrPath,\n options: TextFieldOptions = {}\n): ComponentInstance {\n const { id = generateId('textfield'), weight, usageHint, validationRegexp } = options;\n return {\n id,\n component: 'TextField',\n label,\n ...(textValue !== undefined && { text: textValue }),\n ...(weight !== undefined && { weight }),\n ...(usageHint && { usageHint }),\n ...(validationRegexp && { validationRegexp }),\n };\n}\n\n/**\n * 创建 DateTimeInput 组件\n *\n * @param value - 值(ISO 8601 格式字符串或数据路径)\n * @param options - 选项\n */\nexport function dateTimeInput(\n value: StringOrPath,\n options: DateTimeInputOptions = {}\n): ComponentInstance {\n const { id = generateId('datetime'), weight, enableDate, enableTime, outputFormat, label } = options;\n return {\n id,\n component: 'DateTimeInput',\n value,\n ...(weight !== undefined && { weight }),\n ...(enableDate !== undefined && { enableDate }),\n ...(enableTime !== undefined && { enableTime }),\n ...(outputFormat && { outputFormat }),\n ...(label && { label }),\n };\n}\n\n/**\n * 创建 ChoicePicker 组件\n *\n * @param optionsList - 选项列表\n * @param value - 当前选中值\n * @param usageHint - 使用提示\n * @param options - 组件选项\n */\nexport function choicePicker(\n optionsList: Array<{ label: StringOrPath; value: string }>,\n value: StringArrayOrPath,\n usageHint: ChoicePickerComponent['usageHint'],\n options: ChoicePickerOptions = {}\n): ComponentInstance {\n const { id = generateId('choice'), weight, label } = options;\n return {\n id,\n component: 'ChoicePicker',\n options: optionsList,\n value,\n usageHint,\n ...(weight !== undefined && { weight }),\n ...(label && { label }),\n };\n}\n\n/**\n * 创建 Slider 组件\n *\n * @param value - 当前值\n * @param options - 选项\n */\nexport function slider(\n value: NumberOrPath,\n options: SliderOptions = {}\n): ComponentInstance {\n const { id = generateId('slider'), weight, label, min, max } = options;\n return {\n id,\n component: 'Slider',\n value,\n ...(weight !== undefined && { weight }),\n ...(label && { label }),\n ...(min !== undefined && { min }),\n ...(max !== undefined && { max }),\n };\n}\n\n// ============================================================================\n// 便捷组件构建器\n// ============================================================================\n\n/**\n * 创建带文本的按钮(返回按钮和文本组件)\n *\n * @param buttonText - 按钮文本\n * @param action - 点击操作\n * @param options - 按钮选项\n * @returns 包含按钮和文本组件的数组\n */\nexport function textButton(\n buttonText: string,\n action: Action,\n options: ButtonOptions & { textId?: string } = {}\n): [ComponentInstance, ComponentInstance] {\n const textId = options.textId ?? generateId('btn_text');\n const textComp = text(buttonText, { id: textId });\n const buttonComp = button(textId, action, options);\n return [textComp, buttonComp];\n}\n\n/**\n * 创建标题组件\n */\nexport function h1(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'h1' });\n}\n\nexport function h2(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'h2' });\n}\n\nexport function h3(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'h3' });\n}\n\nexport function h4(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'h4' });\n}\n\nexport function h5(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'h5' });\n}\n\nexport function caption(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'caption' });\n}\n\nexport function body(content: StringOrPath, options: Omit<TextOptions, 'usageHint'> = {}): ComponentInstance {\n return text(content, { ...options, usageHint: 'body' });\n}\n\n","/**\n * Data Model Builder\n *\n * 提供 DataModel 相关的构建工具函数\n * 符合 A2UI 协议的 ValueMap 格式\n */\n\nimport type { ValueMap, DataValue, DataObject } from '../types';\n\n/**\n * 路径映射表类型\n */\nexport type PathMappings = Record<string, string>;\n\n/**\n * 默认路径映射\n */\nexport const DEFAULT_PATH_MAPPINGS: PathMappings = {};\n\n/**\n * 将 JavaScript 对象转换为 A2UI ValueMap 格式\n *\n * @param obj - JavaScript 对象\n * @param prefix - 路径前缀(用于嵌套对象的 key 生成)\n *\n * @example\n * objectToValueMap({ name: 'John', age: 30 });\n * // Returns: [\n * // { key: '/name', valueString: 'John' },\n * // { key: '/age', valueNumber: 30 }\n * // ]\n */\nexport function objectToValueMap(obj: DataObject, prefix = ''): ValueMap[] {\n const entries: ValueMap[] = [];\n\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}/${key}` : `/${key}`;\n entries.push(valueToValueMap(fullKey, value));\n }\n\n return entries;\n}\n\n/**\n * 将单个值转换为 A2UI ValueMap 格式\n *\n * @param key - 数据路径/键\n * @param value - JavaScript 值\n */\nexport function valueToValueMap(key: string, value: DataValue): ValueMap {\n if (value === null || value === undefined) {\n return { key, valueString: '' };\n }\n\n if (typeof value === 'string') {\n return { key, valueString: value };\n }\n\n if (typeof value === 'number') {\n return { key, valueNumber: value };\n }\n\n if (typeof value === 'boolean') {\n return { key, valueBoolean: value };\n }\n\n if (Array.isArray(value)) {\n return {\n key,\n valueMap: value.map((item, index) => valueToValueMap(String(index), item)),\n };\n }\n\n if (typeof value === 'object') {\n const nestedMaps: ValueMap[] = [];\n for (const [k, v] of Object.entries(value)) {\n nestedMaps.push(valueToValueMap(k, v as DataValue));\n }\n return { key, valueMap: nestedMaps };\n }\n\n return { key, valueString: String(value) };\n}\n\n/**\n * 规范化路径格式\n * - 将 . 分隔符转换为 /\n * - 确保路径以 / 开头\n * - 可选路径映射\n *\n * @param path - 原始路径\n * @param pathMappings - 可选路径映射表\n *\n * @example\n * normalizePath('user.name'); // '/user/name'\n * normalizePath('/user/name'); // '/user/name'\n * normalizePath('stats.count', { stats: 'progress' }); // '/progress/count'\n */\nexport function normalizePath(path: string, pathMappings: PathMappings = {}): string {\n // 1. 将 . 分隔符转换为 /\n let normalizedPath = path.replace(/\\./g, '/');\n\n // 2. 确保路径以 / 开头\n if (!normalizedPath.startsWith('/')) {\n normalizedPath = `/${normalizedPath}`;\n }\n\n // 3. 应用路径映射\n for (const [from, to] of Object.entries(pathMappings)) {\n const fromPattern = new RegExp(`^/${from}(/|$)`);\n if (fromPattern.test(normalizedPath)) {\n normalizedPath = normalizedPath.replace(fromPattern, `/${to}$1`);\n }\n }\n\n return normalizedPath;\n}\n\n/**\n * 更新数据项定义\n */\nexport interface UpdateDataItem {\n /** 数据路径 */\n path: string;\n /** 新值 */\n value: DataValue;\n /** 值类型(可选,用于类型提示) */\n valueType?: 'string' | 'number' | 'boolean' | 'list' | 'map';\n /** 操作类型(可选,用于增量更新) */\n operation?: 'set' | 'increment' | 'decrement' | 'append' | 'remove';\n}\n\n/**\n * 将更新数据项数组转换为 ValueMap\n *\n * @param updates - 更新数据项\n * @param basePath - 基础路径\n * @param pathMappings - 可选路径映射表\n */\nexport function updatesToValueMap(\n updates: UpdateDataItem[],\n basePath = '',\n pathMappings: PathMappings = DEFAULT_PATH_MAPPINGS\n): ValueMap[] {\n const entries: ValueMap[] = [];\n\n for (const update of updates) {\n const rawPath = update.path.startsWith('/') ? update.path : `${basePath}/${update.path}`;\n const normalizedPath = normalizePath(rawPath, pathMappings);\n\n if (update.value !== null && typeof update.value === 'object' && !Array.isArray(update.value)) {\n const flattenedEntries = flattenObjectToValueMap(\n update.value as DataObject,\n normalizedPath\n );\n entries.push(...flattenedEntries);\n } else {\n entries.push(valueToValueMap(normalizedPath, update.value));\n }\n }\n\n return entries;\n}\n\n/**\n * 将嵌套对象扁平化为 ValueMap 条目\n *\n * @param obj - 要扁平化的对象\n * @param basePath - 基础路径\n */\nexport function flattenObjectToValueMap(\n obj: DataObject,\n basePath: string\n): ValueMap[] {\n const entries: ValueMap[] = [];\n\n for (const [key, value] of Object.entries(obj)) {\n const fullPath = `${basePath}/${key}`;\n\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n const nestedEntries = flattenObjectToValueMap(value as DataObject, fullPath);\n entries.push(...nestedEntries);\n } else {\n entries.push(valueToValueMap(fullPath, value as DataValue));\n }\n }\n\n return entries;\n}\n\n/**\n * 从 ValueMap 数组中提取普通 JavaScript 对象\n *\n * @param valueMaps - ValueMap 数组\n * @returns JavaScript 对象\n */\nexport function valueMapToObject(valueMaps: ValueMap[]): DataObject {\n const result: DataObject = {};\n\n for (const valueMap of valueMaps) {\n const key = valueMap.key.startsWith('/') ? valueMap.key.slice(1) : valueMap.key;\n \n if (valueMap.valueString !== undefined) {\n result[key] = valueMap.valueString;\n } else if (valueMap.valueNumber !== undefined) {\n result[key] = valueMap.valueNumber;\n } else if (valueMap.valueBoolean !== undefined) {\n result[key] = valueMap.valueBoolean;\n } else if (valueMap.valueMap !== undefined) {\n result[key] = valueMapToObject(valueMap.valueMap);\n }\n }\n\n return result;\n}\n\n","/**\n * Message Builder\n *\n * 提供 A2UI 协议消息的构建工具函数\n * 支持 v0.8 和 v0.9 两种消息格式\n */\n\nimport type {\n // v0.9\n CreateSurfaceMessage,\n UpdateComponentsMessage,\n UpdateDataModelMessage,\n DeleteSurfaceMessage,\n ServerToClientMessageV09,\n // v0.8\n BeginRenderingMessage,\n SurfaceUpdateMessage,\n DataModelUpdateMessage,\n ServerToClientMessageV08,\n ComponentInstanceV08,\n ValueMap,\n // Common\n ComponentInstance,\n DataObject,\n DataValue,\n} from '../types';\nimport { STANDARD_CATALOG_ID } from '../types';\nimport { objectToValueMap, valueToValueMap } from './data-model-builder';\n\n// ============================================================================\n// v0.9 消息构建器\n// ============================================================================\n\n/**\n * 创建 CreateSurface 消息 (v0.9)\n *\n * @param surfaceId - Surface ID\n * @param catalogId - Catalog ID(默认为标准目录)\n */\nexport function createSurface(\n surfaceId: string,\n catalogId: string = STANDARD_CATALOG_ID\n): CreateSurfaceMessage {\n return {\n createSurface: {\n surfaceId,\n catalogId,\n },\n };\n}\n\n/**\n * 创建 UpdateComponents 消息 (v0.9)\n *\n * @param surfaceId - Surface ID\n * @param components - 组件列表\n */\nexport function updateComponents(\n surfaceId: string,\n components: ComponentInstance[]\n): UpdateComponentsMessage {\n return {\n updateComponents: {\n surfaceId,\n components,\n },\n };\n}\n\n/**\n * 创建 UpdateDataModel 消息 (v0.9)\n *\n * @param surfaceId - Surface ID\n * @param value - 数据值\n * @param path - 数据路径(可选)\n * @param op - 操作类型(默认为 replace)\n */\nexport function updateDataModel(\n surfaceId: string,\n value: unknown,\n path?: string,\n op: 'add' | 'replace' | 'remove' = 'replace'\n): UpdateDataModelMessage {\n return {\n updateDataModel: {\n surfaceId,\n ...(path && { path }),\n op,\n ...(op !== 'remove' && { value }),\n },\n };\n}\n\n/**\n * 创建 DeleteSurface 消息 (v0.9)\n *\n * @param surfaceId - 要删除的 Surface ID\n */\nexport function deleteSurface(surfaceId: string): DeleteSurfaceMessage {\n return {\n deleteSurface: {\n surfaceId,\n },\n };\n}\n\n/**\n * 创建完整的 v0.9 消息序列\n *\n * @param options - 选项\n * @returns 消息数组(可直接作为 JSONL 流发送)\n */\nexport function createV09Messages(options: {\n surfaceId: string;\n catalogId?: string;\n components: ComponentInstance[];\n dataModel?: DataObject;\n}): ServerToClientMessageV09[] {\n const { surfaceId, catalogId = STANDARD_CATALOG_ID, components, dataModel } = options;\n\n const messages: ServerToClientMessageV09[] = [\n createSurface(surfaceId, catalogId),\n updateComponents(surfaceId, components),\n ];\n\n if (dataModel) {\n messages.push(updateDataModel(surfaceId, dataModel));\n }\n\n return messages;\n}\n\n// ============================================================================\n// v0.8 消息构建器\n// ============================================================================\n\n/**\n * 创建 BeginRendering 消息 (v0.8)\n *\n * @param rootId - 根组件 ID\n * @param surfaceId - Surface ID\n * @param styles - 样式配置\n */\nexport function beginRendering(\n rootId: string,\n surfaceId = '@default',\n styles?: Record<string, string>\n): BeginRenderingMessage {\n return {\n beginRendering: {\n surfaceId,\n root: rootId,\n ...(styles && { styles }),\n },\n };\n}\n\n/**\n * 创建 SurfaceUpdate 消息 (v0.8)\n *\n * @param components - 组件定义数组\n * @param surfaceId - Surface ID\n */\nexport function surfaceUpdate(\n components: ComponentInstanceV08[],\n surfaceId = '@default'\n): SurfaceUpdateMessage {\n return {\n surfaceUpdate: {\n surfaceId,\n components,\n },\n };\n}\n\n/**\n * 创建 DataModelUpdate 消息 (v0.8)\n *\n * @param contents - ValueMap 数组\n * @param surfaceId - Surface ID\n * @param path - 数据路径(可选)\n */\nexport function dataModelUpdate(\n contents: ValueMap[],\n surfaceId = '@default',\n path?: string\n): DataModelUpdateMessage {\n return {\n dataModelUpdate: {\n surfaceId,\n contents,\n ...(path && { path }),\n },\n };\n}\n\n/**\n * 创建 DataModel 初始化消息 (v0.8)\n *\n * @param data - 初始数据对象\n * @param surfaceId - Surface ID\n */\nexport function dataModelInit(\n data: DataObject,\n surfaceId = '@default'\n): DataModelUpdateMessage {\n return dataModelUpdate(objectToValueMap(data), surfaceId);\n}\n\n/**\n * 创建路径更新消息 (v0.8)\n *\n * @param path - 数据路径\n * @param value - 新值\n * @param surfaceId - Surface ID\n */\nexport function pathUpdate(\n path: string,\n value: DataValue,\n surfaceId = '@default'\n): DataModelUpdateMessage {\n return {\n dataModelUpdate: {\n surfaceId,\n path,\n contents: [valueToValueMap('', value)],\n },\n };\n}\n\n/**\n * 创建 DeleteSurface 消息 (v0.8)\n *\n * @param surfaceId - 要删除的 Surface ID\n */\nexport function deleteSurfaceV08(surfaceId: string): { deleteSurface: { surfaceId: string } } {\n return {\n deleteSurface: {\n surfaceId,\n },\n };\n}\n\n/**\n * 创建完整的 v0.8 消息数组\n *\n * @param options - 选项\n * @returns 消息数组\n */\nexport function createV08Messages(options: {\n rootId: string;\n components: ComponentInstanceV08[];\n dataModel?: DataObject;\n surfaceId?: string;\n styles?: Record<string, string>;\n}): ServerToClientMessageV08[] {\n const { rootId, components, dataModel, surfaceId = '@default', styles } = options;\n\n const messages: ServerToClientMessageV08[] = [\n surfaceUpdate(components, surfaceId),\n ];\n\n if (dataModel) {\n messages.push(dataModelInit(dataModel, surfaceId));\n }\n\n messages.push(beginRendering(rootId, surfaceId, styles));\n\n return messages;\n}\n\n// ============================================================================\n// 通用消息工具\n// ============================================================================\n\n/**\n * 将消息数组转换为 JSONL 格式字符串\n *\n * @param messages - 消息数组\n * @returns JSONL 格式字符串\n */\nexport function messagesToJsonl(messages: Array<ServerToClientMessageV08 | ServerToClientMessageV09>): string {\n return messages.map(msg => JSON.stringify(msg)).join('\\n');\n}\n\n/**\n * 从 JSONL 格式字符串解析消息数组\n *\n * @param jsonl - JSONL 格式字符串\n * @returns 消息数组\n */\nexport function jsonlToMessages(jsonl: string): Array<ServerToClientMessageV08 | ServerToClientMessageV09> {\n return jsonl\n .split('\\n')\n .filter(line => line.trim())\n .map(line => JSON.parse(line) as ServerToClientMessageV08 | ServerToClientMessageV09);\n}\n\n","/**\n * Message Validator\n *\n * 提供 A2UI 消息验证功能\n */\n\nimport type {\n ServerToClientMessage,\n ServerToClientMessageV08,\n ServerToClientMessageV09,\n ComponentInstance,\n ComponentInstanceV08,\n} from '../types';\n\n/**\n * 验证结果\n */\nexport interface ValidationResult {\n /** 是否有效 */\n valid: boolean;\n /** 错误信息列表 */\n errors: ValidationError[];\n /** 警告信息列表 */\n warnings: ValidationWarning[];\n}\n\n/**\n * 验证错误\n */\nexport interface ValidationError {\n /** 错误代码 */\n code: string;\n /** 错误消息 */\n message: string;\n /** 错误路径(如 'components[0].id') */\n path?: string;\n}\n\n/**\n * 验证警告\n */\nexport interface ValidationWarning {\n /** 警告代码 */\n code: string;\n /** 警告消息 */\n message: string;\n /** 警告路径 */\n path?: string;\n}\n\n/**\n * 验证选项\n */\nexport interface ValidationOptions {\n /** 是否严格模式(报告更多问题) */\n strict?: boolean;\n /** 允许的组件类型(为空表示允许所有) */\n allowedComponents?: string[];\n}\n\n/**\n * 标准组件类型列表\n */\nconst STANDARD_COMPONENT_TYPES = [\n 'Text',\n 'Image',\n 'Icon',\n 'Video',\n 'AudioPlayer',\n 'Row',\n 'Column',\n 'List',\n 'Card',\n 'Tabs',\n 'Divider',\n 'Modal',\n 'Button',\n 'CheckBox',\n 'TextField',\n 'DateTimeInput',\n 'ChoicePicker',\n 'Slider',\n];\n\n/**\n * 验证 v0.9 消息\n */\nexport function validateV09Message(\n message: ServerToClientMessageV09,\n options: ValidationOptions = {}\n): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n if ('createSurface' in message) {\n const { createSurface } = message;\n if (!createSurface.surfaceId) {\n errors.push({\n code: 'MISSING_SURFACE_ID',\n message: 'createSurface.surfaceId is required',\n path: 'createSurface.surfaceId',\n });\n }\n if (!createSurface.catalogId) {\n errors.push({\n code: 'MISSING_CATALOG_ID',\n message: 'createSurface.catalogId is required',\n path: 'createSurface.catalogId',\n });\n }\n } else if ('updateComponents' in message) {\n const { updateComponents } = message;\n if (!updateComponents.surfaceId) {\n errors.push({\n code: 'MISSING_SURFACE_ID',\n message: 'updateComponents.surfaceId is required',\n path: 'updateComponents.surfaceId',\n });\n }\n if (!updateComponents.components || !Array.isArray(updateComponents.components)) {\n errors.push({\n code: 'INVALID_COMPONENTS',\n message: 'updateComponents.components must be an array',\n path: 'updateComponents.components',\n });\n } else {\n // 验证组件\n validateComponentsV09(updateComponents.components, errors, warnings, options);\n }\n } else if ('updateDataModel' in message) {\n const { updateDataModel } = message;\n if (!updateDataModel.surfaceId) {\n errors.push({\n code: 'MISSING_SURFACE_ID',\n message: 'updateDataModel.surfaceId is required',\n path: 'updateDataModel.surfaceId',\n });\n }\n } else if ('deleteSurface' in message) {\n const { deleteSurface } = message;\n if (!deleteSurface.surfaceId) {\n errors.push({\n code: 'MISSING_SURFACE_ID',\n message: 'deleteSurface.surfaceId is required',\n path: 'deleteSurface.surfaceId',\n });\n }\n } else {\n errors.push({\n code: 'INVALID_MESSAGE_TYPE',\n message: 'Message must contain one of: createSurface, updateComponents, updateDataModel, deleteSurface',\n });\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * 验证 v0.8 消息\n */\nexport function validateV08Message(\n message: ServerToClientMessageV08,\n options: ValidationOptions = {}\n): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n if ('beginRendering' in message) {\n const { beginRendering } = message;\n if (!beginRendering.surfaceId) {\n errors.push({\n code: 'MISSING_SURFACE_ID',\n message: 'beginRendering.surfaceId is required',\n path: 'beginRendering.surfaceId',\n });\n }\n if (!beginRendering.root) {\n errors.push({\n code: 'MISSING_ROOT',\n message: 'beginRendering.root is required',\n path: 'beginRendering.root',\n });\n }\n } else if ('surfaceUpdate' in message) {\n const { surfaceUpdate } = message;\n if (!surfaceUpdate.surfaceId) {\n errors.push({\n code: 'MISSING_SURFACE_ID',\n message: 'surfaceUpdate.surfaceId is required',\n path: 'surfaceUpdate.surfaceId',\n });\n }\n if (!surfaceUpdate.components || !Array.isArray(surfaceUpdate.components)) {\n errors.push({\n code: 'INVALID_COMPONENTS',\n message: 'surfaceUpdate.components must be an array',\n path: 'surfaceUpdate.components',\n });\n } else {\n validateComponentsV08(surfaceUpdate.components, errors, warnings, options);\n }\n } else if ('dataModelUpdate' in message) {\n const { dataModelUpdate } = message;\n if (!dataModelUpdate.surfaceId) {\n errors.push({\n code: 'MISSING_SURFACE_ID',\n message: 'dataModelUpdate.surfaceId is required',\n path: 'dataModelUpdate.surfaceId',\n });\n }\n if (!dataModelUpdate.contents || !Array.isArray(dataModelUpdate.contents)) {\n errors.push({\n code: 'INVALID_CONTENTS',\n message: 'dataModelUpdate.contents must be an array',\n path: 'dataModelUpdate.contents',\n });\n }\n } else if ('deleteSurface' in message) {\n const { deleteSurface } = message;\n if (!deleteSurface.surfaceId) {\n errors.push({\n code: 'MISSING_SURFACE_ID',\n message: 'deleteSurface.surfaceId is required',\n path: 'deleteSurface.surfaceId',\n });\n }\n } else {\n errors.push({\n code: 'INVALID_MESSAGE_TYPE',\n message: 'Message must contain one of: beginRendering, surfaceUpdate, dataModelUpdate, deleteSurface',\n });\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * 验证消息(自动检测版本)\n */\nexport function validateMessage(\n message: ServerToClientMessage,\n options: ValidationOptions = {}\n): ValidationResult {\n // 检测消息版本\n if ('createSurface' in message || 'updateComponents' in message || 'updateDataModel' in message) {\n return validateV09Message(message as ServerToClientMessageV09, options);\n }\n \n if ('beginRendering' in message || 'surfaceUpdate' in message || 'dataModelUpdate' in message) {\n return validateV08Message(message as ServerToClientMessageV08, options);\n }\n\n if ('deleteSurface' in message) {\n // deleteSurface 在两个版本中格式相同\n if (!message.deleteSurface.surfaceId) {\n return {\n valid: false,\n errors: [{\n code: 'MISSING_SURFACE_ID',\n message: 'deleteSurface.surfaceId is required',\n path: 'deleteSurface.surfaceId',\n }],\n warnings: [],\n };\n }\n return { valid: true, errors: [], warnings: [] };\n }\n\n return {\n valid: false,\n errors: [{\n code: 'UNKNOWN_MESSAGE_TYPE',\n message: 'Unknown message type',\n }],\n warnings: [],\n };\n}\n\n/**\n * 验证消息数组\n */\nexport function validateMessages(\n messages: ServerToClientMessage[],\n options: ValidationOptions = {}\n): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const result = validateMessage(messages[i], options);\n for (const error of result.errors) {\n errors.push({\n ...error,\n path: `messages[${i}].${error.path || ''}`,\n });\n }\n for (const warning of result.warnings) {\n warnings.push({\n ...warning,\n path: `messages[${i}].${warning.path || ''}`,\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n// ============================================================================\n// 内部辅助函数\n// ============================================================================\n\nfunction validateComponentsV09(\n components: ComponentInstance[],\n errors: ValidationError[],\n warnings: ValidationWarning[],\n options: ValidationOptions\n): void {\n const componentIds = new Set<string>();\n let hasRoot = false;\n\n for (let i = 0; i < components.length; i++) {\n const comp = components[i];\n const path = `updateComponents.components[${i}]`;\n\n // 验证 ID\n if (!comp.id) {\n errors.push({\n code: 'MISSING_COMPONENT_ID',\n message: 'Component id is required',\n path: `${path}.id`,\n });\n } else {\n if (componentIds.has(comp.id)) {\n errors.push({\n code: 'DUPLICATE_COMPONENT_ID',\n message: `Duplicate component id: ${comp.id}`,\n path: `${path}.id`,\n });\n }\n componentIds.add(comp.id);\n\n if (comp.id === 'root') {\n hasRoot = true;\n }\n }\n\n // 验证组件类型\n if (!comp.component) {\n errors.push({\n code: 'MISSING_COMPONENT_TYPE',\n message: 'Component type is required',\n path: `${path}.component`,\n });\n } else if (options.strict && options.allowedComponents) {\n if (!options.allowedComponents.includes(comp.component)) {\n warnings.push({\n code: 'UNKNOWN_COMPONENT_TYPE',\n message: `Unknown component type: ${comp.component}`,\n path: `${path}.component`,\n });\n }\n }\n }\n\n // 检查是否有 root 组件\n if (!hasRoot && options.strict) {\n warnings.push({\n code: 'MISSING_ROOT_COMPONENT',\n message: 'No component with id \"root\" found',\n path: 'updateComponents.components',\n });\n }\n}\n\nfunction validateComponentsV08(\n components: ComponentInstanceV08[],\n errors: ValidationError[],\n warnings: ValidationWarning[],\n options: ValidationOptions\n): void {\n const componentIds = new Set<string>();\n\n for (let i = 0; i < components.length; i++) {\n const comp = components[i];\n const path = `surfaceUpdate.components[${i}]`;\n\n // 验证 ID\n if (!comp.id) {\n errors.push({\n code: 'MISSING_COMPONENT_ID',\n message: 'Component id is required',\n path: `${path}.id`,\n });\n } else {\n if (componentIds.has(comp.id)) {\n errors.push({\n code: 'DUPLICATE_COMPONENT_ID',\n message: `Duplicate component id: ${comp.id}`,\n path: `${path}.id`,\n });\n }\n componentIds.add(comp.id);\n }\n\n // 验证组件类型\n if (!comp.component || typeof comp.component !== 'object') {\n errors.push({\n code: 'MISSING_COMPONENT',\n message: 'Component definition is required',\n path: `${path}.component`,\n });\n } else {\n const componentType = Object.keys(comp.component)[0];\n if (options.strict && !STANDARD_COMPONENT_TYPES.includes(componentType)) {\n warnings.push({\n code: 'UNKNOWN_COMPONENT_TYPE',\n message: `Unknown component type: ${componentType}`,\n path: `${path}.component`,\n });\n }\n }\n }\n}\n\n","/**\n * A2UI Utilities\n *\n * 通用工具函数\n */\n\nimport type { StringOrPath, NumberOrPath, BooleanOrPath } from '../types';\n\n/**\n * 判断值是否为数据路径绑定\n */\nexport function isPathBinding(value: StringOrPath | NumberOrPath | BooleanOrPath): value is { path: string } {\n return typeof value === 'object' && value !== null && 'path' in value;\n}\n\n/**\n * 从值中获取字面量(如果是绑定则返回 undefined)\n */\nexport function getLiteralValue<T extends string | number | boolean>(\n value: T | { path: string }\n): T | undefined {\n if (isPathBinding(value)) {\n return undefined;\n }\n return value as T;\n}\n\n/**\n * 从值中获取路径(如果是字面量则返回 undefined)\n */\nexport function getPathValue(value: StringOrPath | NumberOrPath | BooleanOrPath): string | undefined {\n if (isPathBinding(value)) {\n return value.path;\n }\n return undefined;\n}\n\n/**\n * 创建数据路径绑定\n */\nexport function path(dataPath: string): { path: string } {\n return { path: dataPath };\n}\n\n/**\n * 深度合并对象\n */\nexport function deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\n const result = { ...target };\n \n for (const key of Object.keys(source) as Array<keyof T>) {\n const sourceValue = source[key];\n const targetValue = result[key];\n \n if (\n sourceValue !== undefined &&\n typeof sourceValue === 'object' &&\n sourceValue !== null &&\n !Array.isArray(sourceValue) &&\n typeof targetValue === 'object' &&\n targetValue !== null &&\n !Array.isArray(targetValue)\n ) {\n result[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n ) as T[keyof T];\n } else if (sourceValue !== undefined) {\n result[key] = sourceValue as T[keyof T];\n }\n }\n \n return result;\n}\n\n/**\n * 生成 UUID v4\n */\nexport function uuid(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n"]}
|