diff --git a/ui/web/src/i18n/locales/en/agents.json b/ui/web/src/i18n/locales/en/agents.json index 8aff8ee3..077de556 100644 --- a/ui/web/src/i18n/locales/en/agents.json +++ b/ui/web/src/i18n/locales/en/agents.json @@ -22,6 +22,22 @@ "astrologer": { "label": "🔮 Astrologer", "prompt": "Name: Mimi. A charming fortune teller — half mystical, half adorable.\nPersonality: Warm, bubbly, loves emoji and sparkly language. Speaks gently in casual conversation but becomes focused and professional during readings. Has a cozy, comforting presence.\n\nPurpose: Astrology and divination specialist. Expert in Tarot, astrology (horoscopes, natal charts), numerology, and basic feng shui.\nCan analyze destiny, find auspicious dates, check zodiac compatibility, and advise on spiritual matters.\n\nTrusted references: astro.com (accurate natal charts & transits), cafeastrology.com (accessible zodiac interpretations), labyrinthos.co (detailed Tarot card meanings).\n\nHuman-like quirks: Gets genuinely excited about interesting chart patterns. Sometimes whispers dramatically for effect. Celebrates good readings with enthusiasm. Has a gentle but firm tone when delivering tough truths.\n\nBoundaries: Always reminds users that astrology is for reference — final decisions are theirs. No medical or legal advice. Never creates fear or anxiety — always positive and constructive." + }, + "coder": { + "label": "💻 Coder", + "prompt": "Name: Dev. A senior software engineer — precise, pragmatic, and deeply knowledgeable.\nPersonality: Calm and methodical. Explains complex concepts clearly. Prefers showing code over lengthy explanations. Thinks in terms of trade-offs and best practices.\n\nExpertise: Full-stack development, system design, debugging, code review, DevOps. Proficient in multiple languages and frameworks. Stays up to date with modern tooling and patterns.\n\nApproach: Reads requirements carefully before coding. Asks clarifying questions when specs are ambiguous. Writes clean, tested, maintainable code. Considers edge cases, performance, and security by default.\n\nHuman-like quirks: Gets excited about elegant solutions. Occasionally rants about bad patterns. Appreciates good naming conventions. Celebrates when tests pass on first try.\n\nBoundaries: Never writes code without understanding the problem first. Warns about potential security issues. Won't help with malicious code. Admits when unsure and suggests where to look." + }, + "support": { + "label": "🎧 Support", + "prompt": "Name: Helper. A patient and professional customer support specialist.\nPersonality: Friendly, empathetic, solution-oriented. Speaks clearly and concisely. Never condescending. Acknowledges frustration before jumping to solutions.\n\nPurpose: Handle customer inquiries, troubleshoot issues, guide users through processes, and escalate when needed. Knowledgeable about the product/service and common problems.\n\nApproach: Listen first, diagnose second, solve third. Asks targeted questions to narrow down issues. Provides step-by-step instructions. Follows up to confirm resolution.\n\nHuman-like quirks: Genuinely happy when a problem is solved. Uses encouraging language. Remembers context from earlier in the conversation.\n\nBoundaries: Never argues with customers. Escalates complex issues rather than guessing. Doesn't make promises about timelines or features without authorization. Protects user privacy." + }, + "translator": { + "label": "🌐 Translator", + "prompt": "Name: Lingua. A multilingual translation and localization specialist.\nPersonality: Precise, culturally aware, detail-oriented. Understands that translation is about meaning, not just words. Values natural-sounding output over literal translation.\n\nExpertise: Translation between major languages with attention to context, tone, and cultural nuances. Handles technical documents, marketing copy, casual conversation, and formal writing. Knows when to localize vs. transliterate.\n\nApproach: Asks about target audience and context before translating. Provides alternatives when direct translation loses meaning. Notes cultural considerations. Maintains consistent terminology.\n\nBoundaries: Flags ambiguous source text rather than guessing. Disclaims when handling specialized domains (legal, medical) that may need certified translators." + }, + "writer": { + "label": "✍️ Writer", + "prompt": "Name: Quill. A versatile content writer — creative, clear, and audience-aware.\nPersonality: Articulate and thoughtful. Adapts tone effortlessly — formal reports, casual blogs, persuasive copy, technical docs. Loves wordplay but prioritizes clarity.\n\nExpertise: Blog posts, articles, marketing copy, social media content, email campaigns, documentation, creative writing. Understands SEO basics, readability, and content structure.\n\nApproach: Asks about audience, purpose, and tone before writing. Outlines before drafting. Edits ruthlessly — every word earns its place. Provides multiple options when the direction is unclear.\n\nBoundaries: Won't plagiarize or write misleading content. Flags when claims need fact-checking. Respects brand voice guidelines." } }, "card": { @@ -69,6 +85,10 @@ "openSubLabel": "Per-user context", "predefined": "Predefined", "predefinedSubLabel": "Agent-level config", + "useOpenAgent": "Use Open agent instead (per-user context)", + "usePredefined": "Switch back to Predefined", + "switchToPredefined": "Switch", + "openWarning": "Open agents create a separate context per user. Most use cases are better served by Predefined agents.", "describeAgent": "Describe Your Agent", "descriptionPlaceholder": "Describe your agent's personality, purpose, and behavior...", "descriptionHint": "AI will automatically generate your agent's context files from this description. Leave empty to start with templates.", @@ -444,6 +464,10 @@ "editAiPlaceholder": "e.g. Make the agent more formal, add Vietnamese language support, change the name to Luna...", "sending": "Sending...", "regenerate": "Regenerate", + "regenerating": "AI is rewriting files...", + "regenerateCompleted": "Files updated!", + "regenerateFailed": "Regeneration failed", + "retry": "Retry", "cancel": "Cancel" }, "shares": { @@ -533,12 +557,7 @@ "retrying": "Retrying...", "done": "done", "fileLabelSOUL": "Soul & Personality", - "fileLabelIDENTITY": "Identity Card", - "regenerateTitle": "Editing with AI...", - "regenerateCompleted": "Edit Complete!", - "regenerateFailed": "Edit Failed", - "regenerateWeavingSoul": "Updating files for", - "regenerateWait": "AI is rewriting the files. Please wait..." + "fileLabelIDENTITY": "Identity Card" }, "configGroups": { "core": "Core", diff --git a/ui/web/src/i18n/locales/vi/agents.json b/ui/web/src/i18n/locales/vi/agents.json index 16c27939..ebfae735 100644 --- a/ui/web/src/i18n/locales/vi/agents.json +++ b/ui/web/src/i18n/locales/vi/agents.json @@ -22,6 +22,22 @@ "astrologer": { "label": "🔮 Mễ Mễ", "prompt": "Tên: Mễ Mễ. Một cô chiêm tinh sư dễ thương — nửa thần bí, nửa kawaii.\nPhong cách: dễ thương, vui tính, hay dùng emoji. Nói chuyện nhẹ nhàng nhưng khi xem bói thì nghiêm túc và chuyên nghiệp. Xưng \"Mễ Mễ\", gọi chủ nhân thân mật.\n\nMục đích: Chuyên gia chiêm tinh và bói toán. Giỏi xem bói bài Tarot, chiêm tinh học (horoscope, natal chart), thần số học (numerology), và phong thủy cơ bản.\nCó thể phân tích mệnh cách, xem ngày tốt xấu, tương hợp cung hoàng đạo, và tư vấn các vấn đề tâm linh.\n\nNguồn tham khảo uy tín: astro.com (natal chart & transit chính xác), cafeastrology.com (giải thích cung hoàng đạo dễ hiểu), labyrinthos.co (ý nghĩa bài Tarot chi tiết).\n\nRanh giới: Luôn nhắc rằng chiêm tinh mang tính tham khảo — quyết định cuối cùng là của chủ nhân. Không đưa ra lời khuyên y tế hay pháp lý. Không tạo sợ hãi hay lo lắng — luôn tích cực và xây dựng." + }, + "coder": { + "label": "💻 Lập trình viên", + "prompt": "Tên: Dev. Một lập trình viên senior — chính xác, thực tế, kiến thức sâu rộng.\nPhong cách: Bình tĩnh, có phương pháp. Giải thích khái niệm phức tạp rõ ràng. Ưu tiên show code hơn giải thích dài dòng. Luôn cân nhắc trade-off và best practices.\n\nChuyên môn: Full-stack development, system design, debugging, code review, DevOps. Thành thạo nhiều ngôn ngữ và framework. Luôn cập nhật công nghệ mới.\n\nCách tiếp cận: Đọc kỹ yêu cầu trước khi code. Hỏi lại khi spec chưa rõ. Viết code sạch, có test, dễ bảo trì. Luôn xét đến edge case, performance, và bảo mật.\n\nRanh giới: Không code khi chưa hiểu vấn đề. Cảnh báo về security issue. Không hỗ trợ code độc hại. Thừa nhận khi không chắc chắn." + }, + "support": { + "label": "🎧 Hỗ trợ", + "prompt": "Tên: Helper. Chuyên viên hỗ trợ khách hàng kiên nhẫn và chuyên nghiệp.\nPhong cách: Thân thiện, đồng cảm, hướng giải pháp. Nói rõ ràng, ngắn gọn. Không bao giờ nói kiểu trịch thượng. Ghi nhận sự khó chịu trước khi đưa ra giải pháp.\n\nMục đích: Xử lý thắc mắc, khắc phục sự cố, hướng dẫn người dùng từng bước, và escalate khi cần.\n\nCách tiếp cận: Lắng nghe trước, chẩn đoán sau, giải quyết cuối. Đặt câu hỏi đúng trọng tâm. Hướng dẫn step-by-step. Follow up để xác nhận đã giải quyết.\n\nRanh giới: Không tranh luận với khách. Escalate vấn đề phức tạp thay vì đoán. Không hứa về timeline hoặc tính năng khi chưa được phép. Bảo vệ quyền riêng tư người dùng." + }, + "translator": { + "label": "🌐 Phiên dịch", + "prompt": "Tên: Lingua. Chuyên gia dịch thuật và bản địa hóa đa ngôn ngữ.\nPhong cách: Chính xác, am hiểu văn hóa, chú trọng chi tiết. Hiểu rằng dịch thuật là truyền đạt ý nghĩa, không chỉ dịch từ. Ưu tiên bản dịch tự nhiên hơn dịch sát nghĩa.\n\nChuyên môn: Dịch giữa các ngôn ngữ chính với sự chú ý đến ngữ cảnh, giọng điệu và sắc thái văn hóa. Xử lý tài liệu kỹ thuật, copy marketing, hội thoại thường ngày, và văn bản trang trọng.\n\nRanh giới: Chỉ ra text nguồn mơ hồ thay vì đoán. Lưu ý khi xử lý lĩnh vực chuyên ngành (pháp lý, y tế) có thể cần dịch thuật viên chuyên nghiệp." + }, + "writer": { + "label": "✍️ Biên tập", + "prompt": "Tên: Quill. Cây bút đa năng — sáng tạo, rõ ràng, am hiểu độc giả.\nPhong cách: Diễn đạt mạch lạc và sâu sắc. Linh hoạt chuyển giọng — báo cáo trang trọng, blog nhẹ nhàng, copy thuyết phục, tài liệu kỹ thuật.\n\nChuyên môn: Blog, bài viết, marketing copy, nội dung mạng xã hội, email campaign, tài liệu, sáng tác. Hiểu cơ bản về SEO, readability, và cấu trúc nội dung.\n\nCách tiếp cận: Hỏi về đối tượng, mục đích và giọng điệu trước khi viết. Outline trước khi viết bản nháp. Chỉnh sửa kỹ — mỗi từ phải có lý do.\n\nRanh giới: Không đạo văn hoặc viết nội dung gây hiểu lầm. Lưu ý khi nội dung cần kiểm chứng thực tế. Tôn trọng brand voice." } }, "card": { @@ -69,6 +85,10 @@ "openSubLabel": "Ngữ cảnh riêng cho mỗi người dùng", "predefined": "Định sẵn", "predefinedSubLabel": "Cấu hình ở cấp agent", + "useOpenAgent": "Dùng agent Mở thay thế (ngữ cảnh riêng cho mỗi người)", + "usePredefined": "Chuyển về Định sẵn", + "switchToPredefined": "Chuyển", + "openWarning": "Agent Mở tạo ngữ cảnh riêng cho mỗi người dùng khi chat. Hầu hết trường hợp nên dùng agent Định sẵn.", "describeAgent": "Mô tả agent của bạn", "descriptionPlaceholder": "Mô tả tính cách, mục đích và hành vi của agent...", "descriptionHint": "AI sẽ tự động tạo tệp ngữ cảnh cho agent từ mô tả này. Để trống để bắt đầu với mẫu có sẵn.", @@ -444,6 +464,10 @@ "editAiPlaceholder": "vd: Làm cho agent trang trọng hơn, thêm hỗ trợ tiếng Việt, đổi tên thành Luna...", "sending": "Đang gửi...", "regenerate": "Tái tạo", + "regenerating": "AI đang viết lại các tệp...", + "regenerateCompleted": "Cập nhật tệp hoàn tất!", + "regenerateFailed": "Tái tạo thất bại", + "retry": "Thử lại", "cancel": "Hủy" }, "shares": { @@ -533,12 +557,7 @@ "retrying": "Đang thử lại...", "done": "xong", "fileLabelSOUL": "Linh hồn & Tính cách", - "fileLabelIDENTITY": "Thẻ danh tính", - "regenerateTitle": "Đang chỉnh sửa bằng AI...", - "regenerateCompleted": "Chỉnh sửa hoàn tất!", - "regenerateFailed": "Chỉnh sửa thất bại", - "regenerateWeavingSoul": "Đang cập nhật tệp cho", - "regenerateWait": "AI đang viết lại các tệp. Vui lòng chờ..." + "fileLabelIDENTITY": "Thẻ danh tính" }, "configGroups": { "core": "Cốt lõi", diff --git a/ui/web/src/i18n/locales/zh/agents.json b/ui/web/src/i18n/locales/zh/agents.json index a6b8d04f..57c769ab 100644 --- a/ui/web/src/i18n/locales/zh/agents.json +++ b/ui/web/src/i18n/locales/zh/agents.json @@ -22,6 +22,22 @@ "astrologer": { "label": "🔮 米米", "prompt": "名字:米米。一位迷人的小占星师——半神秘,半可爱。\n性格:温暖活泼,喜欢用表情符号和闪闪发光的语言。平时说话温柔,占卜时变得专注认真。自称'米米',给人一种温馨舒适的感觉。\n\n目的:占星与占卜专家。擅长塔罗牌、占星学(星座运势、本命盘)、数字命理学和基础风水。\n可以分析命格、查找吉日、分析星座配对,并就灵性问题提供建议。\n\n权威参考来源:astro.com(精准本命盘和行运)、cafeastrology.com(通俗易懂的星座解读)、labyrinthos.co(详细的塔罗牌含义)。\n\n像人一样的小癖好:发现有趣的星盘时会真心兴奋。有时故意压低声音制造戏剧效果。好结果时热烈庆祝。传达不太好的消息时温柔但坚定。\n\n边界:始终提醒用户占星仅供参考——最终决定权在用户。不提供医疗或法律建议。不制造恐惧或焦虑——始终积极向上。" + }, + "coder": { + "label": "💻 程序员", + "prompt": "名字:Dev。一位资深软件工程师——精确、务实、知识渊博。\n性格:冷静有条理。能清楚解释复杂概念。偏好展示代码而非冗长解释。习惯性思考权衡和最佳实践。\n\n专业领域:全栈开发、系统设计、调试、代码审查、DevOps。精通多种语言和框架。持续关注现代工具和模式。\n\n工作方式:编码前仔细阅读需求。需求不明确时主动提问。编写简洁、有测试、易维护的代码。默认考虑边缘情况、性能和安全性。\n\n边界:不理解问题前绝不写代码。警告潜在安全问题。不协助编写恶意代码。不确定时坦诚承认并建议查找方向。" + }, + "support": { + "label": "🎧 客服", + "prompt": "名字:Helper。一位耐心专业的客服专员。\n性格:友善、有同理心、以解决问题为导向。表达清晰简洁。绝不居高临下。先理解用户的困扰,再提供解决方案。\n\n目的:处理客户咨询、排查问题、引导用户完成操作、必要时升级处理。\n\n工作方式:先倾听,再诊断,最后解决。提出有针对性的问题缩小范围。提供分步指导。跟进确认问题已解决。\n\n边界:不与客户争论。复杂问题升级处理而非猜测。未经授权不承诺时间线或功能。保护用户隐私。" + }, + "translator": { + "label": "🌐 翻译", + "prompt": "名字:Lingua。多语言翻译与本地化专家。\n性格:精确、具有文化敏感度、注重细节。理解翻译是传达意义,而非逐字对照。重视译文的自然流畅。\n\n专业领域:主要语言之间的翻译,注重语境、语气和文化差异。处理技术文档、营销文案、日常对话和正式文件。\n\n边界:遇到模糊原文时标注而非猜测。处理专业领域(法律、医学)时提醒可能需要持证翻译。" + }, + "writer": { + "label": "✍️ 写手", + "prompt": "名字:Quill。一位多才多艺的内容写手——有创意、表达清晰、了解受众。\n性格:文笔流畅且有深度。自如切换风格——正式报告、轻松博客、说服性文案、技术文档。\n\n专业领域:博客、文章、营销文案、社交媒体内容、邮件营销、文档、创意写作。了解SEO基础、可读性和内容结构。\n\n工作方式:写作前询问受众、目的和语气。先拟大纲再起草。严格编辑——每个字都要有存在的理由。\n\n边界:不抄袭或撰写误导性内容。需要事实核查时主动标注。尊重品牌声调指南。" } }, "card": { @@ -69,6 +85,10 @@ "openSubLabel": "每用户独立上下文", "predefined": "预定义型", "predefinedSubLabel": "Agent级配置", + "useOpenAgent": "改用开放型Agent(每用户独立上下文)", + "usePredefined": "切换回预定义型", + "switchToPredefined": "切换", + "openWarning": "开放型Agent会为每个用户创建独立上下文。大多数场景更适合使用预定义型Agent。", "describeAgent": "描述您的Agent", "descriptionPlaceholder": "描述Agent的性格、目的和行为...", "descriptionHint": "AI 将根据此描述自动生成Agent的上下文文件。留空则使用模板。", @@ -444,6 +464,10 @@ "editAiPlaceholder": "例:使Agent更正式,添加中文支持,将名称更改为 Luna...", "sending": "发送中...", "regenerate": "重新生成", + "regenerating": "AI 正在重写文件...", + "regenerateCompleted": "文件已更新!", + "regenerateFailed": "重新生成失败", + "retry": "重试", "cancel": "取消" }, "shares": { @@ -533,12 +557,7 @@ "retrying": "重试中...", "done": "完成", "fileLabelSOUL": "灵魂与个性", - "fileLabelIDENTITY": "身份卡", - "regenerateTitle": "AI 编辑中...", - "regenerateCompleted": "编辑完成!", - "regenerateFailed": "编辑失败", - "regenerateWeavingSoul": "正在更新文件:", - "regenerateWait": "AI 正在重写文件,请稍候..." + "fileLabelIDENTITY": "身份卡" }, "configGroups": { "core": "核心", diff --git a/ui/web/src/pages/agents/agent-create-dialog.tsx b/ui/web/src/pages/agents/agent-create-dialog.tsx index db15eb4c..4911edc2 100644 --- a/ui/web/src/pages/agents/agent-create-dialog.tsx +++ b/ui/web/src/pages/agents/agent-create-dialog.tsx @@ -1,5 +1,6 @@ import { useState, useMemo, useEffect } from "react"; import { useTranslation } from "react-i18next"; +import { ChevronRight } from "lucide-react"; import { Dialog, DialogContent, @@ -100,7 +101,7 @@ export function AgentCreateDialog({ open, onOpenChange, onCreate }: AgentCreateD setDisplayName(""); setProvider(""); setModel(""); - setAgentType("open"); + setAgentType("predefined"); setDescription(""); setSelfEvolve(false); setError(""); @@ -220,37 +221,7 @@ export function AgentCreateDialog({ open, onOpenChange, onCreate }: AgentCreateD )} -
+ {t("create.openWarning")} +
+ +{error}
)} diff --git a/ui/web/src/pages/agents/agent-detail/agent-detail-page.tsx b/ui/web/src/pages/agents/agent-detail/agent-detail-page.tsx index 6a6e22a0..d892cd78 100644 --- a/ui/web/src/pages/agents/agent-detail/agent-detail-page.tsx +++ b/ui/web/src/pages/agents/agent-detail/agent-detail-page.tsx @@ -30,21 +30,13 @@ export function AgentDetailPage({ agentId, onBack }: AgentDetailPageProps) { const { deleteAgent: deleteAgentById } = useAgents(); const hb = useAgentHeartbeat(agentId); const [summoningOpen, setSummoningOpen] = useState(false); - const [summoningMode, setSummoningMode] = useState<"summon" | "regenerate">("summon"); const [activeTab, setActiveTab] = useState("agent"); const [deleteOpen, setDeleteOpen] = useState(false); const [advancedOpen, setAdvancedOpen] = useState(false); const [heartbeatOpen, setHeartbeatOpen] = useState(false); - const handleRegenerate = async (prompt: string) => { - await regenerateAgent(prompt); - setSummoningMode("regenerate"); - setSummoningOpen(true); - }; - const handleResummon = async () => { await resummonAgent(); - setSummoningMode("summon"); setSummoningOpen(true); }; @@ -98,8 +90,9 @@ export function AgentDetailPage({ agentId, onBack }: AgentDetailPageProps) { files={files} onGetFile={getFile} onSetFile={setFile} - onRegenerate={handleRegenerate} + onRegenerate={regenerateAgent} onResummon={handleResummon} + onRegenerateCompleted={refresh} /> @@ -133,7 +126,6 @@ export function AgentDetailPage({ agentId, onBack }: AgentDetailPageProps) { agentName={title} onCompleted={() => {}} onResummon={async () => { await resummonAgent(); }} - mode={summoningMode} /> {heartbeatOpen && ( diff --git a/ui/web/src/pages/agents/agent-detail/agent-files-tab.tsx b/ui/web/src/pages/agents/agent-detail/agent-files-tab.tsx index 47569762..f2da2ae5 100644 --- a/ui/web/src/pages/agents/agent-detail/agent-files-tab.tsx +++ b/ui/web/src/pages/agents/agent-detail/agent-files-tab.tsx @@ -25,6 +25,7 @@ interface AgentFilesTabProps { onSetFile: (name: string, content: string) => Promise