@optima-chat/optima-agent 0.4.1 → 0.4.3
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/.claude/skills/comfy/SKILL.md +102 -122
- package/.claude/skills/review/SKILL.md +238 -0
- package/README.md +2 -0
- package/dist/src/system-prompt.d.ts.map +1 -1
- package/dist/src/system-prompt.js +1 -0
- package/dist/src/system-prompt.js.map +1 -1
- package/package.json +1 -1
- package/.claude/settings.local.json +0 -44
- package/dist/src/ui/App.d.ts +0 -6
- package/dist/src/ui/App.d.ts.map +0 -1
- package/dist/src/ui/App.js +0 -164
- package/dist/src/ui/App.js.map +0 -1
- package/dist/src/ui/components/Composer.d.ts +0 -10
- package/dist/src/ui/components/Composer.d.ts.map +0 -1
- package/dist/src/ui/components/Composer.js +0 -13
- package/dist/src/ui/components/Composer.js.map +0 -1
- package/dist/src/ui/components/Header.d.ts +0 -7
- package/dist/src/ui/components/Header.d.ts.map +0 -1
- package/dist/src/ui/components/Header.js +0 -7
- package/dist/src/ui/components/Header.js.map +0 -1
- package/dist/src/ui/components/Message.d.ts +0 -12
- package/dist/src/ui/components/Message.d.ts.map +0 -1
- package/dist/src/ui/components/Message.js +0 -21
- package/dist/src/ui/components/Message.js.map +0 -1
- package/dist/src/ui/components/MessageList.d.ts +0 -9
- package/dist/src/ui/components/MessageList.d.ts.map +0 -1
- package/dist/src/ui/components/MessageList.js +0 -18
- package/dist/src/ui/components/MessageList.js.map +0 -1
- package/dist/src/ui/components/Spinner.d.ts +0 -6
- package/dist/src/ui/components/Spinner.d.ts.map +0 -1
- package/dist/src/ui/components/Spinner.js +0 -7
- package/dist/src/ui/components/Spinner.js.map +0 -1
- package/dist/src/ui/components/StatusBar.d.ts +0 -11
- package/dist/src/ui/components/StatusBar.d.ts.map +0 -1
- package/dist/src/ui/components/StatusBar.js +0 -7
- package/dist/src/ui/components/StatusBar.js.map +0 -1
- package/dist/src/ui/components/index.d.ts +0 -7
- package/dist/src/ui/components/index.d.ts.map +0 -1
- package/dist/src/ui/components/index.js +0 -7
- package/dist/src/ui/components/index.js.map +0 -1
|
@@ -1,189 +1,169 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: comfy
|
|
3
|
-
description: "
|
|
3
|
+
description: "生成和编辑图片/视频。使用场景:生成图片(generate images/生成图片/画图)、编辑图片(edit images/编辑图片/图生图/风格转换)、生成视频(create videos/图生视频)。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# 图像视频生成工具
|
|
7
7
|
|
|
8
8
|
## 标准工作流程
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
|
-
#
|
|
12
|
-
comfy
|
|
11
|
+
# 文生图
|
|
12
|
+
comfy image "提示词" -o /工作目录/result.png
|
|
13
13
|
|
|
14
|
-
#
|
|
15
|
-
comfy
|
|
14
|
+
# 图片编辑/风格转换
|
|
15
|
+
comfy image "转成水彩风格" -i photo.png -o /工作目录/result.png
|
|
16
16
|
|
|
17
|
-
#
|
|
18
|
-
Read
|
|
17
|
+
# 读取并描述结果
|
|
18
|
+
Read /工作目录/result.png
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
##
|
|
21
|
+
## comfy image 命令
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
1. 使用 `comfy generate "提示词"` - 命令会自动等待,不要手动检查状态
|
|
25
|
-
2. 下载结果:`comfy download <prompt_id> -o <完整文件路径含文件名>`
|
|
26
|
-
3. 使用 Read 工具读取下载的图片
|
|
27
|
-
4. 向用户描述图片内容(颜色、风格、构图、元素)
|
|
23
|
+
统一的图像生成/编辑命令。
|
|
28
24
|
|
|
29
|
-
### 下载文件时
|
|
30
|
-
- 必须指定完整文件路径,包含文件名
|
|
31
|
-
- 必须使用用户的工作目录
|
|
32
|
-
- 不能只指定目录(会导致 EISDIR 错误)
|
|
33
|
-
|
|
34
|
-
示例:
|
|
35
25
|
```bash
|
|
36
|
-
|
|
37
|
-
comfy download abc123 -o /Users/john/project/result.png
|
|
38
|
-
|
|
39
|
-
# 错误 - 会失败
|
|
40
|
-
comfy download abc123 -o /Users/john/project
|
|
26
|
+
comfy image <prompt> [options]
|
|
41
27
|
```
|
|
42
28
|
|
|
43
|
-
###
|
|
44
|
-
- 始终使用 Read 工具查看生成的图片
|
|
45
|
-
- 向用户描述图片内容
|
|
46
|
-
- 验证是否符合用户要求
|
|
47
|
-
- 如需改进,提供优化建议
|
|
29
|
+
### 参数
|
|
48
30
|
|
|
49
|
-
|
|
31
|
+
| 参数 | 说明 |
|
|
32
|
+
|------|------|
|
|
33
|
+
| `-i, --input <path>` | 输入图像(可多次使用,最多 8 张) |
|
|
34
|
+
| `-w, --width <px>` | 输出宽度(默认 1024,必须是 16 的倍数) |
|
|
35
|
+
| `-h, --height <px>` | 输出高度(默认 1024,必须是 16 的倍数) |
|
|
36
|
+
| `-o, --output <path>` | 输出目录或完整路径 |
|
|
37
|
+
| `-s, --seed <number>` | 随机种子(可复现结果) |
|
|
38
|
+
| `-f, --format <fmt>` | 输出格式:jpeg \| png |
|
|
50
39
|
|
|
51
|
-
|
|
52
|
-
```bash
|
|
53
|
-
comfy generate "提示词" [--width 1024] [--height 1024]
|
|
54
|
-
```
|
|
55
|
-
- 从文本提示词生成图片
|
|
56
|
-
- 默认尺寸:1024x1024
|
|
57
|
-
- 自动等待完成
|
|
58
|
-
- 返回 prompt_id 用于下载
|
|
40
|
+
## 工作流示例
|
|
59
41
|
|
|
60
|
-
###
|
|
61
|
-
```bash
|
|
62
|
-
comfy edit <图片路径> "编辑描述"
|
|
63
|
-
```
|
|
64
|
-
- 根据文本提示词修改现有图片
|
|
65
|
-
- 可以改变风格、添加元素、调整光线
|
|
66
|
-
- 自动等待完成
|
|
42
|
+
### 文生图
|
|
67
43
|
|
|
68
|
-
### 生成视频
|
|
69
44
|
```bash
|
|
70
|
-
comfy
|
|
45
|
+
comfy image "a cute fluffy cat sitting on a windowsill, natural lighting" -o /Users/john/project/cat.png
|
|
46
|
+
Read /Users/john/project/cat.png
|
|
71
47
|
```
|
|
72
|
-
- 从静态图片生成视频
|
|
73
|
-
- 推荐分辨率:512x512
|
|
74
|
-
- 可选:运动提示词和负向提示词
|
|
75
|
-
- 自动等待完成
|
|
76
48
|
|
|
77
|
-
###
|
|
49
|
+
### 图片风格转换
|
|
50
|
+
|
|
78
51
|
```bash
|
|
79
|
-
comfy
|
|
52
|
+
comfy image "watercolor painting style, artistic brushstrokes" -i photo.jpg -o /Users/john/project/watercolor.png
|
|
53
|
+
Read /Users/john/project/watercolor.png
|
|
80
54
|
```
|
|
81
|
-
- 下载生成的文件到指定路径
|
|
82
|
-
- 路径必须包含文件名和扩展名
|
|
83
|
-
- 必须在用户的工作目录下
|
|
84
55
|
|
|
85
|
-
|
|
56
|
+
### 多图风格融合
|
|
86
57
|
|
|
87
|
-
|
|
88
|
-
用户:"生成一张猫的图片"
|
|
58
|
+
将第一张图的风格应用到第二张图的内容上:
|
|
89
59
|
|
|
90
60
|
```bash
|
|
91
|
-
comfy
|
|
92
|
-
|
|
93
|
-
Read /Users/john/project/cat.png
|
|
61
|
+
comfy image "apply the artistic style from image 1 to the content of image 2" -i style.png -i content.png -o /Users/john/project/fusion.png
|
|
62
|
+
Read /Users/john/project/fusion.png
|
|
94
63
|
```
|
|
95
|
-
然后描述:"我生成了一张猫的图片。图片展示了一只蓬松的小猫坐在窗台上,自然光线下。猫咪有【描述颜色、表情、细节】。"
|
|
96
64
|
|
|
97
|
-
###
|
|
98
|
-
|
|
65
|
+
### 多图元素组合
|
|
66
|
+
|
|
67
|
+
从多张图中提取元素组合成新图:
|
|
99
68
|
|
|
100
69
|
```bash
|
|
101
|
-
comfy
|
|
102
|
-
comfy download def456 -o /Users/john/project/poster.png
|
|
103
|
-
Read /Users/john/project/poster.png
|
|
70
|
+
comfy image "The person from image 1 is petting the cat from image 2, in a cozy living room" -i person.jpg -i cat.jpg -o /Users/john/project/combined.png
|
|
104
71
|
```
|
|
105
|
-
然后描述海报的风格、颜色、角色、构图。
|
|
106
72
|
|
|
107
|
-
###
|
|
108
|
-
|
|
73
|
+
### 精确颜色控制
|
|
74
|
+
|
|
75
|
+
使用 hex code 指定精确颜色:
|
|
109
76
|
|
|
110
77
|
```bash
|
|
111
|
-
comfy
|
|
112
|
-
comfy download ghi789 -o /Users/john/project/portrait-anime.png
|
|
113
|
-
Read /Users/john/project/portrait-anime.png
|
|
78
|
+
comfy image "a modern logo with brand color #02eb3c as the primary accent" -o /Users/john/project/logo.png
|
|
114
79
|
```
|
|
115
|
-
然后描述动漫风格转换的效果。
|
|
116
80
|
|
|
117
|
-
###
|
|
118
|
-
用户:"把这张人像做成视频"
|
|
81
|
+
### 产品海报
|
|
119
82
|
|
|
120
83
|
```bash
|
|
121
|
-
comfy
|
|
122
|
-
comfy download jkl012 -o /Users/john/project/portrait-video.mp4
|
|
84
|
+
comfy image "Disney Pixar style 3D poster, [产品描述], cute character, vibrant gradient background, professional studio lighting" -w 1024 -h 1024 -o /Users/john/project/poster.png
|
|
123
85
|
```
|
|
124
|
-
视频文件无需读取,直接告知用户文件路径即可。
|
|
125
86
|
|
|
126
|
-
##
|
|
87
|
+
## 提示词指南(FLUX.2)
|
|
127
88
|
|
|
128
89
|
### 结构
|
|
129
|
-
- 具体明确:"a golden retriever puppy playing in a garden" 而非 "a dog"
|
|
130
|
-
- 包含风格:"photorealistic"、"anime style"、"oil painting"、"Disney Pixar style"
|
|
131
|
-
- 添加细节:材质、光线、背景、氛围
|
|
132
|
-
- 使用英文以获得最佳效果(FLUX 模型对英文效果更好)
|
|
133
90
|
|
|
134
|
-
|
|
91
|
+
**Subject + Action + Style + Context**
|
|
92
|
+
|
|
93
|
+
词序很重要,靠前的元素优先级更高。
|
|
94
|
+
|
|
95
|
+
### 长度建议
|
|
96
|
+
|
|
97
|
+
| 长度 | 词数 | 适用场景 |
|
|
98
|
+
|------|------|----------|
|
|
99
|
+
| 短 | 10-30 | 快速概念探索 |
|
|
100
|
+
| 中 | 30-80 | 大多数项目(推荐) |
|
|
101
|
+
| 长 | 80+ | 复杂场景 |
|
|
102
|
+
|
|
103
|
+
### 最佳实践
|
|
104
|
+
|
|
105
|
+
| 技巧 | 说明 | 示例 |
|
|
106
|
+
|------|------|------|
|
|
107
|
+
| 描述想要的 | 不支持负向提示词 | "sharp focus" 而非 "no blur" |
|
|
108
|
+
| 精确颜色 | 使用 hex code | `"brand color #1a1a2e"` |
|
|
109
|
+
| 文字渲染 | 用引号包裹文字 | `"The text 'OPEN' in red neon"` |
|
|
110
|
+
| 摄影风格 | 指定相机/镜头 | `"shot on Fujifilm X-T5, 35mm f/1.4"` |
|
|
111
|
+
| 多语言 | 用原生语言更地道 | 法语描述巴黎场景 |
|
|
112
|
+
|
|
113
|
+
### 示例对比
|
|
114
|
+
|
|
135
115
|
```bash
|
|
136
|
-
#
|
|
137
|
-
comfy
|
|
116
|
+
# 简单
|
|
117
|
+
comfy image "a robot"
|
|
138
118
|
|
|
139
|
-
#
|
|
140
|
-
comfy
|
|
119
|
+
# 添加风格
|
|
120
|
+
comfy image "a friendly AI robot, cute cartoon style, bright colors, 3D render"
|
|
141
121
|
|
|
142
|
-
#
|
|
143
|
-
comfy
|
|
122
|
+
# 完整描述
|
|
123
|
+
comfy image "Disney Pixar style 3D animated robot character, friendly cheerful expression, wearing headset, surrounded by floating icons, gradient purple-blue background, professional studio lighting, vibrant colors"
|
|
144
124
|
```
|
|
145
125
|
|
|
146
126
|
## 分辨率选择
|
|
147
127
|
|
|
128
|
+
尺寸必须是 **16 的倍数**,最大支持 4MP(推荐 2MP 内)。
|
|
129
|
+
|
|
148
130
|
| 用途 | 分辨率 |
|
|
149
131
|
|------|--------|
|
|
150
|
-
|
|
|
151
|
-
| 宽屏壁纸 |
|
|
132
|
+
| 社交媒体 | 1024x1024 |
|
|
133
|
+
| 宽屏壁纸 | 1920x1088 |
|
|
152
134
|
| 竖屏海报 | 768x1280 |
|
|
153
|
-
|
|
|
154
|
-
|
|
155
|
-
## 错误预防
|
|
156
|
-
|
|
157
|
-
### 不要做:
|
|
158
|
-
- 生成后立即检查状态(还未入队)
|
|
159
|
-
- 使用 sleep + 检查状态循环(命令会自动等待)
|
|
160
|
-
- 下载时只指定目录(必须包含文件名)
|
|
161
|
-
- 跳过读取生成的图片(用户需要看到描述)
|
|
162
|
-
|
|
163
|
-
### 必须做:
|
|
164
|
-
- 使用默认等待行为(不要添加 --no-wait)
|
|
165
|
-
- 下载时指定完整文件路径
|
|
166
|
-
- 读取生成的图片并描述给用户
|
|
167
|
-
- 使用英文提示词以获得更好效果
|
|
168
|
-
- 生成视频时使用 512x512 分辨率
|
|
135
|
+
| 视频输入 | 512x512 |
|
|
169
136
|
|
|
170
|
-
##
|
|
137
|
+
## 视频生成
|
|
171
138
|
|
|
172
139
|
```bash
|
|
173
|
-
comfy
|
|
174
|
-
comfy queue clear --confirm # 清空队列
|
|
175
|
-
comfy interrupt # 中断当前任务
|
|
140
|
+
comfy video <图片路径> --prompt "运动描述" --width 512 --height 512
|
|
176
141
|
```
|
|
177
142
|
|
|
178
|
-
|
|
143
|
+
从静态图片生成视频,推荐分辨率 512x512。
|
|
179
144
|
|
|
180
145
|
```bash
|
|
181
|
-
comfy
|
|
182
|
-
comfy
|
|
146
|
+
comfy video /Users/john/portrait.png --prompt "natural facial expression, subtle head movement" --width 512 --height 512
|
|
147
|
+
comfy download <prompt_id> -o /Users/john/project/video.mp4
|
|
183
148
|
```
|
|
184
149
|
|
|
185
|
-
##
|
|
150
|
+
## 必须遵守的规则
|
|
151
|
+
|
|
152
|
+
### 生成后
|
|
153
|
+
- 使用 Read 工具查看生成的图片
|
|
154
|
+
- 向用户描述图片内容(颜色、风格、构图、元素)
|
|
155
|
+
- 验证是否符合用户要求
|
|
156
|
+
|
|
157
|
+
### 尺寸要求
|
|
158
|
+
- 宽高必须是 16 的倍数
|
|
159
|
+
- 最大 4MP,推荐 2MP 内
|
|
186
160
|
|
|
187
|
-
|
|
188
|
-
-
|
|
189
|
-
|
|
161
|
+
### 多图参考
|
|
162
|
+
- 最多 8 张输入图
|
|
163
|
+
|
|
164
|
+
## 系统命令
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
comfy queue status # 队列状态
|
|
168
|
+
comfy interrupt # 中断任务
|
|
169
|
+
```
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: review
|
|
3
|
+
description: Review management and moderation. View, approve, reject, and respond to customer reviews. Handle featured reviews, reports, and settings. Use when user needs to moderate reviews, respond to feedback, manage review reports, configure auto-approval, or view review statistics.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Commerce CLI - Review Management
|
|
7
|
+
|
|
8
|
+
评价管理模块,用于审核、回复和管理顾客评价。
|
|
9
|
+
|
|
10
|
+
## 典型场景
|
|
11
|
+
|
|
12
|
+
当用户说:
|
|
13
|
+
- "查看待审核评价" → `commerce review list --status pending`
|
|
14
|
+
- "批准评价XX" → `commerce review approve --id XX`
|
|
15
|
+
- "回复评价XX" → `commerce review respond --id XX --content "感谢您的反馈!"`
|
|
16
|
+
- "查看评价统计" → `commerce review stats`
|
|
17
|
+
- "设为精选" → `commerce review feature --id XX --enable`
|
|
18
|
+
- "查看举报" → `commerce review reports --status pending`
|
|
19
|
+
- "查看评价设置" → `commerce review get-settings`
|
|
20
|
+
- "开启自动审核" → `commerce review update-settings --auto-approve --min-rating 4`
|
|
21
|
+
|
|
22
|
+
### 场景决策表
|
|
23
|
+
|
|
24
|
+
| 用户需求 | 推荐命令 | 关键注意点 |
|
|
25
|
+
|---------|---------|-----------|
|
|
26
|
+
| 查看待审核评价 | `review list --status pending` | 优先处理1-2星低分评价 |
|
|
27
|
+
| 批量审核 | `review batch --action approve` | 高分评价可批量批准 |
|
|
28
|
+
| 回复差评 | `review respond` | 先道歉再解决,避免激化 |
|
|
29
|
+
| 精选好评 | `review feature --enable` | 选择有图、详细的5星评价 |
|
|
30
|
+
| 处理举报 | `review handle-report` | 核实后决定删除或驳回 |
|
|
31
|
+
| 查看统计 | `review stats` | 监控平均分和评分分布趋势 |
|
|
32
|
+
| 查看设置 | `review get-settings` | 了解当前自动审核等配置 |
|
|
33
|
+
| 开启自动审核 | `review update-settings --auto-approve` | 建议设置最低评分 4 星 |
|
|
34
|
+
|
|
35
|
+
### 标准评价管理流程
|
|
36
|
+
1. **每日审核** - `commerce review list --status pending` 查看待审核
|
|
37
|
+
2. **批准好评** - 4-5星评价快速批准 `commerce review approve --id XX`
|
|
38
|
+
3. **处理差评** - 1-3星评价仔细查看,考虑是否回复
|
|
39
|
+
4. **回复评价** - `commerce review respond` 对有建设性的差评友善回复
|
|
40
|
+
5. **精选好评** - `commerce review feature --enable` 选择有代表性的好评
|
|
41
|
+
6. **处理举报** - `commerce review reports` 查看并处理被举报的评价
|
|
42
|
+
|
|
43
|
+
### 差评处理流程
|
|
44
|
+
1. **查看详情** - `commerce review get --id XX` 了解评价内容
|
|
45
|
+
2. **核实情况** - 查看订单记录,确认是否有服务问题
|
|
46
|
+
3. **决定行动** - 合理差评→回复致歉;恶意差评→考虑拒绝或删除
|
|
47
|
+
4. **回复评价** - `commerce review respond` 真诚道歉并提出解决方案
|
|
48
|
+
5. **跟进改进** - 记录问题,优化产品或服务
|
|
49
|
+
|
|
50
|
+
## 卓越标准
|
|
51
|
+
|
|
52
|
+
### 评价管理质量指标
|
|
53
|
+
- **审核及时性**: 新评价24小时内审核完成
|
|
54
|
+
- **回复率**: 差评(1-3星)回复率 > 80%
|
|
55
|
+
- **平均评分**: 维持在 4.0 以上
|
|
56
|
+
- **精选覆盖**: 每个热门商品至少有1条精选评价
|
|
57
|
+
|
|
58
|
+
### 评价管理原则
|
|
59
|
+
- **及时响应**: 待审核评价堆积不超过50条
|
|
60
|
+
- **真诚回复**: 差评回复要表达歉意和解决意愿
|
|
61
|
+
- **精选多样**: 精选不同评分、不同角度的好评
|
|
62
|
+
- **公正处理**: 只删除明显违规评价,不删真实差评
|
|
63
|
+
- **数据驱动**: 定期查看统计,发现产品问题
|
|
64
|
+
|
|
65
|
+
## 常见问题
|
|
66
|
+
|
|
67
|
+
### 差评回复错误
|
|
68
|
+
|
|
69
|
+
❌ **错误做法 - 推卸责任**:
|
|
70
|
+
```
|
|
71
|
+
"这不是我们的问题,可能是快递造成的损坏。"
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
✅ **正确做法 - 真诚道歉**:
|
|
75
|
+
```bash
|
|
76
|
+
commerce review respond --id review_123 --content "非常抱歉给您带来了不好的体验。我们已经联系您协商补偿方案,感谢您的理解。如有任何问题,请随时联系我们的客服。"
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 精选评价选择
|
|
80
|
+
|
|
81
|
+
❌ **错误做法 - 只选5星简短评价**:
|
|
82
|
+
- "好" "不错" 这类评价没有参考价值
|
|
83
|
+
|
|
84
|
+
✅ **正确做法 - 选择有价值的评价**:
|
|
85
|
+
- 有详细使用体验
|
|
86
|
+
- 有实拍图片
|
|
87
|
+
- 提到具体优点
|
|
88
|
+
- 对其他买家有参考价值
|
|
89
|
+
|
|
90
|
+
### 举报处理
|
|
91
|
+
|
|
92
|
+
❌ **错误做法 - 不核实就删除**:
|
|
93
|
+
- 收到举报就删除评价,可能删除真实差评
|
|
94
|
+
|
|
95
|
+
✅ **正确处理**:
|
|
96
|
+
- **虚假评价** → 查看订单记录,确认未购买则删除
|
|
97
|
+
- **不当内容** → 包含脏话、广告则删除
|
|
98
|
+
- **恶意竞争** → 多个可疑评价来自同一IP则删除
|
|
99
|
+
- **真实差评** → 即使被举报也不应删除,驳回举报
|
|
100
|
+
|
|
101
|
+
## 命令参考
|
|
102
|
+
|
|
103
|
+
### 评价查看
|
|
104
|
+
- `commerce review list` - 查看评价列表
|
|
105
|
+
- `commerce review get` - 查看评价详情
|
|
106
|
+
- `commerce review stats` - 查看评价统计
|
|
107
|
+
|
|
108
|
+
### 评价审核
|
|
109
|
+
- `commerce review approve` - 批准评价
|
|
110
|
+
- `commerce review reject` - 拒绝评价
|
|
111
|
+
- `commerce review batch` - 批量操作
|
|
112
|
+
|
|
113
|
+
### 评价互动
|
|
114
|
+
- `commerce review respond` - 商家回复
|
|
115
|
+
- `commerce review delete-response` - 删除回复
|
|
116
|
+
- `commerce review feature` - 设置精选
|
|
117
|
+
|
|
118
|
+
### 评价管理
|
|
119
|
+
- `commerce review delete` - 删除评价
|
|
120
|
+
- `commerce review reports` - 查看举报
|
|
121
|
+
- `commerce review handle-report` - 处理举报
|
|
122
|
+
|
|
123
|
+
### 评价设置
|
|
124
|
+
- `commerce review get-settings` - 查看评价设置
|
|
125
|
+
- `commerce review update-settings` - 更新评价设置
|
|
126
|
+
|
|
127
|
+
## 详细示例
|
|
128
|
+
|
|
129
|
+
### 查看待审核评价
|
|
130
|
+
```bash
|
|
131
|
+
# 用户说:"查看待审核的评价"
|
|
132
|
+
commerce review list --status pending
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### 批准评价
|
|
136
|
+
```bash
|
|
137
|
+
# 用户说:"批准评价review_123"
|
|
138
|
+
commerce review approve --id review_123
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 拒绝评价
|
|
142
|
+
```bash
|
|
143
|
+
# 用户说:"拒绝评价review_456"
|
|
144
|
+
commerce review reject --id review_456
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 回复评价
|
|
148
|
+
```bash
|
|
149
|
+
# 用户说:"回复评价review_123,内容是感谢您的支持"
|
|
150
|
+
commerce review respond \
|
|
151
|
+
--id review_123 \
|
|
152
|
+
--content "感谢您的支持和认可!我们会继续努力提供优质的产品和服务。"
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### 设为精选
|
|
156
|
+
```bash
|
|
157
|
+
# 用户说:"把评价review_123设为精选"
|
|
158
|
+
commerce review feature --id review_123 --enable
|
|
159
|
+
|
|
160
|
+
# 取消精选
|
|
161
|
+
commerce review feature --id review_123 --disable
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### 批量审核
|
|
165
|
+
```bash
|
|
166
|
+
# 用户说:"批量批准这几条评价"
|
|
167
|
+
commerce review batch --ids review_1,review_2,review_3 --action approve
|
|
168
|
+
|
|
169
|
+
# 批量拒绝
|
|
170
|
+
commerce review batch --ids review_4,review_5 --action reject
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### 查看统计
|
|
174
|
+
```bash
|
|
175
|
+
# 用户说:"查看店铺评价统计"
|
|
176
|
+
commerce review stats
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### 处理举报
|
|
180
|
+
```bash
|
|
181
|
+
# 查看待处理举报
|
|
182
|
+
commerce review reports --status pending
|
|
183
|
+
|
|
184
|
+
# 标记已处理
|
|
185
|
+
commerce review handle-report --id report_123 --action reviewed
|
|
186
|
+
|
|
187
|
+
# 驳回举报
|
|
188
|
+
commerce review handle-report --id report_456 --action dismissed
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### 删除评价
|
|
192
|
+
```bash
|
|
193
|
+
# 用户说:"删除评价review_789"
|
|
194
|
+
commerce review delete --id review_789 --yes
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### 查看评价设置
|
|
198
|
+
```bash
|
|
199
|
+
# 用户说:"查看评价设置"
|
|
200
|
+
commerce review get-settings
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### 更新评价设置
|
|
204
|
+
```bash
|
|
205
|
+
# 用户说:"开启自动审核,4星以上自动通过"
|
|
206
|
+
commerce review update-settings \
|
|
207
|
+
--auto-approve \
|
|
208
|
+
--min-rating 4
|
|
209
|
+
|
|
210
|
+
# 设置评价请求时间(订单送达后7天发送)
|
|
211
|
+
commerce review update-settings --request-days 7
|
|
212
|
+
|
|
213
|
+
# 允许用户上传图片和视频
|
|
214
|
+
commerce review update-settings \
|
|
215
|
+
--allow-media \
|
|
216
|
+
--max-images 5 \
|
|
217
|
+
--max-videos 1
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## 评价设置配置项
|
|
221
|
+
|
|
222
|
+
| 配置 | 说明 | 默认值 |
|
|
223
|
+
|------|------|--------|
|
|
224
|
+
| `auto_approve` | 新评价是否自动通过 | false |
|
|
225
|
+
| `auto_approve_min_rating` | 自动通过的最低评分 | 4 |
|
|
226
|
+
| `request_days` | 订单送达后几天发送评价请求 | 7 |
|
|
227
|
+
| `allow_media` | 是否允许上传图片/视频 | true |
|
|
228
|
+
| `max_images` | 最大图片数 | 5 |
|
|
229
|
+
| `max_videos` | 最大视频数 | 1 |
|
|
230
|
+
|
|
231
|
+
## 重要提示
|
|
232
|
+
|
|
233
|
+
- 评价状态:pending(待审核) → approved(已批准) / rejected(已拒绝)
|
|
234
|
+
- 批准后的评价会在店铺公开显示
|
|
235
|
+
- 删除操作不可撤销,谨慎使用
|
|
236
|
+
- 商家每条评价只能有一条回复
|
|
237
|
+
- 精选评价会在商品页面突出显示
|
|
238
|
+
- 使用 `--help` 查看命令详细参数
|
package/README.md
CHANGED
|
@@ -51,6 +51,7 @@ optima -p "查看商品列表"
|
|
|
51
51
|
- **广告投放** - Google Ads 管理
|
|
52
52
|
- **选品调研** - Amazon 产品分析
|
|
53
53
|
- **数据分析** - 销售数据和趋势
|
|
54
|
+
- **评价管理** - 审核、回复、精选评价
|
|
54
55
|
- **交互式问答** - 执行任务时向用户提问(架构选择、方案确认等)
|
|
55
56
|
|
|
56
57
|
### 执行模式
|
|
@@ -76,6 +77,7 @@ optima -p "查看商品列表"
|
|
|
76
77
|
| ads | Google Ads 广告 |
|
|
77
78
|
| scout | Amazon 选品调研 |
|
|
78
79
|
| bi | 数据分析 |
|
|
80
|
+
| review | 评价管理 |
|
|
79
81
|
|
|
80
82
|
## 交互式问答 (AskUserQuestion)
|
|
81
83
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/system-prompt.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/system-prompt.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,IAAI,MAAM,CAmFxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/system-prompt.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAAE;QAC9C,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,SAAS;QACd,OAAO,EAAE,MAAM;KAChB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAAE;QAC9C,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;IAEH,OAAO;;;;;;;aAOI,OAAO,IAAI,OAAO
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/system-prompt.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAAE;QAC9C,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,SAAS;QACd,OAAO,EAAE,MAAM;KAChB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAAE;QAC9C,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;IAEH,OAAO;;;;;;;aAOI,OAAO,IAAI,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8D9B,CAAC;AACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"permissions": {
|
|
3
|
-
"allow": [
|
|
4
|
-
"Bash(gh api:*)",
|
|
5
|
-
"WebFetch(domain:platform.claude.com)",
|
|
6
|
-
"Bash(git init:*)",
|
|
7
|
-
"Bash(mkdir:*)",
|
|
8
|
-
"Bash(npm run typecheck:*)",
|
|
9
|
-
"Bash(npm view:*)",
|
|
10
|
-
"WebSearch",
|
|
11
|
-
"Bash(commerce --help)",
|
|
12
|
-
"Bash(done)",
|
|
13
|
-
"Bash(commerce product:*)",
|
|
14
|
-
"Bash(commerce order:*)",
|
|
15
|
-
"Bash(commerce i18n:*)",
|
|
16
|
-
"Bash(google-ads:*)",
|
|
17
|
-
"Bash(scout --help:*)",
|
|
18
|
-
"Bash(tree:*)",
|
|
19
|
-
"Bash(cloc:*)",
|
|
20
|
-
"Bash(npm run build:*)",
|
|
21
|
-
"Bash(git restore:*)",
|
|
22
|
-
"Bash(gh repo view:*)",
|
|
23
|
-
"Bash(mv:*)",
|
|
24
|
-
"Bash(rmdir:*)",
|
|
25
|
-
"Bash(git add:*)",
|
|
26
|
-
"Bash(git commit:*)",
|
|
27
|
-
"Bash(git push)",
|
|
28
|
-
"Bash(timeout 5 npm run optima:*)",
|
|
29
|
-
"Bash(npm install:*)",
|
|
30
|
-
"Bash(cat:*)",
|
|
31
|
-
"Bash(gh issue create:*)",
|
|
32
|
-
"Bash(npx tsx:*)",
|
|
33
|
-
"Bash(timeout 30 npx tsx:*)",
|
|
34
|
-
"Bash(git push origin feature/ask-user-question)",
|
|
35
|
-
"Bash(node:*)",
|
|
36
|
-
"Bash(npm version:*)",
|
|
37
|
-
"Bash(git push:*)",
|
|
38
|
-
"Bash(npm publish:*)",
|
|
39
|
-
"Bash(pkill:*)"
|
|
40
|
-
],
|
|
41
|
-
"deny": [],
|
|
42
|
-
"ask": []
|
|
43
|
-
}
|
|
44
|
-
}
|
package/dist/src/ui/App.d.ts
DELETED
package/dist/src/ui/App.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../src/ui/App.tsx"],"names":[],"mappings":"AAcA,UAAU,QAAQ;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,QAAQ,2CAqMpC"}
|
package/dist/src/ui/App.js
DELETED
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState, useCallback, useRef } from "react";
|
|
3
|
-
import { Box, useApp, useInput } from "ink";
|
|
4
|
-
import { Header, Composer, MessageList, StatusBar, Spinner, } from "./components/index.js";
|
|
5
|
-
import { OptimaAgent } from "../agent.js";
|
|
6
|
-
const VERSION = "0.1.25";
|
|
7
|
-
export function App({ cwd }) {
|
|
8
|
-
const { exit } = useApp();
|
|
9
|
-
const [input, setInput] = useState("");
|
|
10
|
-
const [messages, setMessages] = useState([]);
|
|
11
|
-
const [isProcessing, setIsProcessing] = useState(false);
|
|
12
|
-
const [skills, setSkills] = useState([]);
|
|
13
|
-
const [tokens, setTokens] = useState();
|
|
14
|
-
const [agent] = useState(() => new OptimaAgent({ cwd }));
|
|
15
|
-
const abortControllerRef = useRef(null);
|
|
16
|
-
// 处理斜杠命令
|
|
17
|
-
const handleSlashCommand = useCallback((command) => {
|
|
18
|
-
const cmd = command.toLowerCase().trim();
|
|
19
|
-
if (cmd === "/help") {
|
|
20
|
-
setMessages((prev) => [
|
|
21
|
-
...prev,
|
|
22
|
-
{
|
|
23
|
-
role: "assistant",
|
|
24
|
-
content: `可用命令:
|
|
25
|
-
/help - 显示帮助
|
|
26
|
-
/clear - 清空对话
|
|
27
|
-
/skills - 查看已加载技能
|
|
28
|
-
/exit - 退出`,
|
|
29
|
-
},
|
|
30
|
-
]);
|
|
31
|
-
return true;
|
|
32
|
-
}
|
|
33
|
-
if (cmd === "/clear") {
|
|
34
|
-
setMessages([]);
|
|
35
|
-
agent.reset();
|
|
36
|
-
setSkills([]);
|
|
37
|
-
setTokens(undefined);
|
|
38
|
-
return true;
|
|
39
|
-
}
|
|
40
|
-
if (cmd === "/skills") {
|
|
41
|
-
setMessages((prev) => [
|
|
42
|
-
...prev,
|
|
43
|
-
{
|
|
44
|
-
role: "assistant",
|
|
45
|
-
content: skills.length > 0
|
|
46
|
-
? `已加载技能: ${skills.join(", ")}`
|
|
47
|
-
: "暂无已加载技能",
|
|
48
|
-
},
|
|
49
|
-
]);
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
52
|
-
if (cmd === "/exit") {
|
|
53
|
-
exit();
|
|
54
|
-
return true;
|
|
55
|
-
}
|
|
56
|
-
return false;
|
|
57
|
-
}, [agent, exit, skills]);
|
|
58
|
-
// 取消当前请求
|
|
59
|
-
const handleCancel = useCallback(() => {
|
|
60
|
-
if (abortControllerRef.current) {
|
|
61
|
-
abortControllerRef.current.abort();
|
|
62
|
-
abortControllerRef.current = null;
|
|
63
|
-
setIsProcessing(false);
|
|
64
|
-
setMessages((prev) => [
|
|
65
|
-
...prev,
|
|
66
|
-
{ role: "system", content: "已取消" },
|
|
67
|
-
]);
|
|
68
|
-
}
|
|
69
|
-
}, []);
|
|
70
|
-
// 处理消息提交
|
|
71
|
-
const handleSubmit = useCallback(async (text) => {
|
|
72
|
-
// 检查斜杠命令
|
|
73
|
-
if (text.startsWith("/")) {
|
|
74
|
-
if (handleSlashCommand(text)) {
|
|
75
|
-
setInput("");
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
// 添加用户消息
|
|
80
|
-
setMessages((prev) => [...prev, { role: "user", content: text }]);
|
|
81
|
-
setInput("");
|
|
82
|
-
setIsProcessing(true);
|
|
83
|
-
// 创建 AbortController
|
|
84
|
-
const abortController = new AbortController();
|
|
85
|
-
abortControllerRef.current = abortController;
|
|
86
|
-
let assistantContent = "";
|
|
87
|
-
try {
|
|
88
|
-
for await (const msg of agent.chat(text, { signal: abortController.signal })) {
|
|
89
|
-
// 处理系统消息(获取 skills)
|
|
90
|
-
if (msg.type === "system" && "skills" in msg && msg.skills) {
|
|
91
|
-
const skillsData = msg.skills;
|
|
92
|
-
setSkills(skillsData.filter(Boolean));
|
|
93
|
-
}
|
|
94
|
-
// 处理助手消息
|
|
95
|
-
if (msg.type === "assistant" && msg.message?.content) {
|
|
96
|
-
for (const block of msg.message.content) {
|
|
97
|
-
if (block.type === "text") {
|
|
98
|
-
assistantContent += block.text;
|
|
99
|
-
}
|
|
100
|
-
else if (block.type === "tool_use") {
|
|
101
|
-
// 显示工具调用
|
|
102
|
-
setMessages((prev) => [
|
|
103
|
-
...prev,
|
|
104
|
-
{
|
|
105
|
-
role: "tool",
|
|
106
|
-
toolName: block.name,
|
|
107
|
-
content: typeof block.input === "string"
|
|
108
|
-
? block.input
|
|
109
|
-
: JSON.stringify(block.input, null, 2),
|
|
110
|
-
},
|
|
111
|
-
]);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
// 处理结果(累计 tokens)
|
|
116
|
-
if (msg.type === "result") {
|
|
117
|
-
const usage = msg.usage;
|
|
118
|
-
setTokens((prev) => ({
|
|
119
|
-
input: (prev?.input ?? 0) + (usage?.input_tokens ?? 0),
|
|
120
|
-
output: (prev?.output ?? 0) + (usage?.output_tokens ?? 0),
|
|
121
|
-
}));
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
// 添加助手回复
|
|
125
|
-
if (assistantContent) {
|
|
126
|
-
setMessages((prev) => [
|
|
127
|
-
...prev,
|
|
128
|
-
{ role: "assistant", content: assistantContent },
|
|
129
|
-
]);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
catch (error) {
|
|
133
|
-
// 用户取消不显示错误
|
|
134
|
-
const errorMsg = error instanceof Error ? error.message : "未知错误";
|
|
135
|
-
if (!errorMsg.includes("aborted")) {
|
|
136
|
-
setMessages((prev) => [
|
|
137
|
-
...prev,
|
|
138
|
-
{
|
|
139
|
-
role: "error",
|
|
140
|
-
content: errorMsg,
|
|
141
|
-
},
|
|
142
|
-
]);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
finally {
|
|
146
|
-
setIsProcessing(false);
|
|
147
|
-
abortControllerRef.current = null;
|
|
148
|
-
}
|
|
149
|
-
}, [agent, handleSlashCommand]);
|
|
150
|
-
// 快捷键
|
|
151
|
-
useInput((input, key) => {
|
|
152
|
-
if (key.ctrl && input === "c") {
|
|
153
|
-
exit();
|
|
154
|
-
}
|
|
155
|
-
if (key.ctrl && input === "l") {
|
|
156
|
-
setMessages([]);
|
|
157
|
-
}
|
|
158
|
-
if (key.escape && isProcessing) {
|
|
159
|
-
handleCancel();
|
|
160
|
-
}
|
|
161
|
-
});
|
|
162
|
-
return (_jsxs(Box, { flexDirection: "column", height: "100%", children: [_jsx(Header, { version: VERSION }), _jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, children: [_jsx(MessageList, { messages: messages }), isProcessing && _jsx(Spinner, {})] }), _jsx(StatusBar, { skills: skills, tokens: tokens }), _jsx(Composer, { value: input, onChange: setInput, onSubmit: handleSubmit, disabled: isProcessing })] }));
|
|
163
|
-
}
|
|
164
|
-
//# sourceMappingURL=App.js.map
|
package/dist/src/ui/App.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../../src/ui/App.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
interface ComposerProps {
|
|
3
|
-
value: string;
|
|
4
|
-
onChange: (value: string) => void;
|
|
5
|
-
onSubmit: (value: string) => void;
|
|
6
|
-
disabled?: boolean;
|
|
7
|
-
}
|
|
8
|
-
export declare const Composer: React.NamedExoticComponent<ComposerProps>;
|
|
9
|
-
export {};
|
|
10
|
-
//# sourceMappingURL=Composer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/Composer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAIjD,UAAU,aAAa;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,QAAQ,2CA6BnB,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { memo, useCallback } from "react";
|
|
3
|
-
import { Box, Text } from "ink";
|
|
4
|
-
import TextInput from "ink-text-input";
|
|
5
|
-
export const Composer = memo(function Composer({ value, onChange, onSubmit, disabled = false, }) {
|
|
6
|
-
const handleSubmit = useCallback((text) => {
|
|
7
|
-
if (text.trim()) {
|
|
8
|
-
onSubmit(text.trim());
|
|
9
|
-
}
|
|
10
|
-
}, [onSubmit]);
|
|
11
|
-
return (_jsxs(Box, { borderStyle: "single", borderColor: disabled ? "gray" : "green", paddingX: 1, children: [_jsxs(Text, { color: disabled ? "gray" : "green", bold: true, children: [">", " "] }), disabled ? (_jsx(Text, { color: "gray", children: "\u8BF7\u7B49\u5F85\u54CD\u5E94..." })) : (_jsx(TextInput, { value: value, onChange: onChange, onSubmit: handleSubmit, placeholder: "\u8F93\u5165\u6D88\u606F\u6216 /help \u83B7\u53D6\u5E2E\u52A9" }))] }));
|
|
12
|
-
});
|
|
13
|
-
//# sourceMappingURL=Composer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Composer.js","sourceRoot":"","sources":["../../../../src/ui/components/Composer.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AASvC,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,QAAQ,CAAC,EAC7C,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,GAAG,KAAK,GACF;IACd,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,IAAY,EAAE,EAAE;QAChD,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,CACL,MAAC,GAAG,IAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,aAC7E,MAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,mBAC3C,GAAG,EAAE,GAAG,IACJ,EACN,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kDAAgB,CACnC,CAAC,CAAC,CAAC,CACF,KAAC,SAAS,IACR,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAC,+DAAkB,GAC9B,CACH,IACG,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/Header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;AAGpC,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,MAAM,yCAWjB,CAAC"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { memo } from "react";
|
|
3
|
-
import { Box, Text } from "ink";
|
|
4
|
-
export const Header = memo(function Header({ version }) {
|
|
5
|
-
return (_jsxs(Box, { borderStyle: "single", paddingX: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Optima Agent" }), _jsxs(Text, { color: "gray", children: [" v", version] }), _jsx(Box, { flexGrow: 1 }), _jsx(Text, { color: "gray", children: "[Ctrl+C \u9000\u51FA]" })] }));
|
|
6
|
-
});
|
|
7
|
-
//# sourceMappingURL=Header.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../../src/ui/components/Header.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAMhC,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,MAAM,CAAC,EAAE,OAAO,EAAe;IACjE,OAAO,CACL,MAAC,GAAG,IAAC,WAAW,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,aACnC,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,6BAEhB,EACP,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,mBAAI,OAAO,IAAQ,EACrC,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,GAAI,EACpB,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,sCAAmB,IACjC,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
export interface MessageItem {
|
|
3
|
-
role: "user" | "assistant" | "tool" | "error" | "system";
|
|
4
|
-
content: string;
|
|
5
|
-
toolName?: string;
|
|
6
|
-
}
|
|
7
|
-
interface MessageProps {
|
|
8
|
-
message: MessageItem;
|
|
9
|
-
}
|
|
10
|
-
export declare const Message: React.NamedExoticComponent<MessageProps>;
|
|
11
|
-
export {};
|
|
12
|
-
//# sourceMappingURL=Message.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Message.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/Message.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;AAGpC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,eAAO,MAAM,OAAO,0CAmDlB,CAAC"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { memo } from "react";
|
|
3
|
-
import { Box, Text } from "ink";
|
|
4
|
-
export const Message = memo(function Message({ message }) {
|
|
5
|
-
const { role, content, toolName } = message;
|
|
6
|
-
if (role === "user") {
|
|
7
|
-
return (_jsxs(Box, { marginY: 1, children: [_jsxs(Text, { color: "green", bold: true, children: [">", " "] }), _jsx(Text, { children: content })] }));
|
|
8
|
-
}
|
|
9
|
-
if (role === "tool") {
|
|
10
|
-
return (_jsxs(Box, { marginY: 1, borderStyle: "round", borderColor: "gray", paddingX: 1, flexDirection: "column", children: [_jsx(Text, { color: "yellow", children: toolName || "Tool" }), _jsx(Text, { color: "gray", children: content })] }));
|
|
11
|
-
}
|
|
12
|
-
if (role === "error") {
|
|
13
|
-
return (_jsx(Box, { marginY: 1, children: _jsxs(Text, { color: "red", children: ["\u9519\u8BEF: ", content] }) }));
|
|
14
|
-
}
|
|
15
|
-
if (role === "system") {
|
|
16
|
-
return (_jsx(Box, { marginY: 1, children: _jsx(Text, { color: "gray", italic: true, children: content }) }));
|
|
17
|
-
}
|
|
18
|
-
// assistant
|
|
19
|
-
return (_jsx(Box, { marginY: 1, children: _jsx(Text, { children: content }) }));
|
|
20
|
-
});
|
|
21
|
-
//# sourceMappingURL=Message.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Message.js","sourceRoot":"","sources":["../../../../src/ui/components/Message.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAYhC,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,OAAO,CAAC,EAAE,OAAO,EAAgB;IACpE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE5C,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,CACL,MAAC,GAAG,IAAC,OAAO,EAAE,CAAC,aACb,MAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,mBACrB,GAAG,EAAE,GAAG,IACJ,EACP,KAAC,IAAI,cAAE,OAAO,GAAQ,IAClB,CACP,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,CACL,MAAC,GAAG,IACF,OAAO,EAAE,CAAC,EACV,WAAW,EAAC,OAAO,EACnB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,aAAa,EAAC,QAAQ,aAEtB,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,YAAE,QAAQ,IAAI,MAAM,GAAQ,EAChD,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,OAAO,GAAQ,IAC/B,CACP,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,CACL,KAAC,GAAG,IAAC,OAAO,EAAE,CAAC,YACb,MAAC,IAAI,IAAC,KAAK,EAAC,KAAK,+BAAM,OAAO,IAAQ,GAClC,CACP,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,CACL,KAAC,GAAG,IAAC,OAAO,EAAE,CAAC,YACb,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,MAAM,kBAAE,OAAO,GAAQ,GACtC,CACP,CAAC;IACJ,CAAC;IAED,YAAY;IACZ,OAAO,CACL,KAAC,GAAG,IAAC,OAAO,EAAE,CAAC,YACb,KAAC,IAAI,cAAE,OAAO,GAAQ,GAClB,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { MessageItem } from "./Message.js";
|
|
3
|
-
interface MessageListProps {
|
|
4
|
-
messages: MessageItem[];
|
|
5
|
-
maxVisible?: number;
|
|
6
|
-
}
|
|
7
|
-
export declare const MessageList: React.NamedExoticComponent<MessageListProps>;
|
|
8
|
-
export {};
|
|
9
|
-
//# sourceMappingURL=MessageList.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/MessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAW,WAAW,EAAE,MAAM,cAAc,CAAC;AAEpD,UAAU,gBAAgB;IACxB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,WAAW,8CA6BtB,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { memo, useMemo } from "react";
|
|
3
|
-
import { Box, Text } from "ink";
|
|
4
|
-
import { Message } from "./Message.js";
|
|
5
|
-
export const MessageList = memo(function MessageList({ messages, maxVisible = 10 }) {
|
|
6
|
-
// 只显示最近的消息,避免内容超出屏幕导致闪烁
|
|
7
|
-
const { visibleMessages, hiddenCount } = useMemo(() => {
|
|
8
|
-
if (messages.length <= maxVisible) {
|
|
9
|
-
return { visibleMessages: messages, hiddenCount: 0 };
|
|
10
|
-
}
|
|
11
|
-
return {
|
|
12
|
-
visibleMessages: messages.slice(-maxVisible),
|
|
13
|
-
hiddenCount: messages.length - maxVisible,
|
|
14
|
-
};
|
|
15
|
-
}, [messages, maxVisible]);
|
|
16
|
-
return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [hiddenCount > 0 && (_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { color: "gray", italic: true, children: ["... ", hiddenCount, " \u6761\u5386\u53F2\u6D88\u606F\u5DF2\u9690\u85CF (\u4F7F\u7528 /clear \u6E05\u7A7A)"] }) })), visibleMessages.map((msg, index) => (_jsx(Message, { message: msg }, messages.length - maxVisible + index)))] }));
|
|
17
|
-
});
|
|
18
|
-
//# sourceMappingURL=MessageList.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MessageList.js","sourceRoot":"","sources":["../../../../src/ui/components/MessageList.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,OAAO,EAAe,MAAM,cAAc,CAAC;AAOpD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,WAAW,CAAC,EACnD,QAAQ,EACR,UAAU,GAAG,EAAE,EACE;IACjB,wBAAwB;IACxB,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;QACpD,IAAI,QAAQ,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;YAClC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QACvD,CAAC;QACD,OAAO;YACL,eAAe,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;YAC5C,WAAW,EAAE,QAAQ,CAAC,MAAM,GAAG,UAAU;SAC1C,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IAE3B,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,aACpC,WAAW,GAAG,CAAC,IAAI,CAClB,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,MAAM,2BAClB,WAAW,4FACX,GACH,CACP,EACA,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CACnC,KAAC,OAAO,IAA4C,OAAO,EAAE,GAAG,IAAlD,QAAQ,CAAC,MAAM,GAAG,UAAU,GAAG,KAAK,CAAkB,CACrE,CAAC,IACE,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Spinner.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/Spinner.tsx"],"names":[],"mappings":"AAIA,UAAU,YAAY;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,OAAO,CAAC,EAAE,OAAkB,EAAE,EAAE,YAAY,2CAS3D"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Text } from "ink";
|
|
3
|
-
import InkSpinner from "ink-spinner";
|
|
4
|
-
export function Spinner({ message = "思考中..." }) {
|
|
5
|
-
return (_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: _jsx(InkSpinner, { type: "dots" }) }), _jsxs(Text, { color: "gray", children: [" ", message] })] }));
|
|
6
|
-
}
|
|
7
|
-
//# sourceMappingURL=Spinner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Spinner.js","sourceRoot":"","sources":["../../../../src/ui/components/Spinner.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,UAAU,MAAM,aAAa,CAAC;AAMrC,MAAM,UAAU,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAgB;IAC1D,OAAO,CACL,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAChB,KAAC,UAAU,IAAC,IAAI,EAAC,MAAM,GAAG,GACrB,EACP,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kBAAG,OAAO,IAAQ,IAChC,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
interface StatusBarProps {
|
|
3
|
-
skills: string[];
|
|
4
|
-
tokens?: {
|
|
5
|
-
input: number;
|
|
6
|
-
output: number;
|
|
7
|
-
};
|
|
8
|
-
}
|
|
9
|
-
export declare const StatusBar: React.NamedExoticComponent<StatusBarProps>;
|
|
10
|
-
export {};
|
|
11
|
-
//# sourceMappingURL=StatusBar.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/StatusBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;AAGpC,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,eAAO,MAAM,SAAS,4CAoBpB,CAAC"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { memo } from "react";
|
|
3
|
-
import { Box, Text } from "ink";
|
|
4
|
-
export const StatusBar = memo(function StatusBar({ skills, tokens }) {
|
|
5
|
-
return (_jsxs(Box, { paddingX: 1, justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsx(Text, { color: "gray", children: "Skills: " }), skills.length > 0 ? (_jsx(Text, { color: "cyan", children: skills.join(", ") })) : (_jsx(Text, { color: "gray", children: "\u65E0" }))] }), tokens && (_jsx(Box, { children: _jsxs(Text, { color: "gray", children: ["Tokens: ", tokens.input.toLocaleString(), " in / ", tokens.output.toLocaleString(), " out"] }) }))] }));
|
|
6
|
-
});
|
|
7
|
-
//# sourceMappingURL=StatusBar.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../../../src/ui/components/StatusBar.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAOhC,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAkB;IACjF,OAAO,CACL,MAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAC,eAAe,aAC9C,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,yBAAgB,EACjC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACnB,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAQ,CAC9C,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,uBAAS,CAC5B,IACG,EACL,MAAM,IAAI,CACT,KAAC,GAAG,cACF,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,yBACP,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,YAAQ,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,YACvE,GACH,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export { Header } from "./Header.js";
|
|
2
|
-
export { Spinner } from "./Spinner.js";
|
|
3
|
-
export { Message, type MessageItem } from "./Message.js";
|
|
4
|
-
export { MessageList } from "./MessageList.js";
|
|
5
|
-
export { Composer } from "./Composer.js";
|
|
6
|
-
export { StatusBar } from "./StatusBar.js";
|
|
7
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ui/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export { Header } from "./Header.js";
|
|
2
|
-
export { Spinner } from "./Spinner.js";
|
|
3
|
-
export { Message } from "./Message.js";
|
|
4
|
-
export { MessageList } from "./MessageList.js";
|
|
5
|
-
export { Composer } from "./Composer.js";
|
|
6
|
-
export { StatusBar } from "./StatusBar.js";
|
|
7
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAoB,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
|