diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index c4479434f..b05f02c6e 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -679,6 +679,12 @@ func (al *AgentLoop) ProcessDirectWithChannel( Content: content, SessionKey: sessionKey, } + // Set peer so channel-based bindings (e.g. a specific Slack channel mapped + // to a named agent) are matched by the route resolver, exactly as they are + // for live inbound messages. + if chatID != "" && chatID != "direct" { + msg.Peer = bus.Peer{Kind: "channel", ID: chatID} + } return al.processMessage(ctx, msg) } diff --git a/pkg/tools/cron.go b/pkg/tools/cron.go index 648cc3c6c..1c6812f81 100644 --- a/pkg/tools/cron.go +++ b/pkg/tools/cron.go @@ -341,7 +341,14 @@ func (t *CronTool) ExecuteJob(ctx context.Context, job *cron.CronJob) string { return fmt.Sprintf("Error: %v", err) } - // Response is automatically sent via MessageBus by AgentLoop - _ = response // Will be sent by AgentLoop + if response != "" { + pubCtx, pubCancel := context.WithTimeout(context.Background(), 5*time.Second) + defer pubCancel() + t.msgBus.PublishOutbound(pubCtx, bus.OutboundMessage{ + Channel: channel, + ChatID: chatID, + Content: response, + }) + } return "ok" }