fix(ui): remove USER_PREDEFINED from summoning, refine canvas dots, require team members

- Remove USER_PREDEFINED.md from summoning file list (web + desktop)
- Soften canvas-dots pattern (smaller dots, wider spacing)
- Require at least 1 member when creating a team
- Prevent removing the last non-lead member from team
This commit is contained in:
viettranx committed 2026-03-27 18:01:00 +07:00
1 parent 39ffe6e78f
commit 343ad0c2b1
17 files changed
+17 -22

No files matched your search

@@ -6,7 +6,6 @@ import { getWsClient } from '../../lib/ws'
const SUMMONING_FILE_KEYS = [
{ name: 'SOUL.md', required: true, labelKey: 'summoning.fileLabelSOUL' },
{ name: 'IDENTITY.md', required: true, labelKey: 'summoning.fileLabelIDENTITY' },
{ name: 'USER_PREDEFINED.md', required: false, labelKey: 'summoning.fileLabelUSER_PREDEFINED' },
]
interface SummoningModalProps {
@@ -286,8 +286,7 @@
"retrying": "Retrying...",
"done": "done",
"fileLabelSOUL": "Soul & Personality",
"fileLabelIDENTITY": "Identity Card",
"fileLabelUSER_PREDEFINED": "Default User Context"
"fileLabelIDENTITY": "Identity Card"
},
"configGroups": {
"core": "Core",
@@ -25,7 +25,6 @@
"wait": "This may take a moment",
"fileLabelSOUL": "Core personality",
"fileLabelIDENTITY": "Identity & knowledge",
"fileLabelUSER_PREDEFINED": "User context",
"agentReady": "{{name}} is ready!",
"retrying": "Retrying..."
},
@@ -286,8 +286,7 @@
"retrying": "Đang thử lại...",
"done": "xong",
"fileLabelSOUL": "Linh hồn & Tính cách",
"fileLabelIDENTITY": "Thẻ danh tính",
"fileLabelUSER_PREDEFINED": "Ngữ cảnh người dùng mặc định"
"fileLabelIDENTITY": "Thẻ danh tính"
},
"configGroups": {
"core": "Cốt lõi",
@@ -25,7 +25,6 @@
"wait": "Có thể mất một lúc",
"fileLabelSOUL": "Tính cách cốt lõi",
"fileLabelIDENTITY": "Danh tính & kiến thức",
"fileLabelUSER_PREDEFINED": "Ngữ cảnh người dùng",
"agentReady": "{{name}} đã sẵn sàng!",
"retrying": "Đang thử lại..."
},
@@ -286,8 +286,7 @@
"retrying": "重试中...",
"done": "完成",
"fileLabelSOUL": "灵魂与个性",
"fileLabelIDENTITY": "身份卡",
"fileLabelUSER_PREDEFINED": "默认用户上下文"
"fileLabelIDENTITY": "身份卡"
},
"configGroups": {
"core": "核心",
@@ -25,7 +25,6 @@
"wait": "这可能需要一点时间",
"fileLabelSOUL": "核心个性",
"fileLabelIDENTITY": "身份与知识",
"fileLabelUSER_PREDEFINED": "用户上下文",
"agentReady": "{{name}} 已就绪!",
"retrying": "重试中..."
},
+3 -3
View File
@@ -68,11 +68,11 @@
/* Floating panel design system */
.canvas-dots {
background-image: radial-gradient(circle, oklch(0.26 0.02 45) 0.8px, transparent 0.8px);
background-size: 28px 28px;
background-image: radial-gradient(circle, oklch(0.22 0.01 45) 0.5px, transparent 0.5px);
background-size: 36px 36px;
}
:root:not(.dark) .canvas-dots {
background-image: radial-gradient(circle, oklch(0.86 0.01 70) 0.8px, transparent 0.8px);
background-image: radial-gradient(circle, oklch(0.90 0.005 70) 0.5px, transparent 0.5px);
}
.floating-panel {
background: var(--color-surface-secondary);
+1 -2
View File
@@ -533,8 +533,7 @@
"retrying": "Retrying...",
"done": "done",
"fileLabelSOUL": "Soul & Personality",
"fileLabelIDENTITY": "Identity Card",
"fileLabelUSER_PREDEFINED": "Default User Context"
"fileLabelIDENTITY": "Identity Card"
},
"configGroups": {
"core": "Core",
+1
View File
@@ -310,6 +310,7 @@
"noActiveAgents": "No active agents found. Create agents first.",
"members": "Members",
"membersTooltip": "Only predefined agents can be added as team members. Open agents are per-user and lack shared context needed for team collaboration.",
"needMembers": "Select at least 1 member for the team",
"searchMembers": "Search and add members...",
"displayName": "Display Name",
"displayNamePlaceholder": "Support Team",
+1 -2
View File
@@ -533,8 +533,7 @@
"retrying": "Đang thử lại...",
"done": "xong",
"fileLabelSOUL": "Linh hồn & Tính cách",
"fileLabelIDENTITY": "Thẻ danh tính",
"fileLabelUSER_PREDEFINED": "Ngữ cảnh người dùng mặc định"
"fileLabelIDENTITY": "Thẻ danh tính"
},
"configGroups": {
"core": "Cốt lõi",
+1
View File
@@ -310,6 +310,7 @@
"noActiveAgents": "Không tìm thấy agent hoạt động. Hãy tạo agent trước.",
"members": "Thành viên",
"membersTooltip": "Chỉ có agent được định nghĩa sẵn mới có thể được thêm vào nhóm. Agent mở là per-user và thiếu ngữ cảnh dùng chung.",
"needMembers": "Chọn ít nhất 1 thành viên cho nhóm",
"searchMembers": "Tìm kiếm và thêm thành viên...",
"displayName": "Tên hiển thị",
"displayNamePlaceholder": "Support Team",
+1 -2
View File
@@ -533,8 +533,7 @@
"retrying": "重试中...",
"done": "完成",
"fileLabelSOUL": "灵魂与个性",
"fileLabelIDENTITY": "身份卡",
"fileLabelUSER_PREDEFINED": "默认用户上下文"
"fileLabelIDENTITY": "身份卡"
},
"configGroups": {
"core": "核心",
+1
View File
@@ -310,6 +310,7 @@
"noActiveAgents": "未找到活跃Agent,请先创建Agent。",
"members": "成员",
"membersTooltip": "只有预定义Agent才能作为Team成员添加。开放Agent是按用户划分的,缺乏Team协作所需的共享上下文。",
"needMembers": "请至少选择1名团队成员",
"searchMembers": "搜索并添加成员...",
"displayName": "显示名称",
"displayNamePlaceholder": "支持Team",
@@ -24,7 +24,6 @@ interface SummoningModalProps {
const SUMMONING_FILES = [
{ name: "SOUL.md", required: true },
{ name: "IDENTITY.md", required: true },
{ name: "USER_PREDEFINED.md", required: false },
];
export function SummoningModal({
@@ -57,7 +57,7 @@ export function MemberList({ members, onRemove }: MemberListProps) {
{member.role}
</Badge>
<div className="flex justify-center">
{member.role !== "lead" && onRemove && (
{member.role !== "lead" && onRemove && members.filter((m) => m.role !== "lead").length > 1 && (
<button
type="button"
onClick={() => onRemove(member.agent_id)}
@@ -193,13 +193,16 @@ export function TeamCreateDialog({ open, onOpenChange, onCreate }: TeamCreateDia
))}
</div>
)}
{lead && members.length === 0 && memberOptions.length > 0 && (
<p className="text-xs text-amber-600 dark:text-amber-400">{t("create.needMembers")}</p>
)}
</div>
</div>
<DialogFooter>
<Button variant="outline" onClick={() => onOpenChange(false)} disabled={loading}>
{t("create.cancel")}
</Button>
<Button onClick={handleCreate} disabled={!name.trim() || !leadOptions.some((o) => o.value === lead) || loading} className="gap-1">
<Button onClick={handleCreate} disabled={!name.trim() || !leadOptions.some((o) => o.value === lead) || members.length === 0 || loading} className="gap-1">
{loading && <Loader2 className="h-3.5 w-3.5 animate-spin" />}
{loading ? t("create.creating") : t("create.create")}
</Button>