diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index 93945f6..5df8692 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -616,12 +616,16 @@ func (al *AgentLoop) prepareOutbound(msg bus.InboundMessage, response string) (b if al.shouldSuppressOutbound(msg, clean) { return bus.OutboundMessage{}, false } - return bus.OutboundMessage{ - Channel: msg.Channel, - ChatID: msg.ChatID, - Content: clean, - ReplyToID: strings.TrimSpace(replyToID), - }, true + outbound := bus.OutboundMessage{Channel: msg.Channel, ChatID: msg.ChatID, Content: clean, ReplyToID: strings.TrimSpace(replyToID)} + if msg.Channel == "system" { + if originChannel, originChatID, ok := strings.Cut(msg.ChatID, ":"); ok && strings.TrimSpace(originChannel) != "" { + outbound.Channel = originChannel + outbound.ChatID = originChatID + } else { + outbound.Channel = "cli" + } + } + return outbound, true } func (al *AgentLoop) ProcessDirect(ctx context.Context, content, sessionKey string) (string, error) { diff --git a/pkg/agent/loop_session_regression_test.go b/pkg/agent/loop_session_regression_test.go index 7385199..21e025f 100644 --- a/pkg/agent/loop_session_regression_test.go +++ b/pkg/agent/loop_session_regression_test.go @@ -6,6 +6,7 @@ import ( "path/filepath" "sync" "testing" + "time" "clawgo/pkg/bus" "clawgo/pkg/config" @@ -107,6 +108,27 @@ func TestProcessSystemMessage_UsesOriginSessionKey(t *testing.T) { } } +func TestProcessInbound_SystemMessagePublishesToOriginChannel(t *testing.T) { + rp := &recordingProvider{} + loop := setupLoop(t, rp) + + in := bus.InboundMessage{Channel: "system", SenderID: "cron", ChatID: "telegram:chat-1", Content: "system task"} + loop.processInbound(context.Background(), in) + + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + out, ok := loop.bus.SubscribeOutbound(ctx) + if !ok { + t.Fatalf("expected outbound message") + } + if out.Channel != "telegram" { + t.Fatalf("expected outbound channel telegram, got %q", out.Channel) + } + if out.ChatID != "chat-1" { + t.Fatalf("expected outbound chat_id chat-1, got %q", out.ChatID) + } +} + func summarizeUsers(msgs []providers.Message) []string { out := []string{} for _, m := range msgs {