@tomako/tools-runtime 0.1.5 → 0.1.7

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 (47) hide show
  1. package/package.json +2 -1
  2. package/src/components/tools/engine/package-widget-runtime.tsx +5 -1
  3. package/src/components/tools/engine/task-recovery.test.ts +65 -0
  4. package/src/components/tools/engine/task-recovery.ts +109 -0
  5. package/src/components/tools/engine/use-legacy-llm-task.ts +16 -3
  6. package/src/components/tools/engine/use-tool-task.ts +77 -53
  7. package/src/features/tools/app-store-screenshot-generator/widget/app-store-screenshot-generator.tsx +88 -16
  8. package/src/features/tools/app-store-screenshot-generator/widget/asset-slots.test.ts +52 -0
  9. package/src/features/tools/app-store-screenshot-generator/widget/asset-slots.ts +3 -2
  10. package/src/features/tools/app-store-screenshot-generator/widget/generation.test.ts +126 -0
  11. package/src/features/tools/app-store-screenshot-generator/widget/generation.ts +52 -14
  12. package/src/features/tools/app-store-screenshot-generator/widget/input-media.test.ts +81 -0
  13. package/src/features/tools/app-store-screenshot-generator/widget/input-media.ts +20 -8
  14. package/src/features/tools/cold-start-channel-selector/widget/cold-start-channel-selector.tsx +45 -16
  15. package/src/features/tools/competitor-analysis/competitor-analysis.container.tsx +26 -20
  16. package/src/features/tools/competitor-analysis/widget/competitor-analysis.tsx +47 -16
  17. package/src/features/tools/disclaimer-generator/disclaimer-generator.package.ts +3 -3
  18. package/src/features/tools/email-template-generator/widget/email-template-generator.tsx +37 -4
  19. package/src/features/tools/package/to-tool-module.ts +15 -0
  20. package/src/features/tools/product-name-generator/widget/product-name-generator.tsx +60 -27
  21. package/src/features/tools/product-poster-generator/widget/constants.ts +3 -1
  22. package/src/features/tools/product-poster-generator/widget/helpers.test.ts +51 -0
  23. package/src/features/tools/product-poster-generator/widget/helpers.ts +27 -0
  24. package/src/features/tools/product-poster-generator/widget/product-poster-generator.tsx +112 -12
  25. package/src/features/tools/slogan-generator/slogan-generator.package.ts +28 -28
  26. package/src/i18n/messages/en/tools/app-icon-resizer.ts +1 -1
  27. package/src/i18n/messages/en/tools/app-store-screenshot-generator.ts +2 -2
  28. package/src/i18n/messages/en/tools/cold-start-channel-selector.ts +4 -4
  29. package/src/i18n/messages/en/tools/competitor-analysis.ts +9 -8
  30. package/src/i18n/messages/en/tools/email-template-generator.ts +10 -10
  31. package/src/i18n/messages/en/tools/product-poster-generator.ts +1 -0
  32. package/src/i18n/messages/zh/tools/app-store-screenshot-generator.ts +3 -3
  33. package/src/i18n/messages/zh/tools/cold-start-channel-selector.ts +2 -2
  34. package/src/i18n/messages/zh/tools/competitor-analysis.ts +10 -9
  35. package/src/i18n/messages/zh/tools/email-template-generator.ts +11 -11
  36. package/src/i18n/messages/zh/tools/product-poster-generator.ts +1 -0
  37. package/src/i18n/messages/zh-tw/tools/app-store-screenshot-generator.ts +44 -44
  38. package/src/i18n/messages/zh-tw/tools/cold-start-channel-selector.ts +105 -105
  39. package/src/i18n/messages/zh-tw/tools/competitor-analysis.ts +41 -40
  40. package/src/i18n/messages/zh-tw/tools/email-template-generator.ts +111 -111
  41. package/src/i18n/messages/zh-tw/tools/product-name-generator.ts +92 -92
  42. package/src/i18n/messages/zh-tw/tools/product-poster-generator.ts +74 -73
  43. package/src/i18n/messages/zh-tw/tools/twitter-gif-downloader.ts +47 -47
  44. package/src/lib/tools/cold-start-channel-selector-schema.test.ts +39 -0
  45. package/src/lib/tools/cold-start-channel-selector-schema.ts +8 -4
  46. package/src/lib/tools/competitor-analysis-schema.test.ts +69 -0
  47. package/src/lib/tools/competitor-analysis-schema.ts +53 -5
@@ -6,7 +6,7 @@ import type { ToolPackage } from "../package/types";
6
6
  * Slogan Generator(direct 车道)。
7
7
  * 证据:docs/seo-keyword-briefs/slogan-generator.md(slogan generator 12,100/mo LOW + 竞品拆解)。
8
8
  * 反超点(相对 logo.com / ahrefs / shopify / copy.ai / grammarly):
9
- * 免登录页面内直出;每条候选带风格标签 + why-it-works 理由(ahrefs 只有裸文本);
9
+ * 登录后在页面内直出;每条候选带风格标签 + why-it-works 理由(ahrefs 只有裸文本);
10
10
  * 一次 10 条覆盖多风格;输出附挑选/测试建议;支持可选品牌名生成 name-based slogan。
11
11
  * scene "slogan_generator" 需在 168 compose 的 LLM_DIRECT_ALLOWED_SCENES 白名单内。
12
12
  */
@@ -41,12 +41,12 @@ export const sloganGeneratorPackage: ToolPackage = {
41
41
  },
42
42
  },
43
43
  copy: {
44
- title: { en: "Slogan Generator", zh: "Slogan 广告语生成器", "zh-tw": "Slogan 廣告語生成器" },
44
+ title: { en: "AI Slogan Generator for Business", zh: "AI Slogan 广告语生成器", "zh-tw": "AI Slogan 廣告語產生器" },
45
45
  description: {
46
- en: "Free AI slogan generator: describe your business and get 10 catchy slogan and tagline ideas across styles from bold and minimal to playful and benefit-driven — each with a style tag and a why-it-works note. No sign-up, results on this page.",
47
- zh: "免费 AI Slogan 生成器:描述你的业务,一次获得 10 条广告语和 tagline 候选,覆盖大胆、极简、俏皮、利益导向等多种风格,每条附风格标签和入选理由。免注册,结果直接在本页给出。",
46
+ en: "Describe your business and get 10 AI slogan and tagline ideas across distinct styles, each with a why-it-works note. Sign in to generate and compare the full set.",
47
+ zh: "描述你的业务,一次生成 10 Slogan tagline 候选,覆盖大胆、极简、俏皮、利益导向等多种风格,每条附风格标签和入选理由。登录后可在本页生成并比较完整结果。",
48
48
  "zh-tw":
49
- "免費 AI Slogan 生成器:描述你的業務,一次獲得 10 條廣告語和 tagline 候選,覆蓋大膽、極簡、俏皮、利益導向等多種風格,每條附風格標籤和入選理由。免註冊,結果直接在本頁給出。",
49
+ "描述你的業務,一次產生 10 Slogan tagline 候選,涵蓋大膽、極簡、俏皮、利益導向等多種風格,每條附風格標籤和入選理由。登入後可在本頁產生並比較完整結果。",
50
50
  },
51
51
  intro: {
52
52
  en: "A good slogan is 3-6 words that carry your brand promise. Instead of staring at a blank page or paying an agency, describe what you do and compare structured candidates side by side — with reasons, not just word salad.",
@@ -60,9 +60,9 @@ export const sloganGeneratorPackage: ToolPackage = {
60
60
  "zh-tw": "品牌工具",
61
61
  },
62
62
  keywords: {
63
- en: ["slogan generator", "slogan creator", "slogan maker", "free slogan generator", "ai slogan generator", "tagline generator", "business slogan generator"],
64
- zh: ["slogan 生成器", "slogan 制作", "广告语生成器", "品牌口号生成", "tagline 生成器", "免费广告语工具", "AI 广告语"],
65
- "zh-tw": ["slogan 生成器", "slogan 製作", "廣告語生成器", "品牌口號生成", "tagline 生成器", "免費廣告語工具", "AI 廣告語"],
63
+ en: ["slogan generator", "slogan creator", "slogan maker", "ai slogan generator", "tagline generator", "business slogan generator"],
64
+ zh: ["slogan 生成器", "slogan 制作", "广告语生成器", "品牌口号生成", "tagline 生成器", "AI 广告语"],
65
+ "zh-tw": ["slogan 產生器", "slogan 製作", "廣告語產生器", "品牌口號產生", "tagline 產生器", "AI 廣告語"],
66
66
  },
67
67
  inputSignal: {
68
68
  en: "One-sentence business description + optional brand name",
@@ -214,13 +214,13 @@ Quality requirements:
214
214
  zh: "一句说清业务就够了。品牌名、目标人群和风格方向会让候选更贴合。",
215
215
  "zh-tw": "一句說清業務就夠了。品牌名、目標人群和風格方向會讓候選更貼合。",
216
216
  },
217
- submitLabel: { en: "Generate 10 slogans", zh: "生成 10 条 Slogan", "zh-tw": "生成 10 條 Slogan" },
217
+ submitLabel: { en: "Generate 10 slogans", zh: "生成 10 条 Slogan", "zh-tw": "產生 10 條 Slogan" },
218
218
  resultTitle: { en: "Compare your candidates", zh: "横向比较候选", "zh-tw": "橫向比較候選" },
219
- pendingTitle: { en: "Writing your slogans", zh: "正在生成 Slogan", "zh-tw": "正在生成 Slogan" },
219
+ pendingTitle: { en: "Writing your slogans", zh: "正在生成 Slogan", "zh-tw": "正在產生 Slogan" },
220
220
  pendingHint: {
221
221
  en: "Usually takes 15-30 seconds. Candidates across multiple styles are being written and annotated.",
222
222
  zh: "通常需要 15-30 秒。正在生成多风格候选并为每条写入选理由。",
223
- "zh-tw": "通常需要 15-30 秒。正在生成多風格候選並為每條寫入選理由。",
223
+ "zh-tw": "通常需要 15-30 秒。正在產生多風格候選,並為每條寫入入選理由。",
224
224
  },
225
225
  errorOverrides: {
226
226
  validation: {
@@ -236,16 +236,16 @@ Quality requirements:
236
236
  page: {
237
237
  workspace: {
238
238
  heading: {
239
- en: "Get 10 slogan candidates worth comparing",
240
- zh: "一次拿到 10 条值得比较的 Slogan",
241
- "zh-tw": "一次拿到 10 條值得比較的 Slogan",
239
+ en: "AI slogan generator: 10 ideas worth comparing",
240
+ zh: "AI Slogan 生成器:一次拿到 10 条值得比较的候选",
241
+ "zh-tw": "AI Slogan 產生器:一次取得 10 條值得比較的候選",
242
242
  },
243
243
  hint: {
244
244
  en: "Describe the business in one or two sentences, optionally add the brand name and audience. You get 10 candidates across multiple styles, each with a style tag and a note on why the line works — ready to shortlist, test, and refine.",
245
245
  zh: "用一两句话描述业务,可选填品牌名和目标人群。你会得到覆盖多种风格的 10 条候选,每条带风格标签和入选理由——直接进入筛选、测试和打磨。",
246
246
  "zh-tw": "用一兩句話描述業務,可選填品牌名和目標人群。你會得到覆蓋多種風格的 10 條候選,每條帶風格標籤和入選理由——直接進入篩選、測試和打磨。",
247
247
  },
248
- badge: { en: "Free, no sign-up", zh: "免费免注册", "zh-tw": "免費免註冊" },
248
+ badge: { en: "Sign in to generate", zh: "登录后生成", "zh-tw": "登入後產生" },
249
249
  },
250
250
  standard: {
251
251
  benefits: {
@@ -541,17 +541,17 @@ Quality requirements:
541
541
  {
542
542
  kind: "cards",
543
543
  heading: {
544
- en: "Why this beats the usual free slogan tools",
545
- zh: "为什么比常见的免费 slogan 工具好用",
546
- "zh-tw": "為什麼比常見的免費 slogan 工具好用",
544
+ en: "Why this beats basic slogan lists",
545
+ zh: "为什么比常见的 slogan 列表更好用",
546
+ "zh-tw": "為什麼比常見的 slogan 清單更好用",
547
547
  },
548
548
  items: [
549
549
  {
550
- title: { en: "Results on this page, no account", zh: "本页直出,无需注册", "zh-tw": "本頁直出,無需註冊" },
550
+ title: { en: "Full results on this page", zh: "完整结果在本页展示", "zh-tw": "完整結果在本頁顯示" },
551
551
  body: {
552
- en: "Slogan creators from Shopify, Copy.ai, and Grammarly route you into a sign-up or product funnel before the full result. Here the complete list renders right below the form.",
553
- zh: "Shopify、Copy.ai、Grammarly 的 slogan 工具在给出完整结果前会把你引进注册或产品漏斗。这里的完整候选就渲染在表单下方。",
554
- "zh-tw": "Shopify、Copy.ai、Grammarly 的 slogan 工具在給出完整結果前會把你引進註冊或產品漏斗。這裡的完整候選就渲染在表單下方。",
552
+ en: "After you sign in once, the complete candidate set renders directly below the form instead of sending you to a separate editor or workflow.",
553
+ zh: "登录后,完整候选会直接显示在表单下方,不会再把你带到另一个编辑器或流程。",
554
+ "zh-tw": "登入後,完整候選會直接顯示在表單下方,不會再把你帶到另一個編輯器或流程。",
555
555
  },
556
556
  },
557
557
  {
@@ -677,14 +677,14 @@ Quality requirements:
677
677
  },
678
678
  {
679
679
  question: {
680
- en: "Is this slogan generator really free?",
681
- zh: "这个 slogan 生成器真的免费吗?",
682
- "zh-tw": "這個 slogan 生成器真的免費嗎?",
680
+ en: "Do I need an account to generate slogans?",
681
+ zh: "生成 Slogan 需要登录吗?",
682
+ "zh-tw": "產生 Slogan 需要登入嗎?",
683
683
  },
684
684
  answer: {
685
- en: "Yes no account, no credit card, and the full result renders on this page. Heavy usage is rate-limited per minute to keep the tool fast for everyone.",
686
- zh: "免费——不需要账号和信用卡,完整结果就在本页显示。为了保证所有人的速度,每分钟的生成次数有上限。",
687
- "zh-tw": "免費——不需要帳號和信用卡,完整結果就在本頁顯示。為了保證所有人的速度,每分鐘的生成次數有上限。",
685
+ en: "Yes. Sign in before generation so the model request can run securely. After sign-in, the complete candidate set and its review notes render on this page.",
686
+ zh: "需要。生成前请先登录,以便安全运行模型请求;登录后,完整候选和复核说明会直接显示在本页。",
687
+ "zh-tw": "需要。產生前請先登入,以便安全執行模型請求;登入後,完整候選與複核說明會直接顯示在本頁。",
688
688
  },
689
689
  },
690
690
  ],
@@ -21,7 +21,7 @@ const appIconResizer = {
21
21
  guide: {
22
22
  heroVisualAlt:
23
23
  "App icon asset package visual showing one source icon exported into store submission, Xcode, and Android launcher files.",
24
- workspaceHeading: "App icon package generator",
24
+ workspaceHeading: "App Icon Resizer and Asset Package",
25
25
  workspaceHint:
26
26
  "One source, one local ZIP for store and engineering handoff.",
27
27
  workspaceBadge: "PNG + ZIP",
@@ -18,7 +18,7 @@ const appStoreScreenshotGenerator = {
18
18
  "Hero visual for an app store listing image generator, showing a complete app store screenshot set.",
19
19
  workspaceHeading: "App Store Screenshot Generator",
20
20
  workspaceHint:
21
- "Upload real UI screenshots. A cloud Agent uses Skills-OL to fetch supporting context, plan the complete set, and submit live image tasks.",
21
+ "Upload real UI screenshots. An online image generation workflow reads supporting context, plans the complete set, and submits live image tasks.",
22
22
  whatYouGetHeading: "What you get after generation",
23
23
  valueVisualAlt:
24
24
  "App store listing image export bundle with phone screenshots, a feature graphic, PNG files, and SVG files.",
@@ -78,7 +78,7 @@ const appStoreScreenshotGenerator = {
78
78
  supportBody: [
79
79
  "You must upload local UI screenshots. Product URL, App Store or Google Play links, product name, and selling points provide supporting context for title, description, and page-summary clues.",
80
80
  "Apple App Store and Google Play directions are supported, including complete screenshot sets, portrait screenshots, and feature graphics.",
81
- "This version uses a cloud Agent and Skills-OL to submit live image tasks, but it does not connect to App Store Connect or Google Play Console.",
81
+ "This version uses an online image generation workflow to submit live image tasks, but it does not connect to App Store Connect or Google Play Console.",
82
82
  "If a screenshot includes test accounts, real users, private data, or unauthorized brands, redact it before use.",
83
83
  "If no result appears, check that the URL is not empty, the uploaded file is PNG/JPG/WebP, browser file reading is allowed, and the selected input source matches your data.",
84
84
  "Before real submission, review the latest platform dimensions, review policies, trademark or copyright permissions, privacy content, copy claims, and readability on target devices.",
@@ -1,8 +1,8 @@
1
1
  const coldStartChannelSelector = {
2
2
  meta: {
3
- title: "Growth Channel Strategy Generator",
4
- description: "Build an early-product growth channel strategy. Add your product, audience, time, and budget to choose the first test and the signal that guides the next step.",
5
- intro: "Choose the first growth channel to test, then use real signals to decide what comes next.",
3
+ title: "Customer Acquisition Channel Selector",
4
+ description: "Choose customer acquisition channels to test first. Add your product, audience, time, and budget to get ranked options, first actions, and validation signals.",
5
+ intro: "Choose the first customer acquisition channel to test, then use real signals to decide what comes next.",
6
6
  category: "Growth strategy tools",
7
7
  keywords: [
8
8
  "customer acquisition channels",
@@ -33,7 +33,7 @@ const coldStartChannelSelector = {
33
33
  },
34
34
  ],
35
35
  guide: {
36
- workspaceTitle: "Growth Channel Strategy",
36
+ workspaceTitle: "Choose the First Customer Acquisition Channels to Test",
37
37
  workspaceHint:
38
38
  "Add your product, customer, time, and budget. Get a growth channel strategy to test, why it fits, and the signal that tells you what to do next.",
39
39
  workspaceBadge: "Early-stage growth channel strategy",
@@ -37,10 +37,10 @@ const competitorAnalysis = {
37
37
  running: "Researching…",
38
38
  emptyTitle: "The competitor profile will appear here",
39
39
  emptyHint:
40
- "Enter a competitor URL and a cloud agent researches public signals into a structured profile.",
40
+ "Enter a competitor URL and an online research workflow turns public signals into a structured profile.",
41
41
  runningTitle: "Researching this competitor",
42
42
  runningHint:
43
- "The agent is reading the site and searching public signals for traffic, scale, team, and funding. This usually takes 1-3 minutes.",
43
+ "The research workflow is reading the site and searching public signals for traffic, scale, team, and funding. This usually takes 1-3 minutes.",
44
44
  status: {
45
45
  default: "Researching",
46
46
  PENDING: "Queued",
@@ -130,20 +130,21 @@ const competitorAnalysis = {
130
130
  workspaceHint: "Enter a public competitor URL to build a sourced profile with confidence and unknowns shown for every major finding.",
131
131
  workspaceBadge: "Public sources only",
132
132
  visualAlt: {
133
- hero: "Competitor profile report preview (visual pending)",
134
- howToUse: "Competitor analysis workflow illustration (visual pending)",
135
- result: "Competitor profile result guidance illustration (visual pending)",
133
+ hero: "Competitor profile report with sourced findings and confidence levels.",
134
+ howToUse: "Workflow from a public competitor URL to a sourced competitor profile.",
135
+ result: "Competitor findings separated into evidence, estimates, confidence, and unknowns.",
136
+ useCases: "Teams applying competitor research to positioning, pricing, and launch decisions.",
136
137
  },
137
138
  howToUseKicker: "How it works",
138
139
  howToUse: "How to analyze a competitor",
139
140
  howToUseSteps: [
140
141
  "Paste the competitor's public website URL; optionally add a name and the dimensions you care about.",
141
- "A cloud agent reads the site and searches public signals for traffic, scale, team, and funding.",
142
+ "An online research workflow reads the site and searches public signals for traffic, scale, team, and funding.",
142
143
  "Results come back as a structured profile — each dimension shows confidence and degrades instead of inventing data.",
143
144
  "Start with the overview and traffic trend, then turn “Positioning & openings” into your own positioning, pricing, or channel hypotheses.",
144
145
  ],
145
146
  runtimeNote:
146
- "Research runs on a cloud agent using public web and search only. The page renders the structured result only — no local template fallback.",
147
+ "Research runs through an online workflow using public web and search only. The page renders the structured result only — no local template fallback.",
147
148
  resultKicker: "Result guidance",
148
149
  resultGuidance: "How to read the profile",
149
150
  guidanceBullets: [
@@ -177,7 +178,7 @@ const competitorAnalysis = {
177
178
  {
178
179
  question: "Does it access private or logged-in pages?",
179
180
  answer:
180
- "No. The agent reads public pages and public search results only — it does not crawl private, authenticated, or paywalled content.",
181
+ "No. The research workflow reads public pages and public search results only — it does not crawl private, authenticated, or paywalled content.",
181
182
  },
182
183
  {
183
184
  question: "What should I do with the result?",
@@ -18,7 +18,7 @@ const emailTemplateGenerator = {
18
18
  heroImageAlt: "Visual of a rough email brief becoming MJML, HTML, plain text, variables, and an export bundle.",
19
19
  workspaceHeading: "MJML Email Template Generator",
20
20
  workspaceHint:
21
- "Describe the email goal, audience, scenario, and brand tone. The Agent returns a structured MJML-first package you can preview, revise, copy, or export.",
21
+ "Describe the email goal, audience, scenario, and brand tone. The generation workflow returns a structured MJML-first package you can preview, revise, copy, or export.",
22
22
  workspaceBadge: "MJML package",
23
23
  outputs: "What You Get",
24
24
  outputsIntro:
@@ -45,8 +45,8 @@ const emailTemplateGenerator = {
45
45
  body: "See compliance, accessibility, rendering, and missing-information notes before handing the template to development.",
46
46
  },
47
47
  {
48
- title: "Agent Revision Loop",
49
- body: "After generation, describe the exact wording or module change and regenerate a new structured result from the Agent.",
48
+ title: "Guided revision loop",
49
+ body: "After generation, describe the exact wording or module change and regenerate a new structured result.",
50
50
  },
51
51
  ],
52
52
  valueVisualAlt: "Visual of an email template package with MJML, HTML, variables, and developer handoff notes.",
@@ -72,7 +72,7 @@ const emailTemplateGenerator = {
72
72
  },
73
73
  {
74
74
  title: "Fast Iteration",
75
- body: "A rough brief can become a first package quickly, then the Agent can revise structure, wording, and sections from follow-up instructions.",
75
+ body: "A rough brief can become a first package quickly, then the generation workflow can revise structure, wording, and sections from follow-up instructions.",
76
76
  },
77
77
  {
78
78
  title: "Useful Preview",
@@ -103,7 +103,7 @@ const emailTemplateGenerator = {
103
103
  title: "How To Recover",
104
104
  items: [
105
105
  "If the result is too generic, add real product value, user segment, offer, CTA, objections, and brand examples.",
106
- "If the template feels too promotional, switch to a transactional scenario or ask the Agent to remove sales language.",
106
+ "If the template feels too promotional, switch to a transactional scenario or ask for the sales language to be removed.",
107
107
  "If a merge field or link is missing, add the required variable name and regenerate through the revision box.",
108
108
  ],
109
109
  },
@@ -153,7 +153,7 @@ const emailTemplateGenerator = {
153
153
  {
154
154
  question: "Can I edit the result?",
155
155
  answer:
156
- "Yes. You can inspect sections and send revision instructions back to the Agent. The next version is written back as a new structured result.",
156
+ "Yes. You can inspect sections and submit revision instructions. The next version is returned as a new structured result.",
157
157
  },
158
158
  {
159
159
  question: "Is the generated HTML ready to send?",
@@ -207,7 +207,7 @@ const emailTemplateGenerator = {
207
207
  emptyTitle: "Your generated package will appear here",
208
208
  emptyHint:
209
209
  "The result includes HTML preview, MJML source, HTML, plain text, variables, review notes, and export actions.",
210
- runningTitle: "The Agent is building your template package",
210
+ runningTitle: "Your template package is being generated",
211
211
  runningHint:
212
212
  "It is writing MJML, matching HTML, plain text, variables, and review notes. Short result fetch delays are normal.",
213
213
  previewInput: "Input",
@@ -248,7 +248,7 @@ const emailTemplateGenerator = {
248
248
  missing: "Missing information",
249
249
  empty: "No items returned.",
250
250
  },
251
- revisionLabel: "Ask the Agent to revise",
251
+ revisionLabel: "Revise the result",
252
252
  revisionHint: "Use a specific change request",
253
253
  revisionPlaceholder:
254
254
  "Example: Make the hero shorter, change the CTA to book a demo, and add {{calendar_url}} as a variable.",
@@ -262,12 +262,12 @@ const emailTemplateGenerator = {
262
262
  },
263
263
  errors: {
264
264
  invalid: "Add a real product name, audience, and email brief. Placeholder or numeric input cannot produce a useful template.",
265
- revision: "Write a specific revision instruction before sending it to the Agent.",
265
+ revision: "Write a specific revision instruction before submitting it.",
266
266
  copy: "Copy failed. You can still select and copy the text manually.",
267
267
  submit: "The request could not be submitted.",
268
268
  task: "The generation task failed.",
269
269
  timeout: "The structured result did not arrive in time.",
270
- schema: "The Agent returned a result that did not match the email template schema.",
270
+ schema: "The generated result could not be read safely. Please try again.",
271
271
  generic: "The template could not be generated.",
272
272
  recover:
273
273
  "Check the brief, try again, or add more concrete product, audience, CTA, and variable details.",
@@ -228,6 +228,7 @@ const productPosterGenerator = {
228
228
  "The poster image could not be generated. Simplify the benefits, choose another format, or try again later.",
229
229
  unreadableResult: "The result cannot be read right now. Try again later.",
230
230
  timeout: "Generation is taking longer than expected. Try again later.",
231
+ downloadFailed: "The PNG could not be downloaded. Try again in a moment.",
231
232
  },
232
233
  readyKicker: "Poster ready",
233
234
  readyTitle: "Product promo poster is ready",
@@ -18,7 +18,7 @@ const appStoreScreenshotGenerator = {
18
18
  "应用商店上架图生成器 Hero 视觉图,展示一套应用商店截图。",
19
19
  workspaceHeading: "App Store / Google Play 上架截图生成器",
20
20
  workspaceHint:
21
- "上传真实 UI 截图后,云端 Agent 会通过 Skills-OL 抓取补充上下文、规划完整套图并提交真实生图任务。",
21
+ "上传真实 UI 截图后,在线图像生成流程会读取补充上下文、规划完整套图并提交真实生图任务。",
22
22
  whatYouGetHeading: "生成后会得到什么",
23
23
  valueVisualAlt:
24
24
  "应用商店上架图导出包,展示多张手机截图、横版主图、PNG 和 SVG 文件。",
@@ -37,7 +37,7 @@ const appStoreScreenshotGenerator = {
37
37
  },
38
38
  {
39
39
  title: "明确的来源边界",
40
- body: "UI 截图是必填视觉来源;URL 只作为 brief 输入并由 Skills-OL 抓取公开上下文。避免使用真实用户、隐私数据或未授权品牌素材。",
40
+ body: "UI 截图是必填视觉来源;URL 仅用于读取公开上下文并补充 brief。避免使用真实用户、隐私数据或未授权品牌素材。",
41
41
  },
42
42
  {
43
43
  title: "失败原因提示",
@@ -78,7 +78,7 @@ const appStoreScreenshotGenerator = {
78
78
  supportBody: [
79
79
  "必须上传本地 UI 截图;产品 URL、App Store / Google Play 链接、产品名和卖点用于补充标题、描述和页面摘要。",
80
80
  "支持 Apple App Store 和 Google Play 两类平台方向,并提供完整截图套图、竖版截图或横版 feature graphic。",
81
- "当前会通过云端 Agent 调用 Skills-OL,再由 Skills-OL 提交真实生图任务;但不连接 App Store Connect 或 Google Play Console 后台。",
81
+ "当前通过在线图像生成流程提交真实生图任务,但不连接 App Store Connect 或 Google Play Console 后台。",
82
82
  "如果截图含测试账号、真实用户、隐私数据或未授权品牌,请先脱敏或不要上传。",
83
83
  "如果没有结果,先检查 URL 是否为空、上传文件是否为 PNG/JPG/WebP、浏览器是否阻止本地文件读取,以及是否选择了正确的输入来源。",
84
84
  "正式上架前仍要复核最新尺寸、审核政策、商标/版权授权、隐私内容、文案承诺和不同设备上的可读性。",
@@ -1,6 +1,6 @@
1
1
  const coldStartChannelSelector = {
2
2
  meta: {
3
- title: "冷启动渠道策略生成器",
3
+ title: "客户获取渠道选择器",
4
4
  description: "为早期产品制定冷启动渠道策略。填入产品、目标客户、时间和预算,获得优先测试渠道、选择理由和下一步验证信号。",
5
5
  intro: "先确定冷启动阶段最值得测试的渠道,再用真实信号决定下一步。",
6
6
  category: "增长策略工具",
@@ -33,7 +33,7 @@ const coldStartChannelSelector = {
33
33
  },
34
34
  ],
35
35
  guide: {
36
- workspaceTitle: "冷启动渠道策略",
36
+ workspaceTitle: "选择最值得先测试的客户获取渠道",
37
37
  workspaceHint:
38
38
  "输入产品、客户、时间和预算,得到适合当前阶段的冷启动渠道策略、选择理由和验证信号。",
39
39
  workspaceBadge: "早期产品冷启动渠道策略",
@@ -1,7 +1,7 @@
1
1
  const competitorAnalysis = {
2
2
  meta: {
3
3
  title: "AI 竞品分析工具",
4
- description: "输入一个竞品的网址,云端 Agent 调研公开信息,输出结构化的竞品档案:产品概览、流量与增长、业务规模、团队与融资,并附来源和可信度。",
4
+ description: "输入一个竞品的网址,在线调研流程会整理公开信息并输出结构化竞品档案:产品概览、流量与增长、业务规模、团队与融资,并附来源和可信度。",
5
5
  intro: "把一个竞品 URL 变成一页看懂的竞品档案。基于公开网页和检索的估算,每个维度都标注可信度,帮助你做定位、增长和竞争决策。",
6
6
  category: "市场调研工具",
7
7
  keywords: [
@@ -36,9 +36,9 @@ const competitorAnalysis = {
36
36
  submitting: "提交中…",
37
37
  running: "调研中…",
38
38
  emptyTitle: "竞品档案会显示在这里",
39
- emptyHint: "输入一个竞品网址,云端 Agent 会调研公开信息并生成结构化档案。",
39
+ emptyHint: "输入一个竞品网址,在线调研流程会整理公开信息并生成结构化档案。",
40
40
  runningTitle: "正在调研这个竞品",
41
- runningHint: "Agent 正在读取官网并检索公开信号,整理流量、规模、团队和融资。通常需要 1-3 分钟。",
41
+ runningHint: "调研流程正在读取官网并检索公开信号,整理流量、规模、团队和融资。通常需要 1-3 分钟。",
42
42
  status: {
43
43
  default: "调研中",
44
44
  PENDING: "排队中",
@@ -128,20 +128,21 @@ const competitorAnalysis = {
128
128
  workspaceHint: "输入竞品公开网址,生成带来源的结构化档案,并为主要发现标注可信度与未知项。",
129
129
  workspaceBadge: "仅使用公开来源",
130
130
  visualAlt: {
131
- hero: "竞品档案报告预览(配图待补)",
132
- howToUse: "竞品分析使用流程示意(配图待补)",
133
- result: "竞品档案结果解读示意(配图待补)",
131
+ hero: "包含来源与置信度的竞品档案报告。",
132
+ howToUse: "从公开竞品网址到有来源竞品档案的分析流程。",
133
+ result: "把竞品发现拆分为证据、估算、置信度与未知项。",
134
+ useCases: "团队把竞品研究用于定位、定价与发布决策。",
134
135
  },
135
136
  howToUseKicker: "使用流程",
136
137
  howToUse: "如何分析一个竞品",
137
138
  howToUseSteps: [
138
139
  "粘贴竞品的公开官网网址,可选填竞品名称和你重点关注的维度。",
139
- "提交后,云端 Agent 会读取官网并检索公开信号,整理流量、规模、团队和融资。",
140
+ "提交后,在线调研流程会读取官网并检索公开信号,整理流量、规模、团队和融资。",
140
141
  "结果以结构化档案返回:每个维度都带可信度,数据缺失时降级而非编造。",
141
142
  "先看概览和流量趋势,再把“定位与机会”转成你的定位、定价或渠道假设。",
142
143
  ],
143
144
  runtimeNote:
144
- "调研由云端 Agent 完成,仅基于公开网页和检索的估算。页面只渲染结构化结果,不提供本地模板兜底。",
145
+ "调研通过在线流程完成,仅基于公开网页和检索结果进行估算。页面只展示结构化结果,不提供本地模板兜底。",
145
146
  resultKicker: "结果解读",
146
147
  resultGuidance: "如何看懂竞品档案",
147
148
  guidanceBullets: [
@@ -172,7 +173,7 @@ const competitorAnalysis = {
172
173
  },
173
174
  {
174
175
  question: "会处理私有或登录后的页面吗?",
175
- answer: "不会。Agent 只读取公开页面和公开检索结果,不抓取私有、登录或付费墙后的内容。",
176
+ answer: "不会。调研流程只读取公开页面和公开检索结果,不抓取私有、登录或付费墙后的内容。",
176
177
  },
177
178
  {
178
179
  question: "拿到结果后该做什么?",
@@ -1,7 +1,7 @@
1
1
  const emailTemplateGenerator = {
2
2
  meta: {
3
3
  title: "邮件模板生成器",
4
- description: "输入营销或高频交易邮件需求,由在线 Agent 生成 MJML-first 邮件模板包,包含可预览 HTML、纯文本、变量、复核项和开发交付说明。",
4
+ description: "输入营销或高频交易邮件需求,由在线生成流程产出 MJML-first 邮件模板包,包含可预览 HTML、纯文本、变量、复核项和开发交付说明。",
5
5
  intro: "把粗略邮件需求转成可预览、可修改、可导出的 MJML 邮件模板包,适合营销活动、验证码、账单、订阅成功和账号通知等场景。",
6
6
  category: "营销工具",
7
7
  keywords: [
@@ -18,7 +18,7 @@ const emailTemplateGenerator = {
18
18
  heroImageAlt: "粗略邮件需求转成 MJML、HTML、纯文本、变量和导出包的视觉图。",
19
19
  workspaceHeading: "MJML 邮件模板生成器",
20
20
  workspaceHint:
21
- "描述邮件目标、受众、场景和品牌语气,Agent 会返回结构化的 MJML-first 邮件模板包,可预览、修改、复制和导出。",
21
+ "描述邮件目标、受众、场景和品牌语气,生成流程会返回结构化的 MJML-first 邮件模板包,可预览、修改、复制和导出。",
22
22
  workspaceBadge: "MJML 模板包",
23
23
  outputs: "你会得到什么",
24
24
  outputsIntro:
@@ -45,8 +45,8 @@ const emailTemplateGenerator = {
45
45
  body: "在交付开发前看到营销合规、无障碍、渲染兼容和缺失信息等检查项。",
46
46
  },
47
47
  {
48
- title: "Agent 修改循环",
49
- body: "生成后可以描述要改的文案、模块或结构,重新由 Agent 写回新的结构化结果。",
48
+ title: "引导式修改流程",
49
+ body: "生成后可以描述要改的文案、模块或结构,再生成一份新的结构化结果。",
50
50
  },
51
51
  ],
52
52
  valueVisualAlt: "包含 MJML、HTML、变量和开发交付说明的邮件模板包视觉图。",
@@ -72,7 +72,7 @@ const emailTemplateGenerator = {
72
72
  },
73
73
  {
74
74
  title: "迭代速度快",
75
- body: "粗略 brief 可以先生成第一版,再通过 Agent 修改结构、措辞和模块。",
75
+ body: "粗略 brief 可以先生成第一版,再通过后续要求修改结构、措辞和模块。",
76
76
  },
77
77
  {
78
78
  title: "预览真实有用",
@@ -103,7 +103,7 @@ const emailTemplateGenerator = {
103
103
  title: "失败时怎么恢复",
104
104
  items: [
105
105
  "如果结果太泛,补充真实产品价值、用户分群、优惠内容、CTA、反对意见和品牌示例。",
106
- "如果交易邮件显得过度营销,切换到交易场景,或要求 Agent 移除销售性措辞。",
106
+ "如果交易邮件显得过度营销,切换到交易场景,或在修改要求中说明移除销售性措辞。",
107
107
  "如果缺少变量或链接,把需要的变量名写进修改要求,再通过修改框重新生成。",
108
108
  ],
109
109
  },
@@ -153,7 +153,7 @@ const emailTemplateGenerator = {
153
153
  {
154
154
  question: "生成后可以修改吗?",
155
155
  answer:
156
- "可以。你可以查看模块,并把修改要求发回 Agent。下一版会作为新的结构化结果写回。",
156
+ "可以。你可以查看模块并提交修改要求,下一版会以新的结构化结果返回。",
157
157
  },
158
158
  {
159
159
  question: "生成的 HTML 可以直接发送吗?",
@@ -207,7 +207,7 @@ const emailTemplateGenerator = {
207
207
  emptyTitle: "生成结果会显示在这里",
208
208
  emptyHint:
209
209
  "结果包含 HTML 预览、MJML 源码、HTML、纯文本、变量、复核说明和导出动作。",
210
- runningTitle: "Agent 正在生成邮件模板包",
210
+ runningTitle: "正在生成邮件模板包",
211
211
  runningHint:
212
212
  "它会生成 MJML、匹配的 HTML、纯文本、变量和复核说明。结构化结果短暂延迟是正常的。",
213
213
  previewInput: "输入",
@@ -248,7 +248,7 @@ const emailTemplateGenerator = {
248
248
  missing: "缺失信息",
249
249
  empty: "没有返回相关项目。",
250
250
  },
251
- revisionLabel: "让 Agent 修改",
251
+ revisionLabel: "修改结果",
252
252
  revisionHint: "写具体修改要求",
253
253
  revisionPlaceholder:
254
254
  "例如:缩短首屏,把 CTA 改成预约演示,并增加 {{calendar_url}} 变量。",
@@ -262,12 +262,12 @@ const emailTemplateGenerator = {
262
262
  },
263
263
  errors: {
264
264
  invalid: "请填写真实产品名称、目标受众和邮件需求。占位或纯数字输入无法生成有用模板。",
265
- revision: "发送给 Agent 前,请写清楚具体修改要求。",
265
+ revision: "提交前,请写清楚具体修改要求。",
266
266
  copy: "复制失败。你仍然可以手动选中文本复制。",
267
267
  submit: "请求提交失败。",
268
268
  task: "生成任务失败。",
269
269
  timeout: "结构化结果没有在限定时间内返回。",
270
- schema: "Agent 返回的结果不符合邮件模板 schema。",
270
+ schema: "生成结果格式无法安全读取,请重试。",
271
271
  generic: "邮件模板生成失败。",
272
272
  recover:
273
273
  "请检查邮件需求,或补充更具体的产品、受众、CTA 和变量信息后重试。",
@@ -219,6 +219,7 @@ const productPosterGenerator = {
219
219
  imageFailed: "海报图没有生成成功。可以简化卖点、换一个尺寸,或稍后再试。",
220
220
  unreadableResult: "结果暂时无法读取。请稍后重试。",
221
221
  timeout: "生成时间较长。请稍后重试。",
222
+ downloadFailed: "PNG 下载失败,请稍后重试。",
222
223
  },
223
224
  readyKicker: "海报已生成",
224
225
  readyTitle: "产品宣传海报图已生成",