From 8862842b46df6e6a34c86293c7147c3600e793be Mon Sep 17 00:00:00 2001 From: viettranx Date: Thu, 5 Mar 2026 18:59:51 +0700 Subject: [PATCH] feat: add runKind field to differentiate delegation/announce runs from user-initiated Co-Authored-By: Claude Opus 4.6 --- cmd/gateway_consumer.go | 2 ++ cmd/gateway_managed.go | 1 + internal/agent/loop_types.go | 4 ++++ .../events/event-sections/agent-event-cards.tsx | 15 +++++++++++++++ ui/web/src/types/team-events.ts | 1 + 5 files changed, 23 insertions(+) diff --git a/cmd/gateway_consumer.go b/cmd/gateway_consumer.go index e44fa017..78db569e 100644 --- a/cmd/gateway_consumer.go +++ b/cmd/gateway_consumer.go @@ -416,6 +416,7 @@ func consumeInboundMessages(ctx context.Context, msgBus *bus.MessageBus, agents LocalKey: origLocalKey, UserID: announceUserID, RunID: fmt.Sprintf("announce-%s", msg.SenderID), + RunKind: "announce", Stream: false, ParentTraceID: parentTraceID, ParentRootSpanID: parentRootSpanID, @@ -535,6 +536,7 @@ func consumeInboundMessages(ctx context.Context, msgBus *bus.MessageBus, agents LocalKey: origLocalKey, UserID: announceUserID, RunID: fmt.Sprintf("delegate-announce-%s", msg.Metadata["delegation_id"]), + RunKind: "announce", Stream: false, ParentTraceID: parentTraceID, ParentRootSpanID: parentRootSpanID, diff --git a/cmd/gateway_managed.go b/cmd/gateway_managed.go index 8f37f87c..6f01e5d1 100644 --- a/cmd/gateway_managed.go +++ b/cmd/gateway_managed.go @@ -336,6 +336,7 @@ func wireManagedExtras( Stream: req.Stream, ExtraSystemPrompt: req.ExtraSystemPrompt, MaxIterations: req.MaxIterations, + RunKind: "delegation", DelegationID: req.DelegationID, TeamID: req.TeamID, TeamTaskID: req.TeamTaskID, diff --git a/internal/agent/loop_types.go b/internal/agent/loop_types.go index 06c90f10..40e4ac9e 100644 --- a/internal/agent/loop_types.go +++ b/internal/agent/loop_types.go @@ -109,6 +109,7 @@ type AgentEvent struct { Type string `json:"type"` // "run.started", "run.completed", "run.failed", "chunk", "tool.call", "tool.result" AgentID string `json:"agentId"` RunID string `json:"runId"` + RunKind string `json:"runKind,omitempty"` // "delegation", "announce" — omitted for user-initiated runs Payload interface{} `json:"payload,omitempty"` // Delegation context (omitempty — only present when agent runs inside a delegation) @@ -274,6 +275,9 @@ type RunRequest struct { TraceTags []string // additional tags for the trace (e.g. "cron") MaxIterations int // per-request override (0 = use agent default, must be lower) + // Run classification + RunKind string // "delegation", "announce" — empty for user-initiated runs + // Delegation context (set when running as a delegate agent) DelegationID string // delegation ID for event correlation TeamID string // team ID (if delegation is team-scoped) diff --git a/ui/web/src/pages/events/event-sections/agent-event-cards.tsx b/ui/web/src/pages/events/event-sections/agent-event-cards.tsx index 5ffe5cb3..09d12085 100644 --- a/ui/web/src/pages/events/event-sections/agent-event-cards.tsx +++ b/ui/web/src/pages/events/event-sections/agent-event-cards.tsx @@ -27,6 +27,7 @@ function RunEventCard({ p, resolveAgent }: { p: EnrichedAgentEventPayload; resol
{resolveAgent(p.agentId)} + {p.runKind && }
{message && ( @@ -64,12 +65,14 @@ function ToolEventCard({ p, resolveAgent }: { p: EnrichedAgentEventPayload; reso {isError ? "error" : "ok"} + {p.runKind && } ) : ( <> {agentName} → {toolName && {toolName}} + {p.runKind && } )}
@@ -143,3 +146,15 @@ function PillId({ label, id }: { label: string; id: string }) { ); } + +function RunKindBadge({ kind }: { kind: string }) { + const colors: Record = { + delegation: "bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-300", + announce: "bg-orange-100 text-orange-700 dark:bg-orange-900/40 dark:text-orange-300", + }; + return ( + + {kind} + + ); +} diff --git a/ui/web/src/types/team-events.ts b/ui/web/src/types/team-events.ts index 0f729c7c..c33e0267 100644 --- a/ui/web/src/types/team-events.ts +++ b/ui/web/src/types/team-events.ts @@ -195,6 +195,7 @@ export interface EnrichedAgentEventPayload { type: string; agentId: string; runId: string; + runKind?: string; // "delegation", "announce" — omitted for user-initiated runs payload?: { content?: string; message?: string;