@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.
Files changed (40) hide show
  1. package/.claude/skills/comfy/SKILL.md +102 -122
  2. package/.claude/skills/review/SKILL.md +238 -0
  3. package/README.md +2 -0
  4. package/dist/src/system-prompt.d.ts.map +1 -1
  5. package/dist/src/system-prompt.js +1 -0
  6. package/dist/src/system-prompt.js.map +1 -1
  7. package/package.json +1 -1
  8. package/.claude/settings.local.json +0 -44
  9. package/dist/src/ui/App.d.ts +0 -6
  10. package/dist/src/ui/App.d.ts.map +0 -1
  11. package/dist/src/ui/App.js +0 -164
  12. package/dist/src/ui/App.js.map +0 -1
  13. package/dist/src/ui/components/Composer.d.ts +0 -10
  14. package/dist/src/ui/components/Composer.d.ts.map +0 -1
  15. package/dist/src/ui/components/Composer.js +0 -13
  16. package/dist/src/ui/components/Composer.js.map +0 -1
  17. package/dist/src/ui/components/Header.d.ts +0 -7
  18. package/dist/src/ui/components/Header.d.ts.map +0 -1
  19. package/dist/src/ui/components/Header.js +0 -7
  20. package/dist/src/ui/components/Header.js.map +0 -1
  21. package/dist/src/ui/components/Message.d.ts +0 -12
  22. package/dist/src/ui/components/Message.d.ts.map +0 -1
  23. package/dist/src/ui/components/Message.js +0 -21
  24. package/dist/src/ui/components/Message.js.map +0 -1
  25. package/dist/src/ui/components/MessageList.d.ts +0 -9
  26. package/dist/src/ui/components/MessageList.d.ts.map +0 -1
  27. package/dist/src/ui/components/MessageList.js +0 -18
  28. package/dist/src/ui/components/MessageList.js.map +0 -1
  29. package/dist/src/ui/components/Spinner.d.ts +0 -6
  30. package/dist/src/ui/components/Spinner.d.ts.map +0 -1
  31. package/dist/src/ui/components/Spinner.js +0 -7
  32. package/dist/src/ui/components/Spinner.js.map +0 -1
  33. package/dist/src/ui/components/StatusBar.d.ts +0 -11
  34. package/dist/src/ui/components/StatusBar.d.ts.map +0 -1
  35. package/dist/src/ui/components/StatusBar.js +0 -7
  36. package/dist/src/ui/components/StatusBar.js.map +0 -1
  37. package/dist/src/ui/components/index.d.ts +0 -7
  38. package/dist/src/ui/components/index.d.ts.map +0 -1
  39. package/dist/src/ui/components/index.js +0 -7
  40. package/dist/src/ui/components/index.js.map +0 -1
@@ -1,189 +1,169 @@
1
1
  ---
2
2
  name: comfy
3
- description: "使用 ComfyUI 生成和编辑图片/视频。使用场景:生成图片(generate images/生成图片/画图)、编辑图片(edit images/编辑图片/图生图)、生成视频(create videos/图生视频)。命令自动等待完成。下载时必须指定完整文件路径(包含文件名)。"
3
+ description: "生成和编辑图片/视频。使用场景:生成图片(generate images/生成图片/画图)、编辑图片(edit images/编辑图片/图生图/风格转换)、生成视频(create videos/图生视频)"
4
4
  ---
5
5
 
6
- # ComfyUI 图像视频生成工具
6
+ # 图像视频生成工具
7
7
 
8
8
  ## 标准工作流程
9
9
 
10
10
  ```bash
11
- # 步骤 1:生成图片(自动等待完成)
12
- comfy generate "提示词" --width 1024 --height 1024
11
+ # 文生图
12
+ comfy image "提示词" -o /工作目录/result.png
13
13
 
14
- # 步骤 2:下载(必须指定完整文件路径,包含文件名)
15
- comfy download <prompt_id> -o /用户/工作目录/文件名.png
14
+ # 图片编辑/风格转换
15
+ comfy image "转成水彩风格" -i photo.png -o /工作目录/result.png
16
16
 
17
- # 步骤 3:读取图片并向用户描述生成结果
18
- Read /用户/工作目录/文件名.png
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 video <图片路径> --prompt "运动描述" --width 512 --height 512
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 download <prompt_id> -o <完整文件路径>
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
- ### 示例 1:生成猫的图片
88
- 用户:"生成一张猫的图片"
58
+ 将第一张图的风格应用到第二张图的内容上:
89
59
 
90
60
  ```bash
91
- comfy generate "a cute fluffy cat sitting on a windowsill, natural lighting, high quality photograph"
92
- comfy download abc123 -o /Users/john/project/cat.png
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
- ### 示例 2:迪士尼风格海报
98
- 用户:"给产品生成一张迪士尼风格的海报"
65
+ ### 多图元素组合
66
+
67
+ 从多张图中提取元素组合成新图:
99
68
 
100
69
  ```bash
101
- comfy generate "Disney Pixar style movie poster, [产品描述], cute 3D character, vibrant gradient background, magical sparkles, professional studio quality, warm lighting" --width 1024 --height 1024
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
- ### 示例 3:转换为动漫风格
108
- 用户:"把这张照片转成动漫风格"
73
+ ### 精确颜色控制
74
+
75
+ 使用 hex code 指定精确颜色:
109
76
 
110
77
  ```bash
111
- comfy edit /Users/john/photos/portrait.jpg "anime style, vibrant colors, detailed, high quality"
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
- ### 示例 4:图片生成视频
118
- 用户:"把这张人像做成视频"
81
+ ### 产品海报
119
82
 
120
83
  ```bash
121
- comfy video /Users/john/photos/portrait.png --prompt "natural facial expression, subtle head movement, smooth motion" --width 512 --height 512
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 generate "a robot"
116
+ # 简单
117
+ comfy image "a robot"
138
118
 
139
- # 添加风格和细节
140
- comfy generate "a friendly AI robot assistant, cute cartoon style, bright colors, 3D render, Pixar quality"
119
+ # 添加风格
120
+ comfy image "a friendly AI robot, cute cartoon style, bright colors, 3D render"
141
121
 
142
- # 完整详细描述
143
- comfy generate "Disney Pixar style 3D animated robot character, friendly cheerful expression, wearing headset, surrounded by floating icons, gradient purple-blue background, professional studio lighting, high quality render, vibrant colors"
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
- | 社交媒体图片 | 1024x1024 |
151
- | 宽屏壁纸 | 1920x1080 |
132
+ | 社交媒体 | 1024x1024 |
133
+ | 宽屏壁纸 | 1920x1088 |
152
134
  | 竖屏海报 | 768x1280 |
153
- | 视频生成 | 512x512 |
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 queue status # 查看队列状态
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 system stats # GPU/CPU/内存状态
182
- comfy config list # 查看配置
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
- - 服务器:http://dev.optima.chat:8188
188
- - 修改服务器:`comfy config set server http://localhost:8188`
189
- - 输出格式:JSON(优化用于 AI 解析)
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,CAkFxC"}
1
+ {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/system-prompt.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,IAAI,MAAM,CAmFxC"}
@@ -35,6 +35,7 @@ export function getSystemPrompt() {
35
35
  - **ads** - Google Ads 广告投放
36
36
  - **scout** - Amazon 选品调研
37
37
  - **bi** - 数据分析和报表
38
+ - **review** - 评价管理(审核、回复、精选)
38
39
 
39
40
  **使用方式**:当用户提出具体需求时,使用 Skill 工具加载对应模块获取详细用法。
40
41
 
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6D9B,CAAC;AACF,CAAC"}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@optima-chat/optima-agent",
3
- "version": "0.4.1",
3
+ "version": "0.4.3",
4
4
  "description": "基于 Claude Agent SDK 的电商运营 AI 助手",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -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
- }
@@ -1,6 +0,0 @@
1
- interface AppProps {
2
- cwd?: string;
3
- }
4
- export declare function App({ cwd }: AppProps): import("react/jsx-runtime").JSX.Element;
5
- export {};
6
- //# sourceMappingURL=App.d.ts.map
@@ -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"}
@@ -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
@@ -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,7 +0,0 @@
1
- import React from "react";
2
- interface HeaderProps {
3
- version: string;
4
- }
5
- export declare const Header: React.NamedExoticComponent<HeaderProps>;
6
- export {};
7
- //# sourceMappingURL=Header.d.ts.map
@@ -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,6 +0,0 @@
1
- interface SpinnerProps {
2
- message?: string;
3
- }
4
- export declare function Spinner({ message }: SpinnerProps): import("react/jsx-runtime").JSX.Element;
5
- export {};
6
- //# sourceMappingURL=Spinner.d.ts.map
@@ -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"}