From 6bbe1b66ff484ead7cdb26371c28f06c4e865b61 Mon Sep 17 00:00:00 2001 From: viettranx Date: Sat, 11 Apr 2026 11:33:44 +0700 Subject: [PATCH] refactor(ws/teams): accept agent_key or UUID + fix handleAddMember error leak MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two teams handlers migrated to resolveAgentUUIDCached: - handleRemoveMember (params.AgentID) accepts agent_key or UUID. - handleTaskAssign (params.AgentID) accepts agent_key or UUID. handleAddMember already used resolveAgentInfo, but leaked raw store errors via "agent: " + err.Error() on resolution failure. H10 fix replaces the leak with i18n.MsgInvalidID — no more store schema info surfacing to WS clients. Phase 3 of agent identity hardening. --- internal/gateway/methods/teams_members.go | 8 +++++--- internal/gateway/methods/teams_tasks_mutations.go | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/internal/gateway/methods/teams_members.go b/internal/gateway/methods/teams_members.go index 6fc2635d..cf058e7d 100644 --- a/internal/gateway/methods/teams_members.go +++ b/internal/gateway/methods/teams_members.go @@ -52,10 +52,11 @@ func (m *TeamsMethods) handleAddMember(ctx context.Context, client *gateway.Clie return } - // Resolve agent + // Resolve agent — accepts agent_key or UUID. H10 fix: return i18n error instead + // of leaking raw store error (was: "agent: " + err.Error()). ag, err := resolveAgentInfo(ctx, m.agentStore, params.Agent) if err != nil { - client.SendResponse(protocol.NewErrorResponse(req.ID, protocol.ErrInvalidRequest, "agent: "+err.Error())) + client.SendResponse(protocol.NewErrorResponse(req.ID, protocol.ErrInvalidRequest, i18n.T(locale, i18n.MsgInvalidID, "agent"))) return } @@ -134,7 +135,8 @@ func (m *TeamsMethods) handleRemoveMember(ctx context.Context, client *gateway.C client.SendResponse(protocol.NewErrorResponse(req.ID, protocol.ErrInvalidRequest, i18n.T(locale, i18n.MsgInvalidID, "teamId"))) return } - agentID, err := uuid.Parse(params.AgentID) + // Phase 3 FR-1: accept agent_key or UUID via cache-aware resolver. + agentID, err := resolveAgentUUIDCached(ctx, m.agentRouter, m.agentStore, params.AgentID) if err != nil { client.SendResponse(protocol.NewErrorResponse(req.ID, protocol.ErrInvalidRequest, i18n.T(locale, i18n.MsgInvalidID, "agentId"))) return diff --git a/internal/gateway/methods/teams_tasks_mutations.go b/internal/gateway/methods/teams_tasks_mutations.go index c6c13ffd..c498c1a0 100644 --- a/internal/gateway/methods/teams_tasks_mutations.go +++ b/internal/gateway/methods/teams_tasks_mutations.go @@ -151,7 +151,8 @@ func (m *TeamsMethods) handleTaskAssign(ctx context.Context, client *gateway.Cli client.SendResponse(protocol.NewErrorResponse(req.ID, protocol.ErrInvalidRequest, i18n.T(locale, i18n.MsgInvalidID, "taskId"))) return } - agentID, err := uuid.Parse(params.AgentID) + // Phase 3 FR-1: accept agent_key or UUID for assignee. + agentID, err := resolveAgentUUIDCached(ctx, m.agentRouter, m.agentStore, params.AgentID) if err != nil { client.SendResponse(protocol.NewErrorResponse(req.ID, protocol.ErrInvalidRequest, i18n.T(locale, i18n.MsgInvalidID, "agentId"))) return