package repository import ( "context" "fmt" "github.com/Tencent/WeKnora/internal/accesspolicy" apperrors "github.com/Tencent/WeKnora/internal/errors" "strings" "github.com/Tencent/WeKnora/internal/types" "github.com/google/uuid" "gorm.io/gorm" "gorm.io/gorm/clause" ) // FilterDigitalHumanAgents protects persona-bearing native agents in ordinary // tenant access paths. Explicit organization shares use their verified share path. func (r *customAgentRepository) FilterDigitalHumanAgents(ctx context.Context, agents []*types.CustomAgent) ([]*types.CustomAgent, error) { if len(agents) == 0 { return agents, nil } ids := make([]string, 0, len(agents)) for _, agent := range agents { ids = append(ids, agent.ID) } var bindings []types.DigitalHumanBinding if err := r.db.WithContext(ctx).Where("agent_id IN ?", ids).Find(&bindings).Error; err != nil { return nil, err } byAgent := make(map[string]types.DigitalHumanBinding, len(bindings)) humanIDs := make([]string, 0, len(bindings)) for _, binding := range bindings { byAgent[binding.AgentID] = binding humanIDs = append(humanIDs, binding.DigitalHumanID) } userID, _ := types.UserIDFromContext(ctx) tenantID, _ := types.TenantIDFromContext(ctx) var humans []types.DigitalHuman if len(humanIDs) > 0 { if err := r.db.WithContext(ctx).Select("id", "name", "active_version").Where("tenant_id = ? AND id IN ?", tenantID, humanIDs).Find(&humans).Error; err != nil { return nil, err } } byHuman := make(map[string]types.DigitalHuman, len(humans)) for _, human := range humans { byHuman[human.ID] = human } admin := types.IsSystemAdminFromContext(ctx) || types.TenantRoleFromContext(ctx).HasPermission(types.TenantRoleAdmin) result := make([]*types.CustomAgent, 0, len(agents)) for _, agent := range agents { binding, bound := byAgent[agent.ID] // Copies preserve the persona snapshot but do not have a live binding. // Keep those snapshots private until the creator removes that persona. ownerID, ownerTenant := binding.OwnerID, binding.TenantID private := bound || strings.Contains(agent.Config.SystemPrompt, "", human.ID)) || strings.Count(agent.Config.SystemPrompt, "