Personally, I would have agents subscribe to the page/app only and not to individual components, for 2 reasons. the first being it removes the managing of subscribing (so users don't forget to remove components or add new ones then) and 2nd, because then you could create an embedding of each component (bonus points for going back and 'on component creation' automatically creating an embedding for it). Then when the agent is ran, the user input can be used to do a semantic search on all the components to get only relevant ones and it can also be used to filter the components attribute list (no need to include position or dimensions if the input is only concerned with the text content).... idk I'm a bit late here, sorry if I've misunderstood, but the trick to this is not recalculating the full embedding when an attribute changes and instead finding a way to update the database directly that the vector/embeddings are in (I suppose its the db version of Culling/Clipping in Rendering for you graphics nuts)
just my 2 cents tho =)