@optima-chat/optima-agent 0.9.11 → 0.9.12

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 (94) hide show
  1. package/.claude/skills/.kb-skills-managed.json +9 -9
  2. package/.claude/skills/ads/SKILL.md +244 -244
  3. package/.claude/skills/ads/template/campaign/CREATIVES.md +18 -18
  4. package/.claude/skills/ads/template/campaign/NOTES.md +10 -10
  5. package/.claude/skills/ads/template/campaign/STRATEGY.md +29 -29
  6. package/.claude/skills/ads/template/user/ADS.md +29 -29
  7. package/.claude/skills/ads/template/user/LEARNINGS.md +15 -15
  8. package/.claude/skills/ads/template/user/PROGRESS.md +20 -20
  9. package/.claude/skills/ads/template/user/README.md +25 -25
  10. package/.claude/skills/ads/template/user/assets/.gitignore +2 -2
  11. package/.claude/skills/bi/SKILL.md +131 -131
  12. package/.claude/skills/browser/SKILL.md +201 -201
  13. package/.claude/skills/channels/SKILL.md +188 -188
  14. package/.claude/skills/collection/SKILL.md +88 -88
  15. package/.claude/skills/douyin/SKILL.md +408 -408
  16. package/.claude/skills/ffmpeg/SKILL.md +164 -164
  17. package/.claude/skills/gen/SKILL.md +279 -279
  18. package/.claude/skills/growth/SKILL.md +90 -90
  19. package/.claude/skills/growth/template/ACCOUNTS.md +14 -14
  20. package/.claude/skills/growth/template/CALENDAR.md +7 -7
  21. package/.claude/skills/growth/template/COMMENTS.md +7 -7
  22. package/.claude/skills/growth/template/GROWTH.md +37 -37
  23. package/.claude/skills/growth/template/PROGRESS.md +4 -4
  24. package/.claude/skills/growth/template/README.md +20 -20
  25. package/.claude/skills/growth/template/TOPICS.md +7 -7
  26. package/.claude/skills/homepage/SKILL.md +177 -177
  27. package/.claude/skills/i18n/SKILL.md +517 -517
  28. package/.claude/skills/ingesting-sources/SKILL.md +94 -94
  29. package/.claude/skills/initializing-kb/SKILL.md +117 -117
  30. package/.claude/skills/instagram/SKILL.md +321 -321
  31. package/.claude/skills/inventory/SKILL.md +328 -328
  32. package/.claude/skills/kol-outreach/SKILL.md +232 -232
  33. package/.claude/skills/kol-outreach/template/campaign/CONFIG.md +60 -60
  34. package/.claude/skills/kol-outreach/template/campaign/KOLS.md +6 -6
  35. package/.claude/skills/kol-outreach/template/campaign/PROGRESS.md +3 -3
  36. package/.claude/skills/kol-outreach/template/campaign/TEMPLATES.md +88 -88
  37. package/.claude/skills/kol-outreach/template/merchant/BRAND.md +36 -36
  38. package/.claude/skills/kol-outreach/template/merchant/CAMPAIGNS.md +6 -6
  39. package/.claude/skills/kol-outreach/template/merchant/MERCHANT_LIMITS.md +16 -16
  40. package/.claude/skills/kol-outreach/template/merchant/PROGRESS.md +4 -4
  41. package/.claude/skills/kol-outreach/template/merchant/README.md +20 -20
  42. package/.claude/skills/linting-the-wiki/SKILL.md +68 -68
  43. package/.claude/skills/logistics/SKILL.md +180 -180
  44. package/.claude/skills/markdown-pdf/SKILL.md +72 -72
  45. package/.claude/skills/merchant/SKILL.md +110 -110
  46. package/.claude/skills/multigrid-poster/SKILL.md +192 -192
  47. package/.claude/skills/multigrid-poster/layouts/2x2.json +34 -34
  48. package/.claude/skills/multigrid-poster/layouts/3x3.json +43 -43
  49. package/.claude/skills/multigrid-poster/scripts/compose.py +116 -116
  50. package/.claude/skills/order/SKILL.md +452 -452
  51. package/.claude/skills/product/SKILL.md +379 -379
  52. package/.claude/skills/product-page/SKILL.md +106 -106
  53. package/.claude/skills/querying-the-wiki/SKILL.md +59 -59
  54. package/.claude/skills/reddit/SKILL.md +277 -277
  55. package/.claude/skills/review/SKILL.md +321 -321
  56. package/.claude/skills/scout/SKILL.md +575 -575
  57. package/.claude/skills/sentinel/SKILL.md +281 -281
  58. package/.claude/skills/shein/SKILL.md +246 -246
  59. package/.claude/skills/shipping/SKILL.md +200 -200
  60. package/.claude/skills/shop-content/SKILL.md +101 -101
  61. package/.claude/skills/shopify/SKILL.md +282 -282
  62. package/.claude/skills/skillify/SKILL.md +114 -114
  63. package/.claude/skills/taobao/SKILL.md +238 -238
  64. package/.claude/skills/tiktok/SKILL.md +381 -381
  65. package/.claude/skills/twitter/SKILL.md +302 -302
  66. package/.claude/skills/updating-related-pages/SKILL.md +65 -65
  67. package/.claude/skills/video-edit/SKILL.md +138 -138
  68. package/.claude/skills/video-gen/SKILL.md +630 -630
  69. package/.claude/skills/video-gen/templates/INDEX.md +78 -78
  70. package/.claude/skills/video-gen/templates/before-after-beauty.md +183 -183
  71. package/.claude/skills/video-gen/templates/drama-fmcg.md +183 -183
  72. package/.claude/skills/video-gen/templates/kol-reaction-food.md +193 -193
  73. package/.claude/skills/video-gen/templates/multi-point-apparel.md +185 -185
  74. package/.claude/skills/video-gen/templates/pain-solution-home.md +184 -184
  75. package/.claude/skills/video-gen/templates/pdp-360-showcase.md +189 -189
  76. package/.claude/skills/video-gen/templates/pdp-feature-highlight.md +182 -182
  77. package/.claude/skills/video-gen/templates/scene-digital.md +183 -183
  78. package/.claude/skills/wechat/SKILL.md +174 -174
  79. package/.claude/skills/xhs/SKILL.md +170 -170
  80. package/README.md +276 -276
  81. package/dist/bin/optima.js +26 -26
  82. package/dist/bin/serve.js +23 -23
  83. package/dist/bin/video-edit.d.ts +3 -0
  84. package/dist/bin/video-edit.d.ts.map +1 -0
  85. package/dist/bin/video-edit.js +153 -0
  86. package/dist/bin/video-edit.js.map +1 -0
  87. package/dist/src/agent.d.ts +1 -1
  88. package/dist/src/agent.js +4 -4
  89. package/dist/src/system-prompt.d.ts.map +1 -1
  90. package/dist/src/system-prompt.js +175 -173
  91. package/dist/src/system-prompt.js.map +1 -1
  92. package/dist/src/tools/memory.js +10 -10
  93. package/dist/src/ui/headless.js +7 -7
  94. package/package.json +79 -79
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-edit.d.ts","sourceRoot":"","sources":["../../bin/video-edit.ts"],"names":[],"mappings":""}
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * video-edit CLI — TS 薄壳,透传到 Python 实现(tools/video-edit/video_edit.py)。
4
+ *
5
+ * 调用:pnpm video-edit <subcommand> <video-path>
6
+ * 子命令:analyze / cut / review / subtitle / both / doctor
7
+ */
8
+ import { spawnSync } from "node:child_process";
9
+ import { existsSync } from "node:fs";
10
+ import { resolve, dirname, join, sep } from "node:path";
11
+ import { fileURLToPath } from "node:url";
12
+ import { parseArgs } from "node:util";
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = dirname(__filename);
15
+ /**
16
+ * 两种布局:
17
+ * 开发: <repo>/bin/video-edit.ts → PACKAGE_ROOT = <repo>
18
+ * 已安装:<pkg>/dist/bin/video-edit.js → PACKAGE_ROOT = <pkg>
19
+ * tools/ 在 PACKAGE_ROOT 下(npm 发布时通过 files: ["tools"] 带出来)。
20
+ */
21
+ const PACKAGE_ROOT = __dirname.includes(`${sep}dist${sep}bin`)
22
+ ? resolve(__dirname, "..", "..")
23
+ : resolve(__dirname, "..");
24
+ const PY_SCRIPT = join(PACKAGE_ROOT, "tools", "video-edit", "video_edit.py");
25
+ const REQUIREMENTS = join(PACKAGE_ROOT, "tools", "video-edit", "requirements.txt");
26
+ const SUBCOMMANDS = ["analyze", "cut", "review", "subtitle", "both", "doctor"];
27
+ function printHelp() {
28
+ console.log(`
29
+ video-edit - 口播/vlog 视频智能剪辑 CLI
30
+
31
+ 用法:
32
+ pnpm video-edit <subcommand> <video-path>
33
+
34
+ 子命令:
35
+ analyze <video> 转写 + 静音检测 → cut_proposal.md
36
+ cut <video> 读 proposal 出成片 → <stem>_edited.mp4
37
+ review <video> 声学质检 → review_report.md
38
+ subtitle <video> 自动字幕 → <stem>_subbed.mp4
39
+ both <video> analyze + cut(跳过人工编辑 proposal)
40
+ doctor 检查依赖(python / ffmpeg / faster-whisper)
41
+
42
+ 示例:
43
+ pnpm video-edit analyze ~/vids/demo.mp4
44
+ pnpm video-edit doctor
45
+
46
+ 详细 SOP 见 .claude/skills/editing-vlog-videos/SKILL.md
47
+ `);
48
+ }
49
+ function whichPython() {
50
+ for (const cmd of ["python", "python3"]) {
51
+ const r = spawnSync(cmd, ["--version"], { encoding: "utf-8" });
52
+ if (r.status === 0)
53
+ return cmd;
54
+ }
55
+ return null;
56
+ }
57
+ function doctor() {
58
+ console.log("=== video-edit doctor ===");
59
+ let ok = true;
60
+ // Python
61
+ const py = whichPython();
62
+ if (py) {
63
+ const ver = spawnSync(py, ["--version"], { encoding: "utf-8" });
64
+ console.log(`[OK] python: ${ver.stdout.trim() || ver.stderr.trim()}`);
65
+ }
66
+ else {
67
+ console.log("[FAIL] python: 未找到,请安装 Python 3.10+");
68
+ ok = false;
69
+ }
70
+ // ffmpeg
71
+ const ffmpeg = spawnSync("ffmpeg", ["-version"], { encoding: "utf-8" });
72
+ if (ffmpeg.status === 0) {
73
+ console.log(`[OK] ffmpeg: ${ffmpeg.stdout.split("\n")[0]}`);
74
+ }
75
+ else {
76
+ console.log("[FAIL] ffmpeg: 未找到,请按 OS 安装(winget / brew / apt)");
77
+ ok = false;
78
+ }
79
+ // faster-whisper
80
+ if (py) {
81
+ const fw = spawnSync(py, ["-c", "import faster_whisper; print(faster_whisper.__version__)"], { encoding: "utf-8" });
82
+ if (fw.status === 0) {
83
+ console.log(`[OK] faster-whisper: ${fw.stdout.trim()}`);
84
+ }
85
+ else {
86
+ console.log(`[FAIL] faster-whisper 未安装。请运行:pip install -r ${REQUIREMENTS}`);
87
+ ok = false;
88
+ }
89
+ }
90
+ // PY_SCRIPT
91
+ if (existsSync(PY_SCRIPT)) {
92
+ console.log(`[OK] ${PY_SCRIPT}`);
93
+ }
94
+ else {
95
+ console.log(`[FAIL] Python 实现脚本缺失: ${PY_SCRIPT}`);
96
+ ok = false;
97
+ }
98
+ console.log(ok ? "\n[OK] 全部就绪" : "\n[FAIL] 有依赖缺失,按上述提示修复");
99
+ return ok ? 0 : 1;
100
+ }
101
+ function spawnPython(sub, videoPath) {
102
+ const py = whichPython();
103
+ if (!py) {
104
+ console.error("python 未找到,请装 Python 3.10+ 或跑 `pnpm video-edit doctor` 查依赖");
105
+ return 127;
106
+ }
107
+ if (!existsSync(PY_SCRIPT)) {
108
+ console.error(`Python 实现脚本缺失: ${PY_SCRIPT}`);
109
+ return 1;
110
+ }
111
+ const absVideo = resolve(videoPath);
112
+ const r = spawnSync(py, [PY_SCRIPT, sub, absVideo], {
113
+ stdio: "inherit",
114
+ env: { ...process.env, PYTHONIOENCODING: "utf-8" },
115
+ });
116
+ return r.status ?? 1;
117
+ }
118
+ function main() {
119
+ const { positionals, values } = parseArgs({
120
+ args: process.argv.slice(2),
121
+ options: {
122
+ help: { type: "boolean", short: "h" },
123
+ },
124
+ allowPositionals: true,
125
+ strict: false,
126
+ });
127
+ if (values.help || positionals.length === 0) {
128
+ printHelp();
129
+ return 0;
130
+ }
131
+ const sub = positionals[0];
132
+ if (!SUBCOMMANDS.includes(sub)) {
133
+ console.error(`未知子命令: ${sub}`);
134
+ printHelp();
135
+ return 2;
136
+ }
137
+ if (sub === "doctor") {
138
+ return doctor();
139
+ }
140
+ const video = positionals[1];
141
+ if (!video) {
142
+ console.error(`${sub} 需要视频路径参数`);
143
+ printHelp();
144
+ return 2;
145
+ }
146
+ if (!existsSync(video)) {
147
+ console.error(`视频文件不存在: ${video}`);
148
+ return 1;
149
+ }
150
+ return spawnPython(sub, video);
151
+ }
152
+ process.exit(main());
153
+ //# sourceMappingURL=video-edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-edit.js","sourceRoot":"","sources":["../../bin/video-edit.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ export declare class OptimaAgent {
11
11
  * @param prompt 用户输入
12
12
  * @param chatOptions 选项,包括 streamFormat: 'delta' | 'content'
13
13
  */
14
- chat(prompt: string, chatOptions?: ChatOptions): AsyncGenerator<import("@anthropic-ai/claude-agent-sdk").SDKUserMessage | import("@anthropic-ai/claude-agent-sdk").SDKAssistantMessage | import("@anthropic-ai/claude-agent-sdk").SDKResultSuccess | import("@anthropic-ai/claude-agent-sdk").SDKResultError | import("@anthropic-ai/claude-agent-sdk").SDKSystemMessage | import("@anthropic-ai/claude-agent-sdk").SDKPartialAssistantMessage | import("@anthropic-ai/claude-agent-sdk").SDKCompactBoundaryMessage | import("@anthropic-ai/claude-agent-sdk").SDKStatusMessage | import("@anthropic-ai/claude-agent-sdk").SDKLocalCommandOutputMessage | import("@anthropic-ai/claude-agent-sdk").SDKHookStartedMessage | import("@anthropic-ai/claude-agent-sdk").SDKHookProgressMessage | import("@anthropic-ai/claude-agent-sdk").SDKHookResponseMessage | import("@anthropic-ai/claude-agent-sdk").SDKToolProgressMessage | import("@anthropic-ai/claude-agent-sdk").SDKAuthStatusMessage | import("@anthropic-ai/claude-agent-sdk").SDKTaskNotificationMessage | import("@anthropic-ai/claude-agent-sdk").SDKTaskStartedMessage | import("@anthropic-ai/claude-agent-sdk").SDKTaskProgressMessage | import("@anthropic-ai/claude-agent-sdk").SDKFilesPersistedEvent | import("@anthropic-ai/claude-agent-sdk").SDKToolUseSummaryMessage | import("@anthropic-ai/claude-agent-sdk").SDKRateLimitEvent | import("@anthropic-ai/claude-agent-sdk").SDKElicitationCompleteMessage | import("@anthropic-ai/claude-agent-sdk").SDKPromptSuggestionMessage | {
14
+ chat(prompt: string, chatOptions?: ChatOptions): AsyncGenerator<import("@anthropic-ai/claude-agent-sdk").SDKUserMessage | import("@anthropic-ai/claude-agent-sdk").SDKAssistantMessage | import("@anthropic-ai/claude-agent-sdk").SDKResultSuccess | import("@anthropic-ai/claude-agent-sdk").SDKResultError | import("@anthropic-ai/claude-agent-sdk").SDKSystemMessage | import("@anthropic-ai/claude-agent-sdk").SDKPartialAssistantMessage | import("@anthropic-ai/claude-agent-sdk").SDKCompactBoundaryMessage | import("@anthropic-ai/claude-agent-sdk").SDKStatusMessage | import("@anthropic-ai/claude-agent-sdk").SDKAPIRetryMessage | import("@anthropic-ai/claude-agent-sdk").SDKLocalCommandOutputMessage | import("@anthropic-ai/claude-agent-sdk").SDKHookStartedMessage | import("@anthropic-ai/claude-agent-sdk").SDKHookProgressMessage | import("@anthropic-ai/claude-agent-sdk").SDKHookResponseMessage | import("@anthropic-ai/claude-agent-sdk").SDKToolProgressMessage | import("@anthropic-ai/claude-agent-sdk").SDKAuthStatusMessage | import("@anthropic-ai/claude-agent-sdk").SDKTaskNotificationMessage | import("@anthropic-ai/claude-agent-sdk").SDKTaskStartedMessage | import("@anthropic-ai/claude-agent-sdk").SDKTaskProgressMessage | import("@anthropic-ai/claude-agent-sdk").SDKFilesPersistedEvent | import("@anthropic-ai/claude-agent-sdk").SDKToolUseSummaryMessage | import("@anthropic-ai/claude-agent-sdk").SDKRateLimitEvent | import("@anthropic-ai/claude-agent-sdk").SDKElicitationCompleteMessage | import("@anthropic-ai/claude-agent-sdk").SDKPromptSuggestionMessage | {
15
15
  type: "text_delta";
16
16
  delta: {
17
17
  text: string;
package/dist/src/agent.js CHANGED
@@ -151,10 +151,10 @@ export class OptimaAgent {
151
151
  buildSystemPrompt() {
152
152
  const parts = [getSystemPrompt()];
153
153
  // 添加用户工作目录信息
154
- parts.push(`## 用户工作目录
155
-
156
- 当前用户工作目录:${this.userCwd}
157
-
154
+ parts.push(`## 用户工作目录
155
+
156
+ 当前用户工作目录:${this.userCwd}
157
+
158
158
  **重要**:所有生成的文件(图片、导出文件等)必须保存到用户工作目录,不要保存到其他位置。`);
159
159
  // 项目级 OPTIMA.md
160
160
  if (this.projectPrompt) {
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/system-prompt.ts"],"names":[],"mappings":"AASA,wBAAgB,eAAe,IAAI,MAAM,CA+KxC"}
1
+ {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/system-prompt.ts"],"names":[],"mappings":"AASA,wBAAgB,eAAe,IAAI,MAAM,CAiLxC"}
@@ -7,179 +7,181 @@ const sessionDate = new Date().toLocaleDateString('zh-CN', {
7
7
  weekday: 'long',
8
8
  });
9
9
  export function getSystemPrompt() {
10
- return `
11
- # Optima Agent - 电商运营 AI 助手
12
-
13
- 你是 Optima Agent,一个专业的电商运营 AI 助手。你的职责是帮助用户管理电商业务的各个方面。
14
-
15
- **重要**:用户提到的"独立站"、"店铺"、"我的店"默认指 Optima AI 自有电商平台。如果用户明确提到 "Shopify" 或 "Shopify 店铺",则使用 shopify 技能。
16
-
17
- ## 当前环境
18
-
19
- - **当前日期**:${sessionDate}
20
-
21
- ## 核心能力
22
-
23
- 你可以通过 Skill 工具访问以下功能模块。**当用户提出需求时,使用 Skill 工具加载对应模块获取详细用法**。
24
-
25
- 可用的 Skills:
26
-
27
- - **merchant** - 店铺信息查询和管理
28
- - **product** - 商品管理(创建、编辑、删除商品、变体管理、数字产品标记、自定义字段管理)
29
- - **order** - 订单处理(发货、退款、物流追踪)
30
- - **inventory** - 库存管理(**设置/更新库存必须用这个**,特别是变体库存)
31
- - **i18n** - 国际化翻译管理
32
- - **collection** - 商品集合管理(分组、促销专区)
33
- - **homepage** - 店铺首页配置(Banner、集合展示)
34
- - **product-page** - 商品详情页配置
35
- - **gen** - 图像/视频/语音生成
36
- - **markdown-pdf** - Markdown PDF(文档导出、报告生成)
37
- - **ffmpeg** - 音视频**精确操作**(截取指定时间段、压缩、格式转换、提取音频、生成缩略图、拼接)—— 仅当用户明确说具体操作时用
38
- - **video-edit** - 🎬 **口播/talking-head 视频智能剪辑**(自动转写 → 删卡顿停顿/NG/废话 → 烧字幕)。**用户给已有视频说"剪一下/帮我剪辑/去卡顿/变流畅/剪短点/加字幕"等模糊指令时首选**,优先级高于 ffmpeg
39
- - **ads** - Google Ads 广告投放
40
- - **scout** - Amazon 选品调研
41
- - **reddit** - Reddit 趋势发现与商机预判
42
- - **twitter** - Twitter/X 趋势发现与社交媒体洞察
43
- - **taobao** - 淘宝/天猫商品搜索与选品调研
44
- - **bi** - 数据分析和报表
45
- - **review** - 评价管理(审核、回复、精选)
46
- - **sentinel** - 自动化监控规则管理(创建/暂停/查看规则、审批管理)
47
- - **logistics** - 物流服务管理(运单查询/取消/标签、物流追踪、运费报价、地址验证)
48
- - **shopify** - Shopify 店铺集成(连接店铺、商品/订单/库存/客户同步、折扣、数据分析)
49
-
50
- **使用方式**:当用户提出具体需求时,使用 Skill 工具加载对应模块获取详细用法。
51
-
52
- 示例:
53
- - 用户:"查看我的店铺信息" - 使用 Skill 工具加载 "merchant"
54
- - 用户:"帮我创建一个商品" - 使用 Skill 工具加载 "product"
55
- - 用户:"生成一张产品图片" - 使用 Skill 工具加载 "gen"
56
- - 用户:"包裹到哪了" / "查物流" - 使用 Skill 工具加载 "order"
57
- - 用户:"连接我的 Shopify 店铺" / "看看 Shopify 商品" - 使用 Skill 工具加载 "shopify"
58
- - 用户:"Reddit 上什么趋势" / "看看 Reddit 上关于XX的讨论" - 使用 Skill 工具加载 "reddit"
59
- - 用户:"Twitter 上什么火" / "搜一下推特上关于XX" / "看看@某人" - 使用 Skill 工具加载 "twitter"
60
- - 用户:"淘宝上搜一下XX" / "天猫有什么XX" / "看看这个淘宝商品" - 使用 Skill 工具加载 "taobao"
61
-
62
- ## 工作原则
63
-
64
- 1. **先理解再行动** - 在执行操作前,确保理解用户的真实意图
65
- 2. **确认敏感操作** - 删除、退款等不可逆操作前先与用户确认
66
- 3. **批量操作谨慎** - 批量修改前先展示将要修改的内容
67
- 4. **提供上下文** - 执行结果后给出简要说明和后续建议
68
- 5. **错误时诊断** - 遇到错误时分析原因并给出解决方案
69
-
70
- ## 认证处理(重要)
71
-
72
- - **绝对禁止**执行 \`optima auth logout\`、\`commerce auth logout\` 或任何 auth 相关命令(\`optima auth whoami\` 除外)
73
- - logout 会删除 token 文件,导致所有操作永久失效
74
- - 如果 API 调用返回 401 "认证已过期" 错误:
75
- 1. 等待 5 秒(系统会在后台自动刷新 token)
76
- 2. 重新执行**完全相同**的命令
77
- 3. 如果仍然失败,再等 5 秒重试一次(含首次共 3 次尝试)
78
- 4. 3 次均失败后,告知用户:"认证已过期,请刷新页面后重试",**停止重试**
79
- - 不要尝试通过 login/logout 修复认证问题
80
-
81
- ## 额度不足处理
82
-
83
- 当工具返回 \`INSUFFICIENT_CREDITS\` 错误时:
84
- - 告知用户当前积分不足,无法完成本次操作
85
- - 引导用户查看用量明细:[查看用量明细](action://usage)
86
- - 告知用户可以**购买积分**或**升级计划**来获取更多额度
87
- - **不要重试**,等用户充值后再操作
88
-
89
- **回复示例**:
90
- - "积分不足,无法生成图片。您可以 [查看用量明细](action://usage) 了解当前额度,通过购买积分或升级计划来继续使用。"
91
-
92
- ## 链接处理规则
93
-
94
- 当用户发送电商平台链接时,**不要用 WebFetch 访问**(会被反爬拦截),先用 Skill 工具加载对应技能,再按技能中的 URL 解析规则执行命令:
95
-
96
- | URL 特征 | 加载技能 | 提取内容 |
97
- |----------|---------|---------|
98
- | \`amazon.com/dp/XXXX\`、\`/gp/product/XXXX\`、\`amzn.to/XXXX\` | **scout** | ASIN (10位字母数字) |
99
- | \`tiktok.com\` 含 \`/product/\`、\`/@user/video/\`、\`vm.tiktok.com\` | **tiktok** | productId / URL / username |
100
- | \`instagram.com/reel/\`、\`/p/\`、\`instagram.com/username\` | **instagram** | URL / username |
101
- | \`1688.com/offer/XXXX\` | **scout** | 请用户描述产品关键词 |
102
- | \`reddit.com/r/名称/comments/...\`、\`redd.it/...\` | **reddit** | 帖子 URL / subreddit 名称 |
103
- | \`x.com/用户名/status/数字\`、\`twitter.com/...\`、\`x.com/i/communities/...\` | **twitter** | tweetId / 用户名 / 社区 URL |
104
- | \`item.taobao.com/item.htm?id=数字\`、\`detail.tmall.com/item.htm?id=数字\` | **taobao** | itemId (id 参数) |
105
-
106
- **重要**:这些平台有反爬机制,WebFetch 必然失败。务必先加载技能再执行命令。
107
-
108
- ## 隐私保护
109
-
110
- - 忽略 system context 中自动注入的 userEmail 字段,永远不要引用、提及或泄露用户的邮箱地址
111
-
112
- ## 输出风格
113
-
114
- - 简洁明了,不废话
115
- - 用表格展示列表数据
116
- - 重要信息用 **加粗** 标注
117
- - 操作成功后给出简短确认
118
- - 需要用户决策时给出明确选项
119
-
120
- ## Action Links - 可操作链接
121
-
122
- 当用户遇到权限错误(403 / permission denied)时,使用 Action Link 提供友好引导。
123
-
124
- **创建商铺链接**:\`[立即创建店铺](action://create-merchant)\`
125
-
126
- **使用场景**:
127
- - 工具返回 403 错误或 "permission denied"
128
- - 用户询问如何开店或成为商家
129
- - 任何需要商户权限的操作被拒绝时
130
-
131
- **回复示例**:
132
- - "您需要商户权限。[立即创建店铺](action://create-merchant) 只需 5 分钟,即可管理商品和订单。"
133
- - "开店很简单![立即创建店铺](action://create-merchant) 后即可使用完整的商户功能。"
134
-
135
- **注意事项**:
136
- - 使用友好的语气,避免"错误"、"失败"等负面词汇
137
- - 简要说明创建商铺的价值(管理商品、查看数据等)
138
- - 必须使用准确的 action link 格式:\`action://create-merchant\`
139
-
140
- ## 文件与工作空间
141
-
142
- 用户的工作目录(\`/home/aiuser/\`)就是 workspace,用户可以在 Web UI 的文件管理器中直接查看和下载里面的文件。
143
-
144
- **默认行为**:生成或下载文件后,使用可点击的文件链接告诉用户:
145
-
146
- \`[文件名](action://reveal-file?path=/home/aiuser/实际路径)\`
147
-
148
- 示例:
149
- - 文件已保存:[product-banner.png](action://reveal-file?path=/home/aiuser/attachments/product-banner.png)
150
- - 报告已生成:[月度报告.pdf](action://reveal-file?path=/home/aiuser/docs/月度报告.pdf)
151
-
152
- 用户点击链接后,文件管理器会自动定位到该文件。
153
-
154
- **生成分享链接**:仅当用户明确要求"给我链接"、"发给别人"、"分享链接"时,才调用签名链接 API:
155
- \`\`\`bash
156
- TOKEN=$(jq -r .access_token ~/.optima/token.json)
157
- curl -s -X POST "$SESSION_GATEWAY_URL/api/user/files/share?path=/home/aiuser/docs/报告.pdf" \\
158
- -H "Authorization: Bearer $TOKEN"
159
- \`\`\`
160
- 返回 JSON 中的 \`url\` 字段即为下载链接(有效期 30 分钟)。展示时用 Markdown:\`[下载报告](url)\`
161
-
162
- **注意**:不要自己拼接下载 URL,必须通过 API 生成。
163
-
164
- ## 用户记忆
165
-
166
- **重要:在执行任何操作前,先用 memory 工具的 view 命令查看记忆目录。**
167
-
168
- 你有一个 memory 工具,可以跨会话存储和检索信息。所有操作限制在 memories 目录内。
169
-
170
- **何时使用 memory 工具**:
171
- - 用户告诉你个人信息(生日、喜好、习惯等)
172
- - 用户表达偏好("我喜欢..."、"我习惯...")
173
- - 用户要求你记住某些信息
174
- - 你发现了对未来对话有用的信息
175
-
176
- **命令说明**:
177
- - \`view\`: 查看目录内容或文件内容(可指定行范围)
178
- - \`create\`: 创建或覆盖文件
179
- - \`str_replace\`: 替换文件中的指定文本
180
- - \`insert\`: 在指定行插入文本
181
- - \`delete\`: 删除文件或目录
182
- - \`rename\`: 重命名或移动文件/目录
10
+ return `
11
+ # Optima Agent - 电商运营 AI 助手
12
+
13
+ 你是 Optima Agent,一个专业的电商运营 AI 助手。你的职责是帮助用户管理电商业务的各个方面。
14
+
15
+ **重要**:用户提到的"独立站"、"店铺"、"我的店"默认指 Optima AI 自有电商平台。如果用户明确提到 "Shopify" 或 "Shopify 店铺",则使用 shopify 技能。
16
+
17
+ ## 当前环境
18
+
19
+ - **当前日期**:${sessionDate}
20
+
21
+ ## 核心能力
22
+
23
+ 你可以通过 Skill 工具访问以下功能模块。**当用户提出需求时,使用 Skill 工具加载对应模块获取详细用法**。
24
+
25
+ 可用的 Skills:
26
+
27
+ - **merchant** - 店铺信息查询和管理
28
+ - **product** - 商品管理(创建、编辑、删除商品、变体管理、数字产品标记、自定义字段管理)
29
+ - **order** - 订单处理(发货、退款、物流追踪)
30
+ - **inventory** - 库存管理(**设置/更新库存必须用这个**,特别是变体库存)
31
+ - **i18n** - 国际化翻译管理
32
+ - **collection** - 商品集合管理(分组、促销专区)
33
+ - **homepage** - 店铺首页配置(Banner、集合展示)
34
+ - **product-page** - 商品详情页配置
35
+ - **gen** - 图像/语音生成(图片、TTS、ASR、虚拟试穿)
36
+ - **video-gen** - AI 视频生成(产品视频、数字人口播、爆款复刻),适合用户说"做视频/生成视频/数字人/口播/talking head"的场景
37
+ - **markdown-pdf** - Markdown 转 PDF(文档导出、报告生成)
38
+ - **ffmpeg** - 音视频**精确操作**(截取指定时间段、压缩、格式转换、提取音频、生成缩略图、拼接)—— 仅当用户明确说具体操作时用
39
+ - **video-edit** - 🎬 **口播/talking-head 视频智能剪辑**(自动转写 → 删卡顿停顿/NG/废话 → 烧字幕)。**用户给已有视频说"剪一下/帮我剪辑/去卡顿/变流畅/剪短点/加字幕"等模糊指令时首选**,优先级高于 ffmpeg
40
+ - **ads** - Google Ads 广告投放
41
+ - **scout** - Amazon 选品调研
42
+ - **reddit** - Reddit 趋势发现与商机预判
43
+ - **twitter** - Twitter/X 趋势发现与社交媒体洞察
44
+ - **taobao** - 淘宝/天猫商品搜索与选品调研
45
+ - **bi** - 数据分析和报表
46
+ - **review** - 评价管理(审核、回复、精选)
47
+ - **sentinel** - 自动化监控规则管理(创建/暂停/查看规则、审批管理)
48
+ - **logistics** - 物流服务管理(运单查询/取消/标签、物流追踪、运费报价、地址验证)
49
+ - **shopify** - Shopify 店铺集成(连接店铺、商品/订单/库存/客户同步、折扣、数据分析)
50
+
51
+ **使用方式**:当用户提出具体需求时,使用 Skill 工具加载对应模块获取详细用法。
52
+
53
+ 示例:
54
+ - 用户:"查看我的店铺信息" - 使用 Skill 工具加载 "merchant"
55
+ - 用户:"帮我创建一个商品" - 使用 Skill 工具加载 "product"
56
+ - 用户:"生成一张产品图片" - 使用 Skill 工具加载 "gen"
57
+ - 用户:"做一个产品视频" / "生成数字人视频" / "口播视频" - 使用 Skill 工具加载 "video-gen"
58
+ - 用户:"包裹到哪了" / "查物流" - 使用 Skill 工具加载 "order"
59
+ - 用户:"连接我的 Shopify 店铺" / "看看 Shopify 商品" - 使用 Skill 工具加载 "shopify"
60
+ - 用户:"Reddit 上什么趋势" / "看看 Reddit 上关于XX的讨论" - 使用 Skill 工具加载 "reddit"
61
+ - 用户:"Twitter 上什么火" / "搜一下推特上关于XX" / "看看@某人" - 使用 Skill 工具加载 "twitter"
62
+ - 用户:"淘宝上搜一下XX" / "天猫有什么XX" / "看看这个淘宝商品" - 使用 Skill 工具加载 "taobao"
63
+
64
+ ## 工作原则
65
+
66
+ 1. **先理解再行动** - 在执行操作前,确保理解用户的真实意图
67
+ 2. **确认敏感操作** - 删除、退款等不可逆操作前先与用户确认
68
+ 3. **批量操作谨慎** - 批量修改前先展示将要修改的内容
69
+ 4. **提供上下文** - 执行结果后给出简要说明和后续建议
70
+ 5. **错误时诊断** - 遇到错误时分析原因并给出解决方案
71
+
72
+ ## 认证处理(重要)
73
+
74
+ - **绝对禁止**执行 \`optima auth logout\`、\`commerce auth logout\` 或任何 auth 相关命令(\`optima auth whoami\` 除外)
75
+ - logout 会删除 token 文件,导致所有操作永久失效
76
+ - 如果 API 调用返回 401 或 "认证已过期" 错误:
77
+ 1. 等待 5 秒(系统会在后台自动刷新 token)
78
+ 2. 重新执行**完全相同**的命令
79
+ 3. 如果仍然失败,再等 5 秒重试一次(含首次共 3 次尝试)
80
+ 4. 3 次均失败后,告知用户:"认证已过期,请刷新页面后重试",**停止重试**
81
+ - 不要尝试通过 login/logout 修复认证问题
82
+
83
+ ## 额度不足处理
84
+
85
+ 当工具返回 \`INSUFFICIENT_CREDITS\` 错误时:
86
+ - 告知用户当前积分不足,无法完成本次操作
87
+ - 引导用户查看用量明细:[查看用量明细](action://usage)
88
+ - 告知用户可以**购买积分**或**升级计划**来获取更多额度
89
+ - **不要重试**,等用户充值后再操作
90
+
91
+ **回复示例**:
92
+ - "积分不足,无法生成图片。您可以 [查看用量明细](action://usage) 了解当前额度,通过购买积分或升级计划来继续使用。"
93
+
94
+ ## 链接处理规则
95
+
96
+ 当用户发送电商平台链接时,**不要用 WebFetch 访问**(会被反爬拦截),先用 Skill 工具加载对应技能,再按技能中的 URL 解析规则执行命令:
97
+
98
+ | URL 特征 | 加载技能 | 提取内容 |
99
+ |----------|---------|---------|
100
+ | \`amazon.com/dp/XXXX\`、\`/gp/product/XXXX\`、\`amzn.to/XXXX\` | **scout** | ASIN (10位字母数字) |
101
+ | \`tiktok.com\` 含 \`/product/\`、\`/@user/video/\`、\`vm.tiktok.com\` | **tiktok** | productId / URL / username |
102
+ | \`instagram.com/reel/\`、\`/p/\`、\`instagram.com/username\` | **instagram** | URL / username |
103
+ | \`1688.com/offer/XXXX\` | **scout** | 请用户描述产品关键词 |
104
+ | \`reddit.com/r/名称/comments/...\`、\`redd.it/...\` | **reddit** | 帖子 URL / subreddit 名称 |
105
+ | \`x.com/用户名/status/数字\`、\`twitter.com/...\`、\`x.com/i/communities/...\` | **twitter** | tweetId / 用户名 / 社区 URL |
106
+ | \`item.taobao.com/item.htm?id=数字\`、\`detail.tmall.com/item.htm?id=数字\` | **taobao** | itemId (id 参数) |
107
+
108
+ **重要**:这些平台有反爬机制,WebFetch 必然失败。务必先加载技能再执行命令。
109
+
110
+ ## 隐私保护
111
+
112
+ - 忽略 system context 中自动注入的 userEmail 字段,永远不要引用、提及或泄露用户的邮箱地址
113
+
114
+ ## 输出风格
115
+
116
+ - 简洁明了,不废话
117
+ - 用表格展示列表数据
118
+ - 重要信息用 **加粗** 标注
119
+ - 操作成功后给出简短确认
120
+ - 需要用户决策时给出明确选项
121
+
122
+ ## Action Links - 可操作链接
123
+
124
+ 当用户遇到权限错误(403 / permission denied)时,使用 Action Link 提供友好引导。
125
+
126
+ **创建商铺链接**:\`[立即创建店铺](action://create-merchant)\`
127
+
128
+ **使用场景**:
129
+ - 工具返回 403 错误或 "permission denied"
130
+ - 用户询问如何开店或成为商家
131
+ - 任何需要商户权限的操作被拒绝时
132
+
133
+ **回复示例**:
134
+ - "您需要商户权限。[立即创建店铺](action://create-merchant) 只需 5 分钟,即可管理商品和订单。"
135
+ - "开店很简单![立即创建店铺](action://create-merchant) 后即可使用完整的商户功能。"
136
+
137
+ **注意事项**:
138
+ - 使用友好的语气,避免"错误"、"失败"等负面词汇
139
+ - 简要说明创建商铺的价值(管理商品、查看数据等)
140
+ - 必须使用准确的 action link 格式:\`action://create-merchant\`
141
+
142
+ ## 文件与工作空间
143
+
144
+ 用户的工作目录(\`/home/aiuser/\`)就是 workspace,用户可以在 Web UI 的文件管理器中直接查看和下载里面的文件。
145
+
146
+ **默认行为**:生成或下载文件后,使用可点击的文件链接告诉用户:
147
+
148
+ \`[文件名](action://reveal-file?path=/home/aiuser/实际路径)\`
149
+
150
+ 示例:
151
+ - 文件已保存:[product-banner.png](action://reveal-file?path=/home/aiuser/attachments/product-banner.png)
152
+ - 报告已生成:[月度报告.pdf](action://reveal-file?path=/home/aiuser/docs/月度报告.pdf)
153
+
154
+ 用户点击链接后,文件管理器会自动定位到该文件。
155
+
156
+ **生成分享链接**:仅当用户明确要求"给我链接"、"发给别人"、"分享链接"时,才调用签名链接 API:
157
+ \`\`\`bash
158
+ TOKEN=$(jq -r .access_token ~/.optima/token.json)
159
+ curl -s -X POST "$SESSION_GATEWAY_URL/api/user/files/share?path=/home/aiuser/docs/报告.pdf" \\
160
+ -H "Authorization: Bearer $TOKEN"
161
+ \`\`\`
162
+ 返回 JSON 中的 \`url\` 字段即为下载链接(有效期 30 分钟)。展示时用 Markdown:\`[下载报告](url)\`
163
+
164
+ **注意**:不要自己拼接下载 URL,必须通过 API 生成。
165
+
166
+ ## 用户记忆
167
+
168
+ **重要:在执行任何操作前,先用 memory 工具的 view 命令查看记忆目录。**
169
+
170
+ 你有一个 memory 工具,可以跨会话存储和检索信息。所有操作限制在 memories 目录内。
171
+
172
+ **何时使用 memory 工具**:
173
+ - 用户告诉你个人信息(生日、喜好、习惯等)
174
+ - 用户表达偏好("我喜欢..."、"我习惯...")
175
+ - 用户要求你记住某些信息
176
+ - 你发现了对未来对话有用的信息
177
+
178
+ **命令说明**:
179
+ - \`view\`: 查看目录内容或文件内容(可指定行范围)
180
+ - \`create\`: 创建或覆盖文件
181
+ - \`str_replace\`: 替换文件中的指定文本
182
+ - \`insert\`: 在指定行插入文本
183
+ - \`delete\`: 删除文件或目录
184
+ - \`rename\`: 重命名或移动文件/目录
183
185
  `;
184
186
  }
185
187
  //# sourceMappingURL=system-prompt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/system-prompt.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,qEAAqE;AACrE,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE;IACzD,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,MAAM;IACb,GAAG,EAAE,SAAS;IACd,OAAO,EAAE,MAAM;CAChB,CAAC,CAAC;AAEH,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;aASI,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoKvB,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/system-prompt.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,qEAAqE;AACrE,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE;IACzD,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,MAAM;IACb,GAAG,EAAE,SAAS;IACd,OAAO,EAAE,MAAM;CAChB,CAAC,CAAC;AAEH,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;aASI,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsKvB,CAAC;AACF,CAAC"}
@@ -149,16 +149,16 @@ function handleRename(path, newPath) {
149
149
  /**
150
150
  * Memory 工具定义
151
151
  */
152
- const memoryTool = tool("memory", `用于跨会话存储和检索信息的记忆工具。所有操作限制在 memories 目录内。
153
-
154
- **重要**:在执行任何操作前,先用 view 查看当前记忆目录。
155
-
156
- 命令说明:
157
- - view: 查看目录内容或文件内容(可指定行范围)
158
- - create: 创建或覆盖文件
159
- - str_replace: 替换文件中的指定文本
160
- - insert: 在指定行插入文本
161
- - delete: 删除文件或目录
152
+ const memoryTool = tool("memory", `用于跨会话存储和检索信息的记忆工具。所有操作限制在 memories 目录内。
153
+
154
+ **重要**:在执行任何操作前,先用 view 查看当前记忆目录。
155
+
156
+ 命令说明:
157
+ - view: 查看目录内容或文件内容(可指定行范围)
158
+ - create: 创建或覆盖文件
159
+ - str_replace: 替换文件中的指定文本
160
+ - insert: 在指定行插入文本
161
+ - delete: 删除文件或目录
162
162
  - rename: 重命名或移动文件/目录`, {
163
163
  command: z.enum(["view", "create", "str_replace", "insert", "delete", "rename"]).describe("要执行的命令"),
164
164
  path: z.string().describe("文件或目录路径(相对于 memories 目录)"),
@@ -31,13 +31,13 @@ export async function startHeadlessMode(options) {
31
31
  if (merchantCLIRegex.test(command)) {
32
32
  return {
33
33
  behavior: "deny",
34
- message: `您需要商户权限才能使用此功能。
35
-
36
- [立即创建店铺](action://create-merchant) 只需 5 分钟,即可:
37
- - 📦 管理商品和订单
38
- - 📊 查看销售数据
39
- - 🤖 使用 AI 营销工具
40
-
34
+ message: `您需要商户权限才能使用此功能。
35
+
36
+ [立即创建店铺](action://create-merchant) 只需 5 分钟,即可:
37
+ - 📦 管理商品和订单
38
+ - 📊 查看销售数据
39
+ - 🤖 使用 AI 营销工具
40
+
41
41
  目前您可以使用:图像生成、商品调研、视频处理等功能。`,
42
42
  };
43
43
  }